-
Notifications
You must be signed in to change notification settings - Fork 0
/nm and /ncc send back what they can articulate #298
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -11,9 +11,9 @@ JSON-RPC frame, a Python filter over the response, and two raw `gh` calls. | |
| | Command | The call it invokes | | ||
| | -------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | ||
| | `/nr [1-3]` | `next_ready` + `pr_context` + `pr_checkout` + `clone_release` + `human_rule` (MCP) and the `audit` skill — the next `ai:ready` PR, and the vetter's verdict checked against its diff, its issue and its source. Sends back what it can articulate; the merge is the human's | | ||
| | `/ncc [1-3]` | `next_close_candidate` + `close_candidate_context` + `pr_context` (MCP) — the next `ai:close-candidate` flag, and the producer's reason checked against the issue as filed and the code it claims about. Writes no GitHub state | | ||
| | `/ncc [1-3]` | `next_close_candidate` + `close_candidate_context` + `pr_context` (MCP) — the next `ai:close-candidate` flag, and the producer's reason checked against the issue as filed and the code it claims about. Writes no GitHub state — there is no typed `reject`, so the one exit it can articulate is handed over as `/close-candidate <ref> reject` | | ||
| | `/ndd [1-3]` | `next_design` + `pr_context` + `pr_checkout` + `clone_release` + `human_rule` (MCP) and the `audit` skill — the next `ai:design` PR, and the raised question checked against its issue, its diff and its source: genuine (presented with its option space, for the human to answer), already answered or misrouted (ruled here, reported in a few lines) | | ||
| | `/nm [1-3]` | `next_leak` + `pr_context` + `pr_checkout` + `clone_release` (MCP) and the `audit` skill — the next FSM-conformance leak, and which of three places the defect is in: the PR's state record, the machine's vocabulary, or the classifier. Writes no GitHub state | | ||
| | `/nm [1-3]` | `next_leak` + `pr_context` + `pr_checkout` + `clone_release` + `human_rule` (MCP) and the `audit` skill — the next FSM-conformance leak, and which of three places the defect is in: the PR's state record, the machine's vocabulary, or the classifier. Sends back what it can articulate; the close is the human's | | ||
| | `/close-candidate <owner/repo#n> uphold "…"` | `human-close` — rule, retire `ai:close-candidate`, close. Issue **or** PR, resolved by lookup | | ||
| | `/close-candidate <owner/repo#n> reject "…"` | `record-close-candidate-verdict … reject` — drop the flag, back to the producer (issue-only) | | ||
| | `/needs-work <owner/repo#n> "…"` | `human-rule … needs-work --rework` / `human-rule-issue … needs-work --rework` — the send-back: `ai:needs-work` (PR) plus the trusted `Rework note` work order, one call, pinned to the head sha or the issue. `--rework` is REQUIRED on either subject; there is no parked needs-work | | ||
|
|
@@ -29,21 +29,25 @@ inbox: the merge queue, the flag queue, the design questions, and the leaks. The | |
| rest are the rulings. They differ in how they reach the binary, and the | ||
| difference is the point. | ||
|
|
||
| A read that can articulate the ruling takes it: `/nr` and `/ndd` carry | ||
| A read that can articulate the ruling takes it: `/nr`, `/ndd` and `/nm` carry | ||
| `human_rule` and send back what they can put into words, so what reaches the | ||
| human is the merge, or the design question no source they can read settles. | ||
| human is the merge, the close, or the design question no source they can read | ||
| settles. `/ncc` is the exception and says so in its own file: there is no typed | ||
| `reject`, and `human_rule_issue` refuses `needs-work` on a live flag because it | ||
| would strand it, so the reject it can articulate is handed over rather than | ||
| taken. | ||
|
Comment on lines
+32
to
+38
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🔒 Security & Privacy | 🟠 Major | ⚡ Quick win Replace the stale read-only guarantee. The changed text says Proposed README correction- **Nothing here writes GitHub state.**
+ **`human_rule` is the only read-command operation that writes GitHub state.**🤖 Prompt for AI Agents |
||
|
|
||
| The rulings shell out to a `pr-review-report` subcommand. The reads call **MCP | ||
| tools** — served by the `fsm` server this plugin ships in its own manifest — and | ||
| **no shell at all**. `/nr` is granted `next_ready`, `pr_context`, `pr_checkout` | ||
| and `clone_release`, plus `Skill` and `Read`, which it needs because it puts the | ||
| PR's source on disk and audits it. `/ndd` is granted the same shape with | ||
| `next_design` at its head, because a design question is a claim about code on a | ||
| PR and weighing its options means reading the tree. `/nm` is granted the same | ||
| shape with `next_leak` at its head: locating a leak sometimes turns on what the | ||
| code actually did, so the tree has to be reachable — though most leaks are | ||
| located from the trusted comments and the labels, and the lens is the exception | ||
| rather than a step. `/ncc` is granted `next_close_candidate`, | ||
| **no shell at all**. `/nr` is granted `next_ready`, `pr_context`, `pr_checkout`, | ||
| `clone_release` and `human_rule`, plus `Skill` and `Read`, which it needs | ||
| because it puts the PR's source on disk and audits it. `/ndd` is granted the | ||
| same shape with `next_design` at its head, because a design question is a claim | ||
| about code on a PR and weighing its options means reading the tree. `/nm` is | ||
| granted the same shape with `next_leak` at its head: locating a leak sometimes | ||
| turns on what the code actually did, so the tree has to be reachable — though | ||
| most leaks are located from the trusted comments and the labels, and the lens is | ||
| the exception rather than a step. `/ncc` is granted `next_close_candidate`, | ||
| `close_candidate_context` and `pr_context`, and those three only: a flag has no | ||
| diff and no tree to check out, so there is nothing for `Skill` or `Read` to | ||
| reach, and a grant a command cannot use is surface it cannot account for. None | ||
|
|
||
| Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
@@ -220,6 +220,23 @@ issue, reassembled by hand, is a decision whose inputs nobody can audit. If a | |||||||||||||||||||||||
| tool is unavailable, say so and stop — the answer is to connect the plugin's MCP | ||||||||||||||||||||||||
| server, not to work around it. | ||||||||||||||||||||||||
|
|
||||||||||||||||||||||||
| ## If you can articulate it, send it BACK — not forward | ||||||||||||||||||||||||
|
|
||||||||||||||||||||||||
| **Anything you can put into words against the flag is a reject.** Do not write | ||||||||||||||||||||||||
| it up for the human to reach the same answer; the words are the reject's note. | ||||||||||||||||||||||||
|
|
||||||||||||||||||||||||
| Two exits stay theirs, and both for the same reason — they destroy or freeze | ||||||||||||||||||||||||
| work: `uphold`, which closes somebody's issue, and `keep-open`, which forbids | ||||||||||||||||||||||||
| the producer from ever flagging it again. | ||||||||||||||||||||||||
|
|
||||||||||||||||||||||||
| **Blocked today:** there is no typed tool for `reject`. The server exposes | ||||||||||||||||||||||||
| `human_close` (uphold) and `human_rule_issue`, and the latter refuses | ||||||||||||||||||||||||
| `needs-work` on a live flag because it would strand it. So the reject is handed | ||||||||||||||||||||||||
| to the human as `/close-candidate <ref> reject <note>` — the one exit this | ||||||||||||||||||||||||
| command cannot take itself, and a gap worth closing rather than living with. | ||||||||||||||||||||||||
|
Comment on lines
+232
to
+236
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win Make the reject handoff executable.
The reject ruling also requires Proposed documentation correction- `/close-candidate <ref> reject <note>` — ...
+ `/close-candidate <owner/repo#n> reject <note>` — ...
+ The reject handoff must pass the ruling note and the required
+ `--rework <work-order>` to the typed reject operation.Based on learnings: “In human-fsm plugin command documentation, state that reject rulings require the --rework option for both pull request and issue subjects. Do not present --park as an issue-side fallback disposition, because the ruling_work reject branch does not support --park.” The exact subject contract comes from 📝 Committable suggestion
Suggested change
🤖 Prompt for AI AgentsSource: Learnings |
||||||||||||||||||||||||
|
|
||||||||||||||||||||||||
| ## Typed reads | ||||||||||||||||||||||||
|
|
||||||||||||||||||||||||
| The grant is three typed reads and nothing else. All three are reads; this | ||||||||||||||||||||||||
| command writes no GitHub state. That list is a **declaration, not a sandbox** — | ||||||||||||||||||||||||
| measured on Claude Code 2.1.220, a command granting only `Read` still ran a | ||||||||||||||||||||||||
|
|
@@ -293,7 +310,7 @@ The rulings are the existing ones and this command invents none: | |||||||||||||||||||||||
| - `/design <owner/repo#n> <note>` — the flag raises a question a human has to | ||||||||||||||||||||||||
| settle rather than a claim anyone can check. | ||||||||||||||||||||||||
|
|
||||||||||||||||||||||||
| **This command does not rule and does not close.** It is the read that precedes | ||||||||||||||||||||||||
| the human's word. | ||||||||||||||||||||||||
| **This command does not close** — destroying work is the human's word. It DOES | ||||||||||||||||||||||||
| reject what it can articulate against, once a typed reject exists. | ||||||||||||||||||||||||
|
|
||||||||||||||||||||||||
| Names collide across plugins; `/human-fsm:ncc` disambiguates. | ||||||||||||||||||||||||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🎯 Functional Correctness | 🟠 Major | ⚡ Quick win
Add the required
--reworkoption to the/ncchandoff.The new row hands rejection to
/close-candidate <ref> reject, but a reject ruling requires a--reworkwork order for both pull-request and issue subjects. Without this option, a human following/ncccannot complete the producer handoff. Add the option to both documented command forms.Proposed command-surface correction
Based on learnings: reject rulings require the
--reworkoption for both pull request and issue subjects. Do not present--parkas an issue-side fallback disposition because theruling_workreject branch does not support--park.📝 Committable suggestion
🤖 Prompt for AI Agents
Source: Learnings