Context and Problem Statement
The Convergence merge (#3881, converge/exp-main-20260905, landed 2026-09-05; Convergence Event
announcement #3824, legacy-sync teardown holding pen #3801) folded ~2000 commits from the
EXPERIMENTAL line onto public main. It did two things this ADR records as a governed decision.
1. It retired the in-place CLI→SaaS sync subsystem. Removed wholesale (0 git-tracked files remain;
an architectural gate — tests/architectural/test_no_retired_subsystems.py — plus a pyproject.toml
TID251 ban block keep them from silently returning):
- the local sync transport: the
spec-kitty synccommand family (22 subcommands) + daemon + emitter / transport-attempts / batch / offline-queue / body-outbox; - the delivery / event-journal emit stack and the
src/specify_cli/saas/package; - the
websocketsruntime dependency.
Mission status is now ephemeral by design; team artifacts render server-side.
2. It inverted feature-ownership. This core repo (Priivacy-ai/spec-kitty) is now merely a
CLIENT. The authoritative repositories are spec-kitty/zeitgeist (the ephemeral-status
service) and spec-kitty/saas (hosted team surface). In this repo,
src/specify_cli/zeitgeist_client/ and src/specify_cli/saas_client/ are consumer code
(saas_client is generated — PR #3589 / saas#300). The rule is: pull + use + integrate the client
HERE; author + publish the API/client UPSTREAM.
Four Accepted ADRs still describe the pre-Convergence world and now govern deleted subsystems, which actively misleads any reader who trusts the decision record.
Decision
Mark the following four ADRs
Superseded, each pointing at this ADR:docs/adr/3.x/2026-06-30-1-sync-daemon-identity-and-cleanup-classification.md— the sync daemon it governs (identity/kill authority,owner.json, orphan reaping) is retired.docs/adr/3.x/2026-04-11-1-saas-rollout-and-readiness.md— thespecify_cli.saasrollout/readiness package it governs is deleted; residual readiness re-homed totracker/saas_readiness.py, the SaaS-sync flag tocore/saas_sync_config.py.docs/adr/3.x/2026-08-09-1-project-sync-store-boundary.md— theProjectSyncStore/sync/project_store.pyboundary it governs is deleted with the sync transport.docs/adr/2.x/2026-02-27-1-cli-tracker-surface-gated-by-saas-sync-flag.md— the in-place sync transport is gone; theSPEC_KITTY_ENABLE_SAAS_SYNCgate survives only as an auth/hosted visibility gate for the survivingtrackergroup, not as a sync-transport gate. Superseded to a clarification, not a deletion of that env var.
Record the client-repo inversion as the standing architectural fact: core = client; the redesign/authoring of the SaaS/zeitgeist API lives upstream;
zeitgeist_client/saas_clientare consumer code integrated here.Leave
docs/adr/3.x/2026-04-25-1-shared-package-boundary.mdAccepted. This inversion is not a reversal of it — it is the precedent it extends. That ADR established thatspec-kitty-events/spec-kitty-trackerare external dependencies consumed via their public surface; the client-repo inversion applies the same model tozeitgeistandsaas.
Consequences
- The decision record stops asserting deleted designs; readers are routed to the retirement + inversion from each superseded ADR.
- No zeitgeist/SaaS redesign or authoring epic belongs in this repo — that work lives upstream in
spec-kitty/zeitgeist+spec-kitty/saas. The core-repo roadmap item is narrower: consume / integrate / upgrade the published clients. Design-inputs from the retired surface (e.g. #3801's holding-pen inputs, #1800 / #3549 envelope & durability lessons) feed the upstream redesign. - The surviving surfaces are unaffected and sanctioned by design:
src/specify_cli/saas_client/,tracker/saas_*(readiness/client/service), charter sync, and theSPEC_KITTY_SYNC_*/SPEC_KITTY_ENABLE_SAAS_SYNCenv vars. - An ADR-hygiene gate (
tests/architectural/test_adr_hygiene_convergence_retirement.py) enforces this ADR's shape: the four areSupersededand link here; this ADR isAcceptedand supersedes them;2026-04-25-1remainsAccepted.