fix(#1749): close epic #1702 audit gaps — drift-guard bin/install.js, ci-test-scope wiring, ADR divergence (#1751)
Post-merge coverage-audit follow-ups to epic #1702 (found by an independent gpt-5.5/high audit + adr-phase-coverage cross-reference). None are CRITICAL — the 9-rule enforcement shipped and works; these close completeness/integrity gaps between ADR-1703's promises and the as-built reality. 1. drift-guard bin/install.js scope (ADR-1703 L114-119): the drift guard covered src/runtime-homes.cts only; the ADR named bin/install.js too. Phase 6's glob expansion made bin/install.js a covered surface. Extended tests/portability-vocab-drift.test.cjs with TWO sound checks: (a) any bin/install.js top-level function that directly returns path.*() must be in PATH_RETURNING_FNS (tight, 0 FP — the body-contains heuristic is unsound here, ~33 FPs); (b) a curated two-way existence lock on the installer path helpers (catches a rename making a vocab entry stale; keeps the curation in sync with PATH_RETURNING_FNS). The residual new-resolver boundary (temp-var shape) is documented. 2. ci-test-scope wiring (the Phase 6 portability selection rule was ineffective): eslint-rules/ was not in the product-code prefix list, so an eslint-rules-only change set code_changed=false and CLEARED the matched tests (reproduced: targeted_tests=[]). Added eslint-rules/ to the prefix list and the P1-P4 RuleTester suites to the selection rule (it previously listed only P5/P6). Verified: code_changed=true, 11 tests selected. 3. ADR-1703 acceptance note amended to record the two further as-built divergences: the disable-ban shipped as an out-of-band test (not the specified local/no-portability-disable meta-rule — the test runs outside ESLint so it cannot be self-disabled, at least as strong); and the drift-guard bin/install.js scope resolution above. Epic #1702 all eight phase boxes now checked. No runtime change; no-changelog (contributor tooling + docs). Closes #1749 Co-authored-by: review-bot <review-bot@gsd>
This commit is contained in:
@@ -238,8 +238,17 @@ const RULES = [
|
||||
tests: [
|
||||
'tests/portability-rule-disable-ban.test.cjs',
|
||||
'tests/portability-vocab-drift.test.cjs',
|
||||
'tests/require-fs-op-fallback.rule.test.cjs',
|
||||
// All nine RuleTester suites (P1–P6) — editing any rule / the shared
|
||||
// vocab+guard helpers / the eslint config re-runs the full rule family.
|
||||
'tests/no-path-literal-in-assert.rule.test.cjs',
|
||||
'tests/no-posix-mode-bit-assert.rule.test.cjs',
|
||||
'tests/no-unguarded-nonportable-exec.rule.test.cjs',
|
||||
'tests/no-crlf-fragile-split.rule.test.cjs',
|
||||
'tests/no-hardcoded-tmp.rule.test.cjs',
|
||||
'tests/no-bare-npm-exec.rule.test.cjs',
|
||||
'tests/require-userprofile-with-home.rule.test.cjs',
|
||||
'tests/normalize-path-in-content.rule.test.cjs',
|
||||
'tests/require-fs-op-fallback.rule.test.cjs',
|
||||
],
|
||||
},
|
||||
];
|
||||
@@ -349,7 +358,7 @@ function classify(files) {
|
||||
// Determine if this file is product/pipeline code.
|
||||
// docs/ and root-level .md files are intentionally excluded.
|
||||
if (
|
||||
['bin/', 'src/', 'gsd-core/', 'agents/', 'commands/', 'hooks/', 'tests/', 'scripts/'].some(p => file.startsWith(p)) ||
|
||||
['bin/', 'src/', 'gsd-core/', 'agents/', 'commands/', 'hooks/', 'tests/', 'scripts/', 'eslint-rules/'].some(p => file.startsWith(p)) ||
|
||||
file === 'package.json' || file === 'package-lock.json' ||
|
||||
(file.startsWith('tsconfig') && file.endsWith('.json')) ||
|
||||
file.startsWith('.github/rulesets/')
|
||||
|
||||
Reference in New Issue
Block a user