Skip to content

feat(method): call-floor — 5 call-count levers from the WM1 residual anatomy#147

Closed
pilotspacex-byte wants to merge 5 commits into
feat/ceremony-to-effortfrom
feat/call-floor
Closed

feat(method): call-floor — 5 call-count levers from the WM1 residual anatomy#147
pilotspacex-byte wants to merge 5 commits into
feat/ceremony-to-effortfrom
feat/call-floor

Conversation

@pilotspacex-byte

Copy link
Copy Markdown
Contributor

Stacked on #146 (feat/ceremony-to-effort). Five levers targeting the WM1 re-measure residuals (mean 18.7 calls vs the ≤12 bar), all fast-lane, all gate PASS, fence 3508/3508.

Tasks

  1. init-resume-pointer (a2df502) — the already initialised refusal names add.py status; kills the observed +2 double-init calls/rep.
  2. milestone-lane-nudge (a2df502) — new-milestone prints a lane: advisory naming the oneshot lane (rep r1 lost 9-10 calls to milestone bait). v2 prefix after the persona-nudge marker fence.
  3. scope-coverage-hint (a2df502) — the freeze scope echo also notes §3 Touches paths OUTSIDE the declared scope (the too-narrow class behind the re-cross repairs).
  4. compound-ticks (d8e1718) — OPT-IN freeze --cross (stamp → land in tests) + completing gate accepted at build (auto-cross → record); oneshot lane 8-9 → 6 calls; defaults byte-identical; recipe advertises the compressed lane. Self-proved: tasks 4 and 5 shipped through their own compound ticks.
  5. skill-orient-split (2d10b2a) — SKILL.md 12819 → 9498B (-26%); the Beyond-the-bundle routing prose moves to on-demand beyond.md; every structural pin held; core pool rebaselined +211B net per the documented method.

State

author: Tin Dang tindang.ht97@gmail.com

…al levers

Extends ceremony-to-effort's open meter criteria; every task maps to a
measured residual in the WM1 re-measure (double-init, milestone bait,
too-narrow scope, pure ticks, SKILL.md read weight). Human 'fix all'
2026-07-13.

author: Tin Dang <tindang.ht97@gmail.com>
… nudge · scope coverage hint

Three small levers from the WM1 re-measure's residual anatomy, batched
under one fence (3496/3496 OK, +8 new tests):

- init-resume-pointer: the `already initialised` refusal ends with
  `resume: add.py status` — the observed double-init (+2 calls/rep)
  dead-ends in one call; still a refusal, zero tree writes
- milestone-lane-nudge: new-milestone prints `lane: single task? the
  oneshot lane is cheaper...` at the bait point that cost rep r1
  ~10 calls; v2 change request re-prefixed from note: after three
  persona-nudge suites pinned that marker class one-per-invocation
- scope-coverage-hint: the freeze echo notes §3 Touches paths that
  exist but sit OUTSIDE the resolved scope — the too-narrow class
  behind the measured re-cross repairs; propose-not-impose, never
  speculative

ENGINE_MD5 -> 6f4e791f, engine synced x3, SEAMS _declared_scope pin
re-aimed 5581->5595. Gate PASS x3.

refs: milestone call-floor (1-3/5), stacked on PR #146
author: Tin Dang <tindang.ht97@gmail.com>
…d (call-floor 4/5)

The oneshot lane's 8-9 engine calls include two PURE ticks with no work
between them: freeze->tests and build->verify->gate. Two opt-in
compressions remove them, worth ~2 calls/task at the WM1 meter:

- `freeze --by X --cross`: after a plan-phase freeze STAMPS, the task
  lands in tests in the same call (state first, marker mirrored). A
  refused/already-frozen freeze never crosses; a change-request
  re-freeze at a non-plan phase gets an advisory note instead.
- `gate PASS|RISK-ACCEPTED` at the BUILD phase auto-crosses
  build->verify then runs every completion check unchanged (tamper,
  scope, high-risk, consumer-stale, green-bar). Phases before build
  keep their refusals verbatim; HARD-STOP is untouched.
- the new-task recipe advertises the compressed lane; the
  test_kickoff_truth RecipeTest pin updates to the new recipe truth
  (declared in-scope doc-truth ripple, flow-honesty precedent).

