Development record
The repo-conformance lint runs in no gate while the record says it gates CI, and it is not currently gate-ready, which are two problems needing separate decisions. Verified 2026-08-23 on origin/main. brief/04-surfaces/README.md row 16 describes /abcd:lint as checking the three-tier layout, AGENTS.md router, durable decisions, docs currency, privacy hygiene and identity positioning, and states it 'backs prepare-this-repo and gates CI (itd-85)'. It does not gate CI. The Makefile's preflight target is lint-reviews record-lint docs-lint plus build, vet, test and race, with no abcd lint, and the Makefile has no abcd lint or repolint target at all. Searching .github/workflows for an invocation of the repo-conformance lint, excluding the unrelated 'abcd docs lint', returns nothing in ci.yml or release.yml, whose only lint steps are go run ./cmd/record-lint and go run ./cmd/abcd docs lint. The surface runs only when a human types it. The second problem is why simply wiring it up does not work. On current main the lint emits 19 privacy-hygiene findings, 17 at blocker severity, and the sampled ones are not leaks. Nine of the 19 are in the scanner's own source or in ledger entries about the scanner, where the patterns appear as subject matter. Three sampled outside that set are documentation examples: a Linuxbrew prefix in a spec table and again in [dcn-2608200000000006](../../decisions/dcn-2608200000000006-homebrew-distribution-recorded-and.md), and a CHANGELOG entry recording that certain path shapes stopped being read as usernames. So gating it today would fail every build on content that is correct. iss-305, resolved, records the mechanism -- hasAbsHomePath lacks the leading-boundary predicate its scanner twin has -- and iss-307, iss-308 and iss-324 are adjacent boundary defects in the same family. A waiver marker exists, abcd-lint:allow with the legacy spelling abcd-audit:allow, and the rule's own source uses it on two lines, so the mechanism is available but is not applied across the corpus. What makes this worth deciding rather than filing and forgetting: the rule is right about the case that actually bit. An absolute home path written into a ledger issue body is exactly what its pattern catches, and on 2026-08-23 two sessions independently wrote one. Neither was caught by an instrument. record-lint did not see them because its roots are ['.abcd/development'] and the ledger is in .abcd/work; the lint that would have seen them does not run. Note the two are not interchangeable, since record-lint is scoped to the durable record while privacy-hygiene scans every tracked file, so widening record-lint's roots is a different fix from running the lint. Decide in order: whether the record's gates-CI claim is corrected or made true, and if made true, whether the false-positive rate is addressed by waivers, by the iss-305 boundary fix, or by narrowing what blocks. Leaving the claim standing while the surface runs nowhere is the shape enforcement-claims-are-facts names, and iss-2608230847432286 records the class.
The repo-conformance lint runs in no gate while the record says it gates CI, and it is not currently gate-ready, which are two problems needing separate decisions. Verified 2026-08-23 on origin/main. brief/04-surfaces/README.md row 16 describes /abcd:lint as checking the three-tier layout, AGENTS.md router, durable decisions, docs currency, privacy hygiene and identity positioning, and states it 'backs prepare-this-repo and gates CI (itd-85)'. It does not gate CI. The Makefile's preflight target is lint-reviews record-lint docs-lint plus build, vet, test and race, with no abcd lint, and the Makefile has no abcd lint or repolint target at all. Searching .github/workflows for an invocation of the repo-conformance lint, excluding the unrelated 'abcd docs lint', returns nothing in ci.yml or release.yml, whose only lint steps are go run ./cmd/record-lint and go run ./cmd/abcd docs lint. The surface runs only when a human types it. The second problem is why simply wiring it up does not work. On current main the lint emits 19 privacy-hygiene findings, 17 at blocker severity, and the sampled ones are not leaks. Nine of the 19 are in the scanner's own source or in ledger entries about the scanner, where the patterns appear as subject matter. Three sampled outside that set are documentation examples: a Linuxbrew prefix in a spec table and again in dcn-2608200000000006, and a CHANGELOG entry recording that certain path shapes stopped being read as usernames. So gating it today would fail every build on content that is correct. iss-305, resolved, records the mechanism -- hasAbsHomePath lacks the leading-boundary predicate its scanner twin has -- and iss-307, iss-308 and iss-324 are adjacent boundary defects in the same family. A waiver marker exists, abcd-lint:allow with the legacy spelling abcd-audit:allow, and the rule's own source uses it on two lines, so the mechanism is available but is not applied across the corpus. What makes this worth deciding rather than filing and forgetting: the rule is right about the case that actually bit. An absolute home path written into a ledger issue body is exactly what its pattern catches, and on 2026-08-23 two sessions independently wrote one. Neither was caught by an instrument. record-lint did not see them because its roots are ['.abcd/development'] and the ledger is in .abcd/work; the lint that would have seen them does not run. Note the two are not interchangeable, since record-lint is scoped to the durable record while privacy-hygiene scans every tracked file, so widening record-lint's roots is a different fix from running the lint. Decide in order: whether the record's gates-CI claim is corrected or made true, and if made true, whether the false-positive rate is addressed by waivers, by the iss-305 boundary fix, or by narrowing what blocks. Leaving the claim standing while the surface runs nowhere is the shape enforcement-claims-are-facts names, and iss-2608230847432286 records the class.
Deferral 2026-09-30
Deferred past v0.11.1: research at .abcd/development/research/notes/2026-09-30-merge-blocking-lint-subset-sota.md; ruling owed: M10's confirmation, the product thinker confirming, amending or refusing the facilitator's proposed blocking subset (home-folder paths and token shapes in privacy-hygiene, the two three-tier-layout leak checks, a missing AGENTS.md)
Evidence 2026-09-29 (autonomous run A, lane privacyLint), reproduced at baf6f8443: bare abcd lint exits non-zero with 88 privacy-hygiene errors and 14 warnings, while make preflight runs only the scoped lint docs and lint site verbs, record-lint and intent audit --issue-drift, and the CI workflow runs the same scoped verbs, so no gate reads the repo-conformance rules. iss-2609290845269642 classifies the 102 findings and clears the errors; the blocking subset remains the product thinker's ruling.
Frontmatter
| id | iss-2608231000561060 |
|---|---|
| type | issue |
| lifecycle | open |
| severity | major |
.abcd/work/issues/open/iss-2608231000561060-the-repo-conformance-lint-runs-in-no.md
open on GitHub ↗ · commit history ↗
mentions11
- dcn-26082000000000062026-08-20 — Homebrew distribution recorded and parked. Viable now that the
- dcn-26092300000000052026-09-23 — `abcd lint` becomes a merge-blocking gate on a narrow, high-precision subset of its findings, and every other finding stays advisory in the same run (product thinker, ruling on iss-2608231000561060; the example given is a real personal home-folder path). The facilitator proposes the blocking set, judged against the current privacy-hygiene errors, and the product thinker confirms it. Until the gate runs, the record's claim that the lint gates CI is not a fact.
- iss-305abcd lint privacy-hygiene hard-fails on ordinary committed content because hasAbsHomePath lacks the leading-boundary predicate its scanner twin has
- iss-307scanner network ipv4Re and macRe rely on a trailing ASCII word boundary, silently missing a hard_fail address whose only sin is an adjacent word char
- iss-308repolint absPathRe Windows arm is case-sensitive so a lowercase c-users path escapes the privacy rule
- iss-324scanner isPathSegmentByte includes the slash so a third partys home path inside a file URL escapes stage-one redaction
- iss-2608230847432286a gate that validates a proxy for a claim switches off the vigilance an absent gate would have preserved
- iss-2608260944055780Brief self-contradiction on abcd lint's exit grammar: 05-internals/06-lint.md:174 states "Exit code follows the standalone grammar (blocker -> 1, warn -> 2, clean -> 0)", which inverts the two non-zero codes. internal/core/repolint/repolint.go:147 exitCode() returns 2 on any blocker, 1 on warnings only, 0 clean, and its own comment names the Conftest tri-state; 04-surfaces/16-lint.md:41 agrees with the code. Observed: this tree at 19 errors and 3 warnings exits 2. The consequence is worse than count drift, because an exit code is a number a CI job branches on: a job written against 06-lint.md would treat 1 as its failure condition and pass green on a tree full of blockers, a gate that runs and never fires. Same class as iss-142 (the iss-37 phantom-enforcement class) and the same file, different line; iss-181 and iss-251 also sit on this file and cover neither. Brief-tier, so under adr-28 it ships in no release artefact and reaches no installed surface, which is the standing disposition for brief drift and the argument for a lower severity. Refines iss-2608261029074763, which records the wider defect this is one symptom of: 06-lint.md section 3 documents an architecture that was never built, verified as internal/core/lint having no package main so the documented invocation cannot run, --codes-filter, --promote-check, --touched-line and --display-path having zero hits across internal/ and cmd/, no .pre-commit-config.yaml, and IntentLinter, _classify_and_filter, _parse_hunk_lines and _detect_location present in no source file. That record cites this one for the exit grammar rather than restating it. Adjacent and distinct: iss-2608231000561060 covers the gates-CI claim and gate-readiness. Detector: enforcement-claims-are-facts sweep over the brief's exit-code and gating claims. Acceptance corpus: the three lines above.
- iss-2608261029074763brief/05-internals/06-lint.md section 3 documents a lint architecture that does not exist, in flat present tense. Verified 2026-08-26 on main. It describes four CI trigger points for a program invoked as 'internal/core/lint --stdin --display-path <canonical> --json --touched-line <N>'; internal/core/lint is a library package with no package main, so that invocation cannot run at all, and cmd/ holds only abcd, abcd-gen-cli-ref, abcd-gen-surface, record-lint and scaffold-sync. Four flags it specifies are absent from the whole codebase: --codes-filter, --promote-check, --touched-line and --display-path each return zero hits across internal/ and cmd/, and --corpus's only three hits are an unrelated ahoy config key and two guard test fixtures. The shipped verb takes exactly two flags, --root and --json. Trigger point 1 asserts a pre-commit hook configured by .pre-commit-config.yaml with pass_filenames: false; no such file exists. The named orchestrator internals -- _classify_and_filter, _parse_hunk_lines, _lint_terminology_files, IntentLinter, _detect_location -- are Python-shaped and appear in no source file outside the record itself. Note points 3 and 4 of the same section DO hedge correctly ('design target for CI', 'not among ci.yml's jobs today'), which is what makes points 1 and 2 read as shipped rather than planned; the fix is to mark them the same way or delete what was never built, not to build it. The exit-grammar inversion at line 174 of the same file is the same defect surfacing at one line, and is already captured separately and more precisely as iss-2608260944055780, which names repolint.go:147 exitCode() as the authority; that issue is not superseded here, it is the narrow instance of this general one. This is also the same shape as iss-2608231000561060, which records the surfaces README claiming abcd lint gates CI when it gates nothing, and the enforcement-claims-are-facts principle names the class.
- iss-2609290845269642abcd lint's privacy-hygiene rule reports 102 findings on main (88 errors, 14 warnings) in this public repository's committed tree, and nothing gates it. Classified by the privacyLint lane of autonomous run A: 11 are class A, a real value from a real machine: two test files (the ahoy receipt-fold test and the fsutil redact-root fold test) build their fixture paths under the authoring machine's actual home directory, whose account name is a generic one the scanner itself lists as generic. 71 are class B, synthetic values whose shape carries the meaning and that carry no waiver: redactor and detector fixtures that need a non-persona, non-reserved value (a token unique enough that an absence assertion means something, a prefix collision, a traversal escape, a non-reserved address), and records, comments and research observations that illustrate such a case. 3 are class C, synthetic placeholders in comments and one test whose shape carries nothing, so a persona home serves equally. 17 are class D, not personal identifiers at all: public cloud metadata endpoints the URL guard must name, the Homebrew-on-Linux system prefix, the CI runner's system home, RFC section numbers read as IPv4, a hex fragment read as IPv6, and Go selectors read as LAN hostnames. Git history keeps every class-A value; rewriting published history is a decision for the person, not a lane. The missing gate is iss-2608231000561060.
- itd-85A Read-Only Repo-Conformance Audit