Repository navigation
v2.2.0 — 14/14 steps, working product, root cause fixed
Third build cycle. A zero-context agent generated a blueprint; a second zero-context agent built it with real commands on a no-services stack — so this time there were no environmental excuses.
| Cycle 1 | Cycle 2 | Cycle 3 | |
|---|---|---|---|
| Steps completed | 2/4 | 1/3 | 14/14 |
| Blueprint defects | 18 | 18 | 10 |
| Guesses per step | ~6 | ~6 | 1.7 |
| §20.1 acceptance gate | — | — | PASSED 10/10 |
The product genuinely works. It indexed real markdown notes, searched by tag + date + full text, folded diacritics, did incremental re-indexing, honored its documented exit codes, and installed from a tarball into a clean directory. 84 tests, 0 failed.
The root cause, found by executing
It still returned FALSE on self-containment, because a literal builder stops at step 3. One root cause produced both hard stops and 4 of the 10 defects: the bundle never decided how a plain node scripts/*.ts reaches TypeScript source.
Verified on Node 24 / TypeScript 6.0.3:
| Result | |
|---|---|
.js specifier + node script.ts |
ERR_MODULE_NOT_FOUND |
.ts specifier + tsc, no flags |
TS5097 |
.ts + allowImportingTsExtensions + rewriteRelativeImportExtensions |
exit 0, emits ./lib.js, and the build runs |
knowledge/runtime-tracks/ts-node.md now settles this once, with the four-context table and the exact compiler options, so no blueprint re-opens it.
Five generalizable rules
Each shipped as a writer obligation + validator check — three cycles proved a rule with no enforcer is not prevention.
| Rule | What it cost | |
|---|---|---|
| F | A resolution convention is decided once and reconciled against every loader — app, tests, scripts, build | Both hard stops |
| G | A Verify command must exit 0 when the step is correct | # expect: exit 2 read as a failing gate by every runner |
| H | A check must be possible in the medium it runs in | A runtime check asked to see type-only exports, erased before runtime |
| I | The workspace copy must be safe to re-run | A bare recursive copy reverted the package manifest |
| J | A NOT APPLICABLE section cannot carry a contract | The builder invented 100% of a "byte-exact" format that existed nowhere |
Also
cli-library-mcpno longer hard-requires a container — the pack-and-install path is documented and was executed end to end.- Phase 4 Step 6: a data layer needing no service is a clean pass, not a blocked one. It now also runs the formatter over
workspace/. - Who authors the package manifest is decided, not left to the writer.
SKILL.mdrule 6: the obligation is the live registry check; the delegation is the means. A missing Task tool no longer blocks generation.- Validator Sweep 12 splits honestly — static half to the validator, executable half handed by name to the main thread, which has the shell. A check nobody can perform is worse than no check.
Honest status
The design is right; three cycles of executing it have been steadily removing the places where the executable details contradicted themselves. The remaining gap is narrow and named, and every rule above came from a real failure with a real error message, not from inspection.
Verified: 5/5 CI checks green · plugin manifest validates · 88 classification edges symmetric · 0 version pins outside runtime-tracks/ · every cross-reference resolves.