Skip to content

test(versioning): strict changelog lane, reporting parity lane, auto-file census records, zero changelog headings (f05fe292) - #159

Merged
andrei-hasna merged 5 commits into
mainfrom
fix/versioning-records-reporting-f05fe292
Aug 15, 2026
Merged

test(versioning): strict changelog lane, reporting parity lane, auto-file census records, zero changelog headings (f05fe292)#159
andrei-hasna merged 5 commits into
mainfrom
fix/versioning-records-reporting-f05fe292

Conversation

@andrei-hasna

@andrei-hasna andrei-hasna commented Aug 15, 2026

Copy link
Copy Markdown
Contributor

What

Implements the f05fe292 design memo (supersedes the #94 record-refresh lineage, which stays non-mergeable per the bounded-review cap).

  1. Changelog lane is STRICT (option b')KNOWN_CHANGELOG_MISMATCHES deleted; assertion is expect(mismatches).toEqual([]). The release lane writes the CHANGELOG.md heading in the same commit as the version bump; a fresh mismatch is a defect in the landing commit. KNOWN_RUNTIME_MISMATCHES kept (catalog/treasury verified still firing).
  2. Parity lane is a REPORTING lane (option a)KNOWN_NPM_DRIFT deleted; live drift find-or-creates a reconcile task keyed on the exact fingerprint title Reconcile @hasna/<pkg> main <m> vs npm <r> (todos task upsert, idempotent), prints the two-sided report with task ids, and never fails. Opt-in (VERSIONING_NPM_PARITY=1), not in CI.
  3. One-time zeroing (option d, once) — 10 CHANGELOG.md headings written at live package versions (accounts 0.2.44, calendar 0.3.1, conversations 0.6.2, instructions 0.4.35, loops 0.5.1, machines 0.2.26, mementos 0.14.84, repos 0.1.48, secrets 0.2.22, signatures 0.1.14).
  4. Standard suite (same CI job, was red) — census exception records become a reporting lane: new contracts-conformance violations and four-surface WARN gaps auto-file reconcile tasks and are reported; the two-sided registry contract is UNCHANGED (a recorded exception that now passes still fails; contracts-manifest/kitVersion hard gates untouched). skills' stale SDK exception entry deleted. Auto-filing tests declare a 300s bound (full-census subprocess spawns exceed bun's default 5s).

Gates (all rc=0)

  • bun install --frozen-lockfile — 0
  • bun test test/versioning (offline strict) — 7 pass / 1 skip / 0 fail
  • VERSIONING_NPM_PARITY=1 bun test --timeout 300000 test/versioning — 8 pass / 0 fail, run twice (idempotence: run 1 created hooks+machines tasks, run 2 found all existing)
  • bun test tooling/ci/tests/standard — 18 pass / 0 fail
  • bun run check — 0
  • staged secrets scan — 0 findings
  • git diff --cached --check — 0

Reconcile tasks created/found by the parity lane (project 5e44770b)

  • contracts 0.11.0-vs-0.10.6 -> 1dcf333d (existing)
  • emails 1.3.14-vs-1.3.15 -> 42222bcc (existing)
  • hooks 0.6.3-vs-0.6.4 -> 14680f11 (created)
  • machines 0.2.26-vs-0.2.27 -> 55cda236 (created)
  • secrets 0.2.22-vs-0.3.0 -> 3d61a3d1 (existing)

Standard suite auto-filed (existing): telephony -> e9724296, loops -> 48abfc64, machines -> 1a6dbe12.

Not done

DO NOT merge, DO NOT publish. The release lane's heading-in-bump contract (option b') is specified in the memo for the owning lane; the reconcile tasks are its working queue.

Refs: f05fe292 (design memo), supersedes #94.


View with [code]smith Autofix with [code]smith
Need help on this PR? Tag @codesmith-bot with what you need. Autofix is disabled.

…changelog headings (f05fe292)

