Packages-Actualization Campaign v0.1 — wave 2: the authored packages measure themselves
01Owner ruling 2026-09-08 retires the former subscription-backed GLM transport and cancels its subscription. Every earlier transport pin and runnable command in this campaign is historical evidence only. Any remaining work uses the current central routing contract.
02status: RATIFIED 2026-07-26 · PHASE D CLOSED 2026-08-03 (floor green, CONVERGENCE met: 17 owed drifts, every one on an owner-ruled build) · PHASE E AUTHORIZED 2026-08-03 — the owner's «даю добро»: first slice = wave А (B-011, самый высокий приоритет) + the research pair B-022/B-023 in a parallel lane; historical executor = external GLM workers, boss = Fable; any remaining work uses the current central routing contract · all six §4.5 amendments adopted · wave 2 of the Progress-Control programme, the sibling of SPEC-ACTUALIZATION-CAMPAIGN-v0.1 (wave 1, host spec/, closed out 2026-07-26) · AMENDED 2026-08-20: Phase T cancelled by owner ruling, Phase G split, campaign exit = RELEASE 1.0.0 per TZ-RELEASE-1.0
03Contract for everything used here: PROP-043 (the markup grammar) and PROP-047 (the campaign toolchain; split from PROP-043 on 2026-08-22). Owner's manual: OWNER-GUIDE. Task formats: templates/. The method, proven end to end on 58 files and 4 486 units: wave 1's plan and LOG.
0. Mandate (owner's words, 2026-07-25, recorded verbatim)
04«Пожалуйста, запланируй проверку всех пакетов внутри
org.vibevm.worldиorg.vibevm.ai-nativeтем же способом, которым мы делали ВЕСЬ этот процесс (переработка спецификаций на факты с гранулярным разделением, верификация, и так далее). Причина: у нас большая часть кода должна быть покрыта практиками ai-native, и без проверки самой ai-native всё это выглядит как профанация.»
05Two things are being asked, and only the first is obvious:
- 06Apply wave 1's method to the packages — fact-grain markup, evidence-based verification, stitching, coding tasks.
- Close the credibility loop. The host tree is disciplined by these packages. If the packages themselves are unverified, every gate the host passes rests on an unmeasured foundation. The owner's word for that is профанация, and it is the acceptance criterion: this campaign is successful when the discipline can be shown to hold itself to its own rule.
1. Baseline (verified at authoring time, 2026-07-25)
| Namespace | Packages | .md files |
Lines | Shape |
|---|---|---|---|---|
org.vibevm.world |
27 | 154 | 17 104 | prompt-only; no crates |
org.vibevm.ai-native |
10 | 140 | 11 629 | 7 of 10 carry crates/ |
| total | 37 | 294 | 28 733 |
08Of those 294 .md files, 286 are observable: eight are extractor test
fixtures under a fixtures/ directory, which DEFAULT_EXCLUDES drops even
under an explicit include (PROP-043 §4). Measured 2026-07-26 at Phase A step 1.
- 09Marker state: zero.
grep -rl "<status " packages/= 0 files. Wave 2 starts from nothing, exactly as wave 1 did. - Code-side traceability already exists in the ai-native crates: 703
specmark::scope!/#[spec(…)]sites across the live version slots (781 counting the supersededcore-ai-nativev0.7.0). That is the join target Phase C verifies against — it is not evidence that the prose is true. (Corrected at ratification, 2026-07-26. This line read 247, which is the rust family alone —rust-ai-native-lang+rust-ai-native-mcpmeasure 248 today. The join target is ~3× what the plan budgeted for, and Phase C's cost scales with it. A plan's own numbers are the first thing a campaign about unmeasured numbers should re-measure.) - Seven of the ten carry
crates/, not eight (counted at ratification):core-ai-nativeplus the-langand-mcpmember of each of the three language families. The three bare family umbrellas —rust-ai-native,go-ai-native,typescript-ai-native— carry none, which makes them the aggregator genre §5-A's prediction is about. - Version slots. All of
worldisv0.1.0exceptredbook(v0.1.0 + v0.2.0) andwal(v0.2.0 only). Inai-native,core-ai-nativecarries two live slots (v0.7.0 consumed, v0.8.0 authored); the rust family is v0.7.0, typescript v0.6.0, go v0.1.0. - Largest single package:
core-ai-nativeat 56 files — bigger than a third of the host corpus on its own. - Out of scope:
vibevm/vibepacks/org.vibevm.fractality/**(its own specspace, its own contract) andvibedeps/**(regenerated consumer copies).
2. Executors and the budget law
10Unchanged from wave 1, and for the same reasons:
| Role | Who | What |
|---|---|---|
| Boss / high-level | Fable | markup passes, verification judgment, stitching, task authoring, ALL review |
| Coder | Opus (claude-opus-5) |
IMPL tasks (DRIFT-NNN) exactly as written; stop-rule on ambiguity |
| Spec editor | budget-dependent | SPEC tasks; Fable reviews regardless |
12No fractality for this campaign — the wave-1 owner decision carries over. Rules 1–4 of the repository bind every executor; non-routine red lines stop for the owner whether the work is done directly or handed off.
3. Two decisions that make this campaign different
13Wave 1 could lean on one rule: impl/done means the thing is present in
crates/. Neither namespace lets that rule stand unmodified, and pretending
otherwise would produce exactly the profanation the mandate names.
3.1 A prompt-only flow's facts are contracts on behaviour
14Decision. In org.vibevm.world, a fact is verified against three
sources, in this order, and a verdict without one of them is
unverifiable — never "probably true":
- 15The package's own shipped artifacts. A boot snippet that claims a rule must contain it; a protocol document a snippet cites must exist and say what the snippet says it says. This is mechanical and catches the largest class: a flow whose boot lane promises a section its protocol never grew.
- The host's observed conformance.
flow:walclaims the session readsvibevm/vibespecs/WAL.xmlfirst — the host'sCLAUDE.md,vibevm/vibespecs/boot/, and this repository's own commit history either show that or do not. The host is a living consumer and the honest test bench. - The installed reality.
vibe installwritesfiles_written; the lockfile records what a consumer actually receives. A flow that specifies an artifact it never ships is drift, and this catches it.
16Why: a behavioural contract has no crates/ to point at, but it is not
therefore unfalsifiable — it is falsified by its own artifacts and by a
consumer that does not behave as promised. Considered and rejected:
marking all of world spec/done and calling it verified (that is the
profanation); and demanding a checker per flow (most of these rules are for a
reader, and a rule with no checker is a WISH — but some WISHes are correct
and the honest record says so rather than inventing machinery).
Revisit when: a third of world's units land unverifiable — that would
mean the three sources are too weak and the genre needs a fourth.
3.2 The discipline is verified by running it on itself
17Decision. In org.vibevm.ai-native, every fact about a checker, a gate,
or an engine is verified by executing it against the package's own crates,
not by reading its prose. The floor (rust-ai-native floor), conform,
specmap and the health collector are run over vibevm/vibepacks/org.vibevm.ai-native/**
and the run output is the evidence, captured as a doc fixture.
18Why: this is the mandate's core. A discipline that cannot pass its own gate has no standing to gate anything else, and the only way to know is to run it. Considered and rejected: trusting the host's green floor as transitive evidence (it proves the host conforms, not that the checkers are correct); and a separate audit document (an audit that is not the gate rots at the same rate as the prose). Revisit when: the discipline ships a self-hosting mode that makes the run automatic — then this becomes a CI row, not a campaign phase.
3.3 Superseded version slots are marked, never verified
19Decision. When a package carries more than one version directory, the
campaign judges the live slot — the one a consumer resolves — and marks
the superseded slot with a single document-level marker recording that it is
frozen history. redbook v0.1.0 and core-ai-native v0.7.0 are the two cases
today. Why: verifying frozen history costs the same as verifying live
contracts and buys nothing; and a superseded slot with fresh-looking verdicts
invites a reader to act on it. Revisit when: a superseded slot is
resurrected for a consumer that cannot upgrade.
4. Campaign zone
20campaigns/packages-2026-09/ # id fixed at Phase A close
baseline.json · deferrals.md · harvest/ · tasks/ · run/
21Same shape, same laws, same crash-safety protocol as wave 1
(§4 there) — step = unit of
atomicity, journal step-start before and step-done after, RESUME.md
regenerated, maximum loss on any crash is one step.
22Scope config. progress.toml gains the two package globs. The host's 58
files stay in scope: wave 2 does not un-measure wave 1, and the two corpora
share one progress check gate that must stay at 0.
4.5 Amendments carried in from wave 1's close-out
23Proposed at ratification, 2026-07-26, from what wave 1 actually cost rather than from what it planned. Wave 1's REPORT (§11 there) carries the evidence for each. ADOPTED IN FULL by the owner, 2026-07-26 — all six bind this campaign, and A1 and A4 change phases that follow, so read them before opening C.
- 24A1 — every phase's exit gate enumerates that phase's own steps. Wave 1's Phase C listed "harvest cards written while knowledge is hot" among its steps and gated only on "100 % of markers carry verdicts". The step was skipped, it cost nothing at the time, and Phase G arrived to consume an empty directory and had to be deferred. This plan has the identical defect today: §3.2 says the checker runs are "captured as a doc fixture", and §5-C's exit gate says only that markers carry verdicts. A phase gate that does not check the phase's own steps will skip whichever ones nothing downstream fails on.
- A2 — a verdict's evidence must name which source class it rests on. F-063
— a security-relevant drift in the token precedence — survived wave 1's
verification with a
confirmedverdict because its evidence cross-checked one spec document against another spec document carrying the identical error. §3.1 makes document-against-document verification the method forworld, legitimately, because a prompt-only flow has no crate to point at. That makes the hazard structural here rather than accidental: eachworldverdict must record which of §3.1's three sources it used, and a verdict resting only on source 1 (the package's own artifacts) is self-referential — the package agreeing with itself — and is marked as such rather than counted as independent confirmation. - A3 — wave 2 inherits two phases wave 1 could not run. Both were deferred
by owner ruling on 2026-07-26 after close-out measured their inputs missing
(wave 1's
deferrals.md§6). They must appear here as phases or they will be lost: (i) a judgment-marking pass — wave 1 marked what 4 917 facts are and never what should happen to them, which left every forward-looking view empty (freeze/plan0,action="rework"0,stage="idea"0); wave 2 should mark judgment as it marks state, in one sweep over both corpora. (ii) the harvest pass and the two doc trees (User Guide, Package Author Guide) — the Package Author Guide in particular belongs here, sincepackages/is the corpus it documents. - A4 — fix the hand-seal staleness gap before Phase C, not after (F-067).
processed_hashrecords the text a file's verdicts were computed against and is only written by a real verify batch; wave 1 sealed by hand throughout, so the staleness warning ended up pointing at the freshest files in the corpus. Wave 2 will hand-seal thousands of verdicts across 294 files. Unfixed, the signal is noise from the first row. - A5 — every prediction names the step that tests it. Wave 1's prediction 1
was confirmed only because close-out went and measured it specially: no step
of the plan required a
weave, so the claim sat untested for the whole campaign. A prediction with no step behind it is one this campaign will also finish without testing. §6's five predictions each need a step, or a note saying they are scored at close-out on purpose. - A6 — write
baseline.jsonat every phase close, now that a writer exists. Wave 1 could not:Baseline::storewas claimed by the spec and had never been built (F-065), so the recurrence loop had never run end to end. It exists as of 2026-07-26 and round-trips clean. Wave 2 is the first campaign that can checkpoint cheaply — a crash or a long gap should cost O(delta), which is the entire argument §7.5 makes for keeping the artifact at all.
4.6 Safe stop — where this campaign can halt losing nothing
25Added 2026-07-31 under the owner's bring-into-line ruling:
flow:campaign-plans' ##ANY-PHASE-BOUNDARY-IS-A-SAFE-STOP asks every plan to
say where it can be put down, and this plan said it nowhere. Unlike the
retrospective sections of wave 1's plan, this one is forward-binding: a
session that stops anywhere not named here has left work in a state the next
session has to reconstruct.
26Four grains, from finest to coarsest, and all four hold.
- 27The step — mark-file, verify-unit, close-obligation, execute-task —
journalled
step-startbefore andstep-doneafter, per wave 1's §4, which this campaign inherits unchanged. Step closed ⇒ its edits stand; step open ⇒git restoreits files and redo it. Maximum loss on any crash: one step. - The obligation closure (Phase D's own unit). A closure is edit the
document and re-judge every anchor in its
anchorslist throughmerge-verdicts.py --force, thenvibe progress seal. Done in that order, the registry regenerates from the cache and shrinks by exactly that many rows, and stopping between closures loses nothing —drift-registry.pyreads the true remainder whatever a session remembered. - The wave (d1 … d9). The reviewable unit: a wave ends when every document
with an open incoming obligation has been through a SPEC task, the registry
is regenerated with
--write, and the LOG entry is written at the boundary. This is the natural place to hand the campaign to a fresh session. - The phase boundary. The full gate panel green —
bash tools/self-check.sh→ 0 — andprogress check --exhaustiveat 0 over both corpora, because wave 2 does not un-measure wave 1 and the two share one gate.
28What a stop at each phase boundary leaves:
| Stopped after | The tree holds | What is owed |
|---|---|---|
| A | the widened scope, the campaign zone, three pilot packages marked, and the caret fix that made fact-grain edges exist (1 041 → 5 267 units, 0 → 65 fact-targeting edges) | nothing judged; nothing published |
| B | markers only, over 308 files. No semantic edits by the phase's own law — a semantic problem found became a finding, not a diff | nothing; the pass is purely additive |
| C | 11 346 verdicts, zero owed, each backed by evidence resolving to a real line in a real file; baseline.json written |
nothing — Phase C edits no document; a verdict lives in the cache |
| D | every drift verdict re-judged or recorded in run/state/routing.json as routed out of the package; every survivor carrying an owner ruling |
the owner's queue — release, sync-from-code and which-side rulings, named in PHASE-D-HOST-OBLIGATIONS.md |
| T, F, G | not yet reached | — |
30Five things that are NOT safe stops. Each fired at least once, and each is listed with the instance rather than as a caution:
- 31A closure that edited the document and did not re-judge its anchors. The
registry then reads the obligation as open while the defect is gone, and the
next wave re-derives an answer that already exists. Fired 2026-07-31: the
registry snapshot on disk was two waves stale and read as open work
(
f2b11b0a). The rule that follows: the registry is generated, never hand-edited; the file is a cache and the command is the number. - A batch whose verdicts are merged but not sealed.
merge-verdicts.pyrefuses to restate a verdict without--forceby design, and that refusal has already caught real mistakes — a session that stops before sealing leaves the refusal armed against its own successor. - A closure that changed a document's anchor set without running
vibe progress mirrorfirst.merge-verdicts.py'saddressable()readsrun/mirror/and will refuse anchors the mirror has not seen. - A false
confirmed"repaired" by editing the document. The verdict-first rule: re-judge itdriftfirst, let the registry mint the obligation and assign its route, and only then close it. First live test, 2026-07-31, and it paid immediately: the Go GUIDE'sgated_packagesclustered to F-166 on the owner's sync route, so its two-word swap now waits in the sync queue instead of having landed as an unapproved diff. Editing first and judging afterwards is how a boss-route edit lands on an owner-route anchor. - A wind-down that rewrites the files a finished batch cites. Fired
2026-07-28: W2's four evidence tables were verified clean at 3 unresolvable
and re-read 65 at the next session's open —
CONTINUE.mdwas overwritten wholesale andvibevm/vibespecs/WAL.xml's_Updated:line rewritten after the tables were returned and committed. Not one of the 62 was a fiction, and nobody was left who could re-anchor them. The durable-citation rule exists for exactly this, and the controlled experiment is on record: the one batch written before the rule carries 116 dead refs today, and every batch written under it verifies clean.
32Where autonomy ends, so a stop is never a guess (from the Phase D batch
plan §5, unchanged): a reality-mismatch closed through sync-from-code needs
the owner's approval on each spec diff; a release event goes to the owner
before publication; and Rule 4's red lines bind identically whether the boss
does the work or delegates it. A finding is not a reason to stop — it opens
an obligation and the wave continues.
5. Phases
Phase 0 — what stood before Phase A (recorded retrospectively)
33Added 2026-07-31 under the owner's bring-into-line ruling:
flow:campaign-plans' ##PHASE-ZERO-COMMITS-NOTHING-AND-GATES-EVERYTHING-AFTER
asks every campaign to open with a no-commit phase, and this one had none.
No Phase 0 ran. Written after Phase C closed, so it is a record — of what
stood before Phase A, of what did Phase 0's job under another name, and of the
one thing a real Phase 0 would have spiked that nobody did.
34The tree before Phase A (§1's baseline, verified 2026-07-25): 37 packages,
294 .md files, 28 733 lines across two namespaces — org.vibevm.world 27
packages / 154 files / 17 104 lines, prompt-only, no crates; org.vibevm.ai-native
10 / 140 / 11 629, seven of them carrying crates/. Marker state: zero —
grep -rl "<status " packages/ returned nothing, so wave 2 started from nothing
exactly as wave 1 did. The wave-1 machinery already existed and was proven on 58
files and 4 486 units; progress.toml was scoped to the host tree alone. Largest
single package: core-ai-native at 56 files, bigger than a third of the host
corpus on its own.
35What did Phase 0's job. Phase A step 1, and it behaved as the law asks — three of §1's own numbers fell before Phase B committed a marker, and all three were corrected in place rather than noted for later:
| §1 said | measured at A step 1 | why |
|---|---|---|
| 294 files | 286 observable | eight extractor test fixtures, dropped by DEFAULT_EXCLUDES — correctly, since one of each pair is deliberately malformed and marking it would be marking a lie |
247 specmark::scope! sites |
703 (781 with the superseded slot) | 247 was the rust family alone; the join target Phase C verifies against is ~3× what the plan budgeted for, and Phase C's cost scales with it |
eight packages carry crates/ |
seven | core-ai-native plus the -lang and -mcp member of each of the three language families; the three bare umbrellas carry none, which is what makes them the aggregator genre |
37Observed total at A step 1: 344 files (58 host + 286 packages), 13 916
facts, of which 8 997 unmarked; progress check 0 across both corpora.
A plan's own numbers are the first thing a campaign about unmeasured numbers
should re-measure, and this one did — one phase late, but before anything
landed.
38The one spike that was owed and never run. §5-A step 2 was written as a
release: "Re-mint rust-ai-native-lang (and its typescript / go siblings) at
v0.8.0 … publish, bump the host lockfile", and §6's prediction 4 named it the
single longest-lead item in the campaign. It was not a release. The blocker
was a caret: all three -lang stacks required core-ai-native '^0.7', and on
a 0.x version that caret means >=0.7.0 <0.8.0 — it excluded the very version
everything needed, which is why the lockfile pinned 0.7.0. The fix was three
pins to ^0.8, three sync-engines.toml source roots to v0.8.0, and a
re-vendor: no new version slot and no publication. Measured before and
after: 1 041 → 5 267 spec units; fact-targeting edges 0 → 65; unresolved
77 → 12, because 65 of those "dangling" edges were correct code tags the
unit-grain engine could not see.
39One command in a Phase 0 would have found the caret, and prediction 4 would
then have been posed against the real work instead of against a release that
never had to happen. The residue is recorded in §5-A step 2 and is still the
owner's: whether the -lang slots should eventually be re-minted so a v0.7.0
slot stops carrying 0.8.0 engines.
40The corpus kept moving after Phase B opened, which a Phase 0 would also have
settled: 344 → 308 (DRIFT-024 removed 33 LICENSE.md by a file-name default
and three derived cards/INDEX.md indexes) → 259 at Phase C's gate, as the
superseded version slots, the legacy language projections, the book and the
discovery prompt each left on their own owner ruling and their own reason. Every
removal is defensible and every one was decided mid-flight; the phase that
exists to settle a denominator before anyone counts against it is Phase 0.
Phase A — Scope and the fact-grain prerequisite
41Entry: this plan ratified. Steps:
- 42Widen
progress.toml; confirmscansees the package files and reports them all unmarked. DONE 2026-07-26 — and the expected number was wrong:scanobserves 286 package files, not 294. The eight difference are extractor test fixtures ({go,ts}-ai-native-{lang,mcp}/…/tools/*-extract/test/fixtures/{clean,dirty}/spec/PROP-001.md), excluded byDEFAULT_EXCLUDES' always-onfixturesrule (PROP-043 §4) — correctly, since one of each pair is deliberately malformed and marking it would be marking a lie. Observed total 344 files (58 host + 286 packages), 13 916 facts, of which 8 997 unmarked — the package corpus is 1.8× the host in facts while being only 1.07× in lines, so prediction 5's "comparable cost" reads right on lines and light on facts.progress check0 across both corpora. - DEFERRED as a re-mint — and then it turned out no re-mint was needed.
Owner ruling 2026-07-26: «не перевыпускай пакет, сделаем это потом»; then,
on the version sweep: «просто обнови все до самой свежей версии». The
second instruction closed the gap the first had deferred. The blocker was
a caret, not a release: all three
-langstacks requiredcore-ai-native '^0.7'while the current version is 0.8.0, and on a 0.x version that caret means>=0.7.0 <0.8.0— it excluded the very version everything needed, which is why the lockfile pinned 0.7.0. Fixed in place (three pins →^0.8,sync-engines.toml's three source roots → v0.8.0, engines re-vendored) with no new version slot and no publication. Sospecmap.jsonnow carries fact units and fact-grain edges, this phase's exit gate is fully reachable, and Phase C is not blocked. Measured before/after, edge targets classified by the source bytes: 1 041 → 5 267 spec units; fact-targeting edges 0 → 65; unresolved 77 → 12, because 65 of those "dangling" edges were correct code tags the unit-grain engine could not see. Wave 1's last drift row (FACT-GRAIN-EVIDENCE) closed on this. Cost: v0.8.0 addsFact::GoUnsafeand two exhaustive matches in the rust stack had to learn it. Still outstanding, and still the owner's: whether the-langslots should eventually be re-minted so a v0.7.0 slot stops carrying 0.8.0 engines. Diagnosis kept for that day:is_valid_fact_idexists only incore-ai-native/v0.8.0;vibe.lockpinscore-ai-native@=0.7.0andrust-ai-native-lang@=0.7.0;cargo xtask sync-engines --checkis green (33 pairs, 6 sync sets), so nothing has drifted — the gap is a version, not a divergence. Three things must be settled when it is taken up, and all three are the owner's: publishing is a Rule 4 red line; the host resolves these packages from a second, stale working copy (file:///C:/Users/olegc/gits/vibevm/…, last commitc112f6f), so a re-mint in this copy is invisible to the host until the resolve is repointed; and the network registries 401 on this machine. A local repoint + lockfile bump would very likely avoid publishing altogether — publication is only needed for external consumers. The original step follows, unchanged, for whoever takes it up:
43Close the fact-grain specmap gap first. core-ai-native v0.8.0
carries the fact-aware engine (mdspec.rs uses is_valid_fact_id);
rust-ai-native-lang v0.7.0 vendors the v0.7.0 engine, which
predates the amendment, and that is the version the host consumes. Re-mint
rust-ai-native-lang (and its typescript / go siblings) at v0.8.0 with
cargo xtask sync-engines, publish, bump the host lockfile, regenerate
specmap.json. Only then can Phase C join fact anchors to code.
- 44Create the campaign zone; pilot the loop on three packages of different
genres — one prompt-only flow (
wal), one code-bearing stack (rust-ai-native-lang), one aggregator (rust-ai-native— NOTredbook, which is a book of three chapters and a different genre entirely; corrected at the pilot 2026-07-26).
45Exit gate: check --exhaustive correct on the pilot; specmap.json carries
fact units and non-zero fact-grain edges; floor green. Prediction: the
aggregator genre exposes a grammar gap wave 1 never hit — an aggregator's
facts are almost entirely about other packages, and pointing a marker at a
fact you do not own may need a new placement rule.
Phase B — Markup (facts pass)
46Entry: A closed. Executor: Fable. Paragraph-exhaustive fact-grain markers,
sense-preserving re-splits, missing {#anchor}s, audience where obvious;
cross-doc findings recorded into the ledger in passing. Semantic edits are
forbidden in this phase — a semantic problem found becomes a finding.
47Batching runs by package, largest first, because a package is the natural
review unit: core-ai-native (56) alone, then the three -lang stacks
(20–23 each), then redbook (14), then the long tail of 22 small world
flows in batches of 4–6.
48Exit gate: check --exhaustive green over both corpora; batch diffs contain
markers, splits and anchors only. Prediction: ~12–15 batches; the
world flows mark much faster per file than the host's PROPs (they are short
and already unit-shaped), and core-ai-native alone costs as much as five of
them.
Phase C — Verification (evidence pass)
49Entry: B closed for the cluster. Executor: Fable + machine evidence, per
the two rules of §3.1 and §3.2. Every marker gets confirmed / drift /
unverifiable in the cache with an evidence ref; a verdict without one is
rejected.
50The ai-native cluster runs its checkers first, because their output is the evidence for a large fraction of that namespace's facts. The world cluster runs the artifact-and-consumer join.
51Exit gate (A1 — enumerates this phase's own steps, not just its headline):
(i) 100 % of markers carry verdicts; (ii) the X/Y/Z summary recorded in
the LOG — the first measured actuality level of the packages; (iii) the
§3.2 checker runs exist as files under campaigns/<id>/harvest/ — floor,
conform, specmap and the health collector over
vibevm/vibepacks/org.vibevm.ai-native/**, each captured as command → real output;
(iv) every world verdict records which of §3.1's three source classes it
rests on (A2), and those resting on source 1 alone are counted separately
in the summary as self-referential; (v) baseline.json written at the
phase close (A6). Wave 1 gated this phase on (i) alone, left (iii)
undone, and its documentation phase had to be deferred for want of the
fixtures — see that campaign's deferrals.md §6.
Prediction, falsifiable and deliberately uncomfortable: world measures
higher than ai-native. The flows are prose contracts written once and
rarely contradicted by anything; the ai-native packages make dozens of
mechanical claims about checkers, flags and engines, each of which can be
wrong in a way prose cannot. If that inverts, the reason is worth a finding
of its own.
Phase D — Stitching
52Entry: C verdicts exist for the cluster. Same obligation types, same
loop-until-dry waves, same escalation rule (a pair that fails to converge over
two waves is a conceptual conflict → owner). reality-mismatch resolves
through sync-from-code with owner approval on every spec diff.
53One wave-2-specific rule: a finding that spans a package boundary is a
release event. Fixing core-ai-native's prose may require a version bump
and a re-vendor into three family members. Such a finding is not closed by an
edit; it is closed by a published version.
54Exit gate: ledger empty or every survivor is an owner-ruled deferral.
Phase E — Coding
55Entry: per IMPL task, unit stability. Executor (superseded
2026-09-08): any remaining task follows the current central routing contract;
the local switch defaults to native collaboration workers. The boss reviews
every diff and makes every commit.
Wave-2 DRIFT tasks differ from wave 1's in one way that matters: a fix inside
a package's crates must be vendored forward to every family member that
copies it (cargo xtask sync-engines), and the task's acceptance says so
explicitly or the fix ships to one consumer and not the others.
Phase T — Test coverage by swarm (owner amendment, 2026-07-26)
56CANCELLED 2026-08-20 by owner ruling (chat, near-verbatim): «ФАЗУ T
ЛУЧШЕ ОТМЕНИТЬ (она очень сложная и фиксирует форму созданного, а мы как
оказалось еще не нашли много вещей финальной формы — фазу T убрать из
кампании и сделать когда-нибудь потом).» The phase leaves THIS campaign;
the work is deferred, not deleted — the ledger line is
campaigns/packages-2026-09/deferrals.md#release-1-0, the root anchor is
BACKLOG.md#post-1-0, and the specs below stay authored material for the
future campaign. Phase F consequently answers the mandate in
prose-judgement form (its report states so itself) — the «Placed before F
on purpose» reasoning below is kept as written, as a dated record of the
original design. The section itself is kept unedited below for the same
reason.
57Entry: E closed. Executor: this phase is cancelled; its former transport description is historical and authorizes no launch. A future campaign selects its worker transport from the then-current central contract. Reviewer: the boss, per packet.
58≥3 tests of distinct kinds per testable assertion. Full specification:
campaigns/packages-2026-09/PHASE-T-SPEC.md.
The four things that decide whether it is worth anything, in one breath: a
triage first (6 963 in-scope facts, not 10 825 — world flows have no
callable surface and stay on §3.1's join); the fact's text is the oracle and
the worker never sees the implementation body; three kinds (canonical,
boundary, negative) rather than three assertions; and one test exhibited red
per packet, which is not mutation coverage but a check that the test works at
all.
59Placed before F on purpose: F must answer the mandate per practice, and with T in front of it, it answers with measured coverage instead of prose judgement.
60Prerequisite that only just landed: until DRIFT-032 and DRIFT-034,
#[spec(verifies = "spec://…#UPPER-FACT")] did not compile, so this phase was
not expressible at all.
Phase F — The credibility report
61The phase wave 1 does not have, and the reason this campaign exists. One document answering the mandate directly: does the AI-native discipline hold itself to its own rule? It carries the floor / conform / specmap run output over the discipline's own crates, the measured actuality of both namespaces, and an explicit verdict on every practice the host claims to follow. The owner reads it and rules. A green host floor is not an answer to this question and may not be cited as one.
Phase G — Documentation (owner amendment, 2026-07-26)
62SPLIT 2026-08-20 by owner ruling («вначале А»): the release 1.0.0
ships an interim alpha doc layer (README, ALPHA-NOTES, core command
reference, a machine-readable docs/SITE-MANIFEST.toml so a website agent
can harvest the tree — TZ-RELEASE-1.0 slice С8); THIS phase — the
org.vibevm.doc/doc package, the docs-legacy/ archive, the generated
TOCs — moves to the post-1.0 campaign together with its prerequisites
(the judgment-marking pass). PHASE-G-SPEC.md stays its spec, unedited.
63Entry: F closed, and the judgment-marking pass run — it supplies the
audience axis and the actionstage="doc" markers the guides' tables of
contents are generated from. Full specification:
campaigns/packages-2026-09/PHASE-G-SPEC.md.
64docs/ (43 unobserved files) moves wholesale to docs-legacy/ under the
legacy-spec/ rule; documentation is re-authored as a package,
org.vibevm.doc/doc, with org.vibevm.doc/web reserved as a manifest only.
65The law that shapes it: documentation cites a spec unit and never restates it. The reason is this campaign's own most-repeated finding — a restated fact is a second statement of one truth with its own writer, and nothing forces the two to agree. Links run one way, docs → spec; the spec tree does not know the documentation exists. The cost of that (a spec unit can move under a page citing it) is paid by PROP-014's revision pinning, so authorship is one-way and detection is two-way.
66Not a deviation from spec-genres' two-way-link rule: that rule governs lore
explaining a contract, and product documentation is a genre its map does not
carry at all. Phase G adds the row.
6. Predictions (falsifiable, campaign-wide)
67A5 is adopted, so each prediction names the step that tests it. Wave 1's prediction 1 went untested for a whole campaign because no step required the command that would have tested it.
- 68
worldmeasures higher thanai-native. Tested by: Phase C's exit gate (ii) — the X/Y/Z summary is recorded per namespace, not just in total. - The aggregator genre (
redbook,rust-ai-native,go-ai-native,typescript-ai-native) needs at least one grammar amendment to PROP-043 §3.8. Tested by: Phase A step 3's pilot, which includesredbookspecifically so this fires early or not at all. - ≥ 1 practice the host claims to follow turns out to be specified by a package but enforced nowhere — the profanation the mandate suspects, found concretely. Tested by: Phase F, which must answer it per practice rather than in aggregate.
- The fact-grain specmap re-mint (Phase A2) is the single longest-lead item and blocks nothing else once done. Tested by: Phase A's exit gate — record the wall-clock it took and whether any other step waited on it.
- Cost is comparable to wave 1 in lines (28.7k vs 26.7k) despite 5× the file count — packages are many small files, not few large ones. Tested by: Phase B's batch LOG entries, which record files and lines per batch.
- New, and the one wave 1 would have failed: this campaign's own
stitching introduces zero new false claims, and its own verification
confirms zero of them. Wave 1's answer was 1 and 1 — Phase D authored a
Shipped:line for aBaseline::storethat had never been built, and Phase C had already sealed five token-precedence anchors on evidence that compared one spec document with another carrying the same error. Tested by: Phase D's exit gate re-reading everyShipped:claim it authored against the code, not against the claim.
6.5 Non-goals (named, with disposition)
69Added 2026-07-31 under the owner's bring-into-line ruling:
flow:campaign-plans' ##NON-GOALS-ARE-NAMED-SO-THEY-STAY-VISIBLE asks a plan
to name what it deliberately does not do, and this plan named it nowhere. Every
line below is a boundary this campaign is holding today — most of them owner
rulings recorded in §7 — and each carries its reason and its disposition per
##EVERY-NON-GOAL-CARRIES-A-REASON-AND-A-DISPOSITION. Wave 1's lesson is why
this is worth the page: the two boundaries it held without ever naming (the
judgment axis, the doc trees) are exactly the two that cost it a phase.
- 70Does NOT re-measure wave 1. Reason: the host's 58 files stay in scope
and their verdicts stand; the two corpora share one
progress checkgate that must stay at 0. Disposition: settled; §4's scope config. - Does NOT touch `vibevm/vibepacks/org.vibevm.fractality/
.** *Reason:* its own specspace, own boot contract, own WAL. *Disposition:* held by the owner — **with a consequence this campaign has already paid.** Wave 6 proved the perimeter blind to a **second adopter of the discipline living insidepackages/`**, and half that wave's claimed absences were blind to it. The exclusion stands; the rule that now stands with it is that a claimed absence is measured over the whole tree before it becomes an obligation. - Does NOT mark `vibedeps/`.* Reason: regenerated consumer copies of the same packages — marking a copy is marking nothing. Disposition:* rejected outright.
- Does NOT verify superseded version slots. Reason: §3.3 — a superseded
slot is marked, never verified; verifying frozen history costs what a live
contract costs and buys nothing. Disposition: rejected;
core-ai-nativev0.7.0 andredbookv0.1.0 left the corpus by exclusion because--exhaustivecannot express "marked, never verified" (33 files, 1 908 facts — 23 % of Phase B's whole workload, on text nothing resolves to). - Does NOT admit the book, the legacy language projections, or the discovery
prompt. Reason, and it is the same reason three times and is not size:
every marker earns a verdict, and
confirmedhas no meaning applied to a paragraph of philosophical prose, to a frozen guide nothing cites, or to a line of a prompt addressed to another model. Disposition: owner rulings F-091 («исключи spec/book/»), F-080 («legacy-projections — это замороженная история») and F-096. The line this draws:* every document that makes a claim about* the artifact stays observed — README, boot snippet,usage.xml; only the payload leaves, and it leaves because it asserts nothing this project could be wrong about. - Does NOT soften a package to close an obligation. Reason: it is the one answer §3.6 forbids and precisely the профанация §0's mandate names — the credibility loop cannot be closed by lowering the bar it measures. Disposition: rejected outright; and mechanically enforced, since a closure that does not move the registry did not happen.
- Does NOT publish. Reason: Rule 4 red line. Disposition: the release route's obligations wait for the owner, before publication, every time.
- Does NOT use fractality. Reason: the wave-1 owner decision carries over. Disposition: held by the owner, with one recorded exception — Phase T's swarm of the running harness's own subagents, ruled by the owner 2026-07-26 and recorded rather than assumed.
- Does NOT re-mint the
-langversion slots. Reason: called off at Phase A step 2 — the blocker was a caret, not a release, and the fix needed no new slot and no publication. Disposition: still outstanding and still the owner's; §5-A step 2 keeps the diagnosis for the day it is taken up, including the three things that must be settled first (publication is a Rule 4 red line; the host resolves these packages from a second, stale working copy; the network registries 401 on this machine).
6.6 Risks and fallbacks
71Added 2026-07-31 under the owner's bring-into-line ruling:
flow:campaign-plans' ##EVERY-RISK-CARRIES-A-DETECTION-SIGNAL-AND-A-PLAN-B
asks every plan to name its risks with a detection signal and a plan B, and this
plan named none. Every risk below has already fired at least once in this
campaign — which is what makes each detection signal real rather than
aspirational — and every one is still live for the phases that remain.
##A-RISK-WITHOUT-A-FALLBACK-IS-A-WISH.
- 72R1 — the campaign is inside its own corpus. This campaign writes findings
into
campaigns/**, into this file's §7 LOG and into harvest files — all inside the tree it measures — so a grep for the very term a finding is about matches the finding. Fired three times in two waves, most sharply as a host-live count ofcampaign-planssections that showed one hit for every form, every hit inside this plan, matching only because the LOG entry written the day before quoted those words in prose. Detection: every count overvibevm/vibespecs/terraforms/orcampaigns/names its perimeter in the sentence that reports it. Fallback: excludecampaigns/*/run/**by default and report both numbers — with and without the campaign's own records. - R2 — a package-scoped search reads every successful adoption as an absence. Fired: wave 5, where 18 claimed absences were false and 17 fell; and again in wave 6's mirror image, where the perimeter omitted a second adopter of the discipline. Detection: §3.7 and its mirror; every claimed absence is re-verified over the whole tree before it becomes an obligation. Fallback: the re-verification is the wave, not an add-on to it — a wave that only closes obligations and never re-tests its own premises is half a wave.
- R3 — a false
confirmedcannot be repaired by editing the document. Editing first and judging afterwards produces a diff on an anchor whose route may be the owner's. Detection: the verdict-first rule — re-judgedriftfirst, let the registry mint the obligation and assign its route. Fallback, proven in its first live test on 2026-07-31: the Go GUIDE'sgated_packagesclustered to F-166 on the owner's sync route and now waits in the sync queue instead of landing as an unapproved diff. - R4 — the exit gate depends on rulings only the owner can give. Measured at
HEAD
fffcb494: 210 of 357 drift verdicts are routed out of the package (route b / owner) and only 147 still owe a package repair; the release route alone is 10 obligations over 41 drifts and cannot close without a publication, which is a Rule 4 red line. Detection:tasks/drift-registry.py's route table and CONVERGENCE block. Fallback:campaigns/packages-2026-09/PHASE-D-HOST-OBLIGATIONS.md— the survivors become owner-ruled deferrals rather than silence, which is the only reading of the exit gate that is not a stall. - R5 — a generated artifact quoted from disk goes stale and reads as open
work. Fired 2026-07-31: the registry snapshot on disk was two waves stale.
Detection: the registry regenerates from the verdict cache; a figure that
disagrees with
drift-registry.pyis the file's fault, never the cache's. Fallback: regenerate before quoting — the generated file is a cache and the command is the number. - R6 — the address family cannot close by editing a package. It needs a publication; the host resolves these packages from a second, stale working copy; and the network registries 401 on this machine. Detection: recorded at wave 6 — no address obligation closes without publication, on any route. Fallback: a local repoint plus a lockfile bump very likely avoids publishing altogether, since publication is only needed for external consumers — and that is the owner's call, not the executor's.
- R7 — softening a package to close an obligation. The failure mode with no
natural detector, because it looks exactly like progress. Detection,
mechanical: a closure re-judges its anchors through
merge-verdicts.py --forceand the registry shrinks by exactly that many rows, so a closure that does not move the registry did not happen — andsummary.py's drift count must fall by exactly the number of verdicts the wave's obligations carried, with the arithmetic shown. Fallback: §3.6's three legitimate answers (the host adopts, the host records a deliberate exception, the obligation is deferred with the reason on record) — and "edit the package until the finding goes away" is not among them.
7. LOG
- 732026-07-26 · RATIFIED; PHASE A OPEN. Owner ratified in session
(«подтверждаю»), adopting all six §4.5 amendments in full. Ratification
review re-measured the plan's own baseline and corrected two numbers: the
ai-native join target is 703
specmark::scope!/#[spec(…)]sites across live version slots (781 with the supersededcore-ai-nativev0.7.0), not the 247 the plan claimed — 247 is the rust family alone, which measures 248 today, so Phase C had been budgeted at roughly a third of its actual size. And seven of the ten packages carrycrates/, not eight; the three that do not are exactly the family umbrellas prediction 2 is about. Package / file / line counts (27 + 10, 154 + 140, 17 104 + 11 629) and marker state (zero) all verified accurate as authored. The adoptions changed the plan body rather than sitting in a list: Phase C's exit gate now enumerates five conditions instead of one (A1 + A2 + A6), and §6's predictions each name the step that tests them (A5), with a sixth added — this campaign's stitching introduces zero new false claims — because wave 1's answer to that question was 1 and 1, and nothing in wave 1 predicted it. Wave 1 closed out the same day: 4 488 confirmed / 1 drift / 3 unverifiable of 4 492,baseline.jsonwritten and round-tripped, Phases F and G deferred into this campaign for want of inputs (A3).
- 742026-07-26 · Phase A step 1 CLOSED; step 2 DEFERRED by owner ruling.
Scope widened, zone
campaigns/packages-2026-09/created and seeded. Observed: 344 files (58 host + 286 packages), 13 916 facts, 8 997 unmarked;progress check0 across both corpora. The step's purpose was to confirm a number and the number was wrong — 286 package files, not the 294 §1 claimed; the eight are extractor test fixtures dropped byDEFAULT_EXCLUDES' always-onfixturesrule, correctly, since one of each clean/dirty pair is deliberately malformed. Step 2 (the v0.8.0 re-mint) deferred — «не перевыпускай пакет, сделаем это потом» — which means Phase C cannot open and Phase A'sspecmap.jsonexit clause is unreachable; the full statement, including the three things that must be settled and the local-repoint resolution that would avoid publishing altogether, is in the campaign'sdeferrals.md#engine. Two facts recorded in passing:sync-engines --checkis green across 33 pairs (nothing has drifted — the gap is a version), and with two campaign zones present a barevibe progresscommand silently drops to ad-hoc mode and stops writing state, so every command now needs an explicit--campaign.
- 752026-07-26 · Phase A step 3 — the pilot probes the aggregator genre first,
and §6 prediction 2 CONFIRMS immediately. The genre probe went to the
family umbrellas rather than to
redbook(which turns out to be a book — three Russian chapters — not an aggregator; §5-A's pilot list should sayrust-ai-nativewhere it saysredbook). Two findings from a 19-line file: F-069 — the grammar gap prediction 2 is about, found concretely.rust-ai-nativeis content-minimal by design (PROP-028) and three of its four substantive facts are about other packages — what the-langstack ships, what the-mcppackage serves, thatcore-ai-nativearrives transitively. Marking those@impl/donehere asserts in this document something this document cannot be the source of truth for; when the owning package changes, nothing in the aggregator notices. Wave 1 never met this because a host PROP owns its own subject matter. The grammar needs this fact is about<other unit>— a delegating anchor whose verdict derives from the owner's rather than being asserted independently. Until it exists the honest fallback isunverifiablein the aggregator, verified where it lives. F-068 — and the probe found real drift in the same file.rust-ai-native's README tells a consumer to require^0.6; the package's own manifest is0.7.0, and^0.6on a 0.x version means>=0.6.0 <0.7.0— the documented instruction excludes the very version shipping it.typescript-ai-nativehas it one minor down (README^0.5, manifest0.6.0);go-ai-nativecarries no such line. Both offenders sit exactly one minor behind themselves, which is the signature of a mechanical version bump that never touched the prose. Worse than wave 1's stale status lines in kind: a stale status line misleads a reader, this one misconfigures a consumer. The caret in an aggregator README is derived data and should be generated or gate-checked against the manifest. Finding ids continue wave 1's sequence (F-068 onward) rather than restarting — findings cross wave boundaries (F-064…F-067 are wave-2 work) and one namespace is worth more than a tidy reset.
- 762026-07-26 · pilot markup — the aggregator is marked, and the genre
question turns out to belong to Phase C, not Phase B.
rust-ai-native's README carries its document marker and six fact anchors (AGG-ROLE, threeAGG-MEMBER-*,AGG-HOW-TO-REQUIRE,AGG-FRONT-DOOR); the closing paragraph was split in two, a sense-preserving re-split this phase allows, because "how to require it" and "where the front door is" are two facts.progress checkclean over all 344 files. F-069 does not block markup: a marker records a fact's stage and state, and "can this document be the source of truth for a fact about another package?" is a question about its verdict — so the delegating-anchor gap is Phase C's to answer and Phase B proceeds at full speed. Worth knowing before someone stalls a whole phase on it. F-070 — and--exhaustiveimmediately found something wave 1 could not have. The counter reports 8 992 unmarked paragraphs, of which 264 sit in 33LICENSE.mdfiles — the same UPL-1.0 text once per version slot. Marking them would mint 264 fact anchors on someone else's words, 33 times over.DEFAULT_EXCLUDESalready dropsrefs(third-party) andfixtures(not a contract) always-on;LICENSE.mdis the same category and belongs there, which is a code change because §4 is include-only by design. Until it lands, Phase B's exit gate cannot be reached honestly.
- 772026-07-26 · the
vibe updatepre-flight — the assumption held, and it broke two things on the way.BATCH-PLAN.mdflaggedvibe updateas the one unverified assumption under sixteen batches and asked for it to be exercised once before Phase B leaned on it. It was. The assumption itself is now verified:vibe update --allre-materialises 36 packages cleanly and the re-resolve is correct. Three consequences and two defects, in that order.
78It repointed the resolve, which closes deferrals.md#engine item 2 for
free. Every lockfile entry moved from
file:///C:/Users/olegc/gits/vibevm/… — the second, stale working copy the
deferral names, last commit c112f6f — to
file:///C:/Users/olegc/git/v/vibevm/…, this one, and source_kind moved
registry → local on all 36. The deferral had recorded the resolution in
advance («repoint the resolve at this copy's packages/ and bump the
lockfile locally… closes the gap with no publication at all») and marked it
as work someone would have to do. Nobody had to: vibe update is that
repoint. No publication, no re-mint, no owner red line touched.
79core-ai-native moved 0.7.0 → 0.8.0 at the consumer, the last mile of
the caret fix that closed wave 1's final drift row. The v0.7.0 vibedeps/
slot was pruned. This retires an ambiguity rather than just a version: v0.7.0
is now superseded at the consumer, not merely in the source tree, so
progress.toml's exclusion of core-ai-native/v0.7.0/** describes reality
instead of anticipating it. B1's subject is unchanged — the live slot was
already v0.8.0.
80F-079 — the shipped JSON Schema is one variant behind the spec and the
code, and only an environment change could expose it.
crates/vibe-cli/resources/package-tree.schema.v1.json enumerates
source.kind as registry · git · override · path · embedded.
SourceKind::Local has existed in vibe-core and is normative:
##LOCAL-SOURCE-KIND
and ##LOCK-LOCAL both say a package resolved from project-local records
source_kind = "local". The schema never learned it. The golden
tree_json_validates_against_schema_and_carries_known_facts went red on all
36 packages the moment a resolve actually produced one — the floor caught
it, which is the gate working. It had been latent for as long as this host
resolved through the stale copy's embedded registry, because that path emits
embedded, which the schema does know. Fixed in place: the enum gains
local and a description distinguishing it from embedded. The lesson is
the campaign's own thesis in miniature: a contract document drifted from the
code it describes, and no gate could see it until the environment changed.
Nothing was wrong with the checker — the checker was never given the input
that falsifies.
81F-078 — the host now reads four rules twice. (Restated 2026-07-26 after
DRIFT-029 returned on its stop rule. The first version of this entry, below,
named the wrong cause: it read the generation of a slot's boot artifacts as
the defect. It is not — PROP-038 ##UNIT-PER-PACKAGE decides that «every
package materialised under vibedeps/ carries its own boot artifacts …
not only entry-point workspace nodes», and ##UNIT-SELF-CONTAINED makes a
unit's STATIC.md contain everything statically linked into it, once
each — so the git-practices unit holding its four members is correct.
There was no path-based fallback either: bootgen.rs:305 reads a
statically-linking dependency through its compiled STATIC.md by explicit
design, and the absent [boot_snippet] is why the other branch is not
taken. The prescribed one-line fix would have left that reference dangling
and turned a duplicated boot lane into a failed install, which a
characterization golden already pins.)
82The real mechanism is the hoist counter, and it is a defect against
§2.3. static-soft is the default precisely so that «a package statically
linked by more than one consumer is hoisted … and linked once»
(##MODE-STATIC-SOFT), and ##SOFT-DEFAULT-WHY names the reason in the exact
words of what we observe: «the model sees the same prompt several times and
can be confused about which copy is authoritative». hoist::soft_static_pulls
walks only materialised packages, so a member pulled statically by both
the root and an aggregator counts one puller, misses the two-puller
threshold, stays unhoisted, and is compiled a second time by the root's
static_transitive_closure. Counting the root restores the #use references
§2.5 designed. Queued as DRIFT-030, not run — it rewrites boot
composition for every consumer and carries one unresolved interaction
(whether append_hoisted double-adds at the root, after
compute_effective_boot has already deduped). Two premises of mine died
here in one task: that the write was wrong, and that a fallback caused it.
The stop rule is the only reason neither reached the tree.
83The original entry, kept because a corrected record should show what it
corrected: git-practices ships three
files (LICENSE, README.md, vibe.toml) and its own manifest says
«content-minimal (PROP-028): no boot snippet of its own; each member ships
theirs». Materialisation nevertheless wrote
vibedeps/flow-git-practices/0.1.0/spec/boot/{INDEX,STATIC}.md — 192
generated lines compiling the umbrella's four members — and the host then
inlined that generated file into vibevm/vibespecs/boot/STATIC.xml as a contribution
from git-practices, on top of the four members it had already compiled
directly from the BFS closure. STATIC.md grew +194 / −0 and each of
atomic-commits, attribution-policy, autonomy and conventional-commits now
appears twice. Source clean and .vibe/cache copy clean were both
checked, so cache poisoning is ruled out by elimination: vibe generated it
during the run. Filed as DRIFT-029; the boundary that makes it tractable
is that the one other slot with a generated INDEX.md
(delegation-rules) ships it from source, so the fix must separate
generated here from shipped by the package rather than keying on the
file's presence. Does not block Phase B: the duplicated text is
identical, so it costs boot tokens and states no contradiction, and
vibevm/vibespecs/boot/** is outside the observed corpus by design.
- 842026-07-26 · Phase B opens, and the corpus loses a fourth chunk before the
first marker lands. F-080 RULED.
core-ai-nativewas batched B1–B3 by genre — guiding + operating layer (9 files), mechanisms + appendix (7), andspec/legacy-projections/(11). The third turned out not to be work.
85Eleven v0.1 language guides — C++ ×3, Java ×4, Kotlin, Python, Go, TypeScript — 1 264 lines of substantive normative prose (version floors, MUST gates, licence flags) that nothing in the living corpus cites. The go stack's guide says GUIDE-GO-v0.1 «stays, untouched» in that directory; the typescript stack declares GUIDE-TYPESCRIPT-v0.1 superseded; the other nine have no successor stack at all, which is what made it a genuine question rather than an obvious exclusion.
86Owner ruling: «legacy-projections — это замороженная история. Мы
когда-нибудь покроем эти языки, но еще не сейчас. Сейчас у нас есть активные
rust, typescript и go.» So it is §3.3's category — marked, never verified —
and, exactly as with the superseded version slots, --exhaustive cannot
express that, so the directory leaves the corpus instead. The exclusion is
genre-shaped (packages/**/spec/legacy-projections/**) rather than pinned to
v0.8.0, so the next version slot cannot silently re-admit 1 264 lines of
frozen text; the languages return as includes when a stack for them lands.
87The pattern holds for the fourth time. Machine copies, licence boilerplate, derived indexes, superseded slots — and now frozen projections. Every one was found by asking what the corpus is made of, and not one by estimating how big it is. Phase B is fifteen batches, not sixteen; the package corpus is 206 files, not 217. The fact count is deliberately left as a recount rather than carried forward minus an estimate — the campaign's own rule about numbers quoted before their decomposition applies to its own numbers first.
- 882026-07-26 · F-081 — the floor was gating a dead slot, and it is the mandate's own question answered against us. Found while checking whether Phase B markup could break the packages' specmap ratchet. It cannot — that gate is orphan-coverage over code — but two lines away sat something worse.
89tools/self-check.sh steps 7 and 9 gated
core-ai-native/**v0.7.0**. sync-engines.toml declares the authored home of
the neutral engines as core-ai-native/**v0.8.0**/crates, and moved there in
0aa4ba01 — wave 1's caret fix. self-check.sh was not moved with it; its
last touch is 2570629d, earlier. So for that whole interval the floor ran
fmt / test / clippy and the self-trace over a frozen slot — one
progress.toml excludes as superseded, vibe update has since pruned from
vibedeps/, and nothing resolves to — while the engines everything actually
vendors went ungated.
90The two trees are not close: ten files differ, and two source trees exist
only in v0.8.0 — conform/src/rules/go.rs and specmap/src/mdspec/,
the latter carrying tests.rs. The fact-grain specmap engine's own tests
had never been executed by the floor — the engine Phase C's evidence join
depends on, and the one whose arrival closed wave 1's last drift row.
91Step 7's comment states its purpose verbatim: «Gate the authored source here.» It stopped doing that and nothing noticed, because the gate stayed green — faithfully testing the wrong tree. That is §1's профанация in its purest observed form, and it was found in the campaign's own gate rather than in the corpus it was pointed at.
92Fixed, measured before changed. All four gates were run against v0.8.0
first — fmt 0, test 0 (all suites green), clippy 0, specmap --gate 0
orphans — so the repoint adds coverage without buying a red. The slot is now
one CORE_SLOT constant, and a new floor step asserts it appears as a
source_root in sync-engines.toml, failing loudly with the candidate lines
if it does not. Both branches of that guard were made to fire before it was
trusted (DRIFT-020's rule): it passes on v0.8.0 and fires on v0.7.0 — the
exact state it would have caught.
93This is the fourth time in two waves that the expensive thing was a derived value nothing kept honest — a caret, a hand-written timestamp, three stale projections, and now a gate's target. The pattern is stable enough to plan against: whenever one file's constant must track another file's constant, the tracking is a checker or it is a WISH.**
- 942026-07-26 · F-078, third state: the duplication is structural, and the
stop rule caught a wrong fix for the second time. DRIFT-030 returned on its
§4 step 1 gate — the question the task made it answer before touching the
counter. It answered by measuring: a fixture of vibevm's exact shape
(root
static-transitive→ content-minimal aggregatorstatic→ member), driven throughapply_resolution. Baseline reproduced the live defect (root copies 2, aggregator 1). With the counter fix applied: root copies still 2, aggregator 0. The duplicate does not disappear; it migrates into the root's own lane.
95The reason is in the spec, not the code. ##HOIST-LCA puts the hoist target
at the LCA of a continuous static zone; vibevm's root → redbook →
git-practices → member chain is unbroken static, so that LCA is the root —
and the root is simultaneously the hoist destination and its own compile site.
Two write paths reach the root's lane and neither knows about the other:
compute_effective_boot dedups only inside its own BFS closure and never sees
append_hoisted, which pushes the same {slot}/{source} path unconditionally.
96So the counter is necessary and not sufficient — and the remaining half is
a design question about which mechanism owns dedup, which is spec-shaped and
therefore the reviewer's, not the executor's. Three candidates are on the
table; the third reads ##HOIST-LCA most literally and satisfies §6 verbatim:
the root is a hoist destination and never a puller, so a zone emits #use
for anything the hoist point already carries and append_hoisted does not
fire at the root at all.
97Not decided here, and deliberately. Phase B is the mandate; this duplication costs boot tokens and states no contradiction, since both copies are byte-identical. It is recorded, measured, and parked with a recommendation rather than half-fixed. Two executor runs, two returns, and both returns were worth more than the fix would have been — the first killed a change that would have turned a duplicated boot lane into a failed install, the second killed one that would have moved the duplicate rather than removing it. Neither was visible from reading the code; the second needed an experiment.
- 982026-07-26 · B1b closes core-ai-native's guiding+operating layer, and the
gate finds two grammar gaps the eye could not. Six files, 506 → 655 lines,
276 units marked (including the batch's first tables — 70 body cells), 224
anchors, 32 paragraphs deconstructed, 21 heading anchors added.
progress checkclean over 264 files. B1 total with B1a: 417 units over nine files.
99Two of the executor's open questions were settled by running the checker rather than by argument, and both turned into findings.
100F-083 — a GFM task-list item cannot carry a fact anchor.
##FACT-ANCHOR-SYNTAX requires the anchor to be the unit's first token;
the parser reads - [ ]'s checkbox as that first token, so an anchor placed
after it is invisible and the unit reports MissingAnchor. There is no
legal placement today — the checkbox is structure, exactly like the list
marker and the ordinal, and the grammar does not say so. Four items in
02-EXECUTABLE-SCAFFOLDS.xml were marked, went red, and were reverted; they
stay unmarked until the parser learns it. The executor predicted this exact
outcome and named the one command that would settle it, which is the right
shape for an uncertainty.
101F-084 — the trailing marker dies silently next to a quoted fence. In
01-PATTERN-CARD-FORMAT.xml:41 the last-token shorthand was not recognised on
a paragraph whose text carries an inline code span containing a triple
backtick ( ` ```card-ops ` ): fence-awareness (##FENCE-AWARE) misreads
it and the marker is swallowed. Moving the marker to position 1 clears it —
proven by re-running the gate, not by inspection. The failure mode is the
dangerous part: it reports as unmarked, not as an error about the code
span, so a session that "fixes" it by re-adding the marker in the same place
loops forever. Any document quoting a fence in prose is exposed; that is a
large class in this corpus, which is about fenced formats.
102Both gaps are in the tooling this campaign uses to measure, not in the corpus it measures — the same place F-081 was. Three of the wave's findings so far are the instrument being wrong rather than the subject, which is worth noticing before the remaining thirteen batches trust its output.
- 1032026-07-26 · DRIFT-031 lands both grammar gaps — and F-084 was three times
bigger than diagnosed. Two commits, floor green on the committed tree,
progress checkclean over 264 files on a cold parse.
104F-083's cause: parse/facts.rs::list_item_content returned the offset
just past - / N. and stopped, so - [ ] ##ID had [ as its first
token. Now composed with a task_box_len that accepts [ ]/[x]/[X] only
when followed by whitespace — [ ]glued stays prose, which is GFM's own rule.
105F-084's cause was not the triple backtick. parse/blocks.rs::blank_inline_code
toggled in_code on every individual backtick, so any run of two or more
desynchronises the flag and everything after it is blanked — and any block with
an odd total of backticks blanks to its end. A probe over all 723
.md files found 23 text blocks in 21 files where naive and run-aware
blanking disagree, including a stray tick in docs/glossary.md:217 swallowing
the rest of its block. I characterised this as the triple-backtick case from
one sample; it is the general inline-code-span defect. The task's §4 had
already specified the general behaviour while its §8 hedged the scope — my own
task contradicted itself, and the executor resolved it toward the behavioural
half and said so. Measured collateral: zero — no diagnostic anywhere else
moved.
106The 01-PATTERN-CARD-FORMAT.xml marker went back to the last position on
purpose: that is the position F-084 broke, so the file is now a live witness
that goes red again if run-matching regresses.
- 1072026-07-26 · F-085 — the register that marks a normative fact is the one code cannot cite. Found in DRIFT-031's forced deviation, and it aims straight at this campaign's deliverable.
108##DECISION-TWO-REGISTERS (owner, 2026-07-24) makes ##UPPER-SLUG the
register for a normative fact and ##kebab-case for a service unit.
is_valid_fact_id accepts both — its own doc says so — but the spec://
URI parser validates through is_valid_anchor, which is kebab-only, and
rejects the rest with "anchor must be kebab-case". So
#[spec(implements = "spec://…#SOME-NORMATIVE-FACT")] does not compile.
DRIFT-031 hit it, cited the containing section anchors instead, and named
the facts in doc comments — and reported the deviation rather than hiding it.
109Measured, not inferred: of every spec://…#anchor cited from crates/,
275 are kebab and none is UPPER (the handful of non-kebab hits are
placeholder prose in doc comments).
110Why it matters here specifically: Phase B is minting UPPER anchors on every
normative fact — that is the register decision — and Phase C's evidence join
exists to connect those facts to code. B1 alone minted roughly 330. As it
stands the join can only ever reach service units, which is precisely
backwards. Options: (a) let the URI parser accept is_valid_fact_id in
the anchor position, leaving the kebab-only law for heading anchors
untouched — the superset function already exists and is documented as such;
(b) flip the register convention, which re-anchors both waves and was already
considered and rejected at ##registers-rejected; (c) accept, and let code
cite sections while naming facts in prose — which forfeits the fact-grain join
this campaign is built to produce. Recommend (a). The constraint is that
the grammar crate lives in core-ai-native, so per §5-D this is a release
event: the fix must be vendored forward with cargo xtask sync-engines to
all three stacks, not merely edited.
- 1112026-07-26 · Two operating facts worth not re-learning. The parse cache
keys on content hash only, so a parser change is invisible to a warm
cache and re-verification after one needs
--no-cache— DRIFT-031's first run served the old parse for every unchanged file. And the deliberate copies oflist_item_contentacross the separability seam (crates/vibe-spec/src/facts.rsand the package twin incore-ai-native-specmap::mdspec) now disagree: only progress-core's learned the checkbox. That divergence is out of DRIFT-031's bounds by design and wants its own decision.
- 1122026-07-26 · Four owner rulings, and the open-findings queue empties.
113F-082 — RULED: boot snippets ARE marked, «и внутри пакетов, и внутри самой
vibevm». So the +52 % the measurement showed is accepted as the price of
making a consumer's boot lane addressable by spec://, which is what the
correction contract exists for. Nothing changes operationally — the host's own
00-core.xml / 90-user.xml were marked in wave 1, and the 24 package snippets
are marked as their batches arrive. Recorded so the cost is never re-litigated
as if it had been an oversight.
114F-085 — RULED (a): the URI parser must accept fact ids; heading anchors are
not touched. Filed as DRIFT-032 and dispatched. It is a release event —
the grammar crate is vendored into five packages, so cargo xtask
sync-engines propagates or the floor goes red. Worth recording that the fix
is not a new decision: ##FACT-ID-GRAMMAR already says a fact is
addressable as spec://…/<doc>#<ID>, and the parser simply never implemented
that sentence. One test flips by design (tests.rs:33 lists
spec://org.vibevm.core/vibevm/x#A-b as rejected, commented «uppercase anchor»), and the
assertions that is_valid_anchor("FACT-A") stays false must survive — a
useful tripwire that the change is scoped to the URI and not to the heading law.
115F-075 — RULED (d): seal writes processed_hash. F-077 — RULED (a):
the derived counts are deleted and computed on read. Both filed as DRIFT-033.
F-075's choice also discharges amendment A4, which requires the hand-seal
staleness gap closed before Phase C and names F-067 as the reason — the same
field, seen from the other end, so one change answers both. Recorded for
honesty: (d) makes staleness checkable against the text; it does not
detect a session that re-derived one anchor of three hundred and sealed the
file. That half stays open by choice, not by oversight.
116F-077's target had already moved before the ruling landed. The
campaign.summary the finding named is gone; the stored projection is now
counters in campaign.json. Option (a) is written against the class rather
than the instance for exactly that reason — this one has demonstrated it
relocates.
- 1172026-07-26 · DRIFT-032 lands F-085, and its executable change is two lines.
parse_spec_urivalidates the anchor withis_valid_fact_idinstead ofis_valid_anchor; the message follows.is_valid_anchor's body is byte-identical — the owner's «заголовочные якори пока не трогаем» held. Host twin (vibe-spec/src/address.rs) widened to match, four vendored copies propagated bysync-engines(33 pairs, 6 sets, clean), floor green on 25 steps.
118Proved rather than asserted, and with a negative control: a temporary
#[spec(implements = "spec://…/00-MANIFESTO#SINGLE-DESIGN-TARGET")] — a real
anchor B1 minted — compiled; the old validator was then restored to confirm
the same tag fails, so the passing case was load-bearing rather than inert.
Both temporaries removed.
119§4 step 4 came back NOT FOUND, thoroughly: both anchor collections are
byte-exact maps, vibe-spec, progress-core and the whole authored engine
tree contain zero case transforms, no heading-text slugification exists,
and no anchor becomes a path component (so the case-insensitive Windows
filesystem never sees one). That clears the ground for DRIFT-034's
case-insensitive duplicate check.
120My task file was wrong on an edge case and the executor measured before
proceeding. §4 claimed 9lives "still fails"; it did not — kebab admits a
digit head, so the swap is not a pure widening: digit-headed anchors go
accepted → rejected, trailing dashes rejected → accepted. Measured across
380 distinct cited anchor segments and 750 distinct {#…} heading
anchors: every one already matches [A-Za-z][A-Za-z0-9_-]*. Zero regression,
and the asymmetry is pinned in a test. DRIFT-034 inherits that measurement
— widening the heading law has the same digit-head consequence and the same
zero blast radius.
- 1212026-07-26 · F-086 — the sync gate is green because it is not looking, and
that is the third one this session.
cargo xtask sync-engines --checkreports «every vendored crate matches its authored source (33 pairs across 6 sync sets)». Six packages vendorcore-ai-native-specmark-grammar;sync-engines.tomlnames five roots and no target forgo-ai-native-langorgo-ai-native-mcp. They are not out of sync — they are outside the check.
122Measured, not inferred: go-ai-native-lang/v0.1.0's vendored grammar is
byte-identical to the authored v0.7.0 and differs from v0.8.0, while
its own manifest declares flow:…/core-ai-native = "^0.8". The rust twin is
correctly identical to v0.8.0. So a package declares 0.8 and ships the 0.7
engine — it predates the fact-grain amendment and now also the URI widening —
and the gate built to catch exactly that says everything matches.
123This is plan §5-E's own rule failing on its own terms: «a fix inside a package's crates must be vendored forward to every family member that copies it, or the fix ships to one consumer and not the others». Pre-existing at DRIFT-032's base commit; adding sync targets is a design call, not a fix, because the go family's engine version is a release question.
124Third instance of one shape: F-081 (the floor gating a frozen slot), F-083 and F-084 (the parser not seeing units the grammar allows), and now F-086. A green panel is evidence about what was checked, never about what was covered — and nothing in the panel reports its own coverage.
- 1252026-07-26 · F-087 — the repository's own attribution rule is contradicted
by a convention in its history. Raised for the owner; not actionable by me.
The policy says, unqualified: «Never mention model, agent, or AI-tool names in
commit messages, branch names, or code comments.» 17 of this repository's
1 852 commit bodies name a model — the wave-1 convention of writing which
executor tier a task went to. Campaign task files carry the same in their
**Executor:**line, though those plausibly fall under the policy's explicit carve-out for «technical AI-workflow documents … agent instructions».
126The history half cannot be cleaned. It would need a rewrite of published
commits — a Rule 4 red line — and the source-mirrors law forbids --force
«for any ref, for any reason». So the practical choice is between accepting
the existing 17 and stopping there, or amending the policy to carve out
executor-tier labels. No new commit in this session names a model; the
convention stops here regardless of the ruling. Surfaced because an executor
flagged its own task file for it after self-repairing an attribution trailer
it had added — the rule working from the inside.
- 1272026-07-26 · DRIFT-034 stops, and the corpus refutes the reviewer's own
argument. Making duplicate detection case-insensitive flags 29 published
anchor pairs across 12 documents, every one the same deliberate shape: a
section heading
{#kebab-slug}and, two lines below, that section's lead normative fact##KEBAB-SLUG. Independently recounted: 29 across 12. It is the house convention the two registers exist for — the heading anchor addresses the section span, the fact anchor addresses the lead statement, and the register is what tells a reader which grain they are citing.
128The reasoning that justified the fold was wrong, and this is the
correction. §2 of that task claimed: «today an UPPER-SLUG fact cannot
collide with a heading anchor, because a heading anchor cannot be UPPER —
that is a structural guarantee, and widening removes it.» It is not a
guarantee and widening removes nothing. ##TWO-TREES and {#two-trees} are
byte-different, so they were never a duplicate under byte-exact detection,
before or after. What widening newly permits is writing {#TWO-TREES} — which
would be a byte-exact duplicate of ##TWO-TREES, and the existing check
catches it unchanged.
129So the two halves were never one idea: the widening is safe on its own (measured: 727 files, 1 227 distinct heading anchors, zero that would fail the wider grammar, zero digit-headed), and the case-insensitive check is a separate proposal that this corpus refutes. Its purpose was to replace a guarantee that did not exist, and its cost is flagging the authoring convention 29 times. Recommendation to the owner: widen, drop the fold. Byte-exact detection keeps catching every real duplicate; a fold would be machinery for a defect that is not there.
130Recorded because it will be asked again: duplicate detection lives in five
places, not one — mdspec.rs:341 (PROP-014 warning), progress-core/parse/anchors.rs:12
(what progress check fails on), vibe-spec/gate.rs:55 (a build error via
pipeline.rs:82), vibe-spec/doctree.rs:71 (recorded, no consumer), and the
validator itself. And doctree.rs:70's map is the resolution index, so any
future fold must be a second parallel key set there, never the lookup key.
131Corroboration for F-078 from an unrelated angle: the same sweep found 69
byte-exact duplicate anchors, all inside vibevm/vibespecs/boot/STATIC.xml — the
generated lane carrying the duplicated git-practices snippets. Outside the
Progress-Control corpus, so nothing fails on it; it is the same defect seen by
a different instrument.
- 1322026-07-26 · A pattern in the reviewer's own work, stated rather than buried. Five task files this session carried a factual error an executor found by measuring: DRIFT-029 (two premises wrong), DRIFT-030 (premise incomplete), DRIFT-031 (§4 and §8 contradicted each other on scope), DRIFT-032 (an edge case that was already true), DRIFT-034 (the §2 reasoning above, plus two slips in §6). Every one was caught before it reached the tree, by the stop rule and by the "reproduce before you fix" step the tasks carry. The mechanism is working exactly as designed and the frequency is the lesson: a task file is written from reading, and reading this codebase has been wrong five times out of five where a measurement was available. Future tasks should keep leading with a measurement step, and the reviewer should stop writing confident current-state bullets that a single command would have checked.
- 1332026-07-26 · DRIFT-033: one finding was already closed, the other splits in two — and the stale claim was mine, from a ledger I had read.
134F-075 needed no code at all. seal has written processed_hash since
e9fc7b44 (DRIFT-026, sealing a verdict stops depending on memory), landed
earlier in this same campaign. The task's §3 repeated F-067's original
wording — «written only by a real verify batch» — which was true when F-067
was filed and stopped being true when that commit shipped. Measured rather
than argued: a seal on a scratch copy wrote the file's own sha256, identical
to sha256sum, from the crate's single content_hash. Amendment A4 is
therefore discharged, by DRIFT-026 and not by DRIFT-033, which contributed
the test nobody had written. deferrals.md corrected in place.
135That commit subject was in the log this session read at boot and quoted in its own resume report. Six task files have now carried a wrong current-state claim; this one was recoverable from a line I had already read. The rule that follows is narrower than "measure more": a ledger entry is a claim with a date, and quoting it is not the same as checking it.
136F-077 lands half and stops half, on two spec anchors. The per-file
summary is gone and computed on read — nothing in the crate, the CLI, the
dashboard, spec/** or the campaign's own documents read it. But counters
in campaign.json is named by ##STATE-FILES @impl/done, and
##DASHBOARD-READS-ONLY says «The dashboard reads only these; it
computes nothing» — and tools/progress-dashboard/index.html:106 renders
four tiles straight from camp.counters. Removing it is a spec edit, so the
executor stopped. Correctly.
137And the two rules genuinely conflict, which my blanket recommendation of
option (a) did not anticipate. ##DASHBOARD-READS-ONLY exists for the same
reason F-077 does — to stop a second implementation of the campaign's
semantics, in this case in browser JS. Deleting counters would satisfy F-077
by violating that. The resolution is that F-077's hazard was never "a
derived value is serialised" — it is "a derived value has an independent
writer that can drift". campaign.summary went stale because it was
hand-maintained. A projection recomputed from the single source on every write
cannot. Recommendation: keep counters, guarantee it is written from the
same one computation the rest of the system uses, and pin that with a test
asserting it equals a recount. One computation, one writer, serialised for a
consumer contractually forbidden to compute. ##CACHE-TALLY-COMPUTED records
the half that did land.
- 1382026-07-26 · DRIFT-036 closes F-086 — and disproves the consolation the reviewer offered with it.
139Both denominators exist and both were made to fire. Sync went 33 pair(s)
across 6 sets → 51 across 9, «all 6 vendored engine dir(s) … are sync
targets». The floor went 25 steps over 4 workspaces → 36 over 7, opening
with «the floor builds all 7 live package workspace(s)». Three firings
recorded: a live workspace the floor does not build; a gated slot that is not
its package's live one (the F-081 shape, caught from the other side); a
vendored engine dir that is the target of no sync set. The frozen slot is
excluded by derivation — live_slots takes the newest slot per package by
sort -V, so a version literal cannot rot: when v0.9.0 lands the guard goes
red until the gate is repointed.
140The correction, and it lands on something already said out loud. §3 of the
task claimed the go packages carry a v0.7.0 engine wholesale, that rules/go.rs
exists only in v0.8.0, and therefore that
go-ai-native-lang/README.md:8-9's «^0.8 — the first edition carrying the Go
fact/config/rule support» is false as shipped. Measured: they are a
mix — core-ai-native-conform was already v0.8.0, rules/go.rs present
before this task touched anything (verified at a314d38a^); only specmap
and specmark-grammar lagged. The README is accurate. The claim was mine
and it was wrong.
141That matters beyond the task, because it was used to answer the owner's question «why did the process not catch this, and could Phase C have?» The answer given was: the claim is false, it sits in an observed document, so Phase C at batch B5 would have caught it. All three legs fail. No observed document makes a claim that F-086 falsifies, so no phase of this campaign would have caught it — the consolation is withdrawn and the underlying point is left standing alone and stronger: the corpus is observed; the instruments are not.
142The real drift is sharper than «a version behind», and worth keeping in these words: the go packages froze when they were vendored and missed exactly what the gate carried while they were outside it — including, on the same day, the two engine commits from DRIFT-032 and DRIFT-034.
143§8's stop did not fire and the feared break was imaginary. The Fact::GoUnsafe
problem cannot occur here: the sync changed 8 files and needed zero source
edits. What the three unlisted workspaces did surface was untouched by any of
it — fmt had never run on them (root cargo fmt --all does not enter an
excluded workspace), three real clippy lints sat in authored go code, and
typescript-ai-native-lang's 191 tests had never run here while its code
ships into another package.
144A method note worth more than the numbers: enumerating that stack's
environment-blocked tests by watching failures gave 3, then 5. --no-fail-fast
gave the truth — 6 across 4 binaries, plus a second toolchain directory
nobody had looked in. Iterative failure-watching under-counts by
construction, because each run stops at the first failure and reports a
prefix as if it were the set.
145Accepted with its reason recorded — probe-guarded test steps. A missing
gopls or tsc makes the step filter the tests that need it and print a NOTE
naming what was dropped and the recipe to restore it, every run; a
provisioned box filters nothing. That is consistent with this task rather than
an exception to it: the filter has a denominator and states it out loud.
The pre-existing rust-analyzer trade is the same bargain made silently, and
it is that one which should rise to this standard, not this one that should
fall to it. Revisit when: a NOTE is observed being ignored across sessions,
which would mean it has become wallpaper.
146Cost, reported and not decided (per §8): floor 154 s warm over 36 steps,
of which the 11 new steps are 30.7 s (+25 %); cold is materially worse
since three more workspaces each own a target/. The tiering call is the
owner's, and Phase T's §7 will want this number anyway.
- 1472026-07-26 · B2 closes
core-ai-native, and the first thing it found was the reviewer contradicting himself eight hours earlier. Seven files, 950 → 1 100 lines, 526 units, 472 fact anchors, 49 paragraphs deconstructed, 27 heading anchors.progress checkclean over 264; zero unmarked in the seven under--exhaustive. With B1 that is 943 units over sixteen files and the whole live slot ofcore-ai-nativeis marked.
148Self-audited before hand-over: a word-stream diff proves every file
byte-equivalent once anchors, markers, bullets and whitespace are stripped,
and a re-implemented counter reports 0 unmarked, 0 anchor collisions, 0
marked-without-anchor, 0 anchored-without-marker. Zero @unknown, and
stated as deliberate — the two places it would have hedged it measured
instead, and the one unit it considered @unknown for it correctly reported
as drift («unknown means looked-at-and-not-understood; reporting drift is
the other channel»).
149The reviewer's error, and it is the sharp kind. PROP-014 now contradicted itself inside one bullet list: line 80, amended this morning, says the heading grammar is «one law, shared with fact ids»; line 95, three bullets below, still said «Heading anchors keep the kebab-only law». I amended the first and did not read the second in the same file. The shipped parser sides with line 80 and its doc comment cites that very section as authority. Corrected in place, and the sentence now records when the law changed instead of asserting the old one. Amending a clause without re-reading its document is the same failure as quoting a ledger line without re-measuring it — and this is the second one today.
- 1502026-07-26 · F-088 — a second derived file the F-071 audit missed, and this
campaign has now hand-edited it. OWNER RULING NEEDED.
appendix/ATLAS.mddeclares on line 2: «GENERATED fromfindings.jsonl(A2: derived, do not hand-edit)».findings.jsonlis tracked nowhere in the repository. Three consequences, in rising order of discomfort: the file's stated source of truth is absent;01-PATTERN-CARD-FORMAT.xmlpoints card authors atfindings.jsonlIDs that cannot be resolved; and B2 has just minted 93 hand-authored anchors into a file that forbids hand-editing — if the generator ever returns, the markup dies.
151This is exactly F-071's class, which DRIFT-024 answered by excluding three derived indexes from the corpus. That audit missed this one, and the reason is instructive: it searched for the wording those three used, and ATLAS says «GENERATED from» rather than «hand edits are a defect». A phrase sweep is not an audit — wave 1 wrote that lesson down and this is its second instance. Its internal arithmetic is not drifted (87 rendered entries; axis, evidence-class and status distributions each sum to 87). The question is scope, the same shape as F-080, and it is the owner's.
- 1522026-07-26 · F-089 and F-090 — PROP-014 against itself, twice more.
F-089: its
##HOME-SHIPS-WITH-THE-DISCIPLINEnames the Rust implementation as «specmap-core+ therust-ai-native-specmapbinary».specmap-corehas zero occurrences anywhere in the repository; the real crate iscore-ai-native-specmap, which PROP-014's own §2.9 uses. A pre-PROP-028 name the family rename missed — drift-stage work, and the unit stays@impl/donebecause an implementation does exist and only the name drifted. F-090: §2.7, §2.8 and §2.9 carry no`req rN`kind line while §2.1–§2.6 all do — against its own §3.1 principle 3, «Normativity is marked, not implied … a reader must never guess whether a sentence binds». Three of its own decision subsections make the reader guess.
- 1532026-07-26 · One reported problem that is not one, recorded so nobody
"fixes" it. B2 flagged
01-PATTERN-CARD-FORMAT.xml:41as carrying F-084's shape with a last-token marker. It does, on purpose: DRIFT-031 fixed the parser, and the marker was left in the position that used to break so the file is a live witness that goes red again if run-matching regresses. The gate confirms it — zero unmarked. The executor could not know, because the brief forbids it running the gate; the flag was the correct move on the information it had.
- 1542026-07-26 · F-091 RULED — the book leaves the corpus, and the fifth
subtraction is the first that is not about staleness. Owner: «исключи
spec/book/**».flow:redbook's three Russian chapters (1 209 lines, 375 facts) plus the edition-plan README leave; the package's README and boot snippet stay. Corpus 264 → 260 files, unmarked 5 068 → 4 685, and B4 dissolves —redbook's two survivors fold into B16.
155The package rules itself out in its own words. Its boot snippet: «Do not read the book at session boot — it is reference depth, not standing instructions.» Nothing outside the package cites a chapter.
156But the deciding argument is Phase C, not size, and it is worth keeping
because the next case will look different. Every marker earns a verdict, and
confirmed has no meaning applied to a paragraph of philosophical prose. We
would meet exactly the wall §3.3 and F-080 met — --exhaustive cannot express
«marked, never verified» — while minting 375 spec:// addresses on narrative
nothing resolves against.
157This is a new category, not another instance of the old one. The four
earlier subtractions were all staleness or duplication: machine copies,
third-party licence text, derived indexes, frozen slots. The book is
authored, current, and the source of the discipline's spirit — it is
excluded for its genre, not its age. In spec-genres' terms it is lore,
and the corpus is for contracts.
158Recorded so the door stays visibly ajar: re-admitting it needs a rule this
campaign does not have — «lore is marked but never verified» — and that rule
needs tooling, not just a glob, because the exhaustive counter is what
forbids it today. The genre is worth having eventually: a flow citing the
chapter that justifies its rule is exactly the two-way link spec-genres
wants between a contract and its lore.
- 1592026-07-26 · F-092 — a
SKILL.md's YAML frontmatter cannot carry a fact anchor, and the finding had been filed onto a closed id. Nine files across six packages open with---, and the scanner has no frontmatter rule: the block parses as one countable paragraph whose first token is the opening fence, so##FACT-ANCHOR-SYNTAX's first-token requirement has no legal placement. B5 met it on the two go skills, left them unmarked, and the landing commit said so honestly — 663 of 665 units. B6 will meet it on the two TypeScript skills; B7 on the two Rust ones.
160The shape is F-083's exactly, one structure later. There too an unmarkable
first token was structure the grammar did not name, and there too the fix was
one composition in the parser rather than a convention. blocks.rs is where
it goes: a leading ----delimited block is frontmatter, not a paragraph, and
is not a countable unit at all.
161What is worth recording is not the parser gap but the numbering. This finding was written into the checkpoint files as F-083 — an id F-083 already held, for the GFM task-list gap DRIFT-031 closed the same day. So one id named an open finding and a closed one at once, the checkpoint said F-083 was open while the task index said DRIFT-031 had closed it, and neither was wrong about its own half. It is renumbered here, and the plan is where it should have been filed on the day: a finding recorded only in the checkpoint has no id authority — the checkpoint is rewritten every session and cannot arbitrate a namespace. Sixth instance of the campaign's standing shape, and the first where the drifting artefact was the campaign's own bookkeeping.
- 1622026-07-27 · F-093 — the Rust stack's published wiring recipe cannot work as
written.
GUIDE-AI-NATIVE-RUST.xml§13 step 3 tells a consumer to writespecmark = { path = "vibedeps/<stack-slot>/crates/vendor/specmark" }. That directory does not exist: the vendored crate iscore-ai-native-specmark, so the line needs both a corrected path and apackage =key it does not have. The package's ownCargo.tomlcarries the same shape.
163This is a different severity from the drift the campaign has been finding. Every earlier finding was a document disagreeing with reality; this is an instruction that fails when followed. It is the engine consolidation landing in the crates and not in the recipe that names them — and the recipe is the first thing a new consumer runs.
- 1642026-07-27 · F-094 — the same package's README is wrong in five places, and
one of them cites a rule its own guide retracts.
crates/specmark(a third spelling of the specmark path, also absent);schemas/specmap.jtd.json(noschemas/directory exists);specmap-core/src/generated/(it iscrates/vendor/core-ai-native-specmap/src/generated); the umbrella tool list omitsledger, whichvibe.tomland the package's own boot snippet both carry; and the crate-naming line says names take the-rustsuffix «per the GUIDE §2 language-suffix rule» — while GUIDE §2's##FAMILY-PREFIX-RULEsays that policy is superseded by PROP-028 §2.4, and no crate in the package carries the suffix.
165The go twin's README was updated for the same policy change and rust's was not, which is what makes this a fan-out defect rather than a stale line: the correction reached one projection and stopped. Worth pricing before Phase D, because the family has three members and the next policy change will distribute the same way.
- 1662026-07-27 · F-095 — the rust terraform skill duplicates the sweep skill's
generic section where both twins wrote a raid-specific one.
skills/rust-ai-native-terraform/SKILL.md's «The generation-time assistant» is verbatim the sweep skill's text; go and TypeScript both carry «The generation-time assistant during raids» with their own units. Here the original looks like the copy — the inverse of##B7-RUST-IS-THE-SOURCE, which B7's brief had told the executor to assume. It did not correct toward the twins, which was right; the finding is that the assumption has an exception and the next brief in this family should say so.
- 1672026-07-27 · F-096 RULED — the discovery prompt leaves the corpus, and the
sixth subtraction is the second one about genre. Owner ruling, asked before
B8 was dispatched rather than after it was marked: exclude
DISCOVERY-PROMPT.xml(169 units, 37 % of B8).
168The deciding argument is Phase C, exactly as it was for the book. Every
marker earns a verdict, and confirmed has no meaning applied to a line of a
prompt addressed to another model — «LLM = Claude/Haiku/Sonnet/Opus» is a
variable assignment for a downstream session, not a claim about this system.
The file is not prose at all: <PROMPT_INFO>, <VARIABLES>, macro
substitution.
169The package's own boot snippet rules it out in as many words: «a payload
for a fresh session, not standing instructions — do not load it into context
outside an explicit deployment request.» Nothing outside the package cites it;
the single external hit is the generated vibevm/vibespecs/boot/STATIC.xml, which is that
same snippet compiled into the host's boot lane.
170The line the exclusion draws is worth keeping, because the next case will
test it. The package's README, boot snippet and usage.xml stay — every
document that makes a claim about the artifact is still measured. Only the
payload leaves, and it leaves because it makes no claims about this system at
all. That is a sharper rule than «lore is excluded»: a document is in the
corpus when it asserts something this project could be wrong about.
171The counter-argument, recorded because it is real: the artifact is what the package exists to ship, so the corpus now holds a package described only by its own meta-commentary. The owner accepted that. The third option — mark it and carve it out of Phase C — needs the «marked, never verified» rule the F-091 entry says the campaign does not have and that needs tooling, not a glob; it stays unbuilt.
172Sequencing note, and it is a near miss. DRIFT-037 was running when this
was ruled, and its acceptance is «exactly −9 unmarked, and no other file's
count changes». Editing progress.toml mid-run would have moved the corpus
under its before/after measurement and broken both halves of that acceptance.
The ruling was written up immediately and the config change was held until
the task landed. A scope edit is never urgent; a measurement in flight is.
- 1732026-07-27 · F-097 — a package rename left its own install command behind,
in sixteen files.
flow:atomic-commitsdoes not resolve. Commit520e7478renamed thegit-practicesmembers and the package isgit-atomic-commits; noname = "atomic-commits"survives anywhere outside the regeneratedvibedeps/and.vibe/cache/copies. Sixteen canonical files still cite the dead name — B8 found twelve and the reviewer's sweep found four more.
174The sharpest instance is the package's own README, lines 32 and 38:
vibe install flow:atomic-commits and vibe uninstall flow:atomic-commits.
Those are copy-paste instructions, in the file a consumer reads first, for a
package that is not called that.
175This is the second finding in two days of a class the campaign had not seen before F-093: an instruction that fails when followed, as distinct from a document that merely disagrees with reality. Both came from a rename or a consolidation reaching the code and not the prose that names it. Worth treating as a class rather than two incidents — the corrections that move a name are exactly the ones whose fan-out nothing checks.
176It is wave-level, not B8's. Every affected package is a world flow, so
B9–B16 will each meet their own copy. Filing one DRIFT against all sixteen is
cheaper than eight independent rediscoveries, and it must be a fact
correction under sync-from-code rather than a markup fix.
177WIDENED 2026-07-27 after B10, and measured as a class instead of found one
batch at a time. B10 met the same defect under a second name
(flow:attribution-policy), which prompted a sweep of every package
reference in canonical markdown against every declared package name. The
git-* rename left four names dead, not one:
| dead reference | real name | files | refs |
|---|---|---|---|
flow:atomic-commits |
git-atomic-commits |
16 | 20 |
flow:attribution-policy |
git-attribution-policy |
6 | 8 |
flow:conventional-commits |
git-conventional-commits |
2 | 3 |
flow:autonomy |
git-autonomy |
1 | 2 |
17921 distinct canonical files, 33 references, and 6 of them are literal
vibe install / vibe uninstall command lines — in three different
packages' own READMEs, each telling a reader to install a name that does not
resolve. Every one of the four is declared correctly under its git- name, so
the rename landed everywhere except the prose that cites it.
180The sweep is the point, not the count. Three batches would each have rediscovered their own slice; one query against the declared-name list found the whole class in a minute, and it is repeatable at any time. A reference that names a package is checkable mechanically, and nothing checks it — that gap is worth a gate long after this DRIFT closes.
- 1812026-07-27 · F-098 — a promise whose «next release» has shipped.
wal/v0.2.0/README.mdsays the Discipline «ships a convention document that defers to this package from its next release». That release iscore-ai-native/v0.8.0; it contains zero occurrences offlow:wal, and itsspec/06-WAL-CONVENTION.mddefers to nothing. B9 marked it@spec/doneas a claim about the future rather than a confident wrong@impl/done— the falsity is a Phase Cdriftverdict, not a markup fix.
182The class is new and worth naming: a forward-dated claim that its own
deadline has passed. Unlike F-093 and F-097 it does not fail when followed;
it simply stopped being true on a date nobody watched. Nothing in the campaign
detects that — a marker records stage, and @spec/done is the correct
marker for a claim about the future whether or not the future arrived.
- 1832026-07-27 · Two errors in MARKUP-B9.md, both the reviewer's, both found by the executor. Recorded because the brief-error streak is a measurement the campaign keeps, and it had read «the last three did not».
184(a) A reconciliation paragraph for a disagreement no reader could see.
##B9-PLAN-SAID-578 explained why the plan said 578 and the measurement 577
— but the same commit that wrote the brief also corrected the plan, so by the
time anyone read either, both said 577. Harmless and wrong: it describes the
tree as it was in the author's head, not as it shipped. Editing two files in
one commit and then explaining the difference between them is a shape to
watch for.
185(b) The brief contradicted itself between two sections.
##B9-EXPECT-CORPUS-TOTAL said «confirm the starting number with a gate run»;
{#boundaries} said «do not run any vibe command». The executor honoured
the boundary and confirmed the number two other ways. A brief is a document
like any other and nothing checks it against itself — the mechanical
reviewer checks the batch, not the instructions.
- 1862026-07-27 · F-099 — a README miscounts its own contents.
tool-design-lessons/v0.1.0/README.md:22says the package «ships four pieces of content plus a boot snippet» and then lists three. Three exist on disk. Both sibling READMEs in the same batch say «three» and both are right. A self-describing count is the cheapest fact in a document to check and the easiest to leave behind when a piece is dropped.
- 1872026-07-27 · F-100 — a grammar example cites a real package at a version it
never had.
qualified-naming/…/ref-grammar.xml§forms illustrates the versioned form withorg.vibevm.world/wal@0.6.0. That package is real and it is at v0.2.0. The neighbouring §examples section deliberately uses invented groups to stay product-neutral; this row reaches for a real coordinate and gets it wrong. Low severity, and the shape is worth noting: an example that borrows a real name inherits an obligation to be right about it.
- 1882026-07-27 · The paragraph-density hypothesis is dead, and the replacement is a mechanism rather than a fit. B10 proposed that the markup multiplier tracks paragraph density; B11 was dispatched to test it and falsified it on the most paragraph-heavy batch yet — measured ×2.235 where density predicted ≥2.3, with a per-file correlation of r = −0.171, no relationship and the wrong sign.
189What killed it is a controlled pair inside one package.
self-updating-tools.xml and packaging-lessons.xml share an author, a package,
a four-field genre and an identical pre-composition — 29 paragraphs, 7 items,
0 cells each — and produced ×2.45 against ×1.93. Independently counted at
review they differ by 68 sentences against 55, ratio 1.24 against the
multipliers' 1.27.
190Deconstruction produces about one unit per sentence, which is what it is
for; paragraphs were a proxy all along. 1.08 × sentences + items + cells
predicts B9, B10 and B11 within 0.8 %, and sentences are countable by regex
before a batch is dispatched. Recorded in BATCH-PLAN.md with an explicit
instruction not to lock the coefficient — this is the rule's third version, the
second was promoted from two measurements and falsified by the third, and three
points is not proof either. The mechanism is what the controlled pair
supports; the coefficient is three numbers.
- 1912026-07-27 · F-101 — a template disagrees with its own worked example.
comparative-research/…/research-template.xmlwrites capability, gap, lead and delta subsections at h3 in its skeleton and at h2 in the worked fragment beneath it, and gives every skeleton section a{#anchor}while the fragment carries one and omits the rest. Both sit inside fenced blocks, so they cost the markup nothing — and a reader who copies the worked fragment, which is what a worked fragment is for, gets a shape the template's own commentary does not describe.
- 1922026-07-27 · The sizing quantity is misnamed, and the name is the hazard.
B13 measured it: the recorded rule reads 274 where a true sentence count
of the same files is ≈320 — a structural +17 % from 34 paragraphs
ending in a colon before a fence or list and 13 terminators swallowed by a
following
**or backtick.
193The coefficient is fitted to that undercount. A future implementer who
repairs the counter toward real sentences will read ≈320 on B13, derive ≈0.95,
and — sizing with the recorded 1.08–1.15 — over-predict by an eighth. Recorded
in BATCH-PLAN.md at the top of the rule, with the instruction that
correcting the counter requires re-deriving every coefficient in the same
commit. Calling a measured quantity by the name of the thing it approximates
is an invitation to improve it into wrongness, and this is the campaign's
cleanest example of the class.
- 1942026-07-28 · F-102 — a fence matched by prefix inverts the parse, and the
units it invents cannot be marked. Both the gate and the review tool closed
a fenced block on any line opening with three backticks, so a four-backtick
block quoting three-backtick ones was closed by its own first inner opener.
After that point the parse ran inverted: the quoted commands became paragraphs
check --exhaustivedemanded a marker for, and the prose between them became code it could not see.
195The demand was unsatisfiable in both directions, which is what makes this
F-092's genre rather than an ordinary miscount: ##FENCE-AWARE means a marker
written at those lines is not read as one, so the unit stays unmarked — and
writing it would edit a skeleton consumers copy verbatim. Eleven units stood
in that state, all in manual-tests (test-template.xml 8, authoring-rules.xml
3), every one of them a shell command.
196Measured before it was fixed, not after: two files in the whole corpus carry the construct, both in B14, and no already-marked file is affected — so nothing landed carries a marker on code. The gate went 870 → 859 and the log diff outside those two files is empty.
197It is the fifth instance of one defect — a delimiter matched by prefix
instead of by run (F-084 was the fourth, and it rewrote blank_inline_code
while leaving the fence scanner ten lines above it alone). Fixed by
c813b849, which also gives the two rules one home each
(parse::delimiters, batch_review::fences), because living apart is why
they drifted. Both sides carry three controls.
198Why neither instrument caught it: they had the identical defect, so they agreed. Two of the tool's four earlier bugs were found precisely because it and the gate disagreed; this one is the case that argument does not cover, and the only thing that surfaced it was a third implementation — a reviewer-side sentence counter written to CommonMark's rule — reading 130 paragraphs where the gate read 141.
199Third site, found by looking rather than by failing: vibe-spec's
fence_mask (1e1badda). It drives DocTree and the directive scanner —
a different consumer of the same Markdown — and carried the run-length defect
plus one of its own: it closed on any line merely starting with the
delimiter, so ```rust inside a block ended it. That half was live on a
marked corpus file: core-ai-native/v0.8.0/spec/01-PATTERN-CARD-FORMAT.md
opens a block at line 67 and writes ```card-ops at 84, so lines 85–93 were
scanned as document prose. progress-core's closer always required the whole
line to be delimiter characters, so the two parsers had disagreed about that
file for as long as it existed and nothing compares them. The run-length half
was live here too and invisible only because the quoted headings in both
template files happen to land inside masked regions — luck, not design.
200A lesson about probes, paid for in this finding. The first test written to
demonstrate the vibe-spec bug asserted children(real).is_empty() and
passed against the broken code: a quoted # heading is level 1, so it
attaches to the ROOT, not to the section above it. The bug only appeared once
the assertion counted the whole tree, and only after a negative control proved
the test could fail at all. A probe that passes is evidence about the probe
until a control says otherwise.
- 2012026-07-28 · F-103 — a boot snippet whose every in-package link is broken,
and a README that contradicts its own manifest.
sync-from-codekeeps its snippet atboot/20-flow-sync-from-code.md, notvibevm/vibespecs/boot/. All three of its relative links point at../flows/sync-from-code/*.md, which fromboot/resolves to<pkg>/flows/…— a directory that does not exist; the files are at<pkg>/spec/flows/…. Verified by resolving each. They work only after the snippet has been installed into a consuming project. The two sibling snippets live atvibevm/vibespecs/boot/and resolve correctly in place. And the README says the package shipsspec/boot/20-flow-sync-from-code.mdwhilevibe.tomldeclaressource = "boot/20-flow-sync-from-code.md"— the two sibling READMEs match their manifests exactly. F-097's genre: an instruction that fails when followed. Four more packages share the bare-boot/trait and are B15's.
202WIDENED 2026-07-28, while sizing B15: it is universal, not incidental.
Every relative link in every bare-boot/ snippet is broken — 8 of 8
across five packages (sync-from-code 3, git-atomic-commits 2,
git-autonomy 1, git-conventional-commits 1, dev-runtime-docs 1),
resolved one by one rather than sampled. Not one of these packages can be
read correctly from its own tree; all of them read correctly once installed.
The vibevm/vibespecs/boot/ packages have no broken links at all, so the trait and
the defect coincide exactly. This is a wave-level fact correction under
sync-from-code, alongside F-097 — one DRIFT, five packages, eight links.
- 2032026-07-28 · F-104 — a protocol that misplaces its own skeleton.
LICENSING-PROTOCOL.xmlsays «A skeleton of this text ships with thedraft-eulaskill». It ships inspec/flows/licensing/eula-template.md; the skill only points at it, and says so in its own step 2.
- 2042026-07-28 · F-105 — a shipped flow package cites this repository's unbuilt
command and its private milestone numbering.
when-to-apply.xml's boundary list says «vibe build(M1.5+) handles the other direction — generating code from spec». There is no top-levelvibe buildat all: the onlyBuildin the CLI isvibe bin build, which builds package-declared tools, and PROP-018 §SEAM-DECOUPLING names the spec-to-code command as «a future deterministic command». A consuming project has neither the command nor the milestone scheme. Marked@spec/doneby adjudication (ruling 10, a claim about the future) after the batch left it@unknown— correctly, since the ambiguity was real and the answer needed the host's CLI.
- 2052026-07-28 · F-106 — one package, two vocabularies for weak copyleft.
dependency-licenses.xml's table reads «MPL-2.0, EPL»;LICENSING-PROTOCOL.xml§deps and the boot snippet both name only MPL-2.0 for that class.EPLoccurs exactly once in the package. (The count needed care: a case-sensitive grep forEPLalso matches the anchor##AT-RELICENSE-TIME-THE-PLACEHOLDER-IS-REPLACED-WHOLESALE, becauseREPLACEDcontains it. The corpus's own markup is now a source of substring false positives — a new instance of the WAL's standing warning.)
- 2062026-07-28 · F-107 — three sibling packages of one generation, three licence
conventions.
sync-from-codeshipsLICENSE(no extension) and cites it unlinked with a sentence about the registry;licensingshipsLICENSE.mdand cites it unlinked;manual-testsshipsLICENSE.mdand links it. F-070 excludesLICENSE.mdfrom the corpus by name, so the odd one out is also excluded only because it is not markdown.
- 2072026-07-28 · Reported and NOT a finding: the dotted anchor. B14 reported
that
review-workflow.xmlteaches naming an anchor{#verification.timeout}, which##FACT-ID-GRAMMAR([A-Za-z][A-Za-z0-9_-]*) rejects. It does not survive checking. The grammar governs fact ids; heading{#anchor}s share the address space without inheriting the character class. Every occurrence corpus-wide is an illustration in a fictional project — two inside fenced blocks inADDRESSABLE-SPECS-PROTOCOL.xml, one inside a fenced example inrecord-template.xml, the rest in inline code. Nothing mints a dotted anchor. Recorded because a checked-and-dismissed report is worth as much as a confirmed one, and the next batch should not re-file it.
- 2082026-07-28 · F-108 — an umbrella whose prose contradicts its own manifest,
three lines apart.
git-practices/vibe.tomldeclares four members —git-conventional-commits,git-atomic-commits,git-autonomy,git-attribution-policy— and the comment immediately above that block says the family «grows to include human-authored attribution (§12.1) and commit autonomy (§12.4) as those members land». They landed; the same file pins them. The manifest'sdescriptionfield repeats the stale promise, and the README lists two members where the closure pulls four, so a consumer reading the README under-counts the family by half. Found while sizing B15; both packages exist on disk and are verified present.
- 2092026-07-28 · F-109 — a shipped manifest cites a path only this repository
has.
git-practices/vibe.tomlline 23 points a reader atneworder2/memory/BACKLOG.md. The file is real here (9 tracked files underneworder2/) and reaches no consumer offlow:git-practices. Same genre as F-105: a package that can only be read correctly from inside the repository that produced it.
- 2102026-07-28 · F-097 gains two sites and, more usefully, a warning about how
its site list gets built. B15 found two dead-name references outside the
criterion the brief used (
flow:-prefixed or backtick-delimited): a bold one atgit-atomic-commits/…/boot/30-flow-atomic-commits.md:23— in a seventh file the brief's table did not list, and an installed boot snippet at that — and an undelimited one atgit-atomic-commits/README.md:60(«atomic-commits is how that commit is shaped.»). So B15 carries 16 package references by meaning where the brief counted 14 and the review tool's C12 sees 10, each number correct under its own criterion. The actionable part: if the queued wave-level DRIFT builds its site list from a delimiter-anchored grep it will silently skip both. That is the third time this campaign has been bitten by a grep criterion, aftergrep -v '\.vibe'and the naive heading count. The brief's own count was the error — recorded as such rather than as an under-scoped grep, because a number presented as "the dead names in this batch" was short by two.
- 2112026-07-28 · F-110 — the README/manifest boot-path disagreement is the whole
bare-
boot/family, not one package. All four B15 packages that keep their snippet atboot/name it asspec/boot/NN-…in their READMEs while their manifests declaresource = "boot/NN-…"—git-atomic-commits,git-autonomy,git-conventional-commits,dev-runtime-docs, verified one by one, andsync-from-code(F-103) makes five of five. F-103's text is scoped to links inside snippets; these are paths inside READMEs, the same root cause reaching a second surface. One DRIFT covers both.
- 2122026-07-28 · F-111 — a closed vocabulary maintained by hand in two places.
git-conventional-commitsstates its eleven allowed types as an eleven-row table inconventional-commits.xmland again as an inline list inboot/31-flow-conventional-commits.md. They agree today — checked type by type, all eleven present in both, no extras. Two hand-maintained copies with no generator, one of which installs into every consuming project's boot lane; and the siblinggit-attribution-policystates «one policy, one place» as a law of its own. Low severity today, and it is the shape that is worth the finding rather than any current divergence.
- 2132026-07-28 · F-108 gains its cross-file half, which makes it checkable from
the corpus alone.
git-autonomy/README.md:28says «A member of theflow:git-practicesfamily» while the umbrella's README says the family «grows to include … commit autonomy as those members land». The member and the umbrella contradict each other directly, without reference to the manifest.
- 2142026-07-28 · Two low-severity illustration drifts, recorded and not filed
separately.
git-atomic-commitsillustrates one claim with different arithmetic in two files — «without also undoing three correct things» (ATOMIC-COMMITS-PROTOCOL.xml:65) against «two correct things» (boot/30-…:52); neither is wrong, and a reader comparing them sees a discrepancy. Andsplitting-large-changes.xmlasserts «Six items collapsed to four commits» before the sub-section that says the fourth should probably be reverted.
- 2152026-07-28 · F-112 — one line in a shipped README that is wrong in three
ways at once, found while sizing B16.
go-ai-native-mcp/v0.1.0/README.md:9points a reader atspec/terraforms/GO-AI-NATIVE-PLAN-v0.1.md.
- 216The path is stale.
vibevm/vibespecs/terraforms/holds two files and that is not one of them. - The file it means is in the archive. It lives at
legacy-spec/terraforms/GO-AI-NATIVE-PLAN-v0.1.md, and the WAL's standing constraint is that nothing in the living corpus may cite intolegacy-spec/as a normative source — archive-provenance pointers only. So the corrected path would still be a violation. - It is a host path in a consumer's package (F-105, F-109's genre): a
project installing
mcp:go-ai-native-mcphas neither directory.
217This is the sharpest instance of "an instruction that fails when followed" the campaign has produced, because it fails for the author too — every other member of that class at least worked from inside this repository.
218Two smaller facts from the same file, recorded so the batch does not re-file
them: it is a stub («This README is finalized at campaign close»), which is
why it carries 2 units where its two MCP siblings carry 5; and its H1 is the
only one of the three that reads # <name> (mcp:…) rather than # mcp:….
The three stack aggregators are uniform by contrast — all three read
# AI-Native <Lang> (stack:…).
- 2192026-07-28 · F-113 —
redbook's roster is wrong in three documents and no two of them agree. Counted: the manifest pins 22 members, the README's «Members (edition 0.2.0)» table has 21 rows, and the boot snippet lists 23. The README omitsgit-practicesentirely — which the manifest pins twice and whose own comment reads «attribution-policy now arrives via git-practices» — and omits the whole cultural-extraction wave (dev-runtime-docs,wal-specspaces) that the manifest pins and the snippet lists. Two of the names it does list are dead (F-097). So a consumer reading the front door gets 21 names, two uninstallable and three missing.
- 2202026-07-28 · F-114 — the edition contract is falsified by the manifest that
implements it, three lines from the pins.
redbook/README.md§editions states «An edition is a tested set … two projects on the same edition run byte-identical practice text» and «a new edition is a new umbrella version with refreshed pins». The manifest's own comment, immediately above the cultural-extraction members, reads: «edition bump to a clean 0.3.0 lands when the full new practice set has settled; accumulated here in place meanwhile».
221So the umbrella accumulates members inside 0.2.0 without an edition bump, and
says so. Two projects that installed redbook 0.2.0 on either side of that
wave do not run byte-identical practice text — which is precisely the promise.
This is the campaign's cleanest instance of a normative claim contradicted by
its own implementation, and it was found only because B16's brief was the
first to ask an executor to read the manifest before marking an aggregator
(now ruling 61).
- 2222026-07-28 · F-115 — the TypeScript stack's front door dead-ends.
typescript-ai-native/v0.6.0/README.mdsends the consumer to «the-langpackage's README»;typescript-ai-native-lang/v0.6.0/has noREADME.md. The rust and go-langpackages both have one, so TypeScript is the only stack of three whose aggregator points at a file that does not exist.
- 2232026-07-28 · F-116 — twelve divergences across three near-identical
siblings, three of them normative. The
discipline-mcp-{rust,go,typescript}.mdbriefs are the same document per language. (1) The capture guarantee («Reports are whole») is a standalone paragraph in rust, folded into a sentence in ts, and stated twice in go. (2) The claim that the enumeration test pins the parity-map list — checkable and normative — exists in rust and go and is absent from ts, whose heading is followed straight by the table. (3) ts citesTCG-PROTOCOL-v0.1unqualified where the siblings sayTCG-PROTOCOL-RUST-v0.1/-GO-v0.1, which in a repository shippingflow:qualified-namingis now ambiguous. Nine further divergences are phrasing or scope: aforce-class rule only rust states, an oracle-fidelity caveat every brief carries except the one whose oracle is not the reference implementation, and a go sentence citing a «named delta over the Rust one» that the rust brief does not record.
224The method is the finding. These three files took about a third of B16 and produced two thirds of its harvest, because marking them consistently forces a reader to notice every place they are not. Near-identical siblings belong in one batch on purpose.
- 2252026-07-28 · The brief's own error, and it was mine. B16's
{#anchors}headline said «nine heading anchors owed»; its own itemisation summed to eight, and eight is what a fence-aware scan of the pre-state finds. Fifteen of twenty-four briefs have now carried a factual error found by the batch running them, and B16's executor named the pattern behind the last three: they were counting-unit slips, not arithmetic — names against sites, headline against itemisation, units against terminators. State the unit with every count.
- 2262026-07-28 · F-097 CLOSED by DRIFT-038 (
7b0ec6aa), and its own count was right about the wrong denominator. 50 edits over 29 files; zero live dead package references remain. The recorded 21 files / 33 references was exact forflow:-prefixed sites insidepackages/— and 12 more live sites sat in backticks, in bold and undelimited, with 5 further in the host'sPROP-003, which no sweep had scanned. Following B15's own warning about delimiter-anchored greps is what turned 33 into 50.
227Nine occurrences were left deliberately, and the reason is the finding's
sharpest edge: a path is not a name. The flow directory
(spec/flows/atomic-commits/), the document
(conventional-commits.xml) and a spec:// URI's flow and document segments
all keep the short name and are correct — one URI spells the dead string twice
while being entirely right. A blanket replace would have corrupted paths three
ways. The other four are in redbook/v0.1.0, a superseded slot that is frozen
history and is not edited.
- 2282026-07-28 · F-103 and F-110 CLOSED by DRIFT-039 (
521bb6cd) — and the fix was the layout, not the links. The eight broken links were already correct for the installed form: from a consumer'svibevm/vibespecs/boot/,../flows/…resolves. Rewriting them would have fixed five packages and broken every consumer. What was wrong was that the in-package layout did not mirror the installed one, so the snippets movedboot/→vibevm/vibespecs/boot/and their five manifests followed.
229F-110 dissolved without an edit. All five READMEs already named the
snippet spec/boot/NN-…, disagreeing with their own manifests — they were
right and the layout had never caught up to them. A finding recorded as "the
README contradicts the manifest" was actually "the manifest contradicts the
README", and only doing the fix revealed which.
230Checked and found false before it was written: the layout is not collateral
from the `git- rename. 520e7478 carried it forward; all three renamed
members had it before.* What the rename did expose is that
git-attribution-policy, renamed by the same commit, already used
vibevm/vibespecs/boot/` — the family was split against itself.
- 2312026-07-28 · PHASE C OPENED — C0: the harvest exists, and the phase is
smaller than its own kick-off said. Batch plan ratified with three decisions
(
PHASE-C-BATCH-PLAN.md,0acc448f); fifteen units of work — C0, then C1…C7 over ai-native, then W1…W7 over world.
232The size correction first, because it is the same slip B16 named. The
kick-off's «~11 900 markers carry no verdict» is 12 797 − 921, and 921 is the
length of baseline.json's units dict while 12 797 counts markers. Measured
in the unit a verdict is written in — a fact that is marked and anchored,
which is what progress_core::seal::addressable admits — the corpus holds
11 288 addressable anchors, the host already carried 4 440 of its 4 441,
and the phase owes 6 848. That is 1.54× wave 1's 4 455, not the 2.6× the
kick-off advertised.
233C0's harvest is thirty-one captured runs (874070ff), and the result is
one-sided. Every slot's floor exits 1. The portable steps pass wherever their
toolchain is present — cargo fmt/test/clippy green in both Rust slots and
in core-ai-native's hand-run floor — and every discipline-specific step
fails or is skipped in all six slots, because no package under
vibevm/vibepacks/org.vibevm.ai-native/ carries a conform.toml or a
discipline/registry/. Three defects are not that absence in disguise: the Go
floor reports gofmt: unformatted and five conform findings against
tools/go-extract/test/fixtures/dirty/, a fixture tree whose whole purpose is
to be dirty; the Go engine's own error names the Rust binary («run
rust-ai-native-specmap … first»); and the TypeScript stack cannot parse at all
— the structural gate parses through the project's own typescript install and
the package ships no package.json, so node walks out of the package and
reaches the user's home directory looking for one. core-ai-native was captured
differently on purpose: it ships library crates only, so no floor
subcommand exists for it and the three portable steps were run by hand.
234The mechanism was proved on ground where the answer was already known. The
five stale host files were re-derived, four verdicts written by load-and-merge
(one minted, three evidence-extended), and the tool sealed them — 5 sealed, 0
refused. The control: the 53 campaign maps the batch did not touch came through
byte-identical, and a subsequent full check and scan left the verdict
count at 4 499. Host is now 4 441 / 4 441 with zero stale files.
235The re-derivation surface was four facts, not the thirty-nine a first pass
reported — and the first pass was the instrument lying. Grouping anchors by
blank-line block makes a bulleted list one unit, so a two-line rename inside one
bullet marked all thirteen bullets changed. Re-cut at the right grain — from
##ID to the next ##ID — PROP-003's change is exactly SHORTFALL-MONOLITH
and OPEN-WORKSPACE-MONOREPO, both the same package rename inside a @spec
claim the rename does not touch. A rule approximated instead of read, for the
fifth time in this campaign, and this time in a tool I wrote to check the tools.
- 2362026-07-28 · F-117 — the phase's own kick-off documents a cache field that was
deleted.
PHASE-C-KICKOFF.mdstates the per-file campaign map as{verify_batch, verified_at, processed_hash, verdicts{anchor → {v, ev[]}}, summary}, and the paste-ready prompt inside it repeats the shape.summarydoes not exist: DRIFT-033 removed it on the owner's F-077 ruling,FileRecordhas no such field, the tally is computed on read byFileRecord::verdict_summary, and all 58 campaign maps on disk carry exactly four keys. A session that followed the kick-off literally would write a stored tally back into the corpus — reinstating precisely the defect the ruling removed, in the file the ruling is recorded in. The kick-off was written six days after DRIFT-033 landed.
- 2372026-07-28 · F-118 — wave 2 ran sixteen batches with no journal.
§4 binds this campaign to wave 1's crash-safety protocol — «step = unit of
atomicity, journal
step-startbefore andstep-doneafter,RESUME.mdregenerated, maximum loss on any crash is one step».campaigns/packages-2026-09/run/contained nojournal.jsonland noRESUME.mdat the Phase C opening, so none of that ran for the whole of Phase B: there was no step to recover to, andvibe progress resume— «the first read of every campaign session» — had nothing to generate from. The visible symptom was ignored for a month:campaign.jsonreported phase «A» from the zone's creation through B's close, because the phase is derived from the journal's lastphaseevent and there was none, so the compiled-in opening phase stood. No command writes a phase event — wave 1 hand-appended all five — which is why nothing failed loudly. The journal was opened at C rather than back-filled; B's steps are not reconstructed, because a record is not invented after the fact.
- 2382026-07-28 · F-119 — the book cites a chapter that was never written, in the
live slot as well as the frozen one.
redbook's chapter 1 links tosafeharbor.mdfromspec/book/ru/chapter-1-two-process-model.md; the file exists nowhere in the repository, and the citation stands in bothv0.1.0andv0.2.0. The v0.1.0 copy is frozen history and is not edited (§3.3); the v0.2.0 copy ships to consumers. It is the only broken citation in the wholeworldtree — 187 relative citations resolved, 2 broken, and both are this one.
239It was invisible to Phase B and to the exit gate for the same reason: the
campaign's exclude globs drop redbook/*/spec/book/ru/, so the observed corpus
is 121 of the tree's 154 files. Inside the corpus the join is clean — 185
citations, 0 broken — which is the §3.1 source-1 result the world cluster
rests on, and it is clean because the one defect sits in a file nothing
measures. A scope that excludes a shipped directory does not stop shipping it.
- 2402026-07-28 · C1a — the transport holds completely and the engine spec is half false. Two of C1's five mechanism files judged, 77 verdicts.
241MCP-CORE-v0.1: 34 / 34 confirmed, zero drift. Every claim is in the code and
most are under test — PROTOCOL_VERSION = "2024-11-05", -32700 on a malformed
line with a test asserting the loop survived it, -32602 / -32601 in
tools/call, a BTreeMap making tools/list's sorted order structural rather
than sorted-at-call-time, dup2 and SetStdHandle into a file (not a pipe,
which would deadlock a chatty floor), restoration on Drop under
catch_unwind, and a nesting refusal whose message is asserted to cite this very
unit. Two claims were checkable only outside the package and both held:
diff -rq reports the vendored copies in rust-ai-native-mcp and
typescript-ai-native-mcp byte-identical, and PROP-027 §2.6 «Serving is
vibe-free» exists in the host exactly as cited. The prohibition «tools MUST NOT
prompt» turned out to be structural rather than documentary: fn run(&mut self,
args: &Value) -> ToolOutput gives a tool no input channel, so prompting is
unrepresentable at the seam rather than forbidden beside it.
242ENGINE-CONFORM-v0.1: 21 confirmed / 22 drift — 48.8 %. The engine that
exists is a good one, and it is not the engine this document describes. There
is no Tier type, no tier field and no escalation anywhere, so the whole of
§1 — three tier rows, the rule-record declaration, the cheapest-adequate-frontend
claim — describes a mechanism that was never built; store.rs takes a
caller-supplied &dyn Frontend and nothing selects. Of five frontends tabled,
C++ and Python do not exist at all and tree-sitter, SWC, rust-analyzer,
rustc_driver and gopls appear nowhere in the tree. Two of three example rules
(R-021, R-020) do not exist; R-002 does, and is mapped onto tiers that do not.
Foreign-linter ingestion runs the wrong way: conform emits SARIF and reads
none. The quoted trait signature is wrong in both parameters —
fn check(&self, facts: &[SourceFacts]) against the document's
fn check(&self, facts: &FactStore, specmap: &Index) — and the specmap
argument could not exist, because the conform crate does not depend on the
specmap crate.
243What confirms is worth naming too, because it is not nothing: the fact store's
(content-hash, frontend id+version) key is exact, the sidecar protocol is
exactly the NDJSON the spec describes (tools/go-extract/extract.go:4), SARIF
output and conform-baseline.json are both real, and findings.sort() gives the
byte-identical ordering §5 claims.
- 2442026-07-28 · F-120 — a notation used 102 times, defined by one example, cited
to a document that does not exist. The kind-line grammar (
`req r1`) is defined in exactly one place: BROWNFIELD-PROTOCOL-v0.1.xml's##UNIT-STATUSES-ARE-KIND-LINE-GRAMMAR, which gives examples — «req r2(default: ratified) ·req r1 planned·req r2 disputed(#other-anchor)» — and cites GUIDE-SPEC-AUTHORING for the amendment. No such document exists in the repository;01-PATTERN-CARD-FORMAT.xmlsays it «supersedes part of GUIDE-SPEC-AUTHORING-v0.1», so the only cited definition source is a document that was partly superseded and never shipped. Meanwhile the corpus uses eight ranks — r1 ×75, r2 ×10, r3–r8 ×13 — and none of r1…r8 is defined anywhere. The one definition-bearing sentence pairsr1with «planned» andr2with «ratified»; 75 of 102 uses are a barer1carrying neither word.
245Recorded as a finding rather than as five unverifiable verdicts. The
kind-line-* facts carry @impl/done, whose stage semantics ask for presence
evidence for the unit the line heads, and that evidence exists — four of the five
head cells with specmark::scope! tags citing them. Marking them unverifiable
would report as unmeasured a corpus that is in fact implemented; the undefined
rank is a defect in the notation, not an unfalsifiable claim about the world.
- 2462026-07-28 · F-121 — a document falsified by its own last line.
ENGINE-CONFORM-v0.1's closing fact reads: «Any frontend or tier specified here
that is not exercised by Playbook Phase 4 is removed from this document rather
than carried as aspiration» — and it is marked
@impl/done. The same document carries three tiers, a C++ frontend, a Python frontend, tree-sitter, SWC, rust-analyzer,rustc_driver, gopls and SARIF linter ingestion, and the engine exercises none of them. Nothing enforces the rule: no test, gate or lint checks it, so the one fact whose job was to keep the document honest is the fact with no checker.
247It is the sharper twin of F-114, and the pattern now has two instances: a normative claim contradicted not by the world but by the artifact that carries it. The document's own status line says «Design, beta» — accurately — while thirty of its facts are marked implemented. A design document is not drift; a design document whose facts claim implementation is.
- 2482026-07-28 · C1b — LEDGER-INTENT, and F-121 turns out to be a family.
40 verdicts: 26 confirmed / 12 drift / 2 unverifiable. The ledger that
exists is the honest core of the design — a content-addressed store, epochs
derived from the meaning-context rather than the file hash, hard no-serve on a
stale epoch, a provenance line in every render, immutable content-keyed entries
that make last-write-wins benign. Its exclusion from git is real and enforced in
the only place it can be: the host's
.gitignorecarries/.ledger/under this mechanism's own name.
249What is missing is everything above the floor. There is no LLM producer at
all, so the interpretations key is producer + epoch + subject where the
document lists six components including prompt_rev and a model id; there is no
entry struct, only a text blob, against eight promised provenance fields; no GC,
no pin set, no size budget; no export, freeze, sign or ship path for a release
slice; and two of the four query kinds — classify.legacy_unit and
propose.links — do not exist. Telemetry counts hits, misses and rot, and
neither of the two cost measures the headline metric needs.
250Two facts were recorded unverifiable rather than either verdict, which is
the distinction this phase exists to keep. «Every LLM output belongs to the
interpretations class, without exception» governs outputs that do not exist —
the rule has no instances, so it is neither working nor broken. «A new query kind
is added only when two consumers ask» is a governance rule that no registry, gate
or record encodes; with one kind in the tree it is unviolated and unexercised.
Calling either confirmed would report an untested policy as a working one.
251And the closing fact is ENGINE-CONFORM's closing fact again: «anything not
exercised by Playbook Phase 5 is deleted, not aspirational», @impl/done,
contradicted above it by GC, release slices, signing, two query kinds,
prompt_rev, a model id and cost telemetry. F-121 is a family, not an
instance — two mechanism documents, each ending with a self-cleaning rule that
neither obeys and nothing checks.
- 2522026-07-28 · C1c — BROWNFIELD, where the protocol is mostly built and the
brief was too narrow. 63 verdicts: 51 confirmed / 9 drift / 3
unverifiable. The registries this protocol specifies are real, and the
delegated search could not see them because my brief confined it to
core-ai-native's crates — the machinery lives in the language stack's CLI.rust-ai-native-cli/src/lib.rs:26,28,30definesdiscipline/registry/tests-baseline.json,debt.jsonandintent.jsonexactly as named here, andinit.rs/test_gate.rs/tripwire.rs/ledger.rsare the commands that write and read them. The worker marked those rowspartialand listed what it had searched, which is what made the gap visible in one pass rather than becoming thirty wrong verdicts. Anot-foundis a fact about the search perimeter until the perimeter is checked.
253Three of the four amendments this document claims to make landed and were
verified in place: the Charter carries ##AXIOM-A6-REALITY-BEFORE-ASPIRATION
in the words given here, PROP-014 §edges carries the lifecycle status and the
conflicts_with edge marked «(Brownfield amendment:)», and the Playbook reads
«Discipline v0.2 · status: BETA». The fourth amends GUIDE-SPEC-AUTHORING,
which is not in the repository — the same missing document F-120 is about,
now with a second dependant.
254The drift is where the protocol needs artifacts nothing produces:
characterization goldens (no capture path anywhere, so B4's «truth of record»
and the redefinition of phase gates as «snapshots unchanged» both rest on
nothing), the REPORT exit numbers, the anti-entrenchment close-quota, and the
disputed status's heuristic detection — the status exists in PROP-014's enum
and nothing can assign it. Three facts are unverifiable rather than drift:
the three adjudication outcomes govern a human decision that has never been made
here, the characterization definition has no tests to be a definition of, and
Phase 6's closing rule has never been applied. Each is sound and unexercised,
and calling any of them confirmed would report an untested policy as a working
one.
255And the closing fact is the third instance of F-121 — «any field, status or
policy not exercised by Playbook v0.2 Phase 2 is removed», @impl/done,
contradicted above it by five things that do not exist.
- 2562026-07-28 · C1 stands at 4 of 5 files, and PROP-014 stops at the boundary
rather than at the bottom of a session. 180 verdicts merged and sealed —
132 confirmed / 43 drift / 5 unverifiable, 73.3 %. PROP-014's evidence is
gathered, machine-verified and not judged: 173 rows, 118 of them
@impl/done, 60 markedpartial— the class that needs a reader, since apartialis precisely «related code that does not settle the claim». Judging ninety-five of those at the end of a long session is how a bad verdict gets written, and this phase rejects a verdict without evidence for exactly that reason.
257Four host-side checks were run and are recorded for whoever picks it up, because
they decide the load-bearing rows: vibe check carries neither the
edge-multiplicity lint nor the 120-line unit warning the document says it warns
with; no specmap_query / specmap_explain / specmap_source MCP tools
exist; and [metamodel] profile appears nowhere in the crates. The two
companion PROPs it cites — 009 and 013 — do exist in the host.
258A correction to this entry, made the same day it was written. It first said
«there is no host PROP-014 — the package copy is the only one in the repository,
so this proposal was never adopted into the spec tree it proposes against». Both
halves are false. There are some thirty copies (vibedeps/, .vibe/cache/,
research/*, the superseded v0.7.0 slot) — regenerated dependency copies, but
copies. And the host does adopt it, by citation in the qualified form
addressable-specs prescribes: PROP-031 cites
spec://org.vibevm.ai-native/core-ai-native/mechanisms/PROP-014#… five times
— as a companion, as «the read-side model this PROP makes writable», and as what
its own ##BOUNDARY-COMPLETION completes — and PROP-024 links it too. The
document's ##HOME-SHIPS-WITH-THE-DISCIPLINE states the placement is deliberate:
the mechanism ships with the Discipline, its Rust implementation with
rust-ai-native-lang.
259The check searched for a FILE under spec/ and read its absence as absence of
adoption. That is the same shape as F-119 — a clean result produced by looking
in the wrong place — and as the perimeter lesson one entry above, made this time
by the reviewer rather than by a worker. What survives is narrower and minor: no
file under the host spec/, and 014 is an unexplained hole in the host's own
PROP sequence (so is 004; the tree runs 000–013, then 015). A naming
question, not an adoption one, and it bears on no C1 verdict.
260The five evidence tables now live in the repository, at
tasks/evidence/ev-*.json, and re-verify from there: 748 refs, zero
unresolvable, one OFF-BY and one ELIDED. They were written into a session
scratchpad, which is ephemeral — five workers' output would have been lost at
the session boundary, and the campaign's own erasure law says the derived
artifacts may be deleted only because the sources carry the knowledge. An
evidence table is not derived from the sources; it is a reading of them.
- 2612026-07-28 · C1 CLOSED — 353 verdicts, and the perimeter was wrong three times. 272 confirmed / 70 drift / 11 unverifiable — 77.1 %.
| file | conf | drift | unver | |
|---|---|---|---|---|
| MCP-CORE-v0.1 | 34 | 0 | 0 | 100.0 % |
| BROWNFIELD-PROTOCOL-v0.1 | 51 | 9 | 3 | 81.0 % |
| PROP-014-specmap | 140 | 27 | 6 | 80.9 % |
| LEDGER-INTENT-v0.1 | 26 | 12 | 2 | 65.0 % |
| ENGINE-CONFORM-v0.1 | 21 | 22 | 0 | 48.8 % |
263PROP-014 read at 80.9 %, and it would have read far lower on the evidence as
gathered. Nine of its rows turned on facts outside the package: the pilot
target crates/vibe-resolver/src/conditional.rs exists; the host carries
120 files with #[spec(implements=…)] and 402 with specmark::scope!;
specmap.json is committed (3.1 MB — 5 266 spec units, 898 code items, 912
edges); schemas/specmap.jtd.json exists; xtask/src/specmap.rs and the
Trace subcommand exist; and vibe trace exists, a delegating alias
whose own help text cites «PROP-014 §2.6» — so the Phase-4 promotion this
document plans has happened. Every one of those had been located as absent
because I confined the search to core-ai-native's crates, and PROP-014 is a
mechanism whose implementation ships in rust-ai-native-lang and whose
deployment is the host.
264That is three perimeter errors in one batch — BROWNFIELD's registries,
PROP-014's deployment, and my own «never adopted» claim corrected above. The
lesson has a sharper form than the one recorded in C1c: the delegated
not-found was accurate every time; the brief that produced it was not. A
worker cannot report a perimeter it was not given.
265Where the index does fall short, it is exact and the index says so itself.
Read from the committed file: its keys are code_items, edges, schema,
spec_units, suspects, warnings — so of the six contents §2.5 promises,
coverage-per-REQ and the orphans table are absent; code_item carries no
content hash where spec_unit does, which is exactly why «a code change keeps
edges valid» is true and structural; and nothing constructs Proposed or
Generated, so the whole LLM-proposer half of §2.7 is an enum variant with no
producer. The runtime channel — MCP tools, [metamodel] profile, signing — does
not exist at all, and the document's own open question calls signing blocking
while marking the security invariant that depends on it @impl/done.
266The rule that settled the awkward middle, stated once and applied to every
file: a fact naming a specific artifact, flag, type, file or command that does
not exist is drift; a fact stating a discipline the corpus demonstrably follows
is confirmed, even where no checker enforces it. It is why «every normative
statement is addressable» confirms — this campaign's own gate exits 0 over 11 288
anchors — while «vibe check warns beyond ~120 lines» does not: vibe check has
eleven checks and no such warning.
267F-121 closed at four instances. ENGINE-CONFORM, LEDGER-INTENT, BROWNFIELD and
PROP-014 each end with a rule that unexercised mechanisms are removed from the
document rather than carried as aspiration; each marks it @impl/done; each is
contradicted by its own contents; and none is enforced by anything. Four
documents, one habit: the rule that exists to keep a document honest is the rule
nobody gave a checker.
- 2682026-07-28 · The
worldcluster's sources 2 and 3 become one command, and the host turns out to be one install behind. §3.1's third source is unreadable as written —files_writtenis[]for all 36 packages — so the substitute ratified at the phase opening is the boot lane, which is compiled from the installed packages and carries a provenance marker per contribution. That marker is the join: package → installed copy → what the host actually reads.
26917 of 31 contributions carry the package's exact word stream. Six differ, and
the differences are small and specific: campaign-plans by six words («cold
facts verified at writing time», in the package and not in the host),
comparative-research by three («sibling document pointers»). Eight have no
source at the path the installed copy names — they were installed from boot/
and DRIFT-039 moved the packages to vibevm/vibespecs/boot/, so the installed lane predates
the layout fix. The whole lane was last written 2026-07-14; the packages were
marked through 2026-07-27, and 0 of 32 installed snippets carry Phase B's
markup while every package copy does.
270None of that is semantic drift and all of it is source-3 evidence: the host runs what the packages ship, one install behind, and the compiler strips the campaign's markup on the way in — so the boot lane is a rendering of a snippet, never a copy of it.
271The join also reproduces F-078 mechanically, which was filed from reading:
git-atomic-commits, git-attribution-policy, git-autonomy and
git-conventional-commits each appear twice in STATIC.md, once directly and
once through the git-practices umbrella that compiles its own members. Four
flows, four duplications, exactly as the finding says.
272Three wrong comparisons were made before the right one, and each was reported as a fact about the tree. A byte compare called all 31 contributions drifted — that was the compiler stripping markup. A path derivation that took three components instead of four called all 31 unsourced. And the report diffed raw text while the decision was taken on stripped text, so it claimed 247 differing words where the verdict rested on 6. The instrument was wrong three times in one afternoon and said so loudly each time; that is the only reason none of it reached a verdict.
- 2732026-07-28 · C2a — the ATLAS resolves, and the three things it says about itself do not. 145 verdicts over ATLAS, CONTRADICTION-MAP and the README: 135 confirmed / 9 drift / 1 unverifiable — 93.1 %, the highest rate of the phase and for a structural reason: these files are almost entirely existence and reachability claims, and a resolved address is its own evidence.
274The ATLAS's arithmetic is exact and verifies twice over. 87 distinct record
ids and 87 ##FINDING-* anchors against its claimed «unique (non-duplicate):
87»; the axis distribution sums to 87, the evidence-class distribution sums to
- 275That is a generated appendix keeping its own books.
276Its header is F-088, now confirmed against the tree. «GENERATED from
findings.jsonl (A2: derived, do not hand-edit)» — and no findings.jsonl
exists anywhere in the repository. The only findings.json files are the two
campaigns' F-NNN ledgers, a different artifact on a different schema. A generated
file whose input is absent cannot be regenerated, and the instruction not to
hand-edit it leaves no way to change it at all.
277One bucket of the fourth distribution is manufactured. new=31 is 15
records literally marked new plus 16 whose status field is EMPTY — all BLD-*
in axis H. The sum still reaches 87, which is exactly why nobody noticed: a
reader counting genuinely-new findings is over by sixteen, and the total agrees.
278A reachability measurement worth carrying forward: of the 87 records, 24
are cited by a card, guide or tool spec in the three -lang stacks and 63 are
cited nowhere outside the ATLAS itself. That is not a verdict — an index is
allowed to hold more than the corpus uses — but it is the number Phase F will
want when it asks what the research passes bought.
279The CONTRADICTION-MAP contradicts itself twice: its own «four parts per entry»
law is broken by C-7, which carries no side/resolution triple, and C-7's
«open» question on H6-uniformity is answered by DR1-022 in the ATLAS the map
indexes. The README misses in three ways a consumer meets first — it says the
package ships prompt content only while five Rust crates ship inside it, it
points at rust/GUIDE-… where the guide is at spec/rust/GUIDE-…, and its
mechanism roster omits MCP-CORE-v0.1.xml, which ships.
280On the instrument: 424 refs resolved, zero unresolvable, and 188 came back ELIDED — the outcome added this morning. That is my own brief's doing: it capped snippets at 120 characters and the worker obeyed by truncating. The outcome earned itself in one batch, naming a hundred and eighty-eight honest elisions without failing one of them.
- 2812026-07-28 · C2 CLOSED — 485 verdicts at 92.4 %, and the drift is all in one place. 448 confirmed / 34 drift / 3 unverifiable. Four of the eleven files are zero-drift: the RAID Playbook, the Sweep Playbook, the Campaign Form and the WAL Convention, 148 facts between them and not one wrong.
| file | conf | drift | unver | |
|---|---|---|---|---|
| 03-RAID-PLAYBOOK / 04-SWEEP-PLAYBOOK / 05-CAMPAIGN-FORM / 06-WAL-CONVENTION | 148 | 0 | 0 | 100.0 % |
| appendix/ATLAS | 91 | 2 | 0 | 97.8 % |
| boot/10-flow-core-ai-native | 15 | 1 | 0 | 93.8 % |
| 00-MANIFESTO | 91 | 8 | 1 | 91.0 % |
| README | 23 | 3 | 0 | 88.5 % |
| 02-EXECUTABLE-SCAFFOLDS | 33 | 6 | 1 | 82.5 % |
| appendix/CONTRADICTION-MAP | 21 | 4 | 1 | 80.8 % |
| 01-PATTERN-CARD-FORMAT | 26 | 10 | 0 | 72.2 % |
283The playbooks confirm wholesale because they are implemented and because this
repository has run them. floor.rs names the Sweep Playbook in its own module
doc; health.rs:2 cites …04-SWEEP-PLAYBOOK#collector by URI, and the
collector's four contract lines — determinism, advisory, no-LLM, single-sourcing —
are four separate places in that file. The WAL Convention's 24-hour freshness rule
is a shipped checker (vibe-check/src/checks/wal_freshness.rs, threshold at
lib.rs:292) and its canonical sections are enforced by wal_wellformed.rs. Both
playbooks have executed instances in this tree: a closed raid whose §6
decisions cite RAID §1.1/§1.2/§1.4/§1.5 by number, and terraform/{BASELINE,LOG,
REPORT}.md + adopt-v0.3/PREDICTIONS.md as the Campaign Form's five artifacts,
built.
284The drift is one thing, said eleven ways: the Band-3 card-ops block has no
reader. All 27 cards (3 stacks × 9) author it; a search for card-ops /
Band-3 / band_three / cards/INDEX across every .rs, .ts, .go, .py
and .js in crates, xtask, packages, spec and schemas finds no extractor at
all. So the Manifesto's lazy-push harness, the weak-reader ~10-line cap, the
trigger-to-card resolution, the machine-extractable operational layer and the
«empty operational fields are a defect» rule are each authored on one side and
unimplemented on the other. 01-PATTERN-CARD-FORMAT reads lowest in the batch for
exactly this reason.
285Three smaller ones worth their own line. No card carries a prediction field,
so «every card carries a falsifiable prediction» is false of all 27. The sunset
R-050 that is supposed to expire the in-distribution law is cited everywhere and
scheduled nowhere. And the adoption plan does live outside the package, exactly as
claimed — at terraform/, while the fact names a vibevm-terraform that does not
exist.
286One verdict was restated during review, and the reason matters more than the
verdict. Five BUILD-ORDER-* anchors came back partial and one, BUILD-ORDER-I,
came back located — so the default would have confirmed the sixth step of a
build order whose other five steps are drift, because a search happened to resolve
its card rather than its ordering. The claim class was one; the accident of the
search was about to split it two ways. Restated to drift on the siblings'
reasoning: the numbered order appears nowhere outside this document, and the one
raid this repository executed ordered its cards D/H → C → F → G → traces.
- 2872026-07-28 · C7 CLOSED — 99 verdicts, zero drift, and F-116 turns out to be
about a family rather than a fault. The three
discipline-mcp-*briefs judged entirely from machine evidence: the trio diff plus each server's own sources.
288Every count in all three briefs is exactly right. Rust claims eighteen tools
and thirteen discipline adapters; its crate carries 18 distinct tool-name
literals and eighteen less the five tcg ops is thirteen. TypeScript and Go each
claim seventeen and twelve; each crate carries 17. The gap between the
projections is precisely ledger_render, which rust ships and both siblings say
they do not — three documents agreeing about a difference, which is the opposite
of drift. The parity map's eighteen rows map one-for-one onto the registered
names, and the enumeration test the lead claims exists is real and says exactly
what the lead says: the_tool_set_is_exactly_the_declared_inventory asserts
names == TOOL_NAMES in stable order, so the list cannot drift from the code
without a red test.
289F-116's three normative items are all reproduced, and none of them is a false
statement. REPORTS-CARRY-THE-RUNS-ENTIRE-STORY and parity-map-lead are in
rust and go and absent from TypeScript; the force-class clause inside
HEAVY-TOOLS-SAY-EXPECT-MINUTES-AND-NOTHING-PROMPTS is stated by rust alone.
An omission is not a wrong fact: every anchor that exists is true where it stands,
which is why the batch reads 99/99 while the finding stands. The finding is
about the family, not about any of its members — and that distinction is only
available because the three were compared rather than read.
290No worker was spawned for this batch. The instrument built for C4 named the trio and answered C7 in a second; the remaining evidence was four greps and one test. A batch whose files are near-identical copies is cheaper to diff than to delegate.
- 2912026-07-28 · F-122 — one
name@versioncoordinate, two contents, 173 times.qualified-namingstates the law this breaks: never reuse aname@versioncoordinate for different content — a coordinate that meant one artifact must never mean another. Measured across both trees: 425 markdown files sit at the same (package, version) pair inpackages/andvibedeps/; 252 are byte-identical and 173 are not, across 33 packages.
292The cause is this campaign. Phase B marked 201 package files inside already
published version slots — core-ai-native@0.8.0's installed copy carries zero
fact anchors against fourteen in the package of the same version — so every marked
package now ships different bytes under a coordinate a consumer already resolved.
Most of the difference is markup the boot compiler strips anyway, and not all of
it is: the boot-lane join found campaign-plans differing by six real words and
comparative-research by three.
293Filed rather than fixed, per the phase's own rule. Closing it is a release event — §5-D's «a finding that spans a package boundary is closed by a published version, not by an edit» — and this one spans thirty-three. It belongs beside F-114 as an owner decision about versioning rather than an edit anybody can make.
294The first measurement of this was wrong and looked exactly like a finding. It
globbed packages/*/*/v<ver>/<tail> and matched every package sitting at the same
version number — go-ai-native@0.1.0 against addressable-specs@0.1.0 — producing
a count of 177 that meant nothing. Matching on package identity gives 173. Two
numbers three apart, one of which was arithmetic over a category error.
- 2952026-07-28 · F-123 — the host breaks the subject-length rule of a flow it
installs, and this campaign is the largest contributor. §3.1's source 2 for the
git family is this repository's own history, and it is the cheapest independent
evidence in
world: no document is asked whether another document is right.
296What conforms: 394 of 400 subjects carry the type(scope): header, 399 of 400
carry a body — which is where the flow puts the why — and there are zero
Co-Authored-By trailers and one author across four hundred commits.
297What does not: conventional-commits sets a hard limit of 72 characters
on the subject, and 82 of 400 exceed it — 20.5 %, the longest at 89. The
violation is not a slip: 28 on 2026-07-25, 27 on 07-26, 14 on 07-24, 6 written
by this phase today. The campaign that exists to measure whether the discipline
holds itself to its own rule has been breaking one of them at about a fifth of its
commits.
298F-087 is measured rather than reported. Four commit bodies name a model — two
use Anthropic as the name of a colour theme, two describe model tiers as
configuration data — so the policy's «never mention model names in commit
messages» is broken four times in four hundred, and its «never state or imply
machine authorship» is not broken at all. The finding is real and smaller than
its filing suggests, and the distinction between naming a model and claiming it
wrote something is the whole of it.
- 2992026-07-28 · C3a — the TypeScript guide at 93.5 %, and the perimeter was wrong a fourth time in the most expensive way yet. 153 verdicts: 143 confirmed / 9 drift / 1 unverifiable.
300The guide's consumer is research/ts-demo/, and no brief had named it. A
language guide's rules are addressed to a project written in that language, and
the stack package is a Rust workspace that analyses TypeScript — so its own lack
of a tsconfig.json is not the discipline's absence, it is the wrong place to
look. The demo carries the entire surface: conform.toml, specmap.toml,
specmap.json, the three discipline/registry/ files, and a tsconfig.json
setting all four mandatory beyond-strict flags. The tooling the guide names is
there at scale — vitest in 46 files, tsd 43, fast-check 36, Twoslash 35,
expectTypeOf 30, ts-morph 25, assertNever 21 — every one of which the
delegated search had correctly reported absent from the places it was given.
Searched without the demos, about forty facts read as unbuilt; searched with
them, they read as in force. The batch plan's §4.5 now names them.
301What is genuinely drift, and it is precise. The TypeScript gate registers
exactly three rules — TsUnsafeInDomain, TsCellIsolation, FileLength
(build_rules, lib.rs:48-61) — so the whole §7 flag family cites an R-001 that
is present in the vendored engine and never mounted on this language. The
build-time tier (bundler define / DCE) and the runtime flag registry have no
instance anywhere, including the demo. The five defect-catcher flags are marked
implemented and the discipline's own demonstration project sets none of them.
302And a number quoted from a superseded copy of the corpus's own appendix. The guide cites TCD at «~74.8 %» twice; that figure appears in the live tree only under `.vibe/cache/`, in an older CONTRADICTION-MAP, while this family's own ATLAS records 75.3 % synthesis / 70.2 % translation**. One cross-reference is also off by two sections: the agentic battery is cited as «the sibling brief §6» and §6 of that brief is «The honest risk register».
303On the worker: it returned 153 rows having repaired 59 of its own line numbers
before returning and re-checked every one of 348 refs. Its three not-found
rows were all correct about the perimeter it was given, and two of the three
became drift on wider search while the third stayed. A worker that reports what
it searched converts a reviewer's disagreement into one lookup.
- 3042026-07-28 · C3 CLOSED — 390 verdicts, and the three guides measure differently for a reason that is about the tree rather than about the guides. 350 confirmed / 24 drift / 16 unverifiable — 89.7 %.
| guide | conf | drift | unver | |
|---|---|---|---|---|
| TypeScript | 143 | 9 | 1 | 93.5 % |
| Rust | 79 | 9 | 0 | 89.8 % |
| Go | 128 | 6 | 15 | 85.9 % |
306Rust reads high because the host dogfoods it — 120 files carrying
#[spec(implements=…)], 402 carrying specmark::scope!, a committed 3.1 MB
specmap and a floor whose three portable steps are green. Its nine drifts are named
sub-mechanisms with no checker and no instance on the wider perimeter as well:
#[track_caller] zero repo-wide, sealed traits and PhantomData zero, custom
clippy lints zero, #[spec(documents)] edges zero against 120 implements ones,
and two rules — R-021 and R-060 — cited by name whose cards are unauthored.
R-021's absence is now recorded by three documents in this phase.
307The perimeter check ran the other way here and that is worth recording.
Re-searching every Rust gap against research/rust-demo/ — the same widening that
inverted forty TypeScript facts — found none of them. Widening the perimeter is
not a way of confirming things; it either finds the artifact or it does not, and
here it did not.
308Go's fifteen unverifiable are the honest measurement, not a shortfall. There is
no consumer to observe: the only production Go in the repository is
tools/go-extract/extract.go, everything else under .go is that tool's fixtures
or its own generated output, there is no research/go-demo beside the rust and
ts demos, and the stack is not installed at all — vibedeps/ carries no
stack-go-ai-native-lang. A discipline addressed to a consuming Go project has
nothing here to hold or break it. Its ban list still confirms, on absence over that
one file plus a registered GoUnsafeInDomain rule; its drift is where a named tool
is missing — -race absent from a test step that fails anyway, and the
exhaustive linter not installed, its floor step failing rather than skipping.
309Both non-Rust gates register exactly three rules. TypeScript mounts
TsUnsafeInDomain, TsCellIsolation, FileLength; Go mounts the same three in its
own projection. The FlagSites rule exists in the vendored engine and is mounted on
neither, which is why both guides' flag families cite an R-001 that cannot fire.
- 3102026-07-28 · C6 CLOSED at 92.7 %, and it caught two errors of mine in the batch before it. 330 verdicts over the six skills, three boot snippets and eight READMEs: 306 confirmed / 24 drift / 0 unverifiable, on the cleanest evidence table of the phase — 865 refs, every one OK, zero elided and zero unresolvable.
311The drift is almost all one shape: a path or a name that does not resolve.
The three boot snippets cite rust/…, typescript/…, go/… and cards/INDEX.md
where every one lives under spec/ — the third instance of that family after the
Manifesto's MAP-RUST-GUIDE and the core README's READ-STACK-GUIDE. The Rust
README ships crates/specmark (it is crates/vendor/core-ai-native-specmark) and
schemas/specmap.jtd.json (host-only). The go-mcp README cites a plan that lives
in the host's legacy-spec/. And four names in one fact: the Go sweep's census
says gated_packages where the field is gated_crates, and init_in_cell /
ambient_call_in_cell / naked_go_in_cell where the shipped kinds are
init_decl / ambient_call / naked_go.
312Two further drifts are about output that is never printed: all three sweeps tell a
reader to check for Defaulted and DISABLED by policy, and neither string
exists in any shipped source or captured run. And the TypeScript sweep's outcome
table cites «Playbook §5», which is «What the sweep deliberately does NOT do» — the
output section is §4 and the table is in neither.
313Four of the six skills are installed here — .claude/skills/ carries the rust
and typescript sweep/terraform pairs — and the Go pair is not, consistently with
vibe.lock carrying no go-ai-native and vibedeps/ no stack-go-ai-native-lang.
- 3142026-07-28 · Two corrections to C3, both mine, both found by the next batch.
315First: I confirmed ten TypeScript facts on a count of node_modules. C3a
confirmed the scaffold-tooling family — vitest, fast-check, expectTypeOf, tsd,
Twoslash, ts-morph, assertNever — citing «vitest in 46 files» and the rest in
research/ts-demo/. That grep did not exclude node_modules, .vibe/cache/ or
vibedeps/, so it counted the demo's dependencies and a cache of superseded
package versions as the demo's own practice. Over the demo's own sources every
one of the eight returns zero; its devDependencies are @types/node, eslint,
prettier, typescript, typescript-eslint, its test script is literally
node --test, and its two test files are src/cells/{farewell,greeting}/index.test.ts.
Ten verdicts restated confirmed → drift. The tsconfig half of that same evidence
stands, because it was read by parsing the file rather than grepping it.
316Second: I recorded fifteen Go facts unverifiable on an absence I asserted and
never checked. The reason given was «there is no research/go-demo». There
is, and it is a complete consumer: go.mod, 15 production files in the cell
layout the guide prescribes, conform.toml with cells_dir = "internal/cells",
specmap.json, a conform baseline and four discipline/ files. Measured over it:
func init( 0, blank imports 0, go func 0, context.Context 8, func Example
4, Fuzz 5, //spec: 18, one recover() and it is in a test. Twelve of the
fifteen become confirmed, one becomes drift (DisallowUnknownFields occurs zero
times against a MUST), and two stay unverifiable for the right reason — the consumer
starts no goroutines and generates no code, so two rules have nothing to govern.
317What found both: C6's brief named .claude/skills/ and the go README's own
WORKED-PILOT-IS-RESEARCH-GO-DEMO fact, which pointed at the directory I had
declared absent. The corpus corrected the reviewer, twice, through a batch that
was looking at something else.
- 3182026-07-28 · C4+C5, two languages of three — 696 verdicts, and TypeScript reads highest in the phase. TypeScript 333 confirmed / 4 drift — 98.8 %; Go 337 / 8 drift / 14 unverifiable — 93.9 %.
319TypeScript's four drifts are each a name that outlived its referent. The
scaffold-d sunset names vibe-tcg-ts, which survives only in .vibe/cache/ copies
of the superseded v0.2.0 and v0.3.0 slots — the shipped binary is
typescript-ai-native-tcg. vibe codemod rename-seam has no implementation
anywhere. The oracle's warm target cannot be measured by its own harness: bench.rs
records cold_init_ms, validate_p50_ms and validate_p95_ms and no complete
latency and no thresholds. And the product seam names the vibe-tcg crate, which
the corpus itself records as deleted at PROP-026:11.
320Go's fourteen unverifiable are a distinction worth keeping. The oracle exists
— go-ai-native-tcg.exe is built, its help lists serve / validate / scope /
complete / type / bench, and its sources carry nine gopls references — and
gopls is not installed on this machine, so no behavioural claim about the relay
can be observed. Recording those confirmed on the code's existence would report an
unexercised mechanism as a working one; recording them drift would blame a
toolchain absence on the document. The mechanism is present and untested here, and
that is what the verdict says.
321Its eight drifts are concrete: go:generate occurs zero times in the Go
consumer, no goldens and no -update flag exist, research/tcg-bench/ carries a
TypeScript corpus and a Rust one and no Go corpus, the bench records warm_ms
alone against a «complete p50 under 300 ms» target, no grammar tooling is vendored,
and the gated-or-exempt invariant is stated over gated_packages where the
shipped field is gated_crates — the same wrong name C6 found in the Go sweep's
census, now in a second document.
322On the instruments: the TypeScript table returned 606 refs with zero unresolvable; the Go table 873 with ten, which is the checker earning its place at 1.1 % rather than crying wolf.
- 3232026-07-28 · THE
ai-nativeCLUSTER IS CLOSED — 80 of 80 files, 2 697 verdicts. C4 and C5's Rust half came in at 344 of 344 confirmed, 100 %, and that number was checked rather than celebrated: its ninenot-foundrows split cleanly by marker. Three are@impl/donedated spike measurements — init handshake ~10 ms, hover ~1 ms, completion ~19 ms at 118 entries — which wave 1's stage semantics confirm unless falsified, and the oracle they measured is runnable here: the binary is built and rust-analyzer is installed, unlike the Go stack's gopls. The other six are@spec/doneand sit under «§4 Staged ambition» and «§5 Licensing posture» — a CFG grammar mask deliberately unbuilt, whose absence is what those facts predict.
324Rust reads 100 %, TypeScript 98.8 %, Go 93.9 % on the same nine scaffolds and the same oracle shape, and the ordering is about this repository rather than about the three documents. The host is a Rust project that dogfoods the Rust stack; the TypeScript consumer exists and is complete; the Go consumer exists and its toolchain does not.
- 3252026-07-28 · THE REVIEWING DEBT IS CLOSED — 138 rows read, and the standard
that judges them is finally written down. Sixty
partialrows in the Go table had been sorted by FILE and seventy-eight in the Rust table by one two-branch rule. Read individually they come to 101 confirmed / 36 drift / 3 unverifiable, against 138 confirmed and unverifiable before. The cluster moves 92.4 % → 91.6 %: 2 470 confirmed / 207 drift / 20 unverifiable.
326The standard, stated because it had not been. A fact that PRESCRIBES what the
discipline requires — an intent, a participants list, a detector seed, a goal, a
tradeoff, an alternative, a risk, a routine step — is confirmed when it is
coherent and every referent it names resolves, including a referent the package
itself declares as future work: a card registry's specified column and a
brief's «vision, NOT an implementation plan» status line are that declaration. A
fact that DESCRIBES what this repository already ships is checked against the
tree, and a description that does not match is drift. This was already the
phase's operative standard — it produced 690 confirmations across the Rust and
TypeScript halves of C4+C5. Naming it is what made the Go half comparable to
them, and what exposed four claims judged two ways.
327Where the drift is: documents describing shipped software. A codemod
documented with five parameters that takes two and writes three files; init
results missing three of their five keys in both the Go and Rust protocols; a
floor glossed as four steps that ships seven and has no build step;
language: "go" said to dispatch through a host that names "go" as its example
of an unsupported value; an overlay counter said never to reset that resets on
didClose, in a bridge whose own test is named
overlay_versions_are_monotonic_and_close_resets; stderr said to be drained by a
reader when it is dropped at the pipe; a no-zombie property said to be
test-asserted in two stacks, asserted in neither; replay goldens claimed for both
hops and present for one; and three latency targets whose harness never times the
operation they govern.
328Eleven of the fourteen TCG-ORACLE-GO rows left unverifiable for the right
reason. They had been called unverifiable by file, on «gopls is not installed».
Eight of them turn out to be structural — a missing bench report, a resolution
order, a returned key set, a test that does not assert what a document says it
asserts — and are readable with no gopls at all. Three genuinely need a live
server and say so in their own words.
329Four claims had been judged two ways across languages, and comparing twins is
what found them. vibe codemod rename-seam (drift in TypeScript, confirmed in
Rust); the product seam's lockfile dispatch (drift in TypeScript, confirmed in
Rust and Go); the complete latency target (drift in TypeScript, confirmed in
Rust); and the Layer-1 grammar mask (drift in Go, confirmed in Rust). Each is now
judged once, and two of the corrections run upward: go-ai-native-tcg.xml's
two rows return to confirmed, because a document that declares itself «held at
stub depth» and VERY-FAR-FUTURE is not contradicted by being unbuilt. Two Go card
rows return to confirmed for the same reason — a participants list and a
goldens tradeoff were read as descriptions of this tree when they are
prescriptions, while five sibling participant lists were confirmed.
330The one thing the bulk pass got structurally right is worth saying too. No
row moved because the worker's evidence was wrong. Every drift found here was
already visible in the searched field the worker returned; what was missing was
someone reading it. A delegated table that records what it searched converts a
reviewer's disagreement into one lookup — and converts a reviewer's absence into
138 unexamined rows.
- 3312026-07-28 · F-124 — three evidence ids that resolve nowhere, cited by all three stacks. The pattern cards close with an «Evidence & Transfer-strength» line naming the findings a card rests on, and three of those names are not in any register this repository carries:
| id | cited by | what exists instead |
|---|---|---|
H4 |
scaffold-g-doctests.xml in Go and Rust, GUIDE-AI-NATIVE-GO.xml ×2, GUIDE-AI-NATIVE-RUST.xml ×2, both cards/INDEX.md |
nothing — the ATLAS's 87 records are BLD- / DR1- / DR2- / R2C- / R3- |
DR1-014 |
rust-ai-native-tcg.xml, GUIDE-AI-NATIVE-TYPESCRIPT.xml |
DR1-013 and DR1-015 exist; DR1-014 has no anchor |
DL1-015 |
scaffold-i-codemods.xml in Rust and TypeScript |
DR1-015 — one letter away, and the typo has never been resolved by anything |
333The H-series is the interesting one, because it is not a typo. H1, H5
and H6 are used the same way inside core-ai-native's own appendices —
CONTRADICTION-MAP.xml:13-16 frames C-1 as «H1 vs H5» and :46 names
«H6 uniformity», and ATLAS.xml carries refines:H2, refines:H3, H5/H6 in its
record bodies. A hypothesis vocabulary is in daily use across the family and its
roster is written down nowhere. So H4 cannot be confirmed, cannot be
corrected, and cannot even be shown to be wrong — the same shape as F-120's
kind-line notation, defined by one example and cited to a document that is not
here. Filed, not fixed: which of the two — publish the roster, or drop the H
citations — is the owner's call, and it touches published slots.
- 3342026-07-28 · F-125 — one package, two appendices, two numbers for one
measurement.
core-ai-nativev0.8.0 publishes the PLDI'25 type-constrained- decoding result twice and differently: the ATLAS records «reduces compilation errors by 75.3 % (synthesis) and 70.2 % (translation)» (ATLAS.xml:105-106, DR2-012), while the CONTRADICTION-MAP titles C-4 «Type-constrained decoding cuts errors 74.8 %» and repeats it in the resolution (CONTRADICTION-MAP.xml:28,31). Both are in the live slot, both are generated appendices of the same package, and four documents across three stacks quote whichever one they read — the TypeScript guide twice, the Rust token-level brief twice, the Go token-level brief once.
335This one corrected a verdict of mine from earlier in the phase, and the
correction is the finding. C3a recorded the TypeScript guide's «~74.8 %» as
drift on the reason «that figure appears in the live tree only under
.vibe/cache/**, in an older CONTRADICTION-MAP». It does not — it is in the
v0.8.0 appendix, inside this campaign's own corpus, one grep away. The verdict
stands, restated on the true reason; a wrong reason in the record is worse than
a wrong verdict, because the next reader acts on it and the verdict at least
pointed at a real defect. The perimeter law was written after three misreadings
of where to look; this is the fourth, and the first where the miss made a real
contradiction look like a stale quote.
- 3362026-07-28 · F-126 —
rust-ai-native-tcgnames two different tools, one of them shipped.spec/rust/tools/rust-ai-native-tcg.mdis the token-level brief: a logit-masking constrained generator, VERY-FAR-FUTURE, explicitly unbuilt, whose one-line summary promises well-typed Rust «by construction». A binary of exactly that name ships:vibe.toml:45declaresrust-ai-native-tcgandcrates/rust-ai-native-tcg/src/main.rs:1calls itself «the agentic type oracle's CLI face», with a serve / validate / scope / complete / type / bench surface and no masking anywhere. A reader resolving the name gets the consultation oracle and the brief for something else.
337qualified-naming states the law this brushes: never reuse a coordinate for
different content — a coordinate that meant one artifact must never mean another.
The same collision already has a recorded instance one document over — the
TypeScript card's sunset names vibe-tcg-ts where the shipped binary is
typescript-ai-native-tcg — and a third: vibe-tcg, the name the Rust brief
reserves «solely for vibevm's language-generic product crate», belongs to a crate
PROP-026 records as deleted whole. Three names in one tool family, none of them
pointing where its document says.
- 3382026-07-28 · F-127 — the Go stack prescribes
-racefifteen times and never passes it.go test -raceis the Go projection's whole concurrency-discipline story: the boot snippet, the card registry,scaffold-d's routine step 5,scaffold-e's intent, participants and consequences, and the guide's baseline all name it — 15 mentions across 5 documents. The shippedgo-ai-native fast-looprunsgo test ./<cells_dir>/<cell>/... -jsonand passes no-race(crates/go-ai-native-cli/src/fast_loop.rs:87); the floor's test step does not either;-raceoccurs zero times in the stack's Rust sources and zero times inresearch/go-demo. Soscaffold-e's «-racerides along at per-package cost, so the concurrency discipline (§5) is checked in the same loop» is true of the command a human types and false of the tool the card names as its own checker. The guide'sBASELINE-RACE-DETECTOR-GATES-TESTSis already drift for the floor half; this is the loop half, and it is one flag.
- 3392026-07-28 · F-128 — the four non-negotiable commit rules are said to live in a file that does not exist, by the file every session reads first. Found while reading W1's packages rather than in any delegated table, and the chain resolves end to end:
340 $ ls vibevm/vibespecs/boot/
00-core.xml 90-user.xml INDEX.md STATIC.md
341There is no spec/boot/INLINE.md. And line 5 of CLAUDE.md, AGENTS.md and
GEMINI.md — identical, and the first substantive sentence of the first file any
session reads — says the commit-and-push discipline «is the git-practices
family, a dependency of this project loaded first and verbatim from
spec/boot/INLINE.md. The rules live in that inline lane, not restated
here.»
342Why the lane is empty is the interesting half. PROP-009 gives a package's
[boot_snippet] a link field with three values — inline / static /
dynamic — and only inline produces INLINE.md. All four git flows carry, in
their manifests, this exact pair:
343 # A non-negotiable commit rule — suggest the inline priority lane (PROP-009 §2.4).
link = "static"
344The comment says inline and the field says static, in all four. The umbrella's
own manifest then builds on the comment rather than the field: «Each member
self-suggests the inline priority lane in its own [boot_snippet], so its text
lands verbatim in spec/boot/INLINE.md (read first)». And repository-wide,
grep 'link = "inline"' over every vibe.toml in packages/ and vibedeps/
returns zero — nothing anywhere asks for the lane, so the generator has
nothing to write and correctly writes nothing.
345The rules are read anyway, which is why this survived. They are compiled into
vibevm/vibespecs/boot/STATIC.xml — twice each, once directly and once through the umbrella
(F-078) — and INDEX.md names STATIC.md as the static lane, so a session that
follows the generated boot manifest gets all four rules. A session that follows
the authored sentence goes looking for a file that is not there and is told the
rules are not restated anywhere else. The mechanism works; its documentation is
wrong in five manifests and three contract files.
346Filed, not fixed. Three of the eight surfaces are inside published package slots,
so closing it touches F-122's territory; the host-side half — three identical
lines in CLAUDE.md / AGENTS.md / GEMINI.md — is one edit and the owner's,
because those files are the ones the boot contract is written on.
- 3472026-07-28 · W1 CLOSED — 407 of 407, and the phase's falsifiable prediction is
in trouble at the first world batch. The git family: 368 confirmed / 32 drift /
7 unverifiable — 90.4 %, against
ai-native's 91.6 %. §5-C predicted thatworldmeasures higher, on the reasoning that prose contracts are rarely contradicted while mechanical claims can be wrong in ways prose cannot. The first world batch reads lower, and the reason is the opposite of the one predicted: these flows make claims about the consuming project, and this consumer is measurable.
| file set | verdicts | conf | drift | unver | |
|---|---|---|---|---|---|
git-attribution-policy (5 files) |
132 | 109 | 16 | 7 | 82.6 % |
git-conventional-commits (3) |
68 | 62 | 6 | 0 | 91.2 % |
git-atomic-commits — core (3) |
101 | 93 | 8 | 0 | 92.1 % |
git-autonomy + git-practices (4) |
54 | 52 | 2 | 0 | 96.3 % |
git-atomic-commits — splitting (1) |
52 | 52 | 0 | 0 | 100 % |
34926 verdicts are self-referential — 6.4 %, and amendment A2's counter fired for
the first time. They cluster where the corpus argues rather than states: claims
about pure-human teams, about what most humans do under deadline pressure, about
what an unmanaged repository accumulates. tasks/summary.py --batch W1 prints it.
350Thirteen of the thirty-two drifts are one law, and it is the flow's own.
attribution-policy states that the policy lives in exactly one always-loaded
place and nowhere else; the host compiles it into the boot lane twice and restates
it in eight further locations, and a repo-wide grep for the topic returns 88
lines across 50 files. Every clause resting on that law falls with it — one
place to change, switching in one edit, and the escape hatch that says a project
adopts the alternative «by editing this snippet», whose only host copy sits inside
a file whose first line says it is generated and must not be edited.
351A second family runs through every package in the batch: the sibling pointer.
A boot snippet ends by linking its own protocol as ../flows/<name>/<file>.md.
Measured corpus-wide: 60 such pointers in the packages, 0 dangling; 120 in the
installed vibedeps/ trees, 15 dangling; and 69 in the host's compiled boot lane,
all 69 dangling — because the host has no spec/flows/ directory at all and
files_written = [] means no package will ever create one. The pointer resolves
for exactly one reader, the person browsing the package repository, and fails for
the reader it is written for.
352The rest are single defects worth naming. «Explicit and enforced» is explicit
and unenforced — no hook, no CI, no audit line — in a flow that itself ships the
law «a policy with no checker is a wish». The never-item forbidding model names in
commits and comments is broken on the letter at scale (11 subjects, 354 message
lines, 263 code lines) while its sibling forbidding authorship claims is not
broken at all. The format flow's subject rules are broken as practice: 297 of
400 subjects exceed the 60 characters it targets — 74.3 % — and 144 of 400 open
with an article rather than a verb, which is the first measurement of its
imperative-mood clause and the largest single format gap found. And
atomic-commits contradicts itself about an irreversible operation: its
frozen-history bullets forbid --amend and rebase -i flat where its own
snippet, its own summary and the host's rule 4 all permit them with explicit
approval.
353Seven unverifiable are honest and all of one kind — assertions about jurisdictions, regulation and employer policy that no source inside this repository can settle, plus one uninstall behaviour whose file ledger is empty for all 36 packages.
354On the instruments. Five delegated tables, 1 645 refs, and after the checker's
fourth narrowing 0 unresolvable. Forty-three refs failed at first and not one
was a fiction — every one was a notation the grammar does not admit (a bare path,
a line range recording an absence, an added code span, a double-escaped
backslash), and the brief now carries the grammar. Two workers reported that a
harvest file changed under them mid-run and that they had re-anchored every
citation to its current content; the boss had edited it while five workers were
citing it. That is the boss's defect, reported by the workers rather than by the
checker, and it bought repair-refs.py — which separates a real quote whose line
moved from a quote that is nowhere, and refuses to choose when a quote occurs in
several places.
- 3552026-07-28 · W2's evidence is complete and unjudged — 692 anchors, four tables, 2 404 refs, 3 unresolvable and none a fiction. The session that closed the reviewing debt and W1 ran out of context here, and the honest stop was to persist the delegated work rather than judge half of it — the same shortcut that created the 138-row debt this phase opened with.
356What the four tables establish before a single verdict is written:
| the sync grammar | docs(spec): sync <section> with code — 0 uses in 2 041 commits |
| …and yet the path is the practice | recorded three independent ways: a task template, an owner guide, and a 212-row wave whose diffs were drafted, surfaced and applied only on approval |
| of three mandatory draft parts | value and reason land; the revisit trigger never does |
| the morning ritual | none exists in the host at all — 23 hits for the word, not one an operating instruction |
the _Updated: line |
a bare date where the protocol requires ISO 8601 UTC, so the flow's own 24-hour test cannot be evaluated to the hour and its skill has no hours to report |
| the wind-down report | flow asks four items, host asks four items, none of them the same |
| the cold-resume contents | 10 of 10 match |
| the specspaces snippet | placed by two host files at «slot 11 of vibevm/vibespecs/boot/INDEX.md»; grep -c on that file returns 0 — the same shape as F-128 |
| the installed payloads | stale by 92-176 changed lines per file; 10 and 0 fact anchors against the package's 39 |
358And three counter-instances that are this repository's own, one of them written
by the session that found it. 6a026de1 rewrote the WAL's In-progress and Next
in a single hunk and touched _Updated: zero times, which is precisely what
NEVER-LEAVE-THE-UPDATED-LINE-UNTOUCHED forbids. Over 2026-06-01 → now, 37 days
carry commits and 28 carry a WAL commit — nine active days ended without one. And
the read order is reversed and self-contradictory: CLAUDE.md:205 reads the WAL
then CONTINUE.md, while CONTINUE.md's own resume prompt lists itself first, «in
this order».
359The WORDS-DIFFER finding was corrected in place, and the correction is the
entry's other lesson. The boot-lane join reported two-process-model as the
corpus's first words-differ case and the harvest first recorded three missing
rule words. They are the {#…} suffixes on three headings; every rule's prose is
word-identical, and what the host loses is the ability to cite three of the four
sections of its own copy — which bites the rule that prices a correction at twenty
tokens because the exact section can be cited. Cause traced with dates: the
anchors landed 2026-07-27, the slot was written 2026-07-14, the lane regenerated
2026-07-26. The compiler-strips-anchors alternative was checked and rejected.
Third time in one session that a reason in the record needed fixing rather than a
verdict.
360On delegation. Nine opus5 workers across W1 and W2, 4 049 refs, and after the
checker's fourth narrowing five unresolvable, none a fiction. Three of the
four W2 workers reported the boss moving a file under them mid-run — the harvest,
CONTINUE.md, and vibevm/vibespecs/WAL.xml twice — and each re-anchored its citations and
said so. The rule is now in both checkpoints: do not edit a file a running worker
cites, and do not read a table while its worker may still be writing.
- 3612026-07-28 · The wind-down that invalidated its own evidence. W2's four
tables were verified clean at 3 unresolvable when the last session sealed them.
Re-verified at the opening of this one they read 65. Not one of the 62 new
ones is a fiction:
CONTINUE.mdwas overwritten wholesale by8406eb2aandvibevm/vibespecs/WAL.xml's_Updated:line rewritten by0f2991d1— both after the tables were returned and committed — andgit show 100617b3:vibevm/vibespecs/WAL.xml | sed -n 3pstill carries the quote verbatim.repair-refs.pyre-pointed 51 by single-hit search; the remaining 14 are named rather than repaired (8 quote text the rewrite deleted, 2 became ambiguous, 3 are the grammar cases already recorded). This is the third instance of the boss moving a file under a citing worker and the first where the workers had already finished, so nobody could re-anchor. W1's lesson — do not edit a file a running worker cites — does not cover a wind-down that rewrites the two files the whole batch is about. The tool's first real--applyalso exposed a defect of its own: it re-dumped every table at a fixed indent, turning 51 repaired coordinates into 4 481 changed lines. Fixed to measure the file's own indent first; the same run now produces 53.
- 3622026-07-28 · W2a and W2b CLOSED —
flow:walcomplete at 260 of 260, 86.5 %. 225 confirmed / 27 drift / 8 unverifiable across seven files. W2a is 81.1 % (90/16/5), the lowest file-set in the cluster so far, and the reason is structural: this flow's facts describevibevm/vibespecs/WAL.xml, andvibevm/vibespecs/WAL.xmlis on disk and measurable line by line. Where W1's git flows could only be checked against a commit log, W2a's required-sections contract can be checked against the artefact it specifies.
363Six of W2a's sixteen drifts are that contract, each measured over the fourteen most recent revisions of the host's WAL rather than over today's:
| rule | measurement |
|---|---|
_Updated: <ISO 8601 UTC> "always and without exception" |
bare calendar date in 14 of 14 revisions, 0 timestamps |
| Current phase — "one or two lines" | 25-50 lines in every revision; 50 today |
| Next — "the single next action" | 4-5 numbered items in every revision, no default marked, numbering repeats 3 |
| Constraints — each why "citing a spec anchor or issue" | 4 of 26 entries (15 %); spec:// occurs 0 times in the file in all 8 revisions measured |
In progress — "cite spec anchors (spec://…)" |
same zero |
| Session context — "one-paragraph orientation" | 41-65 lines of retrospective |
365The size target is the seventh: 18 972 bytes is over 3 000 tokens on either
conversion, though under the 5 000 hard limit. W1's precedent settles the shape
— HEADER-TARGET-LENGTH-AND-HARD-LIMIT was judged drift on exactly this kind
of measurement, and its summary restatement with it.
366Two more are the flow's own §what, written for a one-file model that §files
replaced two sections earlier in the same document. The WAL is neither "the
only persistent memory" — CLAUDE.md, 1 585 compiled boot lines, the spec tree
and CONTINUE.md are all persistent memory the agent reads every session, and
CONTINUE.md is specified by this very package — nor "read first": the host
reads it third and says so in two independent files. The instruction to read
it first is itself compiled at line 1382 of a 1585-line lane the host reads
before opening the WAL.
367And two are canonicity, with dates. wal 0.2.0 landed 2026-07-07
(ec6b5b5a, subject «the canonical WAL convention»). core-ai-native v0.8.0 —
the Discipline's next release after that — landed 2026-07-17 (bfb72da7), ten
days later, is the installed slot, and still ships a complete
06-WAL-CONVENTION.xml with the same two files, the same canonicity rule and
the same supersession, marked «OPTIONAL but preferred», containing zero
occurrences of defer, flow:wal or org.vibevm.world/wal. The next
release came; it did not defer. The host installs and boots both.
- 3682026-07-28 · F-129 — the wal package ships two wind-downs and they
contradict each other.
session-end-hook.xmlorders «the full hook, steps 1-6»: confirm the stopping state, rewrite the WAL, collapse, overwriteCONTINUE.md, propose the commit, report.cold-resume.xml§wind-down orders five steps in a different sequence — overwriteCONTINUE.mdfirst, rewrite the WAL second, commit, push, chat TL;DR — with no stopping-state step and no collapse step. A third fact,WIND-DOWN-IS-THE-EXPLICIT-FORM-OF-THE-HOOK, asserts the two are the same procedure. All three are@impl/done, all three are in one package, and both step lists reach the consumer.
369The host implements cold-resume.xml's five exactly, in order — including
the chat TL;DR word for word — so what reads as a consumer dropping two steps
is a consumer obeying the other half of the package. This also corrects the
harvest, which recorded the wind-down report as «flow asks four items, host
asks four items, none of them the same»: the host's four are this flow's
own EXTEND-THE-REPORT-INTO-A-WIND-DOWN-TLDR list, verbatim. What the host
lacks is the base report, and two of its four items land elsewhere — REVIEW
markers at vibevm/vibespecs/boot/00-core.xml:60, discovered issues in the WAL's Known
issues via the host's own step 2. Filed, not fixed; closing it is an edit
inside a published slot, so F-122's territory.
- 3702026-07-28 · What W2b's drifts are measured on, and what was deliberately
NOT counted. Three of the eleven rest on history rather than on today's tree:
the WAL's
_Updated:line is left byte-identical by 10 of the 17 recent commits that edited its body — 58 %, the majority case, and the bare-date format is why there is nothing to bump within a day; the implicit hook fires on 28 of 37 active days since 2026-06-01, so nine ended with commits and no WAL commit; andCONTINUE.mdis overwritten wholesale at all seven wind-downs and patched between them in 7 of the last 14 commits touching it. The cold-start order is reversed in writing on both sides: the flow saysCONTINUE.mdfirst then the WAL,CLAUDE.md:205runs the boot sequence to the WAL and readsCONTINUE.mdsecond, andCONTINUE.md's own resume prompt lists itself first.
371morning-routine.xml is unadopted end to end — the host has no morning ritual
and no weekly re-read — and that is NOT counted as per-fact drift. The line
drawn, and it is the line the rest of world will be judged on: a human's
daily read leaves no repository artefact, and the flow never claims the host
performs one; only where the host's own written contract contradicts the flow
is it drift. Two of forty-two facts qualify, both about the cold-start read
order. The whole-document non-adoption is a finding for the report, not
forty-two drifts.
372Two rule pairs were judged differently on purpose, because their own words
differ: NEVER-APPEND-TO-THE-WAL prohibits appending only, and the host never
appends — confirmed; REWRITE-THE-FILE-DO-NOT-PATCH-OR-APPEND names patching
too, and CLAUDE.md's step 2 says «Update … bump … refresh» — drift. Same for
NEVER-APPEND-TO-CONTINUE against CONTINUE-IS-OVERWRITTEN-WHOLESALE.
- 3732026-07-28 · W2 CLOSED at 692, W3 CLOSED at 615 — the cluster is 51 of 121
files and the per-file slice is now the working unit.
worldreads 1 557 / 140 / 17 — 90.8 %, still belowai-native's 91.6 %, and the phase crosses 61.7 %. W3 returned zero unverifiable — the first batch in the phase where every fact could be settled against the tree.
374The unit changed, and that answers the split question §4 left open. The plan
said to re-measure the per-anchor cost after the first world batch and split W5
if it ran higher than C1's. The measurement is moot because the batch stopped
being the unit of work: seventeen slices closed here, one file each, from 17
rows to 149, every one merged and sealed on its own. merge-verdicts.py accepts
a subset of a batch's files under the same batch id, so a slice that lands
cannot become a debt — which is the property the 138-row debt was missing. W5
does not need splitting; it needs twenty-one slices.
375What the two batches measured, by family rather than by file:
| family | measurement |
|---|---|
| the size budgets | boot lane ~16 100 tokens against 500 (32×), WAL ~4 000 against 3 000, 9 of 47 module specs over 5 000 — and «split when over» has fired zero times |
| the four-field record | 4 of 153 sections carrying a Decision label have all four fields; 127 have the Decision line alone; 142 carry no revisit condition |
| the revisit trigger | 11 exist in spec/; 1 has metric + threshold; none has all three parts |
| the sync grammar | docs(spec): sync … typed 0 times in 2 041 commits, against 183 docs(spec) commits; neither recorded sync cites a spec:// URI |
| anchor coverage | 857 of 982 headings anchored — and the 125 without are all 23 in vibevm/vibespecs/boot/ and all 8 in vibevm/vibespecs/WAL.xml |
| anchor uniqueness | 59 duplicate-anchor warnings, all in the generated boot lane, where {#root} means 27 things |
| the changelog line | exercised once across 42 PROP documents |
the Test: line |
zero in spec/; all 223 verifies edges come from code |
| tombstones | 2 of 2 document moves left the old address bare |
377Three internal contradictions, each inside one package or one lane. The
wal package ships two wind-downs — six steps in session-end-hook.xml, five in
a different order in cold-resume.xml, and a third fact calling them the same
procedure; the host implements the five (F-129). record-template.xml says an
event trigger fires «without anyone having to remember to wonder» while
revisit-triggers.xml says triggers do not fire themselves — and the host's one
event trigger sat unfired for six weeks. And cognitive-load-split.xml says text
that works for the AI works for the other two «for free» while the wal package
says the report and the WAL «serve different readers» and the host writes both.
378And one collision of principle, recorded on the host side in the prescribed
form. uncertainty-protocol.xml tells a session to prefer adding no
dependency, «because a dependency is a permanent tax». vibevm/vibespecs/common/PROP-000.xml
§15 decides the opposite at the governing anchor, with a why that answers that
reason directly. Not non-adoption — a weighed, written, opposite ruling.
- 3792026-07-28 · The verdict line that made these two batches consistent, and it
is now the cluster's rule. A flow's prescription the host simply never adopted
is not drift — a human's morning read leaves no repository artefact, and no
flow claims the host performs one. Drift is where the host's own written
contract contradicts the flow, or where a measurable rule is broken over a
double-digit share of its window.
morning-routine.xmlis unadopted end to end and scores 39 of 42 confirmed; its two drifts are both the cold-start read order, whichCLAUDE.md:205reverses in writing. Judged the other way, one unadopted document would have produced forty-two drifts and buried the two that matter.
380Two corollaries the batches needed. Each fact is judged on its own sentence,
never on its family — NEVER-APPEND-TO-THE-WAL prohibits appending only and
the host never appends (confirmed), while REWRITE-THE-FILE-DO-NOT-PATCH-OR-APPEND
names patching too and CLAUDE.md step 2 says «Update … bump … refresh»
(drift). And a definition that classifies correctly is confirmed by the
failure it classifies: «a decision without a revisit condition becomes a
sacred cow» is confirmed by 142 sections having none, not refuted by them.
- 3812026-07-28 · The delegation lesson W3 paid for, and it was a two-sentence
change. Three
opus5workers returned 615 anchors over 1 805 refs with zero unresolvable on the first pass — the first batch in the phase to verify clean without a repair run. The change: the briefs told them to prefer structural citations and to reach forCLAUDE.md,vibevm/vibespecs/boot/**,vibevm/vibespecs/common/**and the crates rather thanCONTINUE.mdandvibevm/vibespecs/WAL.xml. One worker reported «Zero refs point at CONTINUE.md or vibevm/vibespecs/WAL.xml».
382This was learned the expensive way, twice in one session. W2's four tables
verified at 3 unresolvable when sealed and at 65 when re-read, because a
wind-down had overwritten both files underneath them; and then this session's
own checkpoint did it again to W2c and W2d. Not one of the 71 broken refs was a
fiction — git show 100617b3:vibevm/vibespecs/WAL.xml still carries every quote verbatim.
383Two workers also corrected the harvest that commissioned them, which is what
a delegated search is for. The REVIEW-marker contract is not unexercised: a
three-file grep found one hit, the widened search found five live markers plus a
shipped review_aging check, a standing audit category and a task stop rule
that has fired twice — and the gap that matters, which is that review_aging
scans spec/ only and cannot see four of the five. And one worker's own
absence was asserted rather than checked — «no host rule discouraging new
dependencies exists» against a PROP-000 §15 that exists and says the opposite.
The campaign's named trap, caught by re-reading, in the session that wrote the
trap down.
- 3842026-07-29 · W4 CLOSED at 564 — 474 / 89 / 1, 84.0 %, the phase's lowest
batch and the first that measures a practice the host has LEFT. Per package:
redbook96.4 %,discovery-prompt92.8 %,comparative-research84.4 %,campaign-plans72.5 %. The phase crosses 71.4 % andworldfalls to 89.3 % againstai-native's 91.6 %, so §5-C's prediction diverges further in the direction W3 already recorded.
385The sixty drifts in campaign-plans are one finding. The fifteen-section
plan skeleton this flow defines is instantiated exactly once in the repository,
and that instance is in legacy-spec/. The two campaigns the repository runs
today carry none of it — risks 16 archived / 0 live, non-goals 9 / 0,
quick-start 7 / 0, whole-campaign acceptance 8 / 0, execution ledger 8 / 0,
commit maps 3 / 0, safe stop 12 / 0, Phase 0 five archived and none live. The
live campaigns replaced the one-file dialect with a zone directory and eight
side documents, which §13 of the format explicitly permits — but the sections
went with the dialect.
386The measured window, stated in the verdict reasons so it can be re-judged. When a flow's rule has archived host instances and no live ones, the window is the current tree, and the archive is cited as evidence the practice was ONCE ADOPTED — which is what makes the absence drift rather than non-adoption. A rule the host never followed is confirmed; a rule it followed in twenty-five archived plans and stopped following in the two it runs now is not.
387Three defects need no host to see them. campaign-plans' execution-record
example says «Two predictions falsified … the other four held» where the
campaign it was copied from says three and enumerates two.
comparative-research's worked fragment is introduced as obeying all five laws
and obeys four — it has no re-fetch section, the artefact its own skeleton
defines. And discovery-prompt's usage.xml widens a rule the artefact
deliberately scoped («every control BELOW is a hashtag») and is contradicted by
the artefact's own fourth knob, then contradicts itself fifteen lines later on
whether <EXTENSION_CRITICALITY> is configuration or mechanism.
388What no host study does, measured five ways. No study obeys all five laws
of comparative-research. No quote anywhere carries a per-quote access date —
grep -rnE '— .*, accessed 20[0-9]{2}-' returns zero. No delta anywhere carries
a verdict, and no accepted delta carries a revisit condition of any kind. No
study writes a re-fetch walk order. And the never-paraphrase law is contradicted
by an owner directive — the clean-room rule — with the legal rationale quoted
verbatim, which is a collision of principle rather than neglect.
389Findings: NONE opened. Every W4 drift that reaches finding grade confirms one already filed — F-113 (redbook's three rosters, 22 / 21 / 23), F-114 (the edition contract falsified by its own manifest comment), F-119, F-122. Reading the ledger before judging is what kept a duplicate F-130 from being opened for the roster gap.
- 3902026-07-29 · Eight evidence tables, eight clean first passes, and three
harvests corrected by the workers they commissioned. W4a-d and W5a-d returned
1 632 rows over 4 643 refs with zero unresolvable, and none cites
CONTINUE.mdorvibevm/vibespecs/WAL.xml— proved when this session rewrote both files mid-flight and re-verified every table at zero. The two-sentence durable-citation rule in the brief is now paid for eight times.
391The corrections run the other way from the usual delegation worry. W4b: the
harvest said the fractality study notes carry no two-way gap section — an
absence asserted, not checked, the campaign's own named trap walked by the
session that keeps quoting it. Two *-SYNTHESIS.md files were listed and never
opened; both carry ## 2. Two-way gaps {#gaps}, and the pipeline's downstream
half is live (ROADMAP records eight milestones deriving from the Tessl study).
W5d: the harvest printed ten paths from a grep that returns nineteen, and
the truncation dropped crates/vibe-publish/src/token.rs, where the Token
wrapper and both Law-4 tests live — a worker following the list would have
reported the flow's only code-enforced law unimplemented. W4d and W4c:
vibevm/vibespecs/boot/INDEX.md does not carry the qualified member names, and the
dangling-pointer count was an undercount because the regex could not see a
root-relative spec/flows/… path.
- 3922026-07-29 · Two tools, and one of them is the answer to «how much is left».
tasks/batch-progress.pyjoins what each batch OWES (PHASE-C-BATCHES.json, generated fromrun/mirror) against what is WRITTEN (run/cache.json) and names the unopened files of an open batch. The phase had counts and no way to see the remainder; every «X % of the phase» before it was that subtraction done by hand, and one was done in the head and landed wrong.tasks/make-slice.pybuilds a slice from an evidence table plus a rulings map, with six refusals tested against W3's closed tables before first use. The one that matters refuses any slice whose file has an addressable anchor the table does not cover — the property the 138-row debt was missing. Validated by regenerating a closed slice: identical anchor set, identicalsrc, worker refs identical on 63 of 64.
393verify-evidence.py also gained one character. Its ref pattern required
<name>.<ext> before the colon, so an extensionless dotfile fell through to
UNPARSED — W4b hit it three times on true .gitignore refs the instrument
could not read. Leading + became *; the three already-trusted tables re-run
to identical counts.
- 3942026-07-29 — PHASE C CLOSES. 6 847 / 6 847 anchors, zero owed. Every addressable anchor in every shipped package file now carries a verdict backed by evidence that resolves to a real line in a real file. All seven world batches closed: W1 407, W2 692, W3 615, W4 564, W5 697, W6 572, W7 603.
395Exit-gate clause (ii) — the X/Y/Z summary. Over the whole marked corpus:
10 700 confirmed / 601 drift / 45 unverifiable = 11 346, 94.3 %. By zone:
host 4 496 / 0 / 3 over 58 files (99.9 %); ai-native 2 470 / 207 / 20 over
80 files (91.6 %); world 3 734 / 394 / 22 over 121 files (90.0 %). Reproduce
with tasks/summary.py; per-batch with tasks/batch-progress.py. Both print
the truth and supersede every figure written here.
396Exit-gate clause (iv) — the self-referential count (amendment A2). Of the
world zone's 4 150 verdicts, 248 carry src == [1] — 6.0 %. Those rest on
the package's own artifacts alone, with no host observable and no installed
witness, and they are overwhelmingly structural lead-ins, package-internal
cross-references and illustrative genres (an ssh-config example in a repository
that writes no ssh config). A reader weighing this campaign's evidence should
discount them and read the other 94 %.
397Exit-gate clause (v) / amendment A6 — baseline.json written.
vibe progress baseline --campaign campaigns/packages-2026-09 emitted 2 216
units — 1 706 confirmed, 491 drift, 19 unverifiable. Recorded for whoever runs
the next rescan: 60 units were omitted for want of a judged fact and will
read as new, and 58 verdict keys matched no fact anchor (the per-file
_elements bundles). Neither is a defect; both are shape mismatches between the
verdict cache and the unit model, and a rescan that does not expect them will
read 60 phantom additions.
398What the phase found, in one paragraph. 601 drifts, and the recurring
shapes are four. The ../flows/… sibling pointer dangles in seven
consecutive W6/W7 packages — the host has no spec/flows/ directory, so every
boot snippet points a session at nothing, and the root-relative variant inside
two re-derive prompts is invisible to the campaign's own \.\./flows/ scan.
Rules with no checker fail while their checked siblings hold — source-mirrors
is the controlled experiment: never---force has a unit test and held, while
never-push-to-a-replica and the ancestry gate have none and both failed, 130
pushes and 0 merge-base calls respectively. Verbs are specified and never
built — managed-blocks' remove, qualified-naming's KindMismatch, each
costing five to six sentences downstream. And the collection over-counts its own
contents in exactly two READMEs, spec-genres and tool-design-lessons, both
saying «four pieces of content» over three shipped documents where 14 of 16
siblings say «three».
399Three findings filed and deliberately unrepaired, per the phase's own rule
that C records and the next wave drains: the root README.md:164 still calls
vibevm proprietary over a LICENSE.md that has been UPL-1.0 since 2026-07-12,
and is on none of CLAUDE.md's enumerated stale-string exemptions; both mirror
targets declare refs = ["main", "tags"], so four local branches exist on no
host and would be lost with this machine; and CLAUDE.md:191 makes «Push to
origin/main» step 4 of the END SESSION contract, which 90-user.xml:13, :35
and PROP-016:15 all name as not the rollout.
400The method that made it hold. The per-file slice as the unit of work, never
the batch. Two instruments that refuse rather than guess — make-slice.py
rejecting any slice whose file has an uncovered anchor, merge-verdicts.py
refusing to restate a verdict without --force — and both caught real mistakes
in this phase's final week. The durable-citation rule got its controlled
experiment too: the one batch written before it carries 116 dead refs into
rewritten checkpoints today, and every batch written under it verifies clean.
- 4012026-07-29 — PHASE D OPENS. 601 drift verdicts become 228 obligations, and
the first thing measured killed the obvious plan. The batch plan is
campaigns/packages-2026-09/PHASE-D-BATCH-PLAN.md; the registry isrun/state/obligations.json, generated bytasks/drift-registry.pyand never hand-edited.
402The hypothesis that failed. Phase C was expected to have pasted one reason across every anchor it falsifies, so the drifts would cluster by reason text. Measured: of 601 reasons only 16 texts repeat at all, over 54 rows, and text-only clustering returns 552 groups for 601 rows — a reduction of 1.1×. Phase C wrote a bespoke reason per anchor. What groups them is the SUBJECT: one document, one kind of defect, one edit pass. Keyed that way and merged across documents on three provable signals — a reason shared at Jaccard ≥ 0.65, a finding id the worker itself cited (18 rows), one anchor drifting in two or more packages (16 anchors, 48 rows) — the corpus lands at 228 obligations, 2.6 verdicts each, 95 singletons, largest 14.
403The order of the two clustering passes is the design. Cross-document
families form FIRST; (document, type) groups only what no family claimed.
Run the other way, one shared anchor chains two whole documents of unrelated
defects through the (document, type) key — it produced a 35-row obligation
joining the dangling-pointer family to COMPOSES-ATOMIC-COMMITS before the
passes were separated.
404By type: reality-mismatch 119 obligations / 359 verdicts ·
missing-support 57 / 142 · contradiction 27 / 44 · relocation 20 / 49 ·
duplication 5 / 7. terminology has no member and stays in the vocabulary.
The two types are split so the split is decidable: missing-support is an
ABSENCE, reality-mismatch a DESCRIPTION that is wrong.
reality-mismatch is the residue class by design — the cheap types must
positively match — and its rule is named r-default-described-wrongly so the
default is never read as a match.
405The number that sizes the phase is the closure route, not the type.
prose-edit 105 obligations / 232 verdicts (boss) · build-or-demote 54 / 134 ·
sync-from-code 52 / 176 (owner approves every spec diff) · release
17 / 59 (owner before publication). 69 of 228 obligations cannot close
without the owner reading something, so the wave is ordered around review
cost rather than package size: D3 and D4 diffs are prepared first and closed
last, and D1/D2 run against the owner's queue rather than after it.
406Ids continue the one finding space — F-131 … F-350, with 8 adopted rather than minted because a Phase C verdict already named that family. A second scheme would need a mapping, and the mapping would be a third writer for one fact.
407Measured on the way, and it binds the release rule: 212 of the 228
obligations touch a file installed under vibedeps/, and all 212 already
differ from their installed copy — Phase B marked up the shipped packages in
place and that markup was never published. The difference carries no drift
signal and is not used as one; the consequence is that «fixed in the package»
and «the consumer reads the fix» are two different sentences.
408The largest release event is also an open question, and the plan does not
answer it. The ../flows/… family is F-136 (11 verdicts, 7 packages) and
F-145 (8 verdicts, 8 packages): repair fifteen snippets in fifteen packages,
or repair the boot compiler once so relative links are rewritten on compile.
The second is a host code change, therefore Phase E's, and it would close both
at a stroke. It goes to the owner with the release batch.
409And this file's own status line still says «PHASE A OPEN», three phases
later. It is left alone on purpose, and the reason is the first thing Phase D
learned about its own cost. Correcting it was tried and reverted: 11
evidence quotes in ev-W4a.json quote that line verbatim — ev-W4a verifies
at 872 refs and zero fiction before the edit, 854 and eleven after — and they
are the evidence base for campaign-plans' own status-line rules, which are
open obligations no wave has worked. Repairing the line as a side effect of
opening the phase would close a drift silently and rot the trail underneath
the verdict that found it. It is registered instead, and it closes with a
re-judge like every other obligation. Appending this LOG entry shifted 7
further refs by +60 lines; those are repairable and were repaired with
tasks/repair-refs.py --apply.
- 4102026-07-29 · the boot-link diagnosis was too strong by one PROP, and the
correction is the more interesting half. The entry above, and the commit
that carried it, said the readable repair «contradicts PROP-009's verbatim
and needs an amendment». That was written without reading PROP-035, and it is
wrong. The compiler is already a preprocessor and a linker. PROP-035 is
Status: IMPLEMENTED, extends PROP-009 explicitly, and calls itself «a real preprocessor + linker»;render_staticconcatenates the bodies atcrates/vibe-workspace/src/boot_artifacts.rs:259and then callsexpand_embedsat:268, under two tests — one of which asserts that text without directives is left verbatim (boot_artifacts/tests.rs:264). So «verbatim» describes the linker stage, coexists with directive expansion, and forbids only a rewrite of plain Markdown links.
411The directive vocabulary, and how much of it is used. #embed (macro
splice), #use (dependency edge), #source (contract→impl edge), @spec://
(mandatory in-place use), bare spec:// (discretionary) —
crates/vibe-spec/src/directives.rs:1-21, PROP-035 §7. Adoption over the
whole tree, host and packages: 0 #embed, 0 #use, 0 #source, and 11
@spec:// of which every one is documentation about the grammar rather
than a use of it. The linker shipped three times over and has never been fed.
412Three owner rulings, 2026-07-29, and they settle the family. (i) A
relative path to a specification is a spec bug, so the 69 links are a
defect in 27 package files rather than in the compiler; they take @spec://
where they are pointers and #embed where the target belongs in the lane.
(ii) A generated boot artifact carries no token budget — recorded at
PROP-009 ##ARTIFACTS-CARRY-NO-TOKEN-BUDGET
— which removes the only objection to #embed, and leaves the package's own
budget row owed the same scope clarification at its next release (filed then
as BACKLOG.md B-002). The «next release» half of that sentence was wrong
and was paid for on 2026-08-05: the owner's 2026-07-26 policy already had
package prose edited IN PLACE with no version bump, so the clarification
waited nine days on a release that was never coming. It landed as an ordinary
in-place edit. (iii) PROP-035 §10's link tables are not a
precondition and are filed as BACKLOG.md B-001: they are the vtable of the
§13 structural executor, a mode this project does not run, and an @spec://
address that costs a lookup is strictly better than the confidently wrong
path it replaces. No new compiler layer is built mid-refactor.
- 4132026-07-29 · the first route-(b) ruling, and the plans this campaign runs
were the ones breaking the rule.
flow:campaign-plans'##COLD-A-LITERAL-QUICK-START-BLOCKrequires a literal quick-start block in a campaign plan. The archive keeps it — 13 of 25 files inlegacy-spec/terraforms/carry the heading — and both live plans invibevm/vibespecs/terraforms/carried none, which is what the W4 verdict measured. Owner ruling: the rule is sound and the host was wrong to drop it, so the package does not move and the documents do. Both plans now carry one (§10 here, §12 in wave 1's), and every command in both blocks was run before it was written down — one had to be corrected for a Windows encoding failure first, because a quick-start whose commands do not run is the defect this campaign keeps finding, not a fix for it. The archive was not touched: adding a quick-start to a plan that has already executed would be inventing history rather than repairing a contract.
- 4142026-07-29 · waves 2–4 — the phase's central finding is a ratio, and it is not the one the plan expected. Across four delegated waves, 179 anchors were examined and 25 moved. The other 154 are §3.6 route (b): these are shipped normative flows, so most of what Phase C recorded as drift reads «the consumer does less than the rule asks», and the package is not the side that yields. A package moves only where its own sentence is false about something inside its own tree — its own bullets, its own summary, its own example, or a shipped sibling in the same namespace.
415That ratio changes what Phase D is. It is not mainly a document-repair phase; it is a routing phase that produces two queues for the owner and a small number of genuine package repairs on the way.
416The repairs that did happen have four recurring shapes, each closed in
three or four packages: a claim that flow:core-ai-native «defers to this
package from its next release», where the release landed days later and
deferred in neither document (campaign-plans, wal, redbook, and the
campaign-form pair); a commit-format rule mis-credited to
flow:git-atomic-commits, which disclaims it in its own boot snippet, found
three times including once inside the flow being mis-credited; a figure with
no record behind it (4–7/80, 74.8 %); and a lead sentence contradicted by
its own bullets («two forces reshape it EVERY RUN», over bullets that are
conditionals).
- 4172026-07-29 · three claimed absences were perimeter misses, and the third
nearly demoted a mechanism the consumer had already built. The campaign's
own law — a
not-foundis a fact about the search perimeter until the perimeter has been checked — was written after Phase C's C1 paid for it three times. Phase D paid three more in one session. A linter reported missing was installed and off PATH: withC:\opt\gotoolson it, the Go pilot printsfloor: all green (7 step(s) run, 0 disabled by policy), and the claim a worker had deleted as unmeasured was exactly true. A floor run rooted at a package was read as a verdict onresearch/go-demo. And BROWNFIELD's phase-gate anchor was demoted on «nothing captures a golden transcript», from a grep over one crate'ssrc/— while five transcripts sit at the host'sdiscipline/golden/,capture.sh:3names BROWNFIELD-PROTOCOL §6 as its own contract, andterraform/BASELINE.md:117applies §6 by name. The host had implemented the mechanism and cited the anchor being demoted.
- 4182026-07-29 · twenty-four diffs reverted by owner ruling, and the rule that
cost it. The first wave's batches were cut by
falsifier == "self"and not byclosure_route— the field written into the batch plan hours earlier for the sole purpose of answering «who approves this». 24 of the 28 obligations handed out sat onrelease,sync-from-codeorbuild-or-demote. Nothing was closed without approval, because no verdict moved; what landed was the right work in the wrong order, and the owner chose the full revert. Both rules are now §6.1 of the batch plan: a batch is cut by route first, and a demotion whose whole basis is an absence must name the perimeter it searched.
- 4192026-07-29 · the routing record, without which this phase cannot converge.
An anchor routed to the host is never repaired in the package, so it never
stops reading
drift. Left in prose, the registry could never empty, the next wave would re-derive the same answer, and the exit gate could not tell «not worked» from «worked, and the work belongs to the host» — the two things it exists to distinguish.run/state/routing.jsonis that record, one entry per anchor with its obligation and why, written by the boss at review time and never by a worker. The generator reports CONVERGENCE against it, and that is what §7's gate now measures.
420Two instrument defects were found and fixed by the work rather than by
inspection. Obligation ids were positional and shifted once, before
carrying them across regenerations landed — F-134→F-136 and F-142→F-145, both
already cited in this LOG and in the batch plan, where they named nothing;
five citations re-pointed. And carrying ids matched by symmetric Jaccard,
which a partial closure defeats: two of F-205's three anchors were re-judged,
the remainder scored 0.33, and the registry minted it a fresh id while filing
F-205 resolved with one of its anchors still drifting. Matching is now
containment.
- 4212026-07-29 · state at the end of the prose-edit route. Corpus 10 751
confirmed / 550 drift / 45 unverifiable — 94.8 %, from 94.3 % at the Phase C
gate. Registry 206 obligations; 397 of 550 verdicts still owe a package
repair, 153 are routed out, 60 obligations have nothing left owed. The
prose-editroute is drained outside the address family. What remains isbuild-or-demote(54 / 134, the boss's, and every demotion now re-verified against the host perimeter first),sync-from-code(52 / 176, owner approval per diff),release(17 / 59, owner before publication), and the 26-obligation address family whose tag decision the owner has given and whose publication he has not.
422Two queues now await the owner rather than the phase:
PHASE-D-RELEASE-QUEUE.md
— 17 release events in four groups, two of them needing a product decision
before an edit exists to approve — and
PHASE-D-HOST-OBLIGATIONS.md
— 53 obligations where the rule is sound and the host does not keep it, each
taking one of three answers and none of them «soften the package».
- 4232026-07-29 · wave 5 — eighteen claimed absences were false, and seventeen
were falsified by the host. This invalidates a class of verdict, not a
handful. The
build-or-demoteroute was re-verified rather than executed: 76 verdicts examined acrosscore-ai-nativeand the three language stacks, 18 absences did not survive, and 17 of the 18 were disproved by HOST artefacts — nine of them indiscipline/orterraform/.
424The cause is structural and is now
§3.7 of the batch plan:
these packages specify a discipline, the host is the project that adopted
it, and the artefacts that prove adoption live in the consumer because
creating them is what complying means. A search confined to packages/
cannot see compliance and reads every successful adoption back as a missing
mechanism. Since §3.3 closes a missing-support by moving a marker, each
false absence would have written «specified, not built» over a mechanism the
consumer had already built — a silent lie in the shipped surface, authored by
the campaign that exists to remove them.
425What was actually there: the golden transcripts, the conflict detection, the
REPORT and the intent reconciliation (F-151, five facts of six); the
LLM-as-proposer loop run end to end with 54 owner-approved proposals in
terraform/specmap-proposals.json (F-139); QUERY-PROPOSE-LINKS executed
with six affirmation commits behind it (F-152); BAND-3-ON-TRIGGER live in
this repository's own compiled boot lane (F-150); the prediction ledger,
complete (F-208, F-262); the specmark proc-macro at
crates/vendor/core-ai-native-specmark (F-277); the two live-chain tests in
both -mcp packages (F-214); the Go exhaustiveness linter installed at
C:\opt\gotools (F-184).
426And the six BUILD-ORDER verdicts, corrected as a set. They said the
catalog's numbered order «appears nowhere outside this document — not in any
stack's cards, not in a host crate, not in an xtask task, not in a campaign
plan». terraform/ is none of those categories and is exactly where it is:
terraform/adopt-v0.3/LOG.md carries it as phase headings, six for six,
position for position, pairings included — E · F+G · B+C · D · A+H · I
pilot-gated — and ##BUILD-ORDER-I's own «prototype and measure before» is
that «pilot-gated» verbatim. The verdict says in its own words that it was
restated to match its five siblings, so consistency propagated the
error. Five of the six sit on F-158, a sync-from-code obligation: a
re-judge that edits nothing produces no spec diff and therefore needs no owner
approval — only an edit would.
427State at wave 5's close: corpus 10 832 confirmed / 470 drift / 44
unverifiable — 95.5 %, from 94.3 % at the Phase C gate. By zone: host
99.9 %, ai-native 95.1 % (was 91.6), world 90.9 % (was 90.0).
Registry 181 obligations, from 228. 317 of 470 verdicts still owe a
package repair; 153 are routed out; 60 obligations have nothing left owed.
428Two operating rules were bought at full price and are recorded in §6.1: an
##ANCHOR inside backticks is a citation, not a definition (three
refusals from merge-verdicts.py, all correct), and merge-verdicts.py and
progress seal are never chained — a refused merge still lets the seal
vouch old verdicts against new text. A third was already written down and was
broken anyway: verdict JSON generated through an unquoted heredoc lost every
backticked identifier to the shell, and had to be rewritten and re-merged.
- 4292026-07-29 · wave 6 — §3.7 has a mirror image, and the discipline's second
adopter was invisible to every perimeter this campaign had drawn. The
remaining
build-or-demoteroute was re-verified rather than executed: six delegated batches, 31 obligations over 57 verdicts, cut by route first and by package inside it. 31 of the 59 claimed absences did not survive.
430The cause is one structure, and it is §3.7 turned around. That rule was written
against a search confined to packages/ that could not see the host. Wave 6's
verdicts made the opposite error: they scoped to the host's crates/,
vibevm/vibespecs/terraforms/ and campaigns/, and the project that falsifies them lives
inside packages/. vibevm/vibepacks/org.vibevm.fractality/fractality/v0.1.0/ is
not a document collection — it is a second complete project that adopted this
discipline, with its own vibe.toml, its own vibedeps/ carrying twenty-odd
installed flows, its own Cargo workspace, and six executed campaign plans. So
the invariant is neither «search the host» nor «search the packages»: the
perimeter must contain every project that adopted the discipline, wherever it
sits. Recorded at
§3.7 of the batch plan.
431What that one blind spot cost, by batch. campaign-plans +
comparative-research: 16 of 16 false — every form called «zero live
instances» (per-phase commit maps, the four-element phase, the runnable
acceptance script, the hash-to-subject ledger) is live in the specspace's
plans, which name Format: flow:org.vibevm.world/campaign-plans in their own
status lines. managed-blocks: 6 of 9 false — remove, recorded at the
Phase C close as one of the two canonical «verbs specified and never built», is
built, wired and round-trip tested there. Its paired half was re-verified on
the same widened perimeter and does not fall: qualified-naming's
KindMismatch has no error type and no check anywhere, its only trace a doc
comment at crates/vibe-core/src/package_ref.rs:428 asserting the validation
happens.
432Three verdicts were false on the perimeter their own text named, with no
widening at all: grep -rn 'Considered and rejected' ROADMAP.md spec/ returns
7, reported as zero; grep -rniE 'commits.by.meaning' spec/ returns the
host's own Rule 3 in the compiled boot lane, reported as empty; and
grep -rn 'Confirm\|user_attended\|assume_yes\|interact()' crates/vibe-workspace/src/
returns nine hits including a gate named consent_to_build, reported as
NOTHING. Re-running the verdict's own command is the cheapest re-verification
there is and it caught three.
433And two recorded figures did not survive re-measurement. The imperative-mood breach is 211 of 400 subjects, 52.8 % — not the recorded 144/400 — and the uppercase breach is 62 naive of which the large majority are identifiers, not
- 434The 400-commit window spans four days and is dominated by this campaign's own commits, so a figure over it must name its HEAD or it decays within the week.
435The wave's shape is still routing, not repair. 6 package edits landed — five §3.3 partial demotions and one correction — against 23 anchors routed out under §3.6(b). The demotions that did land are all PARTIALs, because a flat «not built» would have been false in the half that works: the mirror names the host and not the divergent commits; the licence summary has one clause built, one a marked exception (a CI listing filed and deliberately declined under a standing no-CI posture, which §3.6(c) says is not drift), and one built by nothing.
436The sharpest near-miss, and it is the argument for the whole re-verification
pass. ##INVARIANT-THE-ANCESTRY-GATE was about to be demoted for the host's
omission — and the gate is implemented, by this package's own fifteen-line
reference script (git ls-remote then git merge-base --is-ancestor). Only
the host's Rust port lacks it. Demoting would have printed «specified, not
built» over a gate the package ships in sh. Auditing the port against that
reference then turned up a real host defect, filed as BACKLOG.md B-005:
probe tests equality, not ancestry, so mirror --check reports a target
legitimately behind mainline as drifted.
437Two instrument facts. merge-verdicts.py accepted all 31 verdicts across
three slices with zero refusals — the first wave in this phase to do so,
which is what a batch cut by route and reviewed anchor-by-anchor looks like.
And measured at HEAD, 2 of the route's 59 anchors were already @spec/done,
so §3.3's named closure move — drop the marker — did not exist for them in
form; the route was assigned without consulting marker state.
438State at wave 6's close: corpus 10 863 confirmed / 439 drift / 44
unverifiable — 95.7 %, from 94.3 % at the Phase C gate. By zone: host
99.9 %, ai-native 95.1 %, world 91.6 % (was 90.9). Registry 171
obligations, from 181. 263 of 439 verdicts still owe a package repair; 176
are routed out; 78 obligations have nothing left owed. The build-or-demote
route is 23 obligations / 28 verdicts, from 33 / 59.
- 4392026-07-29 · the address family cannot be closed by editing a package, and
that changes who has to approve it. Measured over three lanes: the
../flows/…links dangle 0 of 70 inpackages/, 21 of 142 invibedeps/, and 75 of 75 invibevm/vibespecs/boot/STATIC.xml. The package is not the broken side. The boot compiler concatenates snippet bodies verbatim, so a relative path that meant<pkg>/spec/flows/…means the host'sspec/flows/…once compiled, and the host has no such directory. The defect is the form — a relative path cannot survive being moved and an@spec://address can — which is exactly why the owner's ruling puts the repair in the packages rather than in the compiler.
440STATIC.md is generated from vibedeps/, so a package edit reaches the lane
only through a bump and cargo xtask sync-engines. No address obligation
closes without publication, on any route — joined to the registry by
governing anchor that is 24 obligations, 47 of their 54 verdicts, 22
packages, of which only two sit on the release route and nineteen read as
ordinary boss-closable prose edits. One approval covers all of them.
441The repair is therefore prepared as a command rather than as 62 hand edits:
tasks/address-repair.py,
verified at 62 link constructs, 25 files, 25 packages, 62/62 addresses
resolving, 0 malformed against the PROP-035 §6 grammar, 0 residual ../flows/
after the rewrite. Read line by line, all 69 links are pointers — «Full
protocol:», «Full model:», «Grammar and forms:» — so the #embed half of the
ruling has no member in this corpus.
442And one decision is owed that the queue did not know it needed. F-240's
root-relative variant — a re-derive prompt opening Read spec/flows/<name>/ …
— is recorded in 2 packages and present in 17. The fifteen unrecorded ones
are not mis-judged: the instruction lives inside a fenced block, which
carries no anchor, so which of the prompt's claims got tested varied by worker.
The same ##re-derive-prompt-lead was judged drift where a worker read the
path and confirmed where one read the prompt's shape. Filed as BACKLOG.md
B-004. Publishing the two-package fix alone is what §4.5 calls not a closure.
- 4432026-07-31 · wave 7 — the whole
sync-from-coderoute re-verified without a single edit, and a third of it did not survive. The route is the owner's: he approves every spec diff. But a re-verdict that edits nothing produces no spec diff and therefore needs no approval, so the route was run as a re-verification pass with a no-edit rule at the top of all six briefs. The instrument confirms it held: across three merges, 19 files, 0 sealed, 0 refused, 19 already current — the verdicts moved and not a byte of text did.
444Of 171 verdicts examined, 47 were re-judged confirmed and 34 more anchors
routed out. By batch, the false count: core-ai-native 9/38,
addressable-specs+qualified-naming 11/25, managed-blocks+source-mirrors
12/30, the three stacks 13/45, the git family+tool-design-lessons 4/17, the
tail 3/16.
445The dominant cause is not mis-measurement, and that is the phase's second
structural finding. It is a real defect convicting the wrong sentence —
now §6.1 ##A-REAL-DEFECT-CONVICTING-THE-WRONG-SENTENCE. One batch found the
same fact, measured once, confirming one anchor and drifting another ten
times over, the drifting one almost always the summary whose own body rows
are confirmed; another found all three of its false verdicts to be a
sentence convicted of its neighbour's defect. The shape is mechanically
detectable and now is: tasks/summary-vs-body.py lists every ##SUM-… still
drifting over a body that is not, and returns 17 candidates at ratios of
67 confirmed to 1 drift, 58 to 1, 45 to 2.
446Three further named rules, each paid for. ##READ-FURTHER-BEFORE-SEARCHING-WIDER
— three of one batch's four false verdicts were settled by reading the subject
document further and searching nowhere at all, the sharpest being a fact
convicted on evidence its own document exempts twelve lines above.
##THE-CAMPAIGN-IS-INSIDE-ITS-OWN-CORPUS — a host-live count showed one hit
for every form, all of them inside this campaign's own plan, matching because
the LOG entry written the day before quotes those words in prose; and the
campaign moves its own measurements, a commit-subject breach shifting 1.2
points inside one batch on six commits of our own bookkeeping. And §3.7 gained
a third address: core-ai-native is simultaneously SPEC and ENGINE, a
workspace of five crates vendored into six siblings, and six of that batch's
nine falls came from scoping the search to «the crate» — the cheapest being
a run-twice-diff test reported missing that sits in the very file the verdict
cited, twelve lines below the line it quoted.
447Owner ruling mid-wave, and it voided a class rather than a row —
§3.8. The ai-native-lang packages are built first and foremost for
external consumers; go is a prototype specification deliberately unused
here and not to be used here; rust is the exception, because part of
VibeVM itself is written in AI-Native Rust. So §3.1's source 2 — «the host is
a living consumer and the honest test bench» — does not transfer to a package
whose audience is external, and eleven of the stacks batch's thirteen falls
are that ruling applied, ten of them one tool-count over research/ts-demo
pasted across ten anchors that describe tooling for consumers. Two findings
filed earlier the same day were struck by it, both wrong: Go skills absent from
the host's skill directories, and PROP-026 designating "go" unsupported —
which is a correct statement about the host's own dispatch, not a contract with
a package serving somebody else. legacy-spec/** was excluded from the
perimeter by the same ruling.
448And the wave found the phase's own unfinished repair. Wave 6's correction
to ##CODE-MARKS-WHAT-IT-IMPLEMENTS-THE-SPEC-WHAT-VERIFIES-IT did not
propagate to its own summary sixty-five lines below in the same file, which
still says Implements: markers plus Test: lines form a bidirectional graph
— and grep -rc '^Test: ' spec/ returns 0. A duplication defect authored
by the phase that exists to remove them, found by a delegated worker
re-verifying the boss's output, and filed rather than fixed because the fix is
an edit on this very route. It is group D of the new
PHASE-D-SYNC-QUEUE.md,
which §4 required and which did not exist until this wave produced diffs
needing somewhere to live.
449State at wave 7's close: corpus 10 911 confirmed / 391 drift / 44
unverifiable — 96.2 %, from 94.3 % at the Phase C gate. Registry 165
obligations, at 2.4 drifts each. 180 of 391 verdicts still owe a package
repair; 211 are routed out; 90 obligations have nothing left owed.
sync-from-code falls from 51 / 171 to 43 / 121 without one owner approval
being spent.
- 4502026-07-31 · wave 8 — the release route re-verified without a single edit, the boss's three unblocked verdicts closed alongside, and a strike-by-ruling turned out to be scoped by the wrong reason. The route is the owner's before publication; the same basis that ran wave 7 ran here — a re-verdict that edits nothing produces no spec diff — and the instrument confirms it held across all three worker batches: merges of 45 verdicts with 0 refusals, seal 1 sealed / 30 already current, the one sealed file being the boss's single intended package edit (below), not a worker's.
451Of the route's 40 never-re-verified verdicts (59 minus the address family's 19): 13 fell — 32.5 %, the predicted third — 3 routed out §3.6(b), 12 were restated on corrected grounds, 12 stand. The route is 10 obligations / 41 drifts, from 17 / 59; F-115, F-186, F-212 and F-219 left it entirely, their surviving halves single-package and re-routed to boss lanes.
452The falls' causes are the four named ones, and one is new in degree:
four of the stacks batch's five falls were falsified by the failing
verdict's own evidence list — F-115's go and rust verdicts each cite, by
path and line 1, the README they convict as missing; F-212's rust verdict
cites the shipped names its sentence already uses. Cost to catch: one cache
read. The rest: the string searched where the thing is a field (F-186 — «H4
is in no register» against four ATLAS records under refines:H4, the
H-series being the ledger's axis field, never a heading); a lead convicted
of its fenced neighbour's defect (F-240, both — the do-not-copy carve-out
sits two lines above each lead; B-004's counts corrected to 17 packages /
14 confirmed / 0 drift / 3 unjudged, and the fence repair changes no
verdict on any scope, because no instrument sees inside a fence); a
sentence convicted of a claim it does not make (F-219's campaign-plans half
claims subjects/ledger/hashes — kept by the fractality adopter: 8 phases,
3 ledgers, 58 hashes bound — while the row's reason was its sibling's); and
legacy-spec/ ratios voided by the owner's ruling. F-187 and F-213 fell
whole on §3.8/§3.7: the packages ship the skills their snippets name, and
discipline/golden/ is the adopting project's directory — the package's
own terraform skill creates it, this host (the one real Rust consumer) has
capture.sh plus transcripts, and the Go anchor never names capture.sh.
453The wave's structural finding: an obligation merged by shared anchor
carries per-anchor reasons, and a strike-by-ruling scoped by the row's
reason hits anchors the ruling never examined. §B.1's strike of F-189 was
aimed at «the host does not dispatch go» — the GO anchor's reason; the
rust and typescript verdicts always rested on PROP-026's own
##SUPERSEDED-TOPOLOGY / ##TCG-CRATE-DELETED, and the Go sentence is
false on its own named subject (vibevm, PROP-026) — the vibe-tcg
lockfile-dispatch topology is retired for every language, and the same
Go document states the new topology correctly seven lines below. So the
strike voided a ground and the verdicts survive on their own; the rule —
one cache lookup per anchor before any strike — is recorded in the release
queue §B.1. Три fenced ##three-processes-lead diagrams still draw the
retired topology with no anchor and no verdict — B-004's shape, flagged for
the same publication.
454A unit error in the queue's own restated figure, caught by arithmetic:
«716 commit bodies cite a spec:// URI» was a line count read as a
commit count — self-refuting, since a commit count cannot fall to the 579
measured later. At HEAD = 45cd30b0: 581 of 2 216 commits (735 lines),
by git log --grep="spec://" --oneline | wc -l.
455The boss lane closed five obligations in parallel, two by building.
F-241 — §3.3's revisit-when applied as written: the malformed-block report's
line numbers were computed and discarded in both reporters
(locate_block's spans; vibe-check's first_open/first_close), and both
now name each marker's line, the expected clause carries the zero-markers
half of the well-formed shape, and the Class-F fix tail names the action;
tests in both crates assert the lines (29 + 30 green). The same build closed
F-148 from code with zero spec diff — a sync-route obligation whose
reason's third charge («how-to-unblock absent on vibe check») itself
convicted a surface the drill does not bind: vibe check aborts nothing.
F-287 — wave 6's correction to ##CODE-MARKS-… re-judged at last (677
implements / 223 verifies edges, all authored code-side, ^Test: 0, 224
#[spec( sites — exactly the corrected sentence); the re-verdict was the
closure's missing half. F-175 + F-303 — the also-test's «mechanical» removed
from body and summary in one §3.6(a) self-correction; the test and the
reader's-call concession stand.
456summary-vs-body prints 8 candidates now, not 17, and all eight are
adjudicated: two already in the owner's queues (F-180, F-169's
bidirectional-graph half), one closed above (F-303), four coherent — the
summary drifts with its own body rows on one measurement (F-169, F-181,
F-162's contracts half, F-147) — and the changelog pair restated from the
string to the thing: grep '^## Changelog' finds 1, but 13 PROPs carry a
dated change record under numbered ## N. Version history {#history}
headings, 38 dated entries — 14 of 42 keeping the form, 28 keeping none.
The re-measuring session's own first grep missed the numbered headings — the
trap demonstrated itself mid-correction.
457Filed rather than fixed: BACKLOG.md B-009 — CLAUDE.md:191's
wind-down step prescribes the bare git push origin/main that
vibevm/vibespecs/boot/90-user.xml:35 and PROP-016:59 both deprecate as not the
standard rollout (surfaced when a recorded verdict used that line to demote
a package sentence the other two documents support); the H1–H6 roster
cited ~49 times corpus-wide and defined nowhere (owner:
core-ai-native/v0.8.0/spec/appendix/); F-153's unjudged twins
(##STACK-SHIPS-ITS-OWN-CARDS-PROJECTION ×3 and core's own boot snippet);
five inconsistently-judged word-identical siblings; and
typescript-ai-native-lang as the only one of 42 shipped versions with no
README.md in its history.
458State at wave 8's close: corpus 10 936 confirmed / 366 drift / 44 unverifiable — 96.4 %, from 94.3 % at the Phase C gate. Registry 158 obligations / 366 drifts, 71 resolved to history, one id newly assigned by re-clustering (F-354). Routes: release 10 / 41, sync-from-code 42 / 114, build-or-demote 20 / 24, prose-edit 86 / 187. 157 of 366 verdicts still owe a package repair; 209 are routed out; 90 obligations have nothing left owed. What remains of the release ask after re-verification: the address family's one publication, five stack corrections and two two-word counts behind the same gate, one which-side ruling (F-220's WAL-entry half), and B-004's seventeen-fence product decision.
- 4592026-07-31 · the four D9 rulings, executed the same session — and the
verdict-first rule for false confirms pays off twice. The owner ruled in
session (verbatim in the D9 harvest's
#rulings): F-188-rust ships self-contained without the PROP-031 citation (release batch); F-219 takes option B (the F-253 wording, landed a second time); F-115 takes option (a) — the TypeScript stack gained its front-door README, the only one of 42 shipped versions without one, tree-verified, arriving unjudged for the next mirror pass; F-245 takes §3.6(a) with the owner's own sentence, and no Phase Ewhen-vocabulary task is filed — a while-shaping-identifiers condition is not decidable at boot time, recorded so Phase E does not inherit an unimplementable ask. The three prose-edit rulings were applied and closed the same session, alongside the boss-route residues F-186, F-212-go and F-132 (+ its ts twin): merges 2+6+1 verdicts, 0 refusals; seal 5+1 sealed / 3 already current.
460The riders' boundary held by one cache lookup each — the wave-8 rule
applied in its first live test. conform-frontend-go.xml belongs to open
F-185 on sync-from-code and was not touched. The two false confirms (the
ts card's DL1-015, the Go GUIDE's gated_packages) were re-judged drift
FIRST and minted by the registry: the ts one clustered to F-132 (prose-edit)
and closed under it the same session; the GUIDE one clustered to F-166 on
the owner's sync route, so its two-word swap now waits in the sync queue's
group C instead of landing as an unapproved diff — the repair went
through the measurement, and the measurement routed half of it to the owner.
461State: registry 153 obligations / 361 drifts, 75 resolved to history; corpus 10 941 / 361 / 44 — 96.4 %. The release batch carries no open design choice — every remaining correction is drafted final (d8b + d9), and the owner's queue is the whole remainder.
- 4622026-07-31 · D10 — the host adopts the campaign-plans practice, and the
ADR census premise is withdrawn by its own proposal. Under the owner's
«сделай»: both plans gained the six flow forms (Phase 0 · safe stop ·
non-goals · risks · commit map · runnable acceptance — 12 blocks, 878 lines,
drafted by a delegated pass and boss-reviewed with the commit-map hashes
sampled against
git log), the live status line was refreshed from the three-phases-stale «PHASE A OPEN», and §8 now names the zone deferrals ledger it had contradicted. 21 of the 29 routedcampaign-plansanchors re-judgedconfirmed— the worked##COLD-A-LITERAL-QUICK-START-BLOCKprecedent at scale: the rule sound, the host now keeping it, no package edit. The 8 held back are honest: two at-close triggers, two status-block rows, the ledger-honesty pair, the standing-obligations summary, and «counts that reconcile» — blocked by the acceptance's own catch thatprogress checksees 260 files wheresummary.pysums 259. Registry 148 obligations / 336 drifts; corpus 10 966 / 336 / 44 — 96.7 %.
463The B-007 proposal landed and withdrew the census's premise. The
fractality «14 complete records, ~41 % adoption» are — by file — 8
carriers, all 8 vendored copies of the decision-records flow's own
template, protocol and worked examples; 0 authored (the specspace's own
blocks: 9, three-label dialect, none complete). So nobody in this tree
authors the four-field form except this campaign's own plans, the question
is again whether to adopt, and the costed options with the campaign's
recommendation (B + A′: four-field inside the owning section,
forward-only, backfill vibevm/vibespecs/common/ only, spec/decisions/ closed
explicitly) are in harvest/d10-adr-genre-proposal.md for the owner.
464Two instrument findings, both filed. vibe progress check --exhaustive
--campaign <zone> writes the named zone's scan state — a delegated
pass pointed it at the closed wave-1 zone and rewrote six state files
(+4 962 lines in its cache), restored loss-free from HEAD; filed B-010
(a check verb that writes, and a --campaign flag that selects state
rather than scope). And merge-verdicts.py issued its fourth useful
refusal class: 11 anchors filed under intuited documents were rejected
with «not an addressable anchor of this file» — the slice was rebuilt from
routing.json's true paths and merged 21/21.
- 4652026-07-31 · волна 9 — THE PUBLICATION. The address family closes whole,
the release batch lands, and the lane heals:
../flows/in the compiled boot lane goes 69 → 0. The owner's «Публикуй» executed through the probed runbook; the marker fork was ruled (а) — publish as is — after the owner caught what the (б) recommendation missed: naive stripping breaks cross-lane resolution (a dynamic module can cite an anchor that vanished with the cleaning), so stripping waits for an aliasing design (#use spec://… as SOMETHING), filed as B-011.
466The event is local, and no version was bumped: the lockfile has pointed
all 36 packages at this working copy since 2026-07-26, so
vibe reinstall --force re-fetched every pinned version from packages/
and regenerated the boot artifacts — 206 files under vibedeps/ +
vibevm/vibespecs/boot/ moved (+15 167 / −9 950), carrying Phase B's markup into the
installed lane as §3.5 said a re-vendor would. What was applied before
the re-vendor: the address transformation (address-repair.py --apply,
62 constructs in 25 files, 0 residual); the release-batch finals (F-153's
six spec/-prefixes plus the eight unjudged twins in the same lane —
the §4.5 arithmetic made partial publication a fresh duplication, and the
owner's B-004 ruling set the pattern; F-211's two per-binary OP-INIT rows;
F-188's three per-stack Motivations, rust per ruling (ii) without the
PROP-031 citation; F-189's three PROP-027 seam rows with the three fenced
diagrams redrawn in the same diff; F-190's two two-clause repairs;
F-251's two counts); and B-004 ruling (i) — all seventeen fenced
re-derive first lines now name the install slot instead of a directory no
consumer has.
467Verification, per the runbook: ../flows/ in vibevm/vibespecs/boot/STATIC.xml
0 (was 69), @spec:// 69; address-repair.py --verify — 0 links
remaining in scope; cargo xtask sync-engines --check green (51 pairs, 9
sets); tools/self-check.sh EXIT=0 over the published tree;
progress mirror refreshed (260 views). The re-judge went through the
instrument's own join: a naive marker-filter matched 104 anchors — more
than double the family — and was discarded; the honest join (repaired
diff lines → governing anchor via the mirror's fact spans) gave 55
governing anchors, 46 of them drift → confirmed (nine were already
confirmed on other claims of the same surfaces, B-004's multi-claim shape),
landing exactly at §A.1's «47 blocked on publication». Merges 46+16+2,
0 refusals; seals 22+18, 0 refused.
468State at wave 9's close: corpus 11 030 / 272 / 44 — 97.2 %, from
94.3 % at the Phase C gate and 96.2 % at this morning's wave-8 open.
Registry 121 obligations / 272 drifts; 84 of 272 still owe a package
repair; 188 routed out; 87 obligations nothing left owed. The release
route reads 2 / 4 and both rows' anchors are wholly routed — the route's
owed remainder is zero; F-136 and F-145, the two largest obligations the
phase opened with, are resolved whole. What still owes a package: the sync
queue's group B (23, unblocked, awaiting per-batch presentation) and the
boss-route tail.
- 4692026-08-01 · волна 10 / D13 — the three rulings execute, and the record
form the campaign preached lands in the host's own specs. The owner ruled
three times in one sitting and every ruling was executed the same day
(commits
c3b3fe19,e6f53d5d,eccb1499): B + A′ — the three-question criterion (Q1 condition · Q2 observation point · Q3 loser; R1–R3 pass, N1–N3 fail, every verdict citing its clause) landed invibevm/vibespecs/design/README.mdwhere the genre lives, with the forward-only rule, the##ROW-NO-DECISIONSgenre-table row and thespec/decisions/-is-never- created statement — and twelve four-field records were backfilled inside their owning sections from their own recorded prose (PROP-000 ×5, PROP-018 ×3 + theRationale:→Why:relabel, PROP-024 ×4; census 35Decisionlabels → 12 reopenable by the criterion; the two numeric thresholds the owner declined to invent are event-shaped until numbers exist). Партия 1a — PROP-014's nine «Specified, not built» annotations plus RUNTIME-TRANSPORT's real per-family tool names, with the ten unbuilt mechanisms filed asB-012(owner: «провести исследование, можно ли реализовать»). Health-audit adopted whole («Проведи всё это»):AUDIT.md's header carries the five clauses, DBT-0001 reconciled P1→P3 with the audit's later evidenced judgement winning, the skill installed (5 projections), the wind-down contract now points atAUDIT.md's active subset in all three instruction files, and the A–D inventory is scheduled at the phase's exit gate. Merges D13: 30 + 10 confirmed, 0 refusals.
470The tail the session left, and what it turned out to be. progress
seal refused 4 of the 5 record-bearing paths and the wind-down recorded
the guess «the new ##record anchors changed the anchor sets». The
next-session re-run (mirror → seal → read) found the true cause one notch
simpler: the refusals were 51 brand-new record anchors carrying no
verdict at all (10 + 8 + 11 in the three PROPs, 22 in
vibevm/vibespecs/design/README.md — the criterion's own units), and seal refuses a
file that mixes vouched and unjudged markers, which is its safe mode
working as designed; the package-side PROP-014 was already sealed against
its bytes. The 51 were judged boss-side after a referent-by-referent
verification (97 checks: every cited anchor resolves — including
#NO-SEPARATE-ADR-DIRECTORY living in the flow's boot snippet, not the
protocol, and {#shippable-tree} being a heading anchor; every quote
verbatim against its source down to two sanctioned adaptations, a
case-adapted «Document…» and a number-adapted silos clause with the anchor
cited adjacent; spec/decisions/ absent; the genre-map mutability rows
exact), merged as D14: 51 confirmed over 4 files, 0 refusals, and
sealed clean — 4 sealed, 0 refused. The registry regenerated with
nothing new minted: the records the campaign wrote about the tree hold
against the tree.
471State at wave 10's close (HEAD 22d6ff7f + this entry): corpus
11 121 / 232 / 44 — 97.6 % of 11 397 (the +51 is exactly D14; wave 9
closed at 11 030 / 272); registry 108 obligations / 232 drifts;
CONVERGENCE 73 of 232 still owe a package repair, 159 routed out, 77
obligations nothing left owed, 5 partly routed. The owner's queue is
unchanged and is the whole remainder: sync group B партии 1b–1d
(F-146 ×5 + F-206 ×2 ENGINE-CONFORM, F-159 ×5 LEDGER-INTENT, F-207,
F-263 — texts final in harvest/d7a-core-sync-reverify.md), the d12-adr
§3.13 ##SPLIT-HOST-POSTURE carve-out (35→36), and the build-or-demote
tail (~17 of 21). The health-audit 16 are NOT in the queue: «Проведи всё
это» closed them by adoption — every health-audit file reads 0 drift in
the cache, the ev refs carry the ruling verbatim.
- 4722026-08-01 · волна 11 — the owner drains his whole queue in one sitting,
and the per-anchor rule catches a strike-by-ruling before it lands. The
full decision package presented in plain language (his format feedback of
the same day applied: essence first, spec specifics as supplementary
material) came back ruled end to end. Партія 1d applied — F-207's
amendment sentence now says which thirds of the brownfield edge model ship
(the
disputespairing is a first-class field, not «a doc comment»; the freeze and the coverage math annotated in the sanctioned form) and F-263's front door stops claiming «prompt content only» over five authored library crates; both re-judged and sealed (D18). Партія 1c routed to research instead of edits —BACKLOG.mdB-022, F-159deferredpending it; партія 1b's two frontend rows likewise → B-023 (its other five corrections remain presented, unruled). The carve-out executed as (ii) — census 35→36:##split-host-decision/-why/-rejected/-revisitland at PROP-000 §7 carrying the owner's updated posture verbatim in substance (GitHub leads both surfaces; GitVerse supplementary — full source mirror plus deliberately-published-to registry storage, never blanket-mirrored; the leading-role half re-opens only by the owner's notice, the same-day B-015 pattern). The build-or-demote tail closed as owner-ruled deferrals — 15 rows answer (б) with their host debts named inPHASE-D-HOST-OBLIGATIONS.md#rulings-2026-08-01; F-351 closed outright (the wind-down's step 2 says «Rewrite … wholesale» in all three instruction files — the B-009 shape, second run); F-230 split per-anchor: the enforcement anchor closed by the (в) exception now recorded at PROP-000##ATTRIBUTION-ENFORCEMENT-EXCEPTION, and the one-place anchor — whose cached reason is a different defect (ten restatements, two drifted, a dead «§12.1» pointer) — was not closed on that ruling, per##WAL-C-STRIKE-PER-ANCHOR, and staysdeferredwith its own debt. B-024 filed from the owner's own question (two tombstones, one concept:retiredvsvoid). Merges D18+D19+D20 = 2+2+5, 0 refusals; seals 4 + 1 already current.
473State at wave 11's close (commands at this HEAD supersede): corpus 11 147 / 228 / 44 — 97.6 % of 11 419; registry 105 obligations / 228 drifts — 17 deferred by owner ruling, 88 open; owed 71 of 228, every one on the owner's sync route; F-207, F-263, F-351 resolved to history. The owner's remaining queue: партія 1b's five unruled corrections, and the sync queue's group C and beyond.
- 4742026-08-01 · волна 11, второй заход — партія 1b's five rule themselves
into two edits and three builds. The owner ruled the re-presented five
(problem/options/recommendation form): item 3 (а) — the crash fact now
describes the built hard-error probe and annotates the unbuilt
skipped-status; item 7 (а) — the closing rule takes the exact form its
four siblings took under the group-A ruling, one rule one form in five
documents (both applied, D21 merged 2, sealed 1/0). Item 5 → B-025
(planned): downgrade-not-suppress — the owner's ground recorded verbatim
(visualisation tools need everything visible; suppressed findings vanish
from the IR); item 6 → B-026 (planned, high priority): SARIF ingest —
foreign linters' diagnostics become facts. Item 4 became a question, not
a ruling (what does specmap track; are facts addressable; how do the two
maps cooperate) — answered in chat, the trait-signature correction stays
presented and unruled. Item 7's own follow-up question became B-027:
the «Specified, not built» facts carry markers inconsistently (@status:spec/done
vs @status:impl/done — партія 1a's own mix), the owner's guessed
@impl/plannedexists in the grammar as@impl/plan, and the proposed audit rule (not-planned → @status:spec/done; planned-with-backlog-entry → @status:impl/plan) waits for his word before the sweep. F-206deferrednaming B-026; F-146 stays open on the one unruled item. Registry 105 / 226 — 18 deferred, 87 open; owed 69, every one on the sync route.
475Third sitting, same day. «Пока просто поправь формулировку» — item 4
applied as D22 (the quoted trait signature now matches the shipped
finding.rs:51-56, with the impossible specmap parameter explained by
the separability seam), which makes F-146 fully owner-ruled → deferred
(two anchors on B-023's research, one on B-025's build). Group B is
drained. And the lifecycle question graduated: B-024 raised to
planned — the owner's «свести стадии жизненного цикла в specmap к
аналогичным в progress» fixes the direction (derive from the host's
markers; only disputed has no analog), the research narrows to the
mechanics. Registry 105 / 225 — 19 deferred, 86 open; owed 68, every one
on the sync route. Next presented: the sync queue's group C singles
(F-180's one-clause-in-three-places, F-166's three), group D (the
campaign's own summary debt, inside F-169's four), and F-169's §3.6(c)
pair riding with F-147's twins.
- 4762026-08-02 · группа C открывается — F-180 закрыт одним диффом в трёх
местах, а два черновика возвращены владельцем на перепроверку и
перепроверка меняет рекомендации. The owner's repl-policy phrasing
(«main + теги + специально заявленные ветки») is exactly the prepared
qualifier, applied to all three carriers of the unqualified «full history»
(the summary, the offboarding bold, the protocol's vanish-safety bullet) —
D23 merged 3 (one drift→confirmed, two re-vouches of amended confirmed
anchors), both files sealed, F-180 resolved. His two challenges both
paid: (2.1) the shipped engine reads exactly one key — the
Rust-flavoured
gated_crates(config.rs:44,deny_unknown_fields, so the Go-idiomatic word errors loudly) — and the three Go docs now disagree two-against-one because the D9 correction itself wrote the Rust word into the Go skill; the honest menu is document-the-shipped-key now + an engine-side neutral/per-language key as a backlog build. (2.3) the tier vocabulary (T-lex/T-syn/T-sem) is used across the live slot — the MISRA guide even sketches the future rule-registry column — and defined nowhere: the H-roster shape again; the recommendation flips from strip-the-parentheses to add-a-legend-anchor and re-judge, and the W2-era verdict is recorded as the capability/practice misattribution it was. (2.2) answered on the §3.8 bench: the claim fails on the package's own rule roster (three rules, none parses the assertion), not on host non-usage — and the Rust gate carries no such rule either, so the promise is aspirational family-wide. B-028 filed high-priority (the package publishes a subset of the URI grammar the host implements). Registry 104 / 224 — 19 deferred, 85 open; owed 67, every one on the sync route.
477The rulings landed the same day, and F-166 closed whole. 2.1 (а)+(б):
both Go docs now name the key the shipped engine reads, with the honest
parenthetical, and the engine-side neutral/per-language rename is
B-029 (planned); 2.2 (а)+(б): the assertion fact carries the sanctioned
annotation on the §3.8 bench, and B-030 (planned) builds the Go check
and surveys Rust/TS for the same promise-vs-gate gap — the owner's own
extension; 2.3: the owner-confirmed @fact:TIER-VOCABULARY legend landed at
the frontend table and TWO-TIERS re-judged confirmed — the W2-era
taxonomy-convicted-of-a-missing-enum misattribution falls with the
definition in place. SUM-THE-URI-SCHEME confirmed per the wave-7
recommendation. 3.2 became the owner's own architecture direction:
B-031 (planned) — the root project takes a fully-qualified name
(his word: org.vibevm.core), the resolver reads vibe.toml addressing
everywhere including the root, the host exceptions die with the short
notation — and the segment family (F-169's two rows, F-147's twins)
closes through host conformance when it lands. Merges D24+D25 = 4+1
confirmed, 0 refusals; seals 4/0. Registry 103 / 220 — 19 deferred, 84
open; owed 63, every one on the sync route. Awaiting the owner:
SUM-THE-BIDIRECTIONAL-GRAPH's «применяй» (his 3.1 question answered in
chat: the graph lives in specmap.json + the code-side tags; the user tags
code, never writes Implements:/Test: prose).
478The «применяй» came, and the boss lane drained what needed no one.
Group D's summary fix applied and re-judged (D26); F-169 deferred — its
two segment rows ride B-031 with F-147's twins, consistently. Then the six
wave-7 re-judge recommendations that involve no edit merged as D27
(F-147's three: per-module numbering with five PROP-001s coexisting, the
never-read premise with no instance, the one-to-one prediction read as
fulfilled; F-162's three: «Version history» is the changelog rule
practised under another heading — 15 of 42 PROPs, 33 dated entries — the
tombstone «2 of 2» falsified by PROP-029's three pointers, and the summary
inheriting). Corpus 11 163 / 213 / 44 — 97.7 %; registry 103 / 213 —
20 deferred, 83 open; owed 56, every one on the sync route (no row fully
resolved this pass — the six confirms shrank rows, F-147 and F-162 stay
open on their presented remainders). Presented
and awaiting the owner: F-162's two graph-anchor texts (+ the NO-TOOLING
rider applied in the same pass), F-147's ROW-HOME cell with the
two-flows-one-home question (FEAT-* 0 live instances vs 8 live plans —
practice has chosen), and the five dangling PROP-043 anchors as a
host-fix candidate.
479All three ruled the same day, and the owner's question out-diagnosed the
presenter twice. F-162's pair + the NO-TOOLING rider applied and merged
(D28) — F-162 resolved whole; ROW-HOME's cell now names both homes per
answer (а), F-147 fully ruled → deferred (its three segment anchors ride
B-031), and the granularity-protocol extension he dictated (ask the user;
FEAT files as addressable units composed into plans; big features only)
was B-032 (not elementary: a new norm across two packages) — built
2026-08-06 and the row closed with it: the carrier criterion lives in
flow:addressable-specs's #what-goes-where beside the row that already
named both homes, the composition half in flow:campaign-plans §8.
His agent-navigation question landed in B-018 as the canonical
acceptance query («which test verifies this rule» — CLI and stack-MCP
answer it today per checkout; vibe's own MCP cannot, which is exactly
B-018 part (i)). And the dangling-anchors framing was WRONG the way he
suspected: the three lines are fact-anchored already (##CMD-REPORT/-SEAL/
-WEAVE, judged confirmed) — the dead half was the {#report}-style
pseudo-anchors beside them, heading syntax on list items that no reader
registers, and the code cited the dead aliases. Fix executed in his
direction: the five code tags now cite the live fact anchors
(#CMD-REPORT/#CMD-SEAL/#CMD-WEAVE; cargo check green), the four
trap-tokens removed from PROP-043, and the five dangling edges die at the
next index regeneration (B-014's question). Corpus 11 166 / 210 / 44 —
97.8 %; registry 102 / 210 — 21 deferred, 81 open; owed 54, every one
on the sync route.
- 4802026-08-02 · ситтинг предъявлений — очередь оказалась на одну девятку
короче, а стройки берут верх над смягчением. The sitting opened with the
standing panel (
self-check.shEXIT=0, re-run after the string-only tag edits) and a preparation find: the queue line «F-132's nine await texts» had been stale for two checkpoints — партия 1a (eccb1499, D13's +10) applied and re-judged the nine + RUNTIME-TRANSPORT already on 2026-08-01, and the queue had quoted the harvest's pre-1a «NOT APPLIED» snapshot instead of the registry. Caught by taking every queue item fromrun/cache.json+ the generator before presenting; WAL/CONTINUE repaired (5223ea2e). The lesson is##WAL-C-DURABLE-CITATIONSfrom the other side: the owner's queue is derived from the registry, never from a harvest snapshot. The presentations then went out twice — the first draft bounced off the owner's format bar, refined the same sitting and binding forward: essence in plain language first, then the exact technical names (settings, files, behaviours), precision never lost; spec jargon only as appendix.
481The rulings came back builds-over-softening, end to end. F-185's three
Go-frontend promises stop being false by the engine growing to them:
B-033 (the dedicated seam-error rule; the owner's «имеет ли смысл —
или особенность языка?» answered: the rule architecture is neutral, only
the detector is language-shaped, so a dedicated id is sensible and cheap —
detection already ships as the census kind), B-029 enriched («обогатить
это обещание … расширить или улучшить то, что мы сохраняем в conform.toml»
— the entry grows from a key rename to the per-language config surface),
B-034 (the gated-or-exempt invariant implemented for Go and TS —
«похоже на задачу»), and B-035 (the parity audit, carrying his
principle verbatim: support for other languages — especially TypeScript —
must not be weaker than Rust without a recorded reason). His frame for the
family: «По сути мы не можем писать на Typescript и Go пока не поправим
вот это.» The first parity pass ran in-sitting: TS has no REQ-citation
check at all (five unsafe census kinds, none about seam errors, against
its guide's own prescription), the invariant runs nowhere but Rust, and the
TS docs are honest about it — the weakening is engine-side, undocumented.
F-132's residual anchor took answer (1) — the host debt «проставить
spec-метки в schemas/specmap.jtd.json» recorded with companions B-013 /
B-019(а), «сделать как будет возможность». F-218 deferred onto B-011,
raised to Самый Высокий Приоритет and enriched with the owner's design
directions (rename-on-splice with every reference staying valid, the
dynamic-STATIC.md loading case, qualified-rewrite at materialization, the
C++ ADL analogy, #use spec://… as X + @!X): «От этой вещи зависит как
вообще работает загрузка, насколько детерминированно и хорошо». Rulings
recorded in PHASE-D-HOST-OBLIGATIONS.md#rulings-2026-08-02-2; statuses
flipped in run/state/obligations.json, registry regenerated.
482State after the sitting (commands supersede): corpus unchanged 11 166 / 210 / 44 — 97.8 % (no verdict moved — deferral is bookkeeping, not repair); registry 102 / 210 — 24 deferred, 78 open; owed 54, every one on the sync route. Still pending the owner: F-217's second anchor (the hand-copied CLAUDE/AGENTS/GEMINI triple — reconciler check vs recorded exception), F-285's «снять обвинение» (temporal-reuse rule convicted of a simultaneous compile collision), and B-027's sweep rule. The backlog stands at B-035.
483Third exchange, same sitting — the two halves close, one by a build.
The owner ordered the triple check built, algorithmic and never an LLM
judgement — landed the same hour as tools/self-check.sh step 0c: a
full-file byte-compare of CLAUDE.md / AGENTS.md / GEMINI.md that
fails the floor naming the diverging pair (full-file deliberately — the
<vibevm> block is generated identically into all three, so any
divergence is a hand-edit that missed a sibling). F-217 → deferred,
both halves now built or planned. And F-285 came off («сними пока.
Угроза реальная, но пока это не приоритет») — batch D29 re-judged the
temporal-reuse anchor confirmed (merge 1/1, seal already current, no
bytes moved); the real half of the threat is precisely B-011's subject,
already at highest priority. State after the third exchange (commands
supersede): corpus 11 167 / 209 / 44 — 97.8 %; registry 101 / 209 —
25 deferred, 76 open; owed 53, every one on the sync route; F-285
resolved to history (127 total). On the owner: B-027's sweep rule,
then the registry's sync-queue remainder.
- 4842026-08-02 · четвёртый обмен — the build-first pivot: правила не
выключаются за неиспользование, система развивается. The next portion
(F-154 / F-161 / F-167 / F-181, 15 anchors over four documents) came back
with a standing re-ruling: for discipline mechanisms the annotate-absence
default dies — «Я против чтобы ты выключал правила только потому, что
они нигде пока не используются … нужно это спроектировать и потом
построить … Система не заморожена, она должна развиваться», and of the
host's own code: «похоже на причину по которой нужно всё отрефакторить
и начать их применять». Executed the same sitting: F-154's five →
builds B-036 (middle-third position check) / B-037 (REQ-citing custom
lints: dylint + typescript-eslint) / B-038 (pending rule cards R-060 +
closed-vocabulary-naming, with the Rust computed-name design question) /
B-040 (host seam refactor survey), row deferred, texts stay as targets;
the two TS false-confirmed twins repaired verdict-first (D30 → drift),
their cross-file cluster split off as F-355 (the generator inherited
one id into two clusters — instrument defect filed as B-043, hand-split
same day), routed onto B-036/B-037, deferred. F-161's R-001 pair →
B-039 (mount FlagSites on the TS gate), row open on its two unruled
anchors (first-source 74.8-контрадикция + cross-ref fix — re-present).
F-167 — «Я в целом согласен», applied as D31 (merge 2/2, seal 1 +
1 current): the quantities fact now names the instrument and carries the
owner's far-future note verbatim (B-042 accepted: measurement corpus
LLM- or fuzzer-generated, not now); the gopls step names the env override
first, matching the shipped resolver. F-181 — option (1): three
anchors joined to the F-204/B-005 ancestry family in routing.json, row
deferred, nothing edited. B-041 filed — the owner's development-map
directive verbatim; the map is the boss lane's next work. Zone mirror
refreshed before the merges (
progress checkclean, 260 files).
485State after the fourth exchange (commands supersede): corpus 11 167 / 209 / 44 — 97.8 %; registry 102 / 209 — 28 deferred, 74 open; owed 41, every one on the sync route (the +1 obligation is F-355's split, not new work; owed fell 53 → 41 by twelve routings and two D31 confirms, offset by the twins' two honest drifts: 53 − 2 + 2 − 12 = 41). The backlog stands at B-043. On the owner: B-027's sweep rule, F-161's two re-presentations, the F-215/F-281 families, then the registry remainder.
- 4862026-08-02 · пятый обмен — карта одобрена и переезжает к бэклогу, а
рамка кампании восстанавливается словом владельца. The B-041 map
drafted on «да, продолжай» (
61db0918,spec/design/tooling-development-map.md: four planes, the dependency spine, waves А–Г, ten forks, five milestones) came back approved — «Да, мне нравится этот документ» — with two directions, both executed the same sitting. (i) Integrate with the backlog («или положить рядом, или сделать отдельным разделом»): the map moved to the repository root asTOOLING-MAP.mdbesideBACKLOG.md, which gained the#mappointer section with the wave digest; the rootROADMAP.mddiscovered in the way is the product milestone roadmap (1 071 lines, living since April) — untouched, and the map now states in its companion line that the two documents do not compete; thevibevm/vibespecs/design/index row repoints at the root as the genre's one out-of-directory member. (ii) The frame: «мы сейчас находимся в процессе более большого рефакторинга… нам надо действовать в рамках этого процесса, а то чего не хватает — отложить на потом» — recorded verbatim as the map's##frame-line: the waves are the shape of the backlog's drainage, the campaign's phases (E/T/F/G after D's exit gate) are the vehicle, and nothing starts from the map. Pointers repointed everywhere (B-041, WAL, CONTINUE, README index);vibe checkclean over the moved tree.
- 4872026-08-02 · шестой обмен — четыре рулинга одним сообщением, и свип
B-027 наконец бежит. «1 и 2 — согласен, применяй; 3 — …положить
куда-нибудь в роадмап и больше не кошмарить меня вопросами "почему нет
замеров"; 4 — тест на зомби лучше написать». Executed whole:
(1) the TS GUIDE's cross-reference names «Staged ambition» by section
title, and the 74.8 % figure fell to ATLAS DR2-012's canonical pair
(75.3 %/70.2 %) in both carriers — the first source's
CONTRADICTION-MAPC-4 and the projection now agree (batch D33, 6 confirmed over 5 files); F-161's last two anchors confirmed → row deferred (B-039), F-284 resolved, F-167 deferred (its target annotated, its no-zombie anchor routed). (2) the B-027 sweep under the approved rule: 48 annotated facts inventoried over 16 package files, 19 flipped to@impl/plannaming their build entry in-text («Specified, not built (→ B-nnn)»), 29 correct as they stood (research-pending and parked entries do not count as planned — LEDGER-INTENT's trio and RUNTIME-SECURITY stay@spec/done), each flip re-judged (D34, 19/19 confirmed, 0 refusals), six files sealed; the host tree carries no instances (grep). (3) the no-measurements standing answer recorded in all three stacks' complete-targets (naming their own bench harness and B-042), inTOOLING-MAP.mdand in B-042 itself — the question is closed for good. (4) B-044 filed («тест на зомби лучше написать»; the fractality pod probe is the in-tree pattern) and the claim's six copies unified: three false confirmeds repaired verdict-first (D32 — with the per-anchor catch that the ts oracle's claim lives inRUST-SIDE-OWNS-TERMINATION, not the harvest table'sSHUTDOWN-…-EXIT), five open copies routed onto B-044, F-281 deferred. Mirror before every merge; merge and seal never chained.
488State after the sixth exchange (commands supersede): corpus
11 169 / 207 / 44 — 97.8 %; registry 101 / 207 — 31 deferred, 70
open; owed 34, every one on the sync route; resolved to history 128.
The backlog stands at B-044; B-027 is done. On the owner: one
mini-question (the rust LARGE-WORKSPACE ceiling — 45 s shipped vs
< 15 s posted vs 60 s asserted; the 60→45 repair in the Go twin's
already-taken form), then the registry's sync-queue remainder.
- 4892026-08-02 · седьмой обмен — потолок «да» (D35), порция
F-210/F-178/F-199, и OracleRegistry уходит в раскопки вместо правки.
The ceiling executed (D35, F-215 resolved, 129). The next portion
went out per the refined format and came back: F-178 = (1) —
B-045 filed (kind-validation + short names for
uninstall/updateover the lockfile-first resolver + four mis-cited §2.4 call sites), the «stated once» self-description fixed (D36), resolver anchor routed, row deferred, owed 0; F-199 = (1) — the boot-surface marked exception recorded at PROP-000##ATTRIBUTION-BOOT-SURFACE-EXCEPTION(boot surfaces carry the four-rules digest by design; §12 the record; the invariant echo names its source; strays are defects), all three anchors confirmed-with-exception (D36 ×2, D37), row resolved whole (130 total), F-230's debt narrowed to the dead-«§12.1»-pointer half (verified dead at HEAD). F-210 — not applied: the owner challenged the ground and asked whatOracleRegistrywas, why it was deleted, whether to bring it back — investigated: the deletion is his own MCP-SOVEREIGNTY resolution (2026-07-07, four-resolution mandate + themcp-kind amendment; commit36461ba8deletedvibe-tcgwhole, ~1082 lines that existed only because the server lived outside the package slot; the tool grammar stayed normative and the per-family servers ship the same tools). The prepared texts rest on that recorded resolution + the package's own tests — never on usage-absence — and wait for his word. State (commands supersede): corpus 11 174 / 202 / 44 — 97.8 % (ai-nativecrossed to 98.0 %); registry 99 / 202 — 32 deferred, 67 open; owed 29; resolved 130. The backlog stands at B-045.
- 4902026-08-02 · восьмой обмен — история прочитана, ложится
архитектурное направление, F-210 осушен. The owner's read of the
OracleRegistry history came back as a direction, not a revert: MCP
servers as the foundation is the wrong framing — the shared logic
lives in a library/crate and CLI + MCP are thin surfaces over it («у
нас постоянно недостаточный уровень абстракции, всё прибивается
гвоздями»); the mcp packages stay; and the multi-language composition
story gets planned immediately — autodiscovery over installed
AI-Native languages, autonomy never broken. Executed: B-046
(composition layer — three options with a recommendation to start
from the vibe-served discovery roster, the rails being the lockfile's
[[mcp_server]]/[[binary]]tables; the autonomy law verbatim) and B-047 (the surface norm + the nailed-down audit; the stacks verified already conformant — bridge crates as shared logic, MCP descriptions relaying CLI verbs; the host side is the audit's subject, B-018's MCP half the first known gap) filed; the map gains both in plane 2.4 and fork 11; fork 10 marked taken. F-210 applied as D38 and resolved — the one-client anchor carries the full history with@impl/plan (→ B-046), the goldens anchor the honest package-bench annotation@spec/done. State (commands supersede): corpus 11 176 / 200 / 44 — 97.9 %; registry 98 / 200 — 32 deferred, 66 open; owed 27; resolved 131. The backlog stands at B-047. On the owner: the sync-queue remainder (14 open rows), presented per the refined format.
- 4912026-08-02 · девятый обмен — последняя порция очереди уходит девятью
рулингами, и в ней прячется одна стройка. The nine-document portion
came back ruled whole: 1/2/3 «согласен», 5 «согласен» (токены — очень
далёкое будущее), 6/7/8 «пересуд» (+«семёрка»), 9 — the build order
(«хардкод убрать, сделать нормально, недостающую функциональность
доделать»), 4 — «подумай и вернись рассказать» (returned as the
schema-home analysis, below). Executed: the pin build — vibe-cli
gained
build.rsderivingVIBE_MSRVfrom the workspacerust-version(the cargo-canonical MSRV home the compiler itself enforces), the two hard-coded1.93.0died intoRUST_PIN, the tools-table test asserts pin-extends-manifest (3/3), and the S6 lesson synced to the built truth. Twenty verdicts moved in three batches (D39 verdict-first ×4 — including the fourth floor-gloss family member found mid-pass — D40 world ×5 with F-309's two new roster anchors judged, D41 ai-native ×10), eleven files sealed, 0 refusals after the pass met the REALvibe progress mirror(the per-file views underrun/mirror/— the D14 lesson's «mirror» is this subcommand, notprogress check; F-309's new anchors were the first anchor-set addition to hit it, and merge-verdicts' refusal named it). Rows resolved: F-114, F-157→(routed set), F-216, F-270, F-273, F-275, F-280, F-309 — 138 total. The redbook manifest now carries the standing edition rule (next roster change bumps the version). A bulk deferred-flip of 58 routed-out rows was made and reverted within the hour —deferredmeans owner-ruled; the flip conflated boss-side routing records with rulings, bought the gate nothing (it reads owed + rulings), and is recorded as the near-miss it was. State (commands supersede): corpus 11 187 / 191 / 44 — 97.9 % over 11 422 (+2 units — the roster anchors); registry 91 / 191 — 32 deferred, 59 open; owed 18 = 17 on owner-ruled build deferrals + F-279's 1; resolved 138;ai-native98.3 %. On the owner: the F-279 schema-home ruling; then the exit gate.
- 4922026-08-03 · фаза D закрывается — рулинг F-279 исполнен, гейт
пройден, панель выросла на шаг. The already-given ruling («вариант
(а) + отдельный пакет org.vibevm.ai-native/jtd-codegen») executed
whole, no owner question needed: the schema moved home
(
schemas/specmap.jtd.json→core-ai-native/v0.8.0/schemas/, a canonicalspecmap.example.jsonbeside it whose lagging-pin edge produces exactly the suspect entry it shows), both xtask codegen routes re-targeted off the deadrust-ai-native-lang/v0.5.0slot onto the engine crate —cargo xtask check-codegenbyte-clean, B-013 closed on all four fix-shape coordinates (a6bb261e); the stack README's ships-line tells the post-move truth, re-judged D42: confirmed 1/1, seal 1 — F-279 resolved, 139 to history (ad3547f1,1ac1734e); the binary-payload fork dissolved on facts — the exe was never in git (tools/.gitignorelaw), sotool:org.vibevm.ai-native/jtd-codegenships the provisioning recipe, not the binary (b4c48aa0; the package README marked in house grammar joined the observed corpus — 261 files, exhaustive clean); the hosttools/jtd-codegen/README.mdbecame a pointer (one pin, one home); B-013's backlog row flippeddoneand the map's plane 2.3 re-drawn per its supersession rule (7e1bdf74). The panel's own catch en route: the regenerated engine tree left six vendored copies behind —sync-engines --checkrefused on 12 drift items, the write-through carried the fix to every family member (7441e7e9), §4.5's «fix landed in one consumer» closed by the gate that exists for it. The exit gate, measured: self-check EXIT=0 (twice — before and after the audit's in-run fixes; the second run includes the new step); exhaustiveprogress check --campaignclean, 261 files; per-namespace summaryhost 4552/0/3 — 99.9 %·ai-native 2669/27/19 — 98.3 %·world 3967/163/22 — 95.5 %(src=[1] 269, 6.5 %), ALL 11 188 / 190 / 44 = 11 422 — 98.0 %; CONVERGENCE 173 routed / 17 owed of 190 / 0 partial, the 17 on six deferred rows each naming its build and its ruling (the ledger's#close-2026-08-03table);routing.jsonnon-empty;baseline.jsonwritten per A6 (2 221 units with verdicts). Arithmetic per §7-gate check 3: D42 carried 1 verdict, drift 191 → 190. The A–D health-audit inventory ran at the gate (the 2026-08-01 adoption clause): five findings — the codegen byte-compare ran in no panel step (fixed in-run, step 6b,1218c429— the checklist's mechanisable-row rule applied at discovery),quinn-protoRUSTSEC-2026-0185 in two lockfiles (host fixed1db359d0→ 0.11.16; the fractality specspace's lock filed as DBT-0023 — its workspace, its session),cargo-outdatedunrunnable over this layout (open), thedead_code-allow shadow 28 → 79 since June (open, triage next), census rows clean (accepted); AUD-0014/0015 found already fixed by passing work and closed (c4e804e0). Convergence verdict per §7: registry non-empty, nothing new minted — converged with a stated remainder (58 open non-sync rows + 32 owner-ruled deferrals, the remainder stated in the ledger's close table). Prediction scoring, the countable parts: the geometric fall held in substance (601 → 191 drifts, recent regenerations mint zero new obligations); «≤3 waves» did not survive contact if a wave is a work batch (twelve ran); the escalation count is scored at §9 against §5's two-consecutive-waves definition, not guessed here. State at HEADdcc23250: corpus 98.0 %, registry 90 / 190 — 32 deferred, 58 open, owed 17 all ruled, resolved 139. Phases E/T/F/G stand designed and do not start without the owner's word; Phase E's mandate drains the recorded builds under the map's frame.
- 4932026-08-03 · второй обмен — E/T получают переключаемый
claudez-транспорт субагентов. The owner's directive: rework the
machine-local
claudez/claudez2launchers (Claude Code → GLM-5.2 via the z.ai gateway, two accounts) so-cworks exactly as with plainclaude, use them as the E/T subagent transport instead of native agents, keep the native↔claudez switch in the owner's hands, effort always max, and parallelise across BOTH launchers in worktrees where edits are isolated — one thread where a many-place edit would conflict. Executed the same hour: the launchers' siamese state was split — before the rework both shared oneCLAUDE_CONFIG_DIR(~/.claude-glm) and one override var, so-cin a shared cwd stole the sibling's thread, fatal for subagent use; nowclaudez2owns~/.claude-glm2+ZAI_API_TOKEN_FILE_2/CLAUDEZ2_CONFIG_DIR, headers and error prefixes de-copy-pasted, and all four variants (bash + PowerShell × two launchers) exportMAX_THINKING_TOKENS=32000(the effort-max lever;CLAUDEZ_MAX_THINKINGoverrides). Verified — the ALPHA/BRAVO matrix, eight runs, exit 0 each: in one scratch cwd claudez seeded codeword ALPHA and claudez2 seeded BRAVO (fresh~/.claude-glm2bootstrapped headless, second token live), then each launcher's-c -preturned its OWN codeword — from bash and from PowerShell both (Get-Commandresolves both names to the.ps1scripts). The instruction landed ascampaigns/packages-2026-09/SUBAGENT-LAUNCHERS.md+ the owner's switchSUBAGENT-MODE.toml(mode = "claudez"; the boss re-reads it before every fan-out, so a flip acts immediately); §5-E/§5-T executor lines and the T-spec's executor header amended to point at it — §13.0.1's «ZCode-class harness, not verified» bet is now a verified concrete transport with two non-colliding lanes and a-ccorrection loop. Review, verdicts, anchor routing and commits stay the boss's in both modes; briefs cite durable files; fractality stays out.
- 4942026-08-03 · третий обмен — наблюдаемость воркеров и архив логов
(traceability всего, что происходило). The owner's directive:
status of a running claudez worker must be readable every ~30
seconds, not at the end of a multi-hour task (heartbeat and/or a log
whose freshness shows when something last happened), and after a
worker finishes its ENTIRE log is preserved under
C:\Users\olegc\git\v\cache\agents—unsorted/for runs bound to no task,sorted/<task-id>/(id derived from the campaign task's anchor) for bound ones — so «мы потом всегда могли понять — откуда что произошло». Executed and MEASURED live the same hour: the transport's native channel is--output-format stream-json --verbose— one JSONL line per turn and per tool call, each with a wall-clocktimestamp, written DIRECTLY into the archive path at spawn (so «пересохранение» is finalisation, not rescue — no crash can lose logged bytes); layer 2 is packet-mandatedPROGRESS:/TASK-DONEecho heartbeats. The end-to-end probe (a 3-step worker, 6 turns, 37.9 s, exit 0, logunsorted/2026-08-03-obs-test-claudez.jsonl) proved mid-run visibility (step-1 heartbeat read while running) and bought two weak-writer lessons at full price: the worker skipped one of three mandated heartbeats while working correctly — so log growth is the PRIMARY liveness signal and a missing heartbeat with a growing log is not a stall (stall ≈ mtime ≳5 min; GLM turn latency legitimately reaches 2–3 min) — and asked to reply exactlyFINISHEDit replied «ЗАВЕРШЕНО» with both artifacts correct — acceptance is by artifacts, never by the final string. The instruction gained §5 (the 30-second contract, the status one-liner, the archive table,meta.mdfinalisation); the WAL constraint carries the contract;cache/agents/got its pointer README. The boss owns knowing every worker's log path.
- 4952026-08-03 · четвёртый обмен — отчёт воркера как карта приёмки.
The owner's directive: минифицировать усилия босса на приёмку —
every packet must make the worker end with a detailed report of what
it did, in a form convenient for the boss-model's review. Landed as
the instruction's §6
#worker-report: the worker's last two actions are writingWORKER-REPORT-<task-id>.mdat the worktree root (a fixed inlined template: exhaustive changed-files list, acceptance point-by-point withfile:lineevidence, verbatim self-verify output, a MANDATORY deviations section even when «none», leftovers) andecho "TASK-DONE". The boss's flow over it: mechanical report-vs-git statusset-compare → diff read routed by the report (deviations first) → re-run self-verify → verdict; the report routes the review and never replaces it. The owner's mid-turn question — не конфликтуют ли отчёты при нескольких воркерах — answered by construction and hardened by name: parallel workers live in separate worktrees, the filename carries the task-id, and finalisation moves the report tosorted/<task-id>/under a stamped name, so repeat runs never clobber. Measured the same hour (probe-report-01, claudez2 lane): a GLM worker filled the template exactly — file list including the report itself, per-point acceptance with coordinates, verbatim grep output with exit code, explicit «none» — the cross-check against the tree took seconds. Log:unsorted/2026-08-03-report-probe-claudez2.jsonl.
- 4962026-08-03 · пятый обмен — ДОБРО НА ФАЗУ E. The owner:
«сохрани состояние и напиши промт, чтобы можно было начать фазу E
в новой сессии (даю добро). Выполняться все должно на claudez
воркерах, при этом босс - это Fable». The mandate, recorded:
Phase E starts in the next session; the first slice follows the
presented-and-blessed recommendation — wave А (B-011, the
owner's «Самый Высокий Приоритет»: deterministic loading —
rename-on-splice,
#use spec://… as X+@!X, the ADL analogy, the dynamic-STATIC.md case; his design directions live verbatim in the B-011 entry) plus the research pair B-022/B-023 in a parallel lane (изолированные периметры — two lanes per the transport's parallelism law). B-011's DESIGN is boss work (never-delegate) and returns to the owner before implementation; implementation and evidence sweeps go to claudez workers under the full transport contract (worktrees, stream-json logs into the archive, 30-second polls, WORKER-REPORT, meta finalisation). B-006/B-031/B-028 follow B-011 inside wave А; waves Б/В/Г wait; release events go to the owner before publication; phases T/F/G are NOT covered by this добро and wait for their own word. The executor pin:SUBAGENT-MODE.tomlstaysmode = "claudez"(the owner's switch, re-read before every fan-out); the boss session runs on Fable. The economics, in the owner's follow-up words (same exchange, verbatim): «моя задача в минимизации нагрузки на Fable и максимизации кодинговой работы на claudez субагенты» and «чем меньше работы приходится на Fable тем лучше, однако работа по сшивке-приемке-суждениям высокоуровневым никто лучше не сделает» — so the standing split for E: Fable never types code it can hand off — task cutting, design judgement, review over the WORKER-REPORT map, stitching/merges, verdicts, commits and owner communication stay Fable's; ALL code writing, evidence sweeps and mechanical legwork (including spike prototypes for the B-011 design) go to claudez workers. Wind-down executed the same message: WAL/CONTINUE rewritten, the start prompt handed to the owner in chat.
- 4972026-08-03 · шестой обмен — драфты-скаффолды, решения-с-почему,
право НЕ ПРИНЯТЬ. Three closing refinements from the owner,
recorded into the transport law the same hour: (i)
высокоуровневые драфты может делать Fable — «внедряя внутрь
инструкции, которые позволят делать более подробные уточнения и
проверки»: the boss's design-grade skeleton embeds named
refinement/verification points («уточни здесь», «проверь, что»),
the worker fills them and never redraws the skeleton
(
#e-draft-scaffold); (ii) the worker «должен вернуться с описанием принятых решений и почему они приняты» — the WORKER-REPORT template gained the mandatory «Decisions taken (each with why)» section, covering every choice inside the packet's latitude including every filled refinement point; wrong judgement there is reviewable material; (iii) «Fable должен мочь НЕ ПРИНЯТЬ работу и отправить её на доработку» — acceptance now has four explicit verdicts (ПРИНЯТО · НЕ ПРИНЯТО → доработка through the-cloop naming the wrong decision/implementation precisely · re-commission, with the two-rework economics ceiling · discard), every verdict and rework cycle recorded inmeta.md(#report-rejection).
- 4982026-08-03 · седьмой обмен — коэффициент параллельности: до 5 на
запускалку, 10 суммарно. The owner's question: сейчас один воркер
на запускалку? можно вплоть до 5 — две запускалки = максимум 10?
Answered and raised the same hour: the old «one packet at a time
per lane» was the boss's conservative wording, not a technical
limit — thread isolation holds at any count by construction
(conversations key on state-dir + cwd; one worker = one worktree),
so the coefficient became up to 5 per launcher / 10 total
(
#e-parallel-coefficient). Probed live: five concurrent one-shots on the single claudez account — five correct results, zero errors, 15 s wall (parallel, not queued; logsunsorted/2026-08-03-conc-w{1..5}-claudez.jsonl). What still governs the spawned number: the disjoint-perimeter law (ten workers need ten disjoint perimeters), box weight (cargo-heavy packets practically 2–3 concurrent — cold worktree builds thrash the disk; doc/test-text packets go ten-wide), and unprobed long-run account throttling, visible in the stream-json logs if it ever appears.
- 4992026-08-03/04 · Phase E opens — the first slice executes, and the
owner rules on it. The mandate's first slice ran end to end on the
claudez transport: the B-011 design (boss-authored,
vibevm/vibespecs/design/deterministic-loading-aliasing.xml— qualified rename-on-splice,#use … as X/@!Xaliases, the two-scope lookup rule, the append-only dynamic-lane case) went to the owner and was APPROVED 2026-08-04 with every fork's recommended option, after one design probe (the stale-short-address case → §6.1's four defence layers, layers 1–3 in-slice) and one owner addition (resolution rules are priority-placed: the lane-header preamble + PROP-035 §13's first-instructions, design §5.1). The research pair landed: B-022 evidence + synthesis (one unblocked slice — the query-kind enum; everything else behind B-020/B-015) — owner agreed 2026-08-04; B-023 evidence + synthesis (the shipped «T-sem» TS frontend never calls the type checker — parser-depth in substance) — the owner counter-probed the depth verdict («а ты уверен, что это приемлемая глубина?»), re-opening T2's passive trigger for re-judgement, then ruled 2026-08-04: the checker deepening is deferred until a SECOND type-requiring rule appears (as_crossalone does not fire it), mid-to-late backlog priority, «не нужно забывать об этом» (verbatim in B-023's disposition). Transport first-blood: one of two workers skipped the mandated WORKER-REPORT while echoing TASK-DONE; one-crework fixed it; two rework rules paid for and recorded in the law's#fact-first-live-fanout.
- 5002026-08-04 · release-события — рулинг владельца. On the boss's «publication of the six consumer packages is a release event held for the owner», the owner drew the line precisely: publication into separate GitHub repositories waits — «это будет отдельная операция после того как мы доделаем наш рефакторинг»; a version bump as such he allowed. The boss's recommendation, accepted as the standing default: versions stay untouched until the pre-publication boundary, where the bump and the publication become ONE operation — the slot model makes a real bump a new-slot mint, wave А keeps editing the same packages, and interim slot numbers nobody publishes would only multiply; the registry's release-route rows and the in-slot edits already track exactly what will ship. If the owner wants numbers fixed earlier, the boss mints the seven slots on his word.
- 5012026-08-04 · Phase E, second slice — the ruled re-judgements drain
and B-006 goes to the owner as a sketch. The routine half executed
on the standing rulings, boss-side end to end (annotations are spec
authoring, verdicts are verdicts — the never-delegate set; nothing
in the slice was delegable code): F-159 — four owner-ruled
interims into LEDGER-INTENT (M-A layer 2 → B-020; M-B → B-020 +
M-D-as-pin-source; M-C's two cost measures → B-020; M-D → the B-015
notice, verbatim) and the fifth anchor (M-E) re-judged on the built
enum — five
confirmed(batch E3-F159), the obligation resolved to history; F-146 — the §2 frontend table re-annotated (ts-tsc honest parser depth + the B-023 deferral quoted verbatim; Python specified-not-built in the C++-row idiom), twoconfirmed(batch E3-F146), one drift stays owed on B-025; both through mirror → merge → seal, never chained; the host lineterraform/REPORT.md:41fixed; B-022 closed in the backlog with heirs named (B-020, B-015). Registry after: 89 obligations / 183 drifts / owed 10 / resolved 140 (commands reproduce, never quote). B-006 — the wave-А next — analysed to its exact mechanism (the closure walk and thewith_staticunit-artifact substitution both firing on one static entry; the conjunction DRIFT-029/030 stopped on) and put to the owner as the design sketch the mandate requires before a contract-touching build:vibevm/vibespecs/design/lane-composition-dedup.xml— compose-time once-each elision recommended, three forks, W3's per-node-qualify rider, two-packet worker cut. Implementation holds for the ruling; B-031/B-028 stay queued behind it per the wave order.
- 5022026-08-04 · B-006 ruled, hardened twice by the owner, and LANDED
the same day. The ruling: «согласен с твоими рекомендациями a1 b1
c1» — A1 compose-time once-each elision, B1 provenance stub with no
#use, C1 contract landing with the per-node rider. Two owner probes arrived mid-build and each sharpened the rule before code: (i) mixed consumers (several packages pulling git-practices asstaticandstatic-transitive) — answered by construction (identity-deduped closure walk + single-version invariant + the coverage guard) and encoded as fixture Т3 with both declaration permutations; (ii) a package with its own code plus widely-shared static libs — surfaced the де-substitution refinement (a covered snippet-bearing entry reverts to its snippet; elision-to-stub had silently dropped its own text) and drew the honest boundary into the contract: partial coverage conservatively keeps the whole unit artifact (text is never lost, a present member rides twice), and deduplicating inside unit artifacts is the hoisting plane's job (DRIFT-030's undercounting counter is the recorded trigger). Contract: PROP-009 §2.3##STATIC-EMITS-ONCE-EACH(+ the stale B-011 interim shed, + history), PROP-038 §2.1##UNIT-ARTIFACT-STATIC-CONSUMER-ELIDES, PROP-035 §8 per-node (2e014bf7,6b8e789a,624e8e8d). Build, two claudez slices, both ПРИНЯТО first pass, zero-creworks: W-A — thedesubstitute_covered_unitspass +elidedstub arc + Т1–Т7 (the worker caught the packet's Т2 flaw — awhen-gated member leaves the zone entirely, so the guard case is consumer-link divergence — and named the nested boot-bearing-umbrella fixpoint counterexample, parked in the doc comment); W-B — the W3 rider:compile_static_qualified(one shared phase loop,CompileMode), per-node origins off topo keys, the cross-node second pass (unique definer → rewrite; ambiguous →AmbiguousShortLinkwith sorted candidates; undefined → loader's lookup),render_staticnever re-qualifies a normal body, Q1–Q7 on a new two-package fixture (68529118,d45a49d8). Acceptance on the live lane (e7bf3349): git-family markers 9 → 5, double-qualified labels 164 → 0, the lane −404 lines (2589 → 2185), the tombstone sheds its same-origin repeats,git-attribution-policy's «exactly one always-loaded place» true from the host side, W-B byte-stable (zero normal entries today — machinery for the first arrival). Serialized one-lane on purpose: the two perimeters sharerender_static. Worker archives:cache/agents/sorted/E4-W{1,2}-*/(logs, stamped reports, meta with verdicts). Wave А continues: B-031 next, then B-028.
- 5032026-08-04 · B-031 opens — the census lands, the sketch goes to
the owner. On the owner's «продолжай», wave А moved to B-031. The
evidence sweep was delegated whole (claudez, read-only packet, no
cargo — the E5 census: every count command-cited and re-run;
ПРИНЯТО first pass) and reshaped the filing: 2 351 living
occurrences (not the crates-only 1 384), the contract carve-out
exactly one line (PROP-029
##SCOPE-HOST), truncation already authority-agnostic (→ stays with B-028), ≈343 test fixtures, 500 historical JSONs untouched by design, 314 canonical-package cross-boundary citations (in-slot edits under the release ruling). The boss design over it —vibevm/vibespecs/design/host-as-package.xml:org.vibevm/corethrough the unified grammar, the resolver's self-coordinate mapping, undotted authorities failing loudly with the rename hint, a dry-run-first one-commit migration, F-169/F-147 re-judgements riding the landing. Three forks to the owner (coordinate form / legacy behaviour / migration perimeter); implementation holds for the ruling. B-028 stays queued behind.
- 5042026-08-04 · B-031 ruled — and the owner adds a fourth point,
addressed to the boss by name. The ruling, verbatim: «1.
координаты: группа org.vibevm.core, имя vibevm. 2. жесткая ошибка с
подсказкой 3. все живые поверхности» — the coordinate keeps the
manifest name untouched (only
groupis added; addresses becomespec://org.vibevm.core/vibevm/…), the legacy notation dies loudly, the migration covers every living surface. The fourth point: «проверь что наш текущий рефакторинг не сломается от этого переименования (проверь сам, Fable!)» — executed boss-side the same hour, layer by layer, and recorded as design §5.1: the campaign registry keys by file-path + anchor-id (0 URI-keyed keys across cache/corpus/obligations/baseline — walked empirically), specmap.json and the orphan ratchet regenerate consistently (namespace and code attributes move in one pass; edges 1:1), the 126~rNpins are unchecked today and ride inert, the intent ledger's renamed subjects soft-miss by the B-022 design, andbaseline.json→rescanseeing the rename is re-verification, not breakage. Net verdict: nothing becomes invalid-and-load-bearing, and the landing MUST carry the mirror → mechanical-diff spot-check → mass re-seal step, now named in the design's W3. The build starts on the ruling: W1 (resolver + identity, claudez) → W2 (the migration script, dry-run first) → W3 (boss: PROP edits, re-seal, re-judgements, panel, mirrors).
- 5052026-08-04 · B-031 LANDS — the host is
org.vibevm.core/vibevm, and the exception is dead. Two claudez slices, both ПРИНЯТО first pass: W1 (resolver + identity — the self coordinate resolves first, an undotted authority answersLegacyHostAuthoritywith the rename hint, bothHOST_NAMESPACEconstants retired, the rootvibe.tomlgainsgroup; the worker corrected the packet's own type sketch — vibe-spec depends on no vibe-core, so the coordinate is strings — and kept the v1 wire key behind a serde rename) and W2 (the byte-exact migrator, proven on a disposable worktree). The boss wet pass: 1 893 occurrences over 606 files,--verifyresidue 0; specmap.toml → the coordinate and specmap.json re-minted consistently; sync-engines ×6; the lane regenerated. The panel then earned its keep four runs in a row — package-workspace fmt (the hostcargo fmt --allcannot reach the eight package workspaces), Т2's input literal un-migrated viaconcat!(the one string that must stay in the retired form — and the boss's own piped-grep test count had read that red as green, the recorded panel-tail lesson applied one command late), three files split at seams for the 600 budget (with the extractor honesty note: a helper without#[test]in a split-out tests file needs the deviates hatch), and the specmark grammar's tests + doctests re-pointed at what the coordinate form actually parses to (both slots, vendored ×6). The §5.1 metadata pass executed: mirror → mechanical spot-check → mass re-seal — 15 files re-vouched, 4 honestly refused pending their new anchors' own judging (PROP-035, PROP-029, the two new design docs). Re-judgements: F-169 resolved whole, F-147's segment twins confirmed (batch E6-F169-F147) — registry 88 obligations / 179 drifts / owed 6 / resolved 142; the orphan-ratchet count honestly moves 37 → 42 (the five new public surfaces of this session's builds join the standing owner row). One perimeter honesty note: P1 rewrote addresses inside VERBATIM QUOTES on markdown surfaces too (e.g. the 2026-08-02 ruling text now shows the new form) — the ruled perimeter, applied consistently; JSON records alone keep the original spellings. Wave А's build queue is drained: B-028 — a decision entry, not a build — is the next fork, to the owner.
- 5062026-08-04 · B-028 ruled and landed — ВОЛНА А ЗАКРЫТА ЦЕЛИКОМ.
On the fork's presentation the owner ruled the version half's
semantics, verbatim: «Я хочу чтобы указание версий было опциональной
фичей. Если версия не указана - используется самая свежая» — read as
the one deterministic offline form, the freshest INSTALLED version
(semver-newest slot), and stated as such in every carrier. Executed
the same hour: (code, E7-W1 claudez, ПРИНЯТО first pass) the
resolver's several-installed-versions error dies — the absent-version
arm picks semver-newest via a small in-crate comparator
(
resolver/version_order.rs, nosemverdependency; 0.10 beats 0.9 numerically, releases beat their pre-releases, explicit@versionstill pins any exact slot; F1–F6 + a 13-pair table); (contract) PROP-035 §6##URI-VERSION-OPTIONAL/##ROUTER-VERSIONre-ruled from the lockfile wording to the freshest default; (the flow) the{#uri-scheme}section publishes the WHOLE grammar — coordinate authority, optional version with the freshest default, multi-segment doc-path, revision pin — keeping the four row anchors alive (module and doc scope themselves inside<doc-path>, which is why their B-031 re-judgement survives); (the book) both redbook chapters stop restating the schema and cite the section — the campaign's own one-norm-one-home law applied to its teaching book; the section's six anchors judged confirmed against shipped behaviour (batch E7-B028-URI), the file re-sealed, the chapters honestly outside the observed corpus. Package edits in-slot until the pre-publication boundary. Panel green, tail read. Волна А: B-011 → B-006 → B-031 → B-028 — все посажены под мандатом фазы E. Дальше по карте — волны Б/В/Г, добром пока не покрытые, и стоячие пересуды остальных deferred-строк по мере их строек.
- 5072026-08-04 · НОВЫЙ МАНДАТ — добро на ВСЕ оставшиеся волны. On the wave-А close report and the Б/В/Г explainer, the owner, verbatim: «сохрани состояние, напиши промт для продоложения. Хочу все остальные волны сделать». The mandate, recorded: Phase E continues across волны Б, В и Г целиком, in the map's order — Б batch by batch (opener: B-029 + B-034 + B-039; then B-033 + B-030; then B-036 + B-037 + B-038; then B-025 + B-026; B-003 rides, B-035 loops after each batch), then В down its chain (B-019а + B-016.1 + B-017 with B-024 decided alongside → B-018.1/.2 → B-018.4 + B-016.2 → B-020 + B-021; B-014 decided there), Г parallel-opportunistic (B-040, B-005, F-132 schemas, B-010's check-verb). The standing split holds: boss = Fable (task cutting, design, review, verdicts, commits, owner communication), исполнение — claudez workers under the full transport law; the map's per-entry owner forks still stop for the owner one at a time (the eleven named decisions — a mandate to build is not a mandate to pick his forks); deferred re-judgements drain as their builds land (B-025 → F-146's last anchor, B-026 → F-206, the parity family → F-185, B-020 → the LEDGER-INTENT interims' key). T/F/G остаются вне добра; publication waits for the refactor's end; versions stay unbumped to the pre-publication boundary. Wind-down executed the same message: WAL/CONTINUE rewritten, the map refreshed at the wave boundary, the start prompt handed to the owner in chat.
- 5082026-08-04 · Волна Б открывается: цензус-тройка → развилка №2
взята → B-003 посажен тем же часом. The batch-1 opener ran
census-first: three parallel claudez read-only workers (E8-R1
config surface, E8-R2 gate units + FlagSites, E8-R3 go-floor
mechanics — all ПРИНЯТО first pass, boss spot-checks green)
landed
harvest/e8-r{1,2,3}-*.md(83c15795), and the map's fork №2 went to the owner on measured fact. The ruling, verbatim: units — «А что является единицей учета в Rust? Крейты? Если да, давай в Go сделаем пакеты» (Rust = crate stands, Go = package; TS = cell by the native-unit norm his bar implies); homes — «Какое решение максимально хорошо с точки зрения построения систем, расширяемо на новые языки (скоро добавится Python!)… Я не хочу делать плохие временные решения… Хочется сделать хорошо и надолго» — read as full symmetry: every language a config section of ONE uniform shape (roots/exclude_substrings/ neutralgated/[[<lang>.exempt]] {unit, reason}/floor_disable+ language extras), root = shared budget only, retired flat keys die loudly with the move hint (three in-tree carriers, pre-publication window). Record:vibevm/vibespecs/design/gate-parity-config.xml(§2 ruling, §3 shape, §4 the W1 → W2a∥W2b → W3 → W4 cut); the map's §5 №2 marked taken; B-029/B-034 rows carry the ruling. B-003 landed in parallel while the fork stood (disjoint perimeter; E9 claudez worker, ПРИНЯТО first pass): the Go conform default + init template gain/fixtures/, the floor's gofmt step post-filters through the same key with the engine's match semantics — measured live on the package root: gofmt red + 5 fixture findings → gofmt green + 0 findings, the four remaining reds the row's recorded not-defects (082e205b; sync-engines ×6 + vibedeps in step). The TS floor's twin hole censused and FILED, not ridden: B-048. Next: W1 (engine Config v2) on the ruled shape.
- 5092026-08-04 · B-029 + B-034 LAND — the config surface is symmetric
and the coverage invariant speaks three languages. Three claudez
slices staged on a branch so main never carried red package
workspaces, then landed as one green chain (
97688de0→aa4b3a72→51e350bf→d3a960f3): W1 (engine Config v2 — root = shared budget + [rust]/[go]/[typescript] of one uniform shape, neutralgated+{unit, reason}exempt, nine loud tombstones with per-key move hints, the generic six-refusal validator + per-language enumerators, vacuous/scope guards, Store::for_rust; ПРИНЯТО + one boss tiny-fix — the Rust scope warning had ignored literal roots and would have cried wolf on every single-crate layout), W2a (Rust FE/CLI re-point, init template v2 with the everything-starts-exempt posture preserved; the worker's honest finding: the engine rule-struct field names and health's JSON report keys keep the old spelling as internal API/schema — noted as cosmetic follow-ups), W2b (Go/TS drivers validate in check AND freeze, scope/vacuous/counts announces in each language's noun, init templates enumerate exempt through the engine's own go_units/ts_units so fresh projects clear validate by construction; demos fully adopt — go-demo 6 packages, ts-demo 2 cells; gate-tested fixtures get their lists; the tombstoned flatroots = []removed from six carriers, documented not silent). The host policy and rust-demo migrated to [rust]; the fractality package's policy deliberately stays flat — that specspace runs the frozen 0.7.0 engine slot and migrates on its own stack upgrade, guided by the tombstone. The panel then caught the census gap (29e484ea): the TCG oracle and the MCP relay read the flatconfig.rootsat four sites the E8-R1 reader table never listed — the workspace test went red, the boss re-pointed all four, and sync-engines fanned the oracle fix into the twin. Lesson recorded: a census's reader table is evidence, never a completeness proof — the panel's package-workspace sweep is the real perimeter check. Live exhibits, real exits: go-demo «6 package(s) gated, 0 exempt» and ts-demo «2 cell(s) gated, 0 exempt», both 0 new findings. Волна Г rode alongside: the B-040 seams census (a8037735). Remaining in batch 1: W3 (the carriers' doc sweep) + W4 (the TS-shaped flag rule, B-039) — both in flight as this entry lands.
- 5102026-08-04 · БАТЧ 1 ВОЛНЫ Б ЗАКРЫВАЕТСЯ ЦЕЛИКОМ — B-029 + B-034 +
B-039 посажены, B-003 попутно, луп B-035 пройден, панель зелёная,
зеркала синхронны. W3 (the doc sweep,
c67ec458) landed ruling 2.1's second half — every carrier speaks[<lang>] gated/[[<lang>.exempt]] {unit, reason}in its own noun, the Go guide's «one spelling» apology died, the TS frontend doc gained the honest invariant description. W4 (0249f9cd) landed B-039 TS-shaped: ts-extract emits env-read facts, the engine's ts-flag-sites flags reads outside[typescript] composition_root, the demo instantiates the tier (src/main.ts + typed as-const registry), the guide's two «Specified, not built» notes now describe the built thing and its honest if(flag) limit; the dirty fixture deliberately stays root-less as the unmounted case. The panel earned its keep three more times on this landing — the TCG oracle + MCP relay read the flat roots at four sites the E8-R1 reader table never listed (29e484ea); the frontend/TCG/replay TEST tail still built stores by the retired name and wrote flat policies (2bf7236f; one fix went through a byte replace that silently missed on CRLF — the recorded trap, paid again); and W4's new Fact variant reached the Rust frontend's deliberately-total sort and the health census (bd5eb713) — with a cargo staleness ghost on the way (the host target held a pre-variant fingerprint of the vendored engine;cargo clean -pput the build back on real sources). New packet law bought: a code packet that CREATES engine files carries the specmap self-trace in its self-verify (5323ea82— eight coverage helpers were orphans; scope! joined them to ENGINE-CONFORM#facts). The B-035 loop's first post-batch pass (harvest/e10-b035-parity-pass.md,abfdff30): rows 2–5 infrastructure asymmetries CLOSED (invariant, vacuous, scope, counts — all three drivers from one core); surviving parity debt is content — seam-error REQ-citation (TS none / Go half; B-033's batch) and the Go flag rule; two fresh findings — the floor-disable mechanism exists on Go/TS but NOT the Rust floor (the one asymmetry pointing the wrong way), and B-003 scoped only gofmt while vet/tests/staticcheck still walk ./... unfiltered. Nine re-touched carriers re-sealed (two honest refusals — TOOLING-MAP/BACKLOG are outside the observed corpus); registry unchanged at 88/179/owed 6 (no judging batch this checkpoint — the deferred re-judgements drain with their builds: F-185 whole when B-033 completes the family). Live exhibits, real exits: go-demo 6/0, ts-demo 2/0, both 0 new. Mirrors fanned. Next: батч 2 (B-033 + B-030) — и развилка №9 карты (дом паритет-принципа) уходит владельцу вместе с кандидатами лупа.
- 5112026-08-04 · БАТЧ 2 ВОЛНЫ Б ПОСТРОЕН ЦЕЛИКОМ — B-033 + B-030 + B-049 +
подъём принципа паритета. One long autonomous run (the continuation
prompt lifted the pause) built the parity batch across 21 green commits,
the panel read at every landing. Design (
3c5f51e5) → the parity principle LIFTED into the manifesto (8e03348a,core-ai-native##PARITY-ACROSS-PROJECTIONS— fork №9 «Ядро дисциплины»: no projection weaker than another without a recorded reason, the projection-level twin of##BAN-WITHOUT-HATCH-IS-A-BUG) → S1 engine spine (ae927800…c0f99902:go-seam-error-cites-req[one rule, both halves, per-half fingerprints],ts-seam-error-cites-req,go-conformance-assertion, two newFactvariants + theseam_error_message_no_reqkind +[rust] floor_disablefield; the Fact-variant ripple across the Rust FE sort + health census; the go-seam mount to hold the gate count when the umbrella arm was removed) → S2 extractors (8f1fc914go readsError()bodies var _assertions,a5ba2b0bts detects discriminated-union errors,0393ce91sync) → S3 mounts + B-049 (bd4291d5the conformance rule scopes to the GATE LIST so seam-less/exempt cells are never falsely flagged,d09e2a19the go gate mounts it + the clean fixture asserts,f63c1d32the ts gate mounts the seam-error rule,32aba0abthe Rust floor honoursfloor_disable[B-049],94e6db0esync) → S4 docs (docs(packages): the three guides describe the built rules + the message markerspec://-or-violates REQ+ the TS honest limits, and cite the manifesto parity law) → B-035 loop pass №2 (harvest/e12-b035-parity-pass.md: rows 1 [seam-error, both halves ×3] and 13 [floor-disable ×3] PARITY ACHIEVED; row 7 [conformance] Go built / Rust reason / TS routed; the two Go-only gaps — row 6 flag rule, rows 8/12 floor./...residual — recorded and routed to later batches). Delegation: 4 claudez build workers, all ПРИНЯТО (2 with boss corrections that were the worker's own CORRECT escalations — the go worker caught the packet'sspec://-only marker and itsVec<String>floor contradiction; B-049 caughttestsvstest; the ts worker recorded its limits + cleanedpackage-lock.json); the S4 doc worker hit a worktree-write anomaly, fell back to the main repo transparently, and surfaced an adjacent stale claim. Panel earned its keep on the go characterization coupling (moving the seam-error kind out of the umbrella broke the gate count + TCG parity three times — each a same-landing fix; the message-half anchor moved to theError()method line so the two halves key separately; a within-frontend-version extraction-cache staleness paid once). NOT yet closed: the F-185 family re-judgement (vibe progress mirror --campaign→merge-verdicts.py --force→ seal — the guides now describe the built rule, so F-185's «seam-error-cites-reqis not a rule» drift closes) and the batch's BACKLOG-row dispositions. Mirrors are behind (21 commits localmain; the fan-out held for an explicit wind-down). Next: the F-185 re-judge + backlog rows CLOSE batch 2; then батч 3 (B-036 + B-037 + B-038, map fork №1 with B-038) → батч 4 (B-025 + B-026) → M-PARITY → волны В/Г.
- 5122026-08-20 · ПОПРАВКА РАМКИ — выход кампании = РЕЛИЗ 1.0.0; фаза T
отменена; фаза G расщеплена. The owner's rulings of 2026-08-20 (quoted
verbatim in
campaigns/packages-2026-09/TZ-RELEASE-1.0-v0.1.md§0) commission the first outward release, versioned 1.0.0 across the product and every canonical package, executed as one autonomous goal-driven marathon session. The TZ is this campaign's closing arc: the remaining Phase-E slices (the store cut of 2026-08-19, the wire wave B-091/B-073/B-078/B-072/B-079 whilepublic = falsekeeps breaking free, the config-truth wave B-083…B-086/B-069/B-071, the version wave, the publication wave into the emptiedvibespecsorg) → Phase F (kept; prose-judgement form, recorded in the report itself) → the alpha doc layer (G's variant A) → the release gate, which ends at «ГОТОВО К РУЧНОЙ ИНСПЕКЦИИ ВЛАДЕЛЬЦА» — the tagv1.0.0is the owner's act after his manual inspection. Phase T leaves the campaign by the ruling quoted at#phase-t; its specs stay authored material and its deferral lives indeferrals.md#release-1-0+BACKLOG.md#post-1-0(nothing may be lost — owner's words, with the exclamation marks). Between the 2026-08-04 entry above and this one the campaign ran the change-native formats build (its own collapsed TZ carries that LOG), the identity lane S1/S3/S6, and the withdrawal slice — recorded in their own documents per the plan-mortality rule rather than duplicated here.
7.1 Commit map — hashes bound to phases
513Added 2026-07-31 under the owner's bring-into-line ruling:
flow:campaign-plans' ##EACH-EXECUTED-PHASE-GETS-A-LEDGER-SECTION and
##THE-LEDGER-BINDS-HASHES-TO-THE-PLANNED-SUBJECTS ask each phase for a commit
map, and this plan carried none — §7 above records what happened, at length, and
binds it to no hash. The A/B/C entries are reconstructed at Phase D and say so;
##THE-MAP-IS-WRITTEN-AT-THE-BOUNDARY-NOT-AT-CLOSE is the rule they miss, and
from Phase D's close onward this section is written at the boundary, which
is the whole reason it exists rather than waiting for close-out.
514Deviation from ##ONE-ENTRY-PER-COMMIT, stated rather than silent: 336
commits is past the grain where one entry per commit informs anyone. Each phase
gets its range, its count, its landmark commits and its verdict; the perimeter
command gives the rest.
515Perimeter, so the counts are reproducible. Measured at HEAD fffcb494:
516git log --reverse --format='%h %ad %s' --date=short -- \ campaigns/packages-2026-09 vibevm/vibespecs/terraforms/PACKAGES-ACTUALIZATION-CAMPAIGN-v0.1.xml
517336 commits, 3aa8295e (plan authored, 2026-07-25) → fffcb494
(2026-07-31), the campaign still open. Over the same span the repository as a
whole took 462 commits (git rev-list --count 3aa8295e^..HEAD), so roughly
seven commits in ten in this repository since 2026-07-25 are this campaign's.
Phase A and Phase B — EXECUTED 2026-07-26/27; 124 commits
518Preceded by three plan commits: 3aa8295e author wave 2 · f723e430 reviewed
against what wave 1 cost · 6ad264da ratified with all six §4.5 amendments.
5196ad264da..fc731127. A and B are not separable in this chain, and drawing a
cut would be a fiction: A's step 2 was deferred by owner ruling («не
перевыпускай пакет, сделаем это потом») and closed later by the version sweep,
so the two phases overlap by construction. Landmarks: 30728dd7 wave 2 opens,
the packages join the observed tree · 27336263 the engine re-mint is deferred
· 3c87cd11 the pilot confirms prediction 2 · b3ada517 the pilot marks the
aggregator · fc1782d8 one live zone, wave 2 takes the host corpus's verdicts ·
56172a8f Phase B closes at zero · fc731127 the phase boundary's baseline.
520Confirmed: prediction 2 — the aggregator genre needed a grammar amendment,
and the pilot fired it early exactly as §6 said it would. Falsified in place:
three of §1's own numbers (294 → 286 observable, 247 → 703 specmark sites,
eight → seven crate-bearing packages). Falsified about itself: §5-A step 2's
premise — the blocker was a caret, not a release. Gate at the boundary:
progress check 0 across both corpora; baseline.json written per A6.
Phase C — EXECUTED 2026-07-28/29; 146 commits
521fc731127..ef40a1ce. Opens 0dd240bd (a kick-off that says what Phase C is
not) and 0acc448f (the batch plan); c9ae2066 gives the zone the journal it
had run a phase without; a90cc387 C0. ai-native cluster: 38f9816c C1 ·
76c6a142 C2 · 6702441a C3 · 106e09c5 C6 · bf679a1c C7 · 6d82b5cf the
cluster closes at 80 of 80 files. world cluster: d0d17e9e W1 407 ·
582f603e W2 692 · c75f4216 W3 615 · 0f4d9c94 W4 564 · 0d20fffc W5 697 ·
a6436a80 W6 572 · 7c674c18 PHASE C CLOSES (W7 603 + qualified-naming's
last 190 anchors) · ef40a1ce the exit gate — summary, count, baseline.
522Measured: 10 700 confirmed / 601 drift / 45 unverifiable = 11 346, 94.3 %
— by zone, host 99.9 %, ai-native 91.6 %, world 90.0 %. 6 847 / 6 847
anchors, zero owed. Falsified: prediction 1 — world was predicted to
measure higher than ai-native and measured lower (90.0 % against 91.6 %),
and the plan said in advance that an inversion would be worth a finding of its
own. Confirmed by amendment: A2's self-referential count is real and small
— 248 of the world zone's 4 150 verdicts rest on source 1 alone, 6.0 %.
Method that made it hold: the per-file slice as the unit of work, and two
instruments that refuse rather than guess (make-slice.py, merge-verdicts.py).
Phase D — EXECUTED 2026-07-29 → 2026-08-03; 93 zone commits
523ef40a1ce..dcc23250 (93 commits over the zone perimeter; the zone's
lifetime total stands at 366 of the repository's 563 since the plan).
Opens 6072033a (601 drifts become 228 obligations, by a script that
says how) and 33bd5b1e. Landmarks: d7803b97 the routing record,
without which the phase cannot converge · 8b7f240f what the host owes
— the other half of the exit gate · 4206c61b waves 2–4 · b0a8b0d4
wave 5 and §3.7 · 1c1a3865 wave 6 · 3dab12a3 wave 7 closes ·
3c14d6af wave 8 · 91ebf1fd the D9 rulings · fffcb494 the rulings
of 2026-07-31 and the publication runbook · the 2026-08-02 presentation
sitting's ~ten exchanges (D29–D41, builds B-033…B-047, the map, the pin
build, step 0c) · a6bb261e the F-279 ruling executed, B-013 closed ·
b4c48aa0 the jtd-codegen tool package · 7441e7e9 sync-engines
carries the regen to all six vendored copies · 1218c429 the panel
gains the codegen gate · c4e804e0 the A–D audit at the gate ·
755d664a/dcc23250 the close trio's first two.
524Falsified at the opening, and it killed the obvious plan: drifts were expected
to cluster by reason text; measured, only 16 texts repeat at all over 54
rows and text-only clustering returns 552 groups for 601 rows — a reduction of
1.1×. What groups them is the subject: one document, one kind of defect, one
edit pass. Falsified mid-phase, twice: wave 5 found 18 claimed absences false;
wave 6 found the perimeter blind to a second adopter inside packages/.
State at close (HEAD dcc23250): corpus 11 188 / 190 / 44 = 11 422,
98.0 %, up from 94.3 % at the Phase C gate; registry 90 obligations /
190 drifts — 32 owner-ruled deferrals, 58 open; 173 routed out with a
recorded determination, 17 still owed and every one on an owner-ruled
build; resolved to history 139. Reproduce with tasks/summary.py and
tasks/drift-registry.py; both supersede every figure written here.
Gate at the boundary: self-check green (the panel one step richer),
exhaustive progress check clean over 261 files, baseline.json
written per A6, the A–D audit section in AUDIT.md.
Phases D-close, E, T, F, G — PLANNED; subjects spelled in advance
525Not yet executed. These are the planned commit sets; the ledger binds real hashes to them as each phase lands, and any drift between the two is itself a recorded finding.
- 526D close — EXECUTED 2026-08-03, hashes bound:
755d664afeat(campaign): the routing record closes, and every survivor carries an owner ruling·docs(campaign): phase D closes — the remainder, and who owns each row(the commit carrying this very entry — the LOG close, the status line, this map) ·dcc23250chore(campaign): the phase boundary's baseline. One stated deviation from the planned trio: the order ran feat → chore → docs, so the docs commit could bind both sibling hashes; and the 2026-08-01 audit-adoption clause added a fourth commit beside the trio —c4e804e0docs(audit)— plus its two in-run fixes (1218c429,1db359d0), none of which the trio was planned to carry. - E — one
fix(<package>): <the drift the task closes>per DRIFT task, each whose fix touches a package's crates followed bychore(ai-native): sync-engines vendors the fix forward to every family member— the wave-2-specific obligation, or the fix ships to one consumer and not the others. - T — one
test(<package>): three kinds per assertion for <cell>per packet, each packet exhibiting one test red ·docs(campaign): phase T closes — measured coverage per testable assertion. - F —
docs(campaign): the credibility report — does the discipline hold itself to its own rule. One commit, one document, and a green host floor is not an answer to that question and may not be cited as one. - G —
refactor(docs): docs/ moves to docs-legacy/ under the legacy-spec rule·feat(doc): the documentation package — cites a spec unit, never restates it·docs(campaign): phase G closes — the two guides, and the row spec-genres gained. - Close —
docs(campaign): wave 2 closes — the REPORT against §6's six predictions.
8. Deferrals
527The zone file campaigns/packages-2026-09/deferrals.md
is the ledger — this section said (empty) while that file carried the engine
re-mint's full record, and the D10 pass caught the disagreement (2026-07-31).
One entry today: the -lang version-slot re-mint, deferred by owner ruling
2026-07-26 and resolved locally by vibe update --all — kept there with the
three conditions that bind if a real re-mint is ever taken up.
9. REPORT
528(empty — filled at close-out against §6)
10. Quick-start for the executing session
529Added 2026-07-29 by owner ruling: flow:campaign-plans'
##COLD-A-LITERAL-QUICK-START-BLOCK requires it, the rule is sound, and this
plan had none. Every line prints a number — none of them is quoted from here.
530python campaigns/packages-2026-09/tasks/summary.py # verdicts by zone; the campaign's headline
python campaigns/packages-2026-09/tasks/batch-progress.py # what each phase-C batch owes vs wrote
python campaigns/packages-2026-09/tasks/drift-registry.py # Phase D: the open obligation registry
python campaigns/packages-2026-09/tasks/drift-registry.py --task F-145 # one obligation, as a SPEC task's §2
bash tools/self-check.sh; echo "EXIT=$?" # the gate panel — 0 before anything
531Then read campaigns/packages-2026-09/PHASE-D-BATCH-PLAN.md
for the phase in flight, and §7's LOG from the end for what the last session
did. The registry is generated, never hand-edited: a closure edits the document,
re-judges its anchors through tasks/merge-verdicts.py --force, seals with
vibe progress seal, and the registry shrinks by exactly that many rows.
11. Whole-campaign acceptance
532Added 2026-07-31 under the owner's bring-into-line ruling:
flow:campaign-plans' ##ACCEPTANCE-IS-A-RUNNABLE-SCRIPT-ASSERTING-THE-END-STATE
asks every campaign for a runnable script asserting its end state — run on a
green floor at close, cited by the report — and this plan had none. The
mandate already states the criterion in words: «this campaign is successful
when the discipline can be shown to hold itself to its own rule». This section
turns that sentence into commands. Steps 1–4 run today and their output is
shown; steps 5–8 assert phases not yet executed and are written now, before
execution, so they cannot be quietly relaxed to fit what lands.
0 — the gate panel, on a green floor at close
533bash tools/self-check.sh; echo "EXIT=$?" # 0
1 — every observed paragraph carries a marker, over BOTH corpora
534./target/debug/vibe.exe progress check --exhaustive \ --campaign campaigns/packages-2026-09
→ progress check: clean (260 files, 0 warning(s)) EXIT=0
2 — the measured actuality, per namespace and not only in total
535python campaigns/packages-2026-09/tasks/summary.py
→ host 4496/0/3 99.9 % · ai-native 2606/72/19 96.6 %
world 3843/285/22 92.6 % (src=[1] 267, 6.4 % self-referential)
ALL 10945 / 357 / 44 = 11346, 96.5 %
3 — Phase D convergence, measured by the generator, never asserted
536python campaigns/packages-2026-09/tasks/drift-registry.py
at close this must read: "drift verdicts still owed a package repair: 0"
— or every survivor carries an owner ruling in PHASE-D-HOST-OBLIGATIONS.md
537test -s campaigns/packages-2026-09/run/state/routing.json # the routing record
4 — the recurrence artifact, written at every phase close (A6)
538test -s campaigns/packages-2026-09/baseline.json; echo "EXIT=$?" # 0
5 — Phase T: coverage measured, not claimed
per-packet gate: PHASE-T-SPEC.md §10; campaign-level assertion:
every in-scope testable assertion carries >=3 tests of DISTINCT KINDS
(canonical, boundary, negative) and every packet exhibited one red.
6 — Phase F: the credibility report exists and answers PER PRACTICE
A green host floor is not an answer to this question and may not be
cited as one.
7 — Phase G: docs/ is gone, the doc package exists, and it cites
539test ! -d docs && test -d docs-legacy test -d packages/org.vibevm.doc/doc
and the law that makes it worth anything: documentation cites a spec
unit and never restates it; links run one way, docs -> spec.
8 — nothing evaporates
§9 REPORT carries a verdict on each of §6's six predictions, and
campaigns/packages-2026-09/deferrals.md names every leftover with an
owner and a disposition.
540Three things this acceptance deliberately does not let the campaign do.
- 541It does not let a green floor answer the mandate. §5-F says so and step 6 repeats it, because that substitution is the exact shape of the профанация §0 names: the host's gates are supplied by these packages, so citing them as evidence about the packages is the argument closing on itself.
- It does not let the drift count reach zero by softening a package. Step 3 reads the generator's CONVERGENCE block, which counts verdicts re-judged and verdicts routed out with a recorded determination — two different numbers, neither of which moves when a document is edited to agree with itself.
- It does not accept a total in place of a per-namespace figure. Step 2 prints all three zones, because prediction 1 is a comparison between two of them and a single aggregate would make it unscoreable.
542Two gaps this block surfaces rather than papers over, and both are the boss's to settle before it lands:
- 543Phase F's document has no path. §5-F describes the report and names no
file, so step 6 cannot be a
test -s. Naming it — the wayPHASE-T-SPEC.mdandPHASE-G-SPEC.mdare named from §5 — is a one-line edit and it turns the campaign's own headline deliverable from prose into an assertion. - The two commands disagree by one file.
progress checkreports 260 observed files;summary.pysums 259 with verdicts (58 + 80 + 121). One file is observed and carries no verdict row, or the two count differently. It is one file out of 260 and it is not a defect on its face — but an acceptance script whose two steps disagree should reconcile the difference rather than quote whichever number is convenient.