test(windows): a native install runs every Claude Code hook through Git Bash - #1774
Conversation
…it Bash
On a native Windows install Claude Code ran none of AI-DLC's hooks: Git
Bash, where Claude Code runs hook commands, could not find a bare `aidlc`,
and every hook printed "aidlc: command not found". The extensionless
launcher fixed that, but nothing in the merge queue ran the path a person's
machine takes.
t-native-install-hooks installs this checkout's release into throwaway
folders, configures a project through the installed `aidlc`, starts a
workflow, runs every hook command and the status line from the project's
settings.json through the shell Claude Code uses (Git Bash on Windows, sh
elsewhere), checks each one ran to completion in the hook phase trace, and
asks doctor through the same shell.
The launcher test's three cases that run the forwarder under a POSIX shell
returned early on Windows: Bun cannot see Git Bash's /bin, so
existsSync("/bin/sh") was false and they passed without running. They now
use Git Bash's sh there, found by the new tests/harness/git-bash.ts.
AIDA findings ledger
Open blocking findings (P0/P1): 0. Accepted and rejected findings never count toward the next action. Maintainer commands (repository write access) — put them on the first lines of a comment, one per line, several ids per line allowed: ledger.json{
"version": 4,
"pullRequest": 1774,
"nextId": 5,
"findings": [
{
"id": "F1",
"priority": "P1",
"category": "contracts",
"title": "Regenerate the coverage registry for the new test",
"anchors": [
{
"kind": "line",
"path": "tests/unit/t-native-install-hooks.test.ts",
"side": "RIGHT",
"sha256": "93e89f009afefa9ed0d40204bbef95ddfad80f95eefc20a12c2b86962890f68f"
}
],
"status": "accepted",
"firstSeen": {
"head": "bef1c839766b0fa2c4bf98763d67768f41d53ffb",
"at": "2026-10-04T05:30:37.719Z"
},
"lastSeen": {
"head": "bef1c839766b0fa2c4bf98763d67768f41d53ffb",
"at": "2026-10-04T05:30:37.719Z"
},
"decision": {
"by": "apackeer",
"at": "2026-10-04T05:52:04.380Z",
"reason": "Not the case here: since the per-unit coverage registry change the file holds unit entries only, and this test covers units other tests already cover, so regenerating changes nothing. bun tests/gen-coverage-registry.ts --check passes on this head, and every PR CI unit shard, which runs the registry ratchet, passed.",
"commentId": 5977078353
}
},
{
"id": "F2",
"priority": "P1",
"category": "contracts",
"title": "Default Windows tests now require Git Bash",
"anchors": [
{
"kind": "line",
"path": "tests/harness/git-bash.ts",
"side": "RIGHT",
"sha256": "c077c62107d72f659e056e3967d56c0c1a7d367bd5f0103e082684871af2c49a"
},
{
"kind": "line",
"path": "tests/unit/t-native-install-hooks.test.ts",
"side": "RIGHT",
"sha256": "514cdfe9ec94b62ea9ad277586768791c62bb2f41d1a6189f4430f1b5bf1cbb8"
},
{
"kind": "line",
"path": "tests/unit/t-windows-gitbash-launcher.test.ts",
"side": "RIGHT",
"sha256": "596dda0635a9a235d4fb036f542e30bf076751be5b104560a85a6baafa7ab4ff"
}
],
"status": "resolved",
"firstSeen": {
"head": "bef1c839766b0fa2c4bf98763d67768f41d53ffb",
"at": "2026-10-04T05:30:37.719Z"
},
"lastSeen": {
"head": "699e4785048143772d209b0365dd81ffbc915ebe",
"at": "2026-10-04T06:11:02.660Z"
}
},
{
"id": "F3",
"priority": "P2",
"category": "correctness",
"title": "An existing aidlc can mask a missing test launcher",
"anchors": [
{
"kind": "line",
"path": "tests/unit/t-native-install-hooks.test.ts",
"side": "RIGHT",
"sha256": "0cbc7db3adceaaffe4782b3a8a56a438c9b52fe33a834d5dbe8b6e2129c819df"
},
{
"kind": "line",
"path": "tests/unit/t-native-install-hooks.test.ts",
"side": "RIGHT",
"sha256": "db207c19718c9f0d50944a326757077d3e138303e729e5ada6ed5c1f1457e497"
}
],
"status": "resolved",
"firstSeen": {
"head": "bef1c839766b0fa2c4bf98763d67768f41d53ffb",
"at": "2026-10-04T05:30:37.719Z"
},
"lastSeen": {
"head": "699e4785048143772d209b0365dd81ffbc915ebe",
"at": "2026-10-04T06:11:02.660Z"
}
},
{
"id": "F4",
"priority": "P3",
"category": "user-experience",
"title": "Expose the Git Bash skip reason",
"anchors": [
{
"kind": "line",
"path": "tests/harness/git-bash.ts",
"side": "RIGHT",
"sha256": "8f57c486d5264c5dbae734cd82f73e732ac22efc9e6ec1fa45e59d0876e04337"
},
{
"kind": "line",
"path": "tests/unit/t-native-install-hooks.test.ts",
"side": "RIGHT",
"sha256": "146854e26f263c3810f02dbe6b3162c512aedcb80ddc453d6e64d0f588d94ac1"
},
{
"kind": "line",
"path": "tests/unit/t-windows-gitbash-launcher.test.ts",
"side": "RIGHT",
"sha256": "02b448ec9ad12197235c19fb527bd54dba23c8526e87971e636d62e6bcf3f566"
}
],
"status": "rejected",
"firstSeen": {
"head": "699e4785048143772d209b0365dd81ffbc915ebe",
"at": "2026-10-04T06:11:02.660Z"
},
"lastSeen": {
"head": "699e4785048143772d209b0365dd81ffbc915ebe",
"at": "2026-10-04T06:11:02.660Z"
},
"decision": {
"by": "apackeer",
"at": "2026-10-04T06:27:39.170Z",
"reason": "Diagnostic polish only: the skip happens only for a contributor on Windows without Git for Windows, Bun already lists those cases as skipped, and in GitHub Actions they never skip. Not worth another review round on a test-only change.",
"commentId": 5977307819
}
}
],
"events": [
{
"at": "2026-10-04T05:30:37.719Z",
"kind": "opened",
"by": "aida",
"id": "F1",
"head": "bef1c839766b0fa2c4bf98763d67768f41d53ffb"
},
{
"at": "2026-10-04T05:30:37.719Z",
"kind": "opened",
"by": "aida",
"id": "F2",
"head": "bef1c839766b0fa2c4bf98763d67768f41d53ffb"
},
{
"at": "2026-10-04T05:30:37.719Z",
"kind": "opened",
"by": "aida",
"id": "F3",
"head": "bef1c839766b0fa2c4bf98763d67768f41d53ffb"
},
{
"at": "2026-10-04T05:52:04.380Z",
"kind": "accepted",
"by": "apackeer",
"id": "F1",
"reason": "Not the case here: since the per-unit coverage registry change the file holds unit entries only, and this test covers units other tests already cover, so regenerating changes nothing. bun tests/gen-coverage-registry.ts --check passes on this head, and every PR CI unit shard, which runs the registry ratchet, passed.",
"commentId": 5977078353
},
{
"at": "2026-10-04T06:11:02.660Z",
"kind": "resolved",
"by": "aida",
"id": "F2",
"head": "699e4785048143772d209b0365dd81ffbc915ebe",
"reason": "declared corrected by the judge; a cited line is gone"
},
{
"at": "2026-10-04T06:11:02.660Z",
"kind": "resolved",
"by": "aida",
"id": "F3",
"head": "699e4785048143772d209b0365dd81ffbc915ebe",
"reason": "declared corrected by the judge; cited files changed since the last review"
},
{
"at": "2026-10-04T06:11:02.660Z",
"kind": "opened",
"by": "aida",
"id": "F4",
"head": "699e4785048143772d209b0365dd81ffbc915ebe"
},
{
"at": "2026-10-04T06:27:39.170Z",
"kind": "rejected",
"by": "apackeer",
"id": "F4",
"reason": "Diagnostic polish only: the skip happens only for a contributor on Windows without Git for Windows, Bun already lists those cases as skipped, and in GitHub Actions they never skip. Not worth another review round on a test-only change.",
"commentId": 5977307819
}
],
"review": {
"head": "699e4785048143772d209b0365dd81ffbc915ebe",
"readiness": 4,
"risk": 2,
"decision": "merge"
}
} |
There was a problem hiding this comment.
Reviewed bef1c839766b0fa2c4bf98763d67768f41d53ffb against f735746aea8c80b21de358c1aa286779a29f68d6 and current repository behavior.
Inspection: 3 changed files. Scope: full head (first review of this pull request).
Final Assessment
Human decision aid only: Readiness 5/5 is best; Risk 1/5 is best. These scores inform the maintainer; the next action below follows finding severity (any open P0/P1 → author/change) and does not approve or merge the PR.
Readiness: 2/5 — The new test deterministically leaves the committed coverage registry stale, so the unit gate will fail. The Windows suite also violates its documented Bun-only prerequisite.
Risk: 3/5 — The change is test-only and reversible, but it affects the default cross-platform suite and can provide false confidence about the launcher regression.
Decision required: Author — make changes before this PR proceeds. The guaranteed stale-registry gate failure and Windows test-substrate compatibility regression require correction.
Validation performed:
- Inspected all three changed files, complete diff, and head snapshots.
- Inspected repository instructions, test contracts, coverage-registry generator, runner, lifecycle implementation, and Windows CI workflows.
- Verified the immutable base and head SHAs and found no ledger entries or maintainer decisions.
- Performed read-only static validation; repository code was not executed.
Findings: 2 blocking, 1 advisory.
Ledger: 3 open, 0 retained blocking, 0 accepted, 0 suppressed as rejected by a maintainer. Maintainers act on findings with /aida commands in the ledger comment.
Contracts & Compatibility
P1 [F1]: Regenerate the coverage registry for the new test
Evidence: tests/unit/t-native-install-hooks.test.ts:1.
Problem: The coverage generator enumerates every `t*.test.ts` and records its `covers:` claims, but the committed `tests/.coverage-registry.json` does not include this new test. The live registry-ratchet unit invokes the generator with `--check`, which will report a freshness diff and fail.
Impact: A Linux unit shard in every PR runs this ratchet, so the proposed head cannot pass the required test gate.
Required correction: Regenerate and commit `tests/.coverage-registry.json`, then verify `bun tests/gen-coverage-registry.ts --check` succeeds.
P1 [F2]: Default Windows tests now require Git Bash
Evidence: tests/harness/git-bash.ts:31, tests/unit/t-native-install-hooks.test.ts:103, tests/unit/t-windows-gitbash-launcher.test.ts:129.
Problem: On Windows, the new native-install setup and three formerly guarded launcher cases resolve Git Bash unconditionally; the helper throws when it is absent. This contradicts the documented deterministic-suite contract that native tests require only Bun and that the native runner itself does not require Bash.
Impact: A supported default Windows test run fails before testing product behavior on machines without Git for Windows, making the documented contributor workflow invalid.
Required correction: Keep missing Git Bash skippable for ordinary local runs while making its presence and execution mandatory in the Windows merge-queue lane, with deterministic coverage evidence there.
Correctness & Reliability
P2 [F3]: An existing aidlc can mask a missing test launcher
Evidence: tests/unit/t-native-install-hooks.test.ts:132, tests/unit/t-native-install-hooks.test.ts:152.
Problem: The temporary bin directory is prepended to the inherited PATH, but the test never verifies which `aidlc` Git Bash resolves. If the tested installation omits its extensionless launcher and the developer already has another `aidlc` later on PATH, configuration, hooks, and doctor can run that unrelated installation and pass.
Impact: The regression test can report success under the exact missing-launcher condition it is intended to detect, weakening protection on common developer machines.
Required correction: Before configuration, resolve the bare `aidlc` through the selected shell and assert that it is the temporary installation's extensionless launcher, or otherwise isolate command lookup without removing required system tools.
User Experience
User experience change: Windows contributors now exercise previously skipped Git Bash launcher behavior, but the default native test run fails when Git Bash is unavailable.
Before: The launcher cases silently returned without running on Windows, while the documented native deterministic suite required only Bun.
After: The cases and new native-install test run through Git Bash unconditionally, throwing when Git for Windows is absent.
Example: Running `bun tests/run-tests.ts` on Windows without Git Bash now fails with the helper's missing-installation error.
Assessment: The added coverage is valuable, but imposing an undocumented prerequisite worsens the supported contributor workflow.
Residual risk: Windows shell execution was not run under the read-only review contract; quoting and path conversion were assessed statically.
Reviewed by AIDA (AI-DLC Developer Agent).
[AI-PR-REVIEWED] bef1c83
…Git Bash The native-install test now checks that the shell resolves `aidlc` to the launcher it just installed: a developer's own AI-DLC install later on PATH would otherwise run in its place and hide a missing launcher. Git for Windows is a prerequisite of the full suite on Windows, not of the native runner, so a local run without it skips the cases that run Git Bash. In GitHub Actions they always run, and fail if Git Bash is missing.
|
/aida accept F1 Not the case here: since the per-unit coverage registry change the file holds unit entries only, and this test covers units other tests already cover, so regenerating changes nothing. bun tests/gen-coverage-registry.ts --check passes on this head, and every PR CI unit shard, which runs the registry ratchet, passed. |
There was a problem hiding this comment.
Reviewed 699e4785048143772d209b0365dd81ffbc915ebe against f735746aea8c80b21de358c1aa286779a29f68d6 and current repository behavior.
Inspection: 3 changed files. Scope: incremental — 3 files with lines changed since the review at bef1c839; the security lenses reviewed the full head. Findings on lines unchanged since that review are deferred, not decisive.
Final Assessment
Human decision aid only: Readiness 5/5 is best; Risk 1/5 is best. These scores inform the maintainer; the next action below follows finding severity (any open P0/P1 → author/change) and does not approve or merge the PR.
Readiness: 4/5 — Both previously open blocking defects are corrected. Only a low-impact diagnostic gap remains in local Windows skip reporting.
Risk: 2/5 — The change is confined to tests and CI coverage, with narrow and reversible impact. Windows shell execution could only be assessed statically.
Decision required: Maintainer — decide whether to merge this PR. The two open ledger defects are resolved, and the sole remaining P3 concerns non-blocking skip diagnostics.
Validation performed:
- Inspected the complete diff, all three changed-file snapshots, incremental review scope, PR metadata and discussion, specialist outputs, and findings ledger.
- Inspected related test-runner skip handling, Windows prerequisites documentation, release fixtures, guard profiles, timeout helpers, sharding contracts, and Windows CI/full-suite workflows.
- Verified the current head makes Git Bash mandatory in GitHub Actions but skips dependent cases on local Windows machines without it.
- Verified the current head asserts that the selected shell resolves aidlc to the temporary installation before exercising hooks.
- Performed read-only static validation; repository code was not executed.
Findings: 0 blocking, 1 advisory.
Ledger: 1 open, 0 retained blocking, 1 accepted, 0 suppressed as rejected by a maintainer, resolved F2, F3 (F2, F3 declared corrected by the judge). Maintainers act on findings with /aida commands in the ledger comment.
User Experience
User experience change: Windows contributors running the test suite now execute the Git Bash launcher and native-install hook coverage when Git Bash is available; local machines without it skip those cases, while CI treats its absence as a failure.
Before: Three launcher cases returned early on Windows and appeared to pass without exercising their assertions; the native-install hook test did not exist.
After: Eight Git-Bash-dependent cases execute when the prerequisite is available and use explicit skip semantics locally when it is absent.
Example: A Windows merge-queue run now installs the release and exercises every Claude Code hook through Git Bash instead of silently bypassing the launcher path.
Assessment: This materially improves regression coverage, though local skips do not expose the computed prerequisite reason or recovery step.
P3 [F4]: Expose the Git Bash skip reason
Evidence: tests/harness/git-bash.ts:48, tests/unit/t-native-install-hooks.test.ts:190, tests/unit/t-windows-gitbash-launcher.test.ts:37.
Problem: On local Windows machines without Git for Windows, the helper computes a specific reason, but both callers reduce it to a boolean skip condition. The native-install file is therefore reported with the runner's generic all-skipped message, while the launcher file can pass with three skipped cases, providing neither the cause nor the recovery step.
Impact: Contributors can miss that eight Windows-specific cases were omitted or mistake the omission for exercised coverage. Impact is low because the prerequisite is documented and CI still requires execution.
Required correction: Include SKIP_REASON in the skipped suite/test names or emit another visible diagnostic that names Git for Windows as the prerequisite and recovery step.
Accepted risks
P1 [F1]: Regenerate the coverage registry for the new test — accepted by @apackeer on 2026-10-04: Not the case here: since the per-unit coverage registry change the file holds unit entries only, and this test covers units other tests already cover, so regenerating changes nothing. bun tests/gen-coverage-registry.ts --check passes on this head, and every PR CI unit shard, which runs the registry ratchet, passed.
Residual risk: Windows-specific shell lookup, quoting, and launcher behavior were not executed under the read-only review contract.
Reviewed by AIDA (AI-DLC Developer Agent).
[AI-PR-REVIEWED] 699e478
Superseded by AI review of 699e478
|
/aida reject F4 Diagnostic polish only: the skip happens only for a contributor on Windows without Git for Windows, Bun already lists those cases as skipped, and in GitHub Actions they never skip. Not worth another review round on a test-only change. |
There was a problem hiding this comment.
Reviewed 699e4785048143772d209b0365dd81ffbc915ebe against f735746aea8c80b21de358c1aa286779a29f68d6 and current repository behavior.
Inspection: 3 changed files. Scope: full head (this head was already reviewed).
Final Assessment
Human decision aid only: Readiness 5/5 is best; Risk 1/5 is best. These scores inform the maintainer; the next action below follows finding severity (any open P0/P1 → author/change) and does not approve or merge the PR.
Readiness: 4/5 — The test coverage is coherent, exercises the intended native installation and shell paths, and no surviving defect was identified. Platform-specific execution remains externally validated rather than reproduced during this read-only review.
Risk: 2/5 — The change affects tests and CI coverage rather than shipped behavior. Its impact is narrow and reversible, with residual uncertainty limited to Windows Git Bash lookup, quoting, and execution behavior.
Decision required: Maintainer — decide whether to merge this PR. No surviving P0 or P1 finding was identified in the reviewed head.
Validation performed:
- Inspected the complete diff and head snapshots for all three changed files.
- Inspected repository instructions, test-runner contracts, Windows CI workflows, release fixtures, hook registrations, dispatcher tracing, and launcher implementation.
- Reviewed PR metadata, discussion, specialist outputs, prior AI reviews, review scope, and findings ledger.
- Confirmed the change remains test-only and both previously identified implementation defects are corrected.
- Performed read-only static checks, including diff validation; repository code was not executed.
Findings: 0 blocking, 0 advisory.
Ledger: 0 open, 0 retained blocking, 1 accepted, 0 suppressed as rejected by a maintainer. Maintainers act on findings with /aida commands in the ledger comment.
No findings.
User Experience
User experience change: Windows contributors and maintainers now receive real execution coverage for native-install hooks and Git Bash launcher behavior instead of apparent passes from unexecuted tests.
Before: Three launcher cases returned without assertions on Windows, and no test installed a release and exercised every Claude Code hook through Git Bash.
After: The launcher cases and native-install journey execute when Git Bash is available; hosted CI fails if it is unavailable, while ordinary local Windows runs skip the dependent cases.
Example: A Windows merge-queue run now installs AI-DLC, resolves the installed launcher, and executes every configured Claude Code hook through Git Bash.
Assessment: This improves regression detection without changing the shipped user workflow or imposing Git Bash on ordinary local native-runner use.
Accepted risks
P1 [F1]: Regenerate the coverage registry for the new test — accepted by @apackeer on 2026-10-04: Not the case here: since the per-unit coverage registry change the file holds unit entries only, and this test covers units other tests already cover, so regenerating changes nothing. bun tests/gen-coverage-registry.ts --check passes on this head, and every PR CI unit shard, which runs the registry ratchet, passed.
Residual risk: Windows-specific shell lookup, quoting, and launcher execution were assessed statically and not run under the read-only review contract.
Reviewed by AIDA (AI-DLC Developer Agent).
[AI-PR-REVIEWED] 699e478
…er-reaches-the-person * origin/main: test(windows): a native install runs every Claude Code hook through Git Bash (#1774) fix(config): a settings change is done while work is open, with its undo (#1719) fix(routing): answer the no-selection routing question's options as the person meant them (#1755) fix(workspace): existing code brings back the Reverse Engineering a composed plan left out (#1756) fix(reverse-engineering): the scan record lists build output as left out, not skimmed (#1762) fix(release): an install of 2.10.0 can update to this release again (#1765) fix(learnings): the ritual's commands name the stage, and their refusals say how to run them (#1748) fix(plugin): let a composed plugin that owns no stage or scope be selected (#1675) fix(kiro): /aidlc --doctor, --version, and --help work on a native Kiro CLI install (#1751) test(runner): a process group that only holds exiting members is still retiring (#1749)
…el-step * origin/main: fix(doctor): a stop the person asked for is not reported as a hook failure (#1769) fix(routing): settings typed with new work over an open question reach the work it becomes (#1761) docs(kiro-ide): what the window title at the end of a Windows command card is, and the setting that stops it (#1780) fix(scope): a scope change at a waiting gate says one line and waits for the next /aidlc (#1763) fix(claude): what session start and each message tell the agent reaches it (#1775) fix(kiro-ide): personas run bun --version without an approval card (#1781) fix(construction): the last Code Generation gate does not ask about a built plan again (#1771) fix(construction): a jump ahead moves only the unit in flight on (#1773) fix(skill): stages the person names are skipped or added at once, on every harness (#1768) fix(codex): no "Under-development features enabled" warning at every Codex start (#1760) fix(status): say what kind of work this is, and only what the person can act on (#1772) fix(checkpoint): a Unit's checkpoint question finds its own session (#1745) fix(install): a copy keeps the team's .gitignore and AGENTS.md (#1757) fix(opencode): the end-of-turn nudge and the /aidlc command text stay out of the person's chat (#1743) fix(lifecycle): a rollback goes to the version the person typed (#1767) test(windows): a native install runs every Claude Code hook through Git Bash (#1774) fix(config): a settings change is done while work is open, with its undo (#1719) fix(routing): answer the no-selection routing question's options as the person meant them (#1755) fix(workspace): existing code brings back the Reverse Engineering a composed plan left out (#1756) fix(reverse-engineering): the scan record lists build output as left out, not skimmed (#1762) # Conflicts: # core/tools/aidlc-init.ts
Summary
On a native Windows install, Claude Code once ran none of AI-DLC's hooks: every hook printed
/usr/bin/bash: line 1: aidlc: command not found, so the workflow ran with no guards, no audit and no stage rules. #1543 fixed it, but nothing in the merge queue ran the path a person's machine takes, and the launcher test meant to cover it on Windows never ran there. This adds a test that installs the release the way a person does and runs every hook through the shell Claude Code uses, and makes the launcher cases really run on Windows.Changes
tests/unit/t-native-install-hooks.test.ts(new): installs this checkout's release into throwaway folders through the real lifecycle (with this checkout's compiled engine in place of the fixture binary), runsaidlc configfor Claude Code through the installedaidlc, starts a workflow, then runs every hook command and the status line from the project'ssettings.jsonthrough the shell Claude Code uses (Git Bash on Windows, sh elsewhere). Each hook must exit 0 and show in the hook phase trace that it ran to completion. Doctor then answers through the same shell with no failing hook row, and on Windows the "Windows launcher (Git Bash)" row passes. It also configures Kiro CLI and sends/aidlc --doctorthrough Kiro CLI's prompt hook, which must answer with the doctor report.tests/harness/git-bash.ts(new): finds Git Bash'sbash.exeandsh.exewhere Git for Windows installs them.tests/unit/t-windows-gitbash-launcher.test.ts: three cases returned early whenexistsSync("/bin/sh")was false. Bun on Windows reads/bin/shasC:\bin\sh, which does not exist, so since fix: install extensionless bin/aidlc forwarder for Windows Git Bash #1543 they have passed on Windows without running: in merge group 37171086161 (Windows unit-9) they took 0.12, 0.05 and 0.06 ms. They now use Git Bash's sh on Windows. Two of them then failed there for test-harness reasons, not product ones: the stubaidlc.cmdwas a shell script, which Git Bash hands to cmd.exe on Windows, and a multi-linesh -cargument was requoted by the Windows command line. On aidlc-dev-2 the real forwarder with a batch-file stub passed exit code 7 and the argumentshello,two wordsand an empty one intact, and the normalisation loop run from a file gaveC:/Users/me/bin/aidlc. The cases now use a batch-file stub and a script file on Windows.User experience
No product change. What it guards, in what a person sees:
/aidlc --doctoron a native install fails it too.Checklist
If an item does not apply, leave it unchecked.
Test plan
On aidlc-dev-2 (Windows Server 2025, Git for Windows, Bun 1.3.14),
bash tests/run-tests.sh --unit --filter "t-native-install-hooks|t-windows-gitbash-launcher":/usr/bin/bash: line 1: aidlc: command not found, the failure a person saw;On Linux the same filter passes (13 cases).
deterministic-tests.ymldispatches with the same filter: on the first head, windows-latest run 37179312105 and macos-15 run 37179313562; on this head (after the AIDA fixes), windows-latest run 37181110675, 5 of 5 new cases and 10 of 10 launcher cases pass (none skipped), and macos-15 run 37182856237, 5 of 5 new cases and 8 launcher cases pass, with the 2 Windows-only cases skipped.After AIDA: the test checks that the shell resolves
aidlcto the launcher it installed (a developer's own install later on PATH could otherwise hide a missing one), and a local Windows run without Git for Windows skips the Git Bash cases, which always run in GitHub Actions.Readiness: this PR adds a unit test and a test harness helper and changes one unit test; nothing the local integration tier runs imports them, so its evidence is PR CI, the merge queue on all three OSes, and the two dispatches above (no local integration tier). PR CI runs the new test on Linux; the merge queue runs it on Linux, macOS and Windows. It takes 66 s on aidlc-dev-2 and 124 s on a loaded Linux box, mostly the install, one engine compile (as t-native-hook-project-root already does) and 19 hook runs; it has no entry in tests/unit-shard-weights.json yet, so its shard uses the default weight until the weights are next refreshed.
Acknowledgment
By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of the project license.