Skip to content

Commit 469c8b6

Browse files
V48 (specification-only): Freeze historical canon checks; living full-system check
Document meta specifying law: promoted era specs/proofs/version-bound checks are immutable canon-at-that-time and must not be rewritten for later tree drift; the living full-system check alone must be all-encompassing and correct for present sole-canon. Align V48 notes, specifying README, era-pin shims, and glossary.
1 parent df48694 commit 469c8b6

6 files changed

Lines changed: 106 additions & 29 deletions

File tree

BITCODE_SPECIFYING.md

Lines changed: 68 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,8 @@ The priority order for specifying truth is:
4646
8. named realization/demo specs and adjunct docs, only where the active spec family explicitly references them
4747

4848
Older versioned specs are historical.
49-
They may be cited for provenance, but the active `SPEC` must not require them for current semantic recovery.
49+
They may be cited for provenance as **canon at that time**, but the active `SPEC` must not require them for current semantic recovery.
50+
Promoted historical specs, proofs, and version-bound checks are **immutable** for later realization drift (§4.3); only the living full-system check for the current draft/active pointer is rewritten for present sole-canon correctness (§13.1).
5051

5152
## 1.1 Drafting Input Rule
5253

@@ -435,6 +436,40 @@ Once a version is promoted:
435436

436437
Stale status language is a canonical defect.
437438

439+
## 4.3 Historical Canon Immutability (Promoted Specs, Proofs, and Checks)
440+
441+
**Meta specifying technique:** promoted eras are frozen snapshots of **canon at that time**. Current-tree work must never rewrite history so that historical checks stay green.
442+
443+
### Law
444+
445+
1. **Once promoted, a version's canon artifacts for that era must not change** for the purpose of tracking later realization.
446+
That freeze covers, at minimum:
447+
- the hand-authored family (`BITCODE_SPEC_VN.md`, `NOTES`, `DELTA`, `PARITY_MATRIX` as promoted),
448+
- generated `BITCODE_SPEC_VN_PROVEN.md` and `.bitcode/vN-*` structured artifacts for that promotion,
449+
- version-bound gate checkers, package proof generators, and tests that attest **that era's** predicates against **that era's** source and route vocabulary.
450+
2. **Old version checks must never be edited** to chase later renames, package hierarchy moves, route pluralization, Terminal retirement, component layout moves, vocabulary renames, or sole-canon modularization of a future draft.
451+
3. **Historical promoted specs remain referenceable as canon-at-that-time.** Auditors, PROPER reconstructions, and provenance citations use them as fixed law for the era they closed — not as living code maps of the current tree.
452+
4. **The living full-system check is only for current canon** (the draft-target family while drafting, then the newly pointed family after promotion). That check must be:
453+
- all-encompassing (full-system, full re-implementability, full auditability — §2),
454+
- completely correct for **present** sole-canon realization,
455+
- fail-closed when the current tree or current family drifts,
456+
- and free of "fix history so the old suite still passes" shortcuts.
457+
5. When a future realization would make a historical check fail against the new tree, the correct tools are:
458+
- **era-pin / skip-with-reason** (or pointer-gated non-execution) for the historical check while the current pointer has moved past that era,
459+
- **PROPER** reconstructions (§3.2) when specifying itself is under test against an already-promoted target,
460+
- and **new** current-version proofs/checks that restate obligations against the present tree.
461+
The incorrect tool is rewriting the historical checker, historical proof file, or historical `.bitcode/vN-*` artifact so it matches today's paths or product names.
462+
463+
### Why this exists
464+
465+
Bitcode treats each promotion as a closed ledger entry of system law. If V43–V47 checks were rewritten every time V48 moved `/read``/reads` or retired Terminal, "canon at V47" would cease to exist as an auditable artifact. Era-pinning preserves that ledger without blocking the living draft's obligation to be total and true.
466+
467+
### Relation to drafting
468+
469+
- Draft work on version `N` may freely change `BITCODE_SPEC_VN_*` **until** promotion closes that version.
470+
- After promotion, version `N` joins the freeze set; version `N+1` carries the living full-system family and living full-system checks.
471+
- Citation of older specs remains allowed for provenance; recovery of **current** meaning from older specs remains forbidden (§1, §2.4).
472+
438473
---
439474

440475
# 5. Full `SPEC` Required Structure
@@ -1166,6 +1201,38 @@ When the active version is changing specifying, promotion, or full-canon structu
11661201

11671202
This dual-family validation is the preferred way to detect a specifying rule that accidentally encodes the quirks of the current draft rather than a reusable full-canon standard.
11681203