Changelog lane is STRICT (option b'): KNOWN_CHANGELOG_MISMATCHES deleted,
assertion is expect(mismatches).toEqual([]). The release lane writes the
CHANGELOG.md heading in the same commit as the version bump; a fresh
mismatch is a defect in the landing commit. KNOWN_RUNTIME_MISMATCHES kept
(catalog 0.2.0/0.1.0, treasury 0.1.1/0.1.0 — verified still firing).

Parity lane is a REPORTING lane (option a): KNOWN_NPM_DRIFT deleted; live
drift find-or-creates a reconcile task keyed on the exact fingerprint
title 'Reconcile @hasna/<pkg> main <m> vs npm <r>' (todos task upsert,
idempotent), prints the two-sided report with task ids, and never fails.

One-time zeroing (option d, once): 10 CHANGELOG.md headings written at
the live package versions (accounts 0.2.44, calendar 0.3.1,
conversations 0.6.2, instructions 0.4.35, loops 0.5.1, machines 0.2.26,
mementos 0.14.84, repos 0.1.48, secrets 0.2.22, signatures 0.1.14).

Standard suite gets the same (a) treatment for census exception records
(contracts conformance + four-surface WARNs auto-file + report); the
contracts-manifest/kitVersion hard gates and the
recorded-exception-must-still-fail direction are UNCHANGED. skills' stale
SDK exception entry deleted (member now ships ./sdk).

Refs: f05fe292 (design memo), supersedes the #94 record-refresh lineage.

Agent: agent-ea
…eout (f05fe292)

The two reporting-lane tests spawn one `todos task upsert` subprocess per
violation; a full census (26 violations measured at this main) exceeds bun's
default 5000ms per-test timeout, which killed the spawn mid-flight and left
a machine conformance task NOT FILED. Declared 300s on the two tests.

Agent: agent-ea
…ign-seat; bound the surfaces auto-file test timeout (f05fe292)

P2/P3 remediation for PR #159 review:
- surfaces.test.ts: the WARN auto-filing test spawns one 'todos task upsert'
  subprocess per new gap and declared no timeout; both contracts.test.ts
  auto-file tests bound at 300_000 (conformance measured 7855ms > 5s default).
  Apply the identical per-test bound (third argument, not a global mask).
- census.ts + versioning.test.ts: created reconcile tasks carried agent_id
  'fleet' while the READMEs document agent-ea. 'todos task upsert' supports
  --assign/--assign-seat; pass agent-ea (env-overridable, --assign-seat
  because agent-ea is a durable seat) so attribution matches the docs and is
  independent of an ambient TODOS_AGENT_ID. READMEs updated to match.

Agent: agent-ea
…s-reporting-f05fe292

Resolves the PR #159 conflict (base moved past the branch point): merged
current origin/main (405f585). Resolution: test/versioning/versioning.test.ts
kept the branch's strict changelog lane (KNOWN_CHANGELOG_MISMATCHES exception
map deleted by design — the PR's core fix); main's only delta in that file was
the map census block, superseded by the strict gate. bun.lock and all
CHANGELOG.md unions auto-merged (hooks/machines/skills releases), verified by
bun install --frozen-lockfile rc=0.

Agent: agent-ea
…odos CLI is absent (f05fe292)

test-suites lane (first CI run at the merged head, run 31880383695): both
contracts auto-file tests failed with an uncaught 'Executable not found in
$PATH: "todos"' — Bun.spawn THROWS at spawn time for a missing executable
instead of exiting non-zero, and GitHub runners have no todos CLI. The
suite's documented contract is 'NOT FILED and pass' (census.ts comment,
README); the throw violated it.

Wrap the spawn in try/catch in both reconcile-task creators (standard
suite + versioning parity lane) returning null -> NOT FILED. Reproduced the
CI condition locally (PATH without a todos binary): suite 18 pass / 0 fail,
probe returns null with the 'unavailable ... NOT FILED' line.

Agent: agent-ea
@andrei-hasna

Copy link
Copy Markdown
Contributor Author

Cycle-1 remediation complete (task f05fe292, Agent: agent-ea).

New head: bb275ba4b (pushed). Commits on top of 09cb05e:

  • 38516c6f0 — P2: }, 300_000); per-test bound on the surfaces auto-file test (surfaces.test.ts:62), identical to both contracts auto-file bounds; P3: reconcile-task creators pass --assign agent-ea --assign-seat (env-overridable), attribution independent of ambient TODOS_AGENT_ID; READMEs updated.
  • 4168b9640 — merge of current origin/main (405f585), resolving the PR conflict. Sole conflict: test/versioning/versioning.test.ts — kept the branch's strict changelog lane (exception map deleted by design); main's only delta there was the map census block. bun.lock + CHANGELOGs auto-merged (frozen-lockfile install rc=0).
  • bb275ba4b — second-order fix found by the first CI run: Bun.spawn(["todos",...]) THROWS ENOENT on runners without the todos CLI, failing both contracts auto-file tests despite the documented NOT-FILED-and-pass contract. Both creators now degrade to NOT FILED. Reproduced the CI condition locally (PATH without todos): probe returns null + "unavailable ... NOT FILED", suite 18/0.

All four CI lanes SUCCESS at the exact head (run 31881631924, sha bb275ba):

  • gates (secrets, names, manifests) — pass
  • build + test (affected) — pass
  • publish guard (no internal-infra strings in tarballs) — pass
  • test-suites (versioning + standard-adherence) — pass

(First run at the merged head 4168b96: 3/4 green, test-suites red on the ENOENT throw only — fixed in-branch, not weakened.)

Local gates at the final head: frozen install rc=0; bun test test/versioning 7 pass/1 skip/0 fail; parity lane VERSIONING_NPM_PARITY=1 8/0 rc=0 ×2 (idempotent, all reconcile tasks existing); bun test tooling/ci/tests/standard 18 pass/0 fail; bun run check rc=0; staged secrets scan 0 findings; git diff --cached --check rc=0.

P3 measured live: parity lane auto-created reconcile task 17b625ba carries assigned_to=agent-ea.

Not merged — left for the coordinator/reviewer per the bounded-review cycle.
Agent: agent-ea

@andrei-hasna
andrei-hasna merged commit 6e81b48 into main Aug 15, 2026
5 checks passed
andrei-hasna added a commit that referenced this pull request Aug 15, 2026
…ntracts 0.11.0 queue)

Release preparation clearing the drift backlog: changesets for @hasna/emails 1.3.15 and @hasna/secrets 0.3.0 (package.json + VERSION constant + changelog headings), @hasna/contracts 0.11.0 queued for the next registry publish, instructions + loops changelog headings aligned. The record-clearing half is superseded by the strict lane (#159) — resolved toward main. Reviewer: GO (re-review @ 87eb40a); all five CI lanes green at the exact head; changeset lane two-sided verified.

Agent: agent-ea
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant