forgedock 1.8.1 → 1.8.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (90) hide show
  1. package/bin/engine/admission.mjs +57 -1
  2. package/bin/engine/admission.test.mjs +60 -0
  3. package/commands/analytics.md +3 -1
  4. package/commands/audit-agents.md +3 -1
  5. package/commands/audit.md +10 -8
  6. package/commands/autopilot.md +16 -14
  7. package/commands/ci-audit.md +4 -2
  8. package/commands/cleanup.md +1 -1
  9. package/commands/deploy-pr.md +31 -11
  10. package/commands/design-bench.md +1 -0
  11. package/commands/design-render-critique-loop.md +1 -0
  12. package/commands/design.md +1 -0
  13. package/commands/forge-stats.md +1 -0
  14. package/commands/geo-audit.md +3 -1
  15. package/commands/incident-response.md +3 -1
  16. package/commands/issue.md +4 -2
  17. package/commands/milestone.md +8 -6
  18. package/commands/orchestrate/config.md +3 -2
  19. package/commands/orchestrate/phase-1-resolve.md +57 -12
  20. package/commands/orchestrate/phase-2-triage.md +1 -0
  21. package/commands/orchestrate/phase-2.5-synthesis.md +1 -0
  22. package/commands/orchestrate/phase-3-dependency.md +17 -5
  23. package/commands/orchestrate/phase-4-execution.md +625 -78
  24. package/commands/orchestrate/phase-5-cleanup.md +5 -2
  25. package/commands/orchestrate/phase-6-report.md +8 -3
  26. package/commands/orchestrate/safety.md +1 -0
  27. package/commands/orchestrate.md +13 -9
  28. package/commands/pipeline-health/config.md +1 -0
  29. package/commands/pipeline-health/phase-1-context.md +1 -0
  30. package/commands/pipeline-health/phase-2-metrics.md +1 -0
  31. package/commands/pipeline-health/phase-3-analyze.md +1 -0
  32. package/commands/pipeline-health/phase-4-proposals.md +7 -4
  33. package/commands/pipeline-health/phase-5-report.md +5 -2
  34. package/commands/pipeline-health/phase-6-summary.md +1 -0
  35. package/commands/pipeline-health.md +9 -7
  36. package/commands/pipeline-resume.md +4 -2
  37. package/commands/qa-sweep.md +3 -1
  38. package/commands/quality-gate.md +4 -3
  39. package/commands/recover-orphans.md +219 -13
  40. package/commands/review-pr-agents/api.md +1 -0
  41. package/commands/review-pr-agents/auth.md +1 -0
  42. package/commands/review-pr-agents/billing.md +1 -0
  43. package/commands/review-pr-agents/concurrency.md +1 -0
  44. package/commands/review-pr-agents/database.md +1 -0
  45. package/commands/review-pr-agents/frontend.md +1 -0
  46. package/commands/review-pr-agents/infra.md +1 -0
  47. package/commands/review-pr-agents/protocols.md +1 -0
  48. package/commands/review-pr-agents/scraper.md +1 -0
  49. package/commands/review-pr-agents/security.md +1 -0
  50. package/commands/review-pr-agents/spec-cli.md +1 -0
  51. package/commands/review-pr-agents.md +10 -4
  52. package/commands/review-pr-staging.md +14 -5
  53. package/commands/review-pr.md +187 -19
  54. package/commands/rollback.md +3 -1
  55. package/commands/security-audit.md +3 -1
  56. package/commands/signal-planner.md +6 -4
  57. package/commands/sync-ecosystem.md +4 -2
  58. package/commands/test-gate.md +4 -2
  59. package/commands/upgrade-deps.md +3 -1
  60. package/commands/validate.md +3 -1
  61. package/commands/work-on/build/architect.md +82 -19
  62. package/commands/work-on/build/context.md +62 -18
  63. package/commands/work-on/build/implement.md +63 -18
  64. package/commands/work-on/build/validate.md +241 -60
  65. package/commands/work-on/build.md +345 -146
  66. package/commands/work-on/close.md +618 -246
  67. package/commands/work-on/decompose.md +240 -41
  68. package/commands/work-on/investigate.md +378 -61
  69. package/commands/work-on/remediate.md +43 -9
  70. package/commands/work-on/review.md +241 -29
  71. package/commands/work-on.md +180 -2014
  72. package/docs/CODEX.md +2 -0
  73. package/docs/CONFIG.md +11 -0
  74. package/package.json +1 -1
  75. package/scripts/build-spec-graph.mjs +11 -4
  76. package/scripts/check-spec-markers.sh +21 -1
  77. package/scripts/checkbox-sections.test.sh +8 -23
  78. package/scripts/extract-affected-files.sh +5 -2
  79. package/scripts/extract-affected-files.test.sh +27 -0
  80. package/scripts/forge-root.test.sh +176 -0
  81. package/scripts/is-docs-only.sh +31 -0
  82. package/scripts/is-docs-only.test.sh +64 -0
  83. package/scripts/lint-dispatch-prompt.sh +217 -0
  84. package/scripts/lint-dispatch-prompt.test.sh +307 -0
  85. package/scripts/validate-spec-graph.sh +3 -2
  86. package/scripts/verify-phase-trail.sh +282 -0
  87. package/scripts/verify-phase-trail.test.sh +298 -0
  88. package/scripts/wait-ci-green.sh +98 -0
  89. package/scripts/wait-ci-green.test.sh +99 -0
  90. package/commands/work-on-monolithic.md +0 -326
