neo-agent-skills 0.1.65 → 0.1.67

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.
@@ -48,7 +48,7 @@ Each sub the decomposition creates MUST be a **leaf that a single PR can FULLY d
48
48
 
49
49
  ## Procedure
50
50
 
51
- 1. **Confirm Epic-shape, then run §1a arm `(v)`.** The work needs ≥2 coordinated subs; a single bounded artifact (≈1 PR's worth) is a standalone ticket (`ticket-create`), not an Epic. Arm `(v)` — the epic-layer sweep, mandatory before authoring — compares **terminal predicates**, not titles, reading every open `label:epic` issue's `Terminal predicate:` line and only the bodies an outcome-overlap query ranks.
51
+ 1. **Confirm Epic-shape, then run §1a arm `(v)` ([`decision-substrate-sweeps.md`](../../ticket-create/references/decision-substrate-sweeps.md#v-epic-layer-outcome-authority-sweep)).** The work needs ≥2 coordinated subs; a single bounded artifact (≈1 PR's worth) is a standalone ticket (`ticket-create`), not an Epic.
52
52
  - **Size:** Around 25 subs is the working size; an epic is a checkable outcome, and past that count the leaves no longer share one (GitHub's native sub-issue cap of 100 per parent on `POST /issues/{n}/sub_issues` is the hard wall, not the target). Count the parent's subs before filing under it (`gh api repos/<r>/issues/N/sub_issues --paginate --jq length`); past ~25, file a successor epic with its own `Terminal predicate:` and link the new leaf there. A saturated epic gets the closeout treatment: cluster its open subs into outcomes, file the successors, re-parent, and resolve the old one via `epic-resolution`.
53
53
  2. **Run the Agent OS structure map.** Before authoring the body, run `npm run ai:structure-map -- --files --loc`; use it for Agent OS / architecture placement claims or record N/A. Brain-hosted, so absent elsewhere — never add `--silent`, which hides npm's `Missing script` and leaves an empty exit-1 that reads as a pass.
54
54
  3. **Graduation gate (if from a Discussion).** High-blast Epics require the §6.2 family-keyed quorum + the §5.1 divergence matrix in the source Discussion before filing (per `ideation-sandbox-workflow.md` + `ideation-sandbox/audits/double-diamond-divergence-guard.md`). Carry the `Signal Ledger` / dissent / liveness / criteria-mapping sections into the body.
@@ -24,7 +24,7 @@ A qualifying claim carries: (1) **Producer** (command, MCP tool, or query class
24
24
 
25
25
  ### 3. Worked negative examples (do NOT fire)
26
26
 
27
- - **Routine workflow attestations:** `"Live latest-open sweep: checked latest 20 open issues at 2026-08-22T00:35Z; no equivalent found"` — a fixed gate receipt, not a population premise.
27
+ - **Routine workflow attestations:** `"Live latest-open + closed sweep: checked latest 20 open + closed search (<problem nouns>, Out of Scope / Avoided Traps read on hits) at 2026-08-22T00:35Z; no equivalent or prior exclusion found"` — a fixed gate receipt, not a population premise.
28
28
  - **CI-linked test totals:** `"26/26 green"` or `"4,115 passed"` backed by PR CI or a linked test run — producer, tree, and scope already live in the CI receipt.
29
29
  - **Non-argument numbers:** dates, timestamps, versions, issue/PR IDs, and enumerations whose producer is already named in the surrounding table or heading.
30
30
 
@@ -34,30 +34,31 @@ Fires only on **epic-labeled** filings.
34
34
 
35
35
  ```bash
36
36
  gh issue list --repo <r> --label epic --state open --json number,title
37
+ gh issue list --repo <r> --label epic --state closed --search "<outcome nouns>" --limit 15
37
38
  ```
38
39
 
39
40
  Compare **terminal predicates**, not titles: *what state of the world does this Epic declare finished?* Two Epics that finish the same sentence are one Epic, however differently they open.
40
41
 
41
- **Read every predicate, then selected bodies.** `epic-create` puts `Terminal predicate:` first to keep this exhaustive read affordable:
42
+ **Read every open predicate, then closed hits and ranked bodies.** `epic-create` puts `Terminal predicate:` first to keep the open read affordable:
42
43
 
43
- 1. **Every row:** read each open epic's terminal predicate.
44
+ 1. **Every open row + closed search hits:** read each open epic's `Terminal predicate:` line, plus the predicate or body opening of same-outcome hits from the closed `--search`.
44
45
  2. **Ranked bodies:** for missing or arguably overlapping predicates, run the semantic outcome-overlap query and read its ranked candidates. Retrieval proposes; the reader judges overlap.
45
46
 
46
- **Cost control:** read predicates exhaustively, bodies selectively. On 2026-09-02, 29 Engine epics implied ~290k characters for an all-body read; re-query populations rather than calling them small. Standing outcomes can predate `(i)`'s window and use different nouns, splitting ownership when missed.
47
+ **Cost control:** read open predicates exhaustively, closed epics and bodies selectively. On 2026-09-02, 29 Engine epics implied ~290k characters for an all-body read; re-query populations rather than calling them small. Standing outcomes can predate `(i)`'s window and use different nouns, splitting ownership when missed.
47
48
 
48
49
  > **Anchor — `neomjs/neo-agent-brain#38` vs open `#54`, 2026-08-13.** Two roots, 17 and 16 children, the same two terminal predicates. The author's §1a sweep ran honestly and **passed**; a peer's epic review caught it after filing.
49
50
 
50
51
  ## Attestation
51
52
 
52
- Record what ran, in the body, beside the live-open attestation:
53
+ Record what ran, in the body, beside the live-open + closed attestation:
53
54
 
54
55
  ```
55
56
  MC sweep: <queries>, <n> results, no prior decision found
56
57
  Own-assignment sweep: <n> open, none overlapping
57
- Epic sweep: <n> open epics read, no shared terminal predicate # epic-labeled filings only
58
+ Epic sweep: <n> open predicates + closed search (<outcome nouns>) read, no shared terminal predicate # epic-labeled filings only
58
59
  ```
59
60
 
60
- Prose discipline that leaves no artifact cannot be checked, and these arms exist because prose discipline failed.
61
+ Prose discipline that leaves no artifact cannot be checked; these arms exist because prose discipline failed.
61
62
 
62
63
  ## Same-turn reconciliation
63
64
 
@@ -72,12 +73,9 @@ Reuse adjacency results and predecessor PR links: read affected tickets, open PR
72
73
 
73
74
  ## Empirical anchor
74
75
 
75
- **`neomjs/neo#17997`, 2026-08-31.** Re-filed **row 3** of `#17868` — open, older than the `(i)` window, and assigned to the filer — four hours after that same filer's own `#17961` closing comment recorded that row 3's blocker belonged **on `#17868`**.
76
-
77
- The missed decision can live in an older parent, a closed decline, a prior self-assignment or someone else's standing outcome; a latest-open artifact scan alone covers none of those cases.
78
-
79
- **Why the sweeps run LAST.** `#12856`, 2026-06-10: four agents raced one prompt into three duplicates, each having swept honestly; the one who re-checked immediately before filing produced none. Check-at-start decays across a multi-minute protocol.
76
+ - **`neomjs/neo#17997`, 2026-08-31:** Re-filed **row 3** of `#17868` — open, older than `(i)`'s window, and assigned to the filer — four hours after that filer's own `#17961` closing comment recorded row 3's blocker belonged **on `#17868`**.
77
+ - **Why sweeps run LAST (`#12856`, 2026-06-10):** four agents raced one prompt into three duplicates; the one who re-checked immediately before `create_issue` produced none.
80
78
 
81
79
  ## Sunset
82
80
 
83
- When `ticket-create` gains a mechanical pre-flight that runs the sweeps itself, arms `(i)`–`(iv)` collapse into that runner and this payload retires with them. `(v)` survives it as a prompt rather than a check: a runner can list open Epics, but *"do these two finish the same sentence?"* is not a judgement a lint makes.
81
+ When `ticket-create` gains a mechanical pre-flight runner, arms `(i)`–`(iv)` collapse into it and this payload retires. `(v)` survives as a prompt: a runner can list open Epics and closed `--search` hits, but *"do these two finish the same sentence?"* is a reader's judgment.
@@ -15,35 +15,36 @@ A ticket that calls an existing behavior wrong carries its `Design authority:` l
15
15
  **Before drafting any title or body**, you MUST execute the applicable sweeps below to ensure swarm synchronicity and architectural discipline:
16
16
 
17
17
  ### 1a. The Content Sweep (Duplicate Detection)
18
- Verify no equivalent ticket already exists. Redundant tickets pollute the Knowledge Base.
18
+ Verify no equivalent ticket or closed exclusion already exists. Redundant tickets pollute the Knowledge Base.
19
19
 
20
20
  Duplicates hide in **two substrates**; sweep **both as the LAST step immediately before `create_issue`** — never at turn-start or before drafting. A pre-draft sweep goes stale while you write the Fat Ticket: in a thundering herd, a peer's ticket can land between your sweep and your `create_issue` call. The turn-start mailbox check (`§mailbox_check_protocol`) is for general coordination, **not** the dup gate.
21
21
 
22
- **(i) GitHub live freshness sweep (mandatory) — catches already-FILED duplicates:** read at least the latest 20 open GitHub issues from the live tracker, including issue number, title, author, labels, and URL.
22
+ **(i) GitHub live freshness + closed-state sweep (mandatory) — catches already-FILED duplicates and closed rulings:** read at least the latest 20 open GitHub issues from the live tracker (issue number, title, author, labels, URL) and query closed state on the problem's nouns:
23
23
 
24
24
  ```bash
25
25
  gh issue list --state open --limit 20 --json number,title,author,labels,url
26
+ gh issue list --state closed --search "<problem nouns>" --limit 15
26
27
  ```
27
28
 
28
- An equivalent MCP call is acceptable only when its page is live AND created-descending (`list_issues` with `sort: 'created'`); updated-descending is only supplemental — it buries untouched fresh filings below recently-updated older issues. Failure mode `#15603`: a stale filtered-read path lagged the tracker by days across this herd window. This live sweep is required even when KB and local searches return no duplicates: the most likely active-swarm duplicate can exist on GitHub before the Knowledge Base has ingested it.
29
+ Read the `Out of Scope` and `Avoided Traps` sections of any same-surface closed hit — a closed ticket's title rarely reveals that it governs adjacent scope, and a closed hit answers what was already decided, never whether the premise matters (`neomjs/neo#18308` zero-backwards-compatibility ruling while `#18537` still closed `not_planned`, `neomjs/neo#18399` `Out of Scope` exclusion, `neomjs/neo#16391` / PR `#16403` already-shipped `hasLandedInPlace`). An equivalent MCP call for the open page is acceptable only when live AND created-descending (`list_issues` with `sort: 'created'`); updated-descending is supplemental because it buries untouched fresh filings (`#15603`). Both runs are required even when KB and local searches return no hits.
29
30
 
30
- If the live latest-open sweep fails because of sandbox, network, or auth state, retry through the appropriate approved/escalated path. If live GitHub state still cannot be fetched, stop before `create_issue` and report the blocker; do not file from stale-only evidence.
31
+ If live GitHub state cannot be fetched due to sandbox, network, or auth state, retry through the approved path; if still unreachable, stop before `create_issue` and report the blocker rather than filing from stale evidence.
31
32
 
32
- Record the live-open sweep result in the ticket body or creation notes, e.g. `Live latest-open sweep: checked latest 20 open issues at <timestamp>; no equivalent found` or link the existing ticket you found instead of filing a duplicate.
33
+ Record both on the same attestation line in the ticket body, e.g. `Live latest-open + closed sweep: checked latest 20 open + closed search (<problem nouns>, Out of Scope / Avoided Traps read on hits) at <timestamp>; no equivalent or prior exclusion found` (or link the existing ticket instead of filing).
33
34
 
34
- **(ii) A2A in-flight claim sweep (mandatory) — catches IN-FLIGHT duplicates not yet on GitHub:** for the first minutes of a thundering herd a peer's intent exists only as an A2A `[lane-claim]`/`[lane-intent]`, not yet a GitHub ticket — the `(i)` sweep above cannot see it. Immediately before `create_issue`, scan the mailbox for recent claims on the same scope:
35
+ **(ii) A2A in-flight claim sweep (mandatory) — catches IN-FLIGHT duplicates not yet on GitHub:** in a thundering herd a peer's intent first exists only as an A2A `[lane-claim]`/`[lane-intent]` invisible to `(i)`. Immediately before `create_issue`, scan the mailbox for recent claims on the same scope:
35
36
 
36
37
  ```js
37
38
  list_messages({ status: 'all', limit: 30 }) // ALL read-states — recency is the bound, not read-status
38
39
  ```
39
40
 
40
- **Filter by recency + scope, NOT read-status.** A `[lane-claim]` you have already *read* (e.g. your turn-start mailbox triage marked it read) is still an active claim — `status: 'unread'` would make it invisible and you would refile the duplicate, the exact late-boot ordering this gate exists to stop (read-status is consumption tracking, not a relevance signal). From the returned slice, keep messages whose `sentAt` falls in the herd window (~last 30–60 min) **and** whose `[lane-claim]`/`[lane-intent]` subject overlaps your scope (`taggedConcepts: ['lane-claim']` is optional narrowing — tag discipline is conventional, not guaranteed, so subject-scan stays primary).
41
+ **Filter by recency + scope, NOT read-status.** A `[lane-claim]` already marked read during turn-start mailbox triage is still an active claim — `status: 'unread'` hides it and causes duplicate filing (read-status tracks consumption, not relevance). Keep messages whose `sentAt` falls in the herd window (~last 30–60 min) **and** whose `[lane-claim]`/`[lane-intent]` subject overlaps your scope (`taggedConcepts: ['lane-claim']` is optional; subject-scan stays primary).
41
42
 
42
- **Tiebreak — first-claim-timestamp-wins:** if a competing claim or a just-filed ticket surfaces, the **earliest claim/file timestamp wins** — and an earlier *unfiled claim* outranks a later *filed ticket* (claims must bind against fast-filers, or the sweep is toothless). The later party stands down; if it already filed, it closes its duplicate and ports any unique substance onto the survivor — i.e. the earlier claimant absorbs the later filer's content, **not** the reverse. Deterministic and self-healing — resolves simultaneous filings without lead mediation. A contested-lane resolution MUST set `wakeSuppressed: false` — claim-class is quiet by default (#15987), so omission leaves the "do-not-re-file" signal mailbox-only and it reaches no one in time.
43
+ **Tiebreak — first-claim-timestamp-wins:** the **earliest claim/file timestamp wins**, and an earlier *unfiled claim* outranks a later *filed ticket*. The later party stands down; if it already filed, it closes its duplicate and ports unique substance onto the survivor (earlier claimant absorbs later filer's content, **not** the reverse). A contested-lane resolution MUST set `wakeSuppressed: false` — claim-class is quiet by default (#15987), so omitting it leaves the signal mailbox-only.
43
44
 
44
- **(iii) Memory Core rationale sweep + (iv) own-assignment sweep (both mandatory):** `(i)`, `(ii)` and the greps below are all **artifact** substrates — they answer *"does a ticket exist?"*, never *"was this already decided, and why?"* Run one `query_raw_memories` keyed on the **problem's** nouns (the symptom as observed, never the mechanism you are about to build), and `gh issue list --state open --assignee @me` reading the **bodies** of same-surface hits. Both attest in the body like `(i)` does.
45
+ **(iii) Memory Core rationale sweep + (iv) own-assignment sweep (both mandatory):** `(i)` and `(ii)` are **artifact** substrates — combine them with one `query_raw_memories` keyed on the **problem's** nouns (observed symptom, never proposed mechanism) and `gh issue list --state open --assignee @me` reading the **bodies** of same-surface hits. Both attest in the body beside `(i)`.
45
46
 
46
- **(v) Epic-layer sweep (epic-labeled filings only, mandatory):** both artifact axes are blind to an outcome authority — the payload says why. Read every open `label:epic` issue's `Terminal predicate:` line, then body-read only what an outcome-overlap query ranks, and attest beside `(i)`.
47
+ **(v) Epic-layer sweep (epic-labeled filings only, mandatory):** read every open `label:epic` issue's `Terminal predicate:` line, run `gh issue list --label epic --state closed --search "<outcome nouns>"` to read the predicate or body opening of same-outcome closed epics, body-read what an outcome-overlap query ranks, and attest beside `(i)`.
47
48
 
48
49
  <!-- trigger: filing a ticket, filing an EPIC, or a defect found while measuring something else -> read ./decision-substrate-sweeps.md (query shape, the epic sweep, attestation lines, same-turn porting, the #17997 / #12856 anchors) -->
49
50
  <!-- trigger: load-bearing population count or absence claim justifying premise, scope, or acceptance -> read ../../pr-review/references/reviewer-instrument-audit.md (role-triggered publish-safe instrument receipt; routine receipts and CI totals exempt) -->
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "neo-agent-skills",
3
- "version": "0.1.65",
3
+ "version": "0.1.67",
4
4
  "description": "Install the workflow substrate a cross-model AI team actually runs on: ticket intake, PR review gates, lane coordination and guards, versioned as a package. The skills Neo.mjs maintainers load every session — materialized into your repo, not copied.",
5
5
  "type": "module",
6
6
  "license": "MIT",