test-conformance's macos-latest leg (Phase 2, #4591) has been running the same 546-file, Windows-oriented conformance-tier list as windows-latest -- built from signals like windows-shell-token/windows-env-var that have nothing to do with macOS. Issue #4593 asked for macOS coverage sized to its own evidence-backed surface (zsh dispatch, case-sensitivity, darwin- specific behavior) instead. Issue #4593 was filed before Phase 5 (#4603) existed and referenced updating test-full's macOS legs -- that job is gone. Corrected the issue's body before any code was touched: the "shrink from full replay" half of the original ask was already done by Phase 5; what remained was narrowing the still-Windows-oriented tier macOS was inheriting. Two design assumptions were measured and rejected before accepting a design (documented in docs/adr/4593-macos-conformance-tier-architecture.md): - Reusing the general tier's signals minus its 3 Windows-specific categories barely narrows anything (546 -> 424, 78% retained) -- most files match multiple signals and only need one to survive exclusion. - A standalone CRLF/autocrlf signal, despite the issue naming "CRLF-checkout behavior": even narrowed to /\bCRLF\b|autocrlf/i it hit 143/930 files. Root cause: CRLF is primarily a Windows checkout concern in this codebase (ADR-1703 files it under DEFECT.WINDOWS-TEST- PORTABILITY), so the signal was really re-selecting Windows-relevant files already covered by the general tier, not narrowing macOS specifically. Built 5 new, genuinely macOS-specific signals instead: darwin-literal (darwin alone, not the general tier's win32-OR-darwin), zsh-dispatch, case-sensitivity, plus chmod-mode-bit and symlink-keyword reused verbatim from the general tier (genuinely Unix-relevant, not Windows-motivated). Measured against the real tree: 196 of 930 eligible unit-suite files (21%), versus the general tier's 546 (59%) -- a real, evidence-backed narrowing. scripts/gen-platform-conformance-tier.cjs gains classifyMacosContent/ classifyMacosTree/renderMacosGeneratedFile and a --target windows (default, unchanged)/--target macos CLI flag, so the same generator produces two independent, gated outputs rather than needing a second script. New committed output: scripts/lib/macos-conformance-tier. generated.cjs. .github/workflows/test.yml's test-conformance job: only the macos-latest leg's file-list source changes; windows-latest is byte-for-byte untouched. New shipped-file ripples handled proactively (19 install-tree fixtures regenerated, bin/install.js registered). An isolated code-review pass found one real defect: the ADR's per- category count table had drifted by 1 (zsh-dispatch, case-sensitivity) because the new test file's own fixture strings joined the tree it classifies after the table was authored -- fixed, with the union total (196, what CI actually gates on) confirmed unaffected. An isolated security-review pass found no qualifying findings. The ADR also records an explicit requirement for any future widening proposal: check whether the motivating regression is already covered by Phase 1's no-rendered-text-length-assert lint rule (#4590) before re-proposing full macOS/Linux parity, since that is exactly what #4421's root cause was (a rendered-text-length assertion, not a real behavioral divergence). Co-authored-by: sim <sim@local> Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -58,9 +58,19 @@
|
||||
* node scripts/gen-platform-conformance-tier.cjs # print summary to stdout
|
||||
* node scripts/gen-platform-conformance-tier.cjs --write # write the generated file
|
||||
* node scripts/gen-platform-conformance-tier.cjs --check # exit 1 if the committed file is stale
|
||||
* node scripts/gen-platform-conformance-tier.cjs --target macos ... # same three modes, macOS-specific list (#4593)
|
||||
* node scripts/gen-platform-conformance-tier.cjs --tests-dir <path> # override the tests/ root (tests only)
|
||||
* node scripts/gen-platform-conformance-tier.cjs --out <path> # override the generated-file path (tests only)
|
||||
*
|
||||
* `--target` selects which of the two independent generated outputs this
|
||||
* invocation targets: `windows` (default, the original #4591 behavior —
|
||||
* omitting the flag is unchanged) or `macos` (#4593's narrower, macOS-
|
||||
* specific list). Both write into the SAME committed-file conventions
|
||||
* (`scripts/lib/platform-conformance-tier.generated.cjs` /
|
||||
* `scripts/lib/macos-conformance-tier.generated.cjs`), so `package.json`'s
|
||||
* `lint:generated-sync`/`regen:derived` chains invoke this script twice, once
|
||||
* per target, rather than needing a second script file.
|
||||
*
|
||||
* `--tests-dir`/`--out` (or the TESTS_DIR/OUT_PATH env vars, flag takes
|
||||
* precedence) exist solely so tests/platform-conformance-tier.test.cjs can
|
||||
* point the CLI at a small temp fixture tree instead of this repo's real,
|
||||
@@ -77,10 +87,17 @@ const { suiteOf } = require('./lib/suite-detection.cjs');
|
||||
const ROOT = path.resolve(__dirname, '..');
|
||||
const DEFAULT_TESTS_DIR = path.join(ROOT, 'tests');
|
||||
const DEFAULT_OUT_PATH = path.join(ROOT, 'scripts', 'lib', 'platform-conformance-tier.generated.cjs');
|
||||
const DEFAULT_MACOS_OUT_PATH = path.join(ROOT, 'scripts', 'lib', 'macos-conformance-tier.generated.cjs');
|
||||
|
||||
const GENERATED_HEADER =
|
||||
'// GENERATED FILE — do not hand-edit. Run `node scripts/gen-platform-conformance-tier.cjs --write` to regenerate.\n';
|
||||
|
||||
const MACOS_GENERATED_HEADER =
|
||||
'// GENERATED FILE — do not hand-edit. Run `node scripts/gen-platform-conformance-tier.cjs --target macos --write` to regenerate.\n' +
|
||||
'// macOS-specific conformance tier (#4593), separate from and narrower than the general/\n' +
|
||||
'// Windows-oriented tier in platform-conformance-tier.generated.cjs — see\n' +
|
||||
'// docs/adr/4593-macos-conformance-tier-architecture.md for the full rationale.\n';
|
||||
|
||||
/**
|
||||
* Detection categories (#4591 design doc). Each entry's `test` receives the
|
||||
* raw file content string and returns true when that category's signal is
|
||||
@@ -158,6 +175,31 @@ const CATEGORIES = [
|
||||
// to 28 files, all verified to carry a genuine platform-conditional branch.
|
||||
const NOISY_FOR_SOURCE_REACHABILITY = new Set(['hardcoded-path-vs-path-call', 'symlink-keyword']);
|
||||
|
||||
/**
|
||||
* macOS-specific detection categories (#4593, design doc
|
||||
* .gsd/phase/chore-4593-macos-conformance-tier/40-design.md). Built new,
|
||||
* rather than reusing CATEGORIES above minus its Windows-specific entries,
|
||||
* because that naive exclusion barely narrows anything (measured: 546 -> 424
|
||||
* files, 78%) — most files match multiple general-tier signals simultaneously
|
||||
* and only need ONE surviving signal to stay in. `chmod-mode-bit` and
|
||||
* `symlink-keyword` ARE deliberately duplicated verbatim from CATEGORIES:
|
||||
* both are genuinely Unix-relevant (chmod bits and symlink semantics differ
|
||||
* materially on macOS), not Windows-motivated the way the rest of CATEGORIES
|
||||
* is. A standalone CRLF/`autocrlf` signal was considered and rejected: even
|
||||
* narrowed to `/\bCRLF\b|autocrlf/i` it still hit 143/930 files (15%) — CRLF
|
||||
* is primarily a Windows checkout concern in this codebase (ADR-1703's
|
||||
* `no-crlf-fragile-split` files it under DEFECT.WINDOWS-TEST-PORTABILITY),
|
||||
* so a CRLF signal pulls in Windows-relevant files already covered by the
|
||||
* general tier, not a macOS-narrowing one.
|
||||
*/
|
||||
const MACOS_CATEGORIES = [
|
||||
{ name: 'darwin-literal', test: (content) => /\bdarwin\b/.test(content) },
|
||||
{ name: 'zsh-dispatch', test: (content) => /\bzsh\b/i.test(content) },
|
||||
{ name: 'case-sensitivity', test: (content) => /case.?insensitiv|case.?sensitiv/i.test(content) },
|
||||
{ name: 'chmod-mode-bit', test: (content) => /chmodSync|chmod\(/.test(content) || /0o[0-7]{3,4}\b/.test(content) },
|
||||
{ name: 'symlink-keyword', test: (content) => /\bsymlink/i.test(content) },
|
||||
];
|
||||
|
||||
/**
|
||||
* Pure classifier: given a test file's raw string content, returns which
|
||||
* platform-conformance categories matched and whether the file needs real-OS
|
||||
@@ -175,6 +217,22 @@ function classifyContent(content) {
|
||||
return { needsRealOs: signals.length > 0, signals };
|
||||
}
|
||||
|
||||
/**
|
||||
* Pure classifier, macOS-specific signal set (#4593). Same shape as
|
||||
* classifyContent, against MACOS_CATEGORIES instead of CATEGORIES.
|
||||
*
|
||||
* @param {string} content
|
||||
* @returns {{needsRealOs: boolean, signals: string[]}}
|
||||
*/
|
||||
function classifyMacosContent(content) {
|
||||
const text = typeof content === 'string' ? content : '';
|
||||
const signals = [];
|
||||
for (const category of MACOS_CATEGORIES) {
|
||||
if (category.test(text)) signals.push(category.name);
|
||||
}
|
||||
return { needsRealOs: signals.length > 0, signals };
|
||||
}
|
||||
|
||||
/**
|
||||
* Recursively collect every `*.test.cjs` file beneath `dir`.
|
||||
* @param {string} dir
|
||||
@@ -227,6 +285,29 @@ function classifyTree(testsDir) {
|
||||
return { total: absoluteFiles.length, files: flagged };
|
||||
}
|
||||
|
||||
/**
|
||||
* Same walk/eligibility as classifyTree, classified with the macOS-specific
|
||||
* signal set (#4593).
|
||||
*
|
||||
* @param {string} testsDir
|
||||
* @returns {{ total: number, files: string[] }}
|
||||
*/
|
||||
function classifyMacosTree(testsDir) {
|
||||
const absoluteFiles = walkTestFiles(testsDir);
|
||||
const unitFiles = absoluteFiles.filter((absPath) => suiteOf(absPath) === null);
|
||||
const flagged = [];
|
||||
for (const absPath of unitFiles) {
|
||||
const content = fs.readFileSync(absPath, 'utf8');
|
||||
const { needsRealOs } = classifyMacosContent(content);
|
||||
if (needsRealOs) {
|
||||
const rel = path.relative(testsDir, absPath).replace(/\\/g, '/');
|
||||
flagged.push('tests/' + rel);
|
||||
}
|
||||
}
|
||||
flagged.sort();
|
||||
return { total: absoluteFiles.length, files: flagged };
|
||||
}
|
||||
|
||||
/**
|
||||
* Render the generated `.cjs` module body — one array entry per line for a
|
||||
* readable diff, matching scripts/lib/portability-vocab.cjs's array-literal
|
||||
@@ -248,10 +329,43 @@ function renderGeneratedFile(files) {
|
||||
);
|
||||
}
|
||||
|
||||
/** Resolve the effective tests-dir / out-path from argv/env, flag beats env. */
|
||||
/**
|
||||
* Render scripts/lib/macos-conformance-tier.generated.cjs's module body,
|
||||
* mirroring renderGeneratedFile exactly against the macOS export name.
|
||||
*
|
||||
* @param {string[]} files - already sorted.
|
||||
* @returns {string}
|
||||
*/
|
||||
function renderMacosGeneratedFile(files) {
|
||||
const lines = files.map((f) => ` ${JSON.stringify(f)},`).join('\n');
|
||||
return (
|
||||
MACOS_GENERATED_HEADER +
|
||||
"'use strict';\n\n" +
|
||||
'module.exports = {\n' +
|
||||
' MACOS_CONFORMANCE_TIER_FILES: [\n' +
|
||||
(lines.length > 0 ? lines + '\n' : '') +
|
||||
' ],\n' +
|
||||
'};\n'
|
||||
);
|
||||
}
|
||||
|
||||
/** Resolve the effective target/tests-dir/out-path from argv/env, flag beats env. */
|
||||
function resolveOverrides(argv) {
|
||||
let target = 'windows';
|
||||
for (let i = 0; i < argv.length; i++) {
|
||||
if (argv[i] === '--target') {
|
||||
const value = argv[i + 1];
|
||||
if (value !== 'windows' && value !== 'macos') {
|
||||
throw new ExitError(1, 'gen-platform-conformance-tier: --target requires "windows" or "macos"');
|
||||
}
|
||||
target = value;
|
||||
i++;
|
||||
}
|
||||
}
|
||||
|
||||
const defaultOutPath = target === 'macos' ? DEFAULT_MACOS_OUT_PATH : DEFAULT_OUT_PATH;
|
||||
let testsDir = process.env.TESTS_DIR || DEFAULT_TESTS_DIR;
|
||||
let outPath = process.env.OUT_PATH || DEFAULT_OUT_PATH;
|
||||
let outPath = process.env.OUT_PATH || defaultOutPath;
|
||||
|
||||
for (let i = 0; i < argv.length; i++) {
|
||||
if (argv[i] === '--tests-dir') {
|
||||
@@ -271,19 +385,22 @@ function resolveOverrides(argv) {
|
||||
}
|
||||
}
|
||||
|
||||
return { testsDir: path.resolve(testsDir), outPath: path.resolve(outPath) };
|
||||
return { target, testsDir: path.resolve(testsDir), outPath: path.resolve(outPath) };
|
||||
}
|
||||
|
||||
function main() {
|
||||
const argv = process.argv.slice(2);
|
||||
const { testsDir, outPath } = resolveOverrides(argv);
|
||||
const { target, testsDir, outPath } = resolveOverrides(argv);
|
||||
const mode = argv.includes('--check') ? 'check' : argv.includes('--write') ? 'write' : 'print';
|
||||
|
||||
const { total, files } = classifyTree(testsDir);
|
||||
const isMacos = target === 'macos';
|
||||
const label = isMacos ? 'gen-platform-conformance-tier --target macos' : 'gen-platform-conformance-tier';
|
||||
const exportKey = isMacos ? 'MACOS_CONFORMANCE_TIER_FILES' : 'CONFORMANCE_TIER_FILES';
|
||||
const { total, files } = isMacos ? classifyMacosTree(testsDir) : classifyTree(testsDir);
|
||||
|
||||
if (mode === 'write') {
|
||||
fs.mkdirSync(path.dirname(outPath), { recursive: true });
|
||||
fs.writeFileSync(outPath, renderGeneratedFile(files));
|
||||
fs.writeFileSync(outPath, isMacos ? renderMacosGeneratedFile(files) : renderGeneratedFile(files));
|
||||
process.stdout.write(`Wrote ${outPath} (${files.length} conformance-tier file(s))\n`);
|
||||
return;
|
||||
}
|
||||
@@ -299,14 +416,12 @@ function main() {
|
||||
} catch (err) {
|
||||
throw new ExitError(
|
||||
1,
|
||||
`gen-platform-conformance-tier: could not load ${outPath} — run ` +
|
||||
'`node scripts/gen-platform-conformance-tier.cjs --write` first ' +
|
||||
`${label}: could not load ${outPath} — run ` +
|
||||
`\`node scripts/gen-platform-conformance-tier.cjs${isMacos ? ' --target macos' : ''} --write\` first ` +
|
||||
`(${err && err.message ? err.message : err})`,
|
||||
);
|
||||
}
|
||||
const committedFiles = Array.isArray(committed.CONFORMANCE_TIER_FILES)
|
||||
? committed.CONFORMANCE_TIER_FILES
|
||||
: [];
|
||||
const committedFiles = Array.isArray(committed[exportKey]) ? committed[exportKey] : [];
|
||||
const committedSet = new Set(committedFiles);
|
||||
const liveSet = new Set(files);
|
||||
|
||||
@@ -316,22 +431,20 @@ function main() {
|
||||
if (added.length > 0 || removed.length > 0) {
|
||||
process.stderr.write(
|
||||
`${path.relative(ROOT, outPath).replace(/\\/g, '/')} is stale. Run:\n` +
|
||||
' node scripts/gen-platform-conformance-tier.cjs --write\n\n',
|
||||
` node scripts/gen-platform-conformance-tier.cjs${isMacos ? ' --target macos' : ''} --write\n\n`,
|
||||
);
|
||||
for (const f of added) process.stderr.write(' + ' + f + '\n');
|
||||
for (const f of removed) process.stderr.write(' - ' + f + '\n');
|
||||
throw new ExitError(1);
|
||||
}
|
||||
|
||||
process.stdout.write(
|
||||
`ok gen-platform-conformance-tier: ${files.length} conformance-tier files, list matches\n`,
|
||||
);
|
||||
process.stdout.write(`ok ${label}: ${files.length} conformance-tier files, list matches\n`);
|
||||
return;
|
||||
}
|
||||
|
||||
// No flag: print a classification summary, write nothing.
|
||||
process.stdout.write(
|
||||
`gen-platform-conformance-tier: ${total} file(s) scanned, ` +
|
||||
`${label}: ${total} file(s) scanned, ` +
|
||||
`${files.length} need real OS, ${total - files.length} excluded (Linux-only conformance tier eligible)\n`,
|
||||
);
|
||||
}
|
||||
@@ -341,4 +454,15 @@ if (require.main === module) {
|
||||
runMain(main);
|
||||
}
|
||||
|
||||
module.exports = { classifyContent, CATEGORIES, NOISY_FOR_SOURCE_REACHABILITY, walkTestFiles, classifyTree, renderGeneratedFile };
|
||||
module.exports = {
|
||||
classifyContent,
|
||||
CATEGORIES,
|
||||
NOISY_FOR_SOURCE_REACHABILITY,
|
||||
walkTestFiles,
|
||||
classifyTree,
|
||||
renderGeneratedFile,
|
||||
classifyMacosContent,
|
||||
MACOS_CATEGORIES,
|
||||
classifyMacosTree,
|
||||
renderMacosGeneratedFile,
|
||||
};
|
||||
|
||||
206
scripts/lib/macos-conformance-tier.generated.cjs
Normal file
206
scripts/lib/macos-conformance-tier.generated.cjs
Normal file
@@ -0,0 +1,206 @@
|
||||
// GENERATED FILE — do not hand-edit. Run `node scripts/gen-platform-conformance-tier.cjs --target macos --write` to regenerate.
|
||||
// macOS-specific conformance tier (#4593), separate from and narrower than the general/
|
||||
// Windows-oriented tier in platform-conformance-tier.generated.cjs — see
|
||||
// docs/adr/4593-macos-conformance-tier-architecture.md for the full rationale.
|
||||
'use strict';
|
||||
|
||||
module.exports = {
|
||||
MACOS_CONFORMANCE_TIER_FILES: [
|
||||
"tests/adr-index-gate.test.cjs",
|
||||
"tests/adr-parser.property.test.cjs",
|
||||
"tests/adr-parser.unit.test.cjs",
|
||||
"tests/agent-classification-parity.test.cjs",
|
||||
"tests/agent-install-check.test.cjs",
|
||||
"tests/agent-skills.test.cjs",
|
||||
"tests/api-coverage-gate-e2e.test.cjs",
|
||||
"tests/api-coverage.test.cjs",
|
||||
"tests/ask-user-questions-fallback.test.cjs",
|
||||
"tests/audit-command-cutover.test.cjs",
|
||||
"tests/broken-windows.test.cjs",
|
||||
"tests/capability-cli.test.cjs",
|
||||
"tests/capability-command-dispatch.test.cjs",
|
||||
"tests/capability-consent.test.cjs",
|
||||
"tests/capability-ledger.test.cjs",
|
||||
"tests/capability-lifecycle.test.cjs",
|
||||
"tests/capability-loader.test.cjs",
|
||||
"tests/capability-lock-mkdir-failure-3987.test.cjs",
|
||||
"tests/capability-registry.test.cjs",
|
||||
"tests/capability-source.test.cjs",
|
||||
"tests/capability-state.test.cjs",
|
||||
"tests/capability-trust.test.cjs",
|
||||
"tests/changeset-parse.test.cjs",
|
||||
"tests/check-contract-drift.test.cjs",
|
||||
"tests/check-ui-safety-gate.test.cjs",
|
||||
"tests/check-update-config-dir.test.cjs",
|
||||
"tests/chunked-planning-parallel.test.cjs",
|
||||
"tests/ci-docs-guard-registry.test.cjs",
|
||||
"tests/ci-test-scope.test.cjs",
|
||||
"tests/cline-install.test.cjs",
|
||||
"tests/code-review-pipeline-regression.test.cjs",
|
||||
"tests/codex-config-agents.test.cjs",
|
||||
"tests/codex-config-hooks.test.cjs",
|
||||
"tests/codex-config-install.test.cjs",
|
||||
"tests/codex-config.test.cjs",
|
||||
"tests/commands.test.cjs",
|
||||
"tests/commit-docs-bypass.test.cjs",
|
||||
"tests/commit-files-pathspec.test.cjs",
|
||||
"tests/commonjs-marker.test.cjs",
|
||||
"tests/completion-ratio-scope-withholding.test.cjs",
|
||||
"tests/config-loader.test.cjs",
|
||||
"tests/config-schema.property.test.cjs",
|
||||
"tests/config.test.cjs",
|
||||
"tests/contributor-standards.test.cjs",
|
||||
"tests/core-utils.test.cjs",
|
||||
"tests/cursor-subagent-isolation.test.cjs",
|
||||
"tests/debugger-semantic-recall.test.cjs",
|
||||
"tests/default-flip-documentation-lint.test.cjs",
|
||||
"tests/discuss-phase-power.test.cjs",
|
||||
"tests/docs-parity-live-registry.test.cjs",
|
||||
"tests/effort-surface-axis.test.cjs",
|
||||
"tests/effort-sync-installed-runtime.test.cjs",
|
||||
"tests/emitted-attribution.test.cjs",
|
||||
"tests/ensure-runtime-build.test.cjs",
|
||||
"tests/executed-plan.test.cjs",
|
||||
"tests/executor-mvp-tdd-section.test.cjs",
|
||||
"tests/external-job.test.cjs",
|
||||
"tests/failing-direction.test.cjs",
|
||||
"tests/fallow-runner.test.cjs",
|
||||
"tests/feat-2483-review-claude-mds-guard.test.cjs",
|
||||
"tests/features-index-gate.test.cjs",
|
||||
"tests/frontmatter.unit.test.cjs",
|
||||
"tests/gap-checker.property.test.cjs",
|
||||
"tests/gen-context-index.test.cjs",
|
||||
"tests/gen-section-manifest.test.cjs",
|
||||
"tests/git-base-branch.test.cjs",
|
||||
"tests/graphify-query.test.cjs",
|
||||
"tests/graphify-visualization.test.cjs",
|
||||
"tests/gsd-secret-read-guard.test.cjs",
|
||||
"tests/gsd-settings-advanced.test.cjs",
|
||||
"tests/gsd-statusline.test.cjs",
|
||||
"tests/gsd-tools-path-refs.test.cjs",
|
||||
"tests/gsd-validate-commit-crash-policy.test.cjs",
|
||||
"tests/gsd-write-guard.test.cjs",
|
||||
"tests/health-diagnostic-rules/worktree-health.test.cjs",
|
||||
"tests/health-diagnostic.test.cjs",
|
||||
"tests/helpers-cleanup.test.cjs",
|
||||
"tests/helpers-process-isolation.test.cjs",
|
||||
"tests/hooks-crash-policy.test.cjs",
|
||||
"tests/hooks-opt-in.test.cjs",
|
||||
"tests/host-integration.test.cjs",
|
||||
"tests/init-manager.test.cjs",
|
||||
"tests/init.test.cjs",
|
||||
"tests/install-minimal-hooks.test.cjs",
|
||||
"tests/install-path-detection.test.cjs",
|
||||
"tests/install-regressions.test.cjs",
|
||||
"tests/install-runtime-artifacts.test.cjs",
|
||||
"tests/install-write-confinement.test.cjs",
|
||||
"tests/install.test.cjs",
|
||||
"tests/installer-migration-antigravity-retire-confighome-artifacts.test.cjs",
|
||||
"tests/installer-migration-config-root-marker.test.cjs",
|
||||
"tests/installer-migration-pi-retire-hooks-dir.test.cjs",
|
||||
"tests/installer-migration-prune-stale-pristine.test.cjs",
|
||||
"tests/installer-migration-rename-gsd-core.test.cjs",
|
||||
"tests/installer-migrations.test.cjs",
|
||||
"tests/intel.test.cjs",
|
||||
"tests/inventory-nested-families.test.cjs",
|
||||
"tests/isolation-sentinel.test.cjs",
|
||||
"tests/issue-version-gate.test.cjs",
|
||||
"tests/kimi-upgrades.test.cjs",
|
||||
"tests/lint-docs-command-form.test.cjs",
|
||||
"tests/lint-workflow-shellcheck-fetch.test.cjs",
|
||||
"tests/list-seeds.test.cjs",
|
||||
"tests/markdown-sectionizer.test.cjs",
|
||||
"tests/mcp-catalog.test.cjs",
|
||||
"tests/milestone-archive.test.cjs",
|
||||
"tests/milestone-window-single-owner.test.cjs",
|
||||
"tests/model-catalog.unit.test.cjs",
|
||||
"tests/model-resolver.test.cjs",
|
||||
"tests/no-exact-case-env-access.rule.test.cjs",
|
||||
"tests/no-pending-3212-markers.test.cjs",
|
||||
"tests/no-phantom-issue-refs.test.cjs",
|
||||
"tests/no-posix-mode-bit-assert.rule.test.cjs",
|
||||
"tests/no-private-binary-resolution.rule.test.cjs",
|
||||
"tests/no-unguarded-nonportable-exec.rule.test.cjs",
|
||||
"tests/observability/event.test.cjs",
|
||||
"tests/onboard-command.test.cjs",
|
||||
"tests/opencode-plugin-adapter.test.cjs",
|
||||
"tests/pause-work-context-detection.test.cjs",
|
||||
"tests/pause-work-improvements.test.cjs",
|
||||
"tests/perf-317-context-monitor-fs.test.cjs",
|
||||
"tests/phase-completion-single-owner.test.cjs",
|
||||
"tests/phase-estimation.test.cjs",
|
||||
"tests/phase-id-drift-guard.test.cjs",
|
||||
"tests/phase-id.test.cjs",
|
||||
"tests/phase-locator.test.cjs",
|
||||
"tests/phase.test.cjs",
|
||||
"tests/plan-count-single-owner.test.cjs",
|
||||
"tests/plan-phase-stall-detection.test.cjs",
|
||||
"tests/plan-review-convergence.test.cjs",
|
||||
"tests/planning-inspect.test.cjs",
|
||||
"tests/planning-inspect.unit.test.cjs",
|
||||
"tests/planning-lock-mkdir-failure-1884.test.cjs",
|
||||
"tests/planning-snapshot.test.cjs",
|
||||
"tests/planning-workspace.test.cjs",
|
||||
"tests/platform-conformance-tier.test.cjs",
|
||||
"tests/plugin-manifest.test.cjs",
|
||||
"tests/policy-shell-pinning.test.cjs",
|
||||
"tests/portability-rule-disable-ban.test.cjs",
|
||||
"tests/precommit-alias-drift-hook.test.cjs",
|
||||
"tests/prepush-enterprise-email-hook.test.cjs",
|
||||
"tests/process-seam.test.cjs",
|
||||
"tests/profile-output.test.cjs",
|
||||
"tests/profile-pipeline.test.cjs",
|
||||
"tests/quick-batch.test.cjs",
|
||||
"tests/quick-branching.test.cjs",
|
||||
"tests/quick-research.test.cjs",
|
||||
"tests/reapply-verify-hunks.test.cjs",
|
||||
"tests/refactor-1390-t3-characterization.test.cjs",
|
||||
"tests/require-issue-link-policy.test.cjs",
|
||||
"tests/response-language-coverage.test.cjs",
|
||||
"tests/retired-artifact-cleanup.test.cjs",
|
||||
"tests/review-build-prompt-optional-sections.test.cjs",
|
||||
"tests/review-lane-runner.test.cjs",
|
||||
"tests/review-lane-windows-spawn-resolution.test.cjs",
|
||||
"tests/review-parallel-lanes.test.cjs",
|
||||
"tests/review-plan-coverage-manifest.test.cjs",
|
||||
"tests/review-reviewer-selection.test.cjs",
|
||||
"tests/reviewer-manifest-body.test.cjs",
|
||||
"tests/reviewer-step-dispatch.test.cjs",
|
||||
"tests/roadmap-mode-field.test.cjs",
|
||||
"tests/roadmap-parser.test.cjs",
|
||||
"tests/roadmap-phase-fallback.test.cjs",
|
||||
"tests/roadmap.test.cjs",
|
||||
"tests/runtime-artifact-layout.test.cjs",
|
||||
"tests/runtime-identity.test.cjs",
|
||||
"tests/runtime-launcher-parity.test.cjs",
|
||||
"tests/security.test.cjs",
|
||||
"tests/settings-jsonc.test.cjs",
|
||||
"tests/shared-hooks-dir-resolution.test.cjs",
|
||||
"tests/shell-command-projection-dispatch.test.cjs",
|
||||
"tests/spawn-liveness-banner.test.cjs",
|
||||
"tests/state-document.test.cjs",
|
||||
"tests/state-transition.test.cjs",
|
||||
"tests/state.test.cjs",
|
||||
"tests/todos-workstream-scope.test.cjs",
|
||||
"tests/tracer-bullet.test.cjs",
|
||||
"tests/uat.test.cjs",
|
||||
"tests/ui-safety-gate.test.cjs",
|
||||
"tests/ui-spec-inventory-provenance.test.cjs",
|
||||
"tests/unreachable-guard-drift.test.cjs",
|
||||
"tests/unreachable-shell-guard.test.cjs",
|
||||
"tests/unusable-input.test.cjs",
|
||||
"tests/update-custom-backup.test.cjs",
|
||||
"tests/user-artifact-staging.test.cjs",
|
||||
"tests/verification-overrides.test.cjs",
|
||||
"tests/verification-status.test.cjs",
|
||||
"tests/verify-archive-dirs-live-path.test.cjs",
|
||||
"tests/verify-command-grounding.test.cjs",
|
||||
"tests/verify.test.cjs",
|
||||
"tests/workflow-fragments.test.cjs",
|
||||
"tests/workflow-shell-pinning.test.cjs",
|
||||
"tests/workstream-inventory.test.cjs",
|
||||
"tests/workstream.test.cjs",
|
||||
"tests/worktree-safety.test.cjs",
|
||||
"tests/worktree.test.cjs",
|
||||
],
|
||||
};
|
||||
Reference in New Issue
Block a user