Repository navigation
Releases: WiFoDev/software-factory
Release list
v0.0.14 — v0.0.13 recovery + scaffold/CLI ergonomics
[0.0.14] — 2026-05-08
Theme: v0.0.13 recovery — 3 must-fix correctness bugs + 6 scaffold/CLI ergonomics polish. v0.0.13's URL-shortener BASELINE surfaced 3 hard regressions (apostrophe-strip phantom no-converge, workspace:* shipped to npm, factory spec review broken on published packages) plus 6 honorable-mention polishes. v0.0.14 ships all 9 in 8 sibling specs — 7/8 first-iter, 1/8 agent-exit-nonzero with work landed (same v0.0.11 worktree-spec friction shape; the implementation is correct).
Added
- Harness regex-no-match safety net (factory-harness). When
bun test -t <pattern>exits nonzero AND its output containsregex .+ matched 0 tests, the runner classifies the satisfaction asstatus: 'error'with detail prefixharness/test-name-regex-no-match: <pattern> matched 0 tests in <file>instead of'fail'. The runtime treatserroras a tooling-mismatch signal (not as "implementation broken — re-implement"), which prevents the v0.0.13 phantom-no-converge loop. Mirrors v0.0.13's coverage-trip detection shape. factory finish-task --all-convergedstatus-aggregator (factory-core). Walks each candidate factory-run's descendantfactory-phaserecords, finds the FINAL iteration's terminal phase, and only ships whenterminalPhase === 'pass'. Skipped specs surface asfactory: skipped <id> (run <runId> did not converge — last phase: <status>). The all-no-converge sequence case is a safe no-op (exit 0, shipped=0). Closes the v0.0.13 BASELINE friction where finish-task disagreed with run-sequence on what "converged" means.resolveContextDirhelper (factory-core). Pure function exported from@wifo/factory-corethat resolves the precedence chaincliFlag → configValue → './.factory'. Used byfactory finish-task; mirrored infactory-context. Public API surface delta:@wifo/factory-core34 → 35 (+1).- Day-zero scaffold passes its own DoD gates (factory-core).
factory initnow writes a stubsrc/index.ts(export const VERSION = '0.0.0';) +src/index.test.ts(1 test) sopnpm typecheck && pnpm test && pnpm checkall exit 0 on the freshly-scaffolded tree. Single-lineBIOME_JSON_TEMPLATEarrays so biome's lineWidth=100 rule doesn't trip on the template's own format. The agent overwrites the stubs on first feature scope. - Lint code
spec/yaml-colon-needs-quoting(factory-core). Severity warning. Detects unquoted frontmatter values containing:(which YAML parses as a nested mapping) and emits a friendly fix-suggestion ("wrap the value in single quotes")./scope-project's authoring rules updated to auto-quote — prevents the bomb at scoping time so the lint warning rarely fires in practice. --setting-sources project,localonclaude -pspawns (factory-runtime). Excludes user-level~/.claude/settings.jsonglobal plugin/skill auto-suggestion hooks (e.g., the Vercel/Next.js skill injection the v0.0.13 implement-phase agent reported as false-positive noise). Subscription auth is preserved (OAuth/keychain credentials live outside settings.json). Project-level.claude/settings.jsonand*.local.jsonhooks still load — only user-level global noise is filtered.
Changed
normalizeTestNamePatternno longer strips apostrophes (factory-harness). v0.0.12's apostrophe-stripping (added to handle hypothetical agent stylization ofit()names) caused a real soundness bug: specs that genuinely used"slug's log"had the apostrophe stripped to"slugs log"before passing to bun's-tregex, but the actual test still had the apostrophe → bun matched 0 tests → 5 wasted iterations on phantom no-converge in the v0.0.13 BASELINE. The strip set is reduced to curly-double-quotes only; apostrophes (ASCII + curly) are now treated as literals. Modern Claude preserves apostrophes correctly in test names; the original motivation didn't manifest.factory spec reviewdispatches viachild_process.spawninstead ofcreateRequire(factory-core). v0.0.13'screateRequire(import.meta.url)workaround for the workspace cycle hit CJS resolution againstfactory-spec-review's ESM-only exports map → silent exit 0 on the npm-published artifact (the workspace symlink-bypass masked it). v0.0.14 spawns thefactory-spec-reviewbin as a subprocess; process boundary eliminates the type-resolution AND the CJS/ESM mismatch. Subscription auth preserved via env propagation. The factory-cli umbrella package option stays deferred for v1.0.0.--context-diruniversal default flips from./contextto./.factory(factory-core, factory-context).factory initcreates./.factory, so the previous split —factory-runtimedefaulted to./.factorywhilefactory finish-taskandfactory-contextdefaulted to./context— silently looked in the wrong directory. v0.0.14 unifies all three CLIs on./.factoryAND adds auto-detect fromfactory.config.json runtime.contextDir. Precedence: CLI flag (--context-dir) >factory.config.json runtime.contextDir> universal default./.factory. Breaking for users who relied on the old./contextdefault — pass--context-dir ./contextto keep the v0.0.13 behavior.- CI publish flow uses
pnpm pack+npm publish <tarball>two-step (workflow). v0.0.13.x's switch frompnpm publishtonpm publish(for OIDC handshake) lost pnpm's automaticworkspace:*→^<version>rewrite, breakingnpx @wifo/factory-core initfor fresh users. v0.0.14 splits the responsibilities:pnpm packdoes the manifest rewrite + produces a tarball;npm publish <tarball> --provenanceuploads via OIDC. Post-publish verification re-fetches each manifest and fails the workflow ifworkspace:leaks through — regression-pin against future shape regressions. - All six
@wifo/factory-*packages bumped to0.0.14in lockstep.init-templates.tsPACKAGE_JSON_TEMPLATE.dependenciesbumped from^0.0.13to^0.0.14for every@wifo/factory-*dep.
Public API surface
| Package | v0.0.13 | v0.0.14 |
|---|---|---|
@wifo/factory-core |
34 | 35 (+resolveContextDir) |
@wifo/factory-context |
18 | 18 |
@wifo/factory-harness |
~16 | ~16 |
@wifo/factory-runtime |
26 | 26 |
@wifo/factory-spec-review |
10 | 10 |
@wifo/factory-twin |
~7 | ~7 |
Reconciliations worth knowing
- 8 specs across 2 run-sequence invocations. Run-1 hit the same stale-dist issue as v0.0.12 (the runtime process loaded harness/dist at startup with the OLD apostrophe-strip code; spec A's fix landed mid-run but the running process never reloaded). Spec D phantom-no-converged on its own apostrophe-bearing test name; sequence stopped. Recovery: rebuild dist, fresh runtime process, re-run on remaining 5 specs (4/5 converged; spec H — claude-no-hooks — agent-exit-nonzero with work landed, same v0.0.11 worktree-sandbox friction shape). All 8 specs' work is correct; 232 core / 71 harness / 255 runtime / 106 spec-review tests pass.
--context-dirchange is breaking. Users with scripts hard-coded to./contextneed to pass--context-dir ./contextexplicitly, OR rename their dir to./.factory. The universal default is the dirfactory initcreates.createRequiredropped from core/cli.ts. v0.0.12's workaround → v0.0.13's persistence → v0.0.14's removal. The subprocess path eliminates the CJS/ESM friction entirely.- bun stays as the test runner. Every package's test script is
bun test src— unchanged. v0.0.13's bun-as-test-only documentation continues to apply. - v0.0.14 explicitly does NOT ship: the factory-cli umbrella package (deferred to v1.0.0); custom hook authoring (out of scope;
--setting-sourcesis enough); a--legacy-context-dir-defaultflag (rejected — the migration is one flag added per invocation);claude --no-hooks(the actual flag that exists is--setting-sources; we use it).
v0.0.13 — init-script ergonomics + brownfield polish + cycle-break
[0.0.13] — 2026-05-06
Theme: init-script ergonomics + brownfield-adopter polish + architectural cycle-break. v0.0.13 closes 8 BACKLOG entries surfaced across the v0.0.12 BASELINE (5 init-script frictions + 1 carve-out re-shape) and the v0.0.12 tag-fire (2 architectural items). Six sibling specs ship together — first cluster to converge 6/6 first-iter in a single run-sequence invocation with zero recovery.
Added
factory initfirst-contact polish (factory-core). Three init-template fixes that close every greenfield friction the v0.0.12 BASELINE flagged: (a)BIOME_JSON_TEMPLATEmigrates from Biome 1.x's"include"key to Biome 2.x's"includes"(matching the pinned major); (b) scaffold writes.factory/.gitkeep+ appends.factory/worktrees/,.factory/twin-recordings/to.gitignore(idempotent); (c)factory.config.jsongainsdod.template?: string[]derived frompackage.jsonscripts at init time, and/scope-projectreads it as the canonical DoD section body — closes the per-cluster 4×spec/dod-needs-explicit-commandwarning the v0.0.12 BASELINE measured.- Auto-quiet for non-TTY stderr (factory-runtime). When
process.stderr.isTTYis false (pipe /tee/ CI capture), the[runtime]progress lines auto-suppress. New--no-quiet(and--progressalias) opts back into progress for non-TTY contexts that want it. Precedence: CLI flag >factory.config.json runtime.quiet> auto-detect > built-in default. Closes the v0.0.12 BASELINE honorable mention "live progress pollutes captured logs." factory finish-task --all-converged(factory-core). Batch ship-cycle move-to-done. Walks the most recentfactory-sequence(or one named via--since <factorySequenceId>); moves each converged spec from<dir>/<id>.mdto<dir>/done/<id>.md; emits onefactory-spec-shippedrecord per moved spec. Mutually exclusive with the positional<spec-id>form. Closes the only step that didn't auto-progress with the rest ofrun-sequence.- Per-scenario coverage-trip detection (factory-harness). v0.0.12's option (a) (
--coverage=false) was descoped because bun 1.3.x rejects the flag; v0.0.13 ships option (b) — the runner parses bun's stdout for0 fail+coverage threshold ... not metmarkers AND a nonzero exit, classifying the result aspasswith detail prefixharness/coverage-threshold-tripped:rather thanfail. Real test failures still classify asfail; the carve-out is conservative. - Bun-as-test-only — schema emitter is Node-native (factory-core).
packages/core/scripts/emit-json-schema.tsrewritten to usenode:fs+ standard ESM. Build script changes frombun run scripts/...totsx scripts/....tsxjoinsdevDependenciesof@wifo/factory-core.pnpm buildandpnpm typecheckare now Node-only — bun is required only forpnpm test(the test runner isbun test srcper package — intentional and unchanged). Documented in top-level README + AGENTS.md + scaffold README.
Changed
@wifo/factory-spec-reviewis now apeerDependencyof@wifo/factory-core(wasdependenciesin v0.0.12). pnpm 8+ and npm 7+ auto-install peer deps, so the v0.0.12 brownfield zero-config goal is preserved for the major package managers. The build-graph cycle introduced in v0.0.12 disappears: peer deps don't form build-time edges. Legacy npm < 7 caveat documented inpackages/core/README.md+ top-level README.packages/core/src/cli.tsreverts to a staticimport { runReviewCli } from '@wifo/factory-spec-review/cli'— the v0.0.12createRequire(import.meta.url)workaround is removed (the cycle is gone, no need to defer type resolution)..github/workflows/publish.ymlbuild step reverts topnpm -r build(single line). The v0.0.12 explicit per-package list and--workspace-concurrency=1flag are removed. Build-before-typecheck order preserved (independent constraint).- All six
@wifo/factory-*packages bumped to0.0.13in lockstep.init-templates.tsPACKAGE_JSON_TEMPLATE.dependenciesbumped from^0.0.12to^0.0.13for every@wifo/factory-*dep.
Public API surface
| Package | v0.0.12 | v0.0.13 |
|---|---|---|
@wifo/factory-core |
34 | 34 |
@wifo/factory-context |
18 | 18 |
@wifo/factory-harness |
~16 | ~16 |
@wifo/factory-runtime |
26 | 26 |
@wifo/factory-spec-review |
10 | 10 |
@wifo/factory-twin |
~7 | ~7 |
Reconciliations worth knowing
- v0.0.13 is the first cluster to ship 6/6 first-iter via one
run-sequenceinvocation with zero recovery. Total: 71m wall-clock, 169k charged tokens. v0.0.10 (5/5 in 81m) was the prior best; v0.0.11 had iter-2 retry on one spec; v0.0.12 took 4 invocations due to--coverage=falserecovery. The v0.0.13 ship is the cleanest dogfood evidence to date that the runtime is stable. - Peer-dep auto-install requires pnpm 8+ or npm 7+. Legacy npm users get a clear stderr message; the install-docs caveat is one-line in both top-level README and
packages/core/README.md. - bun is still required for
pnpm test. Every package's test script isbun test src— that's the workspace's chosen test runner, intentional and unchanged. The setup-bun GitHub Actions step also stays for the test phase. factory init --adopt(shipped v0.0.12) interacts cleanly with the v0.0.13 init-template additions. TheIGNORE_IF_PRESENTset still skips pre-existingpackage.json/tsconfig.json/biome.json. The new.factory/.gitkeepand.gitignoreextension are append-only — no overwrite.- v0.0.13 explicitly does NOT ship: vitest/jest equivalents for coverage-trip detection (deferred — bun-only);
factory-cliumbrella package for the cycle-break (option b from the v0.0.13 BACKLOG entry — out of scope; peer-dep is the lighter v0.0.13 solution); migrating tests off bun (out of scope; bun test stays); JSON-line streaming progress format; per-channel progress fd; auto-firefactory finish-taskon convergence.
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.
v0.0.11 — trust → isolation: worktree-sandbox + trust-layer calibration
[0.0.11] — 2026-05-04
Theme: trust → isolation — runs sandboxed in their own git worktree, plus calibration of the v0.0.10 trust-contract layer. v0.0.11 closes the long-deferred worktree-sandbox candidate (BACKLOG since the original ROADMAP's v0.1.0 list) and ships five sibling polish specs that pay down friction surfaced by the v0.0.10 BASELINE: holdout-aware convergence, DoD-precision calibration, dynamic DAG walk for run-sequence, charged-token budget surfacing, and CI publish hygiene.
Added
factory-runtime run --worktree(factory-runtime). Each run materializes an isolatedgit worktreeat<projectRoot>/.factory/worktrees/<runId>/on a throwaway branchfactory-run/<runId>; the implement / validate / DoD phases all execute against that checkout, so the maintainer's main tree is never touched by the agent. Strong undo by construction (git worktree remove); enables parallel runs against distinct worktree paths. New CLI subcommandfactory-runtime worktree { list | clean [--all] [--keep-failed] }for forensic inspection + maintenance. New context record typefactory-worktree(parents=[runId]) carryingrunId / worktreePath / branch / baseSha / baseRef / createdAt / status. Public surface:+3exports (23 → 26:createWorktree,WorktreeOptions,CreatedWorktree). NewRuntimeErrorCode:runtime/worktree-failed(14 → 15).- Holdout-aware convergence (factory-runtime).
validatePhase({ checkHoldouts: true })runs## Holdout Scenarioseach iteration alongside the visible scenarios; convergence requires both to pass. New CLI flag--check-holdoutsandfactory.config.jsonkeyruntime.checkHoldouts. The persistedfactory-validate-reportpayload gains aholdouts: []array (legacy records without it still parse). - DoD-precision calibration (factory-spec-review). The
dod-precisionjudge is recalibrated against v0.0.10 BASELINE evidence; threshold + prompt updated to reduce false-positive flags on prose DoD bullets. - Charged-token budget surfacing (factory-runtime).
RunReport.chargedTokensnow exposes the budget-relevant total (input + output) — cache reads/creates are excluded per Anthropic's pricing. CLI converged/no-converge stdout printscharged=<n>/<budget>. The existingRunReport.totalTokensis preserved as a deprecated alias for back-compat. - Dynamic DAG walk for run-sequence (factory-runtime).
factory-runtime run-sequencenow promotes drafting specs dynamically as their deps converge during the same invocation (auto-promotion log line:<dep> converged → promoting <dependent>). Single-invocation cluster shipping for ready→drafting chains;--include-drafting(andruntime.includeDrafting) preserve the legacy walk-everything-from-start semantic. factory ci publishhardening (factory-core). CI publish workflow + scripted manual-fallback path normalize tarball checks across all six packages.
Changed
- All six
@wifo/factory-*packages bumped to0.0.11in lockstep.init-templates.tsPACKAGE_JSON_TEMPLATE.dependenciesbumped from^0.0.10to^0.0.11for every@wifo/factory-*dep.
Public API surface
| Package | v0.0.10 | v0.0.11 |
|---|---|---|
@wifo/factory-core |
33 | 33 |
@wifo/factory-context |
18 | 18 |
@wifo/factory-harness |
~16 | ~16 |
@wifo/factory-runtime |
23 | 26 (+createWorktree, +WorktreeOptions, +CreatedWorktree) |
@wifo/factory-spec-review |
10 | 10 |
@wifo/factory-twin |
~7 | ~7 |
Reconciliations worth knowing
--worktreeis opt-in for v0.0.11. Defaultfalse. Becomes opt-out post-v0.1.0 once soaked.- One worktree per
run()invocation. All phases share the worktree for that run. Cleanup is opt-in viafactory-runtime worktree clean(default removes only converged worktrees;--allalso removes failed ones, preserving forensic value of failed runs). - Worktree creation is atomic — a partial failure (disk full, permission denied) leaves no orphan record/branch. NO
factory-runrecord persists whencreateWorktreefails (the run never started). - v0.0.11 explicitly does NOT ship: parallel agent execution within a single sequence; auto-cleanup of converged worktrees on run end; worktree GC after N days; auto-merge of converged worktrees back into the main branch (the maintainer reviews + merges manually); per-spec worktree options in spec frontmatter (only
RunOptions.worktreefor now); cross-platform Windows worktree handling (best-effort; tested on macOS/Linux).
v0.0.10 — trust contract: DoD-verifier + reviewer judges + workflow polish
[0.0.10] — 2026-05-03
Theme: trust contract — DoD-verifier + reviewer judges = trust on both sides. v0.0.10 closes the v0.0.9 BASELINE friction list with five sibling specs that together turn each spec's Definition of Done into a checked contract and tighten the spec-quality teeth. The DoD verifier now treats unchecked DoD items as a converge-blocking signal; three new reviewer judges (feasibility, api-surface-drift, scope-creep) catch quality regressions before runtime; run-sequence polish + factory spec watch smooth the workflow; and the spec/wide-blast-radius heuristic is recalibrated against empirical data.
Added
- DoD-verifier phase (factory-runtime). New verifier consumes the spec's
## Definition of Donechecklist and surfaces unchecked items as a converge-blocking signal. Public surface:+2exports (21 → 23). - Three reviewer judges (factory-spec-review):
feasibility,api-surface-drift,scope-creep. Three newReviewCodeunion members; export count unchanged at 10. factory spec watch(factory-core). Watches a directory tree for*.mdchanges and re-runsfactory spec lint(and optionallyfactory spec review --no-cache) on every save. Public surface:+2exports (29 → 31).spec/wide-blast-radiusthreshold raise from 8 to 12 + NOQA suppression directive (factory-core). Threshold raised based on v0.0.8 self-build evidence (the spec that actually timed out touched 12 files) + v0.0.9 BASELINE empirical data (18 historical specs warned at threshold 8). New HTML-comment NOQA directive (<!-- NOQA: spec/wide-blast-radius -->/<!-- NOQA: code-a, code-b -->/ blanket<!-- NOQA -->) suppresses warnings per-spec; per-code, per-spec scope; never suppresses severity-errorcodes.run-sequencepolish (factory-runtime). Workflow ergonomics improvements landed alongside the other v0.0.10 deliverables.
Changed
- All six
@wifo/factory-*packages bumped to0.0.10in lockstep.init-templates.tsPACKAGE_JSON_TEMPLATE.dependenciesbumped from^0.0.9to^0.0.10for every@wifo/factory-*dep. spec/wide-blast-radiuswarning message updated to reference the new>= 12threshold.
Public API surface
| Package | v0.0.9 | v0.0.10 |
|---|---|---|
@wifo/factory-core |
29 | 33 (+watch +DoD helpers) |
@wifo/factory-context |
18 | 18 |
@wifo/factory-harness |
~16 | ~16 |
@wifo/factory-runtime |
21 | 23 (+DoD-verifier) |
@wifo/factory-spec-review |
10 | 10 (+3 ReviewCode union members; count unchanged) |
@wifo/factory-twin |
~7 | ~7 |
Reconciliations worth knowing
- NOQA does NOT suppress errors. Severity-
errorcodes (e.g.,spec/invalid-depends-on) always fire. NOQA is warnings-only. - NOQA placement constraint. The directive lives in the spec body (HTML comment), NOT in the YAML frontmatter — the schema is
.strict()and would reject the comment as an unknown key. - NOQA scope is per-spec, not per-line. A single matching comment anywhere in the body suppresses every emission of the named code from
lintSpec. - No retroactive NOQA additions. v0.0.10 raises the threshold but does NOT walk the 18 historical specs to add NOQA — most fall below 12 paths after the raise; the rest can opt in on demand.
v0.0.9 — status-aware run-sequence + per-spec timeout + scaffold scripts
[0.0.9] — 2026-05-03
Theme: status-aware run-sequence + per-spec timeout + scaffold scripts + dep-aware internal-consistency. Four small frictions surfaced in the v0.0.8 BASELINE — drafting specs got pulled into run-sequence; wide-blast-radius specs hit the 600s agent-timeout ceiling with no override; the scaffold's package.json shipped empty scripts even as every spec's DoD claimed they were runnable; internal-consistency flagged shared constraints in multi-spec products as unreferenced because it didn't follow depends-on edges. v0.0.9 closes all four.
Added
agent-timeout-msfrontmatter field +spec/wide-blast-radiuslint warning (factory-core). New optional'agent-timeout-ms': z.number().int().positive().optional()onSpecFrontmatterSchema. New lint codespec/wide-blast-radius(severity: warning) emitted when a spec's Subtasks section names ≥ 8 distinct file paths. Field-level addition; zero new public exports.- Scaffold
scripts: { typecheck, test, check, build }(factory-core).PACKAGE_JSON_TEMPLATE.scriptsnow ships the four canonical entries matching the monorepo's own conventions, so a freshfactory initproject can immediately run the gates its DoD claims. run-sequenceskips drafting specs by default +--include-draftingflag (factory-runtime).loadSpecsnow filtersfrontmatter.status === 'drafting'unlessincludeDrafting: true. New CLI flag--include-draftingandfactory.config.jsonkeyruntime.includeDrafting(defaultfalse). CLI flag > config > built-in default.- Per-spec
agent-timeout-msconsumption (factory-runtime).run()now resolves the agent timeout viaspec.frontmatter['agent-timeout-ms'] ?? options.maxAgentTimeoutMs ?? DEFAULT_MAX_AGENT_TIMEOUT_MS. Wide-blast-radius specs override the 600s ceiling without bumping the global default for everyone. internal-consistencyjudge followsdepends-onedges (factory-spec-review). The judge'sbuildPromptconsumes the existingJudgePromptCtx.deps(plumbed through in v0.0.7 bycross-doc-consistency) and appends a## Deps Constraints (referenced via depends-on)section to the artifact, with each dep's## Constraints / Decisionsblock sliced viafindSection. The criterion gains a sentence instructing the LLM judge to score against the union of this spec's Constraints + every dep's Constraints. Field-level on existing types; zero new exports.
Changed
- All six
@wifo/factory-*packages bumped to0.0.9in lockstep.init-templates.tsPACKAGE_JSON_TEMPLATE.dependenciesbumped from^0.0.8to^0.0.9for every@wifo/factory-*dep.
Public API surface
Unchanged across every package. Strictly equal to v0.0.8's surface (29 / 21 / 10 / 18 / ~16 / ~7). All v0.0.9 changes are field-level on existing schemas/types/templates + version metadata.
Reconciliations worth knowing
internal-consistencycache invalidates on first run after upgrade. The criterion text gains one sentence, soruleSetHash()flips and v0.0.8 cache entries miss. Expected and correct.- Dep loading remains the CLI's responsibility. v0.0.7 already wired the CLI to auto-load each declared dep from
docs/specs/<id>.mdordocs/specs/done/<id>.mdand thread them throughrunReview'sdepsoption. v0.0.9 just teachesinternal-consistencyto opt into the existing data flow. internal-consistencystill applies on every spec. The judge'sapplies()is unchanged (returns true unconditionally). The dep-awareness affects scoring, not whether the judge fires. A spec without deps still gets scored, just without dep-context.- Transitive dep loading is NOT yet shipped. The CLI loads direct deps only. Walking a dep's own
depends-onchain is deferred to a future release. - Drafting-by-default is
run-sequenceonly.factory-runtime run(single-spec) still runs whatever spec you point it at regardless of status. The status filter is purely a sequence-level guard.
v0.0.8 — discoverability + baseline reset
[0.0.8] — 2026-05-03
Theme: discoverability + baseline reset. The v0.0.7 BASELINE run shipped a critical finding: v0.0.7's three deliverables (/scope-project, depends-on, run-sequence) were on npm but invisible to a fresh-repo agent — factory init didn't auto-install the slash command into .claude/commands/, the scaffold README didn't mention run-sequence, and the canonical baseline prompt explicitly told the agent those tools didn't exist (the prompt was authored when they were future work). v0.0.8 closes all three gaps so v0.0.7's value is actually exercised by a fresh-repo agent.
Added
- Bundled
/scope-projectslash command (factory-core). Canonical source moves fromdocs/commands/scope-project.mdtopackages/core/commands/scope-project.mdso it ships in the npm tarball.packages/core/package.json'sfilesglob extends withcommands. New internal helperreadScopeProjectCommandTemplate()ininit-templates.tsresolves the bundled markdown viaimport.meta.url+ relative path (works in both source and built contexts). NOT exported fromcore/src/index.ts. factory initwrites.claude/commands/scope-project.md(factory-core). The scaffold'splanFilesnow drops the bundled slash-command source into the fresh project's.claude/commands/so any Claude Code session opened in the project picks it up zero-config. The file is a regular file (not a symlink — symlinks don't survivenpm packreliably across platforms).- Scaffold README
## Multi-spec productssection (factory-core). New section ininit-templates.ts'sREADME_TEMPLATEdocuments the canonical v0.0.7+ flow:/scope-project <description>→factory spec lint docs/specs/→factory-runtime run-sequence docs/specs/. Section explicitly notes thatfactory initwrites.claude/commands/scope-project.mdautomatically. ~25 lines, scannable not tutorial. The scaffold is the documentation. - Baseline prompt reset (docs/baselines). Archived
docs/baselines/url-shortener-prompt.mdasurl-shortener-prompt-v0.0.5-v0.0.7.md(preserves the historic v0.0.5–v0.0.7 baseline against which prior friction lists were measured). Wrote a fresh canonical prompt opening with/scope-project+factory-runtime run-sequenceso v0.0.8+ baselines measure the v0.0.7+ flow honestly.BASELINE.mddocuments the methodology reset event.
Changed
- All six
@wifo/factory-*packages bumped to0.0.8in lockstep.init-templates.tsPACKAGE_JSON_TEMPLATE.dependenciesbumped from^0.0.7to^0.0.8for every@wifo/factory-*dep.
Public API surface
Unchanged across every package. Strictly equal to v0.0.7's surface (29 / 21 / 10 / 18 / ~16 / ~7). All v0.0.8 changes are field-level on existing constants/templates + version metadata + new internal-only helpers.
| Package | Exports |
|---|---|
@wifo/factory-core |
29 |
@wifo/factory-context |
18 |
@wifo/factory-harness |
~16 |
@wifo/factory-runtime |
21 |
@wifo/factory-spec-review |
10 |
@wifo/factory-twin |
~7 |
Test surface growth
@wifo/factory-core: 104 → 124 (+scope-project source/init bundling tests + Multi-spec README tests + baseline-reset evidence test + version-pin tests)
Reconciliations worth knowing
- The discoverability gap was the binding constraint, not DoD coverage. Pre-v0.0.7 BASELINE the v0.0.8 plan was DoD-verifier + worktree sandbox + PostToolUse hook + CI publish. The v0.0.7 BASELINE evidence re-ranked entirely: discoverability is the actual ceiling, so DoD-verifier slips to v0.0.9+.
- Slash command is a regular file, not a symlink. Cross-platform reliability: symlinks don't survive
npm pack/npm installconsistently across macOS/Linux/Windows. The in-repo.claude/commands/scope-project.mdIS a symlink for dogfooding (single source of truth), but the scaffolded copy is a plain-file write. - No retroactive backports. Projects scaffolded before v0.0.8 don't auto-pick-up the new section or slash command — users either re-run
factory initor copy the new section by hand. Afactory init --upgradeflag is a v0.0.9+ candidate. - Lockstep bump even for unchanged packages. harness/spec-review/context/twin didn't change in v0.0.8 but bumped to 0.0.8 anyway. Matches the v0.0.5 / v0.0.6 / v0.0.7 publish-coordination pattern; keeps the scaffold's
^0.0.8deps uniformly resolvable. - Section content is locked, prose is flexible. The spec locked the section heading (
## Multi-spec products) and the structural elements (named commands, code block, auto-install note); the exact wording is implementation-flexible so future doc edits don't trip the structural tests.
v0.0.7 — real-product workflow: /scope-project + depends-on + run-sequence
[0.0.7] — 2026-05-02
Theme: real-product workflow. Three deliverables that together collapse the multi-spec-product friction quantified in the v0.0.6 BASELINE run (32 manual interventions per 4-spec product → ~8): a /scope-project slash command, a depends-on frontmatter field, and a factory-runtime run-sequence CLI subcommand. The maintainer now decomposes one product description with one slash command and ships the resulting spec set with one run-sequence invocation; provenance threads the entire product DAG under one factory-sequence record.
Added
/scope-projectslash command (docs/commands/). New canonical source atdocs/commands/scope-project.md(in-repo). Takes a natural-language product description and writes 4-6 LIGHT specs in dependency order underdocs/specs/<id>.md. First spec shipsstatus: ready; rest shipstatus: drafting. Each spec populates the newdepends-on:frontmatter field. Worked example:docs/baselines/scope-project-fixtures/url-shortener/. Install viacp docs/commands/scope-project.md ~/.claude/commands/scope-project.md.depends-on: [<id>, ...]frontmatter field (factory-core). Optional array onSpecFrontmatter. Defaults to[].factory spec lintvalidates each entry against the newKEBAB_ID_REGEX = /^[a-z][a-z0-9-]*$/and (with--cwd <dir>) checks that each declared dep file exists underdocs/specs/ordocs/specs/done/. Two new lint codes:spec/invalid-depends-on(error),spec/depends-on-missing(warning).lintSpecFile(filePath, opts?)helper export (factory-core). WrapsreadFileSync+lintSpecwith acwddefaulted to<file>/../... CLI uses this; programmatic callers can keep usinglintSpecdirectly.KEBAB_ID_REGEXconstant export (factory-core). Canonical kebab-case spec id pattern.cross-doc-consistencyjudge reads declared deps (factory-spec-review). Judgeapplies()returns true whenhasTechnicalPlan || depsCount > 0. NewJudgeApplicabilityCtx.depsCount,JudgePromptCtx.deps?: ReadonlyArray<{id, body}>,RunReviewOptions.deps?. CLI auto-loads each declared dep fromdocs/specs/<id>.mdordocs/specs/done/<id>.md; missing →review/dep-not-foundwarning.factory-runtime run-sequence <dir>/CLI subcommand (factory-runtime). Walks<dir>/*.md, builds the depends-on DAG, topologically sorts via Kahn's (alphabetic tie-break), runs each spec via existing per-specrun()in order. Exit 0 on full converge, 1 on partial / no-converge, 3 on error / cycle / missing dep / sequence-cost-cap.runSequencefunction +SequenceReporttype exports (factory-runtime). Public API surface: 19 → 21 names.- New context record type
factory-sequence(factory-runtime). Persisted at sequence start (root, parents=[]); every per-specfactory-runparents at[factorySequenceId]via the newRunArgs.runParents?: string[]arg.factory-context tree --direction down <factorySequenceId>walks the entire product DAG. --max-sequence-tokens <n>CLI flag (factory-runtime). Whole-sequence cap on summed agent tokens. Pre-run check:cumulative + nextSpec.maxTotalTokens > maxSequenceTokensaborts before invoking the next spec. Default unbounded (per-spec cap from v0.0.3 still applies).--continue-on-failCLI flag (factory-runtime). Continue running independent specs after a failure; transitive dependents are marked'skipped'withblockedBy: <first-failed-id>.RunReport.totalTokens?: number(factory-runtime). Field-level addition. Computed in-memory from the run'sfactory-implement-report.tokens. Used byrunSequenceto accumulate sequence totals.- Three new
RuntimeErrorCodevalues (factory-runtime):'runtime/sequence-cycle','runtime/sequence-dep-not-found','runtime/sequence-cost-cap-exceeded'. Enum count: 10 → 13. - Two new
factory.config.jsonkeys (factory-runtime):runtime.maxSequenceTokens,runtime.continueOnFail. CLI flag > config > built-in default precedence preserved. - URL-shortener fixture set (docs/baselines/scope-project-fixtures/). Four hand-authored LIGHT spec files demonstrating the canonical
/scope-projectoutput shape against the canonical URL-shortener prompt.
Changed
- All six
@wifo/factory-*packages bumped to0.0.7in lockstep.init-templatesscaffold deps bumped from^0.0.6to^0.0.7.
Public API surface
| Package | v0.0.6 | v0.0.7 | Δ |
|---|---|---|---|
@wifo/factory-core |
27 | 29 | +KEBAB_ID_REGEX, +lintSpecFile |
@wifo/factory-runtime |
19 | 21 | +runSequence, +SequenceReport |
@wifo/factory-spec-review |
10 | 10 | (field-level on existing types) |
@wifo/factory-context |
18 | 18 | unchanged |
@wifo/factory-harness |
~16 | ~16 | unchanged |
@wifo/factory-twin |
~7 | ~7 | unchanged |
Test surface growth
@wifo/factory-core: 94 → 104 (+8 depends-on schema/lint scenarios + 2 fixture/source structural tests)@wifo/factory-runtime: 138 → 161 (+13 sequence + 3 records + 4 runtime.runParents/totalTokens + 3 cli scenarios)@wifo/factory-spec-review: 62 → 74 (+8 cross-doc-consistency deps scenarios + 1 review.deps thread + 2 cli dep-loading + 1 review/dep-not-found)- Workspace total: 446 → 455
Reconciliations worth knowing
SpecFrontmatter.idis NOT retroactively tightened to matchKEBAB_ID_REGEX. The pattern is documented as canonical and enforced ONLY fordepends-onentries. Existing specs (and existing third-party specs) may not match. A future v0.0.8+ may add anid-formatlint warning for existing-spec ids.run-sequencedoes NOT recurse into<dir>/done/. Specs indone/already shipped — they are external constraints, not part of the sequence DAG. Thecross-doc-consistencyreviewer judge handles cross-done/consistency at review time.- Sequence-cost-cap is enforced PRE-RUN. Before invoking
run()for each spec in topological order, the runtime comparescumulative + nextSpec.maxTotalTokensagainstmaxSequenceTokens. Stricter than post-hoc but prevents one spec from blowing the entire sequence budget on its own. - Failure cascade is dep-chain-only. A failed spec poisons its TRANSITIVE dependents (via the depends-on chain). Specs with
depends-on=[]always run regardless of other failures.--continue-on-failflips between "run independent roots" and the default "stop on first failure." - Cascade-blocked status is
'skipped'. Maintains the CI-tooling convention;blockedBy: stringfield carries the cause.
v0.0.6 — v0.0.5.x cluster (4 quality + audit fixes)
Theme: v0.0.5.x cluster shipped together. Four BACKLOG-tracked follow-ups to v0.0.5, bundled because they're all small fixes / quality-of-life improvements that make every subsequent v0.0.6+ workflow cleaner. Three of the four runs hit the very 600s agent timeout that the fourth fix is making configurable — concrete validation that the friction is real.
Added
--max-agent-timeout-ms <n>CLI flag +RunOptions.maxAgentTimeoutMs?: number(factory-runtime). Default 600_000 (unchanged). Mirrors the v0.0.3--max-total-tokenspattern exactly: field-level addition, string-label CLI validation (NOT a newRuntimeErrorCode). Wide-blast-radius specs can raise the ceiling explicitly.factory.config.json— optional config file at the consumer project root. Specifies defaults forruntime: { maxIterations, maxTotalTokens, maxPromptTokens, noJudge }. Read byfactory-runtime runfrom cwd. Precedence: CLI flag > config file > built-in default.factory initwrites one with documented defaults.@wifo/factory-spec-reviewin scaffoldeddevDependencies(factory-core).factory initnow produces a scaffold wherefactory spec reviewworks on first invocation (previously the dispatch'sfindPackageRootwalk failed because the package wasn't installed)..factory-spec-review-cacheinGITIGNORE_TEMPLATE(factory-core). The reviewer cache no longer shows up ingit statusafter a freshfactory init+factory spec reviewrun.
Fixed
- Harness strips surrounding backticks from
test:paths and patterns (factory-harness). Recurring spec-authoring pitfall —parseTestLinewas passing the literal token (with backticks) tobun test, which never matched any file. Caught twice now (parse-size v1, factory-runtime-v0-0-5). The SPEC_TEMPLATE backtick-guidance BACKLOG entry is now obsolete; spec authors can write either backtick-quoted or bare paths and the harness handles both. factory-implement-report.filesChangedis reliable (factory-runtime). Replaces the simple post-rungit diffwith a pre/post working-tree snapshot (tracked + untracked + content hash). Two failure modes resolved:- False negative on new-file-only runs (plain
git diffdoesn't report untracked files). - False positive on pre-run uncommitted changes (the agent gets attributed for files that were already dirty).
Pre-dirty paths are filtered out — over-attributing the agent is worse than under-attributing.
- False negative on new-file-only runs (plain
Changed
- All six
@wifo/factory-*packages bumped to0.0.6in lockstep (matches the v0.0.5 publish coordination pattern).init-templatesscaffold deps bumped from^0.0.5to^0.0.6. - ROADMAP shift: v0.0.6 was originally themed
/scope-project+ real-product workflow. That theme moves to v0.0.7; v0.0.6 contains the v0.0.5.x cluster shipped here.
Public API surface
Unchanged across every package. Strictly equal to v0.0.5's surface (27 / 18 / ~16 / 19 / 10 / ~7). All v0.0.6 changes are field-level on already-exported types or internal-only helpers.
| Package | Exports |
|---|---|
@wifo/factory-core |
27 |
@wifo/factory-context |
18 |
@wifo/factory-harness |
~16 |
@wifo/factory-runtime |
19 |
@wifo/factory-spec-review |
10 |
@wifo/factory-twin |
~7 |
Test surface growth
@wifo/factory-core: 74 → 77 (+3 init-ergonomics scenarios)@wifo/factory-harness: 56 → 60 (+4 backtick-stripping scenarios)@wifo/factory-runtime: 131 → 138 (+4 filesChanged + 3 agent-timeout scenarios)- Workspace total: 446 → 462
Reconciliations worth knowing
- The cluster shipped as v0.0.6, not v0.0.5.1. Spec ids stay as
factory-{harness,core,runtime}-v0-0-5-{1,2}(they refer to the v0.0.5 follow-up cluster). The published npm version is v0.0.6 because 4-segment versions like0.0.5.1aren't strict SemVer and would be rejected by the registry. - Three of four runs hit the 600s agent timeout while implementing the cluster. The fourth fix (
--max-agent-timeout-ms) is now in for the next run. Net effect: the v0.0.7 work will not hit this — the configurable knob exists. - Lockstep bump even for unchanged packages. spec-review/context/twin didn't change in v0.0.6 but bumped to 0.0.6 anyway. Matches the v0.0.5 publish-coordination pattern; keeps the scaffold's
^0.0.6deps uniformly resolvable.
v0.0.5 — npm publish + behavior-prior prefix + doc hygiene
Theme: easier to adopt, smarter to use. Every @wifo/factory-* package is now on the public npm registry. factory init scaffolds work outside this monorepo for the first time. The implementer agent gets a stable behavior-prior prompt prefix so prompt caching hits consistently across iterations.
This release was built by the factory itself — factory-runtime ran against three v0.0.5 specs (factory-runtime-v0-0-5, factory-docs-v0-0-5, factory-publish-v0-0-5) with claude -p doing the implementation. Provenance is on disk under .factory-v0-0-5/ for the specs that completed runs.
Added
- npm publish for every package. All six
@wifo/factory-*packages (core, context, harness, runtime, spec-review, twin) now ship to npm under v0.0.5 withpublishConfig.access: public, full repository/homepage/bugs/keywords/author/license metadata, and per-packageLICENSEfiles. - Top-level
pnpm releasescript. Gates on typecheck → test → biome check → build →pnpm publish -r --access public. Manual release-gate (not a CI workflow yet). # Implementation guidelinesprompt prefix inimplementPhase. Stable module-level constantIMPLEMENTATION_GUIDELINESemitted between the opening prose and# Specon every implement spawn. Four behavior priors: state assumptions, minimum code, surgical changes, verifiable success criteria. ≤ 2 KB / ~500 tokens; byte-stable across iterations soclaude -p's ephemeral cache hits the same key every iteration.- PostToolUse hook recipe in
packages/core/README.md— opt-in~/.claude/settings.jsonblock that runsfactory spec lint+factory spec reviewon every Write/Edit todocs/specs/*.md. - Cross-package review pointers.
packages/harness/README.mdandpackages/runtime/README.mdnow reference@wifo/factory-spec-reviewso the reviewer is discoverable from anywhere in the monorepo. packages/core/src/publish-meta.test.ts(5 new tests). Asserts per-package metadata, the init-templates dep version (^0.0.5), the caveat sweep across READMEs, and the release-script gating.
Changed
docs/SPEC_TEMPLATE.mdrewritten to match the v0.0.3+ parallel-tree filename convention (docs/specs/<id>.md↔docs/technical-plans/<id>.md). Added a "Validating the spec" section listing bothfactory spec lintandfactory spec review. The pre-v0.0.3 single-tree<id>.technical-plan.mdconvention is gone.packages/core/src/init-templates.tsPACKAGE_JSON_TEMPLATE.dependenciesbumped^0.0.4→^0.0.5. ScaffoldREADME_TEMPLATEno longer carries the v0.0.4 "monorepo-only" caveat.
Removed
- The v0.0.4 "monorepo-only" caveat is swept from every README + scaffold template (top-level README,
packages/core/README.md,packages/spec-review/README.md,examples/{slugify,gh-stars,parse-size}/README.md,init-templates.tsREADME_TEMPLATE). v0.0.5 is the first release wherefactory init-generated scaffolds resolve their@wifo/factory-*deps from public npm. - BACKLOG entry for "implementPhase: behavior-prior prompt prefix" — shipped in this release.
Public API surface
Unchanged across every package. v0.0.5 is metadata + prompt content only — zero new exports, zero rename or removal of existing exports.
| Package | Exports |
|---|---|
@wifo/factory-core |
27 |
@wifo/factory-context |
18 |
@wifo/factory-harness |
~16 |
@wifo/factory-runtime |
19 |
@wifo/factory-spec-review |
10 |
@wifo/factory-twin |
~7 |
IMPLEMENTATION_GUIDELINES lives in packages/runtime/src/phases/implement.ts but is intentionally NOT re-exported from src/index.ts.
Reconciliations worth knowing
- Coordinated versioning across all six packages. Even packages that didn't change in v0.0.4 (
harnesswas at0.0.0,twinat0.0.1) jumped to0.0.5. Required so the scaffold's^0.0.5deps resolve uniformly. Per-package version drift is deferred until there's an operational need. pnpm publish -ris manually triggered. v0.0.5 ships the release script and the dry-run-clean tarballs; the actualnpm publishis maintainer-driven, not a CI workflow.- Per-package
LICENSEfiles are copies, not symlinks. Each package gets its own copy sonpm packreliably includes it in every tarball. The rootLICENSEis still the source of truth. - The reviewer's exit-1 condition stays dormant in v0.0.5 — all 5 v0.0.4 judges still default to
severity: 'warning'. Promotion is per-judge, post-calibration, in v0.0.5+ point releases.
Notes
This release was the first moneyball run — building v0.0.5 by running v0.0.4's factory-runtime against the three v0.0.5 specs. Three real lessons surfaced and are queued in BACKLOG:
- The harness parses backtick-quoted test paths literally (recurring spec-authoring pitfall).
SPEC_TEMPLATE.mdshould warn against the same.- The 600s per-phase agent timeout is too tight for very-broad specs (the publish spec hit it on iteration 2).