@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.
- package/.claude-plugin/plugin.json +1 -1
- package/package.json +7 -2
- package/agents/test/fixtures/proceed-new-genuinely-new.md +0 -43
- package/agents/test/fixtures/proceed-new-subtle-sibling.md +0 -47
- package/agents/test/fixtures/regression-p347-vs-p346.md +0 -54
- package/agents/test/hang-off-check.bats +0 -225
- package/hooks/test/block-list.bats +0 -153
- package/hooks/test/command-detect.bats +0 -181
- package/hooks/test/itil-assistant-output-gate.bats +0 -114
- package/hooks/test/itil-assistant-output-review.bats +0 -224
- package/hooks/test/itil-bash-polling-antipattern-detect.bats +0 -154
- package/hooks/test/itil-changeset-discipline.bats +0 -603
- package/hooks/test/itil-claude-space-protection.bats +0 -294
- package/hooks/test/itil-commit-trailer-transition-advisory.bats +0 -80
- package/hooks/test/itil-correction-detect.bats +0 -189
- package/hooks/test/itil-deferral-cadence-gate.bats +0 -187
- package/hooks/test/itil-fictional-defer-detect.bats +0 -292
- package/hooks/test/itil-fix-title-lifecycle-advisory.bats +0 -129
- package/hooks/test/itil-mid-loop-ask-detect.bats +0 -220
- package/hooks/test/itil-no-implement-draft-gate.bats +0 -210
- package/hooks/test/itil-pending-questions-surface.bats +0 -307
- package/hooks/test/itil-readme-refresh-discipline.bats +0 -642
- package/hooks/test/itil-rfc-oversight-nudge.bats +0 -83
- package/hooks/test/itil-rfc-trailer-advisory.bats +0 -375
- package/hooks/test/itil-story-mirror-migration-nudge.bats +0 -122
- package/hooks/test/manage-problem-enforce-create.bats +0 -424
- package/hooks/test/p057-staging-trap-detect.bats +0 -231
- package/hooks/test/pre-publish-intake-gate.bats +0 -144
- package/hooks/test/runtime-sid-marker.bats +0 -90
- package/hooks/test/session-id.bats +0 -370
- package/scripts/migrate-problems-add-type.sh +0 -116
- package/scripts/test/catchup-scan.bats +0 -274
- package/scripts/test/check-afk-accept-eligible.bats +0 -310
- package/scripts/test/check-fail-soft-skip-discipline.bats +0 -172
- package/scripts/test/check-fix-rfc-trace.bats +0 -164
- package/scripts/test/check-locale-discipline.bats +0 -291
- package/scripts/test/check-problems-readme-budget.bats +0 -192
- package/scripts/test/check-rfc-has-stories.bats +0 -69
- package/scripts/test/check-rfc-rejected-alternatives.bats +0 -108
- package/scripts/test/check-rfc-stories-ratified.bats +0 -82
- package/scripts/test/check-upstream-responses.bats +0 -503
- package/scripts/test/classify-readme-drift.bats +0 -392
- package/scripts/test/derive-first-dispatch.bats +0 -274
- package/scripts/test/derive-release-vehicle.bats +0 -454
- package/scripts/test/detect-unratified-stories-maps.bats +0 -60
- package/scripts/test/dual-tolerant-glob-rfc-002-t2.bats +0 -309
- package/scripts/test/effort-tally.bats +0 -170
- package/scripts/test/evaluate-relevance.bats +0 -773
- package/scripts/test/kind-a-commands.bats +0 -46
- package/scripts/test/mark-create-gate.bats +0 -59
- package/scripts/test/mark-story-oversight-confirmed.bats +0 -53
- package/scripts/test/migrate-problems-add-type.bats +0 -280
- package/scripts/test/migrate-story-status-mirror.bats +0 -167
- package/scripts/test/no-type-regression-guard.bats +0 -74
- package/scripts/test/oversight-mirror-corpus-lint.bats +0 -150
- package/scripts/test/plugin-exercise-index.bats +0 -386
- package/scripts/test/plugin-maturity-doc-lint.bats +0 -470
- package/scripts/test/plugin-maturity-populate.bats +0 -631
- package/scripts/test/plugin-maturity-render.bats +0 -469
- package/scripts/test/plugin-validate-ci-gate.bats +0 -208
- package/scripts/test/reconcile-readme.bats +0 -1007
- package/scripts/test/reconcile-rfcs.bats +0 -496
- package/scripts/test/reconcile-stories.bats +0 -173
- package/scripts/test/reconcile-story-maps.bats +0 -74
- package/scripts/test/release-watch-poll-loop.bats +0 -180
- package/scripts/test/resolve-governance-plugin-dirs.bats +0 -78
- package/scripts/test/rfc-stories-extension.bats +0 -175
- package/scripts/test/skill-invocations.bats +0 -535
- package/scripts/test/skill-md-dual-tolerant-coverage-rfc-002-t3.bats +0 -374
- package/scripts/test/story-oversight-lib.bats +0 -190
- package/scripts/test/update-jtbd-references-related-problems.bats +0 -178
- package/scripts/test/update-problem-references-section.bats +0 -242
- package/scripts/test/update-problem-rfcs-section.bats +0 -242
- package/scripts/test/update-references-section-sibling-helpers.bats +0 -80
- package/scripts/test/update-rfc-commits-section.bats +0 -77
- package/scripts/test/verify-iter-summary.bats +0 -196
- package/scripts/test/working-the-problem-traversal.bats +0 -116
- package/skills/capture-problem/test/capture-problem-step-1-5b-jtbd-trace.bats +0 -398
- package/skills/capture-problem/test/capture-problem.bats +0 -389
- package/skills/capture-story/test/capture-story-behavioural.bats +0 -317
- package/skills/capture-story-map/test/capture-story-map-behavioural.bats +0 -98
- package/skills/close-incident/test/close-incident-contract.bats +0 -146
- package/skills/link-incident/test/link-incident-contract.bats +0 -125
- package/skills/list-incidents/test/list-incidents-contract.bats +0 -115
- package/skills/list-problems/test/list-problems-contract.bats +0 -100
- package/skills/list-stories/test/list-stories-contract.bats +0 -127
- package/skills/list-story-maps/test/list-story-maps-contract.bats +0 -46
- package/skills/manage-incident/test/manage-incident-adr-044-contract.bats +0 -206
- package/skills/manage-incident/test/manage-incident-close-forwarder.bats +0 -67
- package/skills/manage-incident/test/manage-incident-link-forwarder.bats +0 -67
- package/skills/manage-incident/test/manage-incident-list-forwarder.bats +0 -68
- package/skills/manage-incident/test/manage-incident-mitigate-forwarder.bats +0 -66
- package/skills/manage-incident/test/manage-incident-restore-forwarder.bats +0 -66
- package/skills/manage-incident/test/manage-incident.bats +0 -171
- package/skills/manage-problem/test/manage-problem-adr-044-step4-derive-first.bats +0 -151
- package/skills/manage-problem/test/manage-problem-auto-migrate-step.bats +0 -53
- package/skills/manage-problem/test/manage-problem-concern-boundary.bats +0 -64
- package/skills/manage-problem/test/manage-problem-effort-buckets.bats +0 -56
- package/skills/manage-problem/test/manage-problem-external-root-cause-detection.bats +0 -119
- package/skills/manage-problem/test/manage-problem-first-run-intake-prompt.bats +0 -43
- package/skills/manage-problem/test/manage-problem-git-mv-restage-reminder.bats +0 -48
- package/skills/manage-problem/test/manage-problem-id-collision-guard.bats +0 -39
- package/skills/manage-problem/test/manage-problem-list-forwarder.bats +0 -66
- package/skills/manage-problem/test/manage-problem-next-id-origin-lookup.bats +0 -50
- package/skills/manage-problem/test/manage-problem-no-prose-options.bats +0 -74
- package/skills/manage-problem/test/manage-problem-output-formatting.bats +0 -30
- package/skills/manage-problem/test/manage-problem-parked-and-cache.bats +0 -73
- package/skills/manage-problem/test/manage-problem-readme-refresh-on-transition.bats +0 -62
- package/skills/manage-problem/test/manage-problem-readme-tie-break-order.bats +0 -318
- package/skills/manage-problem/test/manage-problem-readme-vq-sort-order.bats +0 -206
- package/skills/manage-problem/test/manage-problem-release-vehicle-seed.bats +0 -83
- package/skills/manage-problem/test/manage-problem-review-forwarder.bats +0 -71
- package/skills/manage-problem/test/manage-problem-step-9d-recovery-path.bats +0 -97
- package/skills/manage-problem/test/manage-problem-transition-forwarder.bats +0 -96
- package/skills/manage-problem/test/manage-problem-transitive-dependencies.bats +0 -365
- package/skills/manage-problem/test/manage-problem-verification-detection.bats +0 -64
- package/skills/manage-problem/test/manage-problem-verification-pending.bats +0 -114
- package/skills/manage-problem/test/manage-problem-work-forwarder.bats +0 -88
- package/skills/manage-story/test/manage-story-contract.bats +0 -174
- package/skills/manage-story-map/test/manage-story-map-contract.bats +0 -63
- package/skills/mitigate-incident/test/mitigate-incident-contract.bats +0 -258
- package/skills/reconcile-readme/test/reconcile-readme-contract.bats +0 -201
- package/skills/report-upstream/test/report-upstream-contract.bats +0 -394
- package/skills/restore-incident/test/restore-incident-contract.bats +0 -170
- package/skills/review-problems/test/inbound-channels-cache-shape.bats +0 -127
- package/skills/review-problems/test/inbound-discovery-contract.bats +0 -383
- package/skills/review-problems/test/jtbd-301-verdict-shape-contract.bats +0 -225
- package/skills/review-problems/test/review-problems-contract.bats +0 -235
- package/skills/review-problems/test/review-problems-likely-verified-cell-shape.bats +0 -229
- package/skills/scaffold-intake/test/scaffold-intake-contract.bats +0 -126
- package/skills/scaffold-intake/test/scaffold-intake-fixture.bats +0 -164
- package/skills/scaffold-intake/test/scaffold-intake-secrets-absent.bats +0 -87
- package/skills/transition-problem/test/transition-problem-contract.bats +0 -285
- package/skills/transition-problems/test/transition-problems-contract.bats +0 -331
- package/skills/update-upstream/test/update-upstream-contract.bats +0 -375
- package/skills/work-problem/test/work-problem-contract.bats +0 -294
- package/skills/work-problems/test/work-problems-above-appetite-remediation.bats +0 -139
- package/skills/work-problems/test/work-problems-adr-013-rule-6-p352-amendment.bats +0 -166
- package/skills/work-problems/test/work-problems-auto-migrate-step.bats +0 -57
- package/skills/work-problems/test/work-problems-cost-logging.bats +0 -109
- package/skills/work-problems/test/work-problems-deviation-candidate-shape.bats +0 -121
- package/skills/work-problems/test/work-problems-first-run-intake-prompt.bats +0 -36
- package/skills/work-problems/test/work-problems-inter-iteration-verify.bats +0 -59
- package/skills/work-problems/test/work-problems-mid-loop-userpromptsubmit-handler.bats +0 -69
- package/skills/work-problems/test/work-problems-no-mid-loop-asking.bats +0 -192
- package/skills/work-problems/test/work-problems-p341-pre-all-done-gate.bats +0 -122
- package/skills/work-problems/test/work-problems-p342-r007-derive-then-pass-flags.bats +0 -170
- package/skills/work-problems/test/work-problems-p342-retro-auto-ticket-carveout.bats +0 -120
- package/skills/work-problems/test/work-problems-preflight-failure-handling.bats +0 -248
- package/skills/work-problems/test/work-problems-preflight-session-continuity.bats +0 -139
- package/skills/work-problems/test/work-problems-preflight.bats +0 -69
- package/skills/work-problems/test/work-problems-release-cadence.bats +0 -63
- package/skills/work-problems/test/work-problems-step-0-iter-error-staleness.bats +0 -93
- package/skills/work-problems/test/work-problems-step-0b-cache-staleness-behavioural.bats +0 -138
- package/skills/work-problems/test/work-problems-step-0c-deferred-placeholder-staleness-behavioural.bats +0 -238
- package/skills/work-problems/test/work-problems-step-0d-outbound-responses-staleness-behavioural.bats +0 -174
- package/skills/work-problems/test/work-problems-step-2-5-routing.bats +0 -80
- package/skills/work-problems/test/work-problems-step-2-5b-cross-halt-routing.bats +0 -149
- package/skills/work-problems/test/work-problems-step-3-5-jtbd-ratification-predicate.bats +0 -191
- package/skills/work-problems/test/work-problems-step-5-bats-polling-discipline.bats +0 -91
- package/skills/work-problems/test/work-problems-step-5-delegation.bats +0 -333
- package/skills/work-problems/test/work-problems-step-5-idle-timeout-sigterm.bats +0 -421
- package/skills/work-problems/test/work-problems-step-5-is-error-transient-halt.bats +0 -278
- package/skills/work-problems/test/work-problems-step-5-iter-changeset-required.bats +0 -95
- package/skills/work-problems/test/work-problems-step-5-prompt-body-re-grounding.bats +0 -128
- package/skills/work-problems/test/work-problems-step-5-stream-timeout-salvage.bats +0 -251
- package/skills/work-problems/test/work-problems-step-6-5-always-drain.bats +0 -203
- package/skills/work-problems/test/work-problems-step-6-5-cache-refresh-chain.bats +0 -174
- package/skills/work-problems/test/work-problems-step-6-5-fix-and-continue.bats +0 -254
- package/skills/work-problems/test/work-problems-step-6-5-postrelease-kv-callback.bats +0 -209
- 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
|
-
}
|