@@ -1,4 +1,5 @@
1
1
  ---
2
+ user-invocable: false
2
3
  install: core
3
4
  ---
4
5
  <!-- SPDX-FileCopyrightText: Copyright (c) RapierCraft Studios -->
@@ -6,6 +7,8 @@ install: core
6
7
 
7
8
  # /orchestrate — Phase 5: Post-Batch Cleanup
8
9
 
10
+ > **Skill names**: `{FORGE_SKILL_PREFIX}` is `forgedock:` (plugin install) or empty (`install.sh`), resolved once per run by `commands/work-on.md` § Skill Name Resolution. If the skill is not found under either name, STOP and report "skill not found" — never run the phase inline.
11
+
9
12
  ## Phase 5: Post-Batch Cleanup
10
13
 
11
14
  **This phase is MANDATORY after every orchestration batch.** It prevents the rot that accumulates when multiple agents merge PRs in parallel — stale labels, orphaned worktrees, unclosed issues.
@@ -15,7 +18,7 @@ install: core
15
18
  Invoke the `/cleanup` skill with `all` to sweep everything:
16
19
 
17
20
  ```
18
- Skill(skill="cleanup", args="all")
21
+ Skill(skill="{FORGE_SKILL_PREFIX}cleanup", args="all")
19
22
  ```
20
23
 
21
24
  This will:
@@ -31,7 +34,7 @@ This will:
31
34
  Invoke `/audit-agents` on this session to measure pipeline efficiency:
32
35
 
33
36
  ```
34
- Skill(skill="audit-agents", args="latest")
37
+ Skill(skill="{FORGE_SKILL_PREFIX}audit-agents", args="latest")
35
38
  ```
36
39
 
37
40
  Include the audit summary in the final report (Phase 6). Key metrics to surface:
@@ -1,4 +1,5 @@
1
1
  ---
2
+ user-invocable: false
2
3
 
3
4
  install: core
4
5
  ---
@@ -39,7 +40,10 @@ for NUM in {all_completed_issue_numbers}; do
39
40
  if [ -n "$TRAJ_BODY" ]; then
40
41
  # Decode via protocol CLI — handles both Base64url form (forge#1727) and gracefully
41
42
  # exits 1 (skips) for pre-migration inline-JSON entries.
