@windyroad/itil 0.61.1 → 0.61.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (171) hide show
  1. package/.claude-plugin/plugin.json +1 -1
  2. package/package.json +7 -2
  3. package/agents/test/fixtures/proceed-new-genuinely-new.md +0 -43
  4. package/agents/test/fixtures/proceed-new-subtle-sibling.md +0 -47
  5. package/agents/test/fixtures/regression-p347-vs-p346.md +0 -54
  6. package/agents/test/hang-off-check.bats +0 -225
  7. package/hooks/test/block-list.bats +0 -153
  8. package/hooks/test/command-detect.bats +0 -181
  9. package/hooks/test/itil-assistant-output-gate.bats +0 -114
  10. package/hooks/test/itil-assistant-output-review.bats +0 -224
  11. package/hooks/test/itil-bash-polling-antipattern-detect.bats +0 -154
  12. package/hooks/test/itil-changeset-discipline.bats +0 -603
  13. package/hooks/test/itil-claude-space-protection.bats +0 -294
  14. package/hooks/test/itil-commit-trailer-transition-advisory.bats +0 -80
  15. package/hooks/test/itil-correction-detect.bats +0 -189
  16. package/hooks/test/itil-deferral-cadence-gate.bats +0 -187
  17. package/hooks/test/itil-fictional-defer-detect.bats +0 -292
  18. package/hooks/test/itil-fix-title-lifecycle-advisory.bats +0 -129
  19. package/hooks/test/itil-mid-loop-ask-detect.bats +0 -220
  20. package/hooks/test/itil-no-implement-draft-gate.bats +0 -210
  21. package/hooks/test/itil-pending-questions-surface.bats +0 -307
  22. package/hooks/test/itil-readme-refresh-discipline.bats +0 -642
  23. package/hooks/test/itil-rfc-oversight-nudge.bats +0 -83
  24. package/hooks/test/itil-rfc-trailer-advisory.bats +0 -375
  25. package/hooks/test/itil-story-mirror-migration-nudge.bats +0 -122
  26. package/hooks/test/manage-problem-enforce-create.bats +0 -424
  27. package/hooks/test/p057-staging-trap-detect.bats +0 -231
  28. package/hooks/test/pre-publish-intake-gate.bats +0 -144
  29. package/hooks/test/runtime-sid-marker.bats +0 -90
  30. package/hooks/test/session-id.bats +0 -370
  31. package/scripts/migrate-problems-add-type.sh +0 -116
  32. package/scripts/test/catchup-scan.bats +0 -274
  33. package/scripts/test/check-afk-accept-eligible.bats +0 -310
  34. package/scripts/test/check-fail-soft-skip-discipline.bats +0 -172
  35. package/scripts/test/check-fix-rfc-trace.bats +0 -164
  36. package/scripts/test/check-locale-discipline.bats +0 -291
  37. package/scripts/test/check-problems-readme-budget.bats +0 -192
  38. package/scripts/test/check-rfc-has-stories.bats +0 -69
  39. package/scripts/test/check-rfc-rejected-alternatives.bats +0 -108
  40. package/scripts/test/check-rfc-stories-ratified.bats +0 -82
  41. package/scripts/test/check-upstream-responses.bats +0 -503
  42. package/scripts/test/classify-readme-drift.bats +0 -392
  43. package/scripts/test/derive-first-dispatch.bats +0 -274
  44. package/scripts/test/derive-release-vehicle.bats +0 -454
  45. package/scripts/test/detect-unratified-stories-maps.bats +0 -60
  46. package/scripts/test/dual-tolerant-glob-rfc-002-t2.bats +0 -309
  47. package/scripts/test/effort-tally.bats +0 -170
  48. package/scripts/test/evaluate-relevance.bats +0 -773
  49. package/scripts/test/kind-a-commands.bats +0 -46
  50. package/scripts/test/mark-create-gate.bats +0 -59
  51. package/scripts/test/mark-story-oversight-confirmed.bats +0 -53
  52. package/scripts/test/migrate-problems-add-type.bats +0 -280
  53. package/scripts/test/migrate-story-status-mirror.bats +0 -167
  54. package/scripts/test/no-type-regression-guard.bats +0 -74
  55. package/scripts/test/oversight-mirror-corpus-lint.bats +0 -150
  56. package/scripts/test/plugin-exercise-index.bats +0 -386
  57. package/scripts/test/plugin-maturity-doc-lint.bats +0 -470
  58. package/scripts/test/plugin-maturity-populate.bats +0 -631
  59. package/scripts/test/plugin-maturity-render.bats +0 -469
  60. package/scripts/test/plugin-validate-ci-gate.bats +0 -208
  61. package/scripts/test/reconcile-readme.bats +0 -1007
  62. package/scripts/test/reconcile-rfcs.bats +0 -496
  63. package/scripts/test/reconcile-stories.bats +0 -173
  64. package/scripts/test/reconcile-story-maps.bats +0 -74
  65. package/scripts/test/release-watch-poll-loop.bats +0 -180
  66. package/scripts/test/resolve-governance-plugin-dirs.bats +0 -78
  67. package/scripts/test/rfc-stories-extension.bats +0 -175
  68. package/scripts/test/skill-invocations.bats +0 -535
  69. package/scripts/test/skill-md-dual-tolerant-coverage-rfc-002-t3.bats +0 -374
  70. package/scripts/test/story-oversight-lib.bats +0 -190
  71. package/scripts/test/update-jtbd-references-related-problems.bats +0 -178
  72. package/scripts/test/update-problem-references-section.bats +0 -242
  73. package/scripts/test/update-problem-rfcs-section.bats +0 -242
  74. package/scripts/test/update-references-section-sibling-helpers.bats +0 -80
  75. package/scripts/test/update-rfc-commits-section.bats +0 -77
  76. package/scripts/test/verify-iter-summary.bats +0 -196
  77. package/scripts/test/working-the-problem-traversal.bats +0 -116
  78. package/skills/capture-problem/test/capture-problem-step-1-5b-jtbd-trace.bats +0 -398
  79. package/skills/capture-problem/test/capture-problem.bats +0 -389
  80. package/skills/capture-story/test/capture-story-behavioural.bats +0 -317
  81. package/skills/capture-story-map/test/capture-story-map-behavioural.bats +0 -98
  82. package/skills/close-incident/test/close-incident-contract.bats +0 -146
  83. package/skills/link-incident/test/link-incident-contract.bats +0 -125
  84. package/skills/list-incidents/test/list-incidents-contract.bats +0 -115
  85. package/skills/list-problems/test/list-problems-contract.bats +0 -100
  86. package/skills/list-stories/test/list-stories-contract.bats +0 -127
  87. package/skills/list-story-maps/test/list-story-maps-contract.bats +0 -46
  88. package/skills/manage-incident/test/manage-incident-adr-044-contract.bats +0 -206
  89. package/skills/manage-incident/test/manage-incident-close-forwarder.bats +0 -67
  90. package/skills/manage-incident/test/manage-incident-link-forwarder.bats +0 -67
  91. package/skills/manage-incident/test/manage-incident-list-forwarder.bats +0 -68
  92. package/skills/manage-incident/test/manage-incident-mitigate-forwarder.bats +0 -66
  93. package/skills/manage-incident/test/manage-incident-restore-forwarder.bats +0 -66
  94. package/skills/manage-incident/test/manage-incident.bats +0 -171
  95. package/skills/manage-problem/test/manage-problem-adr-044-step4-derive-first.bats +0 -151
  96. package/skills/manage-problem/test/manage-problem-auto-migrate-step.bats +0 -53
  97. package/skills/manage-problem/test/manage-problem-concern-boundary.bats +0 -64
  98. package/skills/manage-problem/test/manage-problem-effort-buckets.bats +0 -56
  99. package/skills/manage-problem/test/manage-problem-external-root-cause-detection.bats +0 -119
  100. package/skills/manage-problem/test/manage-problem-first-run-intake-prompt.bats +0 -43
  101. package/skills/manage-problem/test/manage-problem-git-mv-restage-reminder.bats +0 -48
  102. package/skills/manage-problem/test/manage-problem-id-collision-guard.bats +0 -39
  103. package/skills/manage-problem/test/manage-problem-list-forwarder.bats +0 -66
  104. package/skills/manage-problem/test/manage-problem-next-id-origin-lookup.bats +0 -50
  105. package/skills/manage-problem/test/manage-problem-no-prose-options.bats +0 -74
  106. package/skills/manage-problem/test/manage-problem-output-formatting.bats +0 -30
  107. package/skills/manage-problem/test/manage-problem-parked-and-cache.bats +0 -73
  108. package/skills/manage-problem/test/manage-problem-readme-refresh-on-transition.bats +0 -62
  109. package/skills/manage-problem/test/manage-problem-readme-tie-break-order.bats +0 -318
  110. package/skills/manage-problem/test/manage-problem-readme-vq-sort-order.bats +0 -206
  111. package/skills/manage-problem/test/manage-problem-release-vehicle-seed.bats +0 -83
  112. package/skills/manage-problem/test/manage-problem-review-forwarder.bats +0 -71
  113. package/skills/manage-problem/test/manage-problem-step-9d-recovery-path.bats +0 -97
  114. package/skills/manage-problem/test/manage-problem-transition-forwarder.bats +0 -96
  115. package/skills/manage-problem/test/manage-problem-transitive-dependencies.bats +0 -365
  116. package/skills/manage-problem/test/manage-problem-verification-detection.bats +0 -64
  117. package/skills/manage-problem/test/manage-problem-verification-pending.bats +0 -114
  118. package/skills/manage-problem/test/manage-problem-work-forwarder.bats +0 -88
  119. package/skills/manage-story/test/manage-story-contract.bats +0 -174
  120. package/skills/manage-story-map/test/manage-story-map-contract.bats +0 -63
  121. package/skills/mitigate-incident/test/mitigate-incident-contract.bats +0 -258
  122. package/skills/reconcile-readme/test/reconcile-readme-contract.bats +0 -201
  123. package/skills/report-upstream/test/report-upstream-contract.bats +0 -394
  124. package/skills/restore-incident/test/restore-incident-contract.bats +0 -170
  125. package/skills/review-problems/test/inbound-channels-cache-shape.bats +0 -127
  126. package/skills/review-problems/test/inbound-discovery-contract.bats +0 -383
  127. package/skills/review-problems/test/jtbd-301-verdict-shape-contract.bats +0 -225
  128. package/skills/review-problems/test/review-problems-contract.bats +0 -235
  129. package/skills/review-problems/test/review-problems-likely-verified-cell-shape.bats +0 -229
  130. package/skills/scaffold-intake/test/scaffold-intake-contract.bats +0 -126
  131. package/skills/scaffold-intake/test/scaffold-intake-fixture.bats +0 -164
  132. package/skills/scaffold-intake/test/scaffold-intake-secrets-absent.bats +0 -87
  133. package/skills/transition-problem/test/transition-problem-contract.bats +0 -285
  134. package/skills/transition-problems/test/transition-problems-contract.bats +0 -331
  135. package/skills/update-upstream/test/update-upstream-contract.bats +0 -375
  136. package/skills/work-problem/test/work-problem-contract.bats +0 -294
  137. package/skills/work-problems/test/work-problems-above-appetite-remediation.bats +0 -139
  138. package/skills/work-problems/test/work-problems-adr-013-rule-6-p352-amendment.bats +0 -166
  139. package/skills/work-problems/test/work-problems-auto-migrate-step.bats +0 -57
  140. package/skills/work-problems/test/work-problems-cost-logging.bats +0 -109
  141. package/skills/work-problems/test/work-problems-deviation-candidate-shape.bats +0 -121
  142. package/skills/work-problems/test/work-problems-first-run-intake-prompt.bats +0 -36
  143. package/skills/work-problems/test/work-problems-inter-iteration-verify.bats +0 -59
  144. package/skills/work-problems/test/work-problems-mid-loop-userpromptsubmit-handler.bats +0 -69
  145. package/skills/work-problems/test/work-problems-no-mid-loop-asking.bats +0 -192
  146. package/skills/work-problems/test/work-problems-p341-pre-all-done-gate.bats +0 -122
  147. package/skills/work-problems/test/work-problems-p342-r007-derive-then-pass-flags.bats +0 -170
  148. package/skills/work-problems/test/work-problems-p342-retro-auto-ticket-carveout.bats +0 -120
  149. package/skills/work-problems/test/work-problems-preflight-failure-handling.bats +0 -248
  150. package/skills/work-problems/test/work-problems-preflight-session-continuity.bats +0 -139
  151. package/skills/work-problems/test/work-problems-preflight.bats +0 -69
  152. package/skills/work-problems/test/work-problems-release-cadence.bats +0 -63
  153. package/skills/work-problems/test/work-problems-step-0-iter-error-staleness.bats +0 -93
  154. package/skills/work-problems/test/work-problems-step-0b-cache-staleness-behavioural.bats +0 -138
  155. package/skills/work-problems/test/work-problems-step-0c-deferred-placeholder-staleness-behavioural.bats +0 -238
  156. package/skills/work-problems/test/work-problems-step-0d-outbound-responses-staleness-behavioural.bats +0 -174
  157. package/skills/work-problems/test/work-problems-step-2-5-routing.bats +0 -80
  158. package/skills/work-problems/test/work-problems-step-2-5b-cross-halt-routing.bats +0 -149
  159. package/skills/work-problems/test/work-problems-step-3-5-jtbd-ratification-predicate.bats +0 -191
  160. package/skills/work-problems/test/work-problems-step-5-bats-polling-discipline.bats +0 -91
  161. package/skills/work-problems/test/work-problems-step-5-delegation.bats +0 -333
  162. package/skills/work-problems/test/work-problems-step-5-idle-timeout-sigterm.bats +0 -421
  163. package/skills/work-problems/test/work-problems-step-5-is-error-transient-halt.bats +0 -278
  164. package/skills/work-problems/test/work-problems-step-5-iter-changeset-required.bats +0 -95
  165. package/skills/work-problems/test/work-problems-step-5-prompt-body-re-grounding.bats +0 -128
  166. package/skills/work-problems/test/work-problems-step-5-stream-timeout-salvage.bats +0 -251
  167. package/skills/work-problems/test/work-problems-step-6-5-always-drain.bats +0 -203
  168. package/skills/work-problems/test/work-problems-step-6-5-cache-refresh-chain.bats +0 -174
  169. package/skills/work-problems/test/work-problems-step-6-5-fix-and-continue.bats +0 -254
  170. package/skills/work-problems/test/work-problems-step-6-5-postrelease-kv-callback.bats +0 -209
  171. package/skills/work-problems/test/work-problems-stop-condition-questions.bats +0 -85
