spec-kitty / spec-kitty/spec-kitty
Convergence follow-up: post-unification census semantics (retire daily catch-up boundary; disposition the 2 promotion merges; covers_through refresh)
- Dominant language
- Python
- Stars
- 1.6k
- Forks
- 165
- Avg merge
- 14h 52m
- Merged PRs (30d)
- 303
Description
> **Rehomed:** spec-kitty/EXPERIMENTAL-spec-kitty#1084 — that repo was archived 2026-09-05 20:43Z (read-only), so the issue moved to the line of record. Labels preserved verbatim; controller seat re-claims it.
---
## Summary
The 2026-09-05 convergence promotion (public PR #3881, merged by @robertDouglass 18:49Z; EXP PR #1078 merged 17:14Z) completed the fork reconciliation — public main's tree now equals EXPERIMENTAL main's tree byte-for-byte (`70d02dc36…`), with the old public head and EXP main both ancestry parents. The daily census catch-up ran post-unification and reads `PENDING=2004` — **that number is the unification echo, not backlog**:
- **2002 of the 2004** are commits already on EXPERIMENTAL main (proven by ancestry: `git merge-base --is-ancestor origin/main` passes for each). The `base_commit..old/main` census range now sweeps EXP's own lineage through the #3881 merge commit.
- **2** are the promotion merge commits themselves (`2554bd13a`, `e72176375`).
- **0** are genuinely-new, undispositioned public commits. The last public-only cohort (20 commits, 09-04 17:18Z → 22:53Z) was dispositioned PORT and landed in EXP main before the promotion via #1078's `census-0905-final-public-tail` cluster.
The one-lineage map has **800 commits dispositioned across 74 clusters: 429 PORT / 23 SUPERSEDED / 348 FORBIDDEN / 0 PENDING** — the six end-state conditions of `docs/FORK-RECONCILIATION.md` §1 are all met as of 2026-09-05.
## Wanted (small)
The census is a *range* tool (`base_commit..old/main`), and the unification inverted its range semantics: post-#3881, every future EXP commit that is promotion-merged into public main will enter the census range as a "PENDING" commit (unless clustered), so PENDING=0 can no longer be read directly off the raw census output. Before the next daily run fires (or at the latest, before this catch-up cron is retired):
1. **Decide the retirement boundary for the daily catch-up job** (`stijn-repo-convergence-catchup`, cron id `e8729014eaf5`). The freeze criterion the job was watching for has now effectively arrived — upstream main is promotion-only and converged with EXP — but the job's charter says "daily until the upstream freeze", and the freeze is *de facto* not *announced*. Options: (a) owner/`LynnColeArt` announces the freeze and the job is retired with the end-state evidence on #830; (b) the job stays live in verification-only posture (verify PENDING=0 in the set-difference sense, report anomalies like this one). Recommendation: **(a)** — with the trees converged, a daily upstream sweep adds no value and the residual convergence issues (#1057/#1010/#829/#219/#220/#216, #1040 MINORs) are tracked work, not census scope.
2. **Mark the two promotion merge commits dispositioned** (recommended disposition: SUPERSEDED-by-convergence or a new `PROMOTION`-record cluster) so the raw census reads `PENDING=0` again for any CI/human reading it. A 2-commit cluster with disposition SUPERSEDED and evidence = this issue + public #3881 keeps the map's `covers_through` honest.
3. **State the post-unification census semantics in the runbook** (`docs/FORK-RECONCILIATION.md` §3): "remaining tail = set-difference against cluster membership" (already true for the pre-unification map; make it explicit for the post-#3881 world where the range includes EXP lineage).
4. **Update `seed_upstream_commit`/`covers_through`** on the map to the newest clustered upstream commit (`614c52cb382d6bbd4ae8d4daab060320502fc14c`, the tail cluster's tip) so the declared boundary equals actual coverage — resolving #1057's wanted-item 1 for the converged state.
## Evidence
- Public PR #3881 body: promoted EXP tree `c0603fea8` → public main, merged with merge commit so both lineages remain ancestors; post-merge tree `70d02dc36…` verified byte-for-byte.
- EXP PR #1078 body: 800 commits dispositioned (429 PORT / 23 SUPERSEDED / 348 FORBIDDEN / 0 PENDING, 74 clusters), map in `.kittify/convergence-map.json`, full suite 38,752 passed at pre-head, exact-head verification, retired-surface scan 0 hits.
- Census run 2026-09-05 19:0xZ (fresh clone /tmp/census-0905, `uv run python scripts/convergence/census_status.py`): checked=2804 FORBIDDEN=348 PENDING=2004 PORT=429 SUPERSEDED=23; decomposition: 2002 EXP-home (ancestry-proven) + 2 promotion-merges + 0 public-new.
- PyPI: `spec-kitty-cli` latest = 3.2.6 (conditions 3+4 done).
- e2e rename-revert + lanes recovered (planning#1895/#1888) — the last cross-repo blocker to a clean post-unification census, resolved earlier today.
Found by the 2026-09-05 daily convergence catch-up run (seat Kat/bosslady2). Classification counts this run: **checked=2804 (2004 EXP-home, 2 promotion merges, 0 new public commits)** — zero new dispositions needed; zero FORBIDDEN on Stijn's work; zero conflicts; manual re-port queue #1065 CLOSED by #1078.
---
**Provenance:** original issue spec-kitty/EXPERIMENTAL-spec-kitty#1084, author LynnColeArt, created 2026-09-05T19:15:32Z, labels: priority:P3, status:ready, status:claimed, from:controller, type:task, track:convergence. Rehomed 2026-09-06T00:02Z by controller seat Kat (bosslady2) after repo archive.
Contributor guide
Research direction
Start with docs/FORK-RECONCILIATION.md §1 and §3, then run uv run python scripts/convergence/census_status.py to inspect the post-unification range behavior. Review .kittify/convergence-map.json and the stijn-repo-convergence-catchup cron configuration; done means the retirement or verification decision is recorded, promotion commits are dispositioned, post-unification semantics are documented, and seed_upstream_commit/covers_through matches coverage.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- git, python
- Domain
- devops, documentation, tooling
- Issue type
- Refactor
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Active
- Clarity
- Mostly clear
- Newbie friendliness
- 35/100