@jenga-ai/agent 3.5.0 → 4.0.0
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/README.md +85 -78
- package/agents/developer.md +1 -1
- package/agents/scrum-master.md +20 -2
- package/agents/tester.md +3 -3
- package/hooks/on_session_end.sh +5 -5
- package/lib/generate-agent-context.js +2 -2
- package/lib/generate-copilot-hooks.js +1 -1
- package/lib/generate-skill-allow-list.js +79 -8
- package/lib/mirror.js +1 -1
- package/lib/postinstall-manifest.js +1 -1
- package/lib/skill-allow-list.json +2 -2
- package/mcp/help/index.js +8 -17
- package/mcp/help/scan.js +73 -0
- package/package.json +5 -1
- package/project/app/api/lib/resolve-project-root.js +1 -1
- package/project/app/api/parsers/knowledge-graph.js +100 -9
- package/project/app/api/routes/health.js +36 -0
- package/project/app/api/scripts/capture-snapshot.js +9 -6
- package/project/app/package.json +4 -0
- package/project/app/ui/dist/assets/index-BADc5mmH.css +1 -0
- package/project/app/ui/dist/assets/index-C3oiuli_.js +104 -0
- package/project/app/ui/dist/index.html +2 -2
- package/project/app/ui/package.json +4 -0
- package/project/app/ui/scripts/build-snapshot-html.cjs +63 -2
- package/scripts/acquire-concurrency-slot.sh +35 -5
- package/scripts/apply-j-prefix.sh +46 -5
- package/scripts/build-pages-site.sh +1 -1
- package/scripts/check-public-playbook-steps.sh +158 -52
- package/scripts/check-publicignore-match.sh +2 -2
- package/scripts/compute-deploy-reconcile.sh +5 -5
- package/scripts/delete-bare-skill-dirs.sh +329 -0
- package/scripts/generate-legacy-shipped-paths.js +2 -2
- package/scripts/idea_manager.sh +273 -3
- package/scripts/mark-deployed.sh +2 -2
- package/scripts/populate-knowledge-graph.entity-resolution.test.js +254 -0
- package/scripts/populate-knowledge-graph.js +213 -5
- package/scripts/populate-knowledge-graph.staleness.test.js +130 -0
- package/scripts/postinstall.js +1 -1
- package/scripts/release-concurrency-slot.sh +34 -4
- package/scripts/render-ranked-list.sh +270 -0
- package/scripts/repoint-dead-bare-path-prose.py +81 -0
- package/scripts/repoint-skill-refs.sh +539 -0
- package/scripts/rewrite-stale-skill-preambles.py +188 -0
- package/scripts/strip-polyfill-frontmatter.py +166 -0
- package/scripts/todo_manager.sh +16 -1
- package/scripts/validate-typed-object.sh +750 -0
- package/scripts/verify-legacy-seed-reconcile.sh +10 -10
- package/scripts/verify-postinstall-reconcile.sh +7 -7
- package/scripts/write-context-digest.sh +1 -1
- package/skills/j-brainstorm/SKILL.md +3 -4
- package/skills/j-btw/SKILL.md +3 -4
- package/skills/j-clearify/SKILL.md +5 -6
- package/skills/j-close-story/SKILL.md +11 -12
- package/skills/j-close-story/scripts/check-privatized.sh +4 -4
- package/skills/j-close-story/scripts/check-story-closeable.sh +11 -4
- package/skills/j-commit/SKILL.md +3 -4
- package/skills/j-continue/SKILL.md +5 -6
- package/skills/j-deep-dive/SKILL.md +3 -4
- package/skills/j-distribute/CONFIG_SCHEMA.md +82 -5
- package/skills/j-distribute/SKILL.md +3 -4
- package/skills/j-do/SKILL.md +100 -18
- package/skills/j-doc/SKILL.md +3 -4
- package/skills/j-doc-sync/SKILL.md +4 -4
- package/skills/j-dooo/SKILL.md +6 -15
- package/skills/j-error/SKILL.md +3 -4
- package/skills/j-evaluate/SKILL.md +3 -4
- package/skills/j-examplify/SKILL.md +3 -4
- package/skills/j-gitignore/SKILL.md +157 -0
- package/skills/j-gitignore/assets/jenga-paths.txt +50 -0
- package/skills/j-gitignore/scripts/_catalog.sh +105 -0
- package/skills/j-gitignore/scripts/audit-gitignore.sh +194 -0
- package/skills/j-gitignore/scripts/repair-gitignore.sh +226 -0
- package/skills/j-gitignore/scripts/untrack-jenga-files.sh +210 -0
- package/skills/j-help/SKILL.md +3 -4
- package/skills/j-idea/SKILL.md +80 -9
- package/skills/j-idea/assets/idea_template.md +1 -1
- package/skills/j-improve/SKILL.md +4 -5
- package/skills/j-init/SKILL.md +23 -14
- package/skills/j-init/assets/scope-thresholds_template.json +5 -2
- package/skills/j-init/scripts/apply-scaffold-visibility.sh +9 -7
- package/skills/j-init/scripts/init.sh +4 -4
- package/skills/j-jbp/SKILL.md +3 -4
- package/skills/j-lgtm/SKILL.md +3 -4
- package/skills/j-pi-plan/SKILL.md +3 -4
- package/skills/j-playbook/SKILL.md +1 -1
- package/skills/j-proceed/SKILL.md +3 -4
- package/skills/j-publish/SKILL.md +4 -5
- package/skills/j-publish/adapters/npm-ci.md +6 -1
- package/skills/j-publish/adapters/npm.md +1 -1
- package/skills/j-publish/scripts/generate_release_notes.sh +1 -1
- package/skills/j-publish/scripts/npm_stage_inspect.sh +61 -0
- package/skills/j-publish/scripts/run_gates.sh +1 -1
- package/skills/j-reconcile/SKILL.md +40 -7
- package/skills/j-reconcile/assets/report_format.md +11 -0
- package/skills/j-reconcile/scripts/detect-unlinked-code.sh +13 -13
- package/skills/j-reconcile-origin/SKILL.md +3 -4
- package/skills/j-redo/SKILL.md +4 -5
- package/skills/j-skillify/SKILL.md +3 -4
- package/skills/j-spinoff/SKILL.md +4 -5
- package/skills/j-status/SKILL.md +18 -4
- package/skills/j-todo/SKILL.md +44 -5
- package/skills/j-todo/scripts/argument-is-not-ranked-list.sh +92 -0
- package/skills/j-todo/scripts/argument-is-ranked-list.sh +78 -0
- package/skills/j-uncharted/SKILL.md +252 -13
- package/skills/j-uncharted/scripts/detect-dependencies.sh +80 -22
- package/skills/j-uncharted/scripts/detect-tests.sh +1 -1
- package/skills/j-uncharted/scripts/diff-since-baseline.sh +600 -0
- package/skills/j-uncharted/scripts/elicitation-state.sh +1 -1
- package/skills/j-uncharted/scripts/find-scan-baseline.sh +545 -0
- package/skills/j-uncharted/scripts/run-engine.sh +36 -2
- package/skills/j-uncharted/scripts/validate-proposed-items.sh +1 -1
- package/skills/j-uncharted/scripts/write-scan-record.sh +361 -0
- package/skills/j-wtf/SKILL.md +4 -5
- package/skills/jenga/SKILL.md +106 -11
- package/skills/jenga/playbooks/board-hygiene.json +32 -0
- package/skills/jenga/playbooks/schema.json +73 -6
- package/skills/jenga/playbooks/understand-then-commit.json +19 -0
- package/skills/jenga/scripts/load-nl-catalog.js +5 -2
- package/skills/jenga/scripts/load-nl-catalog.sh +1 -1
- package/skills/jenga/scripts/load-playbooks.sh +290 -5
- package/skills/jenga/scripts/match-playbook.sh +4 -4
- package/skills/jenga/scripts/run-playbook-step.sh +267 -1
- package/templates/SCRUM_BOARD_SCHEMA.md +14 -1
- package/templates/SKILL_TEMPLATE.md +12 -0
- package/templates/permission-levels/level-1-locked.json +1 -1
- package/templates/permission-levels/level-2-guarded.json +1 -1
- package/templates/permission-levels/level-3-standard.json +1 -1
- package/templates/permission-levels/level-4-elevated.json +2 -2
- package/templates/permission-levels/level-5-unrestricted.json +2 -2
- package/templates/playbook-types.json +40 -6
- package/project/app/ui/dist/assets/index-7fj-vllY.js +0 -104
- package/project/app/ui/dist/assets/index-CdK3Qrep.css +0 -1
- package/scripts/audit-twin-divergence.sh +0 -625
- package/scripts/generate-j-alias.sh +0 -333
- package/skills/j-dev-done/SKILL.md +0 -53
- package/skills/j-dev-done/scripts/classify-commit-outcome.sh +0 -114
package/skills/j-init/SKILL.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: j.init
|
|
3
|
-
description:
|
|
3
|
+
description: initializes a new project with the standard directory structure, PROJECT_SUMMARY.md, workflow.json, git repo, and gitignore. Use when the built-in "/init" command (e.g. GH Copilot's own init) shadows Jenga's /init alias.
|
|
4
4
|
keywords:
|
|
5
5
|
- init
|
|
6
6
|
- initialize
|
|
@@ -8,7 +8,6 @@ keywords:
|
|
|
8
8
|
- new project
|
|
9
9
|
- scaffold
|
|
10
10
|
- j-init
|
|
11
|
-
- polyfill
|
|
12
11
|
examples:
|
|
13
12
|
- "initialize a new project"
|
|
14
13
|
- "set up a new workspace"
|
|
@@ -17,15 +16,25 @@ examples:
|
|
|
17
16
|
|
|
18
17
|
# J-Init — Project Setup (polyfill alias of Init)
|
|
19
18
|
|
|
20
|
-
|
|
21
|
-
some host tools/harnesses (e.g. GH Copilot) ship their own
|
|
22
|
-
named `/init`, which
|
|
23
|
-
native skill resolution is a literal-string, directory-name-based match —
|
|
24
|
-
`docs/skill-authoring.md`'s "Invocation Convention"
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
19
|
+
`skills/j-init/` is the **sole canonical directory** for this skill. The `j-` prefix is
|
|
20
|
+
there for collision safety: some host tools/harnesses (e.g. GH Copilot) ship their own
|
|
21
|
+
built-in command literally named `/init`, which would shadow a bare `/init` alias, since
|
|
22
|
+
Claude Code's native skill resolution is a literal-string, directory-name-based match —
|
|
23
|
+
see `docs/skill-authoring.md`'s "Invocation Convention". Invoke it as `j.init` or
|
|
24
|
+
`/j-init`.
|
|
25
|
+
|
|
26
|
+
> **This file was previously described as a duplicate of `skills/init/`, with an
|
|
27
|
+
> instruction to keep the two in lockstep. That instruction is void.** `E50_S15_T04`
|
|
28
|
+
> deleted every bare-name `skills/<name>/` directory on 2026-09-19, making
|
|
29
|
+
> `skills/j-<name>/` the sole canonical form (see `docs/skill-authoring.md`'s "The
|
|
30
|
+
> Canonical Naming Contract"), and `scripts/generate-j-alias.sh` — which had excluded this
|
|
31
|
+
> hand-maintained pair from generation anyway — was retired by `E50_S14_T01`. There is no
|
|
32
|
+
> second copy to mirror a change into, and none should be created. Edit this file directly.
|
|
33
|
+
>
|
|
34
|
+
> Corrected by `E42_S07_T01`'s follow-up, per
|
|
35
|
+
> `project/rapports/problems/E42_S07_T01-j-init-skill-md-lockstep-instruction-still-stale.md`.
|
|
36
|
+
> The same correction already landed one level down, in
|
|
37
|
+
> `skills/j-init/scripts/apply-scaffold-visibility.sh`.
|
|
29
38
|
|
|
30
39
|
## Instructions
|
|
31
40
|
|
|
@@ -101,7 +110,7 @@ run can never silently relocate directories or edit `.gitignore`.
|
|
|
101
110
|
> `.agents/`/`.claude/` convention), was built and then withdrawn before release —
|
|
102
111
|
> testing found it left board resolution and session-end hooks writing to two
|
|
103
112
|
> different trees. It is not offered here. See
|
|
104
|
-
> `skills/distribute/CONFIG_SCHEMA.md` for the root-cause note and the tracked
|
|
113
|
+
> `skills/j-distribute/CONFIG_SCHEMA.md` for the root-cause note and the tracked
|
|
105
114
|
> follow-up to reintroduce it once fixed.
|
|
106
115
|
|
|
107
116
|
Carry the chosen value into step 4. Do not apply it yourself — the script owns all
|
|
@@ -116,7 +125,7 @@ framework scaffold (skill and agent definitions), which is a separate tree with
|
|
|
116
125
|
separate lifecycle — it gets overwritten wholesale by every `/distribute` run or npm
|
|
117
126
|
upgrade, unlike `project/`. Kept as its own flag (`scaffold_visibility`) rather than
|
|
118
127
|
folded into `project_files_visibility`'s enum; see
|
|
119
|
-
`skills/distribute/CONFIG_SCHEMA.md`'s "Scaffold visibility" section for the full
|
|
128
|
+
`skills/j-distribute/CONFIG_SCHEMA.md`'s "Scaffold visibility" section for the full
|
|
120
129
|
rationale.
|
|
121
130
|
|
|
122
131
|
Ask the user this question, verbatim, before running any script:
|
|
@@ -195,7 +204,7 @@ run) by the time `/init` runs `git add -A`.
|
|
|
195
204
|
If the script fails, check that you are in the project root and that git and `jq`
|
|
196
205
|
are available.
|
|
197
206
|
|
|
198
|
-
See `skills/distribute/CONFIG_SCHEMA.md` for the full `project_files_visibility` and
|
|
207
|
+
See `skills/j-distribute/CONFIG_SCHEMA.md` for the full `project_files_visibility` and
|
|
199
208
|
`scaffold_visibility` field reference.
|
|
200
209
|
|
|
201
210
|
### 5. Prompt next step
|
|
@@ -1,7 +1,10 @@
|
|
|
1
1
|
{
|
|
2
|
-
"threshold_version":
|
|
2
|
+
"threshold_version": 3,
|
|
3
3
|
"inline_max_files": 3,
|
|
4
4
|
"inline_max_lines": 75,
|
|
5
5
|
"story_max_files": 5,
|
|
6
|
-
"bundle_lock_ttl_minutes": 30
|
|
6
|
+
"bundle_lock_ttl_minutes": 30,
|
|
7
|
+
"max_concurrent_developers": 3,
|
|
8
|
+
"max_concurrent_testers": 3,
|
|
9
|
+
"slot_ttl_minutes": 45
|
|
7
10
|
}
|
|
@@ -11,15 +11,17 @@
|
|
|
11
11
|
# overwritten wholesale by every `/distribute` run or npm upgrade; project/
|
|
12
12
|
# is not). Filed as new, adjacent scope under E31_S07 rather than folded
|
|
13
13
|
# silently into project_files_visibility's existing enum. See
|
|
14
|
-
# skills/distribute/CONFIG_SCHEMA.md's "Scaffold visibility" section for the
|
|
14
|
+
# skills/j-distribute/CONFIG_SCHEMA.md's "Scaffold visibility" section for the
|
|
15
15
|
# full rationale.
|
|
16
16
|
#
|
|
17
|
-
# This is skills/j-init/'s own
|
|
18
|
-
#
|
|
19
|
-
#
|
|
20
|
-
#
|
|
21
|
-
#
|
|
22
|
-
#
|
|
17
|
+
# This file is the sole copy. It was added by E31_S07_T03 as skills/j-init/'s own
|
|
18
|
+
# hand-maintained duplicate of a then-existing skills/init/scripts/ copy, with an
|
|
19
|
+
# instruction to keep the two in lockstep. That instruction is void: E50_S15_T04
|
|
20
|
+
# deleted every bare-name skills/<name>/ directory on 2026-09-19, making
|
|
21
|
+
# skills/j-<name>/ the sole canonical form (see docs/skill-authoring.md's "The
|
|
22
|
+
# Canonical Naming Contract"), and scripts/generate-j-alias.sh — which had excluded
|
|
23
|
+
# this pair from generation as hand-maintained — was itself retired by E50_S14_T01.
|
|
24
|
+
# There is no second copy to mirror a change into, and none should be created.
|
|
23
25
|
#
|
|
24
26
|
# Usage:
|
|
25
27
|
# apply-scaffold-visibility.sh <mode> [project_root]
|
|
@@ -30,7 +30,7 @@ fi
|
|
|
30
30
|
# queue/, rapports/, logs/). scaffold_visibility is a distinct, independent
|
|
31
31
|
# flag (E31_S07_T01, ported here in E31_S07_T03) covering the distributed
|
|
32
32
|
# .claude/.agents framework scaffold — kept separate per
|
|
33
|
-
# skills/distribute/CONFIG_SCHEMA.md's "Scaffold visibility" section, rather
|
|
33
|
+
# skills/j-distribute/CONFIG_SCHEMA.md's "Scaffold visibility" section, rather
|
|
34
34
|
# than folded into project_files_visibility's existing enum.
|
|
35
35
|
VISIBILITY="${JENGA_PROJECT_FILES_VISIBILITY:-visible}"
|
|
36
36
|
SCAFFOLD_VISIBILITY="${JENGA_SCAFFOLD_VISIBILITY:-visible}"
|
|
@@ -79,7 +79,7 @@ echo "→ Copying test-config.json from template..."
|
|
|
79
79
|
cp "$ASSETS_DIR/test-config_template.json" project/configs/test-config.json
|
|
80
80
|
|
|
81
81
|
# ─── 6.5. Create project/configs/scope-thresholds.json ───────────────────────
|
|
82
|
-
# Consumed by skills/jenga (Phase 0) and skills/do (Step 0); both halt if it's
|
|
82
|
+
# Consumed by skills/jenga (Phase 0) and skills/j-do (Step 0); both halt if it's
|
|
83
83
|
# missing, so it must exist immediately after scaffold.
|
|
84
84
|
echo "→ Copying scope-thresholds.json from template..."
|
|
85
85
|
cp "$ASSETS_DIR/scope-thresholds_template.json" project/configs/scope-thresholds.json
|
|
@@ -93,7 +93,7 @@ echo "→ Creating events.json..."
|
|
|
93
93
|
echo '[]' > project/logs/events.json
|
|
94
94
|
|
|
95
95
|
# ─── 8.5. Create project/knowledge-graph/{STUB_SCHEMA.md,graph.json} ─────────
|
|
96
|
-
# Consumed by skills/uncharted's conversational elicitation flow (`onboard`,
|
|
96
|
+
# Consumed by skills/j-uncharted's conversational elicitation flow (`onboard`,
|
|
97
97
|
# `segment --mode investigate`), which writes coarse graph nodes/edges to
|
|
98
98
|
# graph.json per the stub schema — both must exist before that flow's first
|
|
99
99
|
# write, per templates/KNOWLEDGE_GRAPH_STUB_SCHEMA_TEMPLATE.md's own header
|
|
@@ -138,4 +138,4 @@ git add -A
|
|
|
138
138
|
git commit -m "init: scaffold project structure and workflow config"
|
|
139
139
|
|
|
140
140
|
echo ""
|
|
141
|
-
echo "✓ Project scaffold complete."
|
|
141
|
+
echo "✓ Project scaffold complete."
|
package/skills/j-jbp/SKILL.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: j.jbp
|
|
3
|
-
description:
|
|
3
|
+
description: Scaffold the project using the JengaBasePlate boilerplate repo template from https://github.com/samwelmunga/JengaBasePlate.git.
|
|
4
4
|
keywords:
|
|
5
5
|
- jbp
|
|
6
6
|
- boilerplate
|
|
@@ -8,7 +8,6 @@ keywords:
|
|
|
8
8
|
- template
|
|
9
9
|
- jenga base
|
|
10
10
|
- j-jbp
|
|
11
|
-
- polyfill
|
|
12
11
|
examples:
|
|
13
12
|
- "scaffold with JengaBasePlate"
|
|
14
13
|
- "set up the base template"
|
|
@@ -17,9 +16,9 @@ examples:
|
|
|
17
16
|
|
|
18
17
|
# JBP — JengaBasePlate Scaffold
|
|
19
18
|
|
|
20
|
-
|
|
19
|
+
`skills/j-jbp/` is the **canonical, hand-edited** directory for this skill, per CLAUDE.md's "The Canonical Naming Contract" (the `E50` reopening of 2026-09-09, which promoted `skills/j-jbp/` from generated twin to sole canonical form). The `j-` prefix is there for collision safety — a real directory under a distinct name, so a host tool shipping its own same-named built-in command cannot shadow it (Claude Code's native skill resolution is a literal-string, directory-name-based match; see `docs/skill-authoring.md`'s "Invocation Convention").
|
|
21
20
|
|
|
22
|
-
|
|
21
|
+
> ⚠️ **`scripts/generate-j-alias.sh` was retired by `E50_S14` and no longer exists — there is nothing to run.** This file was previously generated from a bare `skills/jbp/SKILL.md` source; `E50_S15` deleted that directory. This file is now the sole canonical, hand-edited source for this skill — edit it directly.
|
|
23
22
|
|
|
24
23
|
## Instructions
|
|
25
24
|
|
package/skills/j-lgtm/SKILL.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: j.lgtm
|
|
3
|
-
description:
|
|
3
|
+
description: Approve and commit the current work, then continue to the next task. Shortcut that chains /commit followed by /continue.
|
|
4
4
|
keywords:
|
|
5
5
|
- lgtm
|
|
6
6
|
- approve
|
|
@@ -8,7 +8,6 @@ keywords:
|
|
|
8
8
|
- done
|
|
9
9
|
- commit and continue
|
|
10
10
|
- j-lgtm
|
|
11
|
-
- polyfill
|
|
12
11
|
examples:
|
|
13
12
|
- "lgtm, commit this"
|
|
14
13
|
- "looks good, move on"
|
|
@@ -17,9 +16,9 @@ examples:
|
|
|
17
16
|
|
|
18
17
|
# LGTM — Approve, Commit, and Continue
|
|
19
18
|
|
|
20
|
-
|
|
19
|
+
`skills/j-lgtm/` is the **canonical, hand-edited** directory for this skill, per CLAUDE.md's "The Canonical Naming Contract" (the `E50` reopening of 2026-09-09, which promoted `skills/j-lgtm/` from generated twin to sole canonical form). The `j-` prefix is there for collision safety — a real directory under a distinct name, so a host tool shipping its own same-named built-in command cannot shadow it (Claude Code's native skill resolution is a literal-string, directory-name-based match; see `docs/skill-authoring.md`'s "Invocation Convention").
|
|
21
20
|
|
|
22
|
-
|
|
21
|
+
> ⚠️ **`scripts/generate-j-alias.sh` was retired by `E50_S14` and no longer exists — there is nothing to run.** This file was previously generated from a bare `skills/lgtm/SKILL.md` source; `E50_S15` deleted that directory. This file is now the sole canonical, hand-edited source for this skill — edit it directly.
|
|
23
22
|
|
|
24
23
|
## Instructions
|
|
25
24
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: j.pi-plan
|
|
3
|
-
description:
|
|
3
|
+
description: Define or expand project Epics in PROJECT_SUMMARY.md. Use this at the start of a project to establish its foundation, AND whenever the user wants to add major new features, plan a significant new area of work, or make epic-level changes to an existing project. Trigger whenever you hear things like "new feature area", "big change", "new epic", "expand the project", "add a major capability", or "plan a new phase" — even mid-project.
|
|
4
4
|
keywords:
|
|
5
5
|
- epic
|
|
6
6
|
- template
|
|
@@ -8,7 +8,6 @@ keywords:
|
|
|
8
8
|
- new feature area
|
|
9
9
|
- project structure
|
|
10
10
|
- j-pi-plan
|
|
11
|
-
- polyfill
|
|
12
11
|
examples:
|
|
13
12
|
- "add a new epic for X"
|
|
14
13
|
- "expand the project with a new feature area"
|
|
@@ -19,9 +18,9 @@ metadata:
|
|
|
19
18
|
|
|
20
19
|
# Pi-plan — Define and Expand Project Epics
|
|
21
20
|
|
|
22
|
-
|
|
21
|
+
`skills/j-pi-plan/` is the **canonical, hand-edited** directory for this skill, per CLAUDE.md's "The Canonical Naming Contract" (the `E50` reopening of 2026-09-09, which promoted `skills/j-pi-plan/` from generated twin to sole canonical form). The `j-` prefix is there for collision safety — a real directory under a distinct name, so a host tool shipping its own same-named built-in command cannot shadow it (Claude Code's native skill resolution is a literal-string, directory-name-based match; see `docs/skill-authoring.md`'s "Invocation Convention").
|
|
23
22
|
|
|
24
|
-
|
|
23
|
+
> ⚠️ **`scripts/generate-j-alias.sh` was retired by `E50_S14` and no longer exists — there is nothing to run.** This file was previously generated from a bare `skills/pi-plan/SKILL.md` source; `E50_S15` deleted that directory. This file is now the sole canonical, hand-edited source for this skill — edit it directly.
|
|
25
24
|
|
|
26
25
|
## When to use this skill
|
|
27
26
|
|
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: j.proceed
|
|
3
|
-
description:
|
|
3
|
+
description: Review project progress by checking epics and stories, optionally consulting PROJECT_SUMMARY.md and WARP.md, then continue executing the project plan.
|
|
4
4
|
keywords:
|
|
5
5
|
- proceed
|
|
6
6
|
- review progress
|
|
7
7
|
- check epics
|
|
8
8
|
- continue executing
|
|
9
9
|
- j-proceed
|
|
10
|
-
- polyfill
|
|
11
10
|
examples:
|
|
12
11
|
- "proceed with the plan"
|
|
13
12
|
- "review progress and continue"
|
|
@@ -18,9 +17,9 @@ metadata:
|
|
|
18
17
|
|
|
19
18
|
# Proceed — Resume Project Execution
|
|
20
19
|
|
|
21
|
-
|
|
20
|
+
`skills/j-proceed/` is the **canonical, hand-edited** directory for this skill, per CLAUDE.md's "The Canonical Naming Contract" (the `E50` reopening of 2026-09-09, which promoted `skills/j-proceed/` from generated twin to sole canonical form). The `j-` prefix is there for collision safety — a real directory under a distinct name, so a host tool shipping its own same-named built-in command cannot shadow it (Claude Code's native skill resolution is a literal-string, directory-name-based match; see `docs/skill-authoring.md`'s "Invocation Convention").
|
|
22
21
|
|
|
23
|
-
|
|
22
|
+
> ⚠️ **`scripts/generate-j-alias.sh` was retired by `E50_S14` and no longer exists — there is nothing to run.** This file was previously generated from a bare `skills/proceed/SKILL.md` source; `E50_S15` deleted that directory. This file is now the sole canonical, hand-edited source for this skill — edit it directly.
|
|
24
23
|
|
|
25
24
|
## Instructions
|
|
26
25
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: j.publish
|
|
3
|
-
description:
|
|
3
|
+
description: Configure, validate, and orchestrate scaffolded release workflows through a single `/publish` entry point with bounded sub-commands.
|
|
4
4
|
keywords:
|
|
5
5
|
- publish
|
|
6
6
|
- deploy
|
|
@@ -12,7 +12,6 @@ keywords:
|
|
|
12
12
|
- staged publishing
|
|
13
13
|
- stage
|
|
14
14
|
- j-publish
|
|
15
|
-
- polyfill
|
|
16
15
|
examples:
|
|
17
16
|
- "publish setup --target staging-appstore"
|
|
18
17
|
- "publish setup --type mobile-ios"
|
|
@@ -42,9 +41,9 @@ metadata:
|
|
|
42
41
|
|
|
43
42
|
# Publish — Deployment Pipeline Orchestrator
|
|
44
43
|
|
|
45
|
-
|
|
44
|
+
`skills/j-publish/` is the **canonical, hand-edited** directory for this skill, per CLAUDE.md's "The Canonical Naming Contract" (the `E50` reopening of 2026-09-09, which promoted `skills/j-publish/` from generated twin to sole canonical form). The `j-` prefix is there for collision safety — a real directory under a distinct name, so a host tool shipping its own same-named built-in command cannot shadow it (Claude Code's native skill resolution is a literal-string, directory-name-based match; see `docs/skill-authoring.md`'s "Invocation Convention").
|
|
46
45
|
|
|
47
|
-
|
|
46
|
+
> ⚠️ **`scripts/generate-j-alias.sh` was retired by `E50_S14` and no longer exists — there is nothing to run.** This file was previously generated from a bare `skills/publish/SKILL.md` source; `E50_S15` deleted that directory. This file is now the sole canonical, hand-edited source for this skill — edit it directly.
|
|
48
47
|
|
|
49
48
|
`/publish` is the single entry point for release workflows in this repository. It wires configuration validation, setup, gated deployment, release-note drafting, and ledger history into one end-to-end flow, and dispatches the final publish step to a per-type adapter.
|
|
50
49
|
|
|
@@ -265,7 +264,7 @@ Release-note rules:
|
|
|
265
264
|
- **`--output <path>`:** writes a standalone, disposable draft to that path instead (the pre-E36 behavior) — `CHANGELOG.md` is not touched in this mode.
|
|
266
265
|
- If no prior ledger-backed tag exists, a `--output` draft includes `> First release — full history included`; the standing `CHANGELOG.md` merge mode has no equivalent banner (it just merges full history into `[Unreleased]` like any other run).
|
|
267
266
|
- Scrum-board enrichment is best-effort only; missing or unreadable board data never fails the command.
|
|
268
|
-
- **`.publicignore` filtering:** when a repo-root `.publicignore` exists (the blocklist `/mirror-public` also reads), a candidate commit — or a completed task's associated commit(s), matched via the `task(E##_S##_T##):` commit-message convention — is dropped entirely when every changed file it touches is covered by that blocklist. A commit touching a mix of blocked and unblocked files is still logged normally; only full coverage excludes an entry. This exists because `CHANGELOG.md` itself is not blocklisted and ships to the public mirror, so an unfiltered entry referencing a private-only path (e.g. `project/board/`) would leak. Absent `.publicignore`, this is a strict no-op — unchanged from pre-E36_S02_T02 behavior. Matching reuses `skills/mirror-public/scripts/mirror.sh`'s `rsync --exclude-from` evaluation rather than a separate glob implementation, so a path classified "blocked" by `/mirror-public --dry-run` is classified "blocked" here too.
|
|
267
|
+
- **`.publicignore` filtering:** when a repo-root `.publicignore` exists (the blocklist `/mirror-public` also reads), a candidate commit — or a completed task's associated commit(s), matched via the `task(E##_S##_T##):` commit-message convention — is dropped entirely when every changed file it touches is covered by that blocklist. A commit touching a mix of blocked and unblocked files is still logged normally; only full coverage excludes an entry. This exists because `CHANGELOG.md` itself is not blocklisted and ships to the public mirror, so an unfiltered entry referencing a private-only path (e.g. `project/board/`) would leak. Absent `.publicignore`, this is a strict no-op — unchanged from pre-E36_S02_T02 behavior. Matching reuses `skills/j-mirror-public/scripts/mirror.sh`'s `rsync --exclude-from` evaluation rather than a separate glob implementation, so a path classified "blocked" by `/mirror-public --dry-run` is classified "blocked" here too.
|
|
269
268
|
|
|
270
269
|
## Ledger & Tagging
|
|
271
270
|
|
|
@@ -239,7 +239,12 @@ automated and human halves of the flow:
|
|
|
239
239
|
relies on the automated CI-staged test result) and then
|
|
240
240
|
`bash skills/j-publish/scripts/npm_stage_inspect.sh approve <stage-id> --otp <otp>`
|
|
241
241
|
from their own machine. `reject` (same script) is available to either
|
|
242
|
-
side to discard a staged candidate.
|
|
242
|
+
side to discard a staged candidate. On success, `approve` also generates
|
|
243
|
+
release notes into `CHANGELOG.md`'s `[Unreleased]` section and finalizes
|
|
244
|
+
it with the approved version — the same behavior described in
|
|
245
|
+
`adapters/npm.md`'s Staged Publishing section, shared by both target
|
|
246
|
+
types since it lives in `npm_stage_inspect.sh` itself, not in either
|
|
247
|
+
target-type-specific pipeline (E22_S09_T08).
|
|
243
248
|
- **Stage-id capture reads the CI run's own log, not a local `npm stage
|
|
244
249
|
list` call.** Because the actual `npm stage publish --provenance` call
|
|
245
250
|
runs inside the dispatched Actions run, the local `npm_stage_pipeline.sh`
|
|
@@ -119,7 +119,7 @@ becomes visible on the registry. See `skills/j-publish/SKILL.md`'s
|
|
|
119
119
|
|
|
120
120
|
- `bash skills/j-publish/scripts/npm_stage_pipeline.sh <target> <path-to-publish.json> [--dry-run] [--non-interactive] [--otp <otp>]` runs validate → gates → pack → stage → capture → ledger and writes a `staged` ledger entry.
|
|
121
121
|
- `bash skills/j-publish/scripts/npm_stage_inspect.sh test <stage-id>` installs the staged tarball into an isolated scratch directory and smoke-tests it, writing a `stage_tested` ledger entry.
|
|
122
|
-
- `bash skills/j-publish/scripts/npm_stage_inspect.sh approve <stage-id>` requires an npm 2FA one-time password and refuses without a passing `test` on record unless `--force <reason>` is given.
|
|
122
|
+
- `bash skills/j-publish/scripts/npm_stage_inspect.sh approve <stage-id>` requires an npm 2FA one-time password and refuses without a passing `test` on record unless `--force <reason>` is given. On a successful `npm stage approve`, it also generates release notes into `CHANGELOG.md`'s `[Unreleased]` section and finalizes that section with the approved version — the same `generate_release_notes.sh` + `finalize_changelog.sh` pair `/publish deploy` runs, reused rather than duplicated (E22_S09_T08). `--dry-run` skips this (it exits before the real approve call runs at all); a failed `npm stage approve` skips it too (no changelog write on a failed approve); `--force` still runs it — `--force` only bypasses the passing-test requirement, not the changelog step.
|
|
123
123
|
- `bash skills/j-publish/scripts/npm_stage_inspect.sh reject <stage-id>` discards the staged version.
|
|
124
124
|
|
|
125
125
|
Same registry-existence precondition as a normal `npm` publish: staged
|
|
@@ -76,7 +76,7 @@ git rev-parse --verify "$TO_REF" >/dev/null 2>&1 || {
|
|
|
76
76
|
# Absence of .publicignore is a strict no-op — PI_ACTIVE stays 0 and every
|
|
77
77
|
# _pi_* helper below fails open immediately.
|
|
78
78
|
#
|
|
79
|
-
# Matching semantics are borrowed from skills/mirror-public/scripts/mirror.sh
|
|
79
|
+
# Matching semantics are borrowed from skills/j-mirror-public/scripts/mirror.sh
|
|
80
80
|
# rather than reimplemented: that script's compute_ship_list asks rsync
|
|
81
81
|
# itself "what would transfer past --exclude-from=.publicignore?" and that
|
|
82
82
|
# is the single source of truth /mirror-public --dry-run reports as
|
|
@@ -86,6 +86,8 @@ fi
|
|
|
86
86
|
source "${SCRIPT_DIR}/publish_common.sh"
|
|
87
87
|
|
|
88
88
|
WRITE_LEDGER_SCRIPT="${SCRIPT_DIR}/write_ledger_entry.sh"
|
|
89
|
+
GENERATE_RELEASE_NOTES_SCRIPT="${SCRIPT_DIR}/generate_release_notes.sh"
|
|
90
|
+
FINALIZE_CHANGELOG_SCRIPT="${SCRIPT_DIR}/finalize_changelog.sh"
|
|
89
91
|
|
|
90
92
|
# ---------------------------------------------------------------------------
|
|
91
93
|
# OTP tracing guard — MUST run at the top level, before `main "$@"` is ever
|
|
@@ -397,6 +399,53 @@ _write_stage_tested_ledger() {
|
|
|
397
399
|
"${cmd[@]}" || log_warn "failed to write 'stage_tested' ledger entry for stage ${stage_id} (result: ${result})"
|
|
398
400
|
}
|
|
399
401
|
|
|
402
|
+
# _finalize_stage_changelog <target_name> <config_path> <package_version>
|
|
403
|
+
#
|
|
404
|
+
# `approve`'s equivalent of publish_deploy.sh's generate_release_notes() +
|
|
405
|
+
# finalize_changelog() pair (E22_S09_T08) — reused verbatim, not
|
|
406
|
+
# reimplemented. Only ever called AFTER a real `npm stage approve` call has
|
|
407
|
+
# already succeeded, so a failure here never masks (nor is masked by) the
|
|
408
|
+
# approve result itself; the caller decides how to report it.
|
|
409
|
+
#
|
|
410
|
+
# Mirrors publish_deploy.sh's resolve_last_tag(): resolves the last publish
|
|
411
|
+
# tag from the ledger via publish_resolve_last_publish_tag, never a
|
|
412
|
+
# hardcoded/guessed tag. Passes --from-tag only when a tag was actually
|
|
413
|
+
# resolved, and passes the config path positional only when one is
|
|
414
|
+
# resolved -- generate_release_notes.sh treats an omitted config the same
|
|
415
|
+
# way it treats an unresolved one internally (falls back to its own
|
|
416
|
+
# defaults via publish_resolve_history_file "").
|
|
417
|
+
#
|
|
418
|
+
# Uses the already-resolved package_version (from the stage's own `npm
|
|
419
|
+
# stage view` output) for finalize_changelog.sh, per the task's acceptance
|
|
420
|
+
# criteria -- never a re-derived version.
|
|
421
|
+
_finalize_stage_changelog() {
|
|
422
|
+
local target_name="$1" config_path="$2" package_version="$3"
|
|
423
|
+
local history_file last_tag
|
|
424
|
+
local -a notes_cmd=(bash "${GENERATE_RELEASE_NOTES_SCRIPT}" --target "${target_name}")
|
|
425
|
+
|
|
426
|
+
history_file="$(publish_resolve_history_file "${config_path}")"
|
|
427
|
+
last_tag="$(publish_resolve_last_publish_tag "${history_file}" HEAD 2>/dev/null || true)"
|
|
428
|
+
[[ -n "${last_tag}" ]] && notes_cmd+=(--from-tag "${last_tag}")
|
|
429
|
+
[[ -n "${config_path}" ]] && notes_cmd+=("${config_path}")
|
|
430
|
+
|
|
431
|
+
if ! "${notes_cmd[@]}"; then
|
|
432
|
+
log_warn "failed to generate release notes for stage approve (target: ${target_name})"
|
|
433
|
+
return 1
|
|
434
|
+
fi
|
|
435
|
+
|
|
436
|
+
if [[ -z "${package_version}" ]]; then
|
|
437
|
+
log_warn "no package version resolved from stage view — skipping CHANGELOG.md finalization"
|
|
438
|
+
return 1
|
|
439
|
+
fi
|
|
440
|
+
|
|
441
|
+
if ! bash "${FINALIZE_CHANGELOG_SCRIPT}" "${package_version}" "${REPO_ROOT}/CHANGELOG.md"; then
|
|
442
|
+
log_warn "failed to finalize CHANGELOG.md for stage approve (version: ${package_version})"
|
|
443
|
+
return 1
|
|
444
|
+
fi
|
|
445
|
+
|
|
446
|
+
return 0
|
|
447
|
+
}
|
|
448
|
+
|
|
400
449
|
# ---------------------------------------------------------------------------
|
|
401
450
|
# list [<package-spec>] [--config <path>] [--dry-run] [--json]
|
|
402
451
|
# ---------------------------------------------------------------------------
|
|
@@ -772,6 +821,18 @@ cmd_approve() {
|
|
|
772
821
|
exit "${EXIT_OP_FAILED}"
|
|
773
822
|
fi
|
|
774
823
|
|
|
824
|
+
# Generate release notes into CHANGELOG.md's [Unreleased] section and
|
|
825
|
+
# stamp it with the approved version — mirroring publish_deploy.sh's own
|
|
826
|
+
# generate_release_notes() + finalize_changelog() pair (E22_S09_T08).
|
|
827
|
+
# Only reached after a confirmed successful `npm stage approve` above, so
|
|
828
|
+
# a failed approve never gets a changelog write, and --force only ever
|
|
829
|
+
# affects the test-interlock check earlier in this function — this step
|
|
830
|
+
# runs identically on both the normal and --force paths, no divergent
|
|
831
|
+
# logic. Never reached at all under --dry-run, which already exited
|
|
832
|
+
# earlier, before the real approve call.
|
|
833
|
+
_finalize_stage_changelog "${target_name}" "${config_path}" "${package_version}" \
|
|
834
|
+
|| log_warn "stage ${stage_id} was approved, but CHANGELOG.md was not updated — see warnings above"
|
|
835
|
+
|
|
775
836
|
local -a ledger_cmd=(bash "${WRITE_LEDGER_SCRIPT}" "${target_name}" "${target_type}" approved "" --stage-id "${stage_id}")
|
|
776
837
|
[[ -n "${config_path}" ]] && ledger_cmd+=(--config "${config_path}")
|
|
777
838
|
[[ -n "${package_version}" ]] && ledger_cmd+=(--version "${package_version}")
|
|
@@ -1,19 +1,18 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: j.reconcile
|
|
3
|
-
description:
|
|
3
|
+
description: Reconcile the scrum board with actual implementation state. Cross-checks every task's board status against git history and worktrees, merges orphaned worktree branches, demotes unimplemented "Done" items, promotes secretly-implemented items, flags code with no board provenance and offers /uncharted segment for it, and cleans stale entries from todo.md. Use when the board feels out of sync, after a big merge session, when tasks were completed outside the normal workflow, or when todo.md has grown stale. Trigger on phrases like "sync the board", "clean up the board", "reconcile", "board is out of date", "todo is stale", or "check what's really done".
|
|
4
4
|
metadata:
|
|
5
5
|
prefered_agent: scrum-master
|
|
6
|
-
output_types:
|
|
6
|
+
output_types: id_list
|
|
7
7
|
keywords:
|
|
8
8
|
- j-reconcile
|
|
9
|
-
- polyfill
|
|
10
9
|
---
|
|
11
10
|
|
|
12
11
|
# Reconcile — Board ↔ Code Synchronisation
|
|
13
12
|
|
|
14
|
-
|
|
13
|
+
`skills/j-reconcile/` is the **canonical, hand-edited** directory for this skill, per CLAUDE.md's "The Canonical Naming Contract" (the `E50` reopening of 2026-09-09, which promoted `skills/j-reconcile/` from generated twin to sole canonical form). The `j-` prefix is there for collision safety — a real directory under a distinct name, so a host tool shipping its own same-named built-in command cannot shadow it (Claude Code's native skill resolution is a literal-string, directory-name-based match; see `docs/skill-authoring.md`'s "Invocation Convention").
|
|
15
14
|
|
|
16
|
-
|
|
15
|
+
> ⚠️ **`scripts/generate-j-alias.sh` was retired by `E50_S14` and no longer exists — there is nothing to run.** This file was previously generated from a bare `skills/reconcile/SKILL.md` source; `E50_S15` deleted that directory. This file is now the sole canonical, hand-edited source for this skill — edit it directly.
|
|
17
16
|
|
|
18
17
|
Walks the full board (epics → stories → tasks), verifies each item's status against what actually exists in git, and fixes any drift. Also cleans `project/todo.md` of entries that are already done. Then runs the same check in reverse — code that exists with no board item and no EST-tagged commit behind it — and offers `/uncharted segment` for what it finds.
|
|
19
18
|
|
|
@@ -136,7 +135,41 @@ in-scope tasks when scoped) whose status is **not** a completed status (Pending,
|
|
|
136
135
|
2. **Check documentation artefacts** as in phase 2.
|
|
137
136
|
3. **Spot-check acceptance criteria** against the codebase.
|
|
138
137
|
|
|
139
|
-
|
|
138
|
+
Before treating a matching commit as grounds to promote, run two more checks. These exist because
|
|
139
|
+
a commit referencing a task ID is evidence the code was *touched*, not evidence it is *finished* —
|
|
140
|
+
a separate, still-running `/do` pipeline for this exact task may have a real fix sitting unmerged
|
|
141
|
+
in a worktree while an earlier, incomplete commit already landed on the branch this `/reconcile`
|
|
142
|
+
pass is reading. This is the exact race documented in
|
|
143
|
+
`project/rapports/problems/E40_S01_T05-premature-main-reconcile-vs-worktree-fix.md` — a `/reconcile`
|
|
144
|
+
pass promoted a task to `Passed`/`Done` from a matching commit alone while a fallback developer/tester
|
|
145
|
+
pipeline for that same task still had its bugfix unmerged on a worktree branch.
|
|
146
|
+
|
|
147
|
+
4. **Check for an active concurrency-slot holder** — glob `project/queue/concurrency-slots-*.json`
|
|
148
|
+
(there can be several; one per orchestrating session, per `skills/j-do/SKILL.md`'s
|
|
149
|
+
`### 4.4. Developer Concurrency Slot Enforcement`). For each file found, check both
|
|
150
|
+
`.developer.holders` and `.tester.holders` for a key matching this task's id (`E##_S##_T##`) —
|
|
151
|
+
or, if this task belongs to a story-bundle dispatch, the containing story's id (`E##_S##`),
|
|
152
|
+
since a bundle acquires one shared slot keyed to the story id rather than one per task (`### 1.5`
|
|
153
|
+
step 3 of that skill). A matching key means a developer or tester subagent for this exact item is
|
|
154
|
+
(or very recently was) live in another session.
|
|
155
|
+
5. **Check for an unmerged worktree or branch** — run `git worktree list` and `git branch --all`,
|
|
156
|
+
and look for an entry matching this task's `<E##_S##_T##-short-slug>` naming convention
|
|
157
|
+
(`skills/j-do/SKILL.md`'s worktree-naming convention, e.g. its Light Execution Path and Fallback
|
|
158
|
+
to Full Task-Scope Pipeline sections) that has not yet been merged into the branch this
|
|
159
|
+
`/reconcile` run is executing against. A match means real work for this task exists on a branch
|
|
160
|
+
this reconcile pass hasn't accounted for yet.
|
|
161
|
+
|
|
162
|
+
If **either** check 4 or 5 matches, skip promotion for this task:
|
|
163
|
+
- Leave the task's status exactly as it is now — do not touch `date_started`, `date_completed`, or
|
|
164
|
+
its `project/todo.md` entry.
|
|
165
|
+
- Do **not** merge the branch/worktree found in check 5 yourself — that is a live pipeline's own
|
|
166
|
+
work-in-progress, not an orphaned branch like phase 2's merge case.
|
|
167
|
+
- Report it in the reconcile report as **"likely still in-flight — skipped"** (see
|
|
168
|
+
`assets/report_format.md`'s "⏳ IN-FLIGHT — SKIPPED" section) — not silently promoted, and not
|
|
169
|
+
silently left unmentioned.
|
|
170
|
+
- Continue to the next task in Phase 3 — this is a per-task skip, not a phase abort.
|
|
171
|
+
|
|
172
|
+
If implementation **is confirmed** and **neither** check 4 nor 5 matched:
|
|
140
173
|
- Update the task's status to **Passed** in its board file.
|
|
141
174
|
- Set `date_completed` to today (ISO 8601).
|
|
142
175
|
- If the task is listed in `project/todo.md`, **comment it out** by wrapping the line:
|
|
@@ -200,7 +233,7 @@ older conventions still present in this repo's history (`E04_S01: ...` and
|
|
|
200
233
|
`feat(train): implement E01_S05 - ...`).
|
|
201
234
|
|
|
202
235
|
The script reuses the board-linkage check from
|
|
203
|
-
`skills/uncharted/scripts/resolve-segment-target.sh` through its batch interface. Do not
|
|
236
|
+
`skills/j-uncharted/scripts/resolve-segment-target.sh` through its batch interface. Do not
|
|
204
237
|
re-derive linkage yourself, and do not substitute a `grep` over `project/board/` if the script
|
|
205
238
|
fails — a second answer to "is this path on the board" is what that reuse exists to prevent.
|
|
206
239
|
If the script exits non-zero, report the failure in the reconcile report and continue to phase 6.
|
|
@@ -18,6 +18,10 @@ Scope: <resolved scope — see forms below>
|
|
|
18
18
|
⬆️ PROMOTED (were incomplete → now Passed)
|
|
19
19
|
🔧 E##_S##_T## · <Task Title> — commits found, acceptance criteria met
|
|
20
20
|
|
|
21
|
+
⏳ IN-FLIGHT — SKIPPED (implementation confirmed by commit, but not promoted — active work appears ongoing)
|
|
22
|
+
🔧 E##_S##_T## · <Task Title> — concurrency-slot holder found in <concurrency-slots-file>
|
|
23
|
+
🔧 E##_S##_T## · <Task Title> — unmerged branch <branch-name>
|
|
24
|
+
|
|
21
25
|
🔄 ROLL-UP CHANGES
|
|
22
26
|
📖 E##_S## · <Story Title> — <old status> → <new status>
|
|
23
27
|
📦 E## · <Epic Title> — <old status> → <new status>
|
|
@@ -51,6 +55,13 @@ Scope: <resolved scope — see forms below>
|
|
|
51
55
|
own epics/stories/tasks only — not the whole board's.
|
|
52
56
|
- Omit any section that has zero items (e.g. if nothing was demoted, skip the DEMOTED block entirely).
|
|
53
57
|
- The MERGED section should include the branch name that was merged.
|
|
58
|
+
- The IN-FLIGHT — SKIPPED section is distinct from both PROMOTED and the ordinary "implementation
|
|
59
|
+
not confirmed, no action" case (which is never reported at all): it means Phase 3 found a
|
|
60
|
+
matching commit (implementation confirmed) but withheld promotion because an active
|
|
61
|
+
concurrency-slot holder or an unmerged matching worktree/branch was also found — see
|
|
62
|
+
`/reconcile`'s Phase 3. Name the specific reason found (the concurrency-slots file, or the
|
|
63
|
+
branch/worktree name) so the report is checkable, not just asserted. Omit this section entirely
|
|
64
|
+
when no task was skipped for this reason.
|
|
54
65
|
- The TODO CLEANUP section is always shown if `project/todo.md` existed at the start, even if zero changes were made (in that case show all counts as 0).
|
|
55
66
|
- If `project/todo.md` did not exist, omit the TODO CLEANUP section.
|
|
56
67
|
- The DOD GAPS section is omitted if no completed stories have unchecked DoD checkboxes.
|