Repository navigation
2.0.0 — the upgrade path itself was the last defect
2.0 finals, and the last thing it shipped was the upgrade path itself. The
mechanism set is exactly what 2.0.0b1 froze — the two alphas and the beta are
the evidence, and nothing in that set changed here. What changed is the thing
none of them had been tested on: a real 1.13.0 → 2.0 upgrade, walked with
the actual published 1.13.0 wheel instead of a fresh init.
- An upgrade delivers new doc modules, not just new stamps. 2.0 added
docs/GLOSSARY.mdanddocs/ENFORCEMENT.mdto every size manifest, and
77b5135fixed the dangling-pointer class for fresh inits only. On an
existing repo the two docs never arrived:config.merge_missingkeeps the
repo's non-emptymoduleslist,initscaffolds fromconfig.modules
alone, and the mechanical tier had no add-a-module action — so the refreshed
stanza (CLAUDE.md/AGENTS.md) pointed atdocs/ENFORCEMENT.mdand the new
clauderizer-fleetskill pointed atdocs/GLOSSARY.mdwith neither file on
disk, whiledoctorprinted✓ corpus modernized to procedure v1.12.0
over it. Measured, not theorized: the live walk is what found it. The
mechanical tier now carriesensure_modules_current— additive, writing
each doc only when absent (INVARIANT-03), idempotent (a second pass reports
0 mechanical), and recorded in the config so the delivery happens once. The
stated trade-off: the manifest is the size's contract, so a module a user
deliberately deleted comes back — as one visible line that
upgrade --reportshows before anything is written. This is
ensure_gitignore_current's own D-042 tier-1 reasoning, one level up —
"without this the whole policy fix reaches zero existing installs, and every
install in the world already raninit" — applied to the case that comment
did not cover. - The class got the detector it never had (D-069).
doctorgained
engine-referenced docs present: everydocs/<NAME>.mdthe engine's own
wiring names (the shipped stanza, the shipped skills — never the user's prose)
is checked against what the repo's manifest promises to scaffold. Docs created
on demand by a blessed write (docs/LESSONS.md,docs/SKILLS.md) are
declaredON_DEMAND_DOCSand never flagged, so a repo with no lessons yet is
correct rather than broken. - Plus the CI-time ratchet that would have caught 2.0's own defect before
release: engine wiring may only reference a doc some size manifest
scaffolds or that is declared on-demand. Armed against the real historical
tree — grafted onto77b5135^it fails naming
docs/ENFORCEMENT.md (from the shipped stanza), the exact pre-fix state. docs/UPGRADING.mdgets a 1.x → 2.0 section, and its mechanical-tier list
is now complete (it had been silently missing the gitignore and kinds-overlay
actions too). Procedure 1.13.0.- The 1.14.5 CHANGELOG entry is restored to
main. 1.14.5 was cut from a
hotfix branch that was never merged back, so this file jumped 1.14.4 →
2.0.0a1 while 1.14.5 was whatpip install clauderizeractually resolved.
The version-single-sourcing audit could not see it: that check compares the
top entry against__version__, and a hole further down is invisible to it.
Upgrading from 1.x
init + upgrade + doctor — and do not skip upgrade, which is what
delivers the two new docs. Otherwise 2.0 is additive: no cz_* tool was
removed or renamed (67 → 68), no config key changed, requires-python stays
>=3.11, the core engine keeps zero runtime dependencies, and the mechanisms
priced too expensive to default on (per-call cz_state stamps, wind-down
budgets) stay dormant by measured verdict. The one semantic break for
downstream consumers is unchanged from 2.0.0a1: pass_rate reads as goal-met
rate, with deferrals visible beside it rather than laundered into it.
Verification
- Suite 1571 → 1582 passing (7 skips). The delivery tests were armed
behaviorally red on the pre-fix tree — 3 red viamodernize.report/apply
alone, APIs present on both trees (pinning the import path, since an editable
install otherwise serves the fixed source into a pre-fix worktree: H-27's
own class, met while arming a guard against it). The CI ratchet was armed
against the real historical tree at77b5135^. Two guards are green on both
trees by design: manifest/template consistency, and silence on a
already-current corpus (INVARIANT-08 drop-nothing). - Dogfooded on this repo, whose own config was missing both modules while the
docs existed:upgradeadded the modules and leftdocs/GLOSSARY.mdand
docs/ENFORCEMENT.mdbyte-unmodified — the never-clobber property shown
rather than asserted. - Three of this repo's own ratchets fired on this change and were paid, not
widened: the subsystem-doc seam (both new public callables documented), the
separator class (both literals triagedmessagewith the reason), and the
procedure-changelog pin — which turned out to freezePROCEDURE_VERSIONat
exactly1.12.0, failing any later procedure bump for a mechanism it does not
touch; it now asserts>= 1.12.
Shipped with a named gap
- H-31 remains open, deliberately.
mcpstays constrained>=1.2,<2; the
hotfix half shipped as 1.14.5, but adapting to the mcp 2.x SDK — then lifting
the pin with tests against both majors — is unowned follow-up work. 2.0.0
ships the pin as the honest contract, not the adaptation.