@@ -22,42 +22,39 @@ Bun-native TypeScript with no separate server compile step.
2222 changing shared subsystems.
2323- ` scripts/ ` — release and maintenance tooling; ` scripts/release.ts ` is the
2424 release authority.
25- - ` devlog/ ` — maintainer-only planning and investigation notes. This is a
26- ** private submodule** (` lidge-jun/opencodex-internal ` ), not a directory of
27- this repository. See "The ` devlog ` submodule" below.
25+ - ` devlog/ ` — planning and investigation notes, tracked in this repository. See
26+ "The ` devlog ` directory" below for what may and may not go there.
2827
2928Read the nearest nested ` AGENTS.md ` before changing files in a scoped
3029directory (` src/ ` , ` gui/ ` , ` docs-site/ ` , ` scripts/ ` , ` .github/ ` ).
3130
32- ## The ` devlog ` submodule
33-
34- Planning notes, triage matrices, and investigation artifacts live in the private
35- ` lidge-jun/opencodex-internal ` repository, wired in as the ` devlog ` submodule.
36- They quote live infrastructure state, provider behaviour, unfixed defects, and
37- internal triage reasoning, so a public clone should carry the runtime and its
38- docs and nothing else.
39-
40- The pointer is deliberately ** loose** , so a missing or stale ` devlog ` can never
41- fail a check:
42-
43- - ` .gitmodules ` declares ` ignore = dirty ` , ` update = none ` , and ` shallow = true ` .
44- A dirty or moved submodule working tree does not show up in ` git status ` on
45- the parent, and ` git submodule update ` will not touch it unless asked
46- explicitly.
47- - No workflow checks it out. ` actions/checkout ` runs without ` submodules: ` , so
48- CI clones the public tree only and the private URL is never resolved.
49- - Nothing in the build, test, typecheck, or privacy-scan path reads from
50- ` devlog/ ` . Contributors without access see an empty directory and every gate
51- still passes.
52- - ` devlog/ ` stays listed in ` .gitignore ` for the working tree; the submodule
53- gitlink is tracked, its contents are not.
54-
55- Two rules keep it that way. Never commit anything under ` devlog/ ` to * this*
56- repository — commit inside the submodule, then update the pointer here as a
57- separate commit. And never nest a git repository inside the submodule: a
58- ` 160000 ` gitlink in a tree that CI does not initialize breaks
59- ` actions/checkout ` for every contributor, which is exactly what happened before
60- this split.
31+ ## The ` devlog ` directory
32+
33+ Planning notes, triage matrices, and investigation artifacts live in ` devlog/ ` ,
34+ tracked like any other documentation. There is no submodule and no private
35+ mirror. It was a private submodule until the pointer churn outgrew its value:
36+ 1723 commits touched the gitlink, and ` dev ` , ` preview ` , and ` main ` each carried a
37+ different pointer, so every branch move and promotion dragged a diff.
38+
39+ - ` devlog/_plan/ ` — units still open, one directory per unit, decade-numbered
40+ docs.
41+ - ` devlog/_fin/ ` — closed units, moved here once a terminal outcome is recorded.
42+ A ` _fin ` unit is a record of work already visible in public git history.
43+ - ` devlog/_chase/ ` — external reference material for parity comparisons.
44+ Reference * clones* are gitignored: they are third-party source carrying their
45+ own licenses and have no business in this repository's history.
46+
47+ Nothing in the build, typecheck, or test path reads from ` devlog/ ` , so a
48+ contributor who ignores it entirely still passes every gate. ` privacy:scan ` does
49+ read it — that is deliberate, and it is what makes a public devlog safe rather
50+ than merely visible.
51+
52+ Two mechanical guards in ` tests/repo-hygiene.test.ts ` back this up: no ` 160000 `
53+ gitlink may be tracked anywhere, and neither the vendored reference clones nor
54+ the security triage excised before publication may reappear in the index. Both
55+ were driven red once to prove they are not vacuous. The gitlink assertion exists
56+ because a gitlink in a tree CI does not initialize breaks ` actions/checkout ` for
57+ every contributor, which happened twice.
6158
6259## Security working notes
6360
@@ -67,9 +64,23 @@ or bypass reasoning, reproduction steps for an unfixed defect, and
6764pre-disclosure patch plans.
6865
6966Use ` .tmp/ ` in the working tree (already gitignored) or a ` mktemp -d ` path.
70- ` devlog/ ` is ** not** an acceptable location, and neither is a private
71- repository: both get cloned across machines and CI, both outlive the embargo,
72- and neither history is practical to purge afterwards.
67+ ` devlog/ ` is ** not** an acceptable location — it is a public directory in a
68+ public repository, so anything committed there is disclosed the moment it is
69+ pushed, and the history is not practical to purge afterwards. A private
70+ repository is not acceptable either: it gets cloned across machines and CI and
71+ outlives the embargo.
72+
73+ ** This binds maintainers exactly as it binds contributors and agents.** The rule
74+ has been violated by maintainer-authored triage before: two units of open
75+ security review accumulated under ` devlog/_plan/ ` and had to be excised before
76+ this directory could be published. Seniority is not an exemption, and "it is
77+ only in the private half" is no longer a thing that exists.
78+
79+ The test to apply before writing a security note into ` devlog/ ` : ** is there
80+ already a public diff that reveals this weakness?** If the fix has shipped, the
81+ writeup discloses nothing new and belongs in ` _fin/ ` . If it has not, the note is
82+ pre-disclosure material and goes to scratch. That distinction is why closed
83+ hardening records stay in the tree while open triage does not.
7384
7485Only the published outcome reaches a repository — the fix itself, its
7586regression test, the release note, the advisory once it is public. Draft the
0 commit comments