Defaults byte-identical: the bare freeze and every existing tick
sequence are unchanged (3496 prior fixtures still pass unmodified).

7 red/green tests in test_compound_ticks.py; full fence 3503/3503 OK.
Engine synced x3, ENGINE_MD5 re-aimed 26f78f04, SEAMS _declared_scope
pin 5595->5619. The feature proved itself: this task's own gate ran
from the build phase via the new compound tick.

refs: milestone call-floor (WM1 residual: pure ticks), task compound-ticks frozen @ v1
author: Tin Dang <tindang.ht97@gmail.com>
…ond.md (call-floor 5/5)

SKILL.md is read on EVERY task but carried ~3.4KB of on-demand routing
prose ("Beyond the bundle" verbose bullets) most tasks never take:

- the prose moves to the NEW on-demand guide skill/add/beyond.md
  (synced x3: canonical + _bundled + .claude/skills)
- SKILL.md keeps a compact one-line-per-trigger index; the always-read
  orient core drops 12819 -> 9498 bytes (-26%), pinned <= 9500 by
  test_skill_orient_split.py
- every structural pin holds: 17 on-demand pointers, phase-guide rows,
  banner-cue sentence, question-summary line, SOUL.md proximity,
  "Depth by stage" + "method rationale" sections, .add/personas/ +
  persona loop, advisor-gate-relax, agent-call-preferred default
  execution mode, retrospective-consolidation keep-term
- core pool absorbs beyond.md; baseline 20666 -> 20906 for the +211B
  net new surface (index + file header) per the documented
  rebaseline-for-human-approved-surface method, contract FROZEN @ v1
- wording-lint surface count pins 31 -> 32 (test_wording_lint +
  test_per_step_hooks), declared doc-truth ripples

5 red/green tests; pin battery 131 green; full fence 3508/3508 OK.
No engine change (ENGINE_MD5 untouched). The task's own freeze ran
`freeze --cross` and its gate ran from build — both call-floor 4/5
compound ticks proved themselves here.

refs: milestone call-floor (read burden toward <=30KB), task skill-orient-split frozen @ v1
author: Tin Dang <tindang.ht97@gmail.com>
…the paid re-measure

All 5 tasks gate PASS with test-pinned evidence (a2df502 tasks 1-3,
d8e1718 compound-ticks, 2d10b2a skill-orient-split); 6/7 exit criteria
checked with evidence. The 7th (paid WM1 re-measure, mean calls <= 12)
is human-gated spend — the goal-gate holds the milestone open until it
runs. skill-orient-split criterion checked PARTIAL-ACCEPTED (9498B vs
~8.5K sketch, read path ~33KB vs 30; remaining levers move to the
phase-restructure milestone).