1204+
## 13.1 Living Full-System Check vs Frozen Historical Checks
1205+
1206+
Validation must separate **living current-canon checks** from **frozen era checks** (§4.3).
1207+
1208+
### Living full-system check (current canon only)
1209+
1210+
The check that guards the **draft target** (and, after promotion, the **newly pointed** active family) must be:
1211+
1212+
- **all-encompassing** — full-system, full re-implementability, full auditability, full promotion-derivability (§2, §5, §12),
1213+
- **completely correct** for the present sole-canon tree and present product vocabulary,
1214+
- **fail-closed** on drift in hand-authored family, generated canon, parity, tests, and package realization,
1215+
- and **sole authority** for "may this version promote / is this pointer honest?"
1216+
1217+
That living check is rewritten as the draft advances **before** promotion. After promotion, it freezes with the era and a new living check is born for the next draft target.
1218+
1219+
### Frozen historical checks (prior promoted eras)
1220+
1221+
Version-bound checkers, package proof tests, and generated-artifact checks for **already-promoted** versions:
1222+
1223+
- **must not be modified** to match later package layouts, routes, or component paths,
1224+
- **must remain runnable or era-pinnable** as evidence of canon-at-that-time,
1225+
- **must not be deleted** solely because the current tree moved (prefer pointer-gated skip / era-pin with an explicit reason),
1226+
- and **must not be used** as the living gate for the current draft — only as historical attestation or PROPER inputs.
1227+
1228+
### Operational pattern (package and CI)
1229+
1230+
- Pointer-gated workflows: historical version promotion workflows stay on disk; they do not re-fire as current required gates once the pointer has advanced.
1231+
- Specifying package tests: historical proof files that hard-code prior-era paths may import an era-pin shim that skips with reason when the current realization has superseded that era (for example `packages/specifying/test/era-pinned-superseded-routes.js`).
1232+
- Required CI for draft work: green the **living** uapi/package suite and the **current draft's** specifying proofs — not by rewriting V2x–V(n−1) checkers.
1233+
1234+
If a historical check becomes impossible to execute even under era-pin, record that as an accepted boundary in the **current** draft's parity/notes; do not "repair" the historical checker.
1235+
11691236
---
11701237

11711238
# 14. Operator and Pedagogy Requirements

BITCODE_SPEC_V48_NOTES.md

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -587,22 +587,21 @@ become MASTER-DETAIL:
587587
detail attaches to any asset-pack pipeline row, labeled by the RUN's lens.
588588
Read dispatch persistence lands with the read gate.
589589

590-
Checker posture: all gate checkers literal-matching the old routes are
591-
era-pinned (V43–V47) and do not run at the current pointer; frozen `.bitcode/`
592-
era artifacts and promoted spec families keep the historical route names. The
593-
standalone `.mjs` gate checkers are pointer-gated in the workflow; the
594-
`@bitcode/specifying` **test suite** (`node --test test/*.test.js`, run
595-
unconditionally by Gate Quality) was NOT — its V43–V47 route-realization proofs
596-
read the historical singular-route source in place and moved to `false !== true`
597-
once the pluralization moved the files to `uapi/app/deposits|reads`. Those 16
598-
superseded proof files import `test` from
590+
Checker posture (meta specifying — `BITCODE_SPECIFYING.md` §4.3 / §13.1):
591+
**old version checks never change**; **promoted era specs/checks stay frozen as
592+
canon-at-that-time**; the **living full-system check** for the draft/active
593+
pointer must be all-encompassing and completely correct for present sole-canon.
594+
Gate checkers literal-matching the old routes are era-pinned (V43–V47) and do
595+
not run at the current pointer; frozen `.bitcode/` era artifacts and promoted
596+
spec families keep the historical route names. The standalone `.mjs` gate
597+
checkers are pointer-gated in the workflow; the `@bitcode/specifying` **test
598+
suite** (`node --test test/*.test.js`, run unconditionally by Gate Quality)
599+
era-pins superseded V43–V47 route-realization proofs via
599600
`packages/specifying/test/era-pinned-superseded-routes.js` (a `node:test` shim)
600-
instead of `node:test`: it skips every test WITH A REASON when the current
601-
plural realization is present (`uapi/app/deposits/DepositPageClient.tsx` exists)
602-
and runs them unchanged on the promoted V47 canon where the singular
603-
realization still stands. The proofs are NOT re-pointed at the plural routes —
604-
Gate 3 rewrote those files, so their historical content predicates would not
605-
match, and the frozen proofs attest their own era.
601+
instead of rewriting those proofs to chase plural routes / components layout.
602+
The pin skips WITH A REASON when the current realization is present and would
603+
run unchanged on a tree that still held the historical realization. The proofs
604+
are NOT re-pointed — frozen proofs attest their own era (canon-at-that-time).
606605

607606
### Legacy terminal browser-proof eradication (Garrett, 2026-07-05)
608607

