Skip to content

Lessons ​

What went wrong in this project, and the check that now prevents it. Newest first; added at each retrospective, or as soon as a lesson is clear.

DateWhat happenedNow prevented by
2026-10-13The agent waited for the CI after every story, at least 40 minutes over E01, while the pre-push hook had already run the same checkschecks run locally; one CI, on the pull request into main (ADR-0038)
2026-10-13A package released 36 seconds before the version check turned main reda 7-day cooldown on versions (.ncurc.cjs)
2026-10-13Dependencies were upgraded, a major among them, without reading what changedthe upgrade procedure reads the release notes first (docs/tooling/versions-and-security.md)
2026-10-13The Product Owner's spoken words were quoted throughout a public repositorywriting rules: decisions in neutral words; the doc-editor agent checks
2026-10-13Choosing a rectangle after a converted free shape left its fractional width and empty radius, and every field turned redwhole fields and one radius on choosing a shape; a test of that path
2026-10-13Nobody knew how long a story took nor how many tokens it usedmetrics hooks, npm run metrics, a session report at each turn
2026-10-13Hooks and scripts run by Node.js lost their .ts extensions to the import autofixa node-run lint scope
2026-10-09Validating a feature from a test card read beside the page was slow for the Product Ownera guided test inside the playground: one step at a time, values typed by Next, what to look at; tested end to end
2026-10-09Story branches merged by GitHub auto-merge stayed on the remote; deleting them with git push --delete ran the full pre-push check each timedelete each merged branch right after the merge, through the GitHub API (/run step 9)
2026-10-09A wait loop that only looked for "merged" kept waiting on a failed checkstatuses read, stop at the first failure; since ADR-0038, no CI on work branches
2026-10-09atan2(+0, −0) = π: a zero-length edge after a negative edge gave a half turn instead of none; found by the independent auditor, not by the testszero vectors handled explicitly; signed zeros in the library rules; the auditor reviews every story
2026-10-09The unused-imports autofix removed a type import written before its use; Vitest (types stripped) stayed greentsc before each commit (library rules); check:all before push
2026-10-09A spike (contour turning back) is consumed by its fillet: a behavior no rectangle test could showauditor probes on non-rectangular contours; business question raised (Q16) instead of a silent choice
2026-10-08Story statuses drifted in a feature table (four stories shown draft after being done)backlog.test.ts checks parents' tables
2026-10-08Dates written one day off in docssession-start state; dates read from the environment, never guessed
2026-10-08A mutation tool (StrykerJS) reported 4 % because, with Vitest 5, no test ran against mutantstrial before adoption; tool deferred with its tracking issue (ADR-0022)
2026-10-08A commit refused (unknown scope) let the next commit swallow its filescommit one by one, stop at the first failure; git status before retrying
2026-10-08A guard hook denied text quoting a guarded command inside a heredocthe guard skips here-document bodies (2026-10-13)
2026-10-08A cited reference (Graphics Gems) could not be readderivation from read sources (DERIV-fillet-setback); never cite unread
2026-10-08A stacked pull request was merged into another story branchone branch per story from its feature branch, never stacked
2026-10-08Release pull requests opened with GITHUB_TOKEN triggered no CIrelease-please with a personal token, auto-merge when green
2026-10-08TypeDoc failed in CI on undocumented type members, after a green local checkpre-push runs check:all, including the docs build
2026-10-08Barrel autofix kept export type * once a folder held valuesbarrels.test.ts
2026-10-08A status test silently skipped one indexevery index tested to list its items; mutation-check of file-reading tests
2026-10-07Plausible but invented details (an author name, a "holes counter-clockwise" rule)sources recorded before use; business rules only from the Product Owner
2026-10-07Linters pulled a vulnerable transitive package (braces)npm audit blocking; alternative chosen (@eslint/markdown)
2026-10-07An autofix removed a trailing slash and broke pathspaths built with join(); pitfall in rules