Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
316 commits
Select commit Hold shift + click to select a range
4746405
docs(adr-0004): apply post-acceptance feedback to TEST-SPEC.md
lzrscg Apr 25, 2026
a45c054
docs(adr-0004): apply post-acceptance feedback to TEST-SPEC.md
lzrscg Apr 25, 2026
3b1c75d
docs(adr-0004): apply post-acceptance feedback to TEST-SPEC.md
lzrscg Apr 25, 2026
f6b4a33
docs(adr-0004): apply post-acceptance feedback to TEST-SPEC.md
lzrscg Apr 25, 2026
7998086
docs(adr-0004): apply post-acceptance feedback to TEST-SPEC.md
lzrscg Apr 25, 2026
9a7ed5e
docs(adr-0004): apply post-acceptance feedback to TEST-SPEC.md
lzrscg Apr 25, 2026
da50ae0
docs(adr-0004): apply post-acceptance feedback to TEST-SPEC.md
lzrscg Apr 25, 2026
478a91b
chore(review-test-spec): scope review and SPEC-PROBLEMS to active ADR
lzrscg Apr 26, 2026
af6413d
docs(adr-0004): apply post-acceptance feedback to TEST-SPEC.md
lzrscg Apr 26, 2026
1e09688
docs(adr-0004): apply post-acceptance feedback to TEST-SPEC.md
lzrscg Apr 26, 2026
31490c8
docs(adr-0004): apply post-acceptance feedback to TEST-SPEC.md
lzrscg Apr 26, 2026
8fdcd8a
docs(adr-0004): apply post-acceptance feedback to TEST-SPEC.md
lzrscg Apr 26, 2026
f3a88c3
docs(adr-0004): apply post-acceptance feedback to TEST-SPEC.md
lzrscg Apr 26, 2026
ea11031
docs(adr-0004): apply post-acceptance feedback to TEST-SPEC.md
lzrscg Apr 26, 2026
2cf2ce9
docs(adr-0004): apply post-acceptance feedback to TEST-SPEC.md
lzrscg Apr 26, 2026
9ecda6d
docs(adr-0004): apply post-acceptance feedback to TEST-SPEC.md
lzrscg Apr 26, 2026
fefcc0f
docs(adr-0004): apply post-acceptance feedback to TEST-SPEC.md
lzrscg Apr 26, 2026
5b7d1a0
docs(adr-0004): apply post-acceptance feedback to TEST-SPEC.md
lzrscg Apr 26, 2026
1aa9400
docs(adr-0004): apply post-acceptance feedback to TEST-SPEC.md
lzrscg Apr 26, 2026
94c5217
docs(adr-0004): apply post-acceptance feedback to TEST-SPEC.md
lzrscg Apr 27, 2026
c8a75b6
docs(adr-0004): apply post-acceptance feedback to TEST-SPEC.md
lzrscg Apr 27, 2026
59f5be8
docs(adr-0004): apply post-acceptance feedback to TEST-SPEC.md
lzrscg Apr 27, 2026
dd0c3b8
docs(adr-0004): apply post-acceptance feedback to TEST-SPEC.md
lzrscg Apr 27, 2026
2991314
docs(adr-0004): apply post-acceptance feedback to TEST-SPEC.md
lzrscg Apr 27, 2026
d626614
docs(adr-0004): apply post-acceptance feedback to TEST-SPEC.md
lzrscg Apr 27, 2026
ee9f765
docs(adr-0004): apply post-acceptance feedback to TEST-SPEC.md
lzrscg Apr 27, 2026
1ef0c3a
docs(adr-0004): apply post-acceptance feedback to TEST-SPEC.md
lzrscg Apr 27, 2026
bf979bb
docs(adr-0004): apply post-acceptance feedback to TEST-SPEC.md
lzrscg Apr 27, 2026
bb34de1
docs(adr-0004): apply post-acceptance feedback to TEST-SPEC.md
lzrscg Apr 27, 2026
e138181
docs(adr-0004): apply post-acceptance feedback to TEST-SPEC.md
lzrscg Apr 27, 2026
8605f99
docs(adr-0004): apply post-acceptance feedback to TEST-SPEC.md
lzrscg Apr 27, 2026
5543868
docs(adr-0004): apply post-acceptance feedback to TEST-SPEC.md
lzrscg Apr 27, 2026
aec8fff
docs(adr-0004): apply post-acceptance feedback to TEST-SPEC.md
lzrscg Apr 27, 2026
5409b21
docs(adr-0004): apply post-acceptance feedback to TEST-SPEC.md
lzrscg Apr 27, 2026
f09458c
docs(adr-0004): apply post-acceptance feedback to TEST-SPEC.md
lzrscg Apr 27, 2026
32845ea
docs(adr-0004): apply post-acceptance feedback to TEST-SPEC.md
lzrscg Apr 27, 2026
7fa7d1a
docs(adr-0004): apply post-acceptance feedback to TEST-SPEC.md
lzrscg Apr 27, 2026
0b2c831
docs(adr-0004): apply post-acceptance feedback to TEST-SPEC.md
lzrscg Apr 27, 2026
13f8f3e
docs(adr-0004): apply post-acceptance feedback to TEST-SPEC.md
lzrscg Apr 27, 2026
a27d308
docs(adr-0004): apply post-acceptance feedback to TEST-SPEC.md
lzrscg Apr 27, 2026
2cc63b4
docs(adr-0004): apply post-acceptance feedback to TEST-SPEC.md
lzrscg Apr 27, 2026
01ac77c
docs(adr-0004): apply post-acceptance feedback to TEST-SPEC.md
lzrscg Apr 27, 2026
65d49e1
docs(adr-0004): apply post-acceptance feedback to TEST-SPEC.md
lzrscg Apr 27, 2026
bc82cb5
docs(adr-0004): apply post-acceptance feedback to TEST-SPEC.md
lzrscg Apr 28, 2026
11ca4a6
docs(adr-0004): apply post-acceptance feedback to TEST-SPEC.md
lzrscg Apr 28, 2026
1287437
docs(adr-0004): apply post-acceptance feedback to TEST-SPEC.md
lzrscg Apr 28, 2026
cab7cf1
docs(adr-0004): resolve P-0004-01 / P-0004-02 and apply review feedback
lzrscg Apr 28, 2026
b4a13a3
docs(adr-0004): apply post-acceptance feedback to TEST-SPEC.md
lzrscg Apr 28, 2026
8c5e737
docs(adr-0004): apply post-acceptance feedback to TEST-SPEC.md
lzrscg Apr 28, 2026
4555374
docs(adr-0004): apply post-acceptance feedback to TEST-SPEC.md
lzrscg Apr 28, 2026
23e6729
docs(adr-0004): apply post-acceptance feedback to TEST-SPEC.md
lzrscg Apr 28, 2026
895db3f
docs(adr-0004): resolve P-0004-03 and apply review feedback
lzrscg Apr 28, 2026
f0203df
docs(adr-0004): apply post-acceptance feedback to TEST-SPEC.md
lzrscg Apr 29, 2026
51a9e75
docs(adr-0004): resolve P-0004-04 and apply review feedback
lzrscg Apr 29, 2026
ba68674
docs(adr-0004): apply post-acceptance feedback to TEST-SPEC.md
lzrscg Apr 29, 2026
1e45b53
docs(adr-0004): apply post-acceptance feedback to TEST-SPEC.md
lzrscg Apr 29, 2026
141f7e8
docs(adr-0004): apply post-acceptance feedback to TEST-SPEC.md
lzrscg Apr 29, 2026
e5d9c17
docs(adr-0004): apply post-acceptance feedback to TEST-SPEC.md
lzrscg Apr 29, 2026
1c5e305
docs(adr-0004): apply post-acceptance feedback to TEST-SPEC.md
lzrscg Apr 29, 2026
91ab1e8
docs(adr-0004): apply post-acceptance feedback to TEST-SPEC.md
lzrscg Apr 29, 2026
4a2adc4
docs(adr-0004): apply post-acceptance feedback to TEST-SPEC.md
lzrscg Apr 29, 2026
5d425f5
docs(adr-0004): apply post-acceptance feedback to TEST-SPEC.md
lzrscg Apr 29, 2026
4866f89
docs(adr-0004): apply post-acceptance feedback to TEST-SPEC.md
lzrscg Apr 29, 2026
558ed35
docs(adr-0004): apply post-acceptance feedback to TEST-SPEC.md
lzrscg Apr 29, 2026
867dfae
docs(adr-0004): apply post-acceptance feedback to TEST-SPEC.md
lzrscg Apr 29, 2026
591643f
docs(adr-0004): apply post-acceptance feedback to TEST-SPEC.md
lzrscg Apr 29, 2026
7c3ed9d
docs(adr-0004): apply post-acceptance feedback to TEST-SPEC.md
lzrscg Apr 29, 2026
bce20d2
docs(adr-0004): apply post-acceptance feedback to TEST-SPEC.md
lzrscg Apr 29, 2026
45380e0
docs(adr-0004): apply post-acceptance feedback to TEST-SPEC.md
lzrscg Apr 29, 2026
7c90352
docs(adr-0004): apply post-acceptance feedback to TEST-SPEC.md
lzrscg Apr 29, 2026
c04dbae
docs(adr-0004): apply post-acceptance feedback to TEST-SPEC.md
lzrscg Apr 29, 2026
6323379
docs(adr-0004): apply post-acceptance feedback to TEST-SPEC.md
lzrscg Apr 29, 2026
ff5528b
docs(adr-0004): apply post-acceptance feedback to TEST-SPEC.md
lzrscg Apr 29, 2026
28af43a
docs(adr-0004): apply post-acceptance feedback to TEST-SPEC.md
lzrscg Apr 29, 2026
fd9f72b
docs(adr-0004): apply post-acceptance feedback to TEST-SPEC.md
lzrscg Apr 29, 2026
42e859b
docs(adr-0004): apply post-acceptance feedback to TEST-SPEC.md
lzrscg Apr 29, 2026
a28f364
docs(adr-0004): apply post-acceptance feedback to TEST-SPEC.md
lzrscg Apr 29, 2026
ad1f064
docs(adr-0004): apply post-acceptance feedback to TEST-SPEC.md
lzrscg Apr 29, 2026
26fbf88
docs(adr-0004): resolve P-0004-07 and apply review feedback
lzrscg Apr 29, 2026
c0e315e
docs(adr-0004): apply post-acceptance feedback to TEST-SPEC.md
lzrscg Apr 29, 2026
11169b6
docs(adr-0004): apply post-acceptance feedback to TEST-SPEC.md
lzrscg Apr 29, 2026
9f792d6
docs(adr-0004): resolve P-0004-08 (broken/cyclic symlinks during runt…
lzrscg Apr 29, 2026
8f527b4
docs(adr-0004): open P-0004-09 (project-root .loopx symlink failure m…
lzrscg Apr 29, 2026
f4a0ba0
docs(adr-0004): resolve P-0004-09 (project-root .loopx failure modes)
lzrscg Apr 29, 2026
ba3e82d
docs(adr-0004): apply post-acceptance feedback to TEST-SPEC.md
lzrscg Apr 29, 2026
a8320cc
docs(adr-0004): apply post-acceptance feedback to TEST-SPEC.md
lzrscg Apr 29, 2026
9c808cc
docs(adr-0004): clarify T-API-70 to avoid implying a fixed pre-iterat…
lzrscg Apr 29, 2026
eff70aa
docs(adr-0004): apply post-acceptance feedback to TEST-SPEC.md
lzrscg Apr 29, 2026
351ea0c
docs(adr-0004): apply post-acceptance feedback to TEST-SPEC.md
lzrscg Apr 29, 2026
6ed962e
docs(adr-0004): apply post-acceptance feedback to TEST-SPEC.md
lzrscg Apr 29, 2026
8c5bd7e
docs(adr-0004): resolve P-0004-10 and P-0004-11
lzrscg Apr 29, 2026
6c4b5c6
docs(adr-0004): apply post-acceptance feedback to TEST-SPEC.md
lzrscg Apr 29, 2026
9e17750
docs(adr-0004): resolve P-0004-12 and apply post-acceptance feedback …
lzrscg Apr 30, 2026
cbdf268
docs(adr-0004): apply post-acceptance feedback to TEST-SPEC.md
lzrscg Apr 30, 2026
8cb262e
docs(adr-0004): open P-0004-13 and apply post-acceptance feedback to …
lzrscg Apr 30, 2026
d02df41
docs(adr-0004): resolve P-0004-13 and apply post-acceptance feedback …
lzrscg May 1, 2026
01ab1b6
docs(adr-0004): apply post-acceptance feedback to TEST-SPEC.md
lzrscg May 1, 2026
523fddd
docs(adr-0004): apply post-acceptance feedback to TEST-SPEC.md
lzrscg May 1, 2026
424437d
docs(adr-0004): apply post-acceptance feedback to TEST-SPEC.md
lzrscg May 1, 2026
8e20557
docs(adr-0004): apply post-acceptance feedback to TEST-SPEC.md
lzrscg May 1, 2026
71c4d17
docs(adr-0004): apply post-acceptance feedback to TEST-SPEC.md
lzrscg May 1, 2026
0c9d5c5
docs(adr-0004): apply post-acceptance feedback to TEST-SPEC.md
lzrscg May 1, 2026
9806604
docs(adr-0004): apply post-acceptance feedback to TEST-SPEC.md
lzrscg May 1, 2026
b394748
docs(adr-0004): apply post-acceptance feedback to TEST-SPEC.md
lzrscg May 1, 2026
3294869
docs(adr-0004): apply post-acceptance feedback to TEST-SPEC.md
lzrscg May 1, 2026
024d0cf
docs(adr-0004): advance status to Test Specified
lzrscg May 1, 2026
2b92ffb
chore: update loopx workflows
lzrscg May 1, 2026
1b21d7b
test(adr-0004): align cwd assertions to project-root cwd
lzrscg May 1, 2026
4c3832a
test(adr-0004): add T-WFDIR-01..14 LOOPX_WORKFLOW_DIR e2e suite
lzrscg May 1, 2026
d66a1a8
test(adr-0004): add T-TMP foundational LOOPX_TMPDIR e2e subset
lzrscg May 1, 2026
998fdc5
test(adr-0004): add T-TMP-12 programmatic pre-iteration failure suite
lzrscg May 1, 2026
b39b2b4
test(adr-0004): add T-TMP-12-cli pre-iteration failure suite (CLI cou…
lzrscg May 1, 2026
a740a09
test(adr-0004): add T-TMP-12a/12b/12c tmpdir-creation-failure suite
lzrscg May 1, 2026
83cb43b
test(adr-0004): add T-TMP-12d/12d2/12e/12e2/12e3 sub-step coverage suite
lzrscg May 1, 2026
1132dea
test(adr-0004): add T-TMP-12f/12f2/12f3/12f4/12f5/12g/12h version-che…
lzrscg May 1, 2026
990a339
test(adr-0004): add T-TMP-16..16j goto-resolution-failure cleanup suite
lzrscg May 1, 2026
cc51bce
chore(adr-0004): advance status to Tested
lzrscg May 1, 2026
57e8fbb
feat(adr-0004): implement project-root cwd + LOOPX_WORKFLOW_DIR injec…
lzrscg May 1, 2026
8973d61
chore(changeset): record ADR-0004 §6.1 minor bump
lzrscg May 1, 2026
bbdda0d
feat(adr-0004): implement LOOPX_TMPDIR per-run tmpdir creation, injec…
lzrscg May 1, 2026
c3b6837
chore(ralph): print RALPH_OUTPUT before halting on READY verdict
lzrscg May 1, 2026
7b41420
feat(adr-0004): implement RunOptions.env tier-2 env merging (SPEC §9.5)
lzrscg May 1, 2026
e71586c
feat(adr-0004): cleanup-trigger tests + .throw() consumer cancellatio…
lzrscg May 2, 2026
6573b8e
feat(adr-0004): implement SPEC §9.3 abort-after-final-yield carve-out
lzrscg May 2, 2026
94553fa
chore(ralph): require fix_plan.md to be empty for READY verdict
lzrscg May 2, 2026
1350562
feat(adr-0004): tmpdir parent snapshot timing tests + async LOOPX_TMP…
lzrscg May 2, 2026
895e7f7
feat(adr-0004): eager process.env snapshot under runPromise() (SPEC §…
lzrscg May 2, 2026
62f8ab0
chore: add changeset for SPEC §9.2 runPromise() eager process.env sna…
lzrscg May 2, 2026
00af2f0
test(adr-0004): T-TMP-32/32a/32b/32c + T-TMP-33 (stale-tmpdir non-rea…
lzrscg May 2, 2026
680f157
test(adr-0004): T-TMP-34/34a/34b (symlink-replacement cleanup-rule-2 …
lzrscg May 2, 2026
d9f908b
test(adr-0004): T-TMP-35/35a/35b (regular-file-replacement cleanup-ru…
lzrscg May 2, 2026
6754aad
test(adr-0004): T-TMP-36/36a/36b (mismatched-directory cleanup-rule-5…
lzrscg May 2, 2026
cf253f0
test(adr-0004): T-TMP-37/37d/37e (nested-symlink recursive-walk clean…
lzrscg May 2, 2026
68dfb9c
test(adr-0004): T-TMP-37a/37b/37c (FIFO/socket/hard-link cleanup-rule…
lzrscg May 2, 2026
fb8b881
test(adr-0004): T-TMP-40/41/42 (cleanup-fault-seam surface-parity for…
lzrscg May 2, 2026
e1da497
test(adr-0004): T-TMP-35c/35d/35e (cleanup-warning-does-not-mask scri…
lzrscg May 2, 2026
550a7a8
test(adr-0004): T-TMP-42a (cleanup-fault × script-error terminal mask…
lzrscg May 2, 2026
6944f52
test(adr-0004): T-TMP-35f/35g/35h (cleanup-warning-does-not-mask sign…
lzrscg May 2, 2026
bd528ac
fix(adr-0004): SPEC §7.2 first-trigger-wins + cleanup-start race seam…
lzrscg May 2, 2026
b36aa9d
test(adr-0004): T-TMP-42c (cleanup-fault × CLI signal terminal maskin…
lzrscg May 2, 2026
23c70fe
test(adr-0004): T-TMP-38f (cleanup idempotence under racing SIGTERM →…
lzrscg May 2, 2026
27a84bc
fix(adr-0004): T-TMP-38a (SPEC §7.2 first-observed-wins for run() rac…
lzrscg May 2, 2026
2cb8dc0
chore(adr-0004): changeset for run() first-observed-wins fix
lzrscg May 2, 2026
b923bd1
test(adr-0004): T-TMP-38a2 (first-observed-wins inverted-order parity…
lzrscg May 2, 2026
e98cdfa
test(adr-0004): T-TMP-38b/T-TMP-38b-run (first-observed-wins for raci…
lzrscg May 2, 2026
0acb136
test(adr-0004): T-TMP-38c (first-observed-wins under racing abort → .…
lzrscg May 2, 2026
2704c58
chore: update loopx workflows
lzrscg May 2, 2026
f84db9f
test(adr-0004): T-TMP-38c2 (first-observed-wins inverted-order parity…
lzrscg May 2, 2026
3ab9030
test(adr-0004): T-TMP-38d3 (first-observed-wins post-final-yield .ret…
lzrscg May 2, 2026
198c176
test(adr-0004): T-TMP-38d2 (first-observed-wins post-final-yield .thr…
lzrscg May 2, 2026
53d235f
feat(adr-0004): wire abort-listener seam + firstObservedRef + T-TMP-3…
lzrscg May 2, 2026
4bff3da
test(adr-0004): T-TMP-42b (cleanup-fault warning does not mask abort …
lzrscg May 2, 2026
84d1970
test(adr-0004): T-TMP-38d / T-TMP-38d4 (post-final-yield abort-first …
lzrscg May 2, 2026
6af937b
test(adr-0004): T-API-66/66a/66b/66c/66d/66e (abort-after-final-yield…
lzrscg May 2, 2026
5294fff
feat(adr-0004): wire child-spawn-attempt/failure seams + T-TMP-38e/-run
lzrscg May 2, 2026
c99c6ae
test(adr-0004): T-API-50/50a/50b/50c/50d/50e/50h (RunOptions.env basi…
lzrscg May 2, 2026
10be873
test(adr-0004): T-API-51a/51a2/51b/51c/51d/51e/51f (RunOptions.env pr…
lzrscg May 2, 2026
916f835
test(adr-0004): T-API-52/52a/52b/52c/52d/52e/52e2/52f (RunOptions.env…
lzrscg May 2, 2026
a67fc9e
feat(adr-0004): SPEC §6.3 CJS rejection across all JS/TS extensions +…
lzrscg May 2, 2026
cf5e0d8
chore: add changeset for SPEC §6.3 CJS rejection (patch)
lzrscg May 2, 2026
f08b0ab
test(adr-0004): T-API-53/53a-g + T-API-54/54a-h + T-API-55 (RunOption…
lzrscg May 2, 2026
8e78d78
test(adr-0004): T-API-56 series (RunOptions.env filtering predicate)
lzrscg May 2, 2026
d6c685e
test(adr-0004): T-API-57 series + T-API-58 series (RunOptions.env run…
lzrscg May 2, 2026
b8e8e4c
test(adr-0004): T-API-58a3/58a4 (RunOptions.envFile LOOPX_DELEGATED r…
lzrscg May 2, 2026
424318f
test(adr-0004): T-API-58b/58c/58d/58d2/58e/58e2 (RunOptions.env × NUL…
lzrscg May 2, 2026
1e90ccc
test(adr-0004): T-API-58f/58f2 (RunOptions.envFile × NUL-protocol-nam…
lzrscg May 3, 2026
49c7212
test(adr-0004): T-API-58g/58g2 (programmatic global env-file × NUL-pr…
lzrscg May 3, 2026
4f6b519
test(adr-0004): T-ENV-28/28a/29/29a (CLI env-file × NUL-protocol-name…
lzrscg May 3, 2026
1496f32
test(adr-0004): T-API-59 series (RunOptions.env / envFile / CLI -e do…
lzrscg May 3, 2026
a570b11
test(adr-0004): T-API-60/60a/60b/60c (RunOptions.env does NOT redirec…
lzrscg May 3, 2026
1cff3dc
test(adr-0004): T-API-50f/50g (concurrent runPromise/run RunOptions.e…
lzrscg May 3, 2026
93a66a2
test(adr-0004): T-API-61 series (outer options shape primitive matrix…
lzrscg May 3, 2026
ff0823d
test(adr-0004): T-API-62 series (throwing option-field getters + sing…
lzrscg May 3, 2026
ab54edf
test(adr-0004): T-API-62i/62i2/62i3/62i4 (call-site read timing for n…
lzrscg May 3, 2026
98caf6a
test(adr-0004): T-API-63/63a (Generator-Returns-Without-Throwing Inva…
lzrscg May 3, 2026
da1c5fb
test(adr-0004): T-API-64 series (Duck-Typed Signal Acceptance and Con…
lzrscg May 3, 2026
6a48693
test(adr-0004): T-API-64k/64k2/64k3 (Call-Site Capture Timing for opt…
lzrscg May 3, 2026
b004572
fix(adr-0004): T-API-64m/n/o/p/q (duck-signal contract — aborted:true…
lzrscg May 3, 2026
ed08188
test(adr-0004): T-API-65/65a/65b/65d/65e/65k/65l/65m/65n (Foundationa…
lzrscg May 3, 2026
c29d270
test(adr-0004): T-API-65f/65g (Abort Precedence over Throwing Later-O…
lzrscg May 3, 2026
d29338f
test(adr-0004): T-API-65a2 (Abort Precedence over Non-String Target A…
lzrscg May 3, 2026
f13d8ea
test(adr-0004): T-API-65h/65i/65j/65o (Abort Precedence over Target-R…
lzrscg May 3, 2026
3ca21ac
test(adr-0004): T-API-65v/65w (Invalid Options Wrapper Carrying Abort…
lzrscg May 3, 2026
d34d09f
test(adr-0004): T-API-65c (Abort Precedence over Unreadable Local Env…
lzrscg May 3, 2026
e09f5bf
test(adr-0004): T-API-65r-promise/r-generator (Abort Precedence over …
lzrscg May 3, 2026
2a2df0a
test(adr-0004): T-API-65p/65q (Abort Precedence over Option-Snapshot …
lzrscg May 3, 2026
63a30e7
test(adr-0004): T-API-65s-promise/s-generator (Abort Precedence over …
lzrscg May 3, 2026
d805f27
test(adr-0004): T-API-65t (Abort Precedence over Discovery Name-Restr…
lzrscg May 3, 2026
3b794ec
test(adr-0004): T-API-65u/65u2/65u3 (Duck-Signal × Pre-Iteration-Fail…
lzrscg May 3, 2026
2d10c70
test(adr-0004): T-API-65x/65y (Pre-Aborted Signal × Workflow-Level Ve…
lzrscg May 3, 2026
612be18
test(adr-0004): T-API-67/67a-g (Pinned Pre-Iteration Priority for cwd…
lzrscg May 3, 2026
591fcca
feat(adr-0004): T-API-68/69 (Pre-first-next() Consumer-Cancellation C…
lzrscg May 3, 2026
522fed6
chore(changeset): pre-first-next() consumer-cancellation carve-out
lzrscg May 3, 2026
1e1b1c9
test(adr-0004): T-API-70 (runPromise() has no pre-first-next() carve-…
lzrscg May 3, 2026
0c322e0
test(adr-0004): T-API-73/73a/73b/73c/74/74a/74b/74c (global env-file …
lzrscg May 3, 2026
058d47a
test(adr-0004): T-INST-DASHDASH-01..04 (install-scoped `--` rejection…
lzrscg May 3, 2026
238de96
feat(adr-0004): T-INST-40f / T-INST-41 (strengthened) / T-INST-44a..4…
lzrscg May 3, 2026
7f56773
test: T-INST-42m / T-INST-42n / T-API-62f2 (.mjs/.cjs install passthr…
lzrscg May 3, 2026
7c2955b
feat(adr-0004): SPEC §10.10 auto-install foundational subset (T-INST-…
lzrscg May 3, 2026
aa26d47
test(adr-0004): T-INST-117 / 117a / 117b (auto-install no-rollback × …
lzrscg May 3, 2026
335ee36
test(adr-0004): T-INST-110f / T-INST-110g (-w × no-index × auto-insta…
lzrscg May 3, 2026
2064d1a
test(adr-0004): T-INST-111b/c/d/e (--no-install opt-out interaction m…
lzrscg May 3, 2026
e535166
feat(adr-0004): T-INST-112c / T-INST-112d (.gitignore safeguard write…
lzrscg May 3, 2026
1865bb3
feat(adr-0004): T-INST-110h (SPEC §10.11 materialize symlinked workfl…
lzrscg May 3, 2026
a325ebb
test(adr-0004): T-INST-112b / T-INST-112e / T-INST-112f (.gitignore s…
lzrscg May 3, 2026
bc524c3
test(adr-0004): T-INST-118a / T-INST-118b / T-INST-118c (package-mana…
lzrscg May 3, 2026
085f720
test(adr-0004): T-PWD-01..08 (PWD non-protocol behavior — full four-t…
lzrscg May 3, 2026
911779d
test(adr-0004): T-PARSE-04a / T-PARSE-13a / T-PARSE-17a (output-parsi…
lzrscg May 3, 2026
df53d0f
test(adr-0004): T-LOOP-13a / 15b / 24a / 44 / 45 / 46 (loop-state clu…
lzrscg May 3, 2026
4a8866d
fix(adr-0004): T-VER-09a / 11b2 / 11d / 14b / 14c / 14d / 12c / 13b2 …
lzrscg May 3, 2026
2ab775c
chore(adr-0004): add changeset for non-string loopx version warning fix
lzrscg May 3, 2026
11a77af
test(adr-0004): T-INST-119 / 119a / 119a-stderr / 119b / 119c / 119d …
lzrscg May 3, 2026
4f28eb4
test(adr-0004): T-EXEC-15a / T-EXEC-15b / T-EXEC-15c (no runtime auto…
lzrscg May 3, 2026
f7fe96e
test(adr-0004): T-SUB-05a / 06c / 06d / 06e / 06f / 11a / 11b / 11c /…
lzrscg May 3, 2026
37318c6
fix(adr-0004): T-CLI-01a / 01b / 19b / 23a / 40b / 70a / 71a / 71b / …
lzrscg May 3, 2026
20ecc4b
fix(adr-0004): T-CLI-TOP-DASHDASH-01 + T-CLI-RUN-DASHDASH-01..13 + T-…
lzrscg May 3, 2026
9a91f95
chore(adr-0004): add changeset for `loopx run` `--` rejection fix
lzrscg May 3, 2026
9db960e
fix(adr-0004): T-SUB-14l / 19a / 20 / 21 / 22 / 23 / 24 / 25 / 26 / 2…
lzrscg May 3, 2026
3039fc0
test(adr-0004): T-DISC-07b / T-DISC-09a / T-DISC-09b / T-DISC-15c (Wo…
lzrscg May 3, 2026
cf688f7
test(adr-0004): T-DISC-30c / T-DISC-30d / T-DISC-30e (Script & Workfl…
lzrscg May 3, 2026
dfcd4bb
test(adr-0004): T-VER-12 / T-VER-12b / T-VER-13b / T-VER-15a / T-DEL-…
lzrscg May 3, 2026
ec711f6
test(adr-0004): T-DEL-04a / 07a / 09a / 15a / 15b / 26a / 28 / 28a / …
lzrscg May 3, 2026
16a2e78
test(adr-0004): T-INST-120 / T-INST-120a / T-INST-120b / T-INST-120c …
lzrscg May 3, 2026
5cdffe8
test(adr-0004): T-VER-15c / T-VER-15d (install-time devDependencies.l…
lzrscg May 3, 2026
3f396eb
test(adr-0004): T-DISC-42d / T-DISC-42e / T-DISC-42f / T-DISC-42g (Di…
lzrscg May 3, 2026
7a0b318
test(adr-0004): T-DISC-07a / T-DISC-07c / T-DISC-24a / T-DISC-24b (.m…
lzrscg May 3, 2026
5f12307
test(adr-0004): T-SYM-01 / T-SYM-02 / T-SYM-03 / T-SYM-04 / T-SYM-05 …
lzrscg May 3, 2026
73483b7
test(adr-0004): T-SYM-02c / T-SYM-02d / T-SYM-04a / T-SYM-04b / T-SYM…
lzrscg May 3, 2026
ea4fc07
test(adr-0004): T-DISC-40j..40w (Discovery Symlinks failed-resolution…
lzrscg May 3, 2026
00c91a4
feat(adr-0004): SPEC §7.3 pre-iteration signal-wins precedence + T-SI…
lzrscg May 3, 2026
37f01ad
test(adr-0004): T-TMP-30 / T-TMP-31 (LOOPX_TMPDIR Protocol-Variable P…
lzrscg May 3, 2026
1049182
test(adr-0004): T-EXIT-17 (Invalid target string ':script' non-signal…
lzrscg May 3, 2026
f175c2a
test(adr-0004): T-TYPE-08 (import { output, input } from "loopx" type…
lzrscg May 3, 2026
3c44482
test(adr-0004): T-SIG-25 + T-SIG-30 (Pre-iteration Signal-Wins Preced…
lzrscg May 3, 2026
b0d9efd
feat(adr-0004): SPEC §7.2 racing-trigger first-observed-wins on activ…
lzrscg May 3, 2026
7047d8c
test(adr-0004): T-TERM-02/02c/02d/04/04-run (SPEC §7.2 racing-trigger…
lzrscg May 3, 2026
3747946
feat(adr-0004): T-INST-116 / T-INST-116a (SIGINT/SIGTERM during `npm …
lzrscg May 3, 2026
4b3dd9e
test(adr-0004): T-INST-116b / T-INST-116b2 (SIGINT/SIGTERM during `np…
lzrscg May 4, 2026
f59a1a5
feat(adr-0004): T-INST-116j / T-INST-116j2 / T-INST-116j3 (SIGTERM/SI…
lzrscg May 4, 2026
42907b6
feat(adr-0004): T-INST-116h / T-INST-116h2 (SIGINT/SIGTERM during `be…
lzrscg May 4, 2026
9f615ed
feat(adr-0004): T-INST-116i / T-INST-116i2 (SIGINT/SIGTERM during `pr…
lzrscg May 4, 2026
966749a
feat(adr-0004): T-INST-116k / T-INST-116k2 (SIGINT/SIGTERM during `po…
lzrscg May 4, 2026
a6a8240
feat(adr-0004): T-INST-116m / T-INST-116m2 (SIGINT/SIGTERM during `po…
lzrscg May 4, 2026
a408063
feat(adr-0004): T-INST-116c / 116d / 116d2 / 116e / 116f / 116g (SIGI…
lzrscg May 4, 2026
ac0fb97
feat(adr-0004): T-INST-116n / T-INST-116n2 (SIGINT/SIGTERM during `be…
lzrscg May 4, 2026
dad010e
feat(adr-0004): T-INST-116l / T-INST-116l2 (SIGINT/SIGTERM during `po…
lzrscg May 4, 2026
501513e
feat(adr-0004): T-INST-116o / T-INST-116o2 (SIGINT/SIGTERM during act…
lzrscg May 4, 2026
7b7b902
changeset: SPEC §10.10 active-child × prior-failure-suppression (T-IN…
lzrscg May 4, 2026
d96923f
feat(adr-0004): T-VER-28 (workflow `package.json` non-regular path br…
lzrscg May 4, 2026
cdca0a2
feat(adr-0004): T-ENV-26 / T-ENV-27 cluster (env-file NUL in value × …
lzrscg May 4, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions .changeset/adr-0004-abort-after-final-yield.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
"loop-extender": patch
---

SPEC §9.3: `run()` now honors the abort-after-final-yield carve-out. An `AbortSignal` that aborts after the final `Output` has been yielded (via `stop: true` or `maxIterations` reached) but before the generator settles via `{ done: true }` now produces the abort error on the next generator interaction (`.next()`, `.return()`, or `.throw()`), with `LOOPX_TMPDIR` cleanup running before the abort error surfaces.

Previously, the wrapper returned by `run()` would silently complete in this window, ignoring the abort. The wrapper now tracks the post-final-yield state and dispatches abort cleanup-then-throw on the next consumer interaction. First-observed-wins precedence is preserved: a prior consumer `.return()` / `.throw()` retains its silent-completion outcome and is not displaced by a later abort. For `.throw(consumerErr)` in this window, the abort error displaces the consumer-supplied error (per SPEC §9.3).
13 changes: 13 additions & 0 deletions .changeset/adr-0004-auto-install-foundational.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
---
"loop-extender": minor
---

SPEC 10.10: implement post-commit auto-install of workflow dependencies.

After a successful commit phase, `loopx install` now runs `npm install` once per committed workflow with a top-level `package.json`, sequentially (npm children do not overlap), with cwd set to the workflow directory and `process.env` inherited unchanged. Before each spawn, loopx checks `.gitignore` and synthesizes one containing `node_modules` if absent (existing regular files are left unchanged; non-regular entries — symlink, directory, FIFO, socket, etc. — are recorded as safeguard failures, skip `npm install` for that workflow, and contribute to a final aggregate failure report on stderr).

`--no-install` (already parsed at the CLI in a previous change) is now wired through to suppress both `npm install` invocation and `.gitignore` synthesis.

Workflows without a top-level `package.json` are skipped silently. Malformed `package.json` (unreadable, invalid JSON, invalid loopx semver range, or non-regular path) emits at most one warning per workflow per install operation (deduped against preflight warnings) and skips auto-install + safeguard for that workflow.

`npm install` non-zero exit and spawn failure (`npm` not on PATH) both record into the aggregate accumulator and cause `loopx install` to exit 1 at end of pass; partial `node_modules/` and committed workflow files are not rolled back.
13 changes: 13 additions & 0 deletions .changeset/adr-0004-cjs-rejection-loader-hook.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
---
"loop-extender": patch
---

SPEC §6.3 CommonJS rejection now applies uniformly across all four JS/TS script extensions (`.js`, `.ts`, `.tsx`, `.jsx`). Previously, scripts using `module.exports = X` or `exports.foo = X` in a `.ts`/`.tsx`/`.jsx` workflow file silently ran on Node — defeating the SPEC §6.3 contract that CommonJS syntax must fail at execution time.

The loopx custom loader-hook now intercepts `.ts`/`.tsx`/`.jsx` files in `.loopx/` directories, transforms them via esbuild (TS types stripped, JSX expanded to `React.createElement` per the existing classic-transform contract) without enabling esbuild's CJS-shim wrapper, and feeds the result to Node as a true ES module. Any reference to `module`, `exports`, or `require` then throws `ReferenceError` at evaluation time.

`require()` rejection was already enforced for all four extensions (`.js` via the existing loader-hook ESM force; `.ts`/`.tsx`/`.jsx` via the auto-injected `.loopx/package.json {"type":"module"}` from `bin-path.ts` and Bun's `--define require:null`).

`esbuild` is now declared as an explicit runtime dependency of `loop-extender` (previously transitive via `tsx`).

This affects only workflow scripts that contained CommonJS syntax — those scripts now fail at execution time as the SPEC requires. Workflow scripts using ESM syntax (`import` / `export`) continue to work unchanged.
7 changes: 7 additions & 0 deletions .changeset/adr-0004-cli-first-trigger-wins.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
"loop-extender": patch
---

CLI signal handler now honors SPEC §7.2 first-observed-wins: when a second signal arrives after the first (e.g., SIGTERM during cleanup of a prior SIGINT), the surfaced exit code stays anchored at the first signal's `128 + N` value rather than being overwritten by the second. Previously a SIGTERM during the cleanup of a SIGINT-driven termination would shift the exit code from 130 to 143; now it correctly stays at 130.

This affects the rare case where two close-together signals reach loopx during a single run; everyday SIGINT/SIGTERM handling is unchanged.
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
---
"loop-extender": patch
---

ADR-0004 §9.3 / §9.5: a duck-typed `options.signal` whose `addEventListener` registration throws is now correctly surfaced as an option-snapshot error, even when the signal also reports `aborted: true`.

Previously, `runWithInternal` short-circuited on `snap.signal.aborted === true` and skipped the `addEventListener` registration entirely — meaning a duck signal of the form `{ aborted: true, addEventListener() { throw } }` would route through the abort-precedence pathway and surface an `AbortError`, mis-categorizing the contract violation as an abort outcome.

Two coupled changes restore SPEC §9.3 / §9.5 conformance:

- Always invoke `signal.addEventListener("abort", listener, { once: true })` at call-site capture, regardless of `aborted` value, so the registration-throws case is detected. This honors SPEC §9.5's "must be callable and returns without throwing when loopx invokes it" wording — loopx must invoke `addEventListener` to verify the contract, and per the `aborted: true` × non-compatible-shape carve-out, that verification must happen even when `aborted: true`.
- When registration throws, clear the captured `snap.signal` so the downstream abort-precedence check in `runInternal` does not mistake `aborted: true` on a non-compatible signal as grounds to surface an abort error. The captured `snap.error` then surfaces as an ordinary option-snapshot error via the standard pre-iteration error path.

Behavior for valid duck signals is unchanged: the `addEventListener` is now invoked unconditionally during snapshot capture (instead of only when `aborted: false`), but real `AbortSignal` instances and well-formed duck signals do not observe a difference because `addEventListener` succeeds and the `aborted: true` branch then enters the abort-precedence pathway as before.
14 changes: 14 additions & 0 deletions .changeset/adr-0004-env-subcommand-grammar-edges.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
---
"loop-extender": patch
---

SPEC 4.3 / 8.1 / 12: `loopx env list` now prints parser warnings to stderr, and `loopx env set / remove / list` reject extra positionals as usage errors.

Previously:
- `loopx env list` parsed the global env file with `parseEnvFile` (which produces warnings for invalid lines) but discarded the returned warnings array, so a malformed line like `1BAD=val` was silently dropped from the listing with no diagnostic. SPEC 8.1 specifies invalid lines are "ignored with a warning to stderr."
- `loopx env list extra`, `loopx env set FOO bar extra`, and `loopx env remove FOO extra` all silently ignored the trailing positional and proceeded with the leading well-formed grammar — a buggy impl that committed `FOO=bar` despite an unrecognized 4th argument. SPEC 4.3 enumerates the env subcommand grammar as exactly `set <name> <value>` / `remove <name>` / `list` (no operands), and SPEC 12's usage-error contract requires exit 1 + a stderr usage error for parser-level surface failures.

After the fix:
- `loopx env list` emits `Warning: Line N: invalid key name: <key>` (or `Warning: Line N: missing '=' separator: <line>`) to stderr per malformed line — the same warning class as `loopx run` already emits when loading the global env file. Well-formed entries are still listed on stdout, the listing is still sorted, and exit code is still 0 (warnings are non-fatal).
- `loopx env list extra` / `loopx env set FOO bar extra` / `loopx env remove FOO extra` exit 1 with `Error: loopx env <subcmd>: unexpected extra positional '<arg>'` on stderr; no env-file mutation occurs (the failure short-circuits before `envSet` / `envRemove` / `envList` is invoked).
- `loopx env` (no subcommand), `loopx env set` / `set FOO` (missing operands), `loopx env remove` (missing name), and `loopx env unknown` (unrecognized subcommand) continue to be usage errors (unchanged).
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
---
"loop-extender": patch
---

SPEC §10.10 / §7.3: SIGINT/SIGTERM arriving during an active `npm install` child for a workflow processed AFTER a prior workflow's auto-install failure now correctly suppresses the not-yet-emitted aggregate failure report (resolving P-0004-05's active-child × prior-failure-suppression sentence).

Previously, the auto-install pause-seam dispatch for the `child-active-after-failure` window was declared but had no dispatch site — when SIGINT/SIGTERM arrived during the second-processed workflow's npm child window with a prior-workflow failure already recorded into the aggregate accumulator, the surfaced behavior was undefined relative to the SPEC contract.

The `runAutoInstall` spawn-and-wait flow in `install.ts` is now split across two awaits: spawn synchronously + register exit handlers, optionally pause for the `child-active-after-failure` seam (TEST-SPEC §1.4), then await the child-exit promise. When a signal arrives during the pause, the existing CLI signal handler forwards the signal to the child's process group, the child dies, the exit promise rejects with NPM_SIGNAL, the catch branch's signal-suppression guard suppresses the per-workflow failure entry, and the end-of-pass signal-suppression guard returns 0 BEFORE the aggregate report is emitted.

A noop `.catch(() => {})` is attached to the spawn-exit promise immediately after construction to suppress Node 25's fatal-unhandled-rejection behavior when the child exits during the seam pause (rejection lands before the await attaches its handler). The await still throws normally; only the fatal warning is suppressed.

Closes the LAST gap in the SPEC §10.10 / §7.3 T-INST-116 cluster — the entire signal × auto-install matrix (active-child × {no-prior-failure, prior-failure}, no-active-child × seven ordinal windows, SIGKILL escalation, process-group forwarding, multi-workflow no-further-processing) is now in place.
11 changes: 11 additions & 0 deletions .changeset/adr-0004-loopx-tmpdir.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
---
"loop-extender": minor
---

ADR-0004 §7.4: scripts now receive a per-run `LOOPX_TMPDIR` protocol-injected environment variable pointing at a freshly-created temporary directory, and loopx automatically cleans it up on every terminal outcome (normal completion, script error, invalid `goto`, abort, signal, consumer cancellation).

Per SPEC §7.4, the directory is created via `mkdtemp(<os.tmpdir()>/loopx-)` with mode `0700` and an identity fingerprint captured for cleanup safety. The same value is injected into every spawned script in the run (starting target, intra- and cross-workflow `goto`, loop reset). Files written there persist within the run and are removed when loopx exits.

Cleanup is identity-fingerprint-matched and best-effort — a recorded `LOOPX_TMPDIR` whose `lstat` no longer matches what loopx created (renamed, replaced, or different inode) is left in place with a single stderr warning rather than recursively removed. Cleanup runs at most once per resource and emits at most one warning regardless of how many terminal triggers race.

**For workflow scripts**: read `$LOOPX_TMPDIR` (Bash) or `process.env.LOOPX_TMPDIR` (JS/TS) for a writable scratch location that is guaranteed to exist for the duration of the run and to be cleaned up afterwards. Use this for cross-workflow `goto` rendezvous data or any per-run temp state.
9 changes: 9 additions & 0 deletions .changeset/adr-0004-no-install-cli-flag.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
---
"loop-extender": patch
---

SPEC 4.2 / 10.10 / 11.3: recognize `--no-install` as a boolean install-scoped flag in the install CLI parser, and list it in `loopx install -h` / `--help` output.

`parseInstallArgs` now accepts `--no-install` (no operand) with duplicate-flag rejection (`Error: duplicate --no-install flag`). The `-h` / `--help` short-circuit suppresses both the duplicate-flag error and any source acquisition (no network activity, `.loopx/` untouched). Common single-character candidates (`-n`, `-N`, `-i`, `-I`) remain rejected as unknown install-scoped short flags — `--no-install` has no short form per SPEC 4.2.

The flag's behavioral effect (suppressing auto-install of workflow dependencies) is wired only at the parser layer in this change; the auto-install pipeline itself is a separate larger work-item per Spec 10.10.
14 changes: 14 additions & 0 deletions .changeset/adr-0004-non-string-loopx-version-warning.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
---
"loop-extender": patch
---

SPEC 3.2: workflow-level version checking now correctly warns when `dependencies.loopx` or `devDependencies.loopx` is a non-string value (e.g., a JSON number).

Previously, a workflow `package.json` like `{ "dependencies": { "loopx": 42 } }` was silently treated as if no `loopx` declaration existed — no warning fired and the version check was skipped without diagnostics. Per SPEC 3.2's "Valid JSON but `loopx` version field contains an invalid semver range: A warning is printed to stderr", any value that is not a valid semver range (including non-string types, since semver ranges are strings) must produce the same `invalid-semver` warning class.

The fix applies symmetrically to:
- the runtime workflow-version check (first entry into a workflow during a loop run)
- the install-time preflight check (`loopx install` `dependencies.loopx` validation)
- the post-commit auto-install pass (malformed-`package.json` skip)

`peerDependencies.loopx` and `optionalDependencies.loopx` remain fully invisible at the workflow level, even when malformed, per SPEC 3.2's enumeration of checked fields. Likewise, an invalid range on a non-`loopx` dependency entry is ignored (the check reads only `dependencies.loopx` and `devDependencies.loopx`).
9 changes: 9 additions & 0 deletions .changeset/adr-0004-pre-first-next-carve-out.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
---
"loop-extender": patch
---

SPEC §9.1: implement the pre-first-`next()` consumer-cancellation carve-out for `run()`.

When the consumer cancels the iterator BEFORE invoking `.next()` for the first time — by calling `.return(value)`, `.throw(err)`, or via `await using` (Symbol.asyncDispose) — the wrapper now follows standard ES async-generator semantics: `.return(value)` settles with `{ value, done: true }`, `.throw(err)` rejects with the consumer-supplied error. The loop body is never entered, no pre-iteration step runs, no captured signal is consulted (even an already-aborted signal does not surface an abort error), and every captured pre-iteration error (option-snapshot, target validation, `.loopx/` discovery, env-file loading, target resolution, tmpdir creation, version-check warnings) is suppressed.

Previously, `.throw()` as a first interaction silently swallowed the consumer-supplied error by routing through `gen.return(undefined)`. The fix introduces a `bodyEntered` flag set inside `wrapper.next()` before awaiting the inner generator, so subsequent `.return()` / `.throw()` calls correctly distinguish pre-first-`next()` (carve-out) from post-first-`next()` (silent completion) cancellation.
7 changes: 7 additions & 0 deletions .changeset/adr-0004-pre-iteration-signal-wins.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
"loop-extender": patch
---

CLI now honors SPEC §7.3 pre-iteration signal-wins precedence: SIGINT/SIGTERM observed by loopx during the pre-iteration window (target validation, `.loopx/` discovery, env-file loading, target resolution, tmpdir creation) wins over any non-signal pre-iteration failure that would otherwise have surfaced. loopx exits with `128 + N` and suppresses the displaced failure error rather than printing it as the fatal-exit reason.

Previously, signal handlers were installed only after all pre-iteration steps completed, so a SIGINT delivered during pre-iteration would either be uncaught (default POSIX termination) or, if it raced past pre-iteration, lose the precedence contest with the failure. Now SIGINT/SIGTERM during a missing env file, missing workflow, invalid target, missing script, missing default `index`, missing `.loopx/`, or tmpdir creation failure all surface the signal exit code (130 / 143) per spec.
9 changes: 9 additions & 0 deletions .changeset/adr-0004-project-root-cwd-and-workflow-dir.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
---
"loop-extender": minor
---

ADR-0004: scripts now run with `LOOPX_PROJECT_ROOT` as their working directory (not the workflow directory), and a new `LOOPX_WORKFLOW_DIR` protocol-injected env variable exposes the workflow directory.

This is the foundational ADR-0004 §6.1 change. Previously, every spawned script's cwd was the workflow directory (e.g., `.loopx/ralph/`). Per SPEC §6.1, that contract is now project-root-unified — every script (starting target, intra- and cross-workflow `goto`, loop reset) spawns with cwd = `LOOPX_PROJECT_ROOT`. Scripts that need the workflow directory should read `LOOPX_WORKFLOW_DIR`, which is injected into every spawn's environment alongside `LOOPX_BIN`, `LOOPX_PROJECT_ROOT`, and `LOOPX_WORKFLOW`. Bash scripts can rely on the normative `dirname "$0" == LOOPX_WORKFLOW_DIR` equality (SPEC §6.2).

**Migration:** any workflow script that did `cat ./helper.sh` (relying on cwd = workflow dir) must use `cat "$LOOPX_WORKFLOW_DIR/helper.sh"` instead.
13 changes: 13 additions & 0 deletions .changeset/adr-0004-run-dashdash-rejection.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
---
"loop-extender": patch
---

SPEC 4.1 / 4.2 / 11.2 / 12: `loopx run` now rejects `--` as an unrecognized token wherever it appears, instead of silently consuming it as an end-of-options marker.

Previously, the `run` parser accepted `--` as a separator and treated the next argv as the target — so `loopx run -- ralph`, `loopx run -n 1 -- ralph`, and `loopx run ralph --` all succeeded (or failed only because of unrelated reasons). SPEC 4.1 explicitly states that `--` is **not** an end-of-options marker for `run` and is rejected wherever it appears outside the `-h` / `--help` short-circuit, and SPEC 12 enumerates several `--` forms (`loopx run -- ralph`, `loopx run -n 1 -- ralph`, `loopx run ralph -- name=value`) as usage errors.

After the fix:
- `loopx run -- ralph`, `loopx run -n 1 -- ralph`, `loopx run ralph -- name=value`, `loopx run --`, `loopx run ralph --` — all exit 1 with `Error: unrecognized token '--' …` on stderr.
- `loopx run -e -- ralph`, `loopx run ralph -e --`, `loopx run -n -- ralph`, `loopx run ralph -n --` — all exit 1 citing `--` as the offending token. Previously these would either consume `--` as the `-e` operand (loading a file literally named `--` as the env file) or surface an "invalid `-n` operand" error treating `--` as a non-integer value; both behaviors violated SPEC 4.1's "wherever it appears" rule.
- `loopx run -h -- ralph`, `loopx run -- -h`, `loopx run -- --help` — help short-circuit still fires (unchanged).
- The shell env prefix (`adr=0003 loopx run ralph`) remains the sole CLI surface for per-run parameterization, as documented in SPEC 11.2 / 13.
7 changes: 7 additions & 0 deletions .changeset/adr-0004-run-first-trigger-wins.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
---
"loop-extender": patch
---

`run()` / `runPromise()` consumer-cancellation methods (`.return()`, `.throw()`, `[Symbol.asyncDispose]`) now honor SPEC §7.2 first-observed-wins for the abort-vs-consumer-cancellation race. When the run's `AbortSignal` is already aborted at the time `.return()` / `.throw()` is called, the in-flight iteration's abort error surfaces to the consumer (via the for-await loop or `gen.next()` rejection) instead of being silenced by the consumer-cancellation contract. When `.return()` / `.throw()` is observed first (no prior abort), the previous silent-clean-completion behavior is preserved.

This affects the rare case where an external abort and a consumer cancellation race for the same run; everyday `.return()` / `.throw()` cancellation flows are unchanged. SPEC §9.3 post-final-yield-abort handling is also unchanged.
Loading
Loading