chore(specsync): archive accepted change records - #23
corvid-agent wants to merge 4 commits into
Conversation
Archive accepted SpecSync adopt leftovers (CHG-0001..0005).
corvid-agent
left a comment
There was a problem hiding this comment.
Archive-only SpecSync ledger move: accepted change records renamed into .specsync/archive/changes/… with state: archived / archived state.json, product code untouched.
CI is green on this head. Same-actor last-push (corvid-agent), so I cannot approve — needs a human or other reviewer to merge.
0xLeif
left a comment
There was a problem hiding this comment.
P1 on the current head: authenticated archive snapshots are present while the repository still declares SpecSync 5.0.1, so the archive cannot be reproduced by the declared tool. Regenerate the archive with matching lifecycle evidence before merge.
0xLeif
left a comment
There was a problem hiding this comment.
The archive move itself is correct and lossless, but the commit carries one transient lifecycle file that must not be tracked, and the green Trust check was produced by the pre-#24 gate, so it is not evidence under the pins main enforces today.
Blocking
1. .specsync/change.lock is committed as a new tracked file (0 bytes)
diff --git a/.specsync/change.lock b/.specsync/change.lock
new file mode 100644
index 0000000..e69de29
e69de29 is the empty blob, and I confirmed the size is 0 with git cat-file -s. This file is a transient lifecycle lock, not archive evidence, and upstream SpecSync says so explicitly:
specsync initgenerates the.specsync/.gitignorecontents insrc/commands/init.rs(CorvidLabs/spec-sync, default branch), and that generated list isbackup-3x/,config.local.toml,hashes.json,change.lock,change-transaction.json.- spec-sync's own repository does not track
.specsync/change.lock. I queriedrepos/CorvidLabs/spec-sync/contents/.specsync/change.lockand got a 404. - This repo's
.specsync/.gitignorewas written by an older version and only containsbackup-3x/,config.local.toml,hashes.json, which is why the lock slipped through. - The repo's own governance says the same thing.
.specsync/sdd.jsonlists.specsync/change.lockunderignored_paths, and the acceptance criterion recorded in CHG-0003 reads "transient lifecycle files remain excluded".
Once this is tracked on main, every local specsync lifecycle command that takes the lock dirties the working tree and shows up as a spurious diff, and a fresh clone starts with a lock artifact in place. It is also unrelated to the stated scope of this PR.
Requested fix: git rm --cached .specsync/change.lock on the branch, and append change.lock and change-transaction.json to .specsync/.gitignore so it cannot recur.
2. The passing Trust check is stale evidence, not current-gate evidence
gh pr checks 23 is all green, but I checked what actually ran. Run 33843838989 has head_sha 206864125af514d585417ec3fcd75df65581e8d6, which is this branch's only commit, so the workflow used the branch's own .github/workflows/trust.yml. On this branch that file still reads:
uses: CorvidLabs/spec-sync@59bbfa766c6cce01ab815ab47db195b0629cc014 # v5.0.1
uses: CorvidLabs/trust@9d32b5786d2e9e4d39fc581c0091c721ee3d4226 # v1.0.0The branch base is 4d0cc51, and main has since moved to b42c8ac ("Update: pin Trust 1.2.0 and SpecSync 6.0.0", #24), which replaced those with spec-sync@3c2ed4972c8c53ae02ab5dd5775beccd6da3eeb8 # v6.0.0 and trust@fcc889f54d8b4892a81af463c5a0250e2be66fc5 # v1.2.0. So the green lane validated this archive layout under SpecSync 5.0.1 and Trust 1.0.0, not under the 6.0.0 / 1.2.0 lifecycle that now guards main.
To be clear about what this is not: the PR does not touch trust.yml, so it does not regress the pins. I test-merged origin/cos/archive-specsync-accepted into origin/main locally and the merge is clean, with main's 1.2.0 / 6.0.0 workflow surviving intact. The ask is just to rebase onto b42c8ac and let the current gate re-run before merge, since evidence hygiene is the entire point of this change.
What I verified and found clean
- The archive layout is genuine tool output, not hand-rolled. A code search over CorvidLabs/spec-sync shows the same shape in its own repository:
.specsync/archive/changes/<YYYY-MM-DD>-<CHG-id>/holdingaccepted-state.jsonnext to a rewrittenstate.json, plus the untouched artifact files. - Nothing was lost in the move. For all five records I diffed the archived
accepted-state.jsonagainst the newstate.jsonwith sorted-key JSON normalization. The only differences anywhere are"state": "accepted"becoming"archived"and a bumpedupdated_at.approvals.jsonandverification.jsonare 100 percent similarity renames, so the approval chain, the reopening records with their superseded approvals, and the verification digests all survive byte for byte. - The
change.mdfront matter edits match. Each of the five is exactly-state: accepted/+state: archived, consistent with itsstate.json. - CHG-0002 having fewer artifacts is correct, not a dropped file. Its
selected_artifactsis["context", "docs"], andgit ls-tree origin/main -- .specsync/changes/CHG-0002-...confirms that directory only ever heldapprovals.json,change.md,context.md,docs.md,state.json,verification.json. - Timestamps are self-consistent. The new
updated_atvalues run 1788502701 to 1788502716, which is 2026-09-04T06:18:21Z to 06:18:36Z, matching the2026-09-04directory prefix and the 06:18:40Z PR creation time. This was generated seconds before the push rather than edited by hand. - No dangling references.
grep -rnforspecsync/changesandCHG-000across the whole tree outside.specsync/returns nothing, so no workflow, spec, or doc points at the old paths. - The PR's own test plan holds.
.specsync/changes/is gone entirely from the branch tree and all five records are present under.specsync/archive/changes/. .specsync/versioncorrectly stays at5.0.1. That file is a layout schema stamp, not a binary selector, andspecsync initon the 6.0.0 binary writes5.0.0. Nobody should "fix" it as part of the rebase.
Advisory
.specsync/sdd.jsonlists.specsync/changes/,.specsync/change.lock, and.specsync/hashes.jsonunderignored_paths, but says nothing about.specsync/archive/. Today that is harmless, because the archive path is in neitherignored_pathsnormeaningful_paths, so it does not pull in a change-record requirement. If the intent is that archived evidence is never itself subject to change coverage, adding.specsync/archive/toignored_pathswould state that explicitly instead of relying on the absence of a rule.- Once
.specsync/changes/is empty the directory disappears from the tree. That is fine for git, but worth a sanity check on the firstspecsync change newafter this lands, to confirm the tooling recreates it rather than erroring on a missing parent.
Risk: low. This is evidence relocation with no product code touched, no CI gate softened, no dependency or action pin moved, and no permission widened. Fix finding 1, rebase for finding 2, and it is ready.
Diagnosis: nothing is red. The blocker is branch protection plus a stale green.Reported state, verified: The green on this PR does not describe the gate that will decide itThe 5 passing checks ran at head uses: CorvidLabs/spec-sync@59bbfa766c6cce01ab815ab47db195b0629cc014 # v5.0.1
version: "5.0.1"
uses: CorvidLabs/trust@9d32b5786d2e9e4d39fc581c0091c721ee3d4226 # v1.0.0
What I verified locally with the real SpecSync 6.0.0 binaryUsing All five archived packages authenticate under 6.0.0 ( So: update the branch and it should go green. Do not close and recreate this. It is no longer reproducible from
|
CoS follow-upApplied the concrete asks from the diagnosis:
Tip is now |
corvid-agent
left a comment
There was a problem hiding this comment.
Review (corvid-agent, same-actor → comment only)
Head: 50f4005af0e3 (prior comment was on 206864125af5) — trust + CodeQL green.
SpecSync lifecycle looks right on this tip: accepted change packages moved under .specsync/archive/changes/… with state: archived, accepted-state.json preserved, and change.lock / change-transaction.json ignored.
Merge guidance: use a merge commit (not squash) so archive history stays attributable; do not leave active .specsync/changes/CHG-* behind on main after merge.
Same-actor: comment only.
Summary
Test plan
.specsync/changes/no longer contains CHG-0001..0005.specsync/archive/