refs: milestone call-floor
author: Tin Dang <tindang.ht97@gmail.com>
@pilotspacex-byte
pilotspacex-byte deleted the branch feat/ceremony-to-effort July 14, 2026 03:40
pilotspacex-byte added a commit that referenced this pull request Jul 14, 2026
… orient split (supersedes #147) (#149)

* chore(method): intake call-floor milestone — 5 evidence-traced residual levers

Extends ceremony-to-effort's open meter criteria; every task maps to a
measured residual in the WM1 re-measure (double-init, milestone bait,
too-narrow scope, pure ticks, SKILL.md read weight). Human 'fix all'
2026-07-13.

author: Tin Dang <tindang.ht97@gmail.com>

* feat(method): call-floor 1-3/5 — init resume pointer · milestone lane nudge · scope coverage hint

Three small levers from the WM1 re-measure's residual anatomy, batched
under one fence (3496/3496 OK, +8 new tests):

- init-resume-pointer: the `already initialised` refusal ends with
  `resume: add.py status` — the observed double-init (+2 calls/rep)
  dead-ends in one call; still a refusal, zero tree writes
- milestone-lane-nudge: new-milestone prints `lane: single task? the
  oneshot lane is cheaper...` at the bait point that cost rep r1
  ~10 calls; v2 change request re-prefixed from note: after three
  persona-nudge suites pinned that marker class one-per-invocation
- scope-coverage-hint: the freeze echo notes §3 Touches paths that
  exist but sit OUTSIDE the resolved scope — the too-narrow class
  behind the measured re-cross repairs; propose-not-impose, never
  speculative

ENGINE_MD5 -> 6f4e791f, engine synced x3, SEAMS _declared_scope pin
re-aimed 5581->5595. Gate PASS x3.

refs: milestone call-floor (1-3/5), stacked on PR #146
author: Tin Dang <tindang.ht97@gmail.com>

* feat(method): compound ticks — opt-in freeze --cross + gate-from-build (call-floor 4/5)

The oneshot lane's 8-9 engine calls include two PURE ticks with no work
between them: freeze->tests and build->verify->gate. Two opt-in
compressions remove them, worth ~2 calls/task at the WM1 meter:

- `freeze --by X --cross`: after a plan-phase freeze STAMPS, the task
  lands in tests in the same call (state first, marker mirrored). A
  refused/already-frozen freeze never crosses; a change-request
  re-freeze at a non-plan phase gets an advisory note instead.
- `gate PASS|RISK-ACCEPTED` at the BUILD phase auto-crosses
  build->verify then runs every completion check unchanged (tamper,
  scope, high-risk, consumer-stale, green-bar). Phases before build
  keep their refusals verbatim; HARD-STOP is untouched.
- the new-task recipe advertises the compressed lane; the
  test_kickoff_truth RecipeTest pin updates to the new recipe truth
  (declared in-scope doc-truth ripple, flow-honesty precedent).

Defaults byte-identical: the bare freeze and every existing tick
sequence are unchanged (3496 prior fixtures still pass unmodified).

7 red/green tests in test_compound_ticks.py; full fence 3503/3503 OK.
Engine synced x3, ENGINE_MD5 re-aimed 26f78f04, SEAMS _declared_scope
pin 5595->5619. The feature proved itself: this task's own gate ran
from the build phase via the new compound tick.

refs: milestone call-floor (WM1 residual: pure ticks), task compound-ticks frozen @ v1
author: Tin Dang <tindang.ht97@gmail.com>

* feat(method): skill orient split — lean SKILL.md core + on-demand beyond.md (call-floor 5/5)

SKILL.md is read on EVERY task but carried ~3.4KB of on-demand routing
prose ("Beyond the bundle" verbose bullets) most tasks never take:

- the prose moves to the NEW on-demand guide skill/add/beyond.md
  (synced x3: canonical + _bundled + .claude/skills)
- SKILL.md keeps a compact one-line-per-trigger index; the always-read
  orient core drops 12819 -> 9498 bytes (-26%), pinned <= 9500 by
  test_skill_orient_split.py
- every structural pin holds: 17 on-demand pointers, phase-guide rows,
  banner-cue sentence, question-summary line, SOUL.md proximity,
  "Depth by stage" + "method rationale" sections, .add/personas/ +
  persona loop, advisor-gate-relax, agent-call-preferred default
  execution mode, retrospective-consolidation keep-term
- core pool absorbs beyond.md; baseline 20666 -> 20906 for the +211B
  net new surface (index + file header) per the documented
  rebaseline-for-human-approved-surface method, contract FROZEN @ v1
- wording-lint surface count pins 31 -> 32 (test_wording_lint +
  test_per_step_hooks), declared doc-truth ripples

5 red/green tests; pin battery 131 green; full fence 3508/3508 OK.
No engine change (ENGINE_MD5 untouched). The task's own freeze ran
`freeze --cross` and its gate ran from build — both call-floor 4/5
compound ticks proved themselves here.

refs: milestone call-floor (read burden toward <=30KB), task skill-orient-split frozen @ v1
author: Tin Dang <tindang.ht97@gmail.com>

* chore(method): call-floor 5/5 tasks shipped — milestone HELD OPEN on the paid re-measure

All 5 tasks gate PASS with test-pinned evidence (a2df502 tasks 1-3,
d8e1718 compound-ticks, 2d10b2a skill-orient-split); 6/7 exit criteria
checked with evidence. The 7th (paid WM1 re-measure, mean calls <= 12)
is human-gated spend — the goal-gate holds the milestone open until it
runs. skill-orient-split criterion checked PARTIAL-ACCEPTED (9498B vs
~8.5K sketch, read path ~33KB vs 30; remaining levers move to the
phase-restructure milestone).

refs: milestone call-floor
author: Tin Dang <tindang.ht97@gmail.com>

---------

Co-authored-by: Tin Dang <tindang.ht97@gmail.com>
TinDang97 added a commit that referenced this pull request Jul 14, 2026
…x-phase-loop 1/6)

