Repository navigation
v0.0.12 — validate-phase reliability + brownfield onramp + observability + DoD trust
[0.0.12] — 2026-05-05
Theme: validate-phase reliability + brownfield-adopter onramp + observability + DoD trust. v0.0.12 closes 12 BACKLOG entries surfaced across the v0.0.11 ship, the OLH CORE-836 dogfood, and the v0.0.11 short-url BASELINE. Six specs ship together: quote normalization + lint warning in the harness; cause-of-iteration / live-progress / tooling-mismatch detection in the runtime; dedup-status correctness + filesChanged debug telemetry + agent-exit stderr-tail capture; literal-command DoD trust contract; factory init --adopt + factory finish-task + factory-spec-review as hard dep; smoke-boot scenarios in /scope-project.
Added
- Harness quote normalization + scoping-time lint (factory-harness, factory-core).
parseTestLinestrips/replaces curly quotes / smart quotes / backticks before substring match, so a stylistic apostrophe drop between spec and test no longer no-matches correct work. Newspec/test-name-quote-charslint warning catches the friction at scoping time. - Live progress on stderr (factory-runtime). One stderr line per phase boundary (start + end with timing/charged-tokens/files-changed). Cause-of-iteration line at iter N+1 start:
[runtime] iter <N> implement (start) — retrying: <K> failed scenarios; <M> failed dod gates. New--quietflag (andfactory.config.json runtime.quiet) suppresses progress; existing stdout (sequence summary, dynamic-DAG promotion logs) preserved. - Tooling-mismatch loop detection (factory-runtime). Warning line on iter N+1 when iter N-1 and iter N have
dod.status === 'pass'AND identicalvalidate.failedScenarios. Fires once per run; signals "the runtime is iterating against a non-real failure" without changing behavior. - Dedup correctness (factory-runtime).
run-sequence's already-converged dedup now aggregates each candidatefactory-run's descendantfactory-phaserecords and verifies every iteration's terminal phase isstatus: 'pass'before adding to the skip-map. Closes the v0.0.11 ship bug where a NO-CONVERGE run was incorrectly skipped on retry. New stdout log:factory-runtime: <id> prior factory-run found but status=no-converge — re-running. filesChangeddebug telemetry (factory-runtime).factory-implement-report.payloadgains optionalfilesChangedDebug: { preSnapshot, postSnapshot }so the next reproduction of the v0.0.11 short-url BASELINE undercount is trivially diagnosable from the persisted record.- Agent stderr tail capture (factory-runtime).
factory-implement-report.payload.failureDetailgains optionalstderrTail: string(last 10 KB byte-truncated) whenclaude -pexits non-zero. Closes the v0.0.11 worktree-sandbox-spec investigation gap. - Literal DoD shell commands (factory-core, factory-runtime). New
spec/dod-needs-explicit-commandlint warning fires when DoD bullets look like runtime gates without a backtick command.dodPhasedrops the script-name-guessing path; bullets without backtick commands are reported asstatus: 'skipped', reason: 'dod-gate-no-command-found'.SPEC_TEMPLATE.mdupdated with worked examples (typecheck clean (\pnpm typecheck`)` etc). factory init --adopt(factory-core). New mode that walks the templates but skips files that already exist (logged), creating only factory-specific bits (docs/specs/,docs/specs/done/,docs/technical-plans/done/,factory.config.json,.claude/commands/scope-project.md,.gitignoreappended if missing). Brownfield-adopter onramp; closes the CORE-836 friction.factory finish-task <spec-id>(factory-core). New CLI subcommand + library helper. Moves the named spec from<dir>/<id>.mdto<dir>/done/<id>.mdand emits afactory-spec-shippedcontext record. Refuses to move when no convergedfactory-runexists. Runtime emits afactory-runtime: <id> converged → ship via 'factory finish-task <id>'hint on convergence (read-only — does not auto-mutate the working tree).@wifo/factory-spec-reviewas hard dep of@wifo/factory-core(factory-core). Single install (npm i @wifo/factory-coreornpx @wifo/factory-core ...) brings the reviewer. Drops the lazyspec/review-unavailableerror path. Closes the CORE-836 resolver-bounce friction in CodeArtifact-pinned repos.- Smoke-boot scenarios in
/scope-project(factory-core/commands). The slash command source gains a### HTTP entrypoint smoke-boot scenariossubsection: when a spec mentionscreateServer/listen(<port>)/app.listen/http.createServer/Bun.serve/serve(, the scoper appends a smoke-boot scenario that bootsbun src/main.ts, probes a route, and kills the process. Forces the entrypoint into existence — closes the v0.0.11 short-url BASELINE gap where library code shipped butbun src/main.ts404'd.
Changed
- All six
@wifo/factory-*packages bumped to0.0.12in lockstep.init-templates.tsPACKAGE_JSON_TEMPLATE.dependenciesbumped from^0.0.11to^0.0.12for every@wifo/factory-*dep.
Public API surface
| Package | v0.0.11 | v0.0.12 |
|---|---|---|
@wifo/factory-core |
33 | 34 (+finishTask) |
@wifo/factory-context |
18 | 18 |
@wifo/factory-harness |
~16 | ~16 |
@wifo/factory-runtime |
26 | 26 (+RunOptions.quiet?: boolean field) |
@wifo/factory-spec-review |
10 | 10 |
@wifo/factory-twin |
~7 | ~7 |
Reconciliations worth knowing
- Per-scenario coverage carve-out descoped to v0.0.13. Original BACKLOG option (a) called for
--coverage=falseon per-scenariobun testinvocations. The implement run found bun 1.3.x rejects this flag (The argument '--coverage' does not take a value.); bun has no CLI override for coverage. Re-opens with option (b) — parse0 fail + nonzero exitas a coverage trip — for v0.0.13. - DoD non-LLM dispatch when
ANTHROPIC_API_KEYis unset. v0.0.10's DoD-verifier dispatches non-shell judge bullets to the SDK and fails when the env var is unset. The v0.0.12 cluster shipped via--skip-dod-phase; pre-flightfactory spec lint+factory spec reviewstill gated quality. The literal-command DoD trust contract (this cluster) reduces the LLM dispatch surface so future runs need fewer judge calls. factory init --adoptdoes NOT mutate the host'spackage.json. Adding factory devDeps is the maintainer's responsibility. A future v0.0.13 candidate adds--write-depsfor opt-in.factory finish-taskis opt-in, not auto. Move-to-done is a ship action; the runtime emits the hint but never auto-mutates the working tree from inside a phase.- v0.0.12 explicitly does NOT ship: per-scenario coverage carve-out (descoped — see above); auto-resolution on monotonic-DoD-pass loops (warning only — needs evidence on determinism);
filesChangedalgorithm replacement (telemetry first; v0.0.13 candidate); JSON-line streaming progress format (deferred);factory init --merge/--dry-runmodes;factory.config.json dod.commandsmap.