dev-loops 0.7.2 → 0.8.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/.claude/.claude-plugin/plugin.json +1 -1
- package/.claude/agents/dev-loop.md +1 -1
- package/.claude/agents/refiner.md +2 -2
- package/.claude/agents/review.md +9 -12
- package/.claude/commands/loop-continue.md +2 -1
- package/.claude/commands/loop-enqueue.md +8 -1
- package/.claude/commands/loop-info.md +1 -1
- package/.claude/hooks/_bash-command-classify.mjs +7 -6
- package/.claude/hooks/_hook-decisions.mjs +5 -4
- package/.claude/skills/copilot-pr-followup/SKILL.md +5 -5
- package/.claude/skills/dev-loop/SKILL.md +7 -7
- package/.claude/skills/docs/acceptance-criteria-verification.md +12 -4
- package/.claude/skills/docs/anti-patterns.md +3 -3
- package/.claude/skills/docs/artifact-authority-contract.md +6 -4
- package/.claude/skills/docs/confirmation-rules.md +1 -1
- package/.claude/skills/docs/copilot-loop-operations.md +4 -2
- package/.claude/skills/docs/issue-intake-procedure.md +12 -3
- package/.claude/skills/docs/merge-preconditions.md +5 -3
- package/.claude/skills/docs/pr-lifecycle-contract.md +1 -1
- package/.claude/skills/docs/public-dev-loop-contract.md +2 -1
- package/.claude/skills/docs/retrospective-checkpoint-contract.md +9 -6
- package/.claude/skills/docs/validation-policy.md +1 -1
- package/.claude/skills/local-implementation/SKILL.md +3 -3
- package/.claude/skills/loop-grill/SKILL.md +34 -14
- package/AGENTS.md +1 -1
- package/CHANGELOG.md +30 -0
- package/README.md +95 -189
- package/agents/refiner.agent.md +2 -2
- package/agents/review.agent.md +9 -12
- package/extension/README.md +5 -4
- package/package.json +5 -4
- package/scripts/docs/validate-state-machine-conformance.mjs +78 -1
- package/scripts/github/_gate-names.mjs +5 -0
- package/scripts/github/capture-review-threads.mjs +2 -2
- package/scripts/github/detect-checkpoint-evidence.mjs +7 -7
- package/scripts/github/edit-issue.mjs +259 -0
- package/scripts/github/probe-ci-status.mjs +18 -0
- package/scripts/github/probe-copilot-review.mjs +24 -3
- package/scripts/github/reconcile-draft-gate.mjs +13 -13
- package/scripts/github/request-copilot-review.mjs +17 -16
- package/scripts/github/upsert-checkpoint-verdict.mjs +25 -23
- package/scripts/github/verify-briefing-prefixes.mjs +224 -33
- package/scripts/github/write-gate-context.mjs +8 -4
- package/scripts/loop/_post-convergence-change.mjs +2 -2
- package/scripts/loop/_pr-runner-coordination.mjs +112 -13
- package/scripts/loop/check-retro-tooling.mjs +14 -9
- package/scripts/loop/copilot-pr-handoff.mjs +18 -14
- package/scripts/loop/detect-copilot-loop-state.mjs +11 -11
- package/scripts/loop/detect-internal-only-pr.mjs +6 -6
- package/scripts/loop/detect-pr-gate-coordination-state.mjs +117 -15
- package/scripts/loop/detect-refinement-grill-state.mjs +136 -0
- package/scripts/loop/run-watch-cycle.mjs +42 -7
- package/scripts/loop/sanctioned-commands.mjs +1 -0
- package/scripts/pages/build-state-atlas.mjs +15 -0
- package/scripts/projects/add-queue-item.mjs +87 -4
- package/skills/copilot-pr-followup/SKILL.md +5 -5
- package/skills/dev-loop/SKILL.md +2 -2
- package/skills/docs/acceptance-criteria-verification.md +12 -4
- package/skills/docs/anti-patterns.md +3 -3
- package/skills/docs/artifact-authority-contract.md +6 -4
- package/skills/docs/confirmation-rules.md +1 -1
- package/skills/docs/copilot-loop-operations.md +4 -2
- package/skills/docs/issue-intake-procedure.md +12 -3
- package/skills/docs/merge-preconditions.md +5 -3
- package/skills/docs/pr-lifecycle-contract.md +1 -1
- package/skills/docs/public-dev-loop-contract.md +2 -1
- package/skills/docs/required-rules.json +17 -1
- package/skills/docs/retrospective-checkpoint-contract.md +9 -6
- package/skills/docs/validation-policy.md +1 -1
- package/skills/local-implementation/SKILL.md +3 -3
- package/skills/loop-grill/SKILL.md +38 -17
|
@@ -9,7 +9,7 @@ user-invocable: false
|
|
|
9
9
|
|
|
10
10
|
# Local Implementation
|
|
11
11
|
|
|
12
|
-
|
|
12
|
+
Canonical owner for the internal `local_implementation` route behind the public `dev-loop` façade.
|
|
13
13
|
|
|
14
14
|
Use it only after the public dispatcher has already resolved `selectedStrategy: local_implementation`. This skill owns the local phase procedure and artifact discipline for that route; it does not redefine the shipped runtime semantics of helper CLIs, shared loop logic, or extension commands.
|
|
15
15
|
|
|
@@ -61,7 +61,7 @@ When the local spec already lives in a tracker issue:
|
|
|
61
61
|
- sync durable scope / acceptance / status changes back to the tracker issue rather than maintaining a duplicate local phase doc
|
|
62
62
|
- keep `tmp/` as temporary local execution state only; it does not become a second durable spec surface
|
|
63
63
|
- for tracker-backed sessions, the handoff path is always: push the working branch → open a PR → merge via GitHub
|
|
64
|
-
- <!-- rule: LOCAL-PR-CREATE-CANONICAL --> for tracker-backed sessions, you MUST open PRs through the canonical `dev-loops pr create` path — always draft and always assigned — self-assigned by default (`--assignee @me` when none is given; honors an explicit `--assignee <login>` / `-a <login>`) — and MUST NOT open them via raw `gh pr create`. The PR body MUST contain `Closes #N` (or `Fixes #N`) for the linked issue so GitHub auto-closes it on merge. When `.devloops` sets `workflow.requireDraftFirst` to true, use `dev-loops pr create --assignee @me ...`; the draft
|
|
64
|
+
- <!-- rule: LOCAL-PR-CREATE-CANONICAL --> for tracker-backed sessions, you MUST open PRs through the canonical `dev-loops pr create` path — always draft and always assigned — self-assigned by default (`--assignee @me` when none is given; honors an explicit `--assignee <login>` / `-a <login>`) — and MUST NOT open them via raw `gh pr create`. The PR body MUST contain `Closes #N` (or `Fixes #N`) for the linked issue so GitHub auto-closes it on merge. When `.devloops` sets `workflow.requireDraftFirst` to true, use `dev-loops pr create --assignee @me ...`; the always-draft creation mechanism is owned by [`OPS-DRAFT-FIRST-PR`](../docs/copilot-loop-operations.md) — `create-pr.mjs` is unconditionally draft-only regardless of the toggle, which separately governs whether the draft-gate boundary is enforced before ready.
|
|
65
65
|
- <!-- rule: LOCAL-TRACKER-NO-DIRECT-MERGE --> `LOCAL-TRACKER-NO-DIRECT-MERGE`: for tracker-backed sessions, agents MUST NOT suggest a direct local-main merge and MUST NOT merge the working branch into local `main` at phase completion
|
|
66
66
|
|
|
67
67
|
## Primary execution rules
|
|
@@ -104,7 +104,7 @@ Follow [Anti-patterns](../docs/anti-patterns.md) for the general tooling-interna
|
|
|
104
104
|
|
|
105
105
|
- <!-- rule: LOCAL-PHASE-ONE-AT-A-TIME --> You MUST implement **one phase at a time** and MUST NOT refine later phases in detail before the current phase is complete.
|
|
106
106
|
- Use the `refiner` agent for phase-refinement work when subagents are available; escalate RFC-worthy technical decisions to the parent session / human operator.
|
|
107
|
-
- <!-- rule: LOCAL-TEST-FIRST-COVERAGE --> You MUST work **test-first** for all non-trivial logic
|
|
107
|
+
- <!-- rule: LOCAL-TEST-FIRST-COVERAGE --> You MUST work **test-first** for all non-trivial logic; coverage thresholds are owned by [VALIDATE-COVERAGE-THRESHOLD](../docs/validation-policy.md).
|
|
108
108
|
- Log detailed iteration artifacts under `tmp/` using the required structure below.
|
|
109
109
|
- Spec-of-record split (phase-doc-backed vs. tracker-backed vs. lightweight): see [Tracker-backed local implementation](#tracker-backed-local-implementation) above.
|
|
110
110
|
- When a phase changes durable product truth in ways `PLAN.md` should express (for example command surface, accepted product decisions, resolved open questions, or scope changes), update [Project Plan](../../PLAN.md) before closing the phase.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: "loop-grill"
|
|
3
|
-
description: "Standalone pre-loop Socratic Q&A grill for issues (tracker-first) or local plan files (local-planning). Detects spec gaps, asks clarifying questions (interactive) or self-answers them from codebase context (--auto), then
|
|
3
|
+
description: "Standalone pre-loop Socratic Q&A grill for issues (tracker-first), PR bodies, or local plan files (local-planning). Detects spec gaps, asks clarifying questions (interactive) or self-answers them from codebase context (--auto), then synthesizes Acceptance criteria / Definition of done / Non-goals into the body while keeping the raw Q&A only in an ephemeral tmp artifact."
|
|
4
4
|
allowed-tools: Read Bash Edit Write
|
|
5
5
|
user-invocable: false
|
|
6
6
|
---
|
|
@@ -12,15 +12,23 @@ A standalone, on-demand pre-loop grilling skill. Run it against an issue or a lo
|
|
|
12
12
|
|
|
13
13
|
It is entirely separate from the in-loop docs-grill (`docs/docs-grill-step.md`), which audits code/doc drift while the loop runs. This skill operates on the *spec* before any implementation begins.
|
|
14
14
|
|
|
15
|
+
## State machine
|
|
16
|
+
|
|
17
|
+
This grill is the bounded, closed sub-loop modeled by `packages/core/src/loop/refinement-grill-state.mjs` (detector `scripts/loop/detect-refinement-grill-state.mjs`), rendered on the State atlas; see `docs/refinement-grill-state-graph.md`. It obeys `GRILL-SUBLOOP-STATE-MACHINE`, `GRILL-SUBLOOP-ITERATE-TO-CLEAN`, `GRILL-SUBLOOP-NO-EMBED-SYNTHESIS`, and `GRILL-SUBLOOP-HONEST-HANDOFF`. Iteration lives in the transition graph; the answer/synthesis is the bounded input consumed at the `await_answers` state.
|
|
18
|
+
|
|
15
19
|
## Interface
|
|
16
20
|
|
|
17
21
|
```
|
|
18
22
|
/loop-grill <issue-number> # tracker-first, interactive
|
|
19
23
|
/loop-grill <issue-number> --auto # tracker-first, auto-answer
|
|
24
|
+
/loop-grill <pr-url-or-number> # PR body, interactive
|
|
25
|
+
/loop-grill <pr-url-or-number> --auto # PR body, auto-answer
|
|
20
26
|
/loop-grill <path/to/plan.md> # local-planning, interactive
|
|
21
27
|
/loop-grill <path/to/plan.md> --auto # local-planning, auto-answer
|
|
22
28
|
```
|
|
23
29
|
|
|
30
|
+
PR bodies are supported the same way as issues: fetch/edit the PR body via the existing PR wrappers (`scripts/github/view-pr.mjs` / `scripts/github/edit-pr.mjs`), never raw `gh`.
|
|
31
|
+
|
|
24
32
|
## Argument validation (fail-closed)
|
|
25
33
|
|
|
26
34
|
Before doing anything else:
|
|
@@ -33,9 +41,12 @@ Before doing anything else:
|
|
|
33
41
|
|
|
34
42
|
## Step 1 — Load the target
|
|
35
43
|
|
|
36
|
-
- **Tracker-first:** fetch the issue body (title + description
|
|
44
|
+
- **Tracker-first:** fetch the issue body (title + description).
|
|
45
|
+
- **PR body:** fetch the PR body via `scripts/github/view-pr.mjs` (never raw `gh`).
|
|
37
46
|
- **Local-planning:** read the plan file from disk.
|
|
38
47
|
|
|
48
|
+
"Is it refined" is decided by `detectIssueRefinementArtifact` (`packages/core/src/loop/issue-refinement-artifact.mjs`) — the single source of truth, same as the enqueue gate; do not add a divergent check. An already-refined artifact (AC/DoD present) is a zero-iteration `grill_clean`: do not rewrite the body.
|
|
49
|
+
|
|
39
50
|
## Step 1b — Surface external resources
|
|
40
51
|
|
|
41
52
|
Before detecting gaps, scan the loaded content for external resource references: links, other repo URLs, API endpoints, doc URLs, screenshots, or Playwright navigation descriptors.
|
|
@@ -89,15 +100,20 @@ Record the evidence source for every answer. Flag a question as **`unresolved`**
|
|
|
89
100
|
|
|
90
101
|
Do not silently guess an `inferred` answer when no evidence can be cited — flag it `unresolved` instead.
|
|
91
102
|
|
|
92
|
-
## Step 4 — Write back (
|
|
103
|
+
## Step 4 — Write back (synthesize sections; raw Q&A to tmp only)
|
|
93
104
|
|
|
94
|
-
|
|
105
|
+
Synthesize the answers into the body as sharpened `## Acceptance criteria`, `## Definition of done`, and `## Non-goals` sections. Per canonical heading, use **replace-section** semantics:
|
|
95
106
|
|
|
96
|
-
- **Find** the existing
|
|
97
|
-
- **Replace** that range in place with the
|
|
98
|
-
- If no `## Grill findings` section exists, **append** it.
|
|
107
|
+
- **Find** the existing section: the range from that `##`-level heading through the next `##`-level heading (exclusive) or end of file.
|
|
108
|
+
- **Replace** that range in place with the synthesized content; if the section is absent, **append** it.
|
|
99
109
|
- This makes re-runs idempotent — no accumulated noise, no duplicate sections.
|
|
100
|
-
- If parsing
|
|
110
|
+
- If parsing a section boundary fails, **abort with an error** rather than silently truncating.
|
|
111
|
+
|
|
112
|
+
The body carries ONLY the synthesized sharpened sections. Do NOT write a `## Grill findings` section and do NOT embed the raw Q&A table in the body (`GRILL-SUBLOOP-NO-EMBED-SYNTHESIS`).
|
|
113
|
+
|
|
114
|
+
If a body migrated from older embed behavior still carries a `## Grill findings` section, **remove** it as part of write-back — strip from that heading through the next `##`-level heading (exclusive) or end of file, using the same replace-section boundary logic. This is a removal-only migration, never a re-introduction of the embed.
|
|
115
|
+
|
|
116
|
+
Write the raw Q&A transcript ONLY to the gitignored, ephemeral, session-scoped artifact `tmp/issues/issue-<n>/grill/<timestamp>.md` (`tmp/` is already gitignored; never committed). For PR-body and plan-file surfaces, use the same tmp path shape scoped by surface (issues: `tmp/issues/issue-<n>/grill/`; a parallel `tmp/...` path for PR/plan).
|
|
101
117
|
|
|
102
118
|
**Tracker-first write-back:** update the GitHub issue body using:
|
|
103
119
|
|
|
@@ -105,19 +121,23 @@ Write a `## Grill findings` section back to the source artifact using **replace-
|
|
|
105
121
|
gh issue edit <n> --repo <owner/repo> --body-file <tmp-path>
|
|
106
122
|
```
|
|
107
123
|
|
|
108
|
-
The
|
|
124
|
+
The synthesized sections live in the issue body, not as a comment. Do not use `comment-issue.mjs` here — that creates a comment, not a body update.
|
|
125
|
+
|
|
126
|
+
**PR-body write-back:** update the PR body via `scripts/github/edit-pr.mjs` (never raw `gh`), same replace-section semantics.
|
|
109
127
|
|
|
110
|
-
**GitHub body size guard:** issue bodies are capped at 65,536 characters. Before writing back, check whether the updated body would exceed this limit. If so, warn: `Warning: updated body would exceed GitHub's 65,536-character limit — write-back skipped.
|
|
128
|
+
**GitHub body size guard:** issue/PR bodies are capped at 65,536 characters. Before writing back, check whether the updated body would exceed this limit. If so, warn: `Warning: updated body would exceed GitHub's 65,536-character limit — write-back skipped. Sharpen the sections or the body manually.` Do not silently truncate.
|
|
111
129
|
|
|
112
130
|
**Local-planning write-back:** update the plan file in place using the edit tool.
|
|
113
131
|
|
|
114
132
|
## Output artifact format
|
|
115
133
|
|
|
116
|
-
|
|
134
|
+
Two distinct artifacts:
|
|
117
135
|
|
|
118
|
-
|
|
119
|
-
## Grill findings
|
|
136
|
+
1. **Synthesized body sections** (issue/PR/plan body): only `## Acceptance criteria`, `## Definition of done`, and `## Non-goals`, sharpened from the answers. No raw Q&A.
|
|
120
137
|
|
|
138
|
+
2. **Raw Q&A transcript** (ephemeral `tmp/issues/issue-<n>/grill/<timestamp>.md` only — never the body):
|
|
139
|
+
|
|
140
|
+
```markdown
|
|
121
141
|
<!-- loop-grill: <timestamp> mode:<interactive|auto> -->
|
|
122
142
|
|
|
123
143
|
### Resolved gaps
|
|
@@ -152,7 +172,7 @@ When `CONTEXT.md` is absent from the repo root, skip the context-source check si
|
|
|
152
172
|
|
|
153
173
|
## Idempotency guarantee
|
|
154
174
|
|
|
155
|
-
Running `/loop-grill` twice on the same target must
|
|
175
|
+
Running `/loop-grill` twice on the same target must not accumulate duplicate sections: the per-heading replace-section logic replaces the synthesized `## Acceptance criteria` / `## Definition of done` / `## Non-goals` sections in place. An already-refined target is a zero-iteration `grill_clean` and its body is left unchanged. The raw Q&A transcript is written to a fresh timestamped tmp file per run; the body never carries it.
|
|
156
176
|
|
|
157
177
|
## Non-goals
|
|
158
178
|
|
package/AGENTS.md
CHANGED
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
- When creating GitHub issues via `gh issue create`, always include `--assignee @me` so the new artifact is self-assigned.
|
|
17
17
|
- When creating PRs in this repo, use the canonical `dev-loops pr create ...` path (always draft, self-assigned by default; `--assignee @me` is the default) — never raw `gh pr create`.
|
|
18
18
|
- Never start implementation (file mutation, branch creation, PR creation) without explicit instruction. "Queue," "add to list," "track," "note" are NOT implementation triggers. Only proceed when the user says "start," "go," "implement," "do it," "work on," or equivalent imperative. Confirm if unsure.
|
|
19
|
-
- All work must originate from a tracked artifact: a GitHub issue (tracker-first)
|
|
19
|
+
- All work must originate from a tracked artifact: a GitHub issue (tracker-first), a persisted markdown plan file (local-planning), or — on the sanctioned lightweight path — the PR description itself as the spec-of-record (`--lightweight`, `canonicalSpecSource: pr_body`; no committed plan artifact). See [Artifact Authority Contract](skills/docs/artifact-authority-contract.md) for canonical mode definitions and settings. No work may originate from a PR (other than the sanctioned lightweight PR-body-as-spec path) or a direct local change unless explicitly requested.
|
|
20
20
|
- Implement one phase at a time; if durable repo docs explicitly record a reprioritization exception, follow [Implementation State](docs/IMPLEMENTATION_STATE.md) and the active phase doc.
|
|
21
21
|
- Keep compatibility surface minimal; do not add legacy aliases, wrappers, or duplicate docs unless explicitly requested.
|
|
22
22
|
- A question requires an answer, not an action. When the user asks a question — even one implying criticism or correction — answer first before taking any action. Do not treat a question as implicit authorization to act.
|
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,36 @@ All notable changes to this project will be documented in this file.
|
|
|
4
4
|
|
|
5
5
|
## Unreleased
|
|
6
6
|
|
|
7
|
+
## 0.8.0 - 2026-07-08
|
|
8
|
+
|
|
9
|
+
<!-- Release date is set at tag time; see the release runbook. This section is prepared ahead of the v0.8.0 tag. -->
|
|
10
|
+
|
|
11
|
+
Everything merged since v0.7.1 — the v0.7.x contract-audit epic (#1104) plus follow-on release-gate fixes. **Versioning note:** most of these commits are ancestors of the `v0.7.2` tag and therefore already ship in the published `0.7.2` npm artifact, but `v0.7.2`'s release notes documented only the #1241 packaging hotfix (see the 0.7.2 section below). This section backfills that omitted changelog and adds the nine changes that genuinely postdate the `v0.7.2` tag (#1240, #1242, #1244, #1249, #1250, #1253, #1254, #1256, and #1236/#1252); it becomes the notes for the eventual `v0.8.0` tag.
|
|
12
|
+
|
|
13
|
+
### Added
|
|
14
|
+
|
|
15
|
+
- **Issue-less lightweight PR-first flow (#1210/#1215).** A PR with no backing issue can drive the lightweight path with a configurable composed Copilot round cap; such PRs auto-enqueue as board items so they are still tracked (#1218/#1226).
|
|
16
|
+
- **State-machine conformance and invariant harness (#1148/#1189).** Built on a rule-ownership foundation (#1183). The PR lifecycle state machine is exported from `@dev-loops/core` as the single source for docs, the state atlas, and the conformance harness (#1193/#1216), and `public-dev-loop-routing` is wired into the L2/L3 conformance harness so all five machines are covered (#1233/#1239).
|
|
17
|
+
- **Inline reviewer briefing prefix (#1220/#1229).** The reviewed content is carried inline, size-capped and hash-enforced, on top of invariant-prefix-first reviewer briefings with prefix-hash enforcement (#1207/#1214).
|
|
18
|
+
- **First-class loop primitives (#1198/#1223).** `list-review-threads` and `wait-pr-checks`, plus a sanctioned `edit-issue.mjs` wrapper for AC-reflection body edits (#1253) and a refinement-artifact-at-enqueue requirement so no un-refined item enters Next Up (#1251/#1254).
|
|
19
|
+
- **State-atlas fullscreen lightbox for diagrams (#1217).** Diagrams open in a fullscreen lightbox for readable inspection.
|
|
20
|
+
|
|
21
|
+
### Fixed
|
|
22
|
+
|
|
23
|
+
- **Package-escaping `@dev-loops/core` imports broke consumer installs (#1241).** Shipped as the v0.7.2 hotfix; full detail is in the 0.7.2 section below.
|
|
24
|
+
- **Converge-then-gate enforced at `pre_approval` entry (#1190/#1219).** Retires the known gap where a gate could run before Copilot convergence.
|
|
25
|
+
- **Fanout provenance fails closed on missing mandatory or foreign angles (#1196/#1225).** Briefing-prefix verification is also scoped by (gate, headSha) (#1249).
|
|
26
|
+
- **Reviewer-loop submission-failure edges join the transition table (#1200/#1221).** Copilot summon literals are sanitized on write with a code-span-aware guard and an honest blocked status (#1213/#1222).
|
|
27
|
+
- **Issue-less lightweight PR-first three-origin contracts reconciled (#1242).** Adds a gate-coordination `specSource` branch; a contradiction sweep covers gate-skip scoping, coverage-modality ownership, and advisory wording (#1244).
|
|
28
|
+
- **run-claim coordination file anchored at the git common dir, not CWD (#1250).** The per-PR runner lease now resolves its coordination file from the shared git common dir, so a runner started from a different worktree/CWD attaches to the same lease instead of forking a second one.
|
|
29
|
+
- **`queue --item` accepts the full node-ID alphabet across the projects scripts (#1227/#1230).** The `--item` node-ID parser now accepts the complete GitHub node-ID character set, so board items whose IDs use previously-rejected characters resolve consistently across the projects scripts.
|
|
30
|
+
- **release.yml dispatches npm-publish.yml explicitly after creating the release (#1187/#1188).** Pages deploy is bumped to deploy-pages v5 (#1211/#1212) and the gate-hub flowchart renders left-to-right (#1208/#1209).
|
|
31
|
+
- **docs-validator manifest gap and corpus→manifest completeness (#1238).** Epic AC1/AC2 zero-states restored — canonical-owner openers plus remaining phrase pins (#1240).
|
|
32
|
+
|
|
33
|
+
### Changed
|
|
34
|
+
|
|
35
|
+
- **Contract corpus condensation + single-owner rule IDs.** Rule ownership migrated to single-owner IDs across the gate, queue, loop, worktree, intake, and public-loop clusters, with residual normative phrase-pins retired to a zero-pin end state (#1149–#1159, #1191–#1206). Inline interpreters were banned from coordinator flows in favor of sanctioned paths by reference (#1224/#1228), a final corpus condensation sweep rewired rule IDs with zero semantic change (#1236/#1252), and RFC-2119 modality was harmonized on newly-tagged merge/confirmation clauses (#1256).
|
|
36
|
+
|
|
7
37
|
## 0.7.2 - 2026-07-06
|
|
8
38
|
|
|
9
39
|
### Fixed
|
package/README.md
CHANGED
|
@@ -1,72 +1,65 @@
|
|
|
1
1
|
# dev-loops
|
|
2
2
|
|
|
3
|
-
Turn GitHub
|
|
3
|
+
Turn a GitHub issue into a merged PR autonomously, up to a human-approval checkpoint.
|
|
4
4
|
|
|
5
|
-
|
|
5
|
+
**Harness-agnostic by design.** The same dev loop runs three ways over one shared core (`packages/core`): as a **Claude Code plugin**, as a **Pi extension**, and as a standalone **CLI**. Routing, gates, and phases are defined once in the core; the plugin and extension are thin integrations over that shared workflow.
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
## What is a dev loop?
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
A dev loop takes a GitHub issue through seven lifecycle phases — from intake to merge — with deterministic routing, self-correcting review gates, and autonomous execution until a human approves. The phase is always consultable from the deterministic state model in `packages/core/src/loop/lifecycle-state.mjs`.
|
|
10
10
|
|
|
11
11
|
| Phase | What happens |
|
|
12
12
|
|---|---|
|
|
13
13
|
| `issue_intake` | Normalize the issue, confirm scope, detect linked PRs |
|
|
14
|
-
| `refinement` | Elaborate spec, run bounded audit, harden acceptance criteria |
|
|
14
|
+
| `refinement` | Elaborate the spec, run a bounded audit, harden acceptance criteria |
|
|
15
15
|
| `implementation` | Build the accepted scope on a feature branch or via Copilot |
|
|
16
|
-
| `draft_gate` | Gate review at the draft→ready boundary before marking PR ready |
|
|
16
|
+
| `draft_gate` | Gate review at the draft→ready boundary before marking the PR ready |
|
|
17
17
|
| `feedback_resolution` | Fix, reply to, and resolve review threads on GitHub |
|
|
18
18
|
| `pre_approval_gate` | Final gate review: verify evidence, CI, and unresolved threads |
|
|
19
19
|
| `merge` | Merge the PR and write the retrospective checkpoint |
|
|
20
20
|
|
|
21
|
-
|
|
21
|
+
The public routing contract is the [Public Dev Loop Contract](./skills/docs/public-dev-loop-contract.md).
|
|
22
22
|
|
|
23
23
|
## Quick start
|
|
24
24
|
|
|
25
|
-
|
|
25
|
+
`dev-loop` is the single public entrypoint. Drive it in natural language — it resolves the authoritative current state, picks the correct internal strategy, and routes deterministically. You never name internal strategies.
|
|
26
26
|
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
27
|
+
```text
|
|
28
|
+
start dev loop on issue 112 # start work on an issue
|
|
29
|
+
auto dev loop on issue 112 # run autonomously to the human-approval checkpoint
|
|
30
|
+
continue dev loop on PR 88 # continue follow-up on an open PR
|
|
31
|
+
```
|
|
30
32
|
|
|
31
|
-
|
|
33
|
+
See the canonical shorthand mapping in the [Public Dev Loop Contract](./skills/docs/public-dev-loop-contract.md).
|
|
32
34
|
|
|
33
|
-
|
|
35
|
+
## Commands
|
|
34
36
|
|
|
35
|
-
|
|
37
|
+
`dev-loop` (natural language) is the catch-all router — reach for the named commands below only when you want a direct, unrouted entrypoint. The syntax differs by harness:
|
|
36
38
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
| `/dev-loops:start <issue>` | start dev loop on issue `<issue>` |
|
|
40
|
-
| `/dev-loops:auto <issue>` | auto dev loop on issue `<issue>` (autonomous until human approval) |
|
|
41
|
-
| `/dev-loops:continue [issue\|pr]` | continue dev loop on `<issue\|pr>`; bare resumes the single in-progress board item |
|
|
42
|
-
| `/dev-loops:start-spike <question>` | start a time-boxed spike from a question (or `--file <path>` for a pre-authored findings file) |
|
|
43
|
-
| `/dev-loops:info <issue|pr>` | read-only state summary (`loop info`) |
|
|
44
|
-
| `/dev-loops:status` | dev-loop readiness (gh auth, git repo, subagent) |
|
|
39
|
+
- **Claude Code** exposes each as a plugin slash command: `/loop-start`, `/loop-auto`, …
|
|
40
|
+
- **Pi** exposes the core entrypoints as subcommands of one command: `/dev-loops start`, `/dev-loops auto`, …
|
|
45
41
|
|
|
46
|
-
|
|
42
|
+
| Command | Claude Code | Pi | Does |
|
|
43
|
+
|---|---|---|---|
|
|
44
|
+
| start | `/loop-start <issue>` | `/dev-loops start <issue>` | Start a dev loop on an issue |
|
|
45
|
+
| auto | `/loop-auto <issue>` | `/dev-loops auto <issue>` | Run autonomously to the human-approval checkpoint |
|
|
46
|
+
| continue | `/loop-continue [issue\|pr]` | `/dev-loops continue [issue\|pr]` | Continue; bare resumes the in-progress board item |
|
|
47
|
+
| start-spike | `/loop-start-spike <question>` | `/dev-loops start-spike <question>` | Time-boxed spike (or `--file <path>`) |
|
|
48
|
+
| info | `/loop-info <issue\|pr>` | `/dev-loops info <issue\|pr>` | Read-only state summary |
|
|
49
|
+
| status | `/loop-status` | `/dev-loops status` | Readiness check (gh auth, git repo, subagent) |
|
|
50
|
+
| enqueue | `/loop-enqueue <issue\|pr\|text>` | — | Queue an issue/PR, or capture an idea as a grilled issue |
|
|
51
|
+
| grill | `/loop-grill <issue\|plan> [--auto]` | — | Socratic Q&A grill of an issue or plan before the loop |
|
|
52
|
+
| queue-status | `/loop-queue-status` | — | Show the queue board grouped by column |
|
|
47
53
|
|
|
48
|
-
|
|
54
|
+
Beyond the per-issue loop entrypoints, the Pi `/dev-loops` command and the `dev-loops` CLI also expose standalone utilities: `help`, `status`, `doctor`, `gates` (`status` is the same readiness check as `loop-status` above). `hide` works only inside Pi — the `dev-loops hide` CLI subcommand is recognized but intentionally exits non-zero (session-local Pi UI behavior). Everything above is also available as a skill/agent — inside Pi, hand work to the `dev-loop` skill rather than calling internal routed skills (`local-implementation`, `copilot-pr-followup`, `final-approval`) directly.
|
|
49
55
|
|
|
50
|
-
|
|
56
|
+
## Install
|
|
51
57
|
|
|
52
|
-
|
|
53
|
-
single source of truth (`<version>` = your installed `dev-loops` version) and cannot drift:
|
|
54
|
-
|
|
55
|
-
```bash
|
|
56
|
-
npx dev-loops@<version> --help
|
|
57
|
-
```
|
|
58
|
-
|
|
59
|
-
A global `npm install -g dev-loops` is **not** the supported invocation path: the global
|
|
60
|
-
binary updates independently of the plugin/extension and silently drifts out of version
|
|
61
|
-
(#833/#1036). Install it only as an optional bare shell convenience.
|
|
58
|
+
All examples pin to `<version>` = the `dev-loops` version you installed; keep the CLI, plugin, and extension on the same version so behavior can't drift.
|
|
62
59
|
|
|
63
60
|
### Claude Code plugin
|
|
64
61
|
|
|
65
|
-
The repo ships a
|
|
66
|
-
`.claude/.claude-plugin/plugin.json`) exposing the dev-loop **agents, skills, and hooks**.
|
|
67
|
-
|
|
68
|
-
Install it from the bundled marketplace catalog (`.claude-plugin/marketplace.json`) by running
|
|
69
|
-
these slash commands inside Claude Code:
|
|
62
|
+
The repo ships a plugin rooted at `.claude/` (manifest at `.claude/.claude-plugin/plugin.json`) exposing the dev-loop agents, skills, and hooks. Install it from the bundled marketplace catalog:
|
|
70
63
|
|
|
71
64
|
```text
|
|
72
65
|
/plugin marketplace add mfittko/dev-loops # register the marketplace
|
|
@@ -76,206 +69,113 @@ these slash commands inside Claude Code:
|
|
|
76
69
|
Or load it directly for a single session without installing:
|
|
77
70
|
|
|
78
71
|
```bash
|
|
79
|
-
claude --plugin-dir .claude
|
|
80
|
-
claude --plugin-dir .claude plugin details dev-loops # inspect the discovered components
|
|
72
|
+
claude --plugin-dir .claude
|
|
81
73
|
```
|
|
82
74
|
|
|
83
|
-
|
|
75
|
+
Installed from npm, point at the bundled copy: `claude --plugin-dir node_modules/dev-loops/.claude`.
|
|
84
76
|
|
|
85
|
-
The
|
|
86
|
-
reference, and strips Pi-runtime-only prose from the generated assets. The hooks provide the
|
|
87
|
-
`gh pr ready` draft-gate guard and the main-agent read-only boundary (the read-only enforcement
|
|
88
|
-
is opt-in via `DEVLOOPS_MAIN_AGENT_READONLY=1`). Skill references to a project's own `PLAN.md` /
|
|
89
|
-
`AGENTS.md` resolve against the consumer repo, by design.
|
|
77
|
+
The hooks provide the `gh pr ready` draft-gate guard and an opt-in read-only boundary for the main agent (`DEVLOOPS_MAIN_AGENT_READONLY=1`). Skill references to a consumer repo's own `PLAN.md` / `AGENTS.md` resolve against that repo, by design.
|
|
90
78
|
|
|
91
79
|
### Pi extension
|
|
92
80
|
|
|
93
|
-
To use `/dev-loops` inside Pi:
|
|
94
|
-
|
|
95
81
|
```bash
|
|
96
|
-
pi install npm:dev-loops
|
|
97
|
-
dev-loops
|
|
82
|
+
pi install npm:dev-loops@<version> # global, pinned npm package
|
|
83
|
+
pi install -l npm:dev-loops@<version> # project-local (.pi/settings.json)
|
|
98
84
|
```
|
|
99
85
|
|
|
100
86
|
You can also install from git:
|
|
101
87
|
|
|
102
88
|
```bash
|
|
103
|
-
pi install git:github.com/mfittko/dev-loops
|
|
104
|
-
pi install -l git:github.com/mfittko/dev-loops
|
|
105
|
-
```
|
|
106
|
-
|
|
107
|
-
The CLI requires Node `>=24` and a GitHub-authenticated `gh` CLI for repository workflows. See [Requirements](#requirements).
|
|
108
|
-
|
|
109
|
-
## Docker
|
|
110
|
-
|
|
111
|
-
A deterministic container image with all required tooling for dev-loop operation.
|
|
112
|
-
|
|
113
|
-
### Build
|
|
114
|
-
|
|
115
|
-
```bash
|
|
116
|
-
docker build -t dev-loops .
|
|
117
|
-
```
|
|
118
|
-
|
|
119
|
-
### Environment variables
|
|
120
|
-
|
|
121
|
-
| Variable | Purpose | Required for smoke test |
|
|
122
|
-
|---|---|---|
|
|
123
|
-
| `GH_TOKEN` | GitHub personal access token for `gh` CLI and API calls | Yes |
|
|
124
|
-
| `OPENAI_API_KEY` | LLM provider key (needed only when running `pi` / LLM-backed dev-loop operations) | No |
|
|
125
|
-
|
|
126
|
-
### Smoke test
|
|
127
|
-
|
|
128
|
-
Verify the image works with a minimal dev-loop info call:
|
|
129
|
-
|
|
130
|
-
```bash
|
|
131
|
-
docker run --rm -e GH_TOKEN="$GH_TOKEN" dev-loops dev-loops loop info --repo mfittko/dev-loops --issue 1
|
|
89
|
+
pi install git:github.com/mfittko/dev-loops@<tag-or-sha> # global
|
|
90
|
+
pi install -l git:github.com/mfittko/dev-loops@<tag-or-sha> # project-local
|
|
132
91
|
```
|
|
133
92
|
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
Check that all required tools are reachable:
|
|
137
|
-
|
|
138
|
-
```bash
|
|
139
|
-
docker run --rm dev-loops node --version
|
|
140
|
-
docker run --rm dev-loops pi --version
|
|
141
|
-
docker run --rm dev-loops dev-loops --version
|
|
142
|
-
docker run --rm dev-loops gh --version
|
|
143
|
-
docker run --rm dev-loops git --version
|
|
144
|
-
```
|
|
145
|
-
|
|
146
|
-
### Repeatable builds
|
|
147
|
-
|
|
148
|
-
The Dockerfile pins exact versions for Node.js (via base image), pi CLI, pi extensions, and gh CLI. Paired with the committed `package-lock.json`, repeat builds produce functionally identical toolchain versions.
|
|
149
|
-
|
|
150
|
-
### Runtime patterns
|
|
151
|
-
|
|
152
|
-
**Interactive Pi with host config (writable):**
|
|
93
|
+
Once a project is trusted, Pi auto-installs missing packages on startup. Install `pi-subagents` the same way when the repo relies on async loop behavior.
|
|
153
94
|
|
|
154
|
-
|
|
155
|
-
docker run -it --rm \
|
|
156
|
-
-e GH_TOKEN="$GH_TOKEN" \
|
|
157
|
-
-v "$HOME/.pi:/home/node/.pi" \
|
|
158
|
-
dev-loops pi
|
|
159
|
-
```
|
|
160
|
-
|
|
161
|
-
Shares sessions, models, settings. Container writes session logs to host `~/.pi`.
|
|
95
|
+
### CLI
|
|
162
96
|
|
|
163
|
-
|
|
97
|
+
Run the CLI version-pinned:
|
|
164
98
|
|
|
165
99
|
```bash
|
|
166
|
-
|
|
167
|
-
-e GH_TOKEN="$GH_TOKEN" \
|
|
168
|
-
-e OPENAI_API_KEY="$OPENAI_API_KEY" \
|
|
169
|
-
dev-loops pi
|
|
100
|
+
npx dev-loops@<version> --help
|
|
170
101
|
```
|
|
171
102
|
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
**Full dev-loop with live repo worktree:**
|
|
175
|
-
|
|
176
|
-
```bash
|
|
177
|
-
git clone --mirror git@github.com:owner/repo.git /tmp/mirror
|
|
178
|
-
git --git-dir=/tmp/mirror worktree add /tmp/run /tmp/mirror/main
|
|
179
|
-
|
|
180
|
-
docker run -it --rm \
|
|
181
|
-
-e GH_TOKEN="$GH_TOKEN" \
|
|
182
|
-
-v "$HOME/.pi:/home/node/.pi" \
|
|
183
|
-
-v /tmp/run:/workspace \
|
|
184
|
-
dev-loops pi
|
|
185
|
-
```
|
|
103
|
+
A global `npm install -g dev-loops` is an optional bare-shell convenience only — it is not version-pinned, updates independently of the plugin/extension, and can silently drift out of sync (#833/#1036). Prefer the pinned `npx` invocation.
|
|
186
104
|
|
|
187
|
-
|
|
105
|
+
## Requirements
|
|
188
106
|
|
|
189
|
-
|
|
107
|
+
Universal:
|
|
190
108
|
|
|
191
|
-
-
|
|
192
|
-
-
|
|
193
|
-
- Use local implementation only when explicitly requested
|
|
194
|
-
- Internal routed logic stays behind the public façade
|
|
109
|
+
- Node `>=24`
|
|
110
|
+
- `gh` installed and authenticated for GitHub/Copilot workflows
|
|
195
111
|
|
|
196
|
-
|
|
112
|
+
Pi-harness only:
|
|
197
113
|
|
|
198
|
-
|
|
114
|
+
- `pi-subagents` for async workflow behavior
|
|
115
|
+
- A Pi host satisfying the peer dependencies `@earendil-works/pi-coding-agent` and `@earendil-works/pi-tui`
|
|
199
116
|
|
|
200
117
|
## Configuration
|
|
201
118
|
|
|
202
|
-
|
|
119
|
+
Defaults ship in `packages/core/src/config/extension-defaults.yaml`. A repo-local `.pi/dev-loop/defaults.*` layer merges on top of them when present, then consumer repos override everything in a `.devloops` file at the repo root (`.devloops.yaml` / `.yml` / `.json` are also accepted); `.devloops` is authoritative when present. The legacy `.pi/dev-loop/settings.*` and `overrides.*` files load only as a fallback when no `.devloops` is present; when `.devloops` exists they are ignored (a deprecation warning still fires if they are present).
|
|
203
120
|
|
|
204
121
|
```bash
|
|
205
|
-
npx dev-loops@<version> gates #
|
|
122
|
+
npx dev-loops@<version> gates # print what reviewers will check
|
|
206
123
|
```
|
|
207
124
|
|
|
208
125
|
Key surfaces:
|
|
209
|
-
|
|
210
|
-
- **
|
|
211
|
-
- **
|
|
126
|
+
|
|
127
|
+
- **Gate angles** — which review lenses run at the draft and pre-approval gates
|
|
128
|
+
- **Personas** — focused per-angle prompts (DRY, KISS, YAGNI, SRP, SoC, and more)
|
|
129
|
+
- **Refinement** — fan-out count and mode for parallel review variants; `refinement.maxCopilotRounds` caps Copilot re-review rounds (default `5`). Set `maxCopilotRounds: 0` to disable the Copilot gate entirely — local-harness-only review (`draft_gate → pre_approval_gate`), useful when the repo has no Copilot reviewer configured.
|
|
212
130
|
- **Autonomy** — which gates require operator confirmation
|
|
213
131
|
- **Workflow defaults** — retrospective enforcement, draft-first posture, dev-mode policy
|
|
214
132
|
|
|
215
|
-
Full details:
|
|
216
|
-
|
|
217
|
-
### Migrating from an earlier release
|
|
218
|
-
|
|
219
|
-
Upgrading an install from before the rename to `dev-loops`? The package name, repo slug,
|
|
220
|
-
and all `PI_*` environment variables changed (the env vars are a clean break — no aliases).
|
|
221
|
-
See the [migration guide](./docs/migrating-to-dev-loops.md) for the full change list.
|
|
222
|
-
|
|
223
|
-
## Package surface
|
|
133
|
+
Full details: the shipped defaults in `packages/core/src/config/extension-defaults.yaml` and the loader in `packages/core/src/config/config.mjs`.
|
|
224
134
|
|
|
225
|
-
|
|
135
|
+
## Docker
|
|
226
136
|
|
|
227
|
-
|
|
137
|
+
A deterministic container image with all required tooling for dev-loop operation.
|
|
228
138
|
|
|
229
139
|
```bash
|
|
230
|
-
|
|
231
|
-
pi install -l npm:dev-loops@<version> # project-local, pinned npm package
|
|
232
|
-
pi install git:github.com/mfittko/dev-loops@<tag-or-sha> # global, pinned git ref
|
|
233
|
-
pi install -l git:github.com/mfittko/dev-loops@<tag-or-sha> # project-local, pinned git ref
|
|
234
|
-
```
|
|
235
|
-
|
|
236
|
-
Project-local installs write to `.pi/settings.json`; after the project is trusted, Pi auto-installs missing packages on startup. Install `pi-subagents` the same way when the repo depends on async loop behavior.
|
|
237
|
-
|
|
238
|
-
Inside Pi, use `dev-loop` as the single public skill/agent entrypoint:
|
|
239
|
-
|
|
240
|
-
```js
|
|
241
|
-
subagent({
|
|
242
|
-
agent: "dev-loop",
|
|
243
|
-
task: "Start dev loop on issue 123 in owner/repo..."
|
|
244
|
-
})
|
|
140
|
+
docker build -t dev-loops .
|
|
245
141
|
```
|
|
246
142
|
|
|
247
|
-
|
|
143
|
+
| Variable | Purpose | Required |
|
|
144
|
+
|---|---|---|
|
|
145
|
+
| `GH_TOKEN` | GitHub token for `gh` CLI and API calls | Yes |
|
|
146
|
+
| `OPENAI_API_KEY` | LLM provider key (only for `pi` / LLM-backed operations) | No |
|
|
248
147
|
|
|
249
|
-
|
|
148
|
+
Smoke test the image with a minimal read-only info call:
|
|
250
149
|
|
|
251
150
|
```bash
|
|
252
|
-
|
|
253
|
-
/dev-loops auto <issue> # dispatch: auto dev loop on issue <issue>
|
|
254
|
-
/dev-loops continue [issue|pr] # dispatch: continue dev loop on <issue|pr>; bare = current in-progress board item
|
|
255
|
-
/dev-loops info <issue|pr> # read-only state summary
|
|
256
|
-
/dev-loops status
|
|
257
|
-
/dev-loops doctor
|
|
258
|
-
/dev-loops gates
|
|
151
|
+
docker run --rm -e GH_TOKEN="$GH_TOKEN" dev-loops dev-loops loop info --repo mfittko/dev-loops --issue 1
|
|
259
152
|
```
|
|
260
153
|
|
|
261
|
-
|
|
154
|
+
Verify the toolchain is reachable:
|
|
262
155
|
|
|
263
156
|
```bash
|
|
264
|
-
|
|
157
|
+
docker run --rm dev-loops node --version
|
|
158
|
+
docker run --rm dev-loops pi --version
|
|
159
|
+
docker run --rm dev-loops dev-loops --version
|
|
160
|
+
docker run --rm dev-loops gh --version
|
|
265
161
|
```
|
|
266
162
|
|
|
267
|
-
|
|
163
|
+
The Dockerfile pins exact versions for Node.js (base image), the pi CLI, pi extensions, and gh CLI; paired with the committed `package-lock.json`, repeat builds produce functionally identical toolchains.
|
|
268
164
|
|
|
269
|
-
|
|
165
|
+
**Runtime patterns:**
|
|
270
166
|
|
|
271
|
-
|
|
167
|
+
```bash
|
|
168
|
+
# Interactive Pi sharing host config (sessions, models, settings write back to ~/.pi)
|
|
169
|
+
docker run -it --rm -e GH_TOKEN="$GH_TOKEN" -v "$HOME/.pi:/home/node/.pi" dev-loops pi
|
|
272
170
|
|
|
273
|
-
|
|
171
|
+
# Interactive Pi, clean (ephemeral ~/.pi; provider auth via env)
|
|
172
|
+
docker run -it --rm -e GH_TOKEN="$GH_TOKEN" -e OPENAI_API_KEY="$OPENAI_API_KEY" dev-loops pi
|
|
274
173
|
|
|
275
|
-
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
174
|
+
# Full dev-loop over a live repo worktree mounted at /workspace
|
|
175
|
+
git clone --mirror git@github.com:owner/repo.git /tmp/mirror
|
|
176
|
+
git --git-dir=/tmp/mirror worktree add /tmp/run /tmp/mirror/main
|
|
177
|
+
docker run -it --rm -e GH_TOKEN="$GH_TOKEN" -v "$HOME/.pi:/home/node/.pi" -v /tmp/run:/workspace dev-loops pi
|
|
178
|
+
```
|
|
279
179
|
|
|
280
180
|
## Development
|
|
281
181
|
|
|
@@ -283,14 +183,20 @@ See [Extension Documentation](./extension/README.md) for the full command and pa
|
|
|
283
183
|
npm run verify # canonical root verification (tests + dev-loop tests)
|
|
284
184
|
```
|
|
285
185
|
|
|
286
|
-
CI splits into a small changed-files gate plus parallel `verify` and conditional `viewer-smoke`
|
|
186
|
+
CI splits into a small changed-files gate plus a parallel `verify-suite` matrix (one leg per `test:*` suite) gated by a fail-closed `verify` job, and a conditional `viewer-smoke` job. On every change, `npm ci` runs and the verify suites run as parallel matrix legs; the Playwright/WebKit viewer smoke runs only when the bounded viewer surface or its smoke-path dependencies change.
|
|
187
|
+
|
|
188
|
+
### Migrating from an earlier release
|
|
189
|
+
|
|
190
|
+
Upgrading from before the rename to `dev-loops`? The package name, repo slug, and all `PI_*` environment variables changed (the env vars are a clean break — no aliases). See the [migration guide](./docs/migrating-to-dev-loops.md).
|
|
287
191
|
|
|
288
192
|
## Further reading
|
|
289
193
|
|
|
290
|
-
- [Docs Index](./docs/index.md) — active docs
|
|
194
|
+
- [Docs Index](./docs/index.md) — active docs and canonical-owner pointers
|
|
195
|
+
- [README Audit Rubric](./docs/readme-audit-rubric.md) — semantic properties this README is audited against (on-demand LLM judge)
|
|
196
|
+
- [Public Dev Loop Contract](./skills/docs/public-dev-loop-contract.md) — public routing contract
|
|
291
197
|
- [Extension Documentation](./extension/README.md) — README-driven extension spec
|
|
292
198
|
- [Scripts Documentation](./scripts/README.md) — deterministic script contracts
|
|
293
199
|
- [UI Smoke Harness](./docs/ui-smoke-harness.md) — reusable local Playwright/WebKit smoke baseline
|
|
294
200
|
- [UI Artifact Contract](./docs/ui-artifact-contract.md) — screenshot/state artifact contract and CI-promotion rules
|
|
295
|
-
- [UI Designer Review Loop](./docs/ui-designer-review-loop.md) — designer + vision (`uiReviewMode: vision`) review loop
|
|
296
|
-
- [Slides Story Review Loop](./docs/slides-story-review-loop.md) — bounded slides content & storytelling reviewer
|
|
201
|
+
- [UI Designer Review Loop](./docs/ui-designer-review-loop.md) — designer + vision (`uiReviewMode: vision`) review loop
|
|
202
|
+
- [Slides Story Review Loop](./docs/slides-story-review-loop.md) — bounded slides content & storytelling reviewer
|
package/agents/refiner.agent.md
CHANGED
|
@@ -37,13 +37,13 @@ For the active phase, require and produce:
|
|
|
37
37
|
|
|
38
38
|
- use exact wording from the source issue(s); when the governing input is a phase doc or other spec instead of an issue, use that source wording exactly for every explicit item in the matrix
|
|
39
39
|
- include every explicit acceptance criterion, definition-of-done item, and non-goal; do not skip items
|
|
40
|
-
- if no explicit definition of done exists, add a `Proposed DoD` subsection before the matrix
|
|
40
|
+
- <!-- rule: REFINER-DOD-PROPOSED-SUBSECTION --> `REFINER-DOD-PROPOSED-SUBSECTION`: if no explicit definition of done exists, add a `Proposed DoD` subsection before the matrix
|
|
41
41
|
- explicit risks, watchpoints, and unresolved questions
|
|
42
42
|
- validation steps and tests to write first
|
|
43
43
|
- durable decisions that SHOULD be preserved in the phase doc
|
|
44
44
|
- when the phase includes a bounded audit or scan: prioritized findings, the highest-value follow-up candidates, and an explicit statement of what the current phase will not rewrite or broaden
|
|
45
45
|
- When an audit artifact is provided, treat it as a first-class planning input: summarize the audited scope, list prioritized findings, include the highest-value follow-up candidates, and classify each meaningful finding as exactly one of current-phase scope/AC, DoD expectation, explicit non-goal / defer, or risk/watchpoint
|
|
46
|
-
- Do not invent audit findings when no audit artifact was provided
|
|
46
|
+
- <!-- rule: REFINER-NO-INVENT-AUDIT-FINDINGS --> `REFINER-NO-INVENT-AUDIT-FINDINGS`: Do not invent audit findings when no audit artifact was provided
|
|
47
47
|
- when the phase includes watcher or predicate-driven behavior: explicit timeout semantics and negative-case expectations for non-target identities/events
|
|
48
48
|
- when the phase relies on package-first shared helpers inside a source-loaded workspace: explicit integration expectations about whether local callers use published package imports or a thin source/workspace adapter during development
|
|
49
49
|
- cross-check the phase's claims against the contracts and docs they reference (the autonomous docs-grill step, see ../docs/docs-grill-step.md): surface code-vs-doc drift, stale references, and contract-surface inaccuracies as refinement findings while the claims are still being verified
|