TRUE phase merge, first of two (human-decided over recipe-ticks): the scenarios
PHASE folds into specify — one drafting phase now produces §1 rules AND §2
Given/When/Then. The TASK.md §-section shape is UNTOUCHED (sections are the
stable API; only the lifecycle list shrinks).

Engine (synced x3 — tooling · .add/tooling · _bundled):
- constants.py: PHASES=(specify,plan,tests,build,verify,observe,done);
  _SKIPPABLE_PHASES=(observe,); PHASE_GUIDE specify action gains the
  Given/When/Then duty; PHASE_OWNER/PHASE_AGENT drop scenarios;
  PHASE_GROUPS DIRECTION=(specify,plan,tests)
- add.py: _normalize_phase_tokens legacy map gains scenarios->specify
  (silent, TOTAL, idempotent, normalize-on-read — expectations-first
  precedent); _FRONT_PHASES/(spawn-hints/guide-file map/freeze early-phase
  check/skip-rationale regex follow); _RETIRED_SKIP_TOKENS: a pre-merge
  `skips: scenarios` header is tolerated LOUD (note at the observe crossing,
  filtered from the skip set) while non-skippable tokens keep the die —
  the frozen M13 pin (zero skip logic on non-skippable crossings) holds;
  task_phases: explicit _PHASE_SECTIONS table replaces the index-derived
  n->section mapping (the named off-by-one trap, hit live)
- installer showcase twins (bin/cli.js BRAND_LOOP · _installer.py _LOOP):
  6-step loop, grounded by test_onboarding_brand

Tests: NEW test_phase_merge_specify.py (8 red->green: phase list + maps,
advance lands plan, scenarios refused, legacy state normalizes, old skip
declaration tolerated loud, bad token still dies). ~30 fixture suites
repaired as the declared sequence-shift ripple (test_min_pillar walk now 4
advances to verify; test_add advance pin; onboarding showcase slice; report
dots; phase-detail blocks; fast-lane skips rewritten to observe) — zero
tests weakened. Full fence 3517/3517 OK.

Pins: ENGINE_MD5 -> b27ce845 · ENGINE_PKG_MD5 -> 870a4ce0 · SEAMS
_declared_scope anchor -> add.py:5631. Gate: PASS (compound tick from
build; scope widened +installer twins via sanctioned re-cross).

