@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,139 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bats
|
|
2
|
-
# Doc-lint guard: work-problems SKILL.md must include the above-appetite
|
|
3
|
-
# auto-apply + halt-on-exhaustion branch per ADR-042.
|
|
4
|
-
#
|
|
5
|
-
# Structural assertion — Permitted Exception to the source-grep ban (ADR-005 / P011).
|
|
6
|
-
# These assertions are load-bearing-string checks on the skill specification
|
|
7
|
-
# document. Per P081, structural tests are placeholders for behavioural tests
|
|
8
|
-
# against P012's skill-testing harness; until that harness lands, these
|
|
9
|
-
# assertions are the confirmation mechanism called out in ADR-042 Confirmation
|
|
10
|
-
# criterion 2.
|
|
11
|
-
#
|
|
12
|
-
# Cross-reference:
|
|
13
|
-
# P103 (work-problems escalates resolved release decisions — defeats AFK)
|
|
14
|
-
# P104 (partial-progress paints release queue into corner)
|
|
15
|
-
# P108 (scorer remediation action-class vocabulary — deferred work)
|
|
16
|
-
# ADR-042 (auto-apply scorer remediations — open vocabulary — never release above appetite)
|
|
17
|
-
# ADR-037 (skill testing strategy — contract-assertion pattern)
|
|
18
|
-
# @jtbd JTBD-006 (Progress the Backlog While I'm Away)
|
|
19
|
-
|
|
20
|
-
setup() {
|
|
21
|
-
SKILL_DIR="$(cd "$(dirname "$BATS_TEST_FILENAME")/.." && pwd)"
|
|
22
|
-
SKILL_FILE="${SKILL_DIR}/SKILL.md"
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
@test "SKILL.md exists" {
|
|
26
|
-
[ -f "$SKILL_FILE" ]
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
@test "SKILL.md cites ADR-042 (above-appetite auto-apply)" {
|
|
30
|
-
# ADR-042 Confirmation criterion 1: source review names the ADR.
|
|
31
|
-
run grep -n "ADR-042" "$SKILL_FILE"
|
|
32
|
-
[ "$status" -eq 0 ]
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
@test "SKILL.md contains the never-release-above-appetite invariant (Rule 1)" {
|
|
36
|
-
# The load-bearing invariant from Rule 1. "MUST NOT release above appetite"
|
|
37
|
-
# is the phrase that anchors the policy.
|
|
38
|
-
run grep -nE "MUST NOT release above appetite" "$SKILL_FILE"
|
|
39
|
-
[ "$status" -eq 0 ]
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
@test "SKILL.md references RISK_REMEDIATIONS parsing contract (Rule 2)" {
|
|
43
|
-
# Rule 2 parses RISK_REMEDIATIONS from the scorer. If the string is absent,
|
|
44
|
-
# the skill does not implement the parse step.
|
|
45
|
-
run grep -n "RISK_REMEDIATIONS" "$SKILL_FILE"
|
|
46
|
-
[ "$status" -eq 0 ]
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
@test "SKILL.md does not use a held-changeset directory as remediation" {
|
|
50
|
-
run grep -n "docs/changesets-holding/" "$SKILL_FILE"
|
|
51
|
-
[ "$status" -ne 0 ]
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
@test "SKILL.md does not offer move-to-holding as a remediation" {
|
|
55
|
-
run grep -n "move-to-holding" "$SKILL_FILE"
|
|
56
|
-
[ "$status" -ne 0 ]
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
@test "SKILL.md offers shipment-affecting remediation classes" {
|
|
60
|
-
run grep -nE "split-change|disable-or-revert|revert-commit" "$SKILL_FILE"
|
|
61
|
-
[ "$status" -eq 0 ]
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
@test "SKILL.md names P108 (deferred action-class vocabulary)" {
|
|
65
|
-
# Rule 2a defers revert-commit, amend-commit, feature-flag, rollback-to-tag
|
|
66
|
-
# to P108. Keeping the reference greppable makes the deferral auditable.
|
|
67
|
-
run grep -n "P108" "$SKILL_FILE"
|
|
68
|
-
[ "$status" -eq 0 ]
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
@test "SKILL.md includes the Verification Pending carve-out (Rule 2b)" {
|
|
72
|
-
# Rule 2b prevents auto-revert of commits attached to .verifying.md tickets.
|
|
73
|
-
run grep -niE "Verification Pending.*carve.out|Rule 2b|\.verifying\.md.*(skip|exclude|carve)" "$SKILL_FILE"
|
|
74
|
-
[ "$status" -eq 0 ]
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
@test "SKILL.md references the halt-on-exhaustion outcome (Rule 5)" {
|
|
78
|
-
# Rule 5 emits outcome: halted-above-appetite when the auto-apply loop
|
|
79
|
-
# exhausts without convergence.
|
|
80
|
-
run grep -n "halted-above-appetite" "$SKILL_FILE"
|
|
81
|
-
[ "$status" -eq 0 ]
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
@test "SKILL.md cites ADR-013 Rule 5 (policy-authorised silent proceed)" {
|
|
85
|
-
# Rule 1 is authorised by ADR-013 Rule 5. The citation should be explicit.
|
|
86
|
-
run grep -nE "ADR-013 Rule 5" "$SKILL_FILE"
|
|
87
|
-
[ "$status" -eq 0 ]
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
@test "SKILL.md references the scorer-gap halt signal" {
|
|
91
|
-
# Rule 5 treats exhaustion as a scorer-gap bug signal, not routine behaviour.
|
|
92
|
-
run grep -niE "scorer.gap|scorer vocabulary|bug signal" "$SKILL_FILE"
|
|
93
|
-
[ "$status" -eq 0 ]
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
@test "SKILL.md Non-Interactive Decision Making table covers above-appetite auto-apply" {
|
|
97
|
-
# The non-interactive defaults table row makes the behaviour discoverable to
|
|
98
|
-
# an AFK reader without forcing a full prose read.
|
|
99
|
-
run grep -niE "above appetite.*>= 5/25|pipeline risk above appetite|auto-apply scorer remediations" "$SKILL_FILE"
|
|
100
|
-
[ "$status" -eq 0 ]
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
@test "SKILL.md forbids AskUserQuestion shortcut for above-appetite" {
|
|
104
|
-
# The anti-shortcut stance is load-bearing for P103. Absent this, the skill
|
|
105
|
-
# reverts to the P103 bug. Allow optional "call "/"invoke " verb and optional
|
|
106
|
-
# backtick around the tool name (since the SKILL.md phrasing treats it as code).
|
|
107
|
-
run grep -niE "MUST NOT (call |invoke )?[\`]?AskUserQuestion" "$SKILL_FILE"
|
|
108
|
-
[ "$status" -eq 0 ]
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
@test "SKILL.md references the amend-based folding rule for ADR-032 compatibility (Rule 3)" {
|
|
112
|
-
# Auto-apply commits fold into the iteration's main commit via amend so
|
|
113
|
-
# ADR-032's one-commit-per-iteration invariant holds.
|
|
114
|
-
run grep -niE "amend|git commit --amend" "$SKILL_FILE"
|
|
115
|
-
[ "$status" -eq 0 ]
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
@test "SKILL.md references the audit-trail subsection (Rule 6)" {
|
|
119
|
-
# Rule 6 emits an Auto-apply trail subsection in the iteration summary. If
|
|
120
|
-
# the phrase is missing, audit trail is not wired through.
|
|
121
|
-
run grep -niE "Auto-apply trail|audit trail" "$SKILL_FILE"
|
|
122
|
-
[ "$status" -eq 0 ]
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
# ──────────────────────────────────────────────────────────────────────────────
|
|
126
|
-
# P108: agent reads prose descriptions; no action_class column
|
|
127
|
-
# ──────────────────────────────────────────────────────────────────────────────
|
|
128
|
-
|
|
129
|
-
@test "SKILL.md has no action_class column reference (P108 — agent decides from prose)" {
|
|
130
|
-
# ADR-042 Rule 2a: no structured action_class column.
|
|
131
|
-
run grep -n "action_class" "$SKILL_FILE"
|
|
132
|
-
[ "$status" -ne 0 ]
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
@test "SKILL.md includes revert-commit example (P108)" {
|
|
136
|
-
# The orchestrator may choose to revert a commit based on scorer prose.
|
|
137
|
-
run grep -n "git revert" "$SKILL_FILE"
|
|
138
|
-
[ "$status" -eq 0 ]
|
|
139
|
-
}
|
|
@@ -1,166 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bats
|
|
2
|
-
# ADR-013 Rule 6 P352 amendment (2026-06-06): queue-and-continue is the
|
|
3
|
-
# universal AFK default when a skill needs user input but AskUserQuestion is
|
|
4
|
-
# unavailable. HALT/SKIP/AUTO-DEFAULT are deviations requiring inline-cited
|
|
5
|
-
# carve-out justification.
|
|
6
|
-
#
|
|
7
|
-
# Structural assertion — Permitted Exception to the source-grep ban (ADR-005 /
|
|
8
|
-
# P011). These assertions are load-bearing-string checks on the ADR + SKILL
|
|
9
|
-
# specification prose. Per P081, structural tests are placeholders for
|
|
10
|
-
# behavioural tests against P012's skill-testing harness; until the harness
|
|
11
|
-
# can exercise AFK fallback shapes, prose assertions on the carve-out audit
|
|
12
|
-
# are the confirmation mechanism named in the amended Rule 6 Confirmation
|
|
13
|
-
# section.
|
|
14
|
-
#
|
|
15
|
-
# tdd-review: structural-permitted (justification: ADR Rule 6 + SKILL.md prose
|
|
16
|
-
# contract assertions for an interaction-pattern contract that has no
|
|
17
|
-
# behavioural skill-runtime harness yet — P012 + P081 Phase 2 bridge window.
|
|
18
|
-
# Isomorphic precedent in this repo: work-problems-above-appetite-remediation.bats,
|
|
19
|
-
# create-adr-substance-confirm-pattern.bats, create-adr-adr-044-contract.bats.)
|
|
20
|
-
#
|
|
21
|
-
# @problem P352 (AFK queue-and-continue is the universal default)
|
|
22
|
-
# @adr ADR-013 (structured user interaction; Rule 6 amended 2026-06-06)
|
|
23
|
-
# @adr ADR-044 (decision-delegation contract; AUTO-DEFAULT lives inside framework-resolution)
|
|
24
|
-
# @adr ADR-052 (behavioural-by-default with structural bridge window)
|
|
25
|
-
# @adr ADR-074 (confirm decision substance before building; authorises HALT carve-outs)
|
|
26
|
-
# @jtbd JTBD-006 (Progress the Backlog While I'm Away — primary persona)
|
|
27
|
-
# @jtbd JTBD-001 (Enforce Governance Without Slowing Down — queue keeps governance on during AFK)
|
|
28
|
-
|
|
29
|
-
setup() {
|
|
30
|
-
REPO_ROOT="$(cd "$(dirname "$BATS_TEST_FILENAME")/../../../../.." && pwd)"
|
|
31
|
-
ADR_013="${REPO_ROOT}/docs/decisions/013-structured-user-interaction-for-governance-decisions.proposed.md"
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
# ----------------------------------------------------------------------
|
|
35
|
-
# ADR-013 Rule 6 amendment prose
|
|
36
|
-
# ----------------------------------------------------------------------
|
|
37
|
-
|
|
38
|
-
@test "ADR-013 file exists" {
|
|
39
|
-
[ -f "$ADR_013" ]
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
@test "ADR-013 Rule 6 names queue-and-continue as the universal default (P352 amendment)" {
|
|
43
|
-
# The load-bearing prose: queue-and-continue is THE universal default.
|
|
44
|
-
run grep -nE "queue-and-continue is the universal default" "$ADR_013"
|
|
45
|
-
[ "$status" -eq 0 ]
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
@test "ADR-013 Rule 6 dates the amendment (2026-06-06)" {
|
|
49
|
-
# Date-anchoring lets future readers correlate the prose with P352 timeline.
|
|
50
|
-
run grep -nE "2026-06-06 amendment" "$ADR_013"
|
|
51
|
-
[ "$status" -eq 0 ]
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
@test "ADR-013 Rule 6 names halt-with-directive AND silent-skip as deviations" {
|
|
55
|
-
# The amendment's contract: HALT and SKIP are DEVIATIONS requiring carve-out
|
|
56
|
-
# justification — they are not the default.
|
|
57
|
-
run grep -nE "DEVIATIONS that require an explicit" "$ADR_013"
|
|
58
|
-
[ "$status" -eq 0 ]
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
@test "ADR-013 Rule 6 documents the capture-problem HALT carve-out (ADR-074 authority)" {
|
|
62
|
-
# The amendment must explicitly name the documented HALT carve-outs so
|
|
63
|
-
# readers know the SKILL surfaces that LEGITIMATELY halt and why.
|
|
64
|
-
run grep -nE "capture-problem.*derive-then-ratify HALT" "$ADR_013"
|
|
65
|
-
[ "$status" -eq 0 ]
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
@test "ADR-013 Rule 6 documents the create-adr Step 5 HALT carve-out" {
|
|
69
|
-
run grep -nE "create-adr.*Step 5 substance-confirm HALT" "$ADR_013"
|
|
70
|
-
[ "$status" -eq 0 ]
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
@test "ADR-013 Rule 6 documents the manage-problem create-gate HALT carve-out" {
|
|
74
|
-
run grep -nE "manage-problem.*create-gate HALT" "$ADR_013"
|
|
75
|
-
[ "$status" -eq 0 ]
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
@test "ADR-013 Rule 6 names AUTO-DEFAULT as framework-resolved-only (ADR-044 boundary)" {
|
|
79
|
-
# AUTO-DEFAULT is permitted ONLY when the decision is framework-resolved.
|
|
80
|
-
# Outside the framework-resolution boundary, AUTO-DEFAULT is a defect.
|
|
81
|
-
run grep -nE "AUTO-DEFAULT.*permitted ONLY when the decision is framework-resolved" "$ADR_013"
|
|
82
|
-
[ "$status" -eq 0 ]
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
@test "ADR-013 Rule 6 cites ADR-044 (decision-delegation framework-resolution boundary)" {
|
|
86
|
-
run grep -nE "ADR-044" "$ADR_013"
|
|
87
|
-
[ "$status" -eq 0 ]
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
@test "ADR-013 Rule 6 cites ADR-074 (substance-confirm authority for HALT carve-outs)" {
|
|
91
|
-
run grep -nE "ADR-074" "$ADR_013"
|
|
92
|
-
[ "$status" -eq 0 ]
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
@test "ADR-013 Rule 6 cites JTBD-006 (Progress the Backlog While I'm Away)" {
|
|
96
|
-
run grep -nE "JTBD-006" "$ADR_013"
|
|
97
|
-
[ "$status" -eq 0 ]
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
@test "ADR-013 Rule 6 cites P352 as the originating ticket" {
|
|
101
|
-
run grep -nE "\bP352\b" "$ADR_013"
|
|
102
|
-
[ "$status" -eq 0 ]
|
|
103
|
-
}
|
|
104
|
-
|
|
105
|
-
@test "ADR-013 Rule 6 records the shared-helper extraction as a follow-on (deferred)" {
|
|
106
|
-
# The ratified design explicitly deferred the shared-helper extraction to
|
|
107
|
-
# follow-on. The prose must record the deferral so future readers (and
|
|
108
|
-
# future iter agents) know the interim contract.
|
|
109
|
-
run grep -nE "Shared-helper extraction deferred" "$ADR_013"
|
|
110
|
-
[ "$status" -eq 0 ]
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
# ----------------------------------------------------------------------
|
|
114
|
-
# Per-SKILL carve-out audit annotations
|
|
115
|
-
# ----------------------------------------------------------------------
|
|
116
|
-
|
|
117
|
-
@test "capture-problem SKILL.md carries the P352 carve-out audit (P401-corrected: conforms to queue-and-continue; ADR-074 preserved via downstream gating)" {
|
|
118
|
-
SKILL="${REPO_ROOT}/packages/itil/skills/capture-problem/SKILL.md"
|
|
119
|
-
[ -f "$SKILL" ]
|
|
120
|
-
run grep -nE "ADR-013 Rule 6 carve-out audit \(P352" "$SKILL"
|
|
121
|
-
[ "$status" -eq 0 ]
|
|
122
|
-
# Post-P401 (2026-06-29/2026-07-02) the AFK low-confidence path no longer
|
|
123
|
-
# HALTs — it CONFORMS to the queue-and-continue default: capture the
|
|
124
|
-
# ticket with the unconfirmed-anchoring sentinel + queue the elicitation.
|
|
125
|
-
run grep -niE "conform.*queue-and-continue|unconfirmed — elicitation queued" "$SKILL"
|
|
126
|
-
[ "$status" -eq 0 ]
|
|
127
|
-
# ADR-074 is still named as the honoured constraint (preserved by
|
|
128
|
-
# downstream oversight gating, not by a no-ticket halt).
|
|
129
|
-
run grep -nE "ADR-074" "$SKILL"
|
|
130
|
-
[ "$status" -eq 0 ]
|
|
131
|
-
}
|
|
132
|
-
|
|
133
|
-
@test "create-adr SKILL.md carries the P352 carve-out audit (Step 1 AUTO-DEFAULT + Step 5 HALT)" {
|
|
134
|
-
SKILL="${REPO_ROOT}/packages/architect/skills/create-adr/SKILL.md"
|
|
135
|
-
[ -f "$SKILL" ]
|
|
136
|
-
run grep -nE "ADR-013 Rule 6 carve-out audit \(P352" "$SKILL"
|
|
137
|
-
[ "$status" -eq 0 ]
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
@test "manage-problem SKILL.md carries the P352 carve-out audit (Step 4b AUTO-DEFAULT)" {
|
|
141
|
-
SKILL="${REPO_ROOT}/packages/itil/skills/manage-problem/SKILL.md"
|
|
142
|
-
[ -f "$SKILL" ]
|
|
143
|
-
run grep -nE "ADR-013 Rule 6 carve-out audit \(P352" "$SKILL"
|
|
144
|
-
[ "$status" -eq 0 ]
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
@test "review-problems SKILL.md cites the P352 amendment at the Step 4.5 AFK branch" {
|
|
148
|
-
SKILL="${REPO_ROOT}/packages/itil/skills/review-problems/SKILL.md"
|
|
149
|
-
[ -f "$SKILL" ]
|
|
150
|
-
run grep -nE "ADR-013 Rule 6 universal default \(P352" "$SKILL"
|
|
151
|
-
[ "$status" -eq 0 ]
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
@test "scaffold-intake SKILL.md cites the P352 amendment as canonical queue-and-continue" {
|
|
155
|
-
SKILL="${REPO_ROOT}/packages/itil/skills/scaffold-intake/SKILL.md"
|
|
156
|
-
[ -f "$SKILL" ]
|
|
157
|
-
run grep -nE "ADR-013 Rule 6 universal default \(P352" "$SKILL"
|
|
158
|
-
[ "$status" -eq 0 ]
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
@test "run-retro SKILL.md cites the P352 amendment at the Step 1.5 AFK branch" {
|
|
162
|
-
SKILL="${REPO_ROOT}/packages/retrospective/skills/run-retro/SKILL.md"
|
|
163
|
-
[ -f "$SKILL" ]
|
|
164
|
-
run grep -nE "ADR-013 Rule 6 universal default \(P352" "$SKILL"
|
|
165
|
-
[ "$status" -eq 0 ]
|
|
166
|
-
}
|
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bats
|
|
2
|
-
|
|
3
|
-
# P170 / RFC-002 / ADR-031 Open-Execution Q1 resolution: work-problems
|
|
4
|
-
# SKILL.md wires the shared migration routine at Step 0a (after Step 0
|
|
5
|
-
# fetch/divergence preflight, before Step 1 backlog scan). Closes the
|
|
6
|
-
# Step 1 false-zero defect — flat-layout adopters without auto-migrate
|
|
7
|
-
# at Step 0a would enumerate zero matches at Step 1 and stop-condition
|
|
8
|
-
# would fire incorrectly. Doc-lint structural test — behavioural
|
|
9
|
-
# assertions live at packages/shared/test/sync-migrate-problems-layout.bats
|
|
10
|
-
# (T7) and the end-to-end behavioural fixture
|
|
11
|
-
# packages/itil/skills/work-problems/test/work-problems-auto-migrate.bats (T10).
|
|
12
|
-
|
|
13
|
-
setup() {
|
|
14
|
-
REPO_ROOT="$(cd "$(dirname "$BATS_TEST_FILENAME")/../../../../.." && pwd)"
|
|
15
|
-
SKILL_MD="$REPO_ROOT/packages/itil/skills/work-problems/SKILL.md"
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
@test "work-problems: SKILL.md declares Step 0a auto-migrate (T9 wiring point)" {
|
|
19
|
-
run grep -E '^### Step 0a:|^### 0a\.|Step 0a:' "$SKILL_MD"
|
|
20
|
-
[ "$status" -eq 0 ]
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
@test "work-problems: SKILL.md Step 0a cites P170 / RFC-002 / ADR-031" {
|
|
24
|
-
run grep -F 'P170' "$SKILL_MD"
|
|
25
|
-
[ "$status" -eq 0 ]
|
|
26
|
-
run grep -F 'ADR-031' "$SKILL_MD"
|
|
27
|
-
[ "$status" -eq 0 ]
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
@test "work-problems: SKILL.md Step 0a sources packages/itil/lib/migrate-problems-layout.sh" {
|
|
31
|
-
run grep -F 'packages/itil/lib/migrate-problems-layout.sh' "$SKILL_MD"
|
|
32
|
-
[ "$status" -eq 0 ]
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
@test "work-problems: SKILL.md Step 0a calls migrate_problems_to_per_state_layout entrypoint" {
|
|
36
|
-
run grep -F 'migrate_problems_to_per_state_layout' "$SKILL_MD"
|
|
37
|
-
[ "$status" -eq 0 ]
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
@test "work-problems: SKILL.md Step 0a fires AFTER Step 0 fetch/divergence and BEFORE Step 1 backlog scan" {
|
|
41
|
-
local step_0_line step_0a_line step_1_line
|
|
42
|
-
step_0_line=$(grep -nE '^### Step 0:' "$SKILL_MD" | head -1 | cut -d: -f1)
|
|
43
|
-
step_0a_line=$(grep -nE '^### Step 0a:' "$SKILL_MD" | head -1 | cut -d: -f1)
|
|
44
|
-
step_1_line=$(grep -nE '^### Step 1:' "$SKILL_MD" | head -1 | cut -d: -f1)
|
|
45
|
-
[ -n "$step_0_line" ]
|
|
46
|
-
[ -n "$step_0a_line" ]
|
|
47
|
-
[ -n "$step_1_line" ]
|
|
48
|
-
[ "$step_0_line" -lt "$step_0a_line" ]
|
|
49
|
-
[ "$step_0a_line" -lt "$step_1_line" ]
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
@test "work-problems: SKILL.md Step 0a addresses the Step 1 false-zero defect (ADR-031 Backward Compatibility)" {
|
|
53
|
-
# Architect explicitly noted Step 1 enumeration would mis-report
|
|
54
|
-
# "nothing to do" on flat-layout adopters without Step 0a wiring.
|
|
55
|
-
run grep -E 'false.zero|Step 1 enumerat|flat-layout adopter' "$SKILL_MD"
|
|
56
|
-
[ "$status" -eq 0 ]
|
|
57
|
-
}
|
|
@@ -1,109 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bats
|
|
2
|
-
# Doc-lint guard: work-problems SKILL.md must extract cost + usage metadata
|
|
3
|
-
# from each iteration's `claude -p --output-format json` response, surface it
|
|
4
|
-
# in the per-iteration Step 6 progress line, and aggregate it in the ALL_DONE
|
|
5
|
-
# Output Format as a dedicated "Session Cost" section.
|
|
6
|
-
#
|
|
7
|
-
# Rationale: the subprocess-boundary dispatch lands per-iteration cost in the
|
|
8
|
-
# JSON response alongside `.result`. Without an explicit extraction contract,
|
|
9
|
-
# that data is invisible to the user even though it's already emitted. Cost
|
|
10
|
-
# logging lets the user calibrate AFK loop sizing on return (e.g. "max out
|
|
11
|
-
# the token usage" direction 2026-04-21 needs a feedback loop).
|
|
12
|
-
#
|
|
13
|
-
# Structural assertion — Permitted Exception under ADR-005 + ADR-037 (SKILL.md
|
|
14
|
-
# is the contract document). A behavioural harness that exercises the `jq`
|
|
15
|
-
# extraction against a fixture JSON is a potential follow-up; out of scope
|
|
16
|
-
# for this doc-lint pass.
|
|
17
|
-
#
|
|
18
|
-
# @problem P084
|
|
19
|
-
# @jtbd JTBD-006
|
|
20
|
-
#
|
|
21
|
-
# Cross-reference:
|
|
22
|
-
# P084 (iteration worker has no Agent tool) — parent ticket; cost logging
|
|
23
|
-
# is an additive observability overlay on P084's shipped subprocess
|
|
24
|
-
# dispatch.
|
|
25
|
-
# ADR-032 (governance skill invocation patterns) — subprocess-boundary
|
|
26
|
-
# sub-pattern; `--output-format json` parse shape is already pinned.
|
|
27
|
-
# ADR-026 (agent output grounding) — Session Cost section cites its source
|
|
28
|
-
# so downstream audits can distinguish measured-actual from estimated.
|
|
29
|
-
# ADR-037 (skill testing strategy) — contract-assertion pattern.
|
|
30
|
-
# JTBD-006 (Progress the Backlog While I'm Away) — "clear summary when I
|
|
31
|
-
# return" documented outcome includes cost/token traceability.
|
|
32
|
-
|
|
33
|
-
setup() {
|
|
34
|
-
SKILL_DIR="$(cd "$(dirname "$BATS_TEST_FILENAME")/.." && pwd)"
|
|
35
|
-
SKILL_FILE="${SKILL_DIR}/SKILL.md"
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
@test "SKILL.md Step 5 extracts .total_cost_usd from iteration JSON response" {
|
|
39
|
-
# Cost per iteration lives in the same JSON blob as .result; parsing it
|
|
40
|
-
# costs nothing more than a jq call the orchestrator already needs for
|
|
41
|
-
# ITERATION_SUMMARY.
|
|
42
|
-
run grep -nE 'total_cost_usd' "$SKILL_FILE"
|
|
43
|
-
[ "$status" -eq 0 ]
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
@test "SKILL.md Step 5 extracts usage token fields from iteration JSON response" {
|
|
47
|
-
# input_tokens / output_tokens / cache_creation_input_tokens /
|
|
48
|
-
# cache_read_input_tokens are the four usage fields that give a full
|
|
49
|
-
# accounting. Cache-read is the key signal for reuse across subprocess
|
|
50
|
-
# invocations in the same Bash session.
|
|
51
|
-
run grep -nE 'input_tokens|output_tokens|cache_creation_input_tokens|cache_read_input_tokens' "$SKILL_FILE"
|
|
52
|
-
[ "$status" -eq 0 ]
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
@test "SKILL.md Step 5 names jq (or equivalent) as the extraction mechanism" {
|
|
56
|
-
# jq is already implicit in `--output-format json` consumption; naming it
|
|
57
|
-
# in the SKILL.md prevents bespoke sed/awk reimplementations.
|
|
58
|
-
run grep -nE '\\bjq\\b|JSON parser|JSON extraction' "$SKILL_FILE"
|
|
59
|
-
[ "$status" -eq 0 ]
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
@test "SKILL.md Step 5 scopes the extraction to named fields only (PII guard)" {
|
|
63
|
-
# Architect advisory 2026-04-21: the JSON response also carries session_id,
|
|
64
|
-
# model, stop_reason, etc. that should NOT be surfaced in user-visible
|
|
65
|
-
# output. The extraction list must be explicit so future contributors
|
|
66
|
-
# don't unconsciously broaden it.
|
|
67
|
-
run grep -niE 'extract only|only the fields|do not (surface|log|emit)|scoped to (the )?named fields|explicit field list' "$SKILL_FILE"
|
|
68
|
-
[ "$status" -eq 0 ]
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
@test "SKILL.md Step 6 per-iteration progress line includes cost marker" {
|
|
72
|
-
# Example progress line in Step 6 should show the (cost, duration, tokens)
|
|
73
|
-
# suffix so contributors see the target format.
|
|
74
|
-
run grep -nE '\$[0-9]+\.[0-9]+.{0,40}(tokens|iteration|s,)' "$SKILL_FILE"
|
|
75
|
-
[ "$status" -eq 0 ]
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
@test "SKILL.md Output Format includes a Session Cost section" {
|
|
79
|
-
# ALL_DONE summary aggregates per-iteration cost across the run. The
|
|
80
|
-
# section renders in every ALL_DONE — interactive OR AFK — because it's
|
|
81
|
-
# output-side, not a decision branch.
|
|
82
|
-
run grep -nE '^### Session Cost|## Session Cost|Session Cost.{0,40}Total' "$SKILL_FILE"
|
|
83
|
-
[ "$status" -eq 0 ]
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
@test "SKILL.md Output Format Session Cost table includes cache-read reuse signal" {
|
|
87
|
-
# Cache-read is the signal for "warm-cache savings across subprocess
|
|
88
|
-
# invocations in the same Bash session" — empirically observed 65-147K
|
|
89
|
-
# cache-read tokens on probes 2-4 during the P084 probe sequence. Making
|
|
90
|
-
# this visible to the user helps them reason about AFK loop cost dynamics.
|
|
91
|
-
run grep -niE 'cache.?read|cache reuse|reuse signal|cache hit' "$SKILL_FILE"
|
|
92
|
-
[ "$status" -eq 0 ]
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
@test "SKILL.md Output Format Session Cost section cites its data source (ADR-026)" {
|
|
96
|
-
# Architect advisory: the Session Cost numbers are measured-actual (from
|
|
97
|
-
# each iteration's claude -p JSON output), not estimates. Name the source
|
|
98
|
-
# so audit / downstream-tooling can trust the numbers.
|
|
99
|
-
run grep -niE 'extracted from.{0,80}(claude -p|--output-format json|iteration)|source:.{0,80}claude -p|measured.{0,40}(iteration|subprocess)' "$SKILL_FILE"
|
|
100
|
-
[ "$status" -eq 0 ]
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
@test "SKILL.md Session Cost section renders in both interactive and AFK modes" {
|
|
104
|
-
# JTBD-006 Rule 6 check: Session Cost is pure output, no AskUserQuestion,
|
|
105
|
-
# no policy-authorised action. Must render identically in both modes so
|
|
106
|
-
# AFK users see the same summary on return.
|
|
107
|
-
run grep -niE 'Session Cost.{0,160}(regardless|both|interactive.{0,40}AFK|AFK.{0,40}interactive)|output-side|no decision branch' "$SKILL_FILE"
|
|
108
|
-
[ "$status" -eq 0 ]
|
|
109
|
-
}
|
|
@@ -1,121 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bats
|
|
2
|
-
#
|
|
3
|
-
# packages/itil/skills/work-problems/test/work-problems-deviation-candidate-shape.bats
|
|
4
|
-
#
|
|
5
|
-
# Behavioural tests for the deviation-candidate sub-pattern in
|
|
6
|
-
# ITERATION_SUMMARY.outstanding_questions (P135 Phase 3 / R7 / ADR-044).
|
|
7
|
-
#
|
|
8
|
-
# Per ADR-044's anti-BUFD-for-framework-evolution clause: existing
|
|
9
|
-
# decisions are point-in-time; as reality changes, existing decisions
|
|
10
|
-
# may become wrong. The agent MUST surface deviation candidates with
|
|
11
|
-
# evidence (existing-decision citation + contradicting-evidence
|
|
12
|
-
# citation per ADR-026 + proposed shape) and queue them for user
|
|
13
|
-
# approval. Never auto-deviate; never blindly follow against evidence.
|
|
14
|
-
#
|
|
15
|
-
# This bats fixture covers the deviation-candidate schema surface in
|
|
16
|
-
# the ITERATION_SUMMARY contract + Step 2.5 5-option AskUserQuestion
|
|
17
|
-
# loop-end emit + jsonl persistence shape across iter subprocess
|
|
18
|
-
# boundary + the positive regression assertion (not-queueing-when-
|
|
19
|
-
# evidence-present is a regression).
|
|
20
|
-
#
|
|
21
|
-
# tdd-review: structural-permitted (justification: skill behavioural
|
|
22
|
-
# harness pending P012 + P081 Phase 2; SKILL.md contract assertions
|
|
23
|
-
# bridge until then; expected to migrate to behavioural form once the
|
|
24
|
-
# harness exists)
|
|
25
|
-
#
|
|
26
|
-
# @problem P135 Phase 3 R7
|
|
27
|
-
# @adr ADR-044 (Decision-Delegation Contract — deviation-approval surface)
|
|
28
|
-
# @adr ADR-026 (cost-source grounding for evidence citations)
|
|
29
|
-
# @adr ADR-032 (pending-questions artefact precedent for jsonl)
|
|
30
|
-
# @adr ADR-005 / ADR-037 (testing strategy — bridge during harness build)
|
|
31
|
-
# @jtbd JTBD-006 (AFK loop empirical-discovery surface)
|
|
32
|
-
|
|
33
|
-
SKILL_FILE="${BATS_TEST_DIRNAME}/../SKILL.md"
|
|
34
|
-
|
|
35
|
-
setup() {
|
|
36
|
-
[ -f "$SKILL_FILE" ]
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
# ── Deviation-candidate schema documented in ITERATION_SUMMARY contract ─────
|
|
40
|
-
|
|
41
|
-
@test "SKILL.md ITERATION_SUMMARY.outstanding_questions schema documents deviation-candidate entry shape" {
|
|
42
|
-
run grep -F "deviation-approval" "$SKILL_FILE"
|
|
43
|
-
[ "$status" -eq 0 ]
|
|
44
|
-
run grep -F "Deviation-candidate entry" "$SKILL_FILE"
|
|
45
|
-
[ "$status" -eq 0 ]
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
@test "deviation-candidate schema requires existing_decision citation field" {
|
|
49
|
-
run grep -F "existing_decision:" "$SKILL_FILE"
|
|
50
|
-
[ "$status" -eq 0 ]
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
@test "deviation-candidate schema requires contradicting_evidence citation per ADR-026 grounding" {
|
|
54
|
-
run grep -F "contradicting_evidence:" "$SKILL_FILE"
|
|
55
|
-
[ "$status" -eq 0 ]
|
|
56
|
-
run grep -F "ADR-026" "$SKILL_FILE"
|
|
57
|
-
[ "$status" -eq 0 ]
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
@test "deviation-candidate schema requires proposed_shape ∈ {amend, supersede, one-time}" {
|
|
61
|
-
run grep -F "proposed_shape:" "$SKILL_FILE"
|
|
62
|
-
[ "$status" -eq 0 ]
|
|
63
|
-
run grep -F '"amend" | "supersede" | "one-time"' "$SKILL_FILE"
|
|
64
|
-
[ "$status" -eq 0 ]
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
# ── No-auto-deviate contract ────────────────────────────────────────────────
|
|
68
|
-
|
|
69
|
-
@test "SKILL.md asserts agent does NOT auto-deviate when existing decision appears no-longer-right" {
|
|
70
|
-
run grep -F "does **NOT auto-deviate**" "$SKILL_FILE"
|
|
71
|
-
[ "$status" -eq 0 ]
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
@test "SKILL.md asserts agent never blindly follows against evidence" {
|
|
75
|
-
run grep -F "never blindly follows against evidence" "$SKILL_FILE"
|
|
76
|
-
[ "$status" -eq 0 ]
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
@test "Phase 3 contract: not-queueing-when-strong-contradicting-evidence-exists is a regression" {
|
|
80
|
-
run grep -F "Not-queueing-when-strong-contradicting-evidence-exists is a regression" "$SKILL_FILE"
|
|
81
|
-
[ "$status" -eq 0 ]
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
# ── Loop-end 5-option AskUserQuestion emit ─────────────────────────────────
|
|
85
|
-
|
|
86
|
-
@test "Step 2.5 deviation-candidate loop-end emit presents the 5-option AskUserQuestion" {
|
|
87
|
-
run grep -F "Approve + amend ADR" "$SKILL_FILE"
|
|
88
|
-
[ "$status" -eq 0 ]
|
|
89
|
-
run grep -F "Approve + supersede ADR" "$SKILL_FILE"
|
|
90
|
-
[ "$status" -eq 0 ]
|
|
91
|
-
run grep -F "Approve + one-time exception" "$SKILL_FILE"
|
|
92
|
-
[ "$status" -eq 0 ]
|
|
93
|
-
run grep -F "Reject (existing decision stands)" "$SKILL_FILE"
|
|
94
|
-
[ "$status" -eq 0 ]
|
|
95
|
-
run grep -F "Defer (need more evidence)" "$SKILL_FILE"
|
|
96
|
-
[ "$status" -eq 0 ]
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
@test "Step 2.5 ranking puts deviation-approval at highest precedence" {
|
|
100
|
-
run grep -F "deviation-approval (highest)" "$SKILL_FILE"
|
|
101
|
-
[ "$status" -eq 0 ]
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
# ── Jsonl persistence across iter subprocess boundary ───────────────────────
|
|
105
|
-
|
|
106
|
-
@test "SKILL.md persists outstanding_questions to .afk-run-state/outstanding-questions.jsonl" {
|
|
107
|
-
run grep -F ".afk-run-state/outstanding-questions.jsonl" "$SKILL_FILE"
|
|
108
|
-
[ "$status" -eq 0 ]
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
@test "SKILL.md cites ADR-032 pending-questions artefact precedent for the jsonl shape" {
|
|
112
|
-
run grep -F "ADR-032 pending-questions artefact precedent" "$SKILL_FILE"
|
|
113
|
-
[ "$status" -eq 0 ]
|
|
114
|
-
}
|
|
115
|
-
|
|
116
|
-
# ── Anti-BUFD-for-framework-evolution clause cross-reference ────────────────
|
|
117
|
-
|
|
118
|
-
@test "SKILL.md cites ADR-044's anti-BUFD-for-framework-evolution as the rationale" {
|
|
119
|
-
run grep -F "anti-BUFD-for-framework-evolution" "$SKILL_FILE"
|
|
120
|
-
[ "$status" -eq 0 ]
|
|
121
|
-
}
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env bats
|
|
2
|
-
|
|
3
|
-
# P065 / ADR-036 Confirmation line 199: work-problems SKILL.md must wire
|
|
4
|
-
# the first-run intake-scaffold pointer + AFK fail-safe + marker contract.
|
|
5
|
-
#
|
|
6
|
-
# Doc-lint structural test (Permitted Exception per ADR-005). Sister bats
|
|
7
|
-
# to manage-problem-first-run-intake-prompt.bats.
|
|
8
|
-
|
|
9
|
-
setup() {
|
|
10
|
-
REPO_ROOT="$(cd "$(dirname "$BATS_TEST_FILENAME")/../../../../.." && pwd)"
|
|
11
|
-
SKILL_MD="$REPO_ROOT/packages/itil/skills/work-problems/SKILL.md"
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
@test "work-problems: SKILL.md cites ADR-036 (first-run-prompt contract)" {
|
|
15
|
-
run grep -F 'ADR-036' "$SKILL_MD"
|
|
16
|
-
[ "$status" -eq 0 ]
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
@test "work-problems: SKILL.md cross-references the scaffold-intake skill" {
|
|
20
|
-
run grep -F 'wr-itil:scaffold-intake' "$SKILL_MD"
|
|
21
|
-
[ "$status" -eq 0 ]
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
@test "work-problems: SKILL.md documents the AFK fail-safe (no auto-scaffold; iteration-report pending-note)" {
|
|
25
|
-
# AFK orchestrator branch must NOT auto-scaffold; instead the iteration
|
|
26
|
-
# appends a one-line "pending intake scaffold" note to its summary.
|
|
27
|
-
# The SKILL.md preamble pointer documents this so AFK consumers see
|
|
28
|
-
# the divergence at glance.
|
|
29
|
-
run grep -iE 'pending.intake.scaffold|pending intake scaffold|silent note' "$SKILL_MD"
|
|
30
|
-
[ "$status" -eq 0 ]
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
@test "work-problems: SKILL.md cites the decline marker path (ADR-009 + ADR-036)" {
|
|
34
|
-
run grep -F '.claude/.intake-scaffold-declined' "$SKILL_MD"
|
|
35
|
-
[ "$status" -eq 0 ]
|
|
36
|
-
}
|