Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
fc804f5
perf(security-issue-import): decide and render the import as code
potiuk Oct 16, 2026
ac168a0
perf(security-issue-import-from-pr): decide and render the PR import …
potiuk Oct 16, 2026
c3da5ce
fix(security-management): fail closed on unsafe report text and pair …
potiuk Oct 16, 2026
de66b2e
perf(security-issue-import-from-md): parse and render the findings im…
potiuk Oct 16, 2026
7b7b056
fix(security-management): defuse inside code spans and normalise line…
potiuk Oct 16, 2026
c9f8033
fix(security-management): keep fenced headings and HTML blocks from o…
potiuk Oct 16, 2026
e5fd7bd
fix(security-management): resolve reply, ledger, dedup, recap and sco…
potiuk Oct 16, 2026
995d392
fix(security-management): escape HTML openers anywhere in report text
potiuk Oct 16, 2026
805e659
perf(security-issue-import-via-forwarder): decide preflight, detectio…
potiuk Oct 16, 2026
eea22fc
perf(security-issue-import-from-scan): enforce the bucket rule and re…
potiuk Oct 16, 2026
246e86e
feat(github-body-field): normalise tracker bodies into the shape ever…
potiuk Oct 16, 2026
e984c53
fix(generate-cve-json): normalise the body before reading fields and …
potiuk Oct 16, 2026
442dca0
fix(github-body-field): never take a heading inside a list item or bl…
potiuk Oct 16, 2026
12035db
feat(security-issue-sync): propose missing or ambiguous CVE fields wi…
potiuk Oct 16, 2026
37f6721
fix(github-body-field): fail closed on nested field headings instead …
potiuk Oct 16, 2026
753d2fe
fix(security-management): import the report as an inert fenced block,…
potiuk Oct 16, 2026
1fac6b5
fix(github-body-field): refuse ambiguous fields at the read and write…
potiuk Oct 16, 2026
0618e44
fix(security-management): escape known-field headings in the inert bl…
potiuk Oct 16, 2026
5a7e364
fix(github-body-field): strip any number of quote and list markers be…
potiuk Oct 16, 2026
b763d32
fix(github-body-field): match field names case-sensitively, as before
potiuk Oct 16, 2026
dc2106c
fix(generate-cve-json): find attachment markers only outside report t…
potiuk Oct 16, 2026
812cc1a
fix(github-body-field): guard every field boundary and keep fenced pa…
potiuk Oct 16, 2026
1e20e8f
fix(security-issue-sync): keep the record in DRAFT while required fie…
potiuk Oct 16, 2026
564c9c0
docs(spec-loop): sync specs with the security import split
potiuk Oct 16, 2026
1b012d4
fix(github-body-field): verify the rewritten body and keep CRLF spacing
potiuk Oct 16, 2026
a7be014
fix(generate-cve-json): attach after the last template field and stat…
potiuk Oct 16, 2026
9e866d0
docs(security-issue-import): restore the recap-draft and parse-warnin…
potiuk Oct 17, 2026
f97e781
fix(security-management): drop an implicit string concatenation flagg…
potiuk Oct 17, 2026
2fabaca
fix(github-body-field): one parser for reading and writing, on the bo…
potiuk Oct 17, 2026
e69f455
fix(jira, local-tracker): read and write body fields through the one …
potiuk Oct 17, 2026
0f55d31
fix(github-body-field): never take a quoted heading for a field
potiuk Oct 17, 2026
7015ef3
fix(jira, local-tracker): explain the probe loop's ignored not-found
potiuk Oct 17, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .github/labeler.yml
Original file line number Diff line number Diff line change
Expand Up @@ -564,6 +564,7 @@ substrate:analytics:
- 'tools/dashboard-generator/**'
- 'tools/pr-management/**'
- 'tools/preflight-audit/**'
- 'tools/security-management/**'
- 'tools/security-tracker-stats-dashboard/**'
- 'tools/skill-token-count/**'
- 'tools/spec-inventory/**'
Expand Down
1 change: 1 addition & 0 deletions docs/labels-and-capabilities.md
Original file line number Diff line number Diff line change
Expand Up @@ -357,6 +357,7 @@ or a contract-free mix of substrates (e.g. `tools/spec-inventory` is
| [`tools/vetted-ops`](../tools/vetted-ops/) | `substrate:sandbox` | Fixed, policy-scoped forge operations — a closed catalogue whose parameters can never become commands or flags, so one `allow` entry replaces the wildcard Layer 3 `ask` rules |
| [`tools/contributor-metrics`](../tools/contributor-metrics/) | `substrate:analytics` | Deterministic contributor activity counts, per-area shares and automated-work weighting for the contributor-growth skills |
| [`tools/pr-management`](../tools/pr-management/) | `substrate:analytics` | Deterministic core of the `pr-management` skills: classifies a saved PR sweep (pre-filters, decision table, stale sweeps), guards each mutation on fresh reads, renders every contributor-facing body, and builds the whole PR-backlog dashboard |
| [`tools/security-management`](../tools/security-management/) | `substrate:analytics` | Deterministic core of the `security-*` skills: the Step 1 pre-filter, batched `threadId` dedup, forwarder pre-screen, the sanitised tracker body, rollup entry, rejections-ledger record and fix-already-public reply, the receipt-draft matrix, the confirmation-reply grammar and the recap; runs nothing. Used by `security-issue-import` Steps 0–8 `security-issue-import-from-pr` Steps 0–8 (PR reference, scope detection, milestone check, duplicate query, body, labels, rollup, recap), `security-issue-import-from-md` Steps 0–6 (findings parser, keyword, body, rollup, proposal, recap), `security-issue-import-via-forwarder` Steps 0–3 (preflight, adapter detection, credit kind, routing) and `security-issue-import-from-scan` Steps C–F (bucket rule, report, decision, scrub) |
| [`tools/preflight-audit`](../tools/preflight-audit/) | `substrate:analytics` | Dry-run the bulk-mode pre-flight classifier; measure skip-rate before / after any rule edit in the security-issue-sync skill |
| [`tools/privacy-llm`](../tools/privacy-llm/) | `substrate:privacy` | Privacy-LLM PII-scrubbing gate |
| [`tools/probe-templates`](../tools/probe-templates/) | `substrate:sandbox` | Sandbox-doctor probe templates |
Expand Down
5 changes: 3 additions & 2 deletions docs/vendor-neutrality.md
Original file line number Diff line number Diff line change
Expand Up @@ -614,7 +614,7 @@ Organization scope (declared, orthogonal to vendor): ASF = 16, agnostic = 64.

**LLM / agent-integration neutrality**

**Agent harness: 33/33 substrate tools run under any harness unchanged (100%).** Substrate tools are Magpie's own machinery; each declares the agent harness it integrates with (`**Harness:**`), or `agnostic`. A tool is neutral when it is harness-agnostic or supports two or more harnesses; *coupled* when it targets a single harness.
**Agent harness: 34/34 substrate tools run under any harness unchanged (100%).** Substrate tools are Magpie's own machinery; each declares the agent harness it integrates with (`**Harness:**`), or `agnostic`. A tool is neutral when it is harness-agnostic or supports two or more harnesses; *coupled* when it targets a single harness.

| Substrate tool | Substrate | Harness support | Verdict |
|---|---|---|---|
Expand All @@ -638,6 +638,7 @@ Organization scope (declared, orthogonal to vendor): ASF = 16, agnostic = 64.
| `release-verify` | release | any | ✅ agnostic |
| `reproducible-archive` | release | any | ✅ agnostic |
| `sandbox-lint` | sandbox | Claude Code, Codex, Cursor, Gemini CLI, Grok, Kiro, OpenCode | ✅ portable |
| `security-management` | analytics | any | ✅ agnostic |
| `security-tracker-stats-dashboard` | analytics | any | ✅ agnostic |
| `setup-preflight` | setup | any | ✅ agnostic |
| `skill-and-tool-validator` | framework-dev | any | ✅ agnostic |
Expand All @@ -663,7 +664,7 @@ Harness → substrate tools it supports:
- **Junie** (1): `agent-guard`
- **Kiro** (3): `agent-guard`, `sandbox-lint`, `spec-loop`
- **OpenCode** (3): `agent-guard`, `sandbox-lint`, `spec-loop`
- **any harness** (30): `adversarial-review`, `agent-isolation`, `container-gateway`, `contributor-metrics`, `dashboard-generator`, `dev`, `egress-gateway`, `maven-artifact-verify`, `permission-audit`, `pilot-report-validator`, `pr-management`, `preflight-audit`, `privacy-llm`, `probe-templates`, `release-config`, `release-management`, `release-verify`, `reproducible-archive`, `security-tracker-stats-dashboard`, `setup-preflight`, `skill-and-tool-validator`, `skill-evals`, `skill-reconciler-diff`, `skill-token-count`, `spec-inventory`, `spec-status-index`, `spec-validator`, `symlink-lint`, `vendor-neutrality-score`, `vetted-ops`
- **any harness** (31): `adversarial-review`, `agent-isolation`, `container-gateway`, `contributor-metrics`, `dashboard-generator`, `dev`, `egress-gateway`, `maven-artifact-verify`, `permission-audit`, `pilot-report-validator`, `pr-management`, `preflight-audit`, `privacy-llm`, `probe-templates`, `release-config`, `release-management`, `release-verify`, `reproducible-archive`, `security-management`, `security-tracker-stats-dashboard`, `setup-preflight`, `skill-and-tool-validator`, `skill-evals`, `skill-reconciler-diff`, `skill-token-count`, `spec-inventory`, `spec-status-index`, `spec-validator`, `symlink-lint`, `vendor-neutrality-score`, `vetted-ops`

**Model endpoint: neutral by construction — 4 default-approved endpoint classes across independent trust domains, plus adopter opt-in.** From the [`privacy-llm` registry](../tools/privacy-llm/models.md): the framework keys approval on *endpoint identity*, not on who hosts the model, so no single LLM vendor is privileged.

Expand Down
6 changes: 3 additions & 3 deletions plugins/magpie-security/skills/cve-allocate/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ argument-hint: "[issue-number] [CVE-YYYY-NNNNN]"
capability: capability:resolve
surface_hash: sha256:25c2286c4e159c66
license: Apache-2.0
measured_tokens: 7638
measured_tokens: 7679
---

<!-- Placeholder convention (see AGENTS.md#placeholder-convention-used-in-skill-files):
Expand Down Expand Up @@ -420,8 +420,8 @@ partial failures stay legible:
(`uv run --project ~/.claude/magpie/vetted-ops vetted-op-tracker --caller security-cve-allocate rollup-append <N> "CVE allocated (<CVE-YYYY-NNNNN>)" <scratch>/rollup-entry-<N>.md`)
— appends the entry to the tracker's rollup, creating the rollup if none exists yet.
`<scratch>` is the session scratch directory as an absolute path (fall back to `$TMPDIR`); the entry point runs outside the sandbox, where `$TMPDIR` differs, so pass it absolute paths.
4. `uv run --project <framework>/<cve-tool>/generate-cve-json generate-cve-json <N> --attach`
— embeds the CVE JSON in the body.
4. `uv run --project <framework>/<cve-tool>/generate-cve-json generate-cve-json <N> --attach --report-json <scratch>/cve-report-<N>.json`
— embeds the CVE JSON in the body; a report with any non-empty array goes through the [CVE JSON fallback](../issue-sync/outcomes/cve-json-fallback.md).
5. Create draft on the original thread (reporter notification, if
applicable) via the project's configured drafting backend — see
[`tools/gmail/draft-backends.md`](../../../../tools/gmail/draft-backends.md).
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,9 +43,10 @@ user to confirm. Numbered items:
4. **Regenerate the CVE JSON attachment** in the tracker body by
running the adapter's `generate-cve-json` sub-tool:
```bash
uv run --project <framework>/<cve-tool>/generate-cve-json generate-cve-json <N> --attach
uv run --project <framework>/<cve-tool>/generate-cve-json generate-cve-json <N> --attach --report-json <scratch>/cve-report-<N>.json
```
This is how the CVE record first gets seeded with the allocated ID.
Any non-empty `normalisation_changes`, `missing_required` or `needs_decision` in the report goes through [`security-issue-sync`'s CVE JSON fallback](../issue-sync/outcomes/cve-json-fallback.md).
The remediation-developer credit (if any) comes from the *Remediation developer* body field,
which `security-issue-sync` fills from the linked PR's author the first time *PR with the fix* is set
(editable by hand thereafter); no CLI flag needed.
Expand Down
7 changes: 4 additions & 3 deletions plugins/magpie-security/skills/issue-deduplicate/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ argument-hint: "[kept-issue] [duplicate-issue]"
capability: capability:resolve
surface_hash: sha256:3c9f502b802d2037
license: Apache-2.0
measured_tokens: 6261
measured_tokens: 6312
---

<!-- Placeholder convention (see AGENTS.md#placeholder-convention-used-in-skill-files):
Expand Down Expand Up @@ -374,8 +374,9 @@ After confirmation, apply **sequentially** (never in parallel):
(GitHub's `duplicate` close-reason is not exposed by `gh` on
all versions; `not planned` combined with the `duplicate` label
carries the same signal)
6. `uv run --project <framework>/tools/<cve-tool>/generate-cve-json generate-cve-json <keep> --attach`
— remediation-developer credits come from the *Remediation developer* body field
6. `uv run --project <framework>/tools/<cve-tool>/generate-cve-json generate-cve-json <keep> --attach --report-json <scratch>/cve-report-<keep>.json`
— a report with any non-empty array (a merge can leave a field twice) goes through the [CVE JSON fallback](../issue-sync/outcomes/cve-json-fallback.md);
remediation-developer credits come from the *Remediation developer* body field
(populated by `security-issue-sync` from the linked PR's author); no CLI flag needed.
The regen output is the kept tracker's canonical JSON record.
When the kept tracker already carries an allocated CVE ID, feed the record into
Expand Down
Loading