refs: six-phase-loop milestone (37d5a80), stacked on feat/call-floor (#147)
author: Tin Dang <tindang.ht97@gmail.com>
pilotspacex-byte added a commit that referenced this pull request Jul 14, 2026
…es, persona presets, build-entry spec echo (#148)

* chore(method): draft six-phase-loop milestone (await-confirm)

8->6 phase merge (specify absorbs scenarios; verify absorbs observe) +
phase-guide disclosure into the bundle-owning roster agents so the
orchestrator loads only SKILL.md + per-phase persona presets + the
build-entry spec echo. Human decisions from the 2026-07-14 interview
recorded in Ground; tasks gated until milestone-confirm.

refs: milestone six-phase-loop (await-confirm)
author: Tin Dang <tindang.ht97@gmail.com>

* feat(method): phase-merge-specify — scenarios merged into specify (six-phase-loop 1/6)

TRUE phase merge, first of two (human-decided over recipe-ticks): the scenarios
PHASE folds into specify — one drafting phase now produces §1 rules AND §2
Given/When/Then. The TASK.md §-section shape is UNTOUCHED (sections are the
stable API; only the lifecycle list shrinks).

Engine (synced x3 — tooling · .add/tooling · _bundled):
- constants.py: PHASES=(specify,plan,tests,build,verify,observe,done);
  _SKIPPABLE_PHASES=(observe,); PHASE_GUIDE specify action gains the
  Given/When/Then duty; PHASE_OWNER/PHASE_AGENT drop scenarios;
  PHASE_GROUPS DIRECTION=(specify,plan,tests)
- add.py: _normalize_phase_tokens legacy map gains scenarios->specify
  (silent, TOTAL, idempotent, normalize-on-read — expectations-first
  precedent); _FRONT_PHASES/(spawn-hints/guide-file map/freeze early-phase
  check/skip-rationale regex follow); _RETIRED_SKIP_TOKENS: a pre-merge
  `skips: scenarios` header is tolerated LOUD (note at the observe crossing,
  filtered from the skip set) while non-skippable tokens keep the die —
  the frozen M13 pin (zero skip logic on non-skippable crossings) holds;
  task_phases: explicit _PHASE_SECTIONS table replaces the index-derived
  n->section mapping (the named off-by-one trap, hit live)
- installer showcase twins (bin/cli.js BRAND_LOOP · _installer.py _LOOP):
  6-step loop, grounded by test_onboarding_brand

Tests: NEW test_phase_merge_specify.py (8 red->green: phase list + maps,
advance lands plan, scenarios refused, legacy state normalizes, old skip
declaration tolerated loud, bad token still dies). ~30 fixture suites
repaired as the declared sequence-shift ripple (test_min_pillar walk now 4
advances to verify; test_add advance pin; onboarding showcase slice; report
dots; phase-detail blocks; fast-lane skips rewritten to observe) — zero
tests weakened. Full fence 3517/3517 OK.

Pins: ENGINE_MD5 -> b27ce845 · ENGINE_PKG_MD5 -> 870a4ce0 · SEAMS
_declared_scope anchor -> add.py:5631. Gate: PASS (compound tick from
build; scope widened +installer twins via sanctioned re-cross).

refs: six-phase-loop milestone (37d5a80), stacked on feat/call-floor (#147)
author: Tin Dang <tindang.ht97@gmail.com>

* feat(method): phase-merge-verify — observe merged into verify (six-phase-loop 2/6)

The second TRUE phase merge: the observe PHASE folds into verify — verify owns
evidence + gate AND the watch/spec-delta duty. §7 OBSERVE stays as a section
(the stable API) rendered under the verify block, exactly as §2 renders under
specify. The lifecycle is now specify · plan · tests · build · verify (+ done).

Engine (synced x3):
- constants.py: PHASES=(specify,plan,tests,build,verify,done);
  _SKIPPABLE_PHASES=() — nothing is skippable; PHASE_GUIDE verify action
  gains the watch+spec-delta duty; PHASE_GROUPS VERIFY=(verify,);
  PHASE_OWNER/PHASE_AGENT drop observe
- add.py: _legacy gains observe->verify (normalize-on-read; a recorded gate
  survives); _RETIRED_SKIP_TOKENS={scenarios,observe}; the cmd_advance skip
  block PRUNED whole (dead once the tuple emptied — the old M13 zero-skip-
  logic placement is now universal); gate/completion is the ONE seam that
  reads a vestigial `skips:` header (one loud note, never a die) and the new
  home of the fold nudge; advance --fill + status --section resolve through
  _PHASE_SECTIONS (verify: (6,7)) — repairing the two ordinal->section
  mappings that broke silently at phase-merge-specify (plan filled §2, not
  §3); membership lists/spawn hints/guide map/help text swept
- templates: the fast template's skips scaffold removed (grammar retired
  end-to-end); both templates' phase-marker comments show the 6-token flow
- installer showcase twins: BRAND_LOOP/_LOOP = 5 pre-done steps

Tests: NEW test_phase_merge_verify.py (13: list+maps, advance/gate land done
with the fold nudge, observe refused, legacy state normalizes keeping its
gate, vestigial skips noted at gate never die, _PHASE_SECTIONS + --fill/
--section table pins). Fence r1 ripple: 49 failures/17 suites repaired —
test_fast_lane_skips REWRITTEN to pin the retirement (resolver keeps naming
bad tokens; historic recorded skips keep status/audit surface); fold nudge
test re-aimed to gate; report dots 6-wide; phase-detail 5 blocks with §7
under verify; onboarding showcase 5 steps; len/range pins swept. Zero tests
weakened. Full fence 3527/3527 OK.

Pins: ENGINE_MD5 -> 5d5e0538 · ENGINE_PKG_MD5 -> fc40ad47 · SEAMS
_declared_scope anchor -> add.py:5603. Gate: PASS (compound tick from build;
the new fold nudge printed on this task's own gate — self-proved).

refs: six-phase-loop milestone, stacked branch feat/six-phase-loop
author: Tin Dang <tindang.ht97@gmail.com>

* feat(method): guide-recut — phase guides re-cut to the 6-phase loop (six-phase-loop 3/6)

The skill's guide tree follows the engine's merged lifecycle: 1-specify.md
absorbs 2-scenarios' load-bearing duties (gherkin Given/When/Then format,
one scenario per Must AND per Reject, the And-unchanged clause on every
rejection, the edge-case sweep, the exit-gate boxes); 6-verify.md absorbs
7-observe's as a post-gate Observe block (scope-of-impact release,
scenarios-as-monitors, the next SPEC delta, the voice-delta -> soul.md
route, the persona tag line, the self-improve.md map pointer). The two
absorbed files are DELETED from all three guide trees. SKILL.md's phase
table shows the 6-row loop (specify row owns §1+§2, verify row §6+§7);
9355 B, under the orient-split 9500 ceiling. soul.md re-routes its Emit
line to the verify guide.

Pools: phases baseline re-anchored 41605 -> 40205 — the INVERSE of the
rebaseline-for-new-surface method: deletion is won ground the ceiling locks
in, so the baseline shrinks by NET won bytes ÷ ratio (deleted 3855 B minus
the absorbing guides' +2735 B = 1120 net; −⌈1120/0.80⌉=1400), ratio 0.80
kept exactly. test_ground_anchor_sha's baseline floor forward-migrated
40280 -> 40205 with the accounting signed.

Tests: NEW test_guide_recut.py (8: deletion ×3 trees · duty markers in both
absorbing guides · no live prose names a deleted file · table rows/§-spans ·
ceiling held). Ripple: 11 failures/10 suites re-aimed (wording-surface
census 32→30 in two pins; soul/persona/ADR/xml-census/per-step-hook pins
moved onto the absorbing guides; pool lists trimmed). Zero tests weakened.
Full fence 3535/3535 OK. Engine untouched — no MD5 re-aim.

refs: six-phase-loop milestone, stacked branch feat/six-phase-loop
author: Tin Dang <tindang.ht97@gmail.com>

* feat(method): bundle-disclosure — phase guides load inside the roster agents (six-phase-loop 4/6)

The user's directive made mechanism: when the orchestrator delegates a phase,
the roster bundle agent loads its OWN phase guides at spawn — the orchestrator
reads only SKILL.md. The inline lane stays first-class (load the one phase
guide yourself, unchanged).

- add-design.md: NEW "Load your bundle guides" section (phases/0-setup.md on
  fresh projects + phases/1-specify.md + phases/3-plan.md); span prose re-cut
  to setup · specify · plan (grounding/scenarios/contract live inside them);
  description spawn steps -> SETUP, SPECIFY, or PLAN; Return enum follows
- add-build.md: loads phases/4-tests.md + phases/5-build.md at spawn
- add-verify.md: loads phases/6-verify.md (carries the post-gate Observe
  block); owns verify end-to-end — OBSERVE is no longer a spawn step;
  Return enum verify-only
- SKILL.md flow lead-in states the split in one sentence: inline -> load only
  the phase you are in; delegating -> the Bundle-column agent loads its own
  guides, you read ONLY this file. 9442 B, under the orient-split 9500
  ceiling. Synced x3 skill trees; agents synced canonical -> _bundled +
  .claude installed copies.

Tests: NEW test_bundle_disclosure.py (6: per-agent guide census · no deleted
guide or retired step name — path-qualified, docs chapters keep their names ·
disclosure sentence · ceiling · x2 parity). Full fence 3541/3541 OK. Engine
untouched — no MD5 re-aim.

refs: six-phase-loop milestone, stacked branch feat/six-phase-loop
author: Tin Dang <tindang.ht97@gmail.com>

* feat(method): persona-presets — per-phase teacher-grade fallback stances (six-phase-loop 5/6)

The interview decision made mechanism: per-phase expertise via PRESETS on the
lean 5-agent roster, not a per-step agent rebuild. Each bundle agent's thin
"use a generic engineer" fallback upgrades to named expert stances per owned
phase, distilled from the vendored teacher library:

- add-design.md: Preset (specify) — a 15-year domain analyst who asks rather
  than assumes, every Reject earns a named error code (setup rides this);
  Preset (plan) — a systems architect, contract-first, cites only anchors
  that exist, sizes the change's reach before freezing scope
- add-build.md: Preset (tests) — red for the RIGHT reason, one test per
  scenario, behavior never internals; Preset (build) — the smallest honest
  diff in small reviewable batches, a test is never touched to go green
- add-verify.md: Preset (verify) — adversarial reviewer then reliability
  analyst, refutes the green before trusting it, security always HARD-STOP,
  spans the post-gate Observe duties (§7)

Presets are the FALLBACK tier only: project-persona routing stays first
(the flow: selection sentence untouched); a preset never blocks and never
lowers a gate. Synced canonical -> _bundled + .claude installed copies.

Tests: NEW test_persona_presets.py (4: per-phase preset census · no bare
generic fallback left · routing-first + never-lowers-a-gate survive · x2
parity). Full fence 3545/3545 OK. Engine untouched.

refs: six-phase-loop milestone, stacked branch feat/six-phase-loop
author: Tin Dang <tindang.ht97@gmail.com>

* feat(method): build-entry-spec-echo — the tick INTO build re-renders WHAT to build (six-phase-loop 6/6)

The interview decision made mechanism: at every successful tests->build tick
the engine prints `build to (frozen plan):` + the §1 Must/Reject bullet
first-lines + the frozen §3 contract-fence head, so the builder starts from
the spec on the screen, not from memory.

- add.py: NEW _spec_echo (PURE read beside _scope_echo; bullet walk stops at
  the next top-level `Key:` line, continuations never echo) + a wrapped tail
  call in _build_entry — AFTER every guard and snapshot, so a refused entry
  never echoes and BOTH entries (advance + the `phase build` override) fire;
  fail-open: exit code, state.json, and TASK.md are identical either way
- ENGINE_MD5 re-aimed bf89b033; ENGINE_PKG_MD5 deliberately NOT re-aimed
  (add_engine/ untouched — the digest proved it unchanged); SEAMS
  _declared_scope pin 5603->5653; engine synced x3 twins
- SELF-PROVED: the task's own re-cross into build rendered its Must/Reject/
  contract echo live

Tests: NEW test_build_entry_spec_echo.py (9: echo at advance + at the phase
override · line order · forced-raise never blocks the tick · malformed §1/§3
partial-echo no-crash · refused crossing never echoes · --skip-freeze DRAFT
crossing still echoes · pure-read byte check · engine-twin parity). Full
fence 3554/3554 OK. LESSON: declare §4 tests as the exact FILE — a dir-form
declaration sweeps the build targets into the tamper snapshot (recovered via
signed re-cross, the expectations-first recipe).

refs: six-phase-loop milestone, stacked branch feat/six-phase-loop
author: Tin Dang <tindang.ht97@gmail.com>

* docs(method): six-phase-loop close review — 6/6 tasks ticked, 7/8 exit criteria evidenced

Milestone close-review bookkeeping: all six task boxes checked, seven exit
criteria checked with (verify: ...) citations (test suites + fence 3554/3554
+ the self-proved build-entry echo), rationale placeholder filled with the
confirmed intake classification. The goal-gate holds the milestone OPEN on
the eighth criterion — the paid WM1 re-measure (fid >= 0.97, calls <= 12) —
which is human-gated: run or accept-partial.

refs: six-phase-loop milestone, stacked branch feat/six-phase-loop
author: Tin Dang <tindang.ht97@gmail.com>

* fix(test): exists()-skip gitignored engine twins in the echo parity test

CI fresh-checkout failure on PR #148: test_engine_twins_carry_the_echo
asserted parity on the two gitignored dogfood twins (.add/tooling/ and
add-method/.add/tooling/), which do not exist on a fresh clone — the
known gitignored-twins class (build-strategy-facets lesson). The tracked
_bundled twin now binds unconditionally; the dogfood twins are checked
only when present (fresh-checkout skip-tolerance precedent ba09498).
No assertion weakened where the files exist.

refs: six-phase-loop milestone, PR #148
author: Tin Dang <tindang.ht97@gmail.com>

---------

Co-authored-by: Tin Dang <tindang.ht97@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants