Spec-Actualization Campaign v0.1 — mark, verify, and de-drift the whole spec tree
01status: AUTHORED 2026-07-24 · IN FLIGHT — Phase B CLOSED 2026-07-25 (58 files, 4 880/4 880 facts marked) · Phase L CLOSED 2026-07-25 (terraforms/research/neworder/discipline relocated to root legacy-spec/) · Phase C CLOSED 2026-07-25 (4 944/4 944 markers judged; 93.0 % confirmed) · Phase D OPEN — waves d1 + d2 landed 2026-07-25 (302 of 311 drift rows closed; the tree measures 99.7 % confirmed; 42 of 55 findings resolved) · next: the two escalations (F-046 wire-or-demote, F-035 user-owned boot file), then Phase E · vibevm-specific · first consumer of PROP-043 (Progress Control)
02Contract for everything used here: PROP-043. Owner's manual: OWNER-GUIDE. Task formats: templates/.
0. Mandate (owner's words, 2026-07-24, recorded verbatim)
- 03«актуализировать ВСЕ спецификации … Это чудовищная огромная работа. Именно поэтому я и готовлю scaffold для нее, чтобы не сбиться в ходе обхода настолько большого количества документов. Нам нужно разметить корпус фактов, которые дальше нужно будет проверять.» Work may take a month; that is accepted; quality over speed.
- Paragraph-level exhaustiveness is the point, not an option: «это in-verbatim контроль того, что мы прошли всё, каждую строчку. LLM очень любит упрощать … нужен алгоритмический надсмотрщик».
- No fractality for this campaign. «Я хочу чтобы Fable сделала максимум высокоуровневых задач (анализ и разметку спецификации и тп)» — outputs: (a) a corpus of coding tasks for Opus, (b) a corpus of spec-improvement tasks executed by whatever model the budget allows (Fable if it stretches, Opus otherwise). This deliberately overrides the standing delegation-first default for the duration of the campaign — owner decision; do not "optimize" it back.
- Stitching is non-linear: reworking B may reopen A and vice versa — plan it as a multi-pass fixpoint, not a single sweep.
- Crash-safety: any session may die (budget, power); the next session must resume from one obvious file with at most one step lost.
- Repeatability: re-runs at ~monthly cadence must cost O(delta), not O(corpus).
- Wave 1 = the host
spec/tree only;packages/waves later; the fractality specspace excluded until the owner says otherwise.
1. Baseline (verified at authoring time, 2026-07-24)
- 04Host
spec/: 91 md files, 26 699 lines. Authored packages (no vendored copies): world 154 + ai-native 140 files (~30k lines) — wave 2; fractality 700 files — out of scope. - Free-form
**Status:**lines to convert mechanically: ~55. - specmap: index live; 34 gated orphans in
vibe-spec(pre-existing). - Progress Control: does not exist yet — no crate, no
vibe progress, nocampaigns/zone, no dashboard.<statusappears nowhere in the tree except PROP-043's own dogfood markers. - Existing inline grammars that must not collide:
@spec://(~17 uses),#use/#embed/#source,<!-- REVIEW: -->.
2. Executors and the budget law
| Role | Who | What |
|---|---|---|
| Boss / high-level | Fable | markup passes, verification judgment, stitching, task authoring, ALL review |
| Coder | Opus | IMPL tasks (DRIFT-NNN) exactly as written; stop-rule on ambiguity |
| Spec editor | budget-dependent | SPEC tasks (SPEC-NNN): Fable if budget allows, else Opus; Fable reviews regardless |
06Rules 1–4 of the repository bind every executor. Worker output is never credited; commits are human-authored surface; non-routine red lines stop for the owner no matter who is executing.
3. Campaign zone layout
07campaigns/progress-2026-08/ # id fixed at Phase A close
baseline.json # inter-campaign contract (PROP-043 §7.3)
deferrals.md # open tails at close-out; next run drains it
harvest/ # doc cards (templates/harvest-card.md)
tasks/ # DRIFT-NNN.md / SPEC-NNN.md + INDEX.md
run/ # EPHEMERAL: journal.jsonl · state/*.json · RESUME.md · mirror/
08Excluded from markup scope, packaging, and registries (PROP-043 §7.4).
Committed at batch boundaries — journal in the same commit as the edits it
describes; fan-out via cargo xtask mirror at phase checkpoints. run/ of a
closed campaign may be archived or deleted; the other four entries persist.
4. Resume protocol (crash-safety law)
- 09Step = unit of atomicity: mark-file · verify-unit · close-obligation ·
execute-task. Journal writes
step-start(intent, actor) before work andstep-done(result ref) after; JSONL, append-only, torn tail discarded. - Recovery rule: step closed in journal ⇒ its edits stand; step open ⇒
git restoreits files and redo the step. Steps are idempotent by construction. Maximum loss on any crash = one step. RESUME.mdis generated (vibe progress resume) after every step-done: where we are · unresolved steps with literal recovery commands · next steps · phase rules pointer · dashboard command. Every session of this campaign starts by reading it and ends by closing (not starting) a step.- Claims and staleness: journal actors (
fable,opus:DRIFT-012); an in-progress task with no journal events past the threshold is returned toqueuedas stale byresume. - git = second echelon: batch commits make the worst disk-loss cost one batch, never the campaign.
4.5 Safe stop — where wave 1 could halt losing nothing (recorded retrospectively)
10Added 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. Written after the
campaign closed, so it is a record of where the stops actually were — not a
promise made in advance.
11This campaign ran on a finer grain than the law asks for. The flow's unit is
the phase boundary; §4's unit is the step — mark-file, verify-unit,
close-obligation, execute-task — with step-start journalled before the work
and step-done after, so the maximum loss on any crash is one step. That is
strictly stronger, and it is why no session of this campaign ever needed the
phase-level guarantee to recover. Both grains held; both are stated here because
a stranger reading only §4 would think the campaign could be stopped anywhere,
and a stranger reading only the flow would think it could be stopped only six
times.
12What a stop at each boundary would have left, so «losing nothing» is a statement and not a slogan:
| Stopped after | The tree holds | What is owed |
|---|---|---|
| A | the progress-core crate, the vibe progress adapter, an empty campaign zone, the dashboard, and 46 pilot markers |
nothing — the spec corpus is untouched |
| B | markers only, over 58 files / 4 880 facts / 4 944 markers, check --exhaustive at 0 |
nothing — Phase B makes no semantic edits by its own law, and the legacy **Status:** lines were kept rather than deleted, so the pass is purely additive |
| L | the four legacy directories relocated to root legacy-spec/, every gate-binding inbound reference repointed |
nothing — two of the four had zero corpus inbound to begin with |
| C | verdicts in the cache: 4 944 / 4 944 markers judged, 4 455 units at 93.0 % | nothing — Phase C edits no document; a verdict lives in the cache, never in the markup |
| D | 302 of 311 drift rows closed; the tree at 99.7 % | nine ledger rows, each named |
| E | the task queue drained: 4 486 confirmed / 1 drift / 3 unverifiable of 4 490 — 99.9 % | one drift row that cannot close in this repository, and it is in deferrals.md with the reason |
14The one boundary where the floor was not green, recorded rather than
smoothed. The Phase C close self-check went red on
cli_pkg_cycle::install_from_git_registry. Root-caused and proven in-session: a
~/.vibe/registry.toml had appeared on the machine that day, and the test
isolates VIBE_REGISTRY_CACHE but not the settings chokepoint, so the
global registries merged into the "hermetic" resolver and minted a second cache
bucket; with VIBE_SETTINGS pointed at an empty directory the same test passes.
The campaign's own gate (progress check) stayed 0 and the phase's commits
were docs-only and unrelated. Ledgered as F-055 and fixed in Phase E — after
which «the floor ends the phase green with no VIBE_SETTINGS override», F-055
genuinely fixed rather than worked around.
##A-PHASE-THAT-LEAVES-THE-FLOOR-RED-IS-STILL-OPEN is the rule this brushes,
and the only reading under which C could close is the one the ledger states: the
red was outside the phase's own diff, and it was proven so rather than assumed.
15Two things that are NOT safe stops, both learned at cost:
- 16A batch whose files are written and whose journal step is still open. §4's
recovery rule is not advisory — step open ⇒
git restoreits files and redo the step. Steps are idempotent by construction precisely so this is cheap. - Delegated work committed on a filled-in task journal rather than on the completion notification. Executors write the ledger as they go, so committing on it captures an intermediate state; doing so once left the tree conform-red for twenty minutes. Now a WAL Constraint, together with its sibling: a gate never seen to go red is not known to work.
5. Phases
17Each phase: entry condition → steps → exit gate (+ prediction, per the campaign-plan discipline). Every session inside any phase obeys §4.
Phase 0 — what stood before Phase A (recorded retrospectively)
18Added 2026-07-31 under the owner's bring-into-line ruling:
flow:campaign-plans' ##PHASE-ZERO-PRODUCES-NO-COMMITS-AND-LATER-PHASES-CARRY-FOUR-ELEMENTS
asks every campaign to open with a phase that produces no commits, and this
plan had none. No Phase 0 ran. This section records what stood before Phase
A, what did Phase 0's job under another name, and what a real Phase 0 would
have caught earlier — written after the fact and labelled as such, not
back-dated into the planning prose.
19The tree before Phase A (§1's own baseline, verified 2026-07-24, restated
here because a Phase 0 is where a reader looks for it): Progress Control did
not exist — no progress-core crate, no vibe progress adapter, no
campaigns/ zone, no dashboard — and <status appeared nowhere in the tree
except PROP-043's own dogfood markers. Host spec/: 91 .md files, 26 699
lines. Free-form **Status:** lines to convert: ~55. specmap: index live,
34 gated orphans in vibe-spec, pre-existing. Three inline grammars the new
markup had to avoid colliding with: @spec:// (~17 uses), #use / #embed /
#source, and <!-- REVIEW: -->.
20What did Phase 0's job. Phase A step 5 — the pilot — is a Phase 0 wearing a
scaffolding phase's clothes, and it behaved exactly as the law asks: three
documents of different genres hand-marked, 46/46 paragraphs, one real drift
caught (spec/design/README's index was incomplete), and one placement
ambiguity found (a document with no preamble under its H1) that amended
PROP-043 §3.8 in place, before Phase B committed a single marker — the
##RULE-PHASE-ZERO-GATES-EVERYTHING-AFTER shape, executed under a different
name. It landed in ac97f26c. One finding arrived outside every prediction: a
live power cut during the phase exposed a missing fsync-before-rename in
write_atomic, fixed with a tolerant cache load plus tests.
21What a Phase 0 would have re-measured, and did not. Both of §1's headline
numbers were wrong, and both were corrected only after Phase B had opened —
##PHASE-ZERO-RE-MEASURE-THE-NUMBERS is the rule they miss:
| §1 said | scan / B0 measured |
why |
|---|---|---|
| 91 files | 97 | six progress-control documents were authored after the baseline froze |
| ~55 status lines | 73 | the estimate missed the **status: and **Status.** variants |
23Neither cost anything, because both moved in the harmless direction. The scope
itself then moved twice more on owner rulings — 8901cd05 dropped
terraforms/research/neworder, 1c48019a dropped spec/discipline — so the
observed corpus ran 97 → 94 → 59 → 58 and the plan's own §1 denominator was
never the one the campaign executed against. A baseline that is not re-measured
at the phase boundary is a number the report will have to apologise for. Wave
2 inherited the lesson and re-measured its own §1 at Phase A step 1, where three
of its figures fell.
Phase A — Scaffold
24Entry: this plan + PROP-043 exist. Steps:
- 25Owner ratifies PROP-043 (or amends; amendments land before code).
- Build the core crate +
vibe progressadapter: scan / check (--exhaustive) / report (views, audiences) / mirror / weave (--digest,--max-tokens) / rescan / resume. Fixtures include the foreign-grammar non-collision corpus. - Create
campaigns/progress-2026-08/skeleton + journal/state schemas. - Dashboard:
tools/progress-dashboard/serve.mjs— zero-dependencynode:http, one vanilla page, pollrun/state/, read-only. Screens: Resume · Overview · Corpus · Stitching · Tasks. - Pilot: hand-mark 2–3 documents of different genres (one PROP, one terraform plan, one design doc); run the full loop scan→check→report→ mirror→weave on the pilot.
26Exit gate: self-check green with the new crate; check --exhaustive
correct on pilot (0 unmarked); dashboard renders pilot state; RESUME.md
generates. Prediction: the pilot exposes ≤ a handful of grammar/placement
ambiguities — they amend PROP-043 §3 before Phase B, after which the grammar
holds for the whole wave without further amendment.
Phase B — Markup (facts pass)
27Entry: A closed. Executor: Fable. Steps:
- 28B0: mechanical conversion of ~55
**Status:**lines into document markers (script-assisted, reviewed as one diff). - B1…Bn: file batches (~8–12 files each). Per file: paragraph-exhaustive
markers; sense-preserving re-splits of under-granular paragraphs; missing
{#anchor}s added;audiencewhere obvious; cross-doc findings recorded into the ledger in passing (first stitching input is free). - Semantic edits are FORBIDDEN in this phase — a semantic problem found becomes a ledger finding, not an edit.
29Exit gate: check --exhaustive green over the whole wave-1 scope; mirror
populated; batch diffs contain markers/splits/anchors only. Prediction:
91 files ≈ 9–12 batches; the unmarked counter is what catches skipped
paragraphs, not reviewer attention (expect ≥1 real catch).
Phase L — Legacy relocation (owner amendment, 2026-07-25)
30Entry: B closed. Ordering law: L completes before Phase C opens — verification must cover the relocated facts (owner: «Это нужно сделать до фазы верификации, чтобы верификация проверила еще и эти перенесенные факты»). Executor: Fable (inventory, fact moves, markup); Opus only for mechanical bulk the §2 calculus clears. Mandate (owner, 2026-07-25, verbatim): «После фазы разметки я хочу добавить еще одну фазу: чистка terraforms/neworder/discipline/research. Я хочу в итоге убрать их из дерева spec и переместить в новую директорию в корне: legacy-spec. Но для этого нужно, чтобы на них перестали ссылаться.» Steps, in the owner's order:
- 31L1 — reference inventory: every reference into
vibevm/vibespecs/terraforms/**,vibevm/vibespecs/research/**,spec/neworder/**,spec/discipline/**from (a) the living corpus (common/design/modules/manual-tests/boot/) and (b) code — specmark scopes /#[spec(...)]/spec://URIs in crates, doctests included. Cross-references between the four legacy dirs don't count — they relocate together. - L2 — fact discovery: for each reference, identify the fact(s) the referrer actually cites at the target.
- L3 — fact relocation: move those facts into the main corpus
(
common/design/modules/manual-tests). Creating new specs is allowed where no natural home exists (owner grant, 2026-07-25: «Если при переносе фактов из устаревших директорий … придется создать какие-то новые спецификации - создавай, это не проблема»). - L4 — markup: every relocated fact gets fact-grain markup (
##anchor+ marker) at its new home; new files enterprogress.tomlscope; referrers repoint to the new anchors. - L5 — relocation: when zero live references remain,
git mvthe four directories tolegacy-spec/at the repo root.
32Note (superseded the same day — see the LOG): the original amendment
kept spec/discipline/README.md in the Phase B markup scope. The
owner's second 2026-07-25 ruling overrode that: discipline is out of
the analysed corpus entirely («теперь Дисциплина — это часть пакетов
ai-native»); progress.toml dropped its glob, and the directory awaits
Phase L's reference inventory + relocation like the other three.
33Exit gate: grep-verified zero references from the living corpus and
crates into the four directories; check --exhaustive green over the
(possibly grown) scope; floor green — specmap included, repointed scopes
must resolve. Review point (RESOLVED, owner, 2026-07-25): this plan
file stays in vibevm/vibespecs/terraforms/ for now — «Я передумал. План этой
кампании пока переносить не нужно. Я хочу чтобы у нас остался правильный
набор спецификаций и других инструкций, чтобы мы могли делать
периодические проверки каждый месяц» — the §6 monthly recurrence needs
the plan and its instruction set in place. L5 therefore excludes this
plan file from the vibevm/vibespecs/terraforms/ move; its eventual home is a
future owner call, no earlier than campaign close-out.
Phase C — Verification (evidence pass)
34Entry: B and L closed (owner amendment 2026-07-25; per-cluster
start allowed once a cluster's files are marked and untouched by L). Executor: Fable + machine evidence. Steps: every marker gets a
verdict in the cache — confirmed / drift / unverifiable:
- 35machine first: specmap join (implements/verifies), targeted greps, CLI
--helpsnapshots, manifest checks, test presence; - Fable judgment where machines are silent; verdict without an evidence ref
is rejected by
check(honesty is enforced: not found ⇒unverifiable, never "probably done"); - verification runs (
command → real output) are saved as doc fixtures; harvest cards written while knowledge is hot.
36Exit gate: 100 % of markers carry verdicts; the X/Y/Z summary is recorded
in the LOG — the first measured actuality level of the spec tree.
Prediction: drift concentrates in DRAFT/proposed PROPs and terraform plans
whose **Status:** promised more than the tree delivers; IMPLEMENTED-marked
units mostly confirm.
Phase D — Stitching (fixpoint over the ledger)
37Entry: C verdicts exist for the cluster. Executor: per §2 budget law. Mechanics:
- 38Obligation types:
contradiction·duplication·missing-support·terminology·relocation·reality-mismatch. - Waves: wave N = SPEC tasks over all docs with open incoming obligations; closures may open new obligations → wave N+1. Convergence = empty ledger; a wave with zero new findings = converged (loop-until-dry).
- Escalation rule: a doc pair whose open-obligation count fails to fall for two consecutive waves is a conceptual conflict → owner decision; iteration on that pair stops.
- Clusters: registry (001/002/008/010/021/023/030) · workspace/boot (007/009/011/012/020/022/025/034/035/038) · resolver (003/017) · cli/tui (036/037/039/040/041/042) · common/plans/design/research.
reality-mismatchresolves via the sync-from-code flow (owner approves spec diffs);removeverdicts execute here (delete or demote to idea-archive).
39Exit gate: ledger empty (or every survivor is an owner-ruled deferral); markers of all touched units updated. Prediction: obligations per wave fall roughly geometrically; ≤3 waves for wave-1 scope; ≤2 owner escalations.
Phase E — Coding (drift-correction by tasks)
40Entry: per IMPL task — unit stability: every anchor the task cites has
no open obligation and no unknown marker (clusters release independently;
Opus never codes against a moving spec). Steps:
- 41Fable authors DRIFT-NNN tasks from
drift+continueverdicts, priority: user-facing broken promises → internal mechanics → polish. - Opus executes exactly per template (stop-rule on any ambiguity); Fable
reviews against §6-acceptance verbatim; markers updated on completion
(
impl/work → impl/done → test/plan…); specmap tags on new code shrink the orphan count. reworkitems: feature-flag disable decision (cargo feature vs runtime gate) is recorded as a decision record at this phase's start, then executed per item.
42Exit gate: task queue drained or explicitly deferred; floor green;
report --view todo matches the deferrals file exactly. Prediction: ≥80 %
of DRIFT tasks land without a returned round-trip — the template carries
enough context; returned clusters indicate spec gaps, feeding D-waves.
Phase F — Plans and fold
43DEFERRED TO WAVE 2 — owner ruling, 2026-07-26. Close-out measured all three of this phase's views and found them empty:
freeze/plan+freeze/work0,action="rework"0,stage="idea"0,state="hold"1. Phase B recorded what every fact is and was never asked to decide what should happen to it, so the plans below are projections of judgments the campaign never made. Building them from the findings ledger instead was offered and declined; running a judgment-marking pass first was offered and folded into wave 2, where it can cover thepackages/corpus in the same sweep. See §11's gap list for the measurement.
44Three owner plans generated from views: release/productization
(freeze-candidates → showable), improvement (rework + disabled),
global idea ledger (idea/hold). Marker density folds: agreeing sections
collapse to unit markers (lossless, check-verified). vibe progress check
enters the standing gate panel. Exit: owner accepts the three plans.
Phase G — Documentation
45DEFERRED TO WAVE 2 — owner ruling, 2026-07-26. This phase's stated input does not exist:
campaigns/progress-2026-08/harvest/is empty anddocdebt.jsoncarries zero cards, because Phase C skipped the step that would have written them ("verification runs saved as doc fixtures; harvest cards written while knowledge is hot") and its exit gate did not check for them. Writing the two trees from freshly captured runs was offered and declined as this session's tail; narrowing to the User Guide alone was offered and declined. Both trees, and the harvest pass they depend on, move to wave 2 — where the Package Author Guide meets thepackages/corpus it is actually about.
46Two trees written from proven behavior (harvest cards + captured runs),
never from spec prose: User Guide (audience=user) and Package Author
Guide (audience=author). Chapters release as their features stabilize
(pipeline with E, not a barrier). Each page carries documents:
spec://…#anchor metadata → doc-coverage becomes a ratchet. Owner reads for
register and truth. Exit: every --view doc row is either published or
explicitly deferred; doc-coverage ratchet armed.
Close-out
47baseline.json written; open tails → deferrals.md; REPORT section below
filled against every prediction; run/ archived; WAL updated; version tag
proposed to the owner.
6. Recurrence (the monthly re-run)
48vibe progress rescan --baseline <prev>/baseline.json → new / suspect /
carried-forward lists → mini-B on new+changed → re-verify suspect (+ random
control of carried-forward) → mini-D on new findings → tasks → new baseline.
Cost O(delta). Between runs, the maintenance discipline (PROP-043 §10) and a
health-audit category ("markers vs reality") keep the delta small. This plan
is the standing playbook for those runs; each run appends its own LOG entry
and rewrites baseline.json.
7. Dashboard contract
49Reads run/state/*.json only (never Markdown, never computes). Zero npm
dependencies. Screens: Resume (open steps red, next steps, freshness
plaque), Overview (phase lane, counters), Corpus (tree colored by
rollup, five views + audience filter), Stitching (ledger table +
open-obligations-per-wave chart; non-falling pairs highlighted as
escalations), Tasks (both queues, statuses, claim owners). Localhost,
read-only, no auth.
8. Predictions (falsifiable, campaign-wide)
- 50Wave-1 full weave fits ≤2 shards of a 1M window (digest fits trivially).
- The exhaustive counter catches ≥1 genuinely skipped paragraph that review alone would have missed.
- ≥60 % of
**Status:** IMPLEMENTED/SHIPPEDclaims confirm without drift; ≤10 % of all units endunverifiable. - Stitching converges in ≤3 waves with ≤2 owner escalations.
- ≥80 % of DRIFT tasks land without a returned round-trip.
- The month budget holds: A ≈ days, B ≈ 1–1.5 weeks, C ≈ 1 week, D ≈ 3–5 days, E ≈ open-ended by queue, F+G ≈ 1 week overlapping E.
8.5 Non-goals (named retrospectively)
51Added 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 was a real boundary the campaign held — most of them owner rulings
recorded in §9 — but none was written down as a non-goal at authoring time, and
the two that ended up costing something (the judgment axis, the doc trees) are
exactly the two that were never named. Reason and disposition on each, per
##EVERY-NON-GOAL-CARRIES-A-REASON-AND-A-DISPOSITION.
- 52Does NOT extend to `packages/
.** *Reason:* one corpus at a time; the method had to be proven before it was scaled. *Disposition:* **wave 2**, [PACKAGES-ACTUALIZATION-CAMPAIGN-v0.1.xml`](PACKAGES-ACTUALIZATION-CAMPAIGN-v0.1.xml). - Does NOT touch `vibevm/vibepacks/org.vibevm.fractality/`. Reason: its own specspace, own boot contract, own WAL; the mandate excluded it in as many words («the fractality specspace excluded until the owner says otherwise»). Disposition: held by the owner. *(Recorded 2026-07-31, because it turned out to matter: that specspace is a second adopter* of several flows this programme measures, and a perimeter blind to it reads adoption as absence.)
- Does NOT mark or verify the relocated legacy directories. Reason: Phase
L moved terraforms / research / neworder / discipline to root
legacy-spec/as historical records, not living contracts. Disposition: rejected outright — and reinforced by the owner's ruling of 2026-07-31 thatlegacy-spec/**is not evidence of practice in either direction. - Does NOT mark generated artifacts.
vibevm/vibespecs/boot/STATIC.xml,vibevm/vibespecs/boot/INDEX.mdandvibevm/vibespecs/WAL.xmlin session form. Reason: markup written into a generated file dies at the nextvibe installor wind-down. Disposition: rejected; owner rulings 2026-07-24. The authored boot snippets (00-core,90-user) stay observed viavibevm/vibespecs/boot/[0-9]*.md. - Does NOT edit
vibevm/vibespecs/boot/90-user.xml. Reason: user-owned;00-core'sNOTOUCH-90-USERforbids it to every session. Disposition: deferred to the owner, not to a campaign — F-063's half was handed over in full rather than edited, and closed 2026-07-26 when the owner lifted the bar. - Does NOT decide what should happen to a fact. Phase B marked what 4 917
facts are; nothing in any phase asked what should be done about them.
Reason: none was given at authoring time — this is the non-goal the campaign
held without ever choosing it, which is why §5-F's three views came out empty
(
freeze/plan0,action="rework"0,stage="idea"0). Disposition: deferred to wave 2 as amendment A3(i), the judgment-marking pass. - Does NOT write the two documentation trees. User Guide and Package Author
Guide. Reason: Phase G's definition demands harvest cards and captured runs
as input, and Phase C skipped the step that produces them. Disposition:
deferred to wave 2 as amendment A3(ii) — the Package Author Guide in
particular, since
packages/is the corpus it documents. - Does NOT use fractality. Reason: the owner's decision, verbatim in §0, deliberately overriding the standing delegation-first default for this campaign's duration — «Я хочу чтобы Fable сделала максимум высокоуровневых задач». Disposition: held by the owner; do not "optimize" it back.
8.6 Risks and fallbacks (recorded retrospectively)
53Added 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. A risk register written after the campaign is a list of
what happened, not of what was feared, and it is labelled as such: each row
below fired, and each says what detected it — including the four whose honest
answer is «nothing detected it; the next phase tripped over it». The
fired-and-undetected column is the useful part of a retrospective register,
because it is the part wave 2 turned into amendments.
- 54R1 — a verdict whose evidence is another spec document. Fired: F-063.
Five token-precedence anchors in PROP-002 were sealed
confirmedon the evidence «token loader 3-source order matches 90-user boot facts» — another spec file, carrying the identical error, in a security-relevant place. Detection that existed: none. Phase C's exit gate checked only that every marker carried a verdict, never what the verdict rested on. Fallback taken: wave 2's amendment A2 — every verdict names which source class it rests on, and one resting on the package's own artifacts alone is counted as self-referential rather than as independent confirmation. - R2 — the campaign's own corrections introduce drift. Fired: F-065.
Phase D authored a
Shipped:line claiming aBaseline::storethat had never been built, and the verification pass then confirmed the row on it. Detection that existed: none — nothing predicted that stitching could add false claims. Fallback taken: wave 2's prediction 6, which makes «zero new false claims, zero of them confirmed» falsifiable, with wave 1's answer on record as 1 and 1. - R3 — a phase whose exit gate does not check its own steps. Fired: 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. Detection: the downstream phase, three days late. Fallback taken: wave 2's amendment A1 — every exit gate enumerates that phase's own steps.
- R4 — a prediction no step forces you to run. Fired: prediction 1. No
step of the plan required a
weave, so the claim sat untested for the whole campaign and was measured at close-out purely to fill the report row. Plan B taken: wave 2's amendment A5 — every prediction names the step that tests it, or says outright that it is scored at close-out on purpose. - R5 — a state projection nothing refreshes drifts silently. Fired:
tasks.jsonsat 18 tasks stale and the dashboard read five tasks for a week;findings.jsonsurvived only because it was maintained by hand all campaign. Detection: none — a projection nothing refreshes and nothing checks has no signal by construction. Fallback: the numbers of record are the ones a command prints, never the ones a projection holds. - R6 — a gate never seen to go red is not known to work. Fired: twice, favourably — two executors ran positive controls before trusting a green result, and were right to. Fallback: now a standing WAL Constraint.
- R7 — session death, budget exhaustion, power loss mid-corpus. The one
risk this plan did carry a fallback for, in §4, and it held: journal
step-start/step-done, torn tail discarded, maximum loss one step. Fired: a live power cut during Phase A, which additionally exposed a missing fsync-before-rename inwrite_atomic— fixed with a tolerant cache load plus tests. Verdict: the crash-safety law is the one part of this plan that was written in advance and needed no amendment. - R8 — an un-isolated test reaches real user state. Fired: F-057, filed as
a stray cache directory and found to be a credential-precedence leg —
vibe searchresolves a GitHub token through four legs and the fourth is a file in the settings directory the test could not reach, so an un-isolated run attached the real publish token to its outbound request. Detection: accidental, on the third pass — F-055, F-056 and F-057 were one forgotten discipline caught three times by accident. Measured, not inferred: against a loopback listener recording header names and lengths only, 47 bytes ofAuthorizationbefore the fix, none after; exactly one test reaches that path and it pointsapi_baseat 127.0.0.1, so the investigation closed with no rotation needed. Fallback taken: DRIFT-020 converts the discipline into a gate.
9. LOG (execution ledger — append per batch/wave/phase)
- 552026-07-24 · Phase A CLOSED, exit gate green in full. Commits
9446a2cb1276c3edd487b(document package) ·8b18152(core + adapter) ·38855c0(campaign zone + dashboard) ·ac97f26(pilot + ratification + §3.8 amendment) ·9a69b6f(WAL). PROP-043 RATIFIED in session. Pilot: 3 genres, 46/46 paragraphs marked, one real drift caught (design/README index was incomplete — fixed). Predictions: "pilot exposes placement ambiguities" CONFIRMED (the preamble-less-H1 amendment); bonus finding outside any prediction — a live power cut exposed missing fsync-before-rename inwrite_atomic; fixed with tolerant cache load + tests. Floor (self-check) green;progress-coregated in conform. - 2026-07-24 · B0 default ruled (Fable, owner-visible in session):
the converted
**Status:**lines are NOT deleted — the document marker is ADDED and the legacy line stays (its dates and prose are history; deduplication is Phase D material). Phase B makes no semantic edits, per its own law. - 2026-07-24 · Phase B OPENED; B0 landed.
progress.toml(wave-1 scopespec/**/*.md) committed as the campaign's first journal step (8d5ccc8); scan on the narrowed scope: 97 files (§1 counted 91 — the six newcomers are the progress-control documents authored after the baseline froze), 3 684 paragraphs, 46 pre-marked by the pilot. B0 converted 73 legacy status lines (not ~55 — the §1 estimate missed the**status:/**Status.**variants) into document markers as one reviewed diff: 73 files, +73 marker lines, 0 deletions (the B0 ruling above held — legacy lines stay).checkclean; markers 68 → 141. First stitching input recorded in passing: 12 ledger findings (F-001…F-012,run/state/findings.json) — status lines contradicted by executed plans or shipped crates (SELF-SUFFICIENCY / SETTINGS-HOME / CONVERT / CULTURAL-EXTRACTION plans; the PROP-019/024/030/036/037/040 family; two missing superseded notices: TREE-TUI v0.1, PROP-026). - Scope question for the owner (found in B0, parked):
vibevm/vibespecs/boot/STATIC.xmlandvibevm/vibespecs/boot/INDEX.mdare generated by vibe («do not edit») yet sit inside the wave-1 scopespec/**/*.md. Markup written into them dies on the nextvibe installregeneration. Options: exclude generated boot artifacts fromprogress.toml, or carry their markers in the generators. Until ruled, B1 batches skip both files — which keepscheck --exhaustivered on them, so the Phase B exit gate needs this ruling. - 2026-07-24 · B1 (vibevm/vibespecs/common, paragraph grammar) landed — then the
grain changed. All 12
vibevm/vibespecs/commonfiles marked paragraph-exhaustively (389 paragraphs; PROP-000 got its document marker + the missing{#invariants}anchor; open-questions sections markedspec/work),checkclean, commit91274c8. Mid-batch a real power cut killed the session; §4 recovery worked as designed — journal showed one open step (b1-prop-000), rescan verified its edits clean, the step closed without redo. In passing: PROP-000 §3 still describes the pre-2026-07-12 proprietary-EULA posture (F-014-to-be), PROP-018's MVP is implemented while its line says proposed (F-013-to-be), and the cache does not prune records that fall out of scope afterprogress.tomlnarrowing — corpus.json carries 497 entries vs 97 observed, dashboard counters inflated (DRIFT-001-to-be). - 2026-07-24 · FACT-GRAIN DIRECTIVE (owner, in session, verbatim):
«Каждый элемент такого списка по сути является самостоятельным
фактом, и его тоже нужно размечать. В том числе, inline факты
перечисленные внутри текста … Я хочу чтобы ты для всех текстов
сделала полное деконструирование всех фактов, имеющихся в системе,
совершенно всех текстов. … если какой-то абзац можно переписать в
виде нумерованного или ненумерованного списка фактов и каждому из
них поставить в соответствие разметку статуса — нужно сделать это. В
идеале почти все тексты превращаются в какие-то списки … Это
означает ЗНАЧИТЕЛЬНОЕ УСЛОЖНЕНИЕ кода Системы, инструкций Системы и
рост количества фактов … Уже проиндексированное и размеченное нужно
переиндексировать и переразметить». Clarifications the same session:
list-item markers go at the item's start or end,
@or XML notation both; table cells are marked the same way. Ratified into PROP-043 as the fact amendment (§3.8 items 4–6, §3.9, §8) — the campaign granularity drops from paragraph to fact; deconstruction of multi-fact prose into lists is now part of the markup pass (sense-preserving, wording-preserving; semantic edits still forbidden); everything already marked (pilot + B0 doc markers + B1 common) is re-marked under the fact grammar. - 2026-07-24 · Fact-anchor addenda (owner, same session): (1)
list-item markers sit at the item's start or end,
@or XML notation both; (2) «таблицы тоже нужно в ячейках размечать аналогичным способом» — table body cells are units, marked in-cell; (3) list items get hashtag addressing — «Элементам списков стоит придумать адресацию с помощью хэштегов … формат типа1. #RULE-001 Текст правила @status:freeze/done», refined to##RULE-001(double hash) «чтобы их отличать» from the#use-family directives; (4) «каждый абзац, каждый элемент списка … который имеет статус, нужно разметить с помощью якоря» — the anchored-when-marked law: a marked unit without a##<ID>anchor is acheckerror. All four ratified into PROP-043 §3.8 / §8. - 2026-07-24 · Fact-grain scanner LANDED; fact grammar re-piloted.
PROP-043 amendment ratified and committed (
cd2688f); the scanner (b67fa97): list items at every nesting level, lead lines, table body cells as countable units,##<ID>fact anchors in one id space with heading anchors, duplicate detection, the anchored-when-marked error; 31 tests green, cache schema 2 (the rebuild also flushed the 400 out-of-scope records — DRIFT-001 still files the general prune defect for Opus,910d545). Scale shift measured: wave-1 = 3 684 paragraphs → 8 219 facts;checkcurrently carries 435 expected MissingAnchor errors on the pre-amendment markup (pilot + B1 common) — they burn down as files are re-marked. Re-pilot (6714876): PROP-029 deconstructed 9 paragraphs → 30 anchored facts, 0 unmarked, 0 issues — the demo the owner reviewed in session. Ledger: F-013 (PROP-018 MVP implemented vs proposed), F-014 (PROP-000 §3 license text predates the 2026-07-12 UPL-1.0 relicense). - RESOLVED review point (owner, 2026-07-24) — anchor naming
convention: the re-pilot mixed
##UPPER-SLUGfor normative facts (ADDR-LAW, RULE-style) with##kebabfor service units (status-line, carriers-lead). Keep both registers, or fix one? Ruling: both registers stay — UPPER = normative fact, kebab = service unit; the register itself carries the normativity signal. Recorded as a decision at PROP-043 §3.8. - RESOLVED review point (owner, 2026-07-24) — generated files in
scope:
vibevm/vibespecs/boot/STATIC.xml+INDEX.mdare vibe-generated («do not edit») yet inside the wave-1 globs; markup written there dies on regeneration. Exclude them fromprogress.toml, or carry their markers in the generators? Ruling: exclude from scope. §4 of PROP-043 is include-only by design, so the exclusion is expressed by include enumeration (vibevm/vibespecs/boot/[0-9]*.mdadmits the authored snippets, skips the generated pair); cache rebuilt from scratch (the DRIFT-001 no-prune defect makes a stale-record purge otherwise impossible). Scope: 97 → 95 files, 8 219 → 7 872 facts. This also closes the B0-parked scope question above. - 2026-07-24 · B1f LANDED — vibevm/vibespecs/common is fact-grain clean; the two
review points RESOLVED (above). The scanner-handover step was closed
retroactively (
b67fa97verified committed; RESUME had prescribed a redo of finished work). All 11 remainingvibevm/vibespecs/commonfiles re-marked under the fact grammar: 386 paragraph-grain units → 979 anchored facts (batch commits83bed35/4aed13f/d639bcf; the batch-1 message overstates its own counts — 109 units → 296 facts is the true figure, corrected here, history left unrewritten). Cluster total: 1 009 facts, 0 unmarked, 0 issues — cluster MissingAnchor 386 → 0; the wave's residue is 40 expected errors in the two pilot files (SHRINK-PLAN 28, design/README 12), owned by their B2+ batches. Grammar traps found and recorded: blockquote units cannot carry##anchors (ledgered F-015; two units re-formed — a bold paragraph, a fenced template); a wrapped prose line whose continuation opens with+parses as a phantom list item (two fixed in PROP-019). Tasks queued for Opus: DRIFT-002 (parse.rs809 lines > 600 budget — the standing floor is RED on this single new conform finding until it lands; the B1f batch commits were made against that known, ledgered red) and DRIFT-003 (campaign.jsonphase hardcoded"A", dashboard/RESUME render a stale phase). Prediction check in passing: the §5-B "unmarked counter catches what review misses" prediction keeps confirming — the counter caught both phantom-item wraps instantly. - 2026-07-24 · DRIFT-002 executed and landed — the floor is green
again. First DRIFT task through the full loop: Opus executed the
parse.rs split exactly per the task file (six
parse/modules, max 261 lines; motion, not rewrite), Fable reviewed and accepted (spot-diff verbatim, differential oracle — corpus identical modulo timestamp, 31 tests green, conform 0 new,self-checkall green with the real exit code). One accepted deviation: per-file//!module docs, the crate's own convention. B2 opened in parallel the same evening: templates + modules README + PROP-042/025 marked (F-016 structural index drift, F-017 code-ahead-of-specvibe aiui scrollbar). The §5-E prediction ("≥80 % of DRIFT tasks land without a returned round-trip") starts 1/1. - 2026-07-24 · DRIFT-003 landed — the phase lane is honest; B2 runs
through batch 5. Second DRIFT task through the loop, again no
returned round-trip (§5-E prediction 2/2): the phase is now an
append-only journal event (
{"kind":"phase","value":"B"}, last wins, absent ⇒ "A"), derived by the adapter — never compiled in, never parsed from Markdown;read_journaldistinguishes a torn tail (incomplete JSON, stops) from an unknown kind (complete JSON, skipped) with both laws test-pinned; the live journal is backfilled andcampaign.json/RESUME render B. B2 batches 3–5 in parallel: PROP-026 (superseded-in-topology arc split impl/done vs spec/done per fact), PROP-021/023 (bridge pair), PROP-020/022 (F-018: hooks ship while the line says proposed), PROP-041 (owner-minted per-REQ{#anchor}s reused verbatim as##ids — one name, two notations; two heading-vs-REQ same-name collisions surfaced by the shared id space, F-019 for the stale DRAFT line). Ledger: 19 findings. B2 stands at 12/35 files. - RESOLVED review point (owner, 2026-07-24, in session) — the WAL
and the boot files: «vibevm/vibespecs/WAL.xml не должен участвовать в проверке,
это генерирующиеся артефакты; также проверь про файлы внутри
vibevm/vibespecs/boot». Ruling applied:
vibevm/vibespecs/WAL.xmlis out of scope — the checkpoint is rewritten wholesale at every session end, so markup cannot live in it (the same mortality argument as the generated boot pair). The boot check reported back:STATIC.md/INDEX.mdare generated and were already excluded by the morning ruling;00-core.xml/90-user.xmlare authored, user-owned, never written by vibe (PROP-000 invariant 3) — they stay observed. Scope: 95 → 94 files; thespec/*.mdinclude is gone (WAL was its only match), so a future top-level spec doc must be added toprogress.tomlexplicitly. - 2026-07-24 · Owner directive — the coder-tier engine version. The
§2 coder tier ("Opus") runs on the owner-designated engine
claude-opus-5from the next session on. Verified: the id is live (one-shot CLI probe answered); the session-alias default resolves to the previous engine, so two pins are installed — the machine-local subagent-model env pin (.claude/settings.local.json, blanket) and the committed selective agent type (.claude/agents/opus5.md) — both effective from the next session (agent-type registration and settings-env injection are session-start events; verified empirically mid-session). Tasks DRIFT-002…005 of this date executed on the session-alias engine before the directive; all passed review with no returned round-trip. - 2026-07-24 · DRIFT-005 landed — F-022 closed end to end; the DRIFT
loop stands 5/5 no-return. The owner's fact-links commission is
complete across all three layers: contract (PROP-014 §2.1 + PROP-035
§5/§7.3 with the reviewed heading-repeat precision), engine
(DRIFT-004, core v0.8.0 mdspec fact units — all language families
inherit through the shared engine at their next minting), and host
compiler (DRIFT-005, vibe-spec:
NodeKind::FactIR leaves, per-fact override under:add,CompileError::DuplicateIdmerged-view gate, fact-addressed#embed). Code can now citespec://…#<FACT-ID>per statement, and the §6 evidence join gains the campaign grain for Phase C. Session-end: the coder-tier engine pin (claude-opus-5) binds from the next session. - 2026-07-25 · B2 modules sweep — 18 files in batches 8–18; B2 at
32/35. PROP-015/034/027/036/030/011/012/010/040/038/008/001/009/
017/043/035/037/007 marked at fact grain (commits
b27336ae…1e7dff01), ~1 540 units → ~1 770 anchored facts; every file 0 unmarked / 0 issues. Grammar precedents set: the Decision-paragraph idiom,##req-*/##design-*lines,##self-uri, checkbox anchors before[x],@impl/planfor unexecuted phase plans, superseded-arc spec/done-vs-impl/done, em-dash cells count. Ledger +7: F-023 (dangling PROP-043 launcher ref) and the stale-header family F-024…F-029 — one Phase C/D sweep fixes all. GitVerse SSH down all session (verified clean ancestor via HTTPS; plain re-fan on recovery, never--force); GitHub carries everything. - RESOLVED scope ruling (owner, 2026-07-25, in session): «я хочу
исключить из проверки vibevm/vibespecs/terraforms, vibevm/vibespecs/research, spec/neworder.
Это те вещи, которые мы делали в качестве рефакторингов и
исследований давным-давно». Ruling applied: the three subtrees
leave the include enumeration in
progress.toml— long-executed plans and studies are historical records, not living contracts. Scope: 94 → 59 files, 8 589 → 4 889 facts; the SHRINK-PLAN pilot (28 expected errors) leaves with terraforms, so the expectedcheckresidue drops to 12 (design/README, burns at its re-mark). The DRIFT-001 cache prune dropped the out-of-scope records cleanly. The campaign plan itself is now out of scope — its LOG stays the process record, unmarked. - Next step: finish the B2 tail — PROP-005 → PROP-003 → PROP-002
(modules to 35/35), then
vibevm/vibespecs/design(incl. the README re-mark burning the last 12 expected errors),vibevm/vibespecs/bootauthored pair (additive markers only — user-owned files, zero re-forming),vibevm/vibespecs/manual-testsMT-01/02/03,spec/discipline/README. Journal step per file; batch commits ~1–3 files; then the Phase B exit gate (check --exhaustiveclean over the 59-file scope) and the §4 boundary ritual. - 2026-07-25 · B2 batch 20 — PROP-003 marked; third superseded-arc
split. 310 units → 313 anchored facts, 0/0 (
d596c631). The libsolv engine sections (§2.2/§2.3/§3.x, phase A, migration step 1) record history at spec/done — the SUPERSEDED-by-PROP-017 blockquote re-formed verbatim per F-015; the dependency vocabulary is impl/done verified against the shipped crates (features.rs incl. weak?/and exclusive groups, activation.rs —if_osimpl/work per its recorded deviates, conditional.rs + fixpoint, manifest/i18n.rs, the four vibe-check entries, lockfile meta/package fields). Unshipped details stay spec/done:pin_preferences(recorded deviates),VIBE_LANGUAGE, dotted-key translations,--all-languages,vibe review,outdated --upstream, the LLM emission engine (vibe-llmpending); Phase F impl/plan. req-line fact ids dodge the owner-mintedreq-*heading anchors via-req/-designsuffixes. Ledger +2: F-030 (stale design-proposal status line — F-024 family), F-031 (internal r2 leftovers: §2.8 fence r1 syntax, §4.3 → §2.5.4 misref, §2.7.5/§2.9 examples vs shippedlanguage_chain/schema-v5 shape). - 2026-07-25 · Owner amendment — Phase L (legacy relocation) inserted
between B and C. Directive quoted verbatim in the §5 Phase L section;
the four dirs
vibevm/vibespecs/terraformsvibevm/vibespecs/researchspec/neworderspec/disciplineleave the spec tree for rootlegacy-spec/once nothing references them: L1 reference inventory (living corpus + code — specmark, doctests) → L2 fact discovery → L3 fact relocation intocommon/design/modules/manual-tests(new specs allowed — owner grant same day) → L4 fact-grain markup at the new homes (+progress.tomlscope grows) → L5git mvtolegacy-spec/. Ordering law: before Phase C, so verification covers the relocated facts. Phase C entry updated to "B and L closed". Review point (OPEN): the campaign plan itself lives invibevm/vibespecs/terraforms/— relocate mid-campaign or at close-out? Owner call before L5.
- 56RESOLVED scope ruling (owner, 2026-07-25, second in session):
«spec/discipline нужно исключить из анализируемого корпуса, потому что
теперь Дисциплина - это часть пакетов ai-native, а саму spec/discipline
после определения и портирования ссылок - перенести в legacy-spec.
Сейчас она всё ещё в основном корпусе». Ruling applied:
spec/discipline/**leaves theprogress.tomlinclude enumeration — the Discipline's living home is the ai-native packages (core-ai-native+ the language stacks), so the host copy is a historical record like terraforms/research/neworder. Scope: 59 → 58 files; discipline/README's 16 facts leave the corpus; the B2 tail is now boot pair + manual-tests only. The Phase L §5 note that kept discipline/README in the B scope is superseded (corrected in place); Phase L's four-directory relocation list is unchanged — discipline still relocates tolegacy-spec/after L1's reference inventory and L3's fact porting.
- 572026-07-25 · PHASE B CLOSED — the corpus is fully marked; exit gate
green in full. Gate:
progress check --exhaustiveclean over the final scope (58 files, 4 880 facts, 4 944 markers, 0 errors, 0 warnings); floorbash tools/self-check.sh→all green, real exit code 0. Final scope after the two 2026-07-25 rulings: 58 files / 4 880 facts (94→59 terraforms/research/neworder; 59→58 discipline). The B2 tail (batches 20–26, this session): PROP-003 — 313 facts, the third superseded-arc split, vocabulary verified against the shipped crates (d596c631); PROP-002 — 359 facts, modules close 35/35 (9328becb); design/README re-mark burns the last 12 expected errors — the gate reads 0 for the first time in the campaign (cb6e55b0); loading-and-boot-model + action-system (d1a09275); workspace-and-qualified-naming + tui-visual-language — design 6/6 (91fde06c); the authored boot pair, additive-only honoured line-for-line (ae10dca2); manual-tests MT-01/02/03 — genre precedent: step items and their Expected paragraphs are separate units, pending sign-offs honestlyimpl/work(7d9dd964). Interleaved the same session: the Phase L owner amendment (c0147947) and the discipline scope ruling (1c48019a). Ledger at close: 35 findings (F-030…F-034 new — two stale-header rows, PROP-003's internal r2 drift, the lore "forthcoming" family). Predictions (§8) at the boundary: P2 (the counter catches what review misses) CONFIRMED repeatedly — this session it caught the PROP-003 weak-deps continuation and the workspace-naming §7 intro; P5 (DRIFT no-return) holds at 5/5; P6 for B CONFIRMED with room — the markup pass ran 2026-07-24→25, two days against the 1–1.5-week budget — while the §5-B batch-count guess (9–12) was falsified by the mid-phase fact-grain amendment (~30 batches at the finer grain; the grain change, not slippage); P1/P3/P4 stay open for C/D. Phase lane: the journal-derived phase stays B until the owner opens the next; per the 2026-07-25 amendment the next phase is L (legacy relocation), then C. Awaiting the owner's call to open Phase L.
- 58RESOLVED review point + the B→L handoff (owner, 2026-07-25, closing
the session). The plan-file question is settled: the first instinct
(«Сам план кампании тоже перенеси в legacy-spec») was reversed in the
same message — «Я передумал. План этой кампании пока переносить не
нужно. Я хочу чтобы у нас остался правильный набор спецификаций и
других инструкций, чтобы мы могли делать периодические проверки
каждый месяц». Ruling applied: the campaign plan stays in
vibevm/vibespecs/terraforms/; L5's move excludes it (the §5 Phase L review point is rewritten RESOLVED in place); its eventual relocation is a future owner call, no earlier than close-out — the §6 monthly recurrence keeps consuming it in place. And the handoff: «Перенеси все эти активности в следующую сессию и напиши как мне ее продолжить» — Phase L execution moves wholesale to the next session; this session ends at the closed-B boundary;CONTINUE.mdcarries the cold-resume recipe and the recommended opening phrase by which the owner opens Phase L explicitly (the phase event lands in the journal only then, per the DRIFT-003 phase lane).
- 592026-07-25 · PHASE L EXECUTED AND CLOSED — the legacy dirs are out
of the spec tree. Opened on the owner's recorded phrase (journal
phase event
L+l1-inventory). L1 (inventory): gate-binding set = 26 sites in 13 corpus files + 1 crates doc comment (outdated.rs);spec/neworderandspec/disciplinehad zero corpus inbound; out-of-gate referrers classified into live docs (ROADMAP, docs/), historical reports (terraform/), campaign zone, and an explicit leave-list (packages vendored comments, neworder2 baselines, AUDIT quote, closed debt-ledger row DBT-0016, VIBEVM-SPEC — no real refs). L2 (fact discovery) verdict: every cited fact was already corpus-resident — the RP1 rejected-alternative at design/action-system.xml §4 D1, the ten design decisions, the DO1–DO18/Δ1–Δ16 sets restated in place, the settings deltas named inline, the campaign histories in PROP-038 §6 / PROP-027 / PROP-036 — so L3 ported nothing and the owner's new-spec grant went unused; every citation dissolved into archive-provenance form instead (the honest inverse of the plan's port-then-repoint expectation, recorded here as the L2→L3 finding). L4 (repoints): four batch commits83346e78f8f347d89514e8fb1ec6a27c— 26 sites incl. bothspec://org.vibevm.core/vibevm/researchURI retirements, plus four word-level sites the path greps could not see (PROP-031 status-line, PROP-037 plan pointer, PROP-040 delta-mapping, PROP-041spec.research§3.7): the literal-backtick and dotted forms needed a lookbehind/word sweep — a reusable lesson for the §6 recurrence. Scope stayed 58 files (no new files → noprogress.tomlgrowth). L5 (relocation):70f3cbdd— 35 filesgit mv'd (terraforms 25, research 8, neworder 1, discipline 1) to rootlegacy-spec/, the campaign plan carve-out honoured; live out-of-gate pointers followed in the same commit (ROADMAP 15 occurrences, docs/ 8, terraform 2 links, findings.json 11 paths, discipline.lock recipe, progress.toml comment); historical prose, quoted URIs, the closed debt row, and the pre-broken PLAYBOOK link stayed verbatim — records are not rewritten.f311f429regenerated the stale host specmap (absorbed B-phase drift + the move; ratchet 37 gated orphans within allowance, 0 suspects). Exit gate: the reference greps read zero into the four dirs from corpus + crates (plan carve-out aside);check --exhaustiveclean (58 files, 4 880 facts, 0 errors); floorself-checkall green, real exit 0. Phase C (verification) awaits the owner's opening call per the resume-boundary law.
- 602026-07-25 · PHASE C OPENED — the verify loop is live; the boot pair
and manual-tests carry verdicts. Mechanics fixed for the whole phase
(PROP-043 §7.1/§7.5): verdicts live in the cache's per-file
campaignmap —{verify_batch, verified_at, processed_hash, verdicts{anchor → {v, ev[]}}, summary}— never in markup;scanpreserves the maps (verified live) and projects them intocorpus.jsonfor the dashboard. Verdict semantics by stage:impl/done⇒ presence evidence;spec/done⇒ absence (shipped-but-still-marked-spec is the stale-header drift);doc/done⇒ no contradiction with the contract; dated historical records confirm unless falsified; present-state claims blocked by the GitVerse outage gounverifiable, never "probably fine". Per-file coverage is assert-gated (extractor anchors == cachemarker_count== verdict keys). c0-boot (bb337e90): 64 facts — 61 confirmed / 1 drift / 2 unverifiable; the drift is real (LAYER-CODE names a nonexistent roottests/→ F-035, user-owned file so the wording fix is the owner's). c1-manual-tests: 67 facts — 61 / 6 / 0; MT-01's EXP-2/6/7/8/9 describe the pre-revision TUI keymap (shipped: F1…F6 menus, Shift+arrows tabs, Esc+confirm quit) → F-037 re-author; MT-02's footer quote omits F4 and says q-quit, its "once a picker lands" is superseded by the F4 settings menu → F-038; and the sweep caught a code-side stale clap help on--plaincontradicting the shipped console-TUI default → F-036 (Phase E DRIFT candidate). MT-03 verified clean 16/16. Running tally: 131 / 4 944 markers judged — 122 confirmed / 7 drift / 2 unverifiable; findings 38. Machine-evidence base mapped: specmap carries 626 edges intovibevm/vibespecs/modulesunits and 111 intovibevm/vibespecs/common(section grain; facts inherit their section's edges), so the module cluster is the evidence-rich grind; design (6 files) → common → modules is the queued order.
- 612026-07-25 · c2-design — the design cluster verified; the drift
is the aged-tense family. 306 units judged (300 fact anchors + 6
status-element bundles; coverage law recorded in the cache maps:
verdicts key on fact anchors, table cell-markers inherit their row,
<status>elements judged as_elements): 291 confirmed / 15 drift / 0 unverifiable. The drift map: loading-and-boot-model 8 — the lore's three inclusion typesinline/static/dynamic(defaultstatic) against the shippedlink = "static" | "dynamic"(defaultdynamic), plus "forthcoming" ×2 and the §6static|statictypo → F-039; action-system 4 — the F-034 forthcoming family, sharpened byaiui.rsactually shippinglist_actions+invokeagainst the doc's "Not built now"; workspace-naming 1 — the M1.18-vs-M1.19 milestone shift → F-040; tui-visual-language 2 — the "current ASCII scaffolding" present-tense and "When §2.2 carries" against five existing anchors → F-041. Hard confirmations: thedetect_tiersignature matches the lore literally,PAD_X/PAD_Y/ GUTTERexact, palette hexes byte-equal inrose_pine.rs/catppuccin.rs, exit code 7 =AMBIGUOUS_PACKAGE, the §2 module table maps 1:1 ontocrates/vibe-actions/src, and the two-way design↔PROP backlinks hold 4/4 (structural-loader parked by its ownspec/hold). Running tally: 437 units judged — 413 confirmed / 22 drift / 2 unverifiable; findings 41. Next:vibevm/vibespecs/common→vibevm/vibespecs/modules(the specmap-evidence-rich grind).
- 622026-07-25 · c3a-common-small — five common PROPs verified; one
roster drift. PROP-006 (frozen pointer), PROP-013 (audit
instance), PROP-016 (source mirrors), PROP-028 (families), PROP-029
(FQ addresses): 150 units — 149 confirmed / 1 drift / 0
unverifiable. The drift is PROP-028's family roster aged against
the tree:
core-ai-nativeships v0.8.0 (the fact says 0.7.0), the go-ai-native family is in force (aggregator v0.1.0 +-lang+-mcp) but absent from §2.2/§2.3, and aggregators carry aLICENSE.mdfrom the UPL relicense wave against the "vibe.toml + README and nothing else" letter → F-042 (one roster refresh fixes all three). Prime confirmations:cargo xtask mirrorran three times in-session (the tracking-ref refresh of HIST-TRACKING-REFS observed live in its output),push_args_never_forceexists atxtask/src/mirror.rs:426,mirrors.tomlmatches the §2 block verbatim, every §open question across the five files verified genuinely open, and PROP-029's three carriers match the generated INDEX/STATIC forms character-for- character. Running tally: 587 units — 562 confirmed / 23 drift / 2 unverifiable; findings 42. Remaining: the common big seven (PROP-000, 018, 019, 024, 031, 032, 033 — 868 markers; specmap-rich on 018/019) → the modules cluster (3 300 markers).
- 632026-07-25 · c3b — PROP-000 verified: the foundation aged in six
spots (the densest drift file of the phase). 162 units — 149
confirmed / 12 drift / 1 unverifiable, all twelve drifts one
family row F-043: §3 still records the proprietary EULA though
its own revisit trigger fired (UPL-1.0 relicense 2026-07-12, MT-05);
§4 lists the retired
vibe-package.toml; §6 records pre-qualified identity and four kinds while the same file's INV-VOCABULARY correctly lists five (internal r2-leftover-class inconsistency); §7 calls GitVerse "the source-of-truth" against PROP-016's no-primary model and pinsKindNameagainst the Fqdn default; §14's WAL-names-the-runs practice lapsed; §18 claims LLM-reviewed semantic conflicts whose LLM lane is pending. Hard confirms: all seven §2 crates exist, the §15 prune of PROP-001 was executed (its ARG-PRUNED cites §15 back), schemas/ + vibe-wire/generated committed, resolvo pinned, both guides exist. The unverifiable is the GitVerse-network-bound legacy-registry claim (same verdict as c0's twin). - 2026-07-25 · c3c — PROP-018 + PROP-019 confirm wholesale on
implementation evidence. 322 units — 320 confirmed / 2 drift,
both drifts the same shape and both already ledgered in Phase B: a
proposed-era status line over a fully shipped system (F-013
agentic modes, F-005 vvm). Beneath the headers the content
carries the densest machine evidence of the phase: the agentic
relay/skill/affinity/transports/explain sections hold 23 implements
/ 8 verifies into
vibe-mcp/vibe-cli(thevibe agentic+vibe commandverbs run live in this very session), and the vvm's twelve sections map 1:1 ontocommands/vvm/exactly as §3 placed them (37 implements / 38 verifies;relocatealone carries seven). Far-backlog sections verified genuinely unbuilt. Running tally: 1 071 units — 1 031 confirmed / 37 drift / 3 unverifiable; findings 43. Remaining in common: c3d = PROP-024 / 031 / 032 / 033 (384 markers), then the modules cluster (3 300).
- 642026-07-25 · c3d — the common tail verified;
vibevm/vibespecs/commonis CLOSED 12/12. PROP-024 / 031 / 032 / 033: 327 units — 322 confirmed / 5 drift / 0 unverifiable. All five drifts are PROP-024's: the F-006 proposed-era header (ledgered in B) plus a new family row F-044 — the §2.6 deferral fired: the TypeScript pilot shipped, so the deferred engine split executed andcore-ai-nativenow authors the neutral engines (conform/specmap/specmark/mcp cores, vendored byte-identically per PROP-028), making CORE-STAYS-PROMPT-ONLY and OOS-TS-CHECKER false as present-state; the related line also cites the vanishedvibedeps/flow-core-ai-native/0.6.0slot. The §2.4 consumption topology confirmed verbatim (rootCargo.tomlexclude = ["packages", "vibedeps"]; self-check drives the vendored engines by--manifest-pathexactly as BINARY-RUN-FORM specifies). The three design proposals (031/032/033) verified honest end to end: every "schedules no implementation" claim grep-verified (nomove-unit/rename-addressin the stack, nocode://nodes, no[[refactoring]]manifest table, novibe refactorCLI), and PROP-032's decided-in-place q5 record carries its owner date. Running tally: 1 398 units — 1 353 confirmed / 42 drift / 3 unverifiable; findings 44. Verified clusters: boot ✓ manual-tests ✓ design ✓ common ✓ (23 of 58 files). Remaining: the modules cluster (35 files, 3 300 markers — the specmap-richest).
- 652026-07-25 · c4a — the modules cluster opens on the campaign's own contract; the tool that runs this phase verifies itself. vibe-progress family: PROP-043 + OWNER-GUIDE + templates ×3 — **250 units (245 anchors
- 5 element bundles): 236 confirmed / 14 drift / 0 unverifiable.
PROP-043's ten drifts split two ways. F-045 — the file's own status
aged behind the campaign it governs: the status-line still says
"implementation underway (Phase A)" and holds (provisional) sections
that no longer exist (grep = 1, the sentence itself), while the phase
lane reads C and §5 is fully shipped (19 implements edges; all seven
subcommands + every documented flag verified live this session).
F-046 — a marker-vs-implementation parity family in both
directions: impl/done over unshipped fragments (EvidenceProvider wired
nowhere outside the core — the adapter imports everything but
evidence; 0 fact units/edges in host specmap.json — the consumed stack engine v0.7.0 predates the fact amendment, PROP-014 v0.8.0 §2.1 exists authored-side awaiting the re-mint; CMD-CHECK's "lossless folds" matches zero code; campaign.json carries nogatesfield; the report has no evidence column;Cache::is_currentis dead outside its own tests — every run re-parses the tree), and spec/done under shipped code (§7.3:BaselineUnitmatches the record field-for-field, rescan live with hash-suspect + marker-diverged; named-crates and the control sample honestly missing). OWNER-GUIDE's four drifts are all one F-020 refresh sweep (4-of-6 placements, the preamble-less amendment missed twice, FOUR-SURVIVORS omitstasks/). The templates confirm wholesale: impl-task exercised 5/5 (DRIFT-005 checked field-for-field), spec-task correctly awaits Phase D, harvest-card consistent with its emptyharvest/. Method note for the batch map: coverage now reads fromprogress mirror's ParsedDoc (authoritative fence-aware parse) — the raw-grep extractor over-counts code-span shorthands. Running tally: 1 648 / 4 944 — 1 589 confirmed / 56 drift / 3 unverifiable; findings 46 (next free F-047).**
- 662026-07-25 · c4b — the registry core verified; the evidence-richest
file confirms at 98 %. PROP-002 (360 markers, 110 specmap edges) +
PROP-001 (93): 379 units — 371 confirmed / 8 drift / 0
unverifiable. The headline confirmation: RESOLVO-PRIMARY holds on
live evidence —
ResolvoDepSolveris the shipped production default (registry.rs unwrap_or("resolvo"), resolvo_engine = "the production DepSolver cell"), and the §2.8 fallback-seam story (naive + sat as selectable cells behindDepSolver) is exactly what shipped. That same check exposed F-047 (code-side): the two#[spec(deviates)]reasons innaive.rs/sat.rsstill claim "no ResolvoSolver exists in tree" / "adopting resolvo stays an owner decision" — they aged behind the very adoption they awaited. The spec-side drift splits into two touch-up families: F-048 (PROP-002 precision:--trust-mirrorpromised twice and shipped nowhere — only--trust-redirectexists;vibe list --overridespromised twice and absent; the git-source ref errors ship as reason-strings, not the namedMissingRef/ConflictingRefs;source_kindgrewpath/embeddedin PROP-007/030; the cache-slot example still shows the kind-name era against the livepackages/<group>.<name>/clone) and F-049 (PROP-001: no crate README behindmechanics-in-readme;NO-OFFLINE-YETaged behind the shipped--offline; the git-binary parking-lot entry resolved by the shippedVIBE_GIT_BINARYwhose comment cites §6 back). Everything else confirms on dense machine evidence: the redirect subsystem wholesale (12 implements / 8 verifies, three CLI verbs, hop-limit guard,--trust-redirectat cli/registry.rs:226), the auth-silencing matrix (apply_common_env+ regime-aware force_silence + 3 tests_pure verifies),merge_effective/url_is_local/registry_config_pathlive under their exact spec names, theenabledfilter at the R-001 construction point, the mirror fall-through loop, token redaction tests under the exact names the spec cites, and the lockfile schema chain v2→v3→v4→v5 documented end-to-end across PROP-002 → PROP-007 → PROP-008 (live lock: schema 5). Running tally: 2 027 / 4 944 — 1 960 confirmed / 64 drift / 3 unverifiable; findings 49 (next free F-050).
- 672026-07-25 · c4c — the resolver pair verified; one c4b verdict
corrected. PROP-003 (314 markers) + PROP-017 (106): 372 units —
359 confirmed / 13 drift / 0 unverifiable. PROP-017 verifies almost
wholesale on the c4b code evidence (architecture item-for-item:
SemverVersionSetliteral to the spec, NowOrNever sync adapter, shared output builder, dominance oracle, capability closure pre-scan); its only drift is the known F-027 status-line ("implementation in progress" + an impl/work document marker over its own §6 "the port is COMPLETE"). PROP-003's eleven split three ways: F-030 (the design-proposal status line over a shipped vocabulary), four F-031 rows landing exactly as the B-phase ledgered them (the r1__exclusivefence, the §4.3→§2.5.4 misref, and thelanguage_chain-vs-language+language_fallbacktrio — lockfile.rs:130 is one merged field), and a new F-050: the solver-era tail outside the §2.2 supersede marker — §2.1 still promises "SatDepSolver becomes the default" with a[meta].solverselection key and anaive|satCLI (shipped:naive|sat|resolvo, default resolvo, no meta.solver field), §2.11/§6 still record a sat-default flip, andvibe update --featureswas promised but never wired. The same evidence trail corrected c4b: PROP-002's SOLVER-IDENTITY-FIELD had confirmed on a section default, but the live lock has nosolverfield and PROP-017 §8 says so — verdict amended to drift, F-048 extended (f), and F-047 extended with a third stale deviates (lib.rs:288-296 still claims "SatDepSolver is not in tree" while sat.rs ships). Subskills confirmed with a live wink: this session's own MCP toolbox carriesread_subskill/materialise_subskill— the M1.7 lazy-delivery surface §2.5 designed. Running tally: 2 399 / 4 944 — 2 318 confirmed / 78 drift / 3 unverifiable; findings 50 (next free F-051).
- 682026-07-25 · c4d1 — the workspace big three verified; the loading
model is the session itself. PROP-007 + PROP-009 + PROP-035 (386
markers): 360 units — 351 confirmed / 9 drift / 0 unverifiable —
and zero new findings: every drift row lands on ledger entries the
B-phase already minted. PROP-007's four are all F-029 — the
status/milestone lines, §9.3's deferral record, and the document
marker still call workspace-aware
vibe install"the remaining piece" while M1.18 shipped it (Workspace::discoverlive at plan.rs:101 and apply.rs:114). PROP-009's three: the F-026 DRAFT header pair, plusSURF-SHOW-EFFECTIVEcaught shipped-but-spec/done (vibe show effectiveexists in its simple concatenation form; the §2.8 engine projection honestly stays v1.5). PROP-035's two are the F-028 DESIGN-provisional pair over a §17 that records the compiler shipping three times (vibe-spec 07-15, the link-type rename 07-16, normal+static AOT 07-20). The confirmations needed no reconstruction — the model under test booted this very session: STATIC.md read first, the TOML INDEX.md with its[[entry]]grammar, committedvibedeps/,when = "os:*"in the renderer, BootCategory ordering with the conflict errors deleted,vibe reinstallciting §2.10 from its own--help, and the vibe-spec pipeline (doctree fact leaves,:add/:replacewith per-fact override and the merged-view DuplicateId gate, embed cycle guards,PackageFormatsimple-by-default) exactly where §5–§13 put it. Running tally: 2 759 / 4 944 — 2 669 confirmed / 87 drift / 3 unverifiable; findings 50 (next free F-051).
- 692026-07-25 · c4d2 — the workspace tail closes; the honesty law meets
its densest case. PROP-011/012/038/034/020/022/025 (482 markers):
474 units — 393 confirmed / 81 drift / 0 unverifiable. The
headline is the pair everyone saw coming: PROP-020 (41 drift) and
PROP-022 (37 drift) are whole shipped systems under "proposed"
headers —
hooks.rsimplements the entire install-hooks contract (phases, Git-Bash-first Windows selection,DEFAULT_ALLOWED_GROUPSwith org.vibevm, the non-interactive refuse, the env contract, both test seams) and the materialization system ships wholesale (theMaterializationenum with doctests, hardlink/in-place through vibe-install, submodule snapshot-embedding, the destructive guard) — while the B-phase, marking wording-faithfully, left the text's own spec/done in place. Each file is ONE F-018 re-mark sweep (note extended), the same shape as PROP-000's F-043 twelve. Against that: PROP-011, PROP-012 and PROP-025 verify clean — 227/227 confirmed, the campaign's first zero-drift files, all three honestly-marked shipped contracts (the freshness oracle, the<vibevm>block engine whose canonical text lives in this repo's own CLAUDE.md, and thevibe binfamily whose help text matches §4 verbatim). PROP-038 adds two F-024 rows (the §2.7 open-note its own §5 resolves, andfuzz.rsshipping the very DEF-5 its history still defers); PROP-034 takes a new F-051 for a DRAFT status line the file's own rename-note already outgrew. Running tally: 3 233 / 4 944 — 3 062 confirmed / 168 drift / 3 unverifiable; findings 51 (next free F-052).
- 702026-07-25 · c4e — the cli/actions cluster verified; Spec 2 is the
reality, DRAFT is the costume. PROP-037 + PROP-036 + PROP-042 +
PROP-039 (327 markers): 300 units — 290 confirmed / 10 drift / 0
unverifiable. One new family, F-052: all three contract headers
still read "DRAFT — requirements" while their plans executed
(PACKAGE-TREE, TREE-TUI v0.2, and the
vibe-actionscrate whose first consumer — the Spec-2 TUI — is the shippedvibe tree); PROP-036's §2.11 sketch keys (qquit,norder,x/t/TABmodes,Ffold-all) are superseded by Spec 2's F-key scheme exactly as the c1 manual-test sweep found from the other side (F-037/F-038); and PROP-039's AIUI rows ("designed-for; not built now") aged behind their own delivery —vibe aiui stateprints the §11.2 ModelView and cites the section in its--help. F-023 lands as judged (the §2.13 launcher misref into Progress-Control's PROP-043). PROP-042 verifies clean 58/58 — the fourth zero-drift file: an ACTIVE header over all sevenaiuiverbs live verb-for-verb, thevibe termlauncher, and the icon-swap OSC. The evidence base was half-built already: c2's byte-equal palettes /detect_tier/ spacing constants and c1's shipped-keymap findings carried §2.2 and §5 wholesale. Running tally: 3 533 / 4 944 — 3 352 confirmed / 178 drift / 3 unverifiable; findings 52 (next free F-053). Remaining: c4f only — vibe-mcp ×3, vibe-index PROP-005, vibe-settings ×2, and the vibe-registry rest (008/010/030/021/023/README), 957 markers.
- 712026-07-25 · c4f1 — the registry rest; the campaign's densest drift
file falls. PROP-008/010/021/023/030 + the modules README (372
markers): 364 units — 233 confirmed / 131 drift / 0 unverifiable.
The headline: PROP-030 takes 63 drift rows in one new family
(F-053) — the embedded registry ships wholesale under a bare
"proposed (2026-07-13)" status line, while the WAL's own standing
constraints cite its §5 CI-off gate split and §3.3 project-local
rules as living law, all five flags sit in
install --help, R-001 pins its sanctioned constructor, and this very machine resolves redbook/rust-ai-native through it daily. F-018 now covers the full four-spec bridge family: PROP-021 (24 drift — recurse clone/update and snapshot embedding live in the backend) and PROP-023 (35 drift —[package].bridgeparses with its doctest) join PROP-020/022; four headers, four re-mark sweeps, one family. The honest side held: PROP-008 verifies 91/92 (IMPLEMENTED M1.18+M1.19, live from the qualified refs in this repo's lock to exit code 7), PROP-010 91/93 (a genuine DRAFT the ROADMAP's M1.20 row corroborates — its only drift is a motivation pair that still claims "no --offline exists", F-054 with PROP-008's un-reconciled milestone line), and the modules README lands its ledgered F-016 six rows exactly as the B-phase wrote them. Running tally: 3 897 / 4 944 — 3 585 confirmed / 309 drift / 3 unverifiable; findings 54 (next free F-055). Remaining: c4f2 (vibe-mcp ×3 + vibe-settings ×2, 306 markers) and c4f3 (vibe-index PROP-005, 279).
- 722026-07-25 · c4f2 — mcp + settings; the cleanest batch of the
phase. PROP-015/026/027 + PROP-040/041 (306 markers): 279 units —
277 confirmed / 2 drift / 0 unverifiable. Three zero-drift files in
a row: PROP-015 (65/65 —
vibe mcp serve/install/statuslive, and the judging session is itself an MCP consumer of the judged server), PROP-026 (47/47 — the superseded-in-topology arc holds exactly as the B2 markup split it: the tcg grammar normative through the family MCP servers, the standalone topology gone with wave 6), and PROP-027 (58/58 — themcpkind and the sovereign per-family servers are this machine's installed reality). The two drift rows are the settings pair's ledgered headers: F-010 (PROP-040's DRAFT over acrates/vibe-settingswhose CLI cites "§8" in its own help) and F-019 (PROP-041's DRAFT over the prefs TUI that PROP-037's F4 opens by name). Running tally: 4 176 / 4 944 — 3 862 confirmed / 311 drift / 3 unverifiable; findings 54. Remaining: c4f3 — vibe-index PROP-005 (279 markers), the last file of the phase.
- 732026-07-25 · c4f3 + PHASE C EXIT GATE — the corpus is measured.
PROP-005 (279 markers, 91 edges) closes the phase all-confirmed —
the eighth zero-drift file: an "implemented; folded into the
workspace" header verified against the living crate, the
group-native M1.19 index shape (
workspace_originin both the §2.6 schema and the shipped JTD),vibe search/outdatedsurfaces, and the M2.10 smoke. The exit gate is green in full: 58/58 files carry campaign maps; 4 944 / 4 944 markers carry verdicts (anchors + row-inherited cells + document elements). Phase C final tally: 4 455 units judged — 4 141 confirmed / 311 drift / 3 unverifiable = 93.0 % / 7.0 % / 0.07 % — the first measured actuality level of the spec tree. Findings stand at 54 (F-001…F-054; F-045…F-054 minted and F-018/F-024/F-047/F-048 extended by this phase's modules cluster). The §5-C prediction confirms, mirrored: drift indeed concentrates around Status lines — but in the inverse polarity: headers promised less than the tree delivers (the shipped-under-proposed families: PROP-030's 63 rows, the bridge four's 137, PROP-000's F-043 six), while honestly-updated IMPLEMENTED files confirm nearly wholesale (eight zero-drift files: PROP-011/012/025/042/015/026/027/005). The three unverifiable stay network-bound (the GitVerse legacy-registry claims). The drift ledger is sweep-shaped for Phase D: ~15 family rows cover ~80 % of the 311 rows. Phase C is complete; the phase lane stays C — Phase D opens only on the owner's call, per the §5 entry law.
- 742026-07-25 · post-gate floor note — one red, root-caused, ledgered
(F-055). The phase-close
self-checkrun went red oncli_pkg_cycle::install_from_git_registry("expected one registry cache bucket"). Root-caused and proven in-session: a~/.vibe/registry.tomlappeared on this machine today (15:37, vibespecs + vibespecs-gitverse), and the test isolatesVIBE_REGISTRY_CACHEbut not the settings chokepoint, so the global registries merge into the "hermetic" resolver and mint a second cache bucket. WithVIBE_SETTINGSpointed at an empty dir the same test passes. The campaign's commits are docs-only and unrelated; the campaign's own gate (progress check) stays 0. Ledgered as F-055 (Phase E: the e2e harness pinsVIBE_SETTINGSto a tempdir — the never-touch-real-user-state law, applied inbound). Findings close the phase at 55.
- 752026-07-25 · PHASE D OPENED (owner call) · wave d1 — the
shipped-under-proposed families fall in one sweep. The owner opened
stitching («Открываю Phase D»); the
phaseeventDis in the journal and the lane re-derives from it. Wave 1 took the two biggest families — F-053 (PROP-030, 63 rows) and F-018 (the bridge four PROP-020/021/022/023, 137 rows) — plus F-043 (PROP-000, 12 rows): 212 of 311 drift rows closed in one wave (68 %). Every row was areality-mismatch, so the whole wave ran through sync-from-code: the diffs were drafted, surfaced to the owner, and applied only on his approval («Правь и продолжай дальше»), which also settled the licence question in the owner's own words — «Лицензия теперь UPL, на самом деле». Mechanics: the 191 pure re-marks were scripted off the C-phase verdict map (@spec/done → @impl/doneon exactly the anchors judgeddrift, dry-run first,progress checkafter) — no model touched them; the 9 prose units (5 status lines, 4 document elements) and PROP-000's 13 facts were authored by hand. The five new status lines cite the shipped surface rather than asserting it:HooksDecl+hooks.rsrunner + apply wiring; theMaterializationenum with its doctests and the destructive guard;--recurse-submodules+ snapshot embedding +resolved_commit;[package].bridgewith its doctest and the three composed mechanisms; the R-001 sanctioned constructor site with §4's knobs ininstall --help. What did not move is the honest half: in all five files the survivingspec/donerows are exactlyrelated/ motivation /REJ-*/OOS-*/ theD1–D5decision records — facts that never becomeimpl. PROP-000 took twelve authored fixes (UPL-1.0 with an explicit repository scope;vibe-package.tomlretired; qualified identity and the fifth kindmcp; uniqueness by(group, name); the multi-homed PROP-016 posture replacing "GitVerse = source of truth"; fqdn repo naming) plus a verdict correction in the c4b→c4c pattern:LICENSE-REVISITwas swept up in c3b's file-level confirm although its trigger had fired on 2026-07-12 — re-issued per the decision-records flow with two fresh conditions. One paired edit landed outside the corpus:vibevm/vibespecs/WAL.xmlregained the outstanding-manual-runs line (MT-02, MT-03) thatMT-WAL-NAMESrequires, which is what made that fact true again rather than merely reworded. Ledger: 4 353 confirmed / 99 drift / 3 unverifiable = the tree measures 97.7 % true, up from 93.0 % at the Phase C gate. Findings resolved: F-007, F-014, F-018, F-043, F-053 (6 of 55 closed; 49 open).progress check0 throughout. Next: wave d2 over the mid-size families (F-052, F-046, F-050/F-031/F-030, F-039/F-033, F-016, F-032/F-048).
- 762026-07-25 · wave d2 (a…f) — the ledger empties to nine rows, and the
spec tree measures 99.7 % true. Six sub-batches, 85 rows, 30 files.
d2a — the stale-header family (22 rows, 13 files): every
"DRAFT — requirements" over a shipped crate rewritten to the shipped
truth with the surface cited (PROP-036/037/039/040/041/034/017/035/
009/007/008/018/019). Where a header pair contradicted itself —
PROP-007/008/009 each carrying "design proposal, not
implementation-locked" one line above a status recording shipped
milestones — the milestone line moved. Two facts were re-based rather
than softened: PROP-039's "AIUI not built now" non-goal (built:
aiui.rs+vibe aiui state) and PROP-007 §9.3's deferral (resolved by PROP-009 §2.7 + M1.18 Phase 5). PROP-036 §2.11 was fixed by deletion: it restated the keymap PROP-037 owns, so the keys are gone and the section cites the contract — the single-source law is what makes that the fix. Its §2.13 launcher misref (F-023) repointed to thevibevm-termproducts repo, where the launchers actually went. d2b — design-doc tense (15 rows, 4 files): lore corrected to the contract per spec-genres. The vocabulary drift was handled deliberately differently: the loading-model record is a dated 2026-05-21 capture, so rewriting it into today's names would destroy the record of what was decided — it keeps its own words and gains a rename note plus a per-row shipped-name gloss. The literal"static" | "static" | "dynamic"typo is just a typo, and is fixed. d2c — PROP-003's solver tail (11 rows): corrected clause by clause rather than by widening the §2.2 supersede block, so a reader landing on any single anchor gets the truth without hunting for a marker elsewhere;[meta].solverwas never wired at all, and PROP-017 §8 plus the live lockfile confirm it. d2d — index, registry, families, owner guide (29 rows, 8 files): the module index had stopped in May, so five module directories and every PROP after 012 were invisible — 26 rows added, each carrying the status Phase C verified. Four promised-absent surfaces now say so (--trust-mirror,vibe list --overrides, lockfile[meta].solver,vibe update --features): re-markedspec/doneand named as unbuilt at the point of the claim. Three moved the other way (PROP-001'sVIBE_GIT_BINARYparking-lot entry, PROP-038's two open notes) and PROP-024 recorded the §2.6 deferral that fired — the TypeScript pilot was the second language, and core-ai-native now authors the neutral engines. d2e — MT-01/MT-02 re-authored (6 rows): the tests walked a human throughn/x/t/Tab/q, none of which exist; the steps now match the shipped F-key surface. The run status did not move — an agent may pre-run, only a person signs off, so MT-02 and MT-03 stay unsigned andvibevm/vibespecs/WAL.xmlnow names them (the paired fix that madeMT-WAL-NAMEStrue). d2f — PROP-043's own status (2 rows). Method: the wave minted 31 new anchors (a supersession pointer, a rename note, 26 index rows, 3 guide placements), each sealed with its own verdict so the every-marker-carries-a-verdict invariant survives Phase D. Ledger: 4 474 confirmed / 9 drift / 3 unverifiable — 99.7 % true, from 93.0 % at the Phase C gate. Findings 42 of 55 resolved.progress check0 throughout; the floor is red at exactly one test, the environmental F-055 recorded at the Phase C close (proven unrelated:VIBE_SETTINGSpointed at an empty dir turns it green). The nine survivors are both escalations: F-046's eight PROP-043 parity rows (the owner picks wire-or-demote per item) and F-035's single row invibevm/vibespecs/boot/00-core.xml, a user-owned file the boot contract says may only be marked additively.
- 772026-07-25/26 · d2g, d2h, and the parity row that needed no ruling —
PHASE D CLOSED at seven rows. Both escalations the d2 wave handed the
owner resolved without widening anything. F-046's
BASELINE-RECORDturned out not to be a wire-or-demote question at all:baseline.rs'sBaselineUnitcarries §7.3's fields one for one, with load/store and therescanCLI live — shipped under a spec marker, the pattern this phase had been closing all day, so it closed the same way and the owner's list shrank by one before he had to read it (0064fd4a). F-035's single row invibevm/vibespecs/boot/00-core.xmlmoved under the owner's explicit ruling, which is the only way that file may be touched:LAYER-CODEnamed a roottests/directory that has never existed, and now names each crate's own. d2g/d2h took the archive (f6c17f92): six findings pointed intolegacy-spec/, and the tempting answer was to close them as out of scope — nothing in the living corpus cites the archive normatively, so its stale lines mislead no build. The owner ruled otherwise and the reason holds up: a cold reader who lands in the archive directly reads "PLANNED · not started" on a campaign that finished weeks ago, or opens TREE-TUI-PLAN v0.1 with no hint that v0.2 superseded and executed it. Four plans now say EXECUTED and one SUPERSEDED, each carrying ARCHIVE — do not execute and each keeping its original line verbatim, so the record of what it once claimed survives. PROP-026 took the same treatment on the live side — its document marker had recorded the wave-6 supersession since the markup pass, but the prose still namedvibe-tcg, a crate deleted whole; the status line now says so and points at the PROP-027 family servers that carry the grammar. Ledger at the Phase D exit: 4 476 confirmed / 7 drift / 3 unverifiable — 99.8 % true, from 93.0 % at the Phase C gate. Phase D closed 304 of the 311 rows it opened with. The seven survivors were all one shape — the spec promises a behaviour the code has not built — which is Phase E's material by construction rather than anything stitching could honestly fix.progress check0 throughout.
- 782026-07-25/26 · PHASE E — the queue drained, and the last drift rows
close by being built. Tasks DRIFT-006…022 opened; fourteen executed
(006–014, 016–019, 021), DRIFT-015 superseded before it ran, and two
(DRIFT-020, DRIFT-022) stood queued at the phase's close — 022 on an owner
letter, 020 on a go. Landed: the specmap evidence join with its report
column; the lossless-fold check at warning severity (
EXPLICIT-BEATSblesses a divergence a document cannot distinguish from a lying fold); the gate panel incampaign.json, which the campaign then dogfooded on itself; baseline invalidation's two missing rules; blockquote fact anchors; the incremental parse path; the--plainand resolver-doc corrections; two#[spec(deviates)]reasons that turned out never to have been deviations; the cache split; the no-op-write skip; and the removal of the legacy~/.vibevmread leg. Ledger: 4 486 confirmed / 1 drift / 3 unverifiable of 4 490 — 99.9 % true. Findings 61 of 64 resolved. The one surviving drift row (FACT-GRAIN-EVIDENCE) cannot close in this repository at all: it waits onrust-ai-native-langv0.8.0 re-vendoring the fact-aware specmap engine, which is wave 2's Phase A2. Four new anchors were minted (PROP-042's four--viewverbs), each sealed with its own verdict.
79What is worth keeping from this phase is not the count. Four
executors volunteered evidence against their own work. Two successive
measurements each corrected the previous one's headline — DRIFT-010's
×1.44–2.06 speed-up was a debug profile, and in release the parse is
10.3 ms against 7.5 ms of payload serde; DRIFT-017 then corrected that,
because the writes were ~14 % of a warm run rather than the bulk, since
comparing requires serialising and only write+fsync are saved. The next
performance lever is the serialisation, not the IO. Two others refused to
absorb adjacent fixes they had found and filed them instead. The one
that mattered most went the other way entirely: F-057 was filed as a
stray cache directory and turned out to be a credential-precedence leg —
vibe search resolves a GitHub token through four legs and the fourth is
a file in the settings dir the test could not reach, so an un-isolated run
attached the real publish token to its outbound request. Measured, not
inferred, against a loopback listener recording header names and lengths
only: 47 bytes of Authorization before the fix, none after. The
investigation closed with no rotation needed — exactly one test reaches
that path and it points api_base at 127.0.0.1. F-055, F-056 and F-057
were one forgotten discipline caught three times by accident, which is
what DRIFT-020 exists to convert into a gate. Two lessons cost real time
and are now Constraints in the WAL: a gate never seen to go red is not
known to work (two executors ran positive controls before trusting a
green result), and delegated work is committed on the completion
notification, never on a filled-in task journal — executors write §9 as
they go, and committing on it captured an intermediate state and left the
tree conform-red for twenty minutes. The floor ends the phase green with
no VIBE_SETTINGS override — F-055 genuinely fixed rather than worked
around, verified again at this session's open.
9.1 Commit map — hashes bound to phases (recorded retrospectively)
80Added 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 executed phase for
a commit map, and this plan carried none — the §9 LOG above records what
happened, richly, and never binds it to hashes. The flow also says the map is
written at the boundary, not reconstructed at close
(##THE-MAP-IS-WRITTEN-AT-THE-BOUNDARY-NOT-AT-CLOSE), and this one was
reconstructed. That is a real weakness of this table and the reason it is
per-phase rather than per-commit: reconstruction can bind a hash to a phase
honestly, and cannot recover what each individual commit confirmed at the
moment it landed. The confirm/falsify column below is therefore per phase, cited
to the LOG entry that recorded it while it was fresh.
81Deviation from ##ONE-ENTRY-PER-COMMIT, stated rather than silent: 139
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; git log over
the perimeter below gives the rest.
82Perimeter, so the counts are reproducible. Measured at HEAD fffcb494:
83git log --reverse --format='%h %ad %s' --date=short -- \ campaigns/progress-2026-08 vibevm/vibespecs/terraforms/SPEC-ACTUALIZATION-CAMPAIGN-v0.1.xml
84139 commits, b1276c39 (plan authored, 2026-07-24) → f5248dae
(2026-07-29). The zone catches the work commits as well as the bookkeeping ones
because §3 rides the journal in the same commit as the edits it describes; the
four Phase A commits that predate the zone are named individually below.
85Campaign commit range: b1276c39 … 56cccca8 (close, 2026-07-26), plus one
post-close amendment, f5248dae.
Phase A — EXECUTED 2026-07-24; 8 commits
869446a2cb introduce progress-control markup contract (PROP-043) · b1276c39
author the spec-actualization campaign plan v0.1 · edd487ba WAL checkpoint,
scaffold phase begins · 8b181522 progress-core crate + the vibe progress
adapter · 38855c00 campaign zone + the read-only dashboard · ac97f26c pilot
markup of three genres + PROP-043 ratification and pilot amendments ·
9a69b6f6 WAL checkpoint, scaffold closed · 60100f87 ledger Phase A close-out
- 87the B0 conversion ruling.
88Confirmed: the §5-A prediction — the pilot exposed placement ambiguities and
they amended PROP-043 §3.8 before Phase B, exactly as predicted. Found outside
every prediction: a live power cut exposed a missing fsync-before-rename in
write_atomic. Range in perimeter: b1276c39..60100f87 = 4 (the other four
predate the campaign zone).
Phase B — EXECUTED 2026-07-24/25; 60 commits
8960100f87..a1bb2111. Opens 8d5ccc82 (the wave-1 scope config, the
campaign's first journal step); closes a1bb2111 (boundary — exit gate green,
corpus fully marked). Landmarks: 2c98a1e6 B0, the 73-line status conversion ·
91274c89 B1, paragraph-exhaustive markup of vibevm/vibespecs/common · 6714876e the
fact-grain re-pilot · 508bbdb9 DRIFT-004, fact anchors become addressable spec
units · 5c89839b DRIFT-005, fact inheritance end to end · 7d9dd964 B2 batch
26, the corpus is fully marked. Two scope rulings landed inside the phase:
8901cd05 and 1c48019a. One owner amendment was recorded here and executed
later: c0147947, Phase L.
90Confirmed: the exhaustive counter caught genuinely skipped paragraphs review
alone would have missed — the wrapped prose line whose continuation opens +
parses as a phantom list item, caught twice in PROP-019 instantly. Falsified in
place: §1's ~55 status lines (73 actual) and 91 files (97 scanned). Gate at
the boundary: check --exhaustive clean over 58 files / 4 880 facts / 4 944
markers, 0 errors 0 warnings; self-check all green, real exit 0.
Phase L — EXECUTED 2026-07-25; 7 commits
91a1bb2111..15c5bb30. 62406fe0 resolves the plan-file review point (the plan
stays put) · 83346e78 f8f347d8 9514e8fb 1ec6a27c batches 1–4 ·
70f3cbdd the legacy dirs leave the spec tree · 15c5bb30 closed.
92Confirmed: the L2 verdict — every cited fact was already corpus-resident, so
the relocation cost the corpus nothing. spec/neworder and spec/discipline
had zero corpus inbound.
Phase C — EXECUTED 2026-07-25; 18 commits
9315c5bb30..242085d4. Opens bb337e90; batches 5c5e1058 c1 · 3570cf2b c2
· f2beeff4 c3a · 49d67c39 c3b · 3d237c7d c3c · f82582f7 LOG · 9baa7fa6
c3d · baffe617 c4a · 09327502 c4b · 7392fbdd c4c · c325d333 c4d1 ·
dcfa6301 c4d2 · 74025dd9 c4e · 727f6840 c4f1 · 5aa5ba86 c4f2; closes
ddf7c0ca (c4f3 + exit gate). 242085d4 records the post-gate red floor and
its root cause (F-055).
94Confirmed, mirrored: the §5-C prediction — drift does concentrate around Status lines, but in the inverse polarity, headers promising less than the tree delivers. Measured: 4 455 units judged — 4 141 confirmed / 311 drift / 3 unverifiable = 93.0 % / 7.0 % / 0.07 %, the first measured actuality level of the spec tree; 58/58 files carry campaign maps, 4 944 / 4 944 markers carry verdicts. Silently skipped, and it cost Phase G: the harvest-card step.
Phase D — EXECUTED 2026-07-25/26; 4 commits
95242085d4..f6c17f92. a1847b0d opens (wave d1 — 212 of 311 rows in one
sweep) · 3a6370bc wave d2, the ledger empties to nine · 0064fd4a the parity
row that needed no ruling · f6c17f92 d2g/d2h.
96Confirmed: prediction 4 — convergence in two waves against a ≤3 bound, and
exactly two owner escalations against a ≤2 bound. Falsified by the next phase:
this phase authored the Shipped: line for a Baseline::store that had never
been built (F-065). Mechanics worth the record: 191 of the wave-d1 rows were
scripted off the C-phase verdict map, dry-run first — no model touched them.
Phase E and close-out — EXECUTED 2026-07-25/26; 45 commits
97f6c17f92..56cccca8. E and the close-out interleave and are not separable
in the chain — both ran on 2026-07-26 in the same sessions, and saying so is
more honest than drawing a cut. Phase E opens 2ef9d854; DRIFT-006…022 were
opened, fourteen executed, DRIFT-015 superseded before it ran, DRIFT-020 and
-022 left queued. Close-out landmarks: cc3109ef the ledger regains the entries
D and E never wrote · bfdbd7f5 F-065, nothing can write the baseline the
recurrence reads · 9f7459bd deferrals.md · fa74b775 the six predictions
scored · eae60b3d F and G deferred with the measurement that says why ·
db7186ef the baseline gains a writer · d3482dd7 baseline.json ·
1ea4815c F-063 closes · 56cccca8 WAL session-end. One commit here belongs to
the next campaign: 07a38e1a, the fact-grain specmap engine — wave 2's Phase
A step 2, which is what closes wave 1's single surviving drift row.
98Measured at close: 4 486 confirmed / 1 drift / 3 unverifiable of 4 490 — 99.9 %; findings 61 of 64 resolved. Verdicts: predictions 1–5 CONFIRMED, prediction 6 FALSIFIED in the favourable direction — a month of plan executed in three days, and the honest reading is that the estimate measured human-paced reading while the work was delegated batch execution.
After close — 1 commit
99f5248dae (2026-07-29) — docs(terraforms): the plans running this campaign
were the ones breaking its rule. The previous flow:campaign-plans form to
land under an owner ruling: §12's literal quick-start block. This section is the
second such landing, and the ledger records both so the pattern is visible
rather than incidental.
10. Deferrals
100(empty — drained into campaigns/<id>/deferrals.md at close-out)
11. REPORT (filled at close-out against §8)
101Filled 2026-07-26. Scored against §8 as written, not as one would like it to read. Where a prediction is scored against a number the campaign itself moved, the number used is the one from before the phase that moved it — otherwise the campaign grades its own homework.
1021. Wave-1 full weave fits ≤2 shards of a 1M window (digest fits trivially).
— CONFIRMED, with room to spare — but only because close-out went and
measured it. progress weave --max-tokens 1000000 over the 58-file wave-1
corpus emits 1 shard, 1 138 441 bytes (≈ 300 k tokens at prose-markdown
density — roughly a third of the window, so the sharder never had to split).
weave --digest is 200 454 bytes, ≈ 6 % of a 1M window: "trivially" is
right.
103The prediction is confirmed and the process around it is not. No LOG entry
records a weave run at any point in wave 1 — Phase B worked from per-file
mirrors instead, so nothing in the plan's own steps ever exercised the
command, and the number above was produced at close-out purely to fill this
row. A prediction that no step of the plan forces you to run is one you will
reach the end of the campaign without having tested. Wave 2 should either
wire the prediction to a step or drop it.
1042. The exhaustive counter catches ≥1 genuinely skipped paragraph that review
alone would have missed. — CONFIRMED, more than once. The sharpest case
is a grammar trap no reader would have seen: a wrapped prose line whose
continuation opens with + parses as a phantom list item, and the counter
caught both occurrences in PROP-019 instantly. The pilot produced a second,
independent catch — spec/design/README's index was incomplete, found by the
count rather than by reading it. The B-phase LOG scored this prediction in
passing at the time, which is the only reason it is cleanly citable now.
1053. ≥60 % of IMPLEMENTED/SHIPPED claims confirm without drift; ≤10 % of all
units end unverifiable. — CONFIRMED, both clauses, with wide margin.
Scored at the Phase C exit gate, before any stitching: 93.0 % confirmed,
311 drift rows of the 4 455 facts then counted (7.0 %), 3 unverifiable =
0.07 % against a 10 % ceiling. (The corpus reached 4 490 only later, as
Phase D and Phase E minted anchors for facts the tree had gained.) The post-stitch figure of 99.9 % is not the answer to this
prediction — stitching corrected the drift, it did not verify it away, and
quoting it here would be circular.
1064. Stitching converges in ≤3 waves with ≤2 owner escalations. —
CONFIRMED; comfortable on waves, exactly at the bound on escalations. Two
waves, not three: d1 and d2, the latter run in eight sub-batches
(a–h). Exactly two escalations, both genuine and both resolved — F-046's
PROP-043 parity rows (wire-or-demote, per item) and F-035's single row in
vibevm/vibespecs/boot/00-core.xml, a user-owned file. One row that had been sitting in
the escalation pile turned out not to need a ruling at all
(BASELINE-RECORD), which is worth reading as a warning rather than a win:
it was returned to the owner's desk because nobody had checked the code, and
when someone did, the answer was already there. It was also — see prediction 6's
note and F-065 — checked wrongly.
1075. ≥80 % of DRIFT tasks land without a returned round-trip. —
CONFIRMED at 100 %. Of the twenty-two DRIFT tasks authored in wave 1, none
was ever set to returned. DRIFT-015 is the one non-landing, and it was
superseded before it ran rather than returned — the conform finding it
targeted had been resolved another way. The margin is large enough to be worth
distrusting slightly: the template is genuinely carrying enough context, but
four executors also volunteered adjacent findings rather than returning, so
some of what a returned status would have measured shows up in the findings
ledger instead (F-057, F-061, F-063, F-064 all arrived this way).
1086. The month budget holds. — FALSIFIED, in the favourable direction, and only partly scoreable. Predicted: A ≈ days, B ≈ 1–1.5 weeks, C ≈ 1 week, D ≈ 3–5 days. Actual: A on 2026-07-24, B on 07-24/25, C on 07-25, D on 07-25/26, E on 07-25/26 — a month of plan executed in three days, roughly an order of magnitude fast. The honest reading is not "we beat the estimate": the estimate was built on human-paced reading and the work was done by delegated batch execution, so it was measuring the wrong quantity from the start. The "F+G ≈ 1 week overlapping E" clause is permanently unscoreable for wave 1: both phases were deferred to wave 2 by owner ruling on 2026-07-26, and not for want of time — close-out measured their inputs and found them absent (F's three views are empty; G's harvest directory was never written). A phase that cannot start because an earlier phase skipped a step is not evidence about a schedule.
What the predictions did not cover, and should next time
- 109Nothing predicted the campaign's own corrections would introduce drift.
F-065 is the case: Phase D authored a
Shipped:line claiming aBaseline::storethat has never existed, and the verification pass then confirmed the row on it. A wave-2 prediction should name this directly — stitching introduces ≥0 new false claims is a falsifiable statement, and wave 1's answer to it is 1. - Verification cross-checked document against document at least once. The
five token-precedence anchors in PROP-002 were sealed
confirmedon the evidence "token loader 3-source order matches 90-user boot facts" — another spec file, carrying the identical error. That is how F-063 survived Phase C with a green verdict. Evidence that cites only spec prose is not evidence; wave 2 should gate on evidence strings resolving to code. - Three state projections are seeded and never refreshed (
findings.json,tasks.json,docdebt.json).findings.jsonwas maintained by hand all campaign;tasks.jsonwas not, and sat 18 tasks stale until close-out. A projection nothing refreshes and nothing checks will drift silently — the dashboard read five tasks for a week. - Phase F's three views are empty, because Phase B was a description pass
and Phase F projects from judgments. Measured over the whole wave-1
corpus (4 917 facts):
freeze/planandfreeze/work— 0, so there are no freeze candidates at all (the 9 realfreeze/donerows are one already-frozen contract, PROP-006).stage="idea"— 0.action="rework"— 0.state="hold"— one inline row. The markup faithfully records what each fact is (impl/done,spec/done,doc/doneare 4 816 of the 4 917) and never what should happen next, because no phase ever asked anyone to decide that. §5-F's three owner plans — release/productization from freeze-candidates, improvement from rework + disabled, a global idea ledger from idea/hold — are therefore projections of judgments the campaign never made. The forward-looking knowledge wave 1 did produce went somewhere else entirely: the 66-row findings ledger anddeferrals.md. A view is only as rich as the pass that fed it; marking what exists is not the same act as deciding what to do about it, and a plan that conflates them gets empty views at the end. - Phase C silently skipped one of its own steps, and Phase G pays for it.
§5-C's step list ends "verification runs (
command → real output) are saved as doc fixtures; harvest cards written while knowledge is hot." Neither happened:campaigns/progress-2026-08/harvest/is empty anddocdebt.jsoncarries zero cards. Phase C's exit gate only checks that every marker carries a verdict, so the omission cost nothing at the time and was invisible until Phase G came to consume it. Phase G's definition — "two trees written from proven behaviour (harvest cards + captured runs), never from spec prose" — therefore has no input, and must either capture the runs afresh or admit it is writing from something else. A phase whose exit gate does not check its own steps will skip the ones nothing downstream fails on — until something downstream does.
12. Quick-start for the executing session
110Added 2026-07-29 by owner ruling: flow:campaign-plans'
##COLD-A-LITERAL-QUICK-START-BLOCK requires it and this plan had none. Wave 1
is closed out, so this block is a verification quick-start — how a cold
session re-measures what the campaign claims, rather than how it resumes it.
111cargo run -q -p vibe-cli --bin vibe -- progress report --json --campaign campaigns/progress-2026-08 | head -40
python -c "import json;d=json.load(open('campaigns/progress-2026-08/run/state/findings.json',encoding='utf-8'));print(len(d['findings']),'findings,',sum(1 for f in d['findings'] if f['status']!='resolved'),'unresolved')"
bash tools/self-check.sh; echo "EXIT=$?" # the gate panel — 0
112The campaign's own claims live in §11 REPORT, scored against §8's predictions;
§9's LOG read from the end is what actually happened, batch by batch. Wave 2
— the packages, the sibling corpus — is
PACKAGES-ACTUALIZATION-CAMPAIGN-v0.1.xml,
and its own quick-start is that plan's §10.
13. Whole-campaign acceptance (recorded retrospectively)
113Added 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 and cited by the report, and this plan had none — §11's
REPORT scored the predictions without one. The script below was written after
the fact and its numbers were re-measured at HEAD fffcb494 on 2026-07-31,
not copied from the close-out. Where the two differ, both are shown: a closed
campaign whose end state has since improved should say so rather than freeze a
figure.
1 — the gate panel. Not re-run in the pass that authored this block;
it is a multi-minute build gate and running it is the executing
session's job, not the drafter's.
114bash tools/self-check.sh; echo "EXIT=$?" # 0
2 — every observed paragraph carries a marker
115./target/debug/vibe.exe progress check --exhaustive \ --campaign campaigns/progress-2026-08 # clean, 0 warnings
→ progress check: clean (260 files, 0 warning(s)) EXIT=0
NOTE: the check covers the whole progress.toml scope, not just this
campaign's 58 files — --campaign selects the state zone, not the
perimeter. Wave 2 shares this gate by design and it must stay at 0.
3 — the host corpus's measured actuality: the campaign's headline
116python campaigns/packages-2026-09/tasks/summary.py | grep '^ host'
→ host (58 files) confi 4496 drift 0 unver 3 total 4499 99.9 %
4 — nothing evaporated: every leftover is a commit or a named deferral
117grep -c '^- ' campaigns/progress-2026-08/deferrals.md # 13, each owned
5 — the recurrence artifact exists, so the next run costs O(delta)
118test -s campaigns/progress-2026-08/baseline.json; echo "EXIT=$?" # 0
119What the acceptance shows, and the one thing it cannot.
- 120The end state is better than the close recorded. At close-out
(2026-07-26) the ledger read 4 486 confirmed / 1 drift / 3 unverifiable of
4 490 — 99.9 %. Today it reads 4 496 / 0 / 3 of 4 499 — 99.9 %. The
single surviving drift row,
FACT-GRAIN-EVIDENCE, closed exactly wheredeferrals.mdsaid it would and nowhere else: wave 2's Phase A step 2, commit07a38e1a. The denominator moved by nine as later work minted anchors in host files. A deferral that closes where its own reasoning said it would is the strongest evidence the deferrals ledger is doing its job. - Three units stay
unverifiableand always will here. They are network-bound GitVerse legacy-registry claims;unverifiablewas chosen over "probably fine" and the choice is the point. - What this script cannot assert is the mandate. The owner asked to
actualize all the specifications; the script proves the corpus is marked,
judged and drift-free, and proves nothing about whether the resulting
documents are useful. §11's
{#report-gaps}is where that gap is stated: the campaign marked what 4 917 facts are and never what should happen to them, so every forward-looking view came out empty. An acceptance script that passes on an empty view is telling you the view was not part of the contract. - Step 3 is served by a tool that lives in the next campaign's zone. Wave 1
shipped no summary tool; the number above is printed by
campaigns/packages-2026-09/tasks/summary.py, which reads the shared verdict cache. That is a finding, not a convenience: a closed campaign whose headline can only be reproduced by its successor's tooling is one re-run away from being unmeasurable.