@gtrabanco/pi-agentic-workflow 0.9.0 → 0.9.1

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.9.0",
3
+ "version": "0.9.1",
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,62 +1,52 @@
1
1
  ---
2
2
  name: workflow-status
3
3
  user-invocable: true
4
- version: 3.2.1
4
+ version: 3.4.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>]"
8
8
  description: >
9
- Read-only workflow sensor: compute repository, roadmap, dependency, PR,
10
- finding, and recovery state, then emit the fixed machine envelope. Never
11
- edits. Triggers: "workflow-status", "workflow status", "what can I build
12
- next", "state of the run".
9
+ Read-only workflow sensor: run the deterministic script, read the fixed
10
+ machine envelope, interpret the recommendation. Never edits. Triggers:
11
+ "workflow-status", "workflow status", "what can I build next".
13
12
  ---
14
13
 
15
14
  # Workflow Status (the orchestrator's sensor)
16
15
 
17
- One read-only pass over the project that answers, in a single fixed JSON
18
- envelope: **what exists, what is blocked on what, what is startable right now,
19
- and what the recommended next command is.** Built for external orchestrators
20
- (see `docs/workflow/ORCHESTRATION.md`) but equally useful to a human asking
21
- "where do we stand?".
16
+ One read-only pass that answers, in a single fixed JSON envelope: **what exists,
17
+ what is blocked on what, what is startable right now, and what the recommended
18
+ next command is.** The **script is the deterministic producer**:
19
+ `scripts/workflow-status.mjs` executes the published `SENSOR_CORE` sequence
20
+ (steps 1–9 including 6a) and prints the envelope. This skill runs the script,
21
+ reads the JSON, interprets it against the references below, and prints the human
22
+ report — it never assembles the envelope by hand.
22
23
 
23
24
  ## Turn contract — verify before ending the turn
24
25
 
