Files
Edward Cheng-I Wu 6c17c496b4 security: de-identify private-project context + add public-repo boundary lint (#99)
ARS is a public repo. Some spec docs co-occurred named institutions with
named publishers in ways that link generic content back to specific
private maintainer sessions, e.g. "HEEACT Springer chapter session"
references in v3.6.8 and v3.7.3 specs. While each individual keyword
(HEEACT as Taiwan QA institution; Springer as publisher) is legitimate
in generic educational content, their co-occurrence in spec
storytelling identifies a specific private project that should not be
exposed in a public repo.

Two changes:

1. De-identify private-project context in 7 lines across 5 files:

   - docs/design/2026-04-30-ars-v3.6.8-trust-provenance-...spec.md
     (lines 55, 424, 533, 594, 616-617): replace
     "HEEACT Springer chapter authoring session" /
     "HEEACT chapter session" with "production session" framing;
     redact internal file paths (B_heeact_documents/, etc.) into
     abstract descriptions.
   - docs/design/2026-05-12-ars-v3.7.3-...spec.md (line 30):
     drop the "HEEACT Springer chapter session" phrasing — the
     v3.6.8 §1 cross-reference alone is sufficient citation.
   - docs/design/2026-04-20-v3.4-prisma-trAIce-...design.md (line
     572): replace named private-project repo ref with "downstream
     private-project" descriptor.
   - shared/templates/codex_audit_multifile_template.md (line 54):
     replace "HEEACT chapter session" with "production session".
   - examples/compliance/fixture_sr_full_compliant.yaml (line 64):
     replace named IRB issuer with "Institutional IRB" generic.

2. Add scripts/check_public_repo_boundary.py + 14-test mutation
   suite + CI workflow steps to mechanically block future
   re-introduction. The lint flags BOUNDARY-VIOLATING contexts
   (co-occurrence patterns, internal repo names, internal file
   paths) rather than the keywords themselves. Allowlist exempts:
   maintainer attribution line in CONTRIBUTING.md, procedure
   blocks that TEACH the boundary rule itself (e.g. v3.6.2 spec
   line 758 "no hei-platform content, no personal data" checklist).

Retrospective rationale (this commit's why):

The 2026-05-12 v3.7.3 ship re-used the v3.6.8 phrase
"HEEACT Springer chapter session" in a fresh spec doc on the
incorrect reasoning that "v3.6.8 already public ⇒ phrase is now
licensed". The 10 codex review rounds did not catch this because
codex /review prompt scoped to technical correctness, not
public-repo PII boundary. Existing memory-only rules
(feedback_ars_public_repo_boundary.md) failed to fire because
the author bypassed the grep step they prescribed. This commit
moves the defense from memory rules (human-triggered) to CI lint
(mechanically-triggered) so the failure mode cannot recur silently.

Memory file feedback_ars_public_repo_boundary.md updated
separately with the "already public ≠ license to repeat" rule
and the "grep hit → de-identify default, not 'baseline already
has it' license" judgment criterion.

Regression status: 981 tests pass / 3 skipped / 0 failed
(+14 new boundary lint tests). v3.6.7 + v3.6.8 + v3.7.1 +
v3.7.2 + v3.7.3 lints all PASS unmodified. No agent prompt
changes (the de-identification is purely descriptive prose
in spec docs and fixture data).

Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-12 19:10:17 +08:00
..