@gtrabanco/pi-agentic-workflow 0.10.5 → 0.10.6

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gtrabanco/pi-agentic-workflow",
3
- "version": "0.10.5",
3
+ "version": "0.10.6",
4
4
  "description": "Pi package: canonical agentic-workflow skills, friendly slash commands, and per-command model routing.",
5
5
  "keywords": [
6
6
  "pi-package",
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: design-feature
3
3
  user-invocable: true
4
- version: 3.3.0
4
+ version: 3.4.0
5
5
  argument-hint: <idea | NN-slug> [<instruction>]
6
6
  author: "Gabriel Trabanco <gtrabanco@users.noreply.github.com>"
7
7
  license: MIT
@@ -89,15 +89,18 @@ another `references/` path; in the DEFER column, bare names live in the same
89
89
  directory as the links.
90
90
 
91
91
  **Hard stop for an incomplete raw-idea interview:** LOAD exactly
92
- `references/INTERVIEW.md` and no other reference. Ask its one next
93
- question, return `NEEDS_INPUT`, and end the turn. `WRITE_AND_UPSERT.md` is
92
+ `references/INTERVIEW.md` and no other reference. Present its ONE compact
93
+ form-turn — the ≤ 6 fixed rubric slots plus the identity rows, each carrying a
94
+ recommended default the user can accept with one word — then return
95
+ `NEEDS_INPUT` and end the turn when slots remain unresolved; genuine ambiguity
96
+ gets at most **2 follow-up turns**, never a third ask. `WRITE_AND_UPSERT.md` is
94
97
  forbidden until every mandatory interview slot is resolved; that resource then
95
98
  owns closure rows and writing.
96
99
 
97
100
  | Condition now | LOAD now | DEFER / SKIP now |
98
101
  |---|---|---|
99
102
  | Bare existing slug, no instruction | [interview](references/INTERVIEW.md) through its interaction rule; report status and stop | `WRITE_AND_UPSERT.md`, `UPSERT_EXAMPLE.md`, `REPAIR.md`, `PORTABILITY.md` |
100
- | Brand-new idea with any mandatory interview slot unresolved | [interview](references/INTERVIEW.md) only; ask exactly its next question and stop | `WRITE_AND_UPSERT.md`, `UPSERT_EXAMPLE.md`, `REPAIR.md`, `PORTABILITY.md` |
103
+ | Brand-new idea with any mandatory interview slot unresolved | [interview](references/INTERVIEW.md) only; present exactly one form-turn (≤ 6 slots + identity, each with a default) and stop | `WRITE_AND_UPSERT.md`, `UPSERT_EXAMPLE.md`, `REPAIR.md`, `PORTABILITY.md` |
101
104
  | New idea after every mandatory interview slot resolves | [interview](references/INTERVIEW.md), then [closure, write, and upsert](references/WRITE_AND_UPSERT.md) | `UPSERT_EXAMPLE.md` unless shape is ambiguous; `REPAIR.md`, `PORTABILITY.md` |
102
105
  | Existing slug plus instruction | interview, then closure/write/upsert | [upsert example](references/UPSERT_EXAMPLE.md) unless shape is ambiguous; `REPAIR.md`, `PORTABILITY.md` |
103
106
  | Existing slug whose `progress.md` carries `SPEC-REVIEW-FAIL` or `NEEDS-DESIGN` | [interview](references/INTERVIEW.md), then [review repair](references/REPAIR.md) | `UPSERT_EXAMPLE.md`, `PORTABILITY.md` |
@@ -16,10 +16,13 @@
16
16
  3. **Raw-idea interview (folded in, only when starting from zero or the
17
17
  instruction leaves genuine gaps).** Fixed protocol — structural, not
18
18
  judgement:
19
- - **One question per turn, never batched.** Each question carries a
20
- recommended default the user can accept with one word. Ask nothing the
21
- docs or the instruction already answer.
22
- - **Vagueness rubric (fixed slots — the question list IS this list).**
19
+ - **One form-turn, then at most 2 follow-up turns.** The first interview
20
+ turn is ONE compact form covering every rubric slot below plus the
21
+ identity slots, each row carrying a recommended default the user accepts
22
+ with one word (or edits in place). Ask nothing the docs or the instruction
23
+ already answer. Genuine ambiguity the form cannot resolve gets at most
24
+ **2 follow-up turns** — never a third ask.
25
+ - **Vagueness rubric (fixed slots — the form rows ARE this list).**
23
26
  Probe each slot until it is filled or explicitly `n/a: <reason>`:
24
27
  1. **Affected users/roles** — who uses it; who must not.
25
28
  2. **Error & edge states** — what happens on failure / empty / invalid.
@@ -40,11 +43,13 @@
40
43
  - **Escalation (structural).** If, after the interview, **≥ 3 rubric slots
41
44
  remain empty** (neither filled nor `n/a`), do not guess: end the turn
42
45
  `NEEDS_INPUT`, listing the empty slots verbatim as the pending
43
- questions — the feature is not designable yet.
44
- - The identity questions ride the same one-per-turn protocol: problem &
45
- goal, business goals, size estimate (`XS/S/M/L` — XS/S stays SPEC-only,
46
- M/L gets the full artifact set), non-goals / future work, traceability
47
- (offer a tracking issue; if created, the eventual PR will `Closes #n`).
46
+ questions — the feature is not designable yet. Ambiguity that survives the
47
+ follow-up budget escalates the same way (`interview:ambiguity-cap`): the
48
+ 2-turn cap never licenses a third ask.
49
+ - The identity questions ride the same form-turn: problem & goal, business
50
+ goals, size estimate (`XS/S/M/L` — XS/S stays SPEC-only, M/L gets the
51
+ full artifact set), non-goals / future work, traceability (offer a
52
+ tracking issue; if created, the eventual PR will `Closes #n`).
48
53
  4. **Proportional research.** Capability closure (step 5) is cheap and comes
49
54
  first. Reach for external or domain research **only** when the feature
50
55
  touches a domain genuinely new to the project (a regulation, an unfamiliar
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: orchestration-envelope
3
3
  user-invocable: false
4
- version: 2.0.2
4
+ version: 2.1.0
5
5
  author: "Gabriel Trabanco <gtrabanco@users.noreply.github.com>"
6
6
  license: MIT
7
7
  description: >
@@ -20,6 +20,37 @@
20
20
 
21
21
  **Push policy supplement:** Box 4 covers the end-of-unit push. Some consumers (e.g. `execute-phase/references/PREFLIGHT.md`) define additional push rules for mid-phase commits when a PR is already open — those per-consumer supplements extend this contract and must be loaded alongside it by the consumer skill.
22
22
 
23
+ ## Machine-check profile (boxes 1–5)
24
+
25
+ Boxes 1–5 are mechanical. Demonstrate them by running the verifier — the
26
+ scaffold shim `template/.agentic-workflow/hooks/turn-contract.sh` (bash + git +
27
+ gh; presence-only box2 — the conditional phase-lint clause is engine-only, so
28
+ a shim receipt leaves that clause unverified, ED-52-3) or the producer-crate
29
+ engine `packages/agentic-workflow/bin/turn-contract.mjs` — and pasting its
30
+ one-line receipt beside the git/gh evidence. When the receipt is pasted,
31
+ reciting boxes 1–5 in prose is **not** required. Verifier unavailable (no bash,
32
+ or no shim/engine in the project)? Recite boxes 1–5 exactly as before — the
33
+ profile never weakens a box, and a turn with neither receipt nor recitation is
34
+ unverified. Boxes 6–11 are unchanged: they stay agent-attested judgment calls
35
+ no script may speak for. The closing `→ Next:` block may be echoed from the
36
+ `workflow-status` envelope instead of hand-authored: `next.recommended`
37
+ supplies the recommended line and `next.alternatives` the `·` sub-bullets,
38
+ preserving the fixed block shape.
39
+
40
+ ```text
41
+ turn-contract-receipt@1
42
+ ok-line: TURN-CONTRACT ok
43
+ fail-line: TURN-CONTRACT fail box<N>: <code>
44
+ codes: branch-default | not-a-repo | no-commits | acceptance-missing |
45
+ phase-lint-failed | pr-not-open | pr-head-mismatch |
46
+ pr-unreachable | dirty-tree | ahead-of-remote
47
+ exit: 0 ok | 1 contract fail | 2 usage error
48
+ order: boxes 1→5, first failure wins; within box5, dirty-tree precedes
49
+ ahead-of-remote
50
+ stdout: exactly one line; diagnostics never (git/gh evidence stays in the
51
+ agent's transcript)
52
+ ```
53
+
23
54
  ## Hand-off grammar (versioned — read by `scripts/normative-drift.test.mjs`)
24
55
 
25
56
  Box 9's closing hand-off and box 10's machine result are ordered here, so the
@@ -51,5 +82,6 @@ next | recommended
51
82
  next | alternatives
52
83
  next | tier
53
84
  next | suggested
85
+ next | continuation
54
86
  ```
55
87
 
@@ -1,5 +1,9 @@
1
1
  ## Persist and decide
2
2
 
3
+ When the unit's review receipt is missing or stale, the re-entry command is the
4
+ **emitted** `next.continuation` (`rendering` for display) — quote it, never author
5
+ exact command tokens.
6
+
3
7
  11. **Persist fix-now findings to the fold ledger.** The unit's **fix-now fold
4
8
  ledger** is `review-findings.md`, located beside its other docs
5
9
  (`docs/features/<NN>-<slug>/review-findings.md` for a feature,
@@ -6,7 +6,10 @@ Append the receipt to `docs/features/<NN>-<slug>/progress.md` (fix units:
6
6
  `docs/fix/<N>/progress.md`), then append every finding row to
7
7
  `planning-findings.md` (ledger contract: `pre-execution-review/references/LEDGERS.md`).
8
8
  Any later write to a reviewed plan artifact rotates `artifactRevisionId` and makes
9
- this receipt stale — that is the contract working, not a mistake.
9
+ this receipt stale — that is the contract working, not a mistake. When a missing or
10
+ stale receipt is the reason for re-entry, the re-entry command is the **emitted**
11
+ `next.continuation` (`rendering` for display): quote it, never author exact command
12
+ tokens.
10
13
 
11
14
  One `PreExecutionReviewReceipt v1`
12
15
  (`agentic-workflow/pre-execution-review-receipt@1`) per review:
@@ -8,7 +8,9 @@ each finding row to the unit's `planning-findings.md`** with
8
8
  create the file from that contract when the unit has none. A findings ledger the
9
9
  reviewer cannot write is not a ledger. Any later write to a reviewed artifact
10
10
  rotates `artifactRevisionId` and makes this receipt stale — that is the contract
11
- working, not a mistake.
11
+ working, not a mistake. When a missing or stale receipt is the reason for re-entry,
12
+ the re-entry command is the **emitted** `next.continuation` (`rendering` for display):
13
+ quote it, never author exact command tokens.
12
14
 
13
15
  One `PreExecutionReviewReceipt v1`
14
16
  (`agentic-workflow/pre-execution-review-receipt@1`) per review, in a fenced block:
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: workflow-status
3
3
  user-invocable: true
4
- version: 3.6.0
4
+ version: 3.7.0
5
5
  author: "Gabriel Trabanco <gtrabanco@users.noreply.github.com>"
6
6
  license: MIT
7
7
  argument-hint: "[--json-only] [--last-envelope <json|path>]"
@@ -117,6 +117,9 @@ the JSON contract.
117
117
  - The human summary (unless `--json-only`) and the envelope are printed, envelope
118
118
  last.
119
119
  - Nothing was modified anywhere.
120
+ - When the envelope carries `next.continuation`, the next-command echo **quotes the
121
+ emitted `next.continuation`** (`rendering` for display), never author exact command
122
+ tokens; the human-facing prose `→ Next:` block below stays.
120
123
 
121
124
  → Next: the envelope's `next.recommended` command — it is computed from the
122
125
  actual state, so it IS the recommendation
@@ -41,7 +41,7 @@ sensor reports a missing gate, never a verdict that no review ever happened.
41
41
  |---|---|---|
42
42
  | `current` | stage PASS verdict **and** recomputed digest = bound digest | spec: `/plan-feature <slug>` · plan: `/execute-phase <NN>` |
43
43
  | `missing` | no receipt block for the stage | `defined` → `/review-spec <slug>` · planned/in-progress → `/review-plan <NN>` |
44
- | `stale` | bound digest differs, or a bound context row moved | re-run **that stage's** review |
44
+ | `stale` | bound digest differs, or a bound context row moved | re-run **that stage's** review — quote the emitted planning-gate re-run continuation (`next.continuation`, `rendering` for display), never author exact tokens |
45
45
  | `wrong-stage` | the only PASS belongs to the other stage | the stage that is missing — never the stage that passed |
46
46
  | `substitute` | prose verdict, legacy block, or internal attestation stands where a receipt should be | that stage's review, and report the substitute as a blocker detail |
47
47
  | `self-approved` | the author of the artifact recorded the PASS | that stage's review in a clean context |
@@ -50,9 +50,11 @@ sensor reports a missing gate, never a verdict that no review ever happened.
50
50
  | `impossible-timeline` | `structural.fresh: false`, `structural.reasonCode: impossible-timeline` — digest and revision match by construction; a receipt's own recorded timeline is physically impossible (finish predating source revision's commit date beyond the published skew); a legacy receipt with no parsable Started/finished: line, or a source revision git cannot resolve, stays unflagged (fail-open) | that stage's review — the timeline is self-refuting, not a stale source |
51
51
 
52
52
  A stale receipt re-runs the **review**, not the authoring skill: the artifacts may be
53
- exactly right and simply need re-judging in a clean context. A missing verdict block,
54
- or a verdict outside the stage's fixed set, is `missing` with the reason recorded —
55
- never a guess in the recommended direction.
53
+ exactly right and simply need re-judging in a clean context. The command to re-run is
54
+ the **emitted** `next.continuation` (`rendering` for display) — quoted as-is, never
55
+ authored as fresh command prose. A missing verdict block, or a verdict outside the
56
+ stage's fixed set, is `missing` with the reason recorded — never a guess in the
57
+ recommended direction.
56
58
 
57
59
  ### Envelope projection
58
60