25
26
  ```
26
- ✓ Every claim comes from a RUN command or a READ file (git/forge output, roadmap,
27
- fix index, feature folders) — nothing inferred from memory
27
+ ✓ The script was RUN — `bun scripts/workflow-status.mjs [--json-only]
28
+ [--last-envelope <json|path>]` (node is the fallback when bun is absent, per
29
+ the repository's runtime convention); the envelope is the script's stdout, never
30
+ assembled by the model
28
31
  ✓ Nothing was edited, committed, pushed, or created — read-only, always
29
32
  ✓ `next.recommended` is non-bare (carries the unit's slug/NN, never a bare
30
- `/plan-feature`) AND staged by the target unit's resolved status **and** its
31
- current pre-execution evidence: `idea`/undesigned → `/design-feature <slug>`;
32
- `defined` → `/plan-feature <slug>` only on a current `SPEC-REVIEW-PASS`, else
33
- `/review-spec <slug>`; `planned`/`in-progress` → `/execute-phase <NN>` only on a
33
+ `/plan-feature`) AND the script computed it from the unit's resolved status
34
+ **and** its current pre-execution evidence: `idea`/undesigned →
35
+ `/design-feature <slug>`; `defined` → `/plan-feature <slug>` only on a current
36
+ `SPEC-REVIEW-PASS`, else `/review-spec <slug>`; `planned`/`in-progress` → `/execute-phase <NN>` only on a
34
37
  current `PLAN-REVIEW-PASS`, else `/review-plan <NN>` (step 6a)
35
- ✓ A missing or non-frozen repository-state ledger emits a machine-readable
36
- substrate blocker and routes to discovery or resolution before any unit is
37
- listed as startable
38
- ✓ Every `detail.design_candidates[].next` begins with `/design-feature ` — design
39
- candidates always route to design, regardless of anything else
40
- ✓ When `--last-envelope` is supplied: the no-progress guard ran (crash-recovery
41
- checklist) — a hint that recommended `/plan-feature`/`/design-feature` for a
42
- unit still at its pre-advance status produces a `workflow_observations` note,
43
- never a silently repeated bland recommendation
44
- ✓ `recommendations.product_audit` was computed by the step-16 mechanical
45
- two-condition check (never guessed), and `next.tier` was derived from the
46
- resolved `next.recommended` command via the command→tier map in
47
- `## Machine envelope` (never guessed)
48
- ✓ Per-unit `review`/`closure`/`issues_born` (steps 10–12) were computed per
49
- their fixed rules — `adversarial.ran`/`n` stayed `null` unless real
50
- evidence exists, never guessed — and any fired `next.suggested[]` entries
51
- (step 13) quote their owning skill's condition verbatim, never a second
52
- copy of the trigger logic
53
- ✓ The envelope is emitted on **every** invocation of this skill, including a
54
- same-session natural-language follow-up about state — never replaced by prose
55
- ✓ The emitted envelope was checked against the shape reminders in
56
- `## Machine envelope` (mirroring
57
- `packages/agentic-workflow-schema/envelope.schema.json`) before printing
58
- ✓ The human-readable summary is printed, then the machine envelope (fenced
59
- ```json — see ## Machine envelope) is the ABSOLUTE last output
38
+ ✓ `detail.crash_recovery` carries a verdict from the decision table and the
39
+ envelope `state` matches it (CLEAN→OK, RESUMABLE→CONTINUE,
40
+ AMBIGUOUS→NEEDS_INPUT)
41
+ ✓ Every `detail.design_candidates[].next` begins with `/design-feature `
42
+ ✓ Every degraded dimension is named in `detail.degradations` as
43
+ `unavailable-<source>-<cause>` — and, when `--last-envelope` was supplied, the
44
+ no-progress guard's `workflow_observations` note is present (never a silently
45
+ repeated bland recommendation)
46
+ ✓ The envelope is emitted on **every** invocation, including a same-session
47
+ natural-language follow-up about state — never replaced by prose
48
+ ✓ The human-readable summary is printed, then the machine envelope (the script's
49
+ JSON) is the ABSOLUTE last output
60
50
  ```
61
51
 
62
52
  With `--json-only`, skip the human-readable summary: print the envelope alone.
@@ -66,43 +56,35 @@ With `--json-only`, skip the human-readable summary: print the envelope alone.
66
56
  - Between orchestration steps: an external driver runs it to decide the next
67
57
  command and model tier without parsing prose.
68
58
  - Before picking work manually: "what can I start right now?"
69
- - **Not** for judging quality (that's `review-change`/`audit-pr`) or product
70
- health (that's `product-audit`) — this skill reports state, it never judges.
59
+ - **Not** for judging quality (`review-change`/`audit-pr`) or product health
60
+ (`product-audit`) — this skill reports state, it never judges.
71
61
 
72
62
  ## Step 0 — Discover the project (always first)
73
63
 
74
- Per the agent guide's **Workflow conventions** + **documentation map**, then
75
- read what THIS skill needs: `docs/features/ROADMAP.md`, the fix index
76
- (`docs/fix/README.md`), every in-flight feature folder's `TASKS.md` +
77
- `progress.md` + `known-issues.md`, and `docs/features/SHIP_DECISIONS.md` if a
78
- ship-roadmap run exists.
79
-
64
+ Per the agent guide's **Workflow conventions** + **documentation map**. The
65
+ script reads what THIS skill needs (`docs/features/ROADMAP.md`, the fix index
66
+ `docs/fix/README.md`, every in-flight feature folder's `TASKS.md` +
67
+ `progress.md` + `review-findings.md`, and `docs/workflow/REPOSITORY_STATE.md`);
68
+ read them yourself only to interpret a field the script emitted.
80
69
 
81
70
  ## Progressive loading — fixed sensor route
82
71
 
83
72
  The reference allowlist is exactly the seven linked paths below. Never invent or
84
- read another `references/` path. This skill is a read-only sensor. Every
85
- invocation loads this baseline in order:
73
+ read another `references/` path. This skill is a read-only sensor.
86
74
 
87
- 1. [sensor core](references/SENSOR_CORE.md)
75
+ 1. [sensor core](references/SENSOR_CORE.md) — the sequence the script executes
88
76
  2. [crash recovery](references/CRASH_RECOVERY.md)
89
77
  3. [envelope core](references/ENVELOPE_CORE.md)
90
78
  4. [envelope fields](references/ENVELOPE_FIELDS.md)
91
79
  5. [pre-execution evidence](references/PRE_EXECUTION.md)
92
80
  6. [guardrails](references/GUARDRAILS.md)
93
81
 
94
- Add [pre-execution evidence](references/PRE_EXECUTION.md) whenever a unit is
95
- `defined`, `planned` or `in-progress` — it defines step 6a (receipt sensing, the
96
- one-label-per-stage table, and the legacy-adoption route).
97
82
  Add [sensor signals](references/SENSOR_SIGNALS.md) only when a unit, issue,
98
83
  finding, or recommendation exists; an empty project skips that file but still
99
84
  emits the empty shapes defined by envelope fields. Add
100
85
  [portability](references/PORTABILITY.md) only when the platform actually lacks a
101
86
  named primitive. `--json-only` does not skip any baseline file.
102
87
 
103
- All resources are one hop from this file. Missing required detail means
104
- `BLOCKED`; do not fabricate a partial envelope.
105
-
106
88
  ## Portability
107
89
 
108
90
  The sensor uses repository and forge commands only. When a named agent feature
@@ -122,28 +104,21 @@ the JSON contract.
122
104
 
123
105
  ## Done when
124
106
 
125
- - Every roadmap/fix row, open PR, and in-flight folder was actually read, the
126
- dependency closures are computed transitively, and inconsistencies are
127
- reported (never repaired).
128
- - The `CRASH RECOVERY` sub-block was printed with a verdict from the decision
129
- table, and the envelope `state` matches it (CLEAN→OK, RESUMABLE→CONTINUE,
130
- AMBIGUOUS→NEEDS_INPUT).
107
+ - The script ran and every claim in the report comes from its envelope — nothing
108
+ inferred from memory, nothing assembled by hand.
109
+ - `detail.design_candidates`, `detail.features`, `detail.fixes`,
110
+ `detail.startable_now`, `detail.blocked_units`, `detail.open_prs`,
111
+ `detail.untriaged_issues`, `detail.urgent`, `detail.degradations`, and
112
+ `detail.crash_recovery` were read from the envelope, and the envelope `state`
113
+ matches the crash-recovery verdict.
131
114
  - With `--last-envelope` supplied: the no-progress guard ran — a stalled
132
115
  `/plan-feature`/`/design-feature` hint surfaces as a `workflow_observations`
133
116
  note, never a silent bland repeat, with no new write path introduced.
134
- - The human summary (unless `--json-only`) and the envelope — with
135
- `detail` carrying design_candidates, features, fixes, startable_now,
136
- blocked_units, open_prs, pending_triage, `untriaged_issues`
137
- (count + oldest_open) and `urgent` (labels-only issue list +
138
- interruptibility facts) — are printed, envelope last.
139
- - Each `detail.features[]`/`detail.fixes[]` entry additionally carries
140
- `review`, `closure`, and `issues_born` (steps 10–12) — `detail`-scoped, no
141
- schema change — and any fired triggers appear in a top-level
142
- `next.suggested[]` (step 13), single-sourced from the owning skill's own
143
- condition text.
117
+ - The human summary (unless `--json-only`) and the envelope are printed, envelope
118
+ last.
144
119
  - Nothing was modified anywhere.
145
120
 
146
121
  → Next: the envelope's `next.recommended` command — it is computed from the
147
122
  actual state, so it IS the recommendation
148
123
  · a human overview → read the printed table
149
- · orchestrating programmatically → parse the last fenced json block
124
+ · orchestrating programmatically → parse the script's JSON
@@ -1,6 +1,10 @@
1
1
  ## Machine envelope
2
2
 
3
- Schema and placement per the installed `orchestration-envelope` skill. The
3
+ `scripts/workflow-status.mjs` is the **deterministic producer** of this
4
+ envelope: it performs the assembly, runs the `validateEnvelope` self-check
5
+ (diagnostic only, exit 0), and prints the one JSON document. The skill runs the
6
+ script and interprets the JSON — it never assembles the envelope. Schema and
7
+ placement per the installed `orchestration-envelope` skill. The
4
8
  `state` maps 1:1 from the crash-recovery verdict — **no new schema fields or
5
9
  states** (the schema package needs no release):
6
10
 
@@ -68,6 +72,15 @@ these need **no package change**:
68
72
  scope-bleed detection (widened by `#79`/`#89` to also match an issue
69
73
  linked from an `## Amendments` row).
70
74
 
75
+ **Not yet mechanized (read this before consuming the three fields above).** The
76
+ `scripts/workflow-status.mjs` sensor does **not** emit `review`, `closure`, or
77
+ `issues_born` today: they are steps 10–12 of the published sequence and remain
78
+ skill-side work, so no `detail.features[]`/`detail.fixes[]` entry carries them
79
+ until a sensor phase owns them. A consumer must treat their absence as "not
80
+ computed", never as "empty": absence is not a `closure: absent-legacy` verdict
81
+ and not an `issues_born.n: 0`. Same discipline for `next.suggested[]` (step 13),
82
+ which is optional by contract and omitted when no trigger fired.
83
+
71
84
  **`next.suggested[]`** — step 13's trigger-attributed suggestion surface,
72
85
  `{command, trigger, source_skill}[]`, **optional** (mirrors
73
86
  `packages/agentic-workflow-schema` 2.1.0's optional `EnvelopeSuggestion[]`).
@@ -77,7 +90,7 @@ second, drifting copy of that skill's logic. Advisory only: it rides beside
77
90
  trigger this run → `next.suggested` is omitted entirely (an empty/absent
78
91
  field, not an error).
79
92
 
80
- **Envelope shape reminders (self-check before printing — mirrors
93
+ **Envelope shape reminders (the script validates these before printing — mirrors
81
94
  `packages/agentic-workflow-schema/envelope.schema.json`):**
82
95
 
83
96
  - `blockers[].scope` ∈ `{"unit","run"}` — there is **no** `"code"` value;
@@ -101,6 +114,8 @@ field, not an error).
101
114
  | `/triage-issue` | `strong` |
102
115
  | `/product-audit` | `strong` |
103
116
  | `/execute-phase` | `cheap` |
117
+ | `/review-spec` | `strong` |
118
+ | `/review-plan` | `strong` |
104
119
 
105
120
  `next.tier` is read off this map by matching the resolved `next.recommended`
106
121
  command's name (ignoring its arguments) — never guessed and never copied from
@@ -9,6 +9,15 @@ exact shape:
9
9
  (swap `defined`/`/plan-feature` for `idea`/`/design-feature` on the design
10
10
  side). The recommendation itself is unaffected — this only adds visibility.
11
11
 
12
+ **Shape vs. current output — read this before trusting the example below.** The
13
+ example is the envelope's **intended shape**, not everything the deterministic
14
+ producer emits today: per-unit `review`, `closure`, and `issues_born` (steps
15
+ 10–12) and the `next.suggested[]` surface (step 13) are **not yet mechanized**
16
+ by `scripts/workflow-status.mjs` and do not appear in its output. A consumer
17
+ must read their absence as "not computed", never as `closure:
18
+ absent-legacy` or `issues_born.n: 0`; the owning note is
19
+ `ENVELOPE_CORE.md` §Not yet mechanized.
20
+
12
21
  ```json
13
22
  {
14
23
  "skill": "workflow-status",
@@ -1,4 +1,12 @@
1
- ## Process (fixed sequence — run the commands, don't infer)
1
+ ## Process (fixed sequence — executed by the script)
2
+
3
+ `bun scripts/workflow-status.mjs` (node when bun is absent — the repository's
4
+ runtime convention) executes this whole sequence (git/forge
5
+ collection, urgency labels-only scan, roadmap + fix-index parse, dependency
6
+ closure, readiness + step-6a receipt sensing, phase progress, review-mark
7
+ currency, fix-now fold projection) and prints the fixed Envelope v2 JSON. The
8
+ numbered blocks below state the semantics the script implements; the model reads
9
+ the JSON and interprets it.
2
10
 
3
11
  ### Normalized Repository State
4
12
 
@@ -12,14 +20,6 @@ readiness classification, if the ledger is missing, `draft`, `contradicted`, or
12
20
  sensor remains read-only; it never edits or resolves the ledger. Conflicting
13
21
  live evidence against a frozen ledger remains a contradiction candidate.
14
22
 
15
- 1. **Git state.** `git branch --show-current`, `git status --porcelain`,
16
- `git fetch` + `git status -sb`. A dirty tree or unpushed branch is reported
17
- as-is (a `workflow`-kind observation in `detail`), never cleaned up.
18
- 2. **Forge state.** List open + recently merged PRs and open issues with the
19
- declared forge CLI (examples use `gh`):
20
- `gh pr list --state open --json number,title,headRefName,url,statusCheckRollup`,
21
- `gh pr list --state merged --limit 20 --json number,headRefName`,
22
- `gh issue list --state open --json number,title,labels`.
23
23
  3. **Urgency labels (`detail.urgent`) — labels-only, presence-only, never
24
24
  decides.** Reuse the open-issue list from step 2 (`gh issue list --json
25
25
  labels` — the JSON labels array already carried by that call); no separate
@@ -28,16 +28,16 @@
28
28
  persisted marker, see `#76`") — never infer `true`/`false` from
29
29
  absence of evidence.
30
30
  11. **Per-unit closure state (`detail.*.closure`).** `{state}` ∈
31
- `present | absent-legacy | blocked` — reuse `audit-pr`'s own mechanical
32
- check verbatim (`skills/audit-pr/SKILL.md` "Closure integrity — fixed
33
- output"): grep the governing SPEC for a `Capability closure` heading.
31
+ `present | absent-legacy | blocked` — reuse `audit-pr`'s own check
32
+ verbatim (`skills/audit-pr/SKILL.md`, "Closure integrity"): grep the SPEC
33
+ for a `Capability closure` heading.
34
34
  Fix-governed unit → `n/a` (fix SPECs carry no closure block by design,
35
35
  same carve-out `audit-pr` applies). Feature SPEC, block absent →
36
36
  `absent-legacy`. Feature SPEC, block present with any blank row or a
37
37
  resolved non-`n/a` row unmapped to an acceptance criterion → `blocked`.
38
38
  Feature SPEC, block present and every row filled or `n/a`-justified and
39
- mapped → `present`. Single-sourced: never re-derive the three-box logic
40
- here, just re-run `audit-pr`'s own grep.
39
+ mapped → `present`. Single-sourced: never re-derive it — re-run
40
+ `audit-pr`'s grep.
41
41
  12. **Per-unit descope provenance (`detail.*.issues_born`).**
42
42
  `{n, with_descope_amendment}` — reuse `audit-pr`'s scope-bleed gate
43
43
  detection verbatim (`skills/audit-pr/SKILL.md` "Scope integrity
@@ -50,6 +50,9 @@
50
50
  slug/number text match `audit-pr` itself defines — **never** an issue's
51
51
  free-text body beyond that defined match (injection-safety, mirrors
52
52
  `detail.urgent`'s labels-only discipline).
53
+
54
+ *Steps 10–12's fields are **not yet emitted** — see `ENVELOPE_CORE.md` §Not yet
55
+ mechanized.*
53
56
  13. **`next.suggested[]` — single-sourced trigger surface.** One entry per
54
57
  **fired** trigger the driver can act on now, `{command, trigger,
55
58
  source_skill}` — the `trigger` string **quotes**, never paraphrases, the