* fix(#4208): add --files-removed so commit --files can record a move without a directory pathspec `cmdCommit`'s `--files` list can stage an addition but never a deletion: the #2014 guard skips a missing explicit entry because the filesystem cannot tell "moved away" from "not written yet". A caller that moves a file therefore had two forms, both wrong — a directory entry records the move but also commits every unrelated file in that directory (a concurrent session's in-flight todo, in the unattended execute-phase sweep), and a file entry leaves the old path's deletion dangling with the todo tracked at both paths. `--files-removed <paths>` is the caller-declared delete intent. Each entry names a file, or a directory whose tracked-but-absent files are the removals; those paths are staged with `git rm --cached` and join the commit pathspec. `--files` keeps its skip-if-missing contract untouched. A file entry still present on disk fails the commit closed with the existing staging-failure rollback; a never-tracked path is a no-op. `--files-removed` alone is a declared scope, not the unscoped .planning/ sweep. The dispatcher previously folded every non-flag token after `--files` into that list, so a second list flag could not exist; each list now runs from its flag to the next `--` token. The execute-phase todo sweep names the moved todos on both sides from CLOSED[@], and cleanup's archive commit moves .planning/phases/ and .planning/quick/ under --files-removed. Fixes #4208 Emitted-Drift-Ack-Growth: cleanup.md — the archive commit moves phases/ and quick/ under --files-removed; the growth is one paragraph stating why those two directories must not be --files entries * chore(#4208): set changeset fragment pr to 4253 * fix(#4208): fit execute-phase.md under the ADR-857 ceiling and re-point the #2415 guard Three CI failures, all consequences of this PR's own change. 1. gsd-core/workflows/execute-phase.md was 93,577 bytes against the ADR-857 Phase 6 margin gate's <= 93,400 (hard ceiling 93,600). The three-line rationale comment plus the four-line array-building block added 318 bytes to a file that had only 141 of headroom on next. Move the rationale to docs/CLI-TOOLS.md -- which this PR already extends with the --files-removed contract, and which is where the ADR-857 gate wants call-site detail to live rather than in the host workflow -- and fold the array build onto one line. 93,577 -> 93,372. 2/3. tests/close-phase-todos-stage-deletion.test.cjs pinned the #2415 guarantee to its old MECHANISM: it regex-matched the literal .planning/todos/{completed,pending}/ directory pathspecs in the commit --files list. This PR deliberately replaced those with named files (a directory entry also committed an unrelated todo a concurrent session dropped in mid-close), so the guard failed on a change it should have accepted. Re-point it at the new mechanism without weakening it: assert the ADDED array reaches --files, the REMOVED array reaches --files-removed, STATE.md is still committed, and -- newly -- that the two arrays are built from $COMPLETED_DIR and $PENDING_DIR respectively. Verified by negative control: deleting --files-removed "${REMOVED[@]}" from the workflow still fails the test, so the #2415 regression remains caught. Note for the merge queue: #4233 also grows execute-phase.md (+114). The two are additive -- different regions, no textual conflict -- so with both landed the file reaches ~93,486, over the 93,400 margin though under the 93,600 hard ceiling. Whichever merges second will need to reclaim ~86 bytes. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0183892Y3fxxirte4WNmBKbv * fix(#4208): reclaim execute-phase.md bytes so the PR is net-neutral under the ADR-857 margin Rebasing onto next surfaced the byte-gate collision flagged earlier on this PR: #4284 grew execute-phase.md by 95 bytes (93,259 -> 93,354), so this PR's +113 landed at 93,467 against the <= 93,400 margin in tests/claude-orchestration.test.cjs. Compact the close_phase_todos step this PR already edits -- drop the PHASE_NUM indirection, fold the normaliser and the match guard, print the closed list with one printf, shorten the step's prose -- without touching the mechanism the #2415 guard pins (ADDED/REMOVED arrays, the plain mv). 93,467 -> 93,349: 5 bytes under the base, so the PR no longer spends any of next's 46 bytes of headroom. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MkU9ueBNHQzCpc3du5rKXm * fix(#4208): classify absent index entries before staging a removal; restore removed entries exactly on rollback Review of #4253 found three Majors with one root cause: the removal side judged presence by fs.lstatSync alone, where the addition side already reads `git ls-files -v` state. Absence from the worktree is not removal: - a submodule gitlink (mode 160000) whose directory was deleted by hand lists like a file and was `rm --cached` with no .gitmodules cleanup; - a skip-worktree path is never materialised by a cone-mode sparse checkout, so a directory entry over a sparse-excluded tree dropped that whole tree from the index; - an assume-unchanged path's worktree state is not something git itself consults; - an intent-to-add entry (`git add -N`) renders as a plain cached entry on the empty blob, yet nothing tracked exists to remove and no rollback can restore the flag. The index listing now carries each entry's `ls-files -v -s` tag, mode and stage. Only a plain cached (H), stage-0, non-gitlink entry is a removal candidate; every other state is left alone under a directory entry (exactly like a present file) and fails closed when named directly, with the state in the error. "Named directly" is decided on RESOLVED paths, not strings -- realpath of the longest existing prefix with the absent tail re-appended: an absolute path, `./x`, `--cwd`, or a symlinked spelling of the tree (macOS `/var` -> `/private/var`, where `process.cwd()` is the real path and the caller's absolute path is not -- CI on this round's first push) all resolve to the same entry, where a string compare against git's cwd-relative output silently took the directory polarity (pre-push review, driven; the symlink case is driven with an aliased fixture directory). The enumeration's domain is what `ls-files -v -s` can emit for an index entry, stated at the classifier. The third Major -- on an unborn HEAD a successful `rm --cached` was never rolled back when a later entry failed -- is fixed differently from the review's suggestion. Pushing the path into stagedPaths would put it on the commit pathspec, which a root commit refuses ("pathspec did not match", driven), and `git reset -- <path>` cannot restore an entry with no HEAD anyway. Instead every index entry this call removes is recorded (mode, blob) before the `rm` and put back with `update-index --cacheinfo` on rollback. That also restores a caller-pre-staged blob at a removed path exactly, where a reset would have silently replaced it with HEAD's version. The rollback is best-effort, as the addition-side reset already was, and the docs say so. Eight tests: gitlink under a directory entry, named directly, and named by absolute path; skip-worktree both forms; intent-to-add both forms; assume-unchanged named; unborn-HEAD partial failure restores the removal; pre-staged blob survives the rollback. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MkU9ueBNHQzCpc3du5rKXm * fix(#4208): drop the empty fenced block left dangling in cleanup.md's commit step Review nit on #4253: inserting the --files-removed rationale between the original bash block and its closing fence left an empty ```bash``` pair before </step>. Harmless at runtime, a formatting artifact of this PR's own diff; removed. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MkU9ueBNHQzCpc3du5rKXm * fix(#4208): a boolean flag inside a commit path list no longer ends the list Review minor on #4253: collectList stopped at the next `--` token, so a positional wedged between a boolean flag and the next list flag (`--files a --amend b --files-removed c`) was claimed by neither list and silently dropped -- a regression in shape against the old slice-to-end parse, which filtered `--` tokens and kept `b`. No current call site interleaves that way, but the gap was real. A list now runs to the next LIST flag (`--files` / `--files-removed`) and skips boolean flags on the way, and a REPEATED list flag merges its runs (`--files a --files b` -> [a, b]) as the slice-to-end parse did -- a first cut stopped at the repeat and dropped `b`, the same silent-drop shape one level over (pre-post comment audit). The only change #4208 makes to parsing is that a second list flag can exist. Tests: STATE.md wedged between --no-verify and --files-removed lands in the commit; both runs of a repeated --files reach it. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MkU9ueBNHQzCpc3du5rKXm * test(#4208): drive the reappearance window with a post-index-change hook Review nit on #4253: the defensive re-check for a file recreated between the absence test and `git rm --cached` -- the concurrent-session race this PR's own changeset names -- had no test. git fires post-index-change the moment `rm --cached` writes the index, so a hook that copies the file back exactly then exercises the window deterministically. The call reports staging_failed / "reappeared on disk", commits nothing, and the rollback restores the removed entry. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01MkU9ueBNHQzCpc3du5rKXm * fix(#4208): restore a staged removal when the call records nothing A `git rm --cached` that succeeds mutates the index whether or not a commit follows. Only the staging-failure rollback put those entries back, so a call that reached `nothing_to_commit` reported no state change while the removal sat staged -- riding along on the caller's next commit. The review named the unborn-HEAD, removal-only shape. Keying on `headExists` would have fixed half of it: the guard also fires with a real HEAD when the removed path is index-only (added, never committed), because `diff HEAD` reads clean with the path absent on both sides. Both shapes now restore, at both `nothing_to_commit` exits. The failure exits are deliberately left alone -- they report a failure rather than no-change, and the addition side leaves its own staged paths there too. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016gyGdweAdAG6nFv9Jx32vj * refactor(#4208): lift declared-removal staging out of the cmdCommit hotspot `cmdCommit` was a critical-risk hotspot before this flag existed, and #4208 had inlined another ~270 lines into it. `stageDeclaredRemovals(cwd, removedDeclared)` now owns the index-state classification, path canonicalisation and entry recording, returning the pathspec entries and the recorded removals its caller merges. Pure motion: no branch, message or probe changed. Only the two accumulators became local names, and `restoreRemovedEntries` stays with the caller because the exits that restore are the caller's. cmdCommit 888 -> 625 lines here; the extracted helper is 277. (Figures corrected after publication: an earlier version of this message said 854 -> 591 and claimed the result was below cmdCommit's pre-#4208 shape. Both were wrong -- the count came from a faulty brace scanner, and `next`'s cmdCommit is 581, so this is above it, not below.) Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016gyGdweAdAG6nFv9Jx32vj * test(#4208): property-test the two-list commit parser RULESET.TESTS.property-based-testing asks a parser for at least one property test asserting a domain invariant; `collectList` had only hand-picked examples, one per shape a review round had already broken. Hoisted it to module scope as `collectListFlagValues` and exported it in the file's existing exported-for-tests convention -- a parser reachable only by spawning the CLI can be tested one example at a time and no faster. Three properties over generated argv: every positional lands in exactly the run open at it whatever the flag order or count; no positional after the first list flag is dropped or double-claimed; and with `--files-removed` absent the parse equals the pre-#4208 slice-to-end parse. Controlled against two mutants -- a run ending at any `--` token, and a repeated list flag that does not merge -- each of which the properties catch. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016gyGdweAdAG6nFv9Jx32vj * test(#4208): pin cleanup.md's archive commit to --files-removed execute-phase.md's rewrite is pinned by the #2415 guard in this file; cleanup.md's equivalent was not, so reverting its routing would have been caught by nothing -- the mechanism's unit tests never read this file and pass either way. Asserts the two archived directories are under --files-removed and NOT under --files (where a directory entry sweeps in a concurrent session's in-flight writes), and that the destinations and STATE.md stay on the additive half. Controlled by restoring the pre-#4208 sweep, which fails it. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016gyGdweAdAG6nFv9Jx32vj * test(#4208): pin that a symlink to a directory is one tracked path Review of #4253 read the `lstatSync(...).isDirectory()` test as a symlink-following defect. Driving it says the opposite: git tracks the link as a single blob (mode 120000) and does not traverse it, so the tracked paths "under" it live at the real directory and were never named by the caller. Following the link would stage those -- the directory sweep #4208 exists to remove -- while the named entry still sat present on disk. Pinned rather than changed, with the premise driven in the test body. Swapping `lstatSync` for `statSync` -- the prescription as written -- fails it. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016gyGdweAdAG6nFv9Jx32vj * chore(#4208): refresh the compact-content baseline for this PR's execute-phase edit The base range added `tests/benchmark-compact-content.test.cjs` and a committed token baseline over the compacted workflows. This PR edits `gsd-core/workflows/execute-phase.md`, so the baseline drifts by +12 tokens on that entry and on the aggregate. Refreshed with `node scripts/benchmark-compact-content.cjs --write`; the diff is those two entries and nothing else. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016gyGdweAdAG6nFv9Jx32vj * fix(#4208): report a removal the call could not put back Round review of this round found the restore itself unchecked: the helper ignored `update-index`'s exit code, so a FAILED restore still reported `nothing_to_commit` -- the same false "no state changed" the restore exists to prevent, surviving one level down on the restore-failure path. It now returns a boolean. The two no-change exits report `staging_failed` naming the paths left staged; the staging-failure rollback still ignores it, deliberately, because it is already reporting a failure and an unwritable index is usually the failure being reported. Driven with a post-index-change hook that makes the git dir unwritable the moment `rm --cached` lands, so the restore cannot take its lock. Reverting both guards fails the test. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016gyGdweAdAG6nFv9Jx32vj * fix(#4208): disclose a removal the rollback could not restore Round review refuted the reasoning behind leaving the rollback path's restore unchecked. The claim was that this exit is already reporting a failure, so the restore's result adds nothing. The counterexample is the ordinary case: the reported failure is usually a DIFFERENT cause -- a contradictory declaration, a reappeared path -- so a caller reading `failures` sees only that cause and learns nothing about the removal still sitting in its index. The rollback now appends a disclosure entry per un-restored removal, naming the path. The reason and `file` still report the failure that caused the rollback; the disclosure is additive. Also moves the restore-failure test's chmod into a `finally`: `t.after` runs AFTER the parent `afterEach`, so a throw before it left the fixture undeletable. Both driven; reverting the disclosure fails the new test. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016gyGdweAdAG6nFv9Jx32vj * fix(#4208): decide index state by observation, never by an exit code The restore added two commits earlier keyed both its record decision and its success verdict on git's exit code. An exit code answers "did the command succeed", never "did the index change" -- execGit collapses a spawn timeout to a non-zero exit, and a killed git can already have written the index. Round review drove four failures from that one assumption, in both directions: - a failed `rm` still contributed an entry, so the rollback disclosed a removal that was never staged (stale index.lock); - a timed-out `rm` whose write DID land contributed none, so a real mutation was neither restored nor disclosed; - a timed-out `update-index` whose write landed reported failure, publishing a "could NOT be restored" disclosure that was false; - and the read-back that replaced it omitted `-z`, so core.quotePath rendered `café.md` as `"caf\303\251.md"` and an exactly-restored entry read as not restored -- the same quoting defect this PR already fixed for `preStaged`. Everything now observes the index. A failed `rm` re-reads `ls-files -z` for the path: gone means this call owns the removal and records it; still there means nothing was staged; a probe that cannot answer becomes its own failure entry rather than an assumption. The restore verifies the same way, comparing the WHOLE entry (mode, blob, stage), because `--cacheinfo` restores all three and a path-only test accepts an entry that came back as something else. The verdict is three-valued -- `restored` / `not-restored` / `unverified` -- and the unverified wording says the restore could not be VERIFIED rather than that it failed. The rm's own failure is pushed ahead of any probe diagnostic so a timed-out removal keeps `timed_out: true` and its own message as the reported cause. Five regression cases, each negative-controlled against the shape it pins. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016gyGdweAdAG6nFv9Jx32vj * fix(#4208): treat a declared removal path as a path, not a pathspec An index path handed back to git is parsed as a PATHSPEC, and the removal side handed several back. Three driven harms, all of them the sweep-in this flag exists to remove, arriving through the operand rather than through a directory entry: - a tracked file literally named `.planning/*.md` made `rm --cached` GLOB: it removed `peer.md` and `stays.md` too, only the declared entry was recorded, so the rollback restored one of three and the other two rode out as staged deletions the result disclosed nowhere; - the same name reached `git commit -- <paths>`, which globbed and committed an undeclared `M peer.md` alongside the declared removal; - and the intent-to-add probe (`diff --cached` over the path) matched a STAGED PEER instead of itself, so an `add -N` entry was misclassified as ordinary content, removed, and restored by `--cacheinfo` -- which cannot restore the intent flag. It came back as a real staged addition. Every operand on this path is now `:(literal)`: the `rm`, both index probes, the intent-to-add probe, the restore read-back, the entry-level `ls-files` / `ls-tree`, and -- for the REMOVAL-derived entries only -- the downstream `ls-files` / dry-run / `diff HEAD` / `commit` pathspec. `--files` entries keep whatever pathspec behaviour they have today; that is not this change's to alter. `:(literal)` still resolves a directory to its descendants (driven), so the directory form is unchanged. Closes what an earlier cut of this commit declared as a residual: a filename beginning with `:` is now removable end to end, because the commit pathspec no longer reinterprets it. Also fixes a MINOR from the same review: cleanup.md's contract test checked the destinations' position relative to `--files-removed` but never that `--files` was present at all, so deleting the flag still passed. Un-literalising the seven sites fails three of the new tests. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016gyGdweAdAG6nFv9Jx32vj * fix(#4208): scope the rollback to the caller's own name space Round review drove a rollback that destroyed the caller's own staged work. Two causes, one of them pre-existing: - `git diff --cached` prints REPO-relative paths whatever the cwd, while `stagedPaths` holds the caller's cwd-relative names. In a project nested inside its repo (`<repo>/sub/.planning/...`) the two name spaces never intersect, so `preStaged` matched NOTHING, every path landed in `toUnstage`, and the reset unstaged a caller-staged deletion and modification that this call had never touched. `--relative` makes the two sets comparable, and is a no-op when the project IS the repo root. This governs the `--files` side too and predates this flag. - the rollback's `reset` was the last place a removal-derived name reached git as a bare pathspec; it takes `asPathspec` like every other site. Driven on a nested fixture; dropping `--relative` fails the new test. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016gyGdweAdAG6nFv9Jx32vj * test(#4208): gate six fixtures that Windows cannot construct CI's `test (windows-latest, 24, shard 2/3)` went red on this round. Two primitives the new fixtures rely on do not exist on Windows, both driven on a real Windows host rather than inferred: - a filename containing `*` or `:` cannot be created at all (`IOException` / `FileNotFoundException`), which is four of the pathspec fixtures; - `chmod` cannot make a directory unwritable — a write into a ReadOnly directory succeeds — so the two restore-failure fixtures cannot drive the failure they exist to drive. Each is skipped on win32 with its measured reason, in the repo's existing `{ skip: process.platform === 'win32' ? '<reason>' : false }` form. The behaviours they pin are platform-independent; only the fixtures are not. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016gyGdweAdAG6nFv9Jx32vj * test(#4208): build git's index-syntax path with forward slashes The remaining Windows red was mine, not the platform's: `git rev-parse :<path>` takes a forward-slash path, and `path.join` yields backslashes there, so git rejected it as an ambiguous argument. The hook in the same test already used the slash form. Not gated — the behaviour it pins is portable; only the argument was not. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016gyGdweAdAG6nFv9Jx32vj * chore(#4208): refresh the compact-content baseline against the rebased base `next` moved the `new-project` split and the aggregate under this PR's execute-phase entry; regenerated with `scripts/benchmark-compact-content.cjs --write` so the only leaves differing from the base's copy are the execute-phase split and the aggregate it feeds. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FUcGM4FWeZV4cqvR7QBtJh * chore(#4208): regenerate the macOS conformance tier for this PR's fixtures `next` gained the macOS-specific conformance tier (#4593) after this branch was cut. Its classifier (`scripts/gen-platform-conformance-tier.cjs --target macos`) now selects `tests/commit-files-deletion.test.cjs` on the `chmod-mode-bit` and `symlink-keyword` signals the PR's fixtures carry (the chmod-driven failed-restore cases and the symlink-to-directory case). Regenerated with `--target macos --write`; the platform tier was already in sync. The file was modified, not added, which is why the added-files check did not surface it. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FUcGM4FWeZV4cqvR7QBtJh --------- Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com> Co-authored-by: CI Rebase Check <ci@gsd-redux> Co-authored-by: Tom Boucher <trekkie@nomorestars.com>
208 lines
8.4 KiB
JavaScript
208 lines
8.4 KiB
JavaScript
// 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-deletion.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",
|
|
],
|
|
};
|