42
- CARD=$(echo "$TRAJ_BODY" | node packages/protocol/src/cli.js parse --type CARD 2>/dev/null || true)
43
+ # The codec ships with ForgeDock, not with the consumer repo: resolve it from the install root.
44
+ _l="$(readlink -f "$HOME/.claude/commands/work-on.md" 2>/dev/null || true)"; _l="${_l%/commands/work-on.md}"; CODEC_CLI=""
45
+ for _c in '${CLAUDE_PLUGIN_ROOT}' "${FORGE_ROOT:-}" "${FORGEDOCK_HOME:-}" "${FORGE_HOME:-}" "$_l"; do case "$_c" in /*) [ -z "$CODEC_CLI" ] && [ -f "$_c/packages/protocol/src/cli.js" ] && CODEC_CLI="$_c/packages/protocol/src/cli.js" ;; esac; done
46
+ CARD=$( [ -n "$CODEC_CLI" ] && printf '%s\n' "$TRAJ_BODY" | node "$CODEC_CLI" parse --type CARD 2>/dev/null | jq -c '.payload // .' 2>/dev/null || true)
43
47
  [ -n "$CARD" ] && CARDS="${CARDS}${CARD}"$'\n'
44
48
  fi
45
49
  done
@@ -163,7 +167,7 @@ ORCHESTRATION_ENDED_IDLE="${BATCH_FULLY_GATED:-false}"
163
167
  IDLE_POLICY_DEFERRED_COUNT=0
164
168
  for FINDING_NUM in "${DEFERRED_FINDINGS[@]:-}"; do
165
169
  [ -z "$FINDING_NUM" ] && continue
166
- echo "${DEFERRED_REASONS[$FINDING_NUM]:-}" | grep -qi "batch fully human-gated" && \
170
+ echo "${DEFERRED_REASONS[$FINDING_NUM]:-}" | grep -qi "batch fully human-gated" && ! echo "${DEFERRED_REASONS[$FINDING_NUM]:-}" | grep -qi "amplification breaker" && \
167
171
  IDLE_POLICY_DEFERRED_COUNT=$((IDLE_POLICY_DEFERRED_COUNT + 1))
168
172
  done
169
173
  ```
@@ -345,6 +349,7 @@ current session's live wake pick them up automatically if it is still running).
345
349
  | **Cascade amplification** | **{FINDINGS_SPAWNED:-0}/{MERGED_UNITS:-0} = {AMPLIFICATION_RATIO:-0} findings per merged unit** |
346
350
  | Amplification composition | {#REFINEMENT_FINDINGS[@]:-0} same-lineage refinements; {#NEW_SURFACE_FINDINGS[@]:-0} new-surface findings |
347
351
  | Amplification bound | {CASCADE_MAX_AMPLIFICATION:-off}; {#AMPLIFICATION_DEFERRED[@]:-0} same-lineage refinements deferred to completion sweep |
352
+ | Amplification breaker | {AMPLIFICATION_BREAKER:-on}; {tripped|clear}; {#AMPLIFICATION_BREAKER_DEFERRED[@]:-0} P3 findings paused ({#BREAKER_HELD[@]:-0} still held at sweep) for bounded P3 batches (never dispatched individually) |
348
353
  | Competing recommendations reconciled (Phase 2.5) | {RECONCILED_COUNT} (investigation plans arbitrated in place + serialized) |
349
354
  | Findings validated | {N} |
350
355
  | False positives | {N} ({%}) |
@@ -363,7 +368,7 @@ current session's live wake pick them up automatically if it is still running).
363
368
 
364
369
  `P3 findings clubbed` and `Findings deferred — token budget` are a DIFFERENT mechanism from the `$`-denominated `Budget limit`/`Projected spend`/`Actual spend`/`Issues deferred (budget ceiling)` rows above (forge#1743, opt-in `--budget N` flag, gates the *original* issue dispatch order). The token-budget row reads the always-on, token-denominated ceiling that scopes ONLY to Step 4C's review-finding cascade dispatch (forge#1858); `SURFACE_BATCH_COUNT` and `SURFACE_BATCHED_FINDINGS` are populated by the same Step 4C surface-area-batching block (forge#1818) that clubs P3 findings sharing a file/leaf-directory into one dispatched pipeline. Both degrade gracefully to `0`/`uncapped` when the batch had no review findings or ran with defaults. <!-- Added: forge#1858 -->
365
370
 
366
- **Cascade amplification detail**: render one row per `FINDINGS_BY_SOURCE_PR` entry: `| PR #{source} | {finding count} | {refinement count} | {new-surface count} |`. A ratio at or above 1.0 means the batch is not reducing its open-work count through merges alone; it does **not** mean the findings are low-value. Include any convergence warning and state that the default `max_amplification: off` never defers findings. When an opt-in bound deferred a refinement, list it under Completion Sweep as re-evaluable rather than silently omitting it.
371
+ **Cascade amplification detail**: render one row per `FINDINGS_BY_SOURCE_PR` entry: `| PR #{source} | {finding count} | {refinement count} | {new-surface count} |`. A ratio at or above 1.0 means the batch is not reducing its open-work count through merges alone; it does **not** mean the findings are low-value. Include any convergence warning and state that the default `max_amplification: off` never defers findings. State the amplification breaker (on by default, forge#3060) separately: when it tripped, report the ratio, the number of paused P3 findings, and the operator decision (batch or defer); when opted out via `amplification_breaker: off`, say so. When an opt-in bound deferred a refinement, list it under Completion Sweep as re-evaluable rather than silently omitting it.
367
372
 
368
373
  For `policy: all`, include the full-repo intake counts and list each automated duplicate with its canonical issue. A sweep measures all new open issues, including CI alerts without `review-finding`; it must not claim that the cascade ratio alone measures total queue growth.
369
374
 
@@ -1,4 +1,5 @@
1
1
  ---
2
+ user-invocable: false
2
3
  install: core
3
4
  ---
4
5
  <!-- SPDX-FileCopyrightText: Copyright (c) RapierCraft Studios -->
@@ -51,7 +51,7 @@ dispatch a compact plan.
51
51
 
52
52
  ## Execution Order
53
53
 
54
- Read and execute phases in sequence. Each phase file is self-contained.
54
+ Read and execute phases in sequence. Each phase file is self-contained. Resolve every path from the spec root defined in the Quick Reference below.
55
55
 
56
56
  | Step | File | Description |
57
57
  |------|------|-------------|
@@ -67,15 +67,19 @@ Read and execute phases in sequence. Each phase file is self-contained.
67
67
 
68
68
  ## Quick Reference
69
69
 
70
+ **Spec root (MANDATORY)**: read every file below from `${CLAUDE_PLUGIN_ROOT}` — the install root of the ForgeDock plugin that is running this command (Claude Code fills it in when it loads the spec). Only if that path does not start with `/` (not a Claude Code plugin session: install.sh, Codex, OpenCode) use `$FORGE_HOME` instead. Never read sub-files from `$FORGE_HOME` when the plugin root resolved: an exported `FORGE_HOME` can point at a different, older ForgeDock checkout, and mixing roots runs stale phase specs.
71
+
72
+ **Raw reads are not substituted (MANDATORY)**: Claude Code fills in the plugin root only in the spec it loads (this file), never in files you open with Read. The phase files contain the placeholder written as `$` immediately followed by `{CLAUDE_PLUGIN_ROOT}`. Before running any bash block taken from a phase file, replace every occurrence of that placeholder with `${CLAUDE_PLUGIN_ROOT}` (the resolved root shown here), exactly as Claude Code would have. Left unreplaced it is rejected as a non-absolute path and resolution falls back to `$FORGE_HOME`, which may be stale.
73
+
70
74
  ```
71
- Read: $FORGE_HOME/commands/orchestrate/config.md # ALWAYS READ FIRST
72
- Read: $FORGE_HOME/commands/orchestrate/phase-1-resolve.md
73
- Read: $FORGE_HOME/commands/orchestrate/phase-2-triage.md
74
- Read: $FORGE_HOME/commands/orchestrate/phase-2.5-synthesis.md
75
- Read: $FORGE_HOME/commands/orchestrate/phase-3-dependency.md
76
- Read: $FORGE_HOME/commands/orchestrate/phase-4-execution.md
77
- Read: $FORGE_HOME/commands/orchestrate/phase-5-cleanup.md
78
- Read: $FORGE_HOME/commands/orchestrate/phase-6-report.md
75
+ Read: ${CLAUDE_PLUGIN_ROOT}/commands/orchestrate/config.md # ALWAYS READ FIRST
76
+ Read: ${CLAUDE_PLUGIN_ROOT}/commands/orchestrate/phase-1-resolve.md
77
+ Read: ${CLAUDE_PLUGIN_ROOT}/commands/orchestrate/phase-2-triage.md
78
+ Read: ${CLAUDE_PLUGIN_ROOT}/commands/orchestrate/phase-2.5-synthesis.md
79
+ Read: ${CLAUDE_PLUGIN_ROOT}/commands/orchestrate/phase-3-dependency.md
80
+ Read: ${CLAUDE_PLUGIN_ROOT}/commands/orchestrate/phase-4-execution.md
81
+ Read: ${CLAUDE_PLUGIN_ROOT}/commands/orchestrate/phase-5-cleanup.md
82
+ Read: ${CLAUDE_PLUGIN_ROOT}/commands/orchestrate/phase-6-report.md
79
83
  ```
80
84
 
81
85
  The orchestrator reads only the phase file(s) relevant to the current step rather than
@@ -1,4 +1,5 @@
1
1
  ---
2
+ user-invocable: false
2
3
  install: extras
3
4
  ---
4
5
  <!-- SPDX-FileCopyrightText: Copyright (c) RapierCraft Studios -->
@@ -1,4 +1,5 @@
1
1
  ---
2
+ user-invocable: false
2
3
  install: extras
3
4
  ---
4
5
  <!-- SPDX-FileCopyrightText: Copyright (c) RapierCraft Studios -->
@@ -1,4 +1,5 @@
1
1
  ---
2
+ user-invocable: false
2
3
  install: extras
3
4
  ---
4
5
  <!-- SPDX-FileCopyrightText: Copyright (c) RapierCraft Studios -->
@@ -1,4 +1,5 @@
1
1
  ---
2
+ user-invocable: false
2
3
  install: extras
3
4
  ---
4
5
  <!-- SPDX-FileCopyrightText: Copyright (c) RapierCraft Studios -->
@@ -1,4 +1,5 @@
1
1
  ---
2
+ user-invocable: false
2
3
  install: extras
3
4
  ---
4
5
  <!-- SPDX-FileCopyrightText: Copyright (c) RapierCraft Studios -->
@@ -6,6 +7,8 @@ install: extras
6
7
 
7
8
  # /pipeline-health — Phase 4: Generate Improvement Proposals
8
9
 
10
+ > **Skill names**: `{FORGE_SKILL_PREFIX}` is `forgedock:` (plugin install) or empty (`install.sh`), resolved once per run by `commands/work-on.md` § Skill Name Resolution. If the skill is not found under either name, STOP and report "skill not found" — never run the phase inline.
11
+
9
12
  ## Phase 4: Generate Improvement Proposals
10
13
 
11
14
  ### 4A: Pattern recurrence analysis — check-promotion threshold <!-- Added: forge#1331 -->
@@ -40,7 +43,7 @@ while IFS= read -r line; do
40
43
 
41
44
  # SECURITY: $SLUG is sourced from a <!-- FORGE:PATTERN: ([^\s>]+) --> tag inside
42
45
  # a review-finding issue body — untrusted, externally-influenced text. It is
43
- # interpolated below into a Skill(skill="issue", args="...") string, and
46
+ # interpolated below into a Skill(skill="{FORGE_SKILL_PREFIX}issue", args="...") string, and
44
47
  # commands/issue.md's Phase 1A resolves that string via `eval "set -- $ARGUMENTS"`.
45
48
  # Any shell metacharacter (quote, backtick, $, ;) in $SLUG would break out of the
46
49
  # intended --title token and be eval'd as shell. Whitelist-validate at the
@@ -108,7 +111,7 @@ ${SOURCE_FINDINGS}
108
111
  <!-- AUTO-CREATED: pipeline-health Phase 4A — pattern recurrence threshold exceeded -->
109
112
  CHECK_EOF
110
113
 
111
- Skill(skill="issue", args="--title \"feat(quality-gate): promote pattern '$SLUG' to deterministic registry check (recurred ${COUNT}x)\" --body-file $CHECK_BODY_FILE --label check-promotion --label priority:P2")
114
+ Skill(skill="{FORGE_SKILL_PREFIX}issue", args="--title \"feat(quality-gate): promote pattern '$SLUG' to deterministic registry check (recurred ${COUNT}x)\" --body-file $CHECK_BODY_FILE --label check-promotion --label priority:P2")
112
115
  rm -f "$CHECK_BODY_FILE"
113
116
  echo "Created check-promotion issue for pattern '$SLUG' (recurred ${COUNT}x from: $SOURCE_FINDINGS)"
114
117
  done <<< "$PATTERN_LIST"
@@ -170,7 +173,7 @@ echo "$SPEC_CONCENTRATION" | while IFS=' ' read -r count spec_file finding_nums;
170
173
 
171
174
  # SECURITY (defense-in-depth, consistency with $SLUG above): $spec_file is
172
175
  # already constrained by the extraction regex (commands/[a-z0-9_/-]+\.md), but
173
- # it is interpolated below into a Skill(skill="issue", args="...") string that
176
+ # it is interpolated below into a Skill(skill="{FORGE_SKILL_PREFIX}issue", args="...") string that
174
177
  # /issue's Phase 1A resolves via eval. Whitelist-validate again at point of use
175
178
  # so this call site does not depend solely on the extraction regex staying safe.
176
179
  if ! echo "$spec_file" | grep -qE '^commands/[A-Za-z0-9_/-]+\.md$'; then
@@ -235,7 +238,7 @@ This issue was auto-created by \`pipeline-health\` Phase 4A.5.
235
238
  <!-- AUTO-CREATED: pipeline-health Phase 4A.5 — spec concentration threshold exceeded -->
236
239
  TRIGGER_EOF
237
240
 
238
- Skill(skill="issue", args="--title \"feat(spec-doctor): queue spec evolution pass for $(basename $spec_file .md) (${count} concentrated findings)\" --body-file $TRIGGER_BODY_FILE --label spec-doctor-trigger --label priority:P2")
241
+ Skill(skill="{FORGE_SKILL_PREFIX}issue", args="--title \"feat(spec-doctor): queue spec evolution pass for $(basename $spec_file .md) (${count} concentrated findings)\" --body-file $TRIGGER_BODY_FILE --label spec-doctor-trigger --label priority:P2")
239
242
  rm -f "$TRIGGER_BODY_FILE"
240
243
  echo "Created spec-doctor trigger for '$spec_file' (${count} findings: $finding_nums)"
241
244
  done
@@ -1,4 +1,5 @@
1
1
  ---
2
+ user-invocable: false
2
3
  install: extras
3
4
  ---
4
5
  <!-- SPDX-FileCopyrightText: Copyright (c) RapierCraft Studios -->
@@ -6,6 +7,8 @@ install: extras
6
7
 
7
8
  # /pipeline-health — Phase 5: Report & Track
8
9
 
10
+ > **Skill names**: `{FORGE_SKILL_PREFIX}` is `forgedock:` (plugin install) or empty (`install.sh`), resolved once per run by `commands/work-on.md` § Skill Name Resolution. If the skill is not found under either name, STOP and report "skill not found" — never run the phase inline.
11
+
9
12
  ## Phase 5: Report & Track
10
13
 
11
14
  ### 5A: Post health report
@@ -279,7 +282,7 @@ restore_forge_yaml() {
279
282
  trap restore_forge_yaml EXIT
280
283
  cp "$FORGE_ISSUE_HOOK_CONFIG" forge.yaml
281
284
 
282
- ISSUE_RESULT=$(Skill(skill="issue", args="--title \"Pipeline Health: $REPO — $(date +%Y-%m-%d) — Score: [SCORE]/100\" --body-file $HEALTH_BODY_FILE --label health-report"))
285
+ ISSUE_RESULT=$(Skill(skill="{FORGE_SKILL_PREFIX}issue", args="--title \"Pipeline Health: $REPO — $(date +%Y-%m-%d) — Score: [SCORE]/100\" --body-file $HEALTH_BODY_FILE --label health-report"))
283
286
  echo "$ISSUE_RESULT"
284
287
 
285
288
  # Restore the original forge.yaml immediately — so a subsequent Bash call in this same
@@ -390,7 +393,7 @@ restore_forge_yaml() {
390
393
  trap restore_forge_yaml EXIT
391
394
  cp "$FORGE_ISSUE_HOOK_CONFIG" forge.yaml
392
395
 
393
- ISSUE_RESULT=$(Skill(skill="issue", args="--title \"fix([command]): [description]\" --body-file $PROPOSAL_BODY_FILE --label \"[bug|enhancement|feature]\" --label \"[P1|P2|P3]\""))
396
+ ISSUE_RESULT=$(Skill(skill="{FORGE_SKILL_PREFIX}issue", args="--title \"fix([command]): [description]\" --body-file $PROPOSAL_BODY_FILE --label \"[bug|enhancement|feature]\" --label \"[P1|P2|P3]\""))
394
397
  echo "$ISSUE_RESULT"
395
398
 
396
399
  # Restore the original forge.yaml immediately — same rationale as 5A. Clears the EXIT trap
@@ -1,4 +1,5 @@
1
1
  ---
2
+ user-invocable: false
2
3
  install: extras
3
4
  ---
4
5
  <!-- SPDX-FileCopyrightText: Copyright (c) RapierCraft Studios -->
@@ -31,14 +31,16 @@ Read and execute phases in sequence. Each phase file is self-contained.
31
31
 
32
32
  ## Quick Reference
33
33
 
34
+ **Spec root (MANDATORY)**: read every file below from `${CLAUDE_PLUGIN_ROOT}` — the install root of the ForgeDock plugin that is running this command (Claude Code fills it in when it loads the spec). Only if that path does not start with `/` (not a Claude Code plugin session: install.sh, Codex, OpenCode) use `$FORGE_HOME` instead. Never read sub-files from `$FORGE_HOME` when the plugin root resolved: an exported `FORGE_HOME` can point at a different, older ForgeDock checkout, and mixing roots runs stale phase specs.
35
+
34
36
  ```
35
- Read: $FORGE_HOME/commands/pipeline-health/config.md # ALWAYS READ FIRST
36
- Read: $FORGE_HOME/commands/pipeline-health/phase-1-context.md
37
- Read: $FORGE_HOME/commands/pipeline-health/phase-2-metrics.md
38
- Read: $FORGE_HOME/commands/pipeline-health/phase-3-analyze.md
39
- Read: $FORGE_HOME/commands/pipeline-health/phase-4-proposals.md
40
- Read: $FORGE_HOME/commands/pipeline-health/phase-5-report.md
41
- Read: $FORGE_HOME/commands/pipeline-health/phase-6-summary.md
37
+ Read: ${CLAUDE_PLUGIN_ROOT}/commands/pipeline-health/config.md # ALWAYS READ FIRST
38
+ Read: ${CLAUDE_PLUGIN_ROOT}/commands/pipeline-health/phase-1-context.md
39
+ Read: ${CLAUDE_PLUGIN_ROOT}/commands/pipeline-health/phase-2-metrics.md
40
+ Read: ${CLAUDE_PLUGIN_ROOT}/commands/pipeline-health/phase-3-analyze.md
41
+ Read: ${CLAUDE_PLUGIN_ROOT}/commands/pipeline-health/phase-4-proposals.md
42
+ Read: ${CLAUDE_PLUGIN_ROOT}/commands/pipeline-health/phase-5-report.md
43
+ Read: ${CLAUDE_PLUGIN_ROOT}/commands/pipeline-health/phase-6-summary.md
42
44
  ```
43
45
 
44
46
  The command reads only the phase file(s) relevant to the current step rather than loading
@@ -6,13 +6,15 @@ install: extras
6
6
 
7
7
  # /pipeline-resume — Context Recovery After Compaction
8
8
 
9
+ > **Skill names**: `{FORGE_SKILL_PREFIX}` is `forgedock:` (plugin install) or empty (`install.sh`), resolved once per run by `commands/work-on.md` § Skill Name Resolution. If the skill is not found under either name, STOP and report "skill not found" — never run the phase inline.
10
+
9
11
  **Input**: $ARGUMENTS
10
12
 
11
13
  You are the context-recovery agent. When a session ends or context is compressed, all working state is lost. Your job is to restore it instantly — find the most recently active issue, read all FORGE annotations, reconstruct the current pipeline phase, and re-enter the pipeline exactly where it left off.
12
14
 
13
15
  **Agent model policy**: `model: "haiku"`, `effort: low` (mechanical tier — context recovery, annotation reading, state reconstruction). Fallback: `model: "sonnet"` if rate-limited. Feature gate: pass `effort` only on Claude Code >= 2.1.154.
14
16
  **NEVER use plan mode (EnterPlanMode).**
15
- **NEVER use the Agent tool** — pipeline-resume re-enters the pipeline via `Skill(skill="work-on", ...)` only. Using the Agent tool would restart the pipeline in an untracked subprocess rather than resuming the existing tracked session.
17
+ **NEVER use the Agent tool** — pipeline-resume re-enters the pipeline via `Skill(skill="{FORGE_SKILL_PREFIX}work-on", ...)` only. Using the Agent tool would restart the pipeline in an untracked subprocess rather than resuming the existing tracked session.
16
18
 
17
19
  <!-- FORGE:SPEC_LOADED — pipeline-resume.md loaded and active. Agent is bound by this spec. -->
18
20
 
@@ -267,7 +269,7 @@ Emit a structured context block before resuming — this is what anchors the age
267
269
  Invoke `/work-on` to re-enter the pipeline. Work-on reads GitHub state independently and routes to the correct phase automatically.
268
270
 
269
271
  ```
270
- Skill("work-on", args="{TARGET_NUMBER}")
272
+ Skill("{FORGE_SKILL_PREFIX}work-on", args="{TARGET_NUMBER}")
271
273
  ```
272
274
 
273
275
  **Why delegation works**: `/work-on` Phase 0B already implements "Determine resume point" — it reads issue labels and FORGE annotations to route to the correct phase. `/pipeline-resume` provides the human-readable context summary, then hands off to `/work-on` for execution.
@@ -8,6 +8,8 @@ install: extras
8
8
 
9
9
  # /qa-sweep — Platform-Wide QA Testing
10
10
 
11
+ > **Skill names**: `{FORGE_SKILL_PREFIX}` is `forgedock:` (plugin install) or empty (`install.sh`), resolved once per run by `commands/work-on.md` § Skill Name Resolution. If the skill is not found under either name, STOP and report "skill not found" — never run the phase inline.
12
+
11
13
  **Input**: $ARGUMENTS
12
14
 
13
15
  You are the QA orchestrator. Auto-discover every page across the platform (dashboard, marketing, blog, auth, docs, pricing), then systematically test every UI element, interaction, workflow, and state transition using browser automation. Create GitHub issues for every finding.
@@ -339,7 +341,7 @@ BODY_EOF
339
341
  ```
340
342
 
341
343
  ```
342
- Skill(skill="issue", args="--title \"{fix|feat}: {title} on {page}\" --body-file \"$QA_BODY_FILE\" --label \"qa\" --label \"{bug_or_enhancement}\" --label \"{priority}\"")
344
+ Skill(skill="{FORGE_SKILL_PREFIX}issue", args="--title \"{fix|feat}: {title} on {page}\" --body-file \"$QA_BODY_FILE\" --label \"qa\" --label \"{bug_or_enhancement}\" --label \"{priority}\"")
343
345
  ```
344
346
 
345
347
  `qa`, `{bug_or_enhancement}`, and `{priority}` are each passed as their own `--label` flag — `/issue`'s programmatic mode does not comma-split a single `--label` value.
@@ -1,6 +1,7 @@
1
1
  ---
2
2
  description: Pre-commit quality check — catches defects the review would flag, so the builder can fix them before committing
3
3
  argument-hint: (invoked by /work-on, not directly)
4
+ context: fork
4
5
  ---
5
6
  <!-- SPDX-FileCopyrightText: Copyright (c) RapierCraft Studios -->
6
7
  <!-- SPDX-License-Identifier: AGPL-3.0-or-later -->
@@ -1712,13 +1713,13 @@ OR:
1712
1713
 
1713
1714
  Return the findings list directly. Do NOT post to GitHub. Do NOT create issues. The builder will fix the findings and re-run the gate if needed.
1714
1715
 
1715
- **CRITICAL — continuation directive**: Your output is consumed by a calling pipeline agent. You MUST append the continuation block below to your output in ALL cases (both PASS and FINDINGS). Without it, the calling agent treats your output as a terminal signal and stops the pipeline.
1716
+ **Result delivery**: This skill runs in an isolated forked context, so your final reply is the only thing the caller sees. The PASS or FINDINGS block below MUST be your final reply, in ALL cases, with nothing after it. The caller (the validate quality-gate loop) decides what happens next.
1716
1717
 
1717
1718
  If 0 findings:
1718
1719
  ```
1719
1720
  QUALITY GATE: PASS — no issues detected.
1720
1721
 
1721
- **YOU MUST NOW continue to sub-phase 3H (Format and verify) in work-on.md — this PASS is intermediate, NOT terminal. Do NOT stop.**
1722
+ Return this result to the caller.
1722
1723
  ```
1723
1724
 
1724
1725
  If findings exist:
@@ -1726,5 +1727,5 @@ If findings exist:
1726
1727
  QUALITY GATE FINDINGS: N issues detected.
1727
1728
  {findings list}
1728
1729
 
1729
- **YOU MUST NOW fix each HIGH and MEDIUM finding, then re-run the quality gate — this result is intermediate, NOT terminal. Do NOT stop.**
1730
+ Return this result to the caller; the caller fixes each HIGH and MEDIUM finding and re-runs the gate.
1730
1731
  ```