FAMILIARIZATION.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1052,11 +1052,14 @@ Guide: `packages/agent-generics/TOOLS-IN-PTRR.md`.
10521052
| --- | --- |
10531053
| **Active canon** | Version pointed by `BITCODE_SPEC.txt` on `main` (currently V47 until V48 promotion). |
10541054
| **Canon / canonical** | Spec family + proven artifacts treated as rebuild law for a version. |
1055+
| **Canon at that time** | Frozen promoted era (specs + proofs + version-bound checks) — never rewritten for later tree drift (`BITCODE_SPECIFYING.md` §4.3). |
10551056
| **Complete Implementation Derivability** | A reader rebuilds current Bitcode from the active family alone (`BITCODE_SPECIFYING.md`). |
10561057
| **DELTA** | Version decision log (`BITCODE_SPEC_VN_DELTA.md`). |
10571058
| **Draft target** | Version under construction (V48 on `version/v48`) — not yet `BITCODE_SPEC.txt` pointer. |
1059+
| **Era-pin** | Skip-with-reason for historical package proofs when current realization superseded that era (do not rewrite the frozen proof). |
10581060
| **Gate** | Bounded acceptance slice (e.g. V48 Gate 3); branch `v48/gate-N-topic`. |
10591061
| **Gate PR** | Pull request closing a gate into the version branch. |
1062+
| **Living full-system check** | All-encompassing, completely correct validation for the **current** draft/active pointer only (`BITCODE_SPECIFYING.md` §13.1). |
10601063
| **NOTES** | Architecture intent ledger (`BITCODE_SPEC_VN_NOTES.md`) — weaker than SPEC body. |
10611064
| **Parity matrix** | Spec claim ↔ source ↔ tests ↔ gates ledger. |
10621065
| **Promotion** | Version PR to `main` after all gates closed; updates `BITCODE_SPEC.txt` pointer under workflow rules. |

packages/specifying/README.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,14 @@
77
88
Bitcode specifying tooling package (gate generators, canon posture, transitional demo-engine bridge). The monorepo itself is protocol canon.
99

10+
**Meta specifying (historical freeze):** promoted version specs, proofs, and
11+
version-bound checks are **immutable canon-at-that-time** — they must not be
12+
edited to chase later tree moves. The **living full-system check** is only for
13+
the current draft/active pointer and must be all-encompassing and completely
14+
correct for present sole-canon. See `BITCODE_SPECIFYING.md` §4.3 and §13.1.
15+
Era-pin shims under `test/era-pinned-*.js` skip superseded historical package
16+
proofs with reason; they do not rewrite those proofs.
17+
1018
V29 Gate 8 made this package the package-native boundary for canonical helpers
1119
that were originally ported from the standalone `protocol-demonstration`
1220
witness. Commercial scripts, API/runtime code, and workflow checks must import

packages/specifying/test/era-pinned-superseded-browser-proofs.js

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,12 +8,12 @@
88
* `/reads`). The V39/V40 canonical proofs that read those terminal-ux files as
99
* evidence therefore attest a superseded era.
1010
*
11-
* As with `era-pinned-superseded-routes.js`, the frozen historical proofs are
12-
* NOT re-pointed (they attest their own era); they are era-pinned: a superseded
13-
* proof file imports `test` from here instead of `node:test`, and every test it
14-
* registers is skipped WITH A REASON once the terminal-ux browser proof is
15-
* gone. On the promoted V39/V40 canon — where the terminal-ux files still
16-
* exist — `SUPERSEDED` is false and the proofs run unchanged.
11+
* Meta law (`BITCODE_SPECIFYING.md` §4.3 / §13.1): **old version checks never
12+
* change**; frozen historical proofs attest **canon at that time** and are NOT
13+
* re-pointed. Era-pin: a superseded proof imports `test` from here instead of
14+
* `node:test`, and every test is skipped WITH A REASON once the terminal-ux
15+
* browser proof is gone. On a tree that still holds those files, `SUPERSEDED`
16+
* is false and the proofs run unchanged.
1717
*/
1818

1919
import nodeTest from 'node:test';

packages/specifying/test/era-pinned-superseded-routes.js

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,13 @@
99
* realization lands they are validating a superseded era against source that
1010
* has legitimately moved forward.
1111
*
12-
* Rather than mutate the frozen historical proofs to chase the current routes
13-
* (they exist to attest their own era, and the `.bitcode/` artifacts + promoted
14-
* spec families keep the historical route names), these proofs are ERA-PINNED:
15-
* a superseded proof file imports `test` from here instead of `node:test`, and
16-
* every test it registers is skipped WITH A REASON once the current (plural)
17-
* realization is present. On the promoted V47 canon — where the singular
18-
* realization still exists — `SUPERSEDED` is false and the proofs run normally.
12+
* Meta law (`BITCODE_SPECIFYING.md` §4.3 / §13.1): **old version checks never
13+
* change**; promoted proofs attest **canon at that time**. Do not rewrite these
14+
* files to chase current routes/packages. ERA-PIN instead: a superseded proof
15+
* imports `test` from here instead of `node:test`, and every test is skipped
16+
* WITH A REASON once the current realization is present. On a tree that still
17+
* holds the historical realization, `SUPERSEDED` is false and proofs run
18+
* unchanged.
1919
*
2020
* This mirrors the `.mjs` gate checkers' era-pinning (pointer-gated in the
2121
* workflow); the difference is that the specifying package test suite runs

0 commit comments

Comments
 (0)