@sjawhar/pi-legion 10.5.0 → 10.5.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/dist/legion.js +1 -1
- package/dist/skills/legion-architect/SKILL.md +11 -7
- package/dist/skills/legion-retro/SKILL.md +13 -10
- package/dist/skills/legion-worker/references/conflicts-and-rewrites.md +3 -3
- package/dist/skills/legion-worker/references/merge-gate.md +20 -11
- package/package.json +1 -1
package/dist/legion.js
CHANGED
|
@@ -16169,7 +16169,7 @@ function ompCapabilityHost() {
|
|
|
16169
16169
|
// package.json
|
|
16170
16170
|
var package_default = {
|
|
16171
16171
|
name: "@sjawhar/pi-legion",
|
|
16172
|
-
version: "10.5.
|
|
16172
|
+
version: "10.5.1",
|
|
16173
16173
|
license: "Apache-2.0",
|
|
16174
16174
|
type: "module",
|
|
16175
16175
|
omp: {
|
|
@@ -309,10 +309,11 @@ The daemon keeps this order from its fixed table; you start none of its steps:
|
|
|
309
309
|
one final commit, the removal of `.legion/<issue>/`, so no merge carries a handoff onto the
|
|
310
310
|
default branch (dispatch://LEGION-605); those commits do not void the approval and never return
|
|
311
311
|
the tree to the tester or reviewer;
|
|
312
|
-
4. the merger
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
312
|
+
4. the merger quotes what sits above the reviewer-approved head (`jj diff --from <approved-sha> --to
|
|
313
|
+
<tip-sha> --summary`) in READY and sends the READY packet with its completion, which refuses a
|
|
314
|
+
head carrying anything above the approved head but retro's commits, those that change
|
|
315
|
+
`docs/solutions/` and that removal (`READY_UNREVIEWED_CHANGE`), and a
|
|
316
|
+
head that still carries `.legion/<issue>/`; the daemon posts
|
|
316
317
|
`READY #<n> at <current sha> (approved at <approved sha>) for <KEY> (<pr url>)` on the Dispatch
|
|
317
318
|
issue and publishes it to the project's merge queue role when one is set. The moment the daemon
|
|
318
319
|
accepts READY, it submits the merge of that head itself, as the implement App and with GitHub's
|
|
@@ -324,8 +325,11 @@ The daemon keeps this order from its fixed table; you start none of its steps:
|
|
|
324
325
|
design gate refused is submitted by the daemon once that spec version is approved; nobody is
|
|
325
326
|
told to submit it. If the merger reports a failed verification,
|
|
326
327
|
treat it like `pr-blocked`: the merger holds the phase, so tell it to move the issue back with
|
|
327
|
-
`request_backward_move`, naming what failed; never bypass. A READY refused
|
|
328
|
-
|
|
328
|
+
`request_backward_move`, naming what failed; never bypass. A READY refused
|
|
329
|
+
`READY_UNREVIEWED_CHANGE`, or a merger task with no approved head (`READY_NOT_APPROVED`), goes
|
|
330
|
+
back to `reviewing`, the move's reason naming the code and what it found, so the reviewer runs a
|
|
331
|
+
new round. A READY refused because the head still carries `.legion/<issue>/` goes back to
|
|
332
|
+
`retro`, so the implementer's retro removes it.
|
|
329
333
|
5. the merge lands under the repository's rules; the daemon then starts the **implementer** once
|
|
330
334
|
more, on the production check.
|
|
331
335
|
It drives the changed path in production through the user's own access path and records
|
|
@@ -403,7 +407,7 @@ active phase worker.
|
|
|
403
407
|
| `design-approved` | Its `version` is the approved one. A human approved the root spec document at its current version; the gate is open. Proceed to section 2 — except on a root whose catch-up said `handed_over`: its workers already run their phases, so start nothing; the approval releases any READY the gate refused. One whose `version` is the version a human's own answer to a decision block wrote, after an earlier approval (Dispatch carried that approval to it, section 1), opens nothing new: carry on, and release no wave because of it. |
|
|
404
408
|
| `design-changes-requested` | Its `version` and `reason`. A human asked for changes to the root spec at `version`, for `reason`. Revise the spec as the reason asks and request approval again as section 1 says; stay parked; the gate is closed. |
|
|
405
409
|
| `phase-finished` | The daemon has already moved the issue to its next phase by its fixed table and started that phase's role; you start nothing. Read the committed handoff for the finishing phase; if it shows unresolved gaps, tell the role now working the issue (`envoy_publish` to its role topic). A `planner` notice that names a departure from the spec's design defers to section 1's full condition: when the approved Summary, Acceptance, scope and settled decisions still hold, the plan is the record; otherwise change the root spec and request approval again as section 1 says. A `reviewer` notice whose GitHub review is `CHANGES_REQUESTED` needs nothing from you: the daemon has returned the issue to `implementing` (Dispatch `in_progress`) and started the **implementer**, whose correction goes through the tester and the reviewer again, never straight to retro. A `reviewer` notice with an `APPROVED` review means the daemon has started retro (step 5). An `implementer` notice for `production_check` is its production report: read the record on the pull request and the issue, then run step 7. A `tester` notice with `verdict: "fail"` — its handoff carries `implementerProof.verdict: "rejected"`, or a failure naming the production-like proof — has gone back to the **implementer** by the daemon's table; never supply the proof from another role. A worker that reports no surface reaches the changed path sends that report instead of completing its phase, so the daemon starts nothing more on that issue and the worker stays idle in its session, not suspended: file a child issue in this tree to build the surface (infrastructure, tooling, or a skill), and when that child's `child-closed` arrives, tell the waiting worker to continue with `envoy_publish` to its role topic. That report is never a reason to advance the phase. |
|
|
406
|
-
| `pr-blocked` | Its `reason` names the pull request and the `max_fix_attempts` it reached, or reads `Issue reached review_round_cap=<N>.` (the end of this row). The count is of heads pushed onto a red verdict that changed something outside `.legion/` — handoff-only pushes (`.legion/` paths only) never count, a push by the review App (a planner's, tester's, reviewer's or architect's) never counts, and the head after a red the tester's red tests earned (a review-App push that changed a path outside `.legion/`, however many handoff-only pushes follow it) does not count either — so after the tester's handoff-only push onto the implementer's red, the implementer's next push does count; a push the daemon cannot classify (a listener without `changed_paths`, a list the listener stopped at 100 paths or 32,768 runes of text, a push listing no commits) does. Published once per exhausted count, not on every later red verdict for that count. Read the failed CI evidence and recovery attempts. The notice moves nothing, and no later CI red within the attempt that ran the count out (the counted head, and every head pushed on top of it until a push lands on a head CI judged green, the tester's red tests and handoff onto the held red included) sends the work back from `testing`, `reviewing`, `retro` or `merging` either: the issue stays in its phase until you move it, or a worker's own decision does (a tester's `fail`, a reviewer's request for changes). A head pushed onto green CI leaves that attempt, so its red still comes as a `checks-red`. In `implementing`, give the implementer the failing checks (`envoy_publish` to its role topic). In any later phase a worker holds, tell that worker (`envoy_publish` to its role topic) to move the issue back to `implementing` with `request_backward_move`, naming the failing checks, and the daemon starts the implementer; or file a corrective child. In `awaiting_merge`, where no worker holds a phase and a backward move is refused, open a `dispatch ask` naming the failing checks for the human who merges, as section 6 does for a conflict there. Do not treat the blocked PR as final. A `review_round_cap` reason is the implementer's round count instead: every move back to an earlier phase counts one, and the notice comes again with each round past the cap. It moves nothing either, since the round that reached the cap has already started its worker. Tell the rounds apart by what announced each: a tester's fail by its `phase-finished` with `verdict: "fail"`; a request for changes by the reviewer's `phase-finished` over a `CHANGES_REQUESTED` review; the daemon's own move by a `checks-red` notice, whose reason names a conflict (`the head conflicts with <base>`), the required checks that failed (`CI is red at <head>`), or the merge queue's failed merge and its failing run (`the merge queue took pull request #<n> out at READY's head …`); a worker's `request_backward_move` by a `phase-finished` from the role that asked, whose reason reaches only the task of the worker the move started, so ask that worker. Judge the cap by the rounds that are not conflicts. Conflict returns need nothing from you beyond the next round. Tester fails, requests for changes and CI-red returns (a `checks-red` notice is raised for CI only when a required check fails on code the branch pushed, or when the merge queue fails the merge) are the work going in circles: narrow it, re-plan it with the responsible worker, or ask a human with `dispatch ask`. Judge a worker's backward move by the reason that worker gives. A move you ordered for a conflict found before `awaiting_merge` (section 6) is a conflict return. The merger's move back to `reviewing`
|
|
410
|
+
| `pr-blocked` | Its `reason` names the pull request and the `max_fix_attempts` it reached, or reads `Issue reached review_round_cap=<N>.` (the end of this row). The count is of heads pushed onto a red verdict that changed something outside `.legion/` — handoff-only pushes (`.legion/` paths only) never count, a push by the review App (a planner's, tester's, reviewer's or architect's) never counts, and the head after a red the tester's red tests earned (a review-App push that changed a path outside `.legion/`, however many handoff-only pushes follow it) does not count either — so after the tester's handoff-only push onto the implementer's red, the implementer's next push does count; a push the daemon cannot classify (a listener without `changed_paths`, a list the listener stopped at 100 paths or 32,768 runes of text, a push listing no commits) does. Published once per exhausted count, not on every later red verdict for that count. Read the failed CI evidence and recovery attempts. The notice moves nothing, and no later CI red within the attempt that ran the count out (the counted head, and every head pushed on top of it until a push lands on a head CI judged green, the tester's red tests and handoff onto the held red included) sends the work back from `testing`, `reviewing`, `retro` or `merging` either: the issue stays in its phase until you move it, or a worker's own decision does (a tester's `fail`, a reviewer's request for changes). A head pushed onto green CI leaves that attempt, so its red still comes as a `checks-red`. In `implementing`, give the implementer the failing checks (`envoy_publish` to its role topic). In any later phase a worker holds, tell that worker (`envoy_publish` to its role topic) to move the issue back to `implementing` with `request_backward_move`, naming the failing checks, and the daemon starts the implementer; or file a corrective child. In `awaiting_merge`, where no worker holds a phase and a backward move is refused, open a `dispatch ask` naming the failing checks for the human who merges, as section 6 does for a conflict there. Do not treat the blocked PR as final. A `review_round_cap` reason is the implementer's round count instead: every move back to an earlier phase counts one, and the notice comes again with each round past the cap. It moves nothing either, since the round that reached the cap has already started its worker. Tell the rounds apart by what announced each: a tester's fail by its `phase-finished` with `verdict: "fail"`; a request for changes by the reviewer's `phase-finished` over a `CHANGES_REQUESTED` review; the daemon's own move by a `checks-red` notice, whose reason names a conflict (`the head conflicts with <base>`), the required checks that failed (`CI is red at <head>`), or the merge queue's failed merge and its failing run (`the merge queue took pull request #<n> out at READY's head …`); a worker's `request_backward_move` by a `phase-finished` from the role that asked, whose reason reaches only the task of the worker the move started, so ask that worker. Judge the cap by the rounds that are not conflicts. Conflict returns need nothing from you beyond the next round. Tester fails, requests for changes and CI-red returns (a `checks-red` notice is raised for CI only when a required check fails on code the branch pushed, or when the merge queue fails the merge) are the work going in circles: narrow it, re-plan it with the responsible worker, or ask a human with `dispatch ask`. Judge a worker's backward move by the reason that worker gives. A move you ordered for a conflict found before `awaiting_merge` (section 6) is a conflict return. The merger's move back to `reviewing` for a READY refusal (`READY_UNREVIEWED_CHANGE`, or `READY_NOT_APPROVED` when its task names no approved head), and the reviewer's no-fix request for changes that follows it so the tester runs the head, are not the work going in circles either. A move that sends back code found wrong counts with the tester fails. |
|
|
407
411
|
| `pr-merged` | Its `reason` names the pull request. The PR merged, under the repository's rules, before the issue reached `awaiting_merge`. The workflow runs on and asks no one to merge it: the daemon starts the **implementer** on the production check once the issue gets there, and you start nothing. Its `phase-finished` for `production_check` is what brings you to step 7: verify the record on the pull request and this issue first, then sign off naming it with `sign_off`. A merge is not the close. |
|
|
408
412
|
| `pr-closed-unmerged` | Decide from current scope whether the work is reopened, started over (`park_child` then `rerun_child`, for a child), or ended with a reason. Delegate the repository action to the responsible phase worker and keep ownership. |
|
|
409
413
|
| `merge-refused` | Its `reason` names the pull request, READY's head, what the daemon asked GitHub to do (merge, enqueue, or enable auto-merge for it), and GitHub's refusal, which a retry would meet again (squash merges disabled, a permission the implement App lacks). The daemon has stopped submitting that merge; the issue stays in `awaiting_merge`. The cause is a repository setting or an App permission, a person's to change: ask one with `dispatch ask`, naming the refusal and the pull request at READY's head, which that person merges under the repository's rules once it is fixed. The merge moves the issue on to its production check. Never bypass a rule. |
|
|
@@ -26,9 +26,9 @@ retrospective's durable output.
|
|
|
26
26
|
issue. Retro writes **no handoff**. The removal exists because a squash merge commits the head
|
|
27
27
|
merged into the base, and nothing on the base reads a handoff; the handoffs stay on the issue
|
|
28
28
|
branch below that commit.
|
|
29
|
-
4. The merger
|
|
30
|
-
|
|
31
|
-
|
|
29
|
+
4. The merger quotes retro's commits (`jj diff --from <approved-sha> --to <tip-sha> --summary`) in
|
|
30
|
+
READY, and sends the READY packet with its completion, which refuses a head with anything above
|
|
31
|
+
the approved head but those commits, or still carrying `.legion/<issue>/`; the daemon
|
|
32
32
|
posts it on the Dispatch issue and publishes it to the project's merge-queue role when one is
|
|
33
33
|
configured. On READY's acceptance the daemon submits the merge, and it lands under the
|
|
34
34
|
repository's rules: its required reviews and checks, and its merge queue when it enables one.
|
|
@@ -40,12 +40,15 @@ retrospective's durable output.
|
|
|
40
40
|
merge commit. A defect the production check finds becomes a corrective child issue of the same tree,
|
|
41
41
|
owned by the architect and implemented by the same implementer; the parent stays open until it lands.
|
|
42
42
|
|
|
43
|
-
Retro's commits sit above the reviewer's approved head and the approval stands: commits that
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
43
|
+
Retro's commits sit above the reviewer's approved head and the approval stands: commits that change
|
|
44
|
+
only `docs/solutions/`, and the one that removes `.legion/<issue>/`, do not void it, and the tree
|
|
45
|
+
goes from retro to the merger — never back to the tester or reviewer. A conflict merge pushed above
|
|
46
|
+
the approved head with no review round after it brings the base's paths above that head, so READY
|
|
47
|
+
refuses it (`READY_UNREVIEWED_CHANGE`) and the reviewer reviews the new head as a new round; one the
|
|
48
|
+
conflict procedure sends back through `implementing` is confirmed before READY. Any round after
|
|
49
|
+
retro (a conflict round, a round a red CI sends back, a re-review) writes `.legion/<issue>/` again,
|
|
50
|
+
and every approval moves the issue to retro once more: each retro ends with the removal again, or
|
|
51
|
+
READY is refused.
|
|
49
52
|
|
|
50
53
|
Do not start retro before step 2 or skip it because the change seems mechanical; the merger's
|
|
51
54
|
`READY` comes only after step 3. The design gate is not a substitute for review and retro.
|
|
@@ -204,7 +207,7 @@ workspace stands on, the removal commit your push made, so push before you compl
|
|
|
204
207
|
Before returning, verify all of the following:
|
|
205
208
|
|
|
206
209
|
- The reviewer-approved head remains below the retro commits, and the reviewer's approval of that
|
|
207
|
-
head stands:
|
|
210
|
+
head stands: READY accepts the approved head plus the documentation commit and the removal.
|
|
208
211
|
- The learning documents and the Dispatch message both exist (never a GitHub issue comment).
|
|
209
212
|
- The PR body carries what the repository's instructions derive from the pull request's changed
|
|
210
213
|
paths at the retro head, written back before that head's push, and each line that affirms work
|
|
@@ -93,9 +93,9 @@ fingerprint=$(set -o pipefail; jj -R "$LEGION_WORKSPACE" diff --from "fork_point
|
|
|
93
93
|
|
|
94
94
|
Where each role gets its two heads: the implementer — the tip before and after its own rebase;
|
|
95
95
|
the tester — the head its `E2E` line names and the new head; the reviewer — the `commit_id` of
|
|
96
|
-
its last submitted review (`gh api repos/{owner}/{repo}/pulls/{n}/reviews --jq '.[] | {commit_id, state, user: .user.login}'
|
|
97
|
-
and the new head; the merger never computes a fingerprint — it
|
|
98
|
-
|
|
96
|
+
its last submitted review (`gh api repos/{owner}/{repo}/pulls/{n}/reviews --jq '.[] | {commit_id, state, user: .user.login, body}'`, whose body tells a no-fix request that answered a READY refusal from any other)
|
|
97
|
+
and the new head; the merger never computes a fingerprint — it quotes the `--summary` lines
|
|
98
|
+
in READY, and the daemon holds the head to retro's commits.
|
|
99
99
|
|
|
100
100
|
## Rewriting pushed commits
|
|
101
101
|
|
|
@@ -12,8 +12,8 @@ the default branch and nothing there reads a handoff, and READY refuses a head t
|
|
|
12
12
|
carries them. After the approval, only retro's commits leave it standing on their own: those that
|
|
13
13
|
change only `docs/solutions/`, and that removal (*Retro*, below). A conflict-forced merge goes back
|
|
14
14
|
to the reviewer for a confirmation or a new round, as the fingerprint decides (*The reviewer*,
|
|
15
|
-
below, and `skill://legion-worker/references/conflicts-and-rewrites.md`),
|
|
16
|
-
the head voids it.
|
|
15
|
+
below, and `skill://legion-worker/references/conflicts-and-rewrites.md`), unless READY refused
|
|
16
|
+
it, and any other change to the head voids it.
|
|
17
17
|
|
|
18
18
|
## The reviewer
|
|
19
19
|
|
|
@@ -71,7 +71,10 @@ the head voids it.
|
|
|
71
71
|
and the fingerprint — a confirmation, not a round; no thermo pass, no thread pass. Equal and
|
|
72
72
|
that review was `COMMENT` or `REQUEST_CHANGES`: continue that round against the new head;
|
|
73
73
|
nothing restarts. Different, or either run printed no fingerprint: a new round — thermo again,
|
|
74
|
-
one review.
|
|
74
|
+
one review. A return whose task's `Reason:` names a READY refusal is never a confirmation, even
|
|
75
|
+
after a rebase, and a no-fix `REQUEST_CHANGES` that answered one is never continued: the round
|
|
76
|
+
after it reviews the refused change in full from the last `APPROVE` (*Retro's commits do not
|
|
77
|
+
void the reviewer's approval* below).
|
|
75
78
|
- Answer every thread you opened, and every thread a bot opened that is none of Legion's role
|
|
76
79
|
Apps, as `skill://legion-worker/references/review-threads.md` says; the same reference says
|
|
77
80
|
when every thread is settled enough to approve, and resolving one never gates your approval.
|
|
@@ -95,9 +98,14 @@ reviewing until you finish.
|
|
|
95
98
|
head, its `docs/solutions/` learnings and its last commit removing `.legion/<issue>/`
|
|
96
99
|
(`skill://legion-retro` gives the steps), leave the approval standing, and the tree goes to the
|
|
97
100
|
merger — never back to the tester or reviewer. Anything else above the approved head does void
|
|
98
|
-
it
|
|
99
|
-
|
|
100
|
-
|
|
101
|
+
it: READY is refused `READY_UNREVIEWED_CHANGE`, naming the paths, and the merger tells the
|
|
102
|
+
architect, who has it send the head back to review instead of completing, the move's reason
|
|
103
|
+
naming the refusal's code and what it found. A conflict merge pushed above the approved head
|
|
104
|
+
with no review round after it brings the base's paths above that head, so READY refuses it the
|
|
105
|
+
same way; one sent back through `implementing` by the conflict procedure gets its confirmation
|
|
106
|
+
before READY runs. A READY refusal's return reaches the reviewer as a new round, never a
|
|
107
|
+
fingerprint confirmation. Every approval moves the issue to
|
|
108
|
+
retro again, so each retro ends with the removal again.
|
|
101
109
|
- **Retro brings the PR body's path-derived content up to date before its push.** Whatever the
|
|
102
110
|
repository's instructions derive from the pull request's changed paths (a checklist named for
|
|
103
111
|
each class of path, read by a required check), retro recomputes for the whole diff at its head
|
|
@@ -108,11 +116,12 @@ reviewing until you finish.
|
|
|
108
116
|
## The merger
|
|
109
117
|
|
|
110
118
|
- The merger resolves no review thread: the reviewer's approval already judged them, and READY
|
|
111
|
-
requires no thread state beyond it. It
|
|
112
|
-
|
|
113
|
-
"$LEGION_WORKSPACE" diff --from <approved-sha> --to <tip-sha> --summary
|
|
114
|
-
|
|
115
|
-
|
|
119
|
+
requires no thread state beyond it. It quotes what sits above the approved head with
|
|
120
|
+
`cd -- "$LEGION_WORKSPACE" && jj -R "$LEGION_WORKSPACE" git fetch && jj -R
|
|
121
|
+
"$LEGION_WORKSPACE" diff --from <approved-sha> --to <tip-sha> --summary` in READY; the daemon,
|
|
122
|
+
not the merger, holds those commits to retro's: READY reads GitHub's compare of the round's
|
|
123
|
+
approved head with READY's head and refuses any other path (`READY_UNREVIEWED_CHANGE`), and a
|
|
124
|
+
round with no recorded approval (`READY_NOT_APPROVED`).
|
|
116
125
|
*The READY packet* is
|
|
117
126
|
`READY #<n> at <current sha> (approved at <approved sha>) for <KEY> (<pr url>)`
|
|
118
127
|
(the shape `packages/daemon/internal/prompts/roles/merger.md` defines), then the PR body's
|