@@ -1,59 +0,0 @@
1
- #!/usr/bin/env bats
2
- # Doc-lint guard: work-problems SKILL.md must include an inter-iteration
3
- # verification check (P036). After each subagent returns, the orchestrator
4
- # must verify via `git status --porcelain` that the tree is clean (or
5
- # dirty for a known deliberate reason) before spawning the next iteration.
6
- #
7
- # Structural assertion — Permitted Exception to the source-grep ban
8
- # (ADR-005 / P011). Asserts the skill specification document contains the
9
- # inter-iteration check so a silent subagent commit failure cannot
10
- # compound across iterations.
11
- #
12
- # Cross-reference:
13
- # P036 (work-problems orchestrator does not verify commit-landing between iterations)
14
- # P035 (commit-gate fallback, the primary mitigation this backstops)
15
- # @jtbd JTBD-006 (progress the backlog while I'm away)
16
-
17
- setup() {
18
- SKILL_DIR="$(cd "$(dirname "$BATS_TEST_FILENAME")/.." && pwd)"
19
- SKILL_FILE="${SKILL_DIR}/SKILL.md"
20
- }
21
-
22
- @test "SKILL.md cites P036 (inter-iteration verification)" {
23
- run grep -n "P036" "$SKILL_FILE"
24
- [ "$status" -eq 0 ]
25
- }
26
-
27
- @test "SKILL.md has an inter-iteration verification step (after commit, before next iteration)" {
28
- # The step should appear between the commit/release-cadence step and
29
- # the "Step 7: Loop" section, with a recognisable heading.
30
- run grep -niE "inter-iteration verification|verif.*iteration|post-iteration verif" "$SKILL_FILE"
31
- [ "$status" -eq 0 ]
32
- }
33
-
34
- @test "SKILL.md inter-iteration check uses git status --porcelain" {
35
- run grep -n "git status --porcelain" "$SKILL_FILE"
36
- [ "$status" -eq 0 ]
37
- }
38
-
39
- @test "SKILL.md inter-iteration check halts the loop on unexpected dirty state" {
40
- # Must describe halting / stopping when the tree is dirty without a
41
- # known-deliberate reason.
42
- run grep -niE "halt|stop the loop|dirty.*(halt|stop|block)|uncommitted.*(halt|stop|block|detected)" "$SKILL_FILE"
43
- [ "$status" -eq 0 ]
44
- }
45
-
46
- @test "SKILL.md inter-iteration check distinguishes clean tree from deliberate dirty state" {
47
- # Not all dirty states are errors — e.g. a governance doc transition
48
- # the subagent deliberately left for the next iteration to pick up.
49
- # The check should permit a documented dirty state and halt on an
50
- # undocumented one.
51
- run grep -niE "deliberate|known reason|expected|documented.*dirty|known.*dirty" "$SKILL_FILE"
52
- [ "$status" -eq 0 ]
53
- }
54
-
55
- @test "SKILL.md Non-Interactive Decision Making table covers unexpected dirty state" {
56
- # AFK mode: inter-iteration dirty state should have a default action.
57
- run grep -niE "inter[- ]iteration|unexpected dirty" "$SKILL_FILE"
58
- [ "$status" -eq 0 ]
59
- }
@@ -1,69 +0,0 @@
1
- #!/usr/bin/env bats
2
- #
3
- # packages/itil/skills/work-problems/test/work-problems-mid-loop-userpromptsubmit-handler.bats
4
- #
5
- # Behavioural tests for the mid-loop UserPromptSubmit handler contract
6
- # (P135 Phase 3 / R4 / ADR-044). The explicit corrective for the
7
- # 2026-04-27 iter-9-killed overcorrection.
8
- #
9
- # When the orchestrator receives a user message DURING an iter, the
10
- # in-flight iter MUST complete naturally to its ITERATION_SUMMARY
11
- # emission BEFORE the orchestrator surfaces the queue + new direction.
12
- # Killing the iter mid-flight (SIGTERM the iter PID) is forbidden —
13
- # it wastes in-flight work and breaks the iter subprocess contract.
14
- #
15
- # tdd-review: structural-permitted (justification: skill behavioural
16
- # harness pending P012 + P081 Phase 2; SKILL.md contract assertions
17
- # bridge until then; expected to migrate to behavioural form once the
18
- # harness exists)
19
- #
20
- # @problem P135 Phase 3 R4
21
- # @adr ADR-044 (Decision-Delegation Contract — mid-loop interrupt handling)
22
- # @adr ADR-032 (subprocess-boundary contract; iter completes naturally)
23
- # @adr ADR-005 / ADR-037 (testing strategy — bridge during harness build)
24
- # @jtbd JTBD-006 (AFK orchestrator must respect in-flight iter)
25
-
26
- SKILL_FILE="${BATS_TEST_DIRNAME}/../SKILL.md"
27
-
28
- setup() {
29
- [ -f "$SKILL_FILE" ]
30
- }
31
-
32
- # ── Mid-loop UserPromptSubmit handler contract ──────────────────────────────
33
-
34
- @test "SKILL.md documents mid-loop UserPromptSubmit handler (P135 Phase 3 R4)" {
35
- run grep -F "Mid-loop UserPromptSubmit handling" "$SKILL_FILE"
36
- [ "$status" -eq 0 ]
37
- }
38
-
39
- @test "SKILL.md mid-loop handler clause MUST let the in-flight iter complete naturally to ITERATION_SUMMARY emission" {
40
- run grep -F "complete naturally to its" "$SKILL_FILE"
41
- [ "$status" -eq 0 ]
42
- [[ "$output" == *"ITERATION_SUMMARY"* ]]
43
- }
44
-
45
- @test "SKILL.md mid-loop handler clause forbids SIGTERM to the iter PID" {
46
- run grep -F "no SIGTERM to the iter PID" "$SKILL_FILE"
47
- [ "$status" -eq 0 ]
48
- }
49
-
50
- @test "SKILL.md mid-loop handler clause forbids killing iter mid-flight" {
51
- run grep -F "Do NOT abort the iter mid-flight" "$SKILL_FILE"
52
- [ "$status" -eq 0 ]
53
- }
54
-
55
- @test "SKILL.md cites the 2026-04-27 iter-9-killed overcorrection as the corrective precedent" {
56
- run grep -F "iter-9-killed overcorrection" "$SKILL_FILE"
57
- [ "$status" -eq 0 ]
58
- }
59
-
60
- @test "SKILL.md mid-loop handler surfaces the queue + new direction together AFTER iter completes" {
61
- run grep -F "surfaces the queue + the new direction together" "$SKILL_FILE"
62
- [ "$status" -eq 0 ]
63
- }
64
-
65
- @test "SKILL.md cites the ~$5 + 25 min wasted-work cost as the loss measurement for the corrective" {
66
- # Concrete cost citation per ADR-026 grounding
67
- run grep -F "$5 + 25 min" "$SKILL_FILE"
68
- [ "$status" -eq 0 ]
69
- }
@@ -1,192 +0,0 @@
1
- #!/usr/bin/env bats
2
-
3
- # P130: /wr-itil:work-problems orchestrator must NOT call AskUserQuestion
4
- # mid-loop. The loop's purpose is progress + accumulation; user-interaction
5
- # is reserved for framework-prescribed halt points (Step 0, Step 2.5/2.5b,
6
- # Step 6.5 Rule 5 + CI-failure, Step 6.75 dirty-unknown). The user is
7
- # transient — presence-detection is unreliable and is not the goal; the
8
- # orchestrator must accumulate questions and surface them at halt points.
9
- #
10
- # Per the user's reframe (ticket P130 lines 95-123), the original dual-mode
11
- # dispatch fix-shape was rejected. The fix is SKILL.md prose discipline:
12
- # enumerate the framework-prescribed halt points + assert no mid-iter asks
13
- # elsewhere + state the accumulated-question discipline (direction-setting
14
- # only; no BUFD; no questions answerable by research/exploration/
15
- # experimentation).
16
- #
17
- # Doc-lint contract assertions per ADR-037 Permitted Exception (structural
18
- # checks on prose contract, sibling shape with P126 / P135 fixtures).
19
- #
20
- # @problem P130
21
- # @adr ADR-044 (Decision-Delegation Contract — framework-resolution boundary)
22
- # @adr ADR-013 Rule 1 (as amended by ADR-044) + Rule 6 (non-interactive fail-safe)
23
- # @adr ADR-032 (subprocess-boundary contract — unchanged)
24
- # @adr ADR-037 (skill-testing-strategy — Permitted Exception for prose contract)
25
- # @jtbd JTBD-006 (Progress the Backlog While I'm Away)
26
- # @jtbd JTBD-001 (Enforce Governance Without Slowing Down)
27
-
28
- setup() {
29
- REPO_ROOT="$(cd "$(dirname "$BATS_TEST_FILENAME")/../../../../.." && pwd)"
30
- SKILL_MD="$REPO_ROOT/packages/itil/skills/work-problems/SKILL.md"
31
- }
32
-
33
- @test "work-problems P130: SKILL.md exists" {
34
- [ -f "$SKILL_MD" ]
35
- }
36
-
37
- # ── Mid-loop ask discipline subsection presence ─────────────────────────────
38
-
39
- @test "work-problems P130: SKILL.md names a 'Mid-loop ask discipline' subsection (orchestrator main turn)" {
40
- # The architect-approved placement is inside Non-Interactive Decision
41
- # Making section as a subsection. The heading must exist as a navigable
42
- # markdown anchor so cross-references resolve.
43
- run grep -nE '^#{3,4} Mid-loop ask discipline' "$SKILL_MD"
44
- [ "$status" -eq 0 ]
45
- }
46
-
47
- @test "work-problems P130: subsection scopes itself to the orchestrator main turn (not the subprocess)" {
48
- # The subprocess-layer constraint (Step 5's iteration-prompt body)
49
- # already exists; this subsection is the orchestrator-main-turn
50
- # equivalent. The scope must be explicit so future readers do not
51
- # confuse the layers.
52
- run grep -nE 'orchestrator main turn|orchestrator.s main turn' "$SKILL_MD"
53
- [ "$status" -eq 0 ]
54
- }
55
-
56
- # ── Core invariant: no mid-iter AskUserQuestion ─────────────────────────────
57
-
58
- @test "work-problems P130: subsection asserts no mid-loop AskUserQuestion between iters except at framework halts" {
59
- # The load-bearing rule. The orchestrator must NOT call AskUserQuestion
60
- # between iterations EXCEPT at the framework-prescribed halt points.
61
- run grep -nE 'MUST NOT call .?AskUserQuestion.? between iter' "$SKILL_MD"
62
- [ "$status" -eq 0 ]
63
- }
64
-
65
- @test "work-problems P130: subsection cites the loop's purpose as progress + accumulation" {
66
- # The reframed direction (ticket lines 95-123): the loop's purpose is
67
- # progress + accumulation, not interactive-vs-AFK routing. This phrasing
68
- # must appear so future authors do not re-introduce mid-loop asks under
69
- # 'the user might be present' rationalisations.
70
- run grep -nE 'progress \+ accumulation|progress and accumulation' "$SKILL_MD"
71
- [ "$status" -eq 0 ]
72
- }
73
-
74
- @test "work-problems P130: subsection states presence-detection is unreliable and not the goal" {
75
- # The transient-user framing. Without this, future authors may try to
76
- # add presence-detection (the originally-rejected fix-shape).
77
- run grep -nE 'presence[- ]detection is unreliable|presence is unreliable|user as transient|treat the user as transient' "$SKILL_MD"
78
- [ "$status" -eq 0 ]
79
- }
80
-
81
- # ── Halt-point enumeration ──────────────────────────────────────────────────
82
-
83
- @test "work-problems P130: subsection enumerates Step 0 session-continuity as a permitted halt point" {
84
- run grep -nE 'Step 0.*session[- ]continuity' "$SKILL_MD"
85
- [ "$status" -eq 0 ]
86
- }
87
-
88
- @test "work-problems P130: subsection enumerates Step 2.5 / 2.5b loop-end emit as a permitted halt point" {
89
- run grep -nE 'Step 2\.5.*loop[- ]end|Step 2\.5b' "$SKILL_MD"
90
- [ "$status" -eq 0 ]
91
- }
92
-
93
- @test "work-problems P130: subsection enumerates Step 6.5 above-appetite Rule 5 halt as a permitted halt point" {
94
- run grep -nE 'Step 6\.5.*Rule 5|above[- ]appetite Rule 5' "$SKILL_MD"
95
- [ "$status" -eq 0 ]
96
- }
97
-
98
- @test "work-problems P130: subsection enumerates Step 6.75 dirty-for-unknown-reason as a permitted halt point" {
99
- run grep -nE 'Step 6\.75.*dirty[- ]for[- ]unknown|Step 6\.75.*unknown reason' "$SKILL_MD"
100
- [ "$status" -eq 0 ]
101
- }
102
-
103
- # ── Accumulated-question discipline at surface time ─────────────────────────
104
-
105
- @test "work-problems P130: subsection states direction-setting only at surface time" {
106
- # ADR-044's six-class taxonomy: only the user-answerable categories
107
- # qualify. Direction-setting is the canonical example.
108
- run grep -nE 'Direction[- ]setting only|direction[- ]setting only' "$SKILL_MD"
109
- [ "$status" -eq 0 ]
110
- }
111
-
112
- @test "work-problems P130: subsection forbids BUFD-style questions" {
113
- # No big-design-up-front; small actionable questions. Anti-BUFD is a
114
- # project-wide value (cited in ADR-044's anti-BUFD-for-framework-
115
- # evolution clause).
116
- run grep -nE 'No BUFD|no BUFD' "$SKILL_MD"
117
- [ "$status" -eq 0 ]
118
- }
119
-
120
- @test "work-problems P130: subsection forbids questions answerable by research / exploration / experimentation" {
121
- # The agent should investigate itself rather than sub-contract routine
122
- # work back to the user.
123
- run grep -nE 'research.*exploration.*experimentation|prototype.*read code.*experiments' "$SKILL_MD"
124
- [ "$status" -eq 0 ]
125
- }
126
-
127
- # ── ADR citations ──────────────────────────────────────────────────────────
128
-
129
- @test "work-problems P130: subsection cites ADR-044 (primary) as the framework-resolution authority" {
130
- # ADR-044 is the parent decision narrowing ADR-013 Rule 1 to framework-
131
- # unresolved decisions. The subsection must cite it so future readers
132
- # follow the cross-reference for the full picture.
133
- run grep -nE 'ADR-044' "$SKILL_MD"
134
- [ "$status" -eq 0 ]
135
- }
136
-
137
- @test "work-problems P130: subsection cites ADR-013 Rule 1 as amended by ADR-044" {
138
- # The narrowing happens at ADR-013 Rule 1's amendment. The subsection
139
- # must name the rule so the chain is traceable.
140
- run grep -nE 'ADR-013.*Rule 1|Rule 1.*amended by ADR-044' "$SKILL_MD"
141
- [ "$status" -eq 0 ]
142
- }
143
-
144
- @test "work-problems P130: subsection cites ADR-013 Rule 6 as the non-interactive fail-safe underlying constraint" {
145
- # When AFK, Rule 6 is the underlying constraint that forbids
146
- # AskUserQuestion. The subsection cites it so the subprocess-boundary
147
- # connection is explicit.
148
- run grep -nE 'ADR-013.*Rule 6|Rule 6.*non[- ]interactive fail[- ]safe' "$SKILL_MD"
149
- [ "$status" -eq 0 ]
150
- }
151
-
152
- # ── ADR-032 subprocess-boundary unchanged ──────────────────────────────────
153
-
154
- @test "work-problems P130: subsection cross-references ADR-032 subprocess-boundary contract as unchanged" {
155
- # The architect's flag: this fix does NOT amend ADR-032. The subsection
156
- # must say so explicitly to prevent future readers thinking the
157
- # subprocess-boundary contract is in scope.
158
- run grep -nE 'subprocess[- ]boundary contract.*unchanged|ADR-032.*unchanged' "$SKILL_MD"
159
- [ "$status" -eq 0 ]
160
- }
161
-
162
- # ── Subprocess vs orchestrator layer cross-reference ───────────────────────
163
-
164
- @test "work-problems P130: subsection cross-references Step 5's per-subprocess constraint as the parallel layer" {
165
- # The orchestrator-main-turn discipline parallels Step 5's iteration-
166
- # prompt-body 'Do not call AskUserQuestion' constraint. Both layers
167
- # together enforce the discipline end-to-end.
168
- run grep -nE "Step 5.*iteration[- ]prompt.*AskUserQuestion|Step 5's iteration[- ]prompt" "$SKILL_MD"
169
- [ "$status" -eq 0 ]
170
- }
171
-
172
- # ── Step 5's iteration-prompt body augmented with transient-user framing ───
173
-
174
- @test "work-problems P130: Step 5 iteration-prompt body includes transient-user framing" {
175
- # The reframed direction's core insight: the user is transient even
176
- # when present. The iteration-prompt body (already-existing
177
- # 'NEVER call AskUserQuestion mid-loop in AFK') gains the transient
178
- # framing so future iter authors understand why the constraint is
179
- # absolute.
180
- run grep -nE 'transient|disappear for hours' "$SKILL_MD"
181
- [ "$status" -eq 0 ]
182
- }
183
-
184
- # ── Decision Table row reflects the discipline ─────────────────────────────
185
-
186
- @test "work-problems P130: Non-Interactive Decision Making table carries a row for mid-loop ask discipline" {
187
- # The decisions table (line ~487) summarises the orchestrator's
188
- # non-interactive defaults. A row naming mid-loop ask discipline keeps
189
- # the table consistent with the new subsection.
190
- run grep -nE '\| Mid-loop ask|mid[- ]loop AskUserQuestion|mid-loop ask between iter' "$SKILL_MD"
191
- [ "$status" -eq 0 ]
192
- }
@@ -1,122 +0,0 @@
1
- #!/usr/bin/env bats
2
-
3
- # P341: work-problems SKILL must surface outstanding questions THEN run
4
- # a session-level retro BEFORE emitting ALL_DONE. The fix shape adds a
5
- # new step (Step 2.4 — Pre-ALL_DONE gate sequence) that fires
6
- # UNCONDITIONALLY before ALL_DONE emit, sequencing (a) outstanding-
7
- # questions surface + (b) session-level retro + (c) ALL_DONE.
8
- #
9
- # Hard-fail mode: if either gate cannot complete (user not present and
10
- # queue has user-input-required entries, retro fails), the SKILL.md MUST
11
- # direct the orchestrator to halt with a clear directive — NOT emit
12
- # ALL_DONE.
13
- #
14
- # Doc-lint contract assertions per ADR-037 Permitted Exception
15
- # (structural checks on prose contract; behavioural harness for SKILL.md
16
- # pending P081 Phase 2 / P012).
17
- #
18
- # @problem P341
19
- # @adr ADR-044 (Decision-Delegation Contract — direction-class observations are the protected surface this gate enforces)
20
- # @adr ADR-013 (structured user interaction — outstanding-questions surface is the load-bearing application)
21
- # @adr ADR-014 (governance skills commit own work — retro commits its own work)
22
- # @adr ADR-037 (skill-testing-strategy — Permitted Exception for prose contract)
23
- # @jtbd JTBD-006 (Progress the Backlog While I'm Away)
24
- # @jtbd JTBD-201 (audit-trail — ALL_DONE is honest sentinel post-amendment)
25
-
26
- setup() {
27
- REPO_ROOT="$(cd "$(dirname "$BATS_TEST_FILENAME")/../../../../.." && pwd)"
28
- SKILL_MD="$REPO_ROOT/packages/itil/skills/work-problems/SKILL.md"
29
- }
30
-
31
- @test "work-problems P341: SKILL.md exists" {
32
- [ -f "$SKILL_MD" ]
33
- }
34
-
35
- # ── Step 2.4 (or named equivalent) gate-sequence subsection presence ────────
36
-
37
- @test "work-problems P341: SKILL.md names a Pre-ALL_DONE gate sequence step" {
38
- # The fix adds a new orchestrator-main-turn step that fires
39
- # UNCONDITIONALLY before ALL_DONE emit. The step MUST be a markdown
40
- # heading so cross-references resolve to a single source of truth.
41
- run grep -nE '^#{3,4} Step 2\.4|Pre-`?ALL_DONE`? gate sequence' "$SKILL_MD"
42
- [ "$status" -eq 0 ]
43
- }
44
-
45
- @test "work-problems P341: gate-sequence step is unconditional (fires before every ALL_DONE emit)" {
46
- # The structural gap P341 closes is that Step 2.5 fires conditionally
47
- # on stop-condition #2. The new step fires UNCONDITIONALLY before
48
- # ALL_DONE emit regardless of stop-condition.
49
- run grep -nE 'unconditionally|UNCONDITIONAL|every `?ALL_DONE`? emit|before every `?ALL_DONE`?' "$SKILL_MD"
50
- [ "$status" -eq 0 ]
51
- }
52
-
53
- @test "work-problems P341: gate-sequence names outstanding-questions surface as gate (a)" {
54
- # Sequence (a): Read .afk-run-state/outstanding-questions.jsonl; if
55
- # non-empty, fire Step 2.5b's surfacing routine; truncate on completion.
56
- run grep -nE 'outstanding-questions\.jsonl|outstanding-questions surface|Step 2\.5b.*surfacing' "$SKILL_MD"
57
- [ "$status" -eq 0 ]
58
- }
59
-
60
- @test "work-problems P341: gate-sequence names session-level retro as gate (b)" {
61
- # Sequence (b): Run session-level retro via /wr-retrospective:run-retro
62
- # — covers cross-iter patterns, friction observations, framework-
63
- # improvement candidates. Retro commits its own work per ADR-014.
64
- run grep -nE 'session-level retro|/wr-retrospective:run-retro' "$SKILL_MD"
65
- [ "$status" -eq 0 ]
66
- }
67
-
68
- @test "work-problems P341: gate-sequence names ALL_DONE emit as gate (c) ONLY after (a) and (b)" {
69
- # Sequence (c): Emit ALL_DONE ONLY after both (a) and (b) complete.
70
- # The ordering must be explicit so future authors don't re-permit a
71
- # short-circuit.
72
- run grep -nE 'ALL_DONE.*after.*both|ONLY after.*(a).*(b)|Emit `?ALL_DONE`? ONLY' "$SKILL_MD"
73
- [ "$status" -eq 0 ]
74
- }
75
-
76
- # ── Hard-fail mode (halt instead of ALL_DONE) ──────────────────────────────
77
-
78
- @test "work-problems P341: gate-sequence directs halt-with-directive when either gate cannot complete" {
79
- # Hard-fail mode: if outstanding-questions surface cannot complete OR
80
- # retro fails, the SKILL.md MUST direct the orchestrator to halt with a
81
- # clear directive — NOT emit ALL_DONE. Halt is recoverable; user
82
- # returns, surfaces, completes the loop with ALL_DONE.
83
- run grep -nE 'halt with.*directive|MUST.*halt.*NOT emit|halt instead of.*ALL_DONE|halt.*not.*ALL_DONE' "$SKILL_MD"
84
- [ "$status" -eq 0 ]
85
- }
86
-
87
- @test "work-problems P341: gate-sequence mentions ADR-014 commit-ownership for retro work" {
88
- # Retro commits its own work per ADR-014 — the orchestrator MUST NOT
89
- # re-commit retro's output, AND retro is not silently dropped because
90
- # the orchestrator forgot to invoke it.
91
- run grep -nE 'retro commits its own work|run-retro.*ADR-014|retro.*per ADR-014' "$SKILL_MD"
92
- [ "$status" -eq 0 ]
93
- }
94
-
95
- # ── Output Format ALL_DONE positioning ──────────────────────────────────────
96
-
97
- @test "work-problems P341: Output Format section reflects new ALL_DONE sequence" {
98
- # The Output Format section MUST reference the gate sequence so the
99
- # rendered ALL_DONE position is documented to follow Step 2.4. This
100
- # protects against future authors who add new sections between the
101
- # gate sequence and the ALL_DONE marker.
102
- run grep -nE 'Step 2\.4|gate sequence|Pre-`?ALL_DONE`? gate' "$SKILL_MD"
103
- [ "$status" -eq 0 ]
104
- }
105
-
106
- # ── Decision Table row (cross-reference to gate sequence) ───────────────────
107
-
108
- @test "work-problems P341: Non-Interactive Decision Making table carries a pre-ALL_DONE gate row" {
109
- # The decisions table at the bottom of SKILL.md must carry a row that
110
- # names the pre-ALL_DONE gate sequence so the decision summary is
111
- # consistent with the Step prose. This prevents future readers from
112
- # missing the gate when scanning the decisions table only.
113
- run grep -nE '\| Pre-`?ALL_DONE`? gate|\| ALL_DONE.*gate sequence|\| Loop-end.*gate sequence' "$SKILL_MD"
114
- [ "$status" -eq 0 ]
115
- }
116
-
117
- # ── Cross-reference to P341 + sibling P342 ──────────────────────────────────
118
-
119
- @test "work-problems P341: Related section cites P341 as the originating ticket" {
120
- run grep -nE '\*\*P341\*\*|P341\b' "$SKILL_MD"
121
- [ "$status" -eq 0 ]
122
- }
@@ -1,170 +0,0 @@
1
- #!/usr/bin/env bats
2
-
3
- # R007 paired-capability gap (post-commit 54ecf83 — ADR-060 Amendment
4
- # 2026-06-02 + I12 derive-then-ratify in capture-problem):
5
- #
6
- # The P342 mechanical-stage carve-out at Step 5 iter-prompt authorises
7
- # retro-surfaced recurring class-of-behaviour observations to auto-ticket
8
- # via `/wr-itil:capture-problem`. The new capture-problem contract
9
- # requires AFK callers (iter subprocesses) to pre-resolve persona + JTBD
10
- # via `--no-prompt --persona=<value> --jtbd=JTBD-NNN` flags, OR capture
11
- # halts-with-stderr-directive. The halt stderr is unobservable to the
12
- # AFK user — silent loop-stall.
13
- #
14
- # The fix shape amends the work-problems Step 5 iter-prompt body's P342
15
- # classification taxonomy bullet for "Recurring class-of-behaviour":
16
- # - Derive persona from iter context; default `developer` on ambiguity.
17
- # - Validate persona against the enum
18
- # `{developer | tech-lead | plugin-developer | plugin-user}` before
19
- # dispatch.
20
- # - Derive JTBD from iter context. Cite JTBD-006 (AFK-loop-continuity),
21
- # JTBD-001 (governance), JTBD-101 (plugin-developer).
22
- # - Dispatch shape:
23
- # /wr-itil:capture-problem --no-prompt --persona=<derived>
24
- # --jtbd=<derived> "<description>"
25
- # - On genuine derive-failure (cannot cleanly resolve, invalid enum):
26
- # route to outstanding_questions, NOT capture-problem dispatch.
27
- #
28
- # Doc-lint contract assertions per ADR-037 Permitted Exception.
29
- #
30
- # @problem P342 (originating mechanical-stage carve-out)
31
- # @problem P078 (capture-on-correction; sibling caller for the same dispatch)
32
- # @adr ADR-060 Amendment 2026-06-02 (I12 derive-then-ratify)
33
- # @adr ADR-044 (Decision-Delegation Contract — silent-framework cat 4 on
34
- # derive-success; direction cat 1 on outstanding_questions route)
35
- # @adr ADR-014 (single-commit grain — SKILL + bats + changeset)
36
- # @jtbd JTBD-006 (Progress the Backlog While I'm Away — audit-trail outcome:
37
- # halt-with-stderr in iter is invisible to AFK user; route to
38
- # outstanding_questions or pre-resolve flags to preserve trail)
39
-
40
- setup() {
41
- REPO_ROOT="$(cd "$(dirname "$BATS_TEST_FILENAME")/../../../../.." && pwd)"
42
- SKILL_MD="$REPO_ROOT/packages/itil/skills/work-problems/SKILL.md"
43
- }
44
-
45
- @test "work-problems R007: SKILL.md exists" {
46
- [ -f "$SKILL_MD" ]
47
- }
48
-
49
- # ── Dispatch shape: --no-prompt + --persona + --jtbd flags ─────────────────
50
-
51
- @test "work-problems R007: iter-prompt dispatch shape names --no-prompt flag" {
52
- # AFK-mode marker. Without --no-prompt, capture-problem's I12 derive-
53
- # then-ratify AskUserQuestion fallback could fire inside the iter
54
- # subprocess where the user is absent.
55
- run grep -nE '\-\-no-prompt' "$SKILL_MD"
56
- [ "$status" -eq 0 ]
57
- }
58
-
59
- @test "work-problems R007: iter-prompt dispatch shape names --persona flag" {
60
- # Pre-resolves persona to silent-proceed path. Required by capture-
61
- # problem SKILL.md Step 1.5b silent-framework branch.
62
- run grep -nE '\-\-persona=' "$SKILL_MD"
63
- [ "$status" -eq 0 ]
64
- }
65
-
66
- @test "work-problems R007: iter-prompt dispatch shape names --jtbd flag" {
67
- # Pre-resolves JTBD-trace to silent-proceed path.
68
- run grep -nE '\-\-jtbd=' "$SKILL_MD"
69
- [ "$status" -eq 0 ]
70
- }
71
-
72
- @test "work-problems R007: iter-prompt cites I12 derive-then-ratify contract authority" {
73
- # The dispatch contract's upstream authority is ADR-060 Amendment
74
- # 2026-06-02 + I12 derive-then-ratify. Cite so future authors don't
75
- # drift on the rationale.
76
- run grep -nE 'I12 derive-then-ratify|derive-then-ratify.*ADR-060|ADR-060 Amendment 2026-06-02' "$SKILL_MD"
77
- [ "$status" -eq 0 ]
78
- }
79
-
80
- @test "work-problems R007: iter-prompt cites R007 paired-capability gap" {
81
- # R007 names the gap this amendment closes. Cited so the iter-prompt
82
- # ties back to the originating risk-register entry.
83
- run grep -nE 'R007.*paired-capability|paired-capability.*R007|R007 paired-capability gap' "$SKILL_MD"
84
- [ "$status" -eq 0 ]
85
- }
86
-
87
- # ── Persona derivation contract ────────────────────────────────────────────
88
-
89
- @test "work-problems R007: iter-prompt derives persona from iter context" {
90
- # Derive-don't-ask: persona signals come from the ticket the iter
91
- # is dispatched against (Origin + RFC + story trace).
92
- run grep -nE 'derive persona|Persona derivation' "$SKILL_MD"
93
- [ "$status" -eq 0 ]
94
- }
95
-
96
- @test "work-problems R007: iter-prompt defaults persona to developer on ambiguity" {
97
- # Default chosen per JTBD-006 + dominant-persona in this monorepo.
98
- run grep -nE 'Default to .?developer.?|default to .?developer.? if|default to .?developer.? when' "$SKILL_MD"
99
- [ "$status" -eq 0 ]
100
- }
101
-
102
- @test "work-problems R007: iter-prompt names the persona enum for pre-dispatch validation" {
103
- # capture-problem halts-with-directive on invalid --persona= value
104
- # (SKILL.md Step 1.5b). Iter must validate against the enum BEFORE
105
- # dispatch, or fall through to outstanding_questions.
106
- run grep -nE 'developer.*tech-lead.*plugin-developer.*plugin-user|persona enum' "$SKILL_MD"
107
- [ "$status" -eq 0 ]
108
- }
109
-
110
- # ── JTBD derivation contract ───────────────────────────────────────────────
111
-
112
- @test "work-problems R007: iter-prompt derives JTBD from iter context" {
113
- # Derive-don't-ask: JTBD signals come from iter-prompt content.
114
- run grep -nE 'derive.*JTBD|JTBD derivation' "$SKILL_MD"
115
- [ "$status" -eq 0 ]
116
- }
117
-
118
- @test "work-problems R007: iter-prompt cites JTBD-006 for AFK-loop-continuity contexts" {
119
- run grep -nE 'JTBD-006.*AFK|AFK.*JTBD-006|JTBD-006.*loop-continuity|JTBD-006.*iter-dispatch' "$SKILL_MD"
120
- [ "$status" -eq 0 ]
121
- }
122
-
123
- @test "work-problems R007: iter-prompt cites JTBD-001 for governance contexts" {
124
- run grep -nE 'JTBD-001.*governance|governance.*JTBD-001|JTBD-001.*ADR|JTBD-001.*decision' "$SKILL_MD"
125
- [ "$status" -eq 0 ]
126
- }
127
-
128
- @test "work-problems R007: iter-prompt cites JTBD-101 for plugin-developer contexts" {
129
- run grep -nE 'JTBD-101.*plugin|plugin.*JTBD-101|JTBD-101.*discoverability|JTBD-101.*suite-extension' "$SKILL_MD"
130
- [ "$status" -eq 0 ]
131
- }
132
-
133
- # ── Fall-through to outstanding_questions on derive-failure ────────────────
134
-
135
- @test "work-problems R007: iter-prompt routes genuinely-ambiguous derivation to outstanding_questions" {
136
- # Architect AMEND closed: when derivation cannot cleanly resolve (or
137
- # persona fails enum validation), do NOT invoke capture-problem with
138
- # a bad value (would halt-with-stderr-directive into unobservable iter
139
- # subprocess stderr); instead, queue for orchestrator main-turn Step
140
- # 2.5 surfacing.
141
- run grep -nE 'Genuinely-ambiguous|cannot pick persona/JTBD cleanly|fall through to .?outstanding_questions' "$SKILL_MD"
142
- [ "$status" -eq 0 ]
143
- }
144
-
145
- @test "work-problems R007: iter-prompt names the unobservable-stderr failure mode" {
146
- # Documents WHY the dispatch contract matters: the halt stderr does
147
- # not surface to the AFK user; the loop silently stalls. JTBD-006
148
- # audit-trail violation framing.
149
- run grep -nE 'stderr is unobservable|unobservable.*stderr|silent loop-stall|halt stderr' "$SKILL_MD"
150
- [ "$status" -eq 0 ]
151
- }
152
-
153
- # ── Composition with the existing P342 carve-out ───────────────────────────
154
-
155
- @test "work-problems R007: amendment preserves the P342 mechanical-stage carve-out framing" {
156
- # The R007 fix is ADDITIVE — it carries the new dispatch shape into
157
- # the existing Recurring-class auto-ticket bullet. The P342 carve-out
158
- # itself (mechanical-stage / Step 4a precedent / ADR-013 Rule 5)
159
- # remains the authority for auto-ticketing at all.
160
- run grep -nE 'mechanical-stage carve-out|policy-authorised silent proceed' "$SKILL_MD"
161
- [ "$status" -eq 0 ]
162
- }
163
-
164
- @test "work-problems R007: Ambiguous bullet reuses the persona+JTBD derivation contract" {
165
- # The Ambiguous-classification default-to-auto-ticket path also goes
166
- # through the new dispatch contract (same flag-resolution discipline);
167
- # otherwise the Ambiguous branch becomes a halt vector.
168
- run grep -nE 'same persona \+ JTBD derivation contract|using the same persona \+ JTBD derivation' "$SKILL_MD"
169
- [ "$status" -eq 0 ]
170
- }