Address T2 review asks from Karpathy (request_changes) + Jobs (approve with minor asks) without touching published commits: - scripts/codemod/README.md (new): records remove-appdatabase-passthrough.mjs usage, the completeness proof for METHOD_TO_MODULE (typecheck-clean + 524 tests green at118e3d8= no orphaned call sites), and the sequential revert recipe for C1 (3 -> 2 -> 1, not independent because118e3d8bundled vault simplification). - CONTRIBUTING.md (new): pass-through ban + codemod usage + sequential revert recipe + file-size ceiling + C6 wave cap. Whitelisted in .gitignore alongside the existing doc exceptions. - docs/proposals/C6.2-error-taxonomy-phase2.md: wave 2 scope boundary names renderer-adjacent / api-server / browser / automation / skills explicitly and excludes src/main/database/** + src/main/worker/runtime/** (B2 / M10 high-churn zones). Wave 2 and wave 3 each capped at 30 catch sites so C6 cannot expand without bound. - src/main/agent-runtime/artifact-projector.ts, runtime-bridge.ts: N-scan TODOs now carry a death date ("TODO(M-followup by 2026-05-20)"). If the date passes without decomposition, a follow-up session MUST revisit or justify the exception. Karpathy T2 asks #1 and #2 (split part 3 / "independent revert" language) are addressed in CONTRIBUTING + codemod README as documentation, not history rewrites, because118e3d8is already published. Typecheck clean. No structural code changes; pure docs + comment edits.
3.7 KiB
Contributing
This file documents the rules that are load-bearing for day-to-day work in this repo. If you are using an AI agent, it must follow this file too.
Database access
All database calls go through domain modules:
db.tasks.saveTask(...)
db.agents.getAgent(...)
db.documentsMod.saveDocument(...)
Adding a new pass-through on AppDatabase is not allowed. The
pass-through layer existed historically, was removed in C1 (commits
e352a69 → C1 part 2/3 → ee1734e), and is now guarded by an ESLint
rule that blocks regressions. Route every new call directly through
the owning sub-module.
If the ESLint rule fires on your change:
- Read the sub-module list in
src/main/database/to find the right owner for your method. - Either add the method to that sub-module (if it is new), or change
the call site to use
db.<module>.<method>(...)(if the method already exists there). - Do not silence the rule with an inline disable. If you think the rule is wrong for your case, open an issue — the rule has caught real regressions.
C1 codemod
If a large surface of call sites ever needs to flip shape again (e.g.
a sub-module gets renamed, or a method moves between sub-modules), use
the codemod at scripts/codemod/remove-appdatabase-passthrough.mjs as
a starting point.
Usage:
# Dry run first:
node scripts/codemod/remove-appdatabase-passthrough.mjs --dry-run
# Then apply:
node scripts/codemod/remove-appdatabase-passthrough.mjs
# Scope to specific modules:
node scripts/codemod/remove-appdatabase-passthrough.mjs --modules=tasks,agents
The script's METHOD_TO_MODULE map and completeness evidence are
documented in scripts/codemod/README.md. The codemod stays in the
repo for future similar migrations; removing it would mean the next
person has to re-derive it from scratch.
Reverting C1
C1 landed as three commits, and ee1734e bundled the final pass-through
removal with a vault-binding simplification. This means a clean revert
must be sequential, not independent:
git revert ee1734e # revert 3/3 first (re-adds pass-throughs + vault back)
git revert <C1 part 2/3 sha>
git revert e352a69 # revert 1/3 last
Reverting out of order (e.g. only e352a69) leaves the ESLint guard
still active and the build will fail on the re-introduced pass-throughs.
If you only want to undo the vault changes without re-introducing
pass-throughs, do a hunk-scoped revert:
git revert -n ee1734e
git checkout --patch HEAD -- <vault-files>
git commit
File-size ceiling
Files in src/main/** should stay under 500 LOC where practical. Two
files currently exceed the ceiling and carry TODO markers with a hard
review date (M-followup by 2026-05-20):
src/main/agent-runtime/artifact-projector.ts(637 LOC)src/main/agent-runtime/runtime-bridge.ts(648 LOC)
If 2026-05-20 passes and these have not been decomposed, a follow-up
session MUST revisit them — either decompose, or justify the exception
in writing and update the TODO date.
Error taxonomy (C6)
The error taxonomy migration is waved in docs/proposals/C6.2-error-taxonomy-phase2.md.
Each wave has a hard cap of 30 catch sites — C6 does not expand into an
unbounded sweep. If your change touches a catch block in src/main/
that has no classifyUnknownError call, add one using the existing
module pattern; do not leave bare } catch {} in new code.
Before opening a PR
pnpm typecheckcleanpnpm test:unitgreenpnpm lintclean (this is where the pass-through guard lives)- Keep the diff scoped — do not roll unrelated fixes into a single PR
If you use an agent, confirm it has read this file and AGENTS.md
before letting it commit.