@vegastack/skills 0.14.0 → 0.16.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": "@vegastack/skills",
3
- "version": "0.14.0",
3
+ "version": "0.16.1",
4
4
  "description": "Installer and verifier for VegaStack Agent Skills (Claude Code, Codex, and Hermes)",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -25,14 +25,14 @@ Every workflow-generated issue comment opens with an invisible HTML marker follo
25
25
 
26
26
  ## Operator identity
27
27
 
28
- Every human reference in every artifact — approvals, revisions, decisions, changelog attributions, review adjudications — is written `operator (<github-username>)`:
28
+ Every human reference in every artifact — approvals, revisions, decisions, changelog attributions, review adjudications — names the operator by their GitHub username in parentheses, with no title before it — `(<github-username>)`:
29
29
 
30
- - Approval: `Approved by operator (<username>) on DD-MM-YYYY: "<their words>"`
31
- - Register line: `- DD-MM-YYYY operator (<username>) — <decision>`
30
+ - Approval: `Approved by (<username>) on DD-MM-YYYY: "<their words>"`
31
+ - Register line: `- DD-MM-YYYY (<username>) — <decision>`
32
32
 
33
33
  ## Revision markers
34
34
 
35
- Any artifact edited after its first approval: the heading gains `(v2)`, the marker gains `rev=2`, and a `Revisions:` line is appended at the bottom — `v2 — DD-MM-YYYY: <what changed>, per operator (<username>) correction`. Existing revision lines are never rewritten.
35
+ Any artifact edited after its first approval: the heading gains `(v2)`, the marker gains `rev=2`, and a `Revisions:` line is appended at the bottom — `v2 — DD-MM-YYYY: <what changed>, per (<username>) correction`. Existing revision lines are never rewritten.
36
36
 
37
37
  ## Scope classes
38
38
 
@@ -20,7 +20,7 @@ Nearest neighbors: `dev-implement` writes the entries at hand-back (the write ru
20
20
  - **Changed:** <the user-visible changes, simple words — sub-bullets or one ·-separated line>
21
21
  - **Decisions:** <register lines it produced, or "none">
22
22
 
23
- — approved by operator (<username>) · built by <agent> · branch <name>
23
+ — approved by (<username>) · built by <agent> · branch <name>
24
24
  ```
25
25
 
26
26
  - Titles name the outcome ("Invoice reminders now chase late payers"), never the mechanism ("add reminderAt column"). The issue reference is a full markdown link to `…/issues/<n>` (correct for PRs too — GitHub redirects); a bare `#N` never appears anywhere in an entry, because file views don't auto-link it.
@@ -25,14 +25,14 @@ Every workflow-generated issue comment opens with an invisible HTML marker follo
25
25
 
26
26
  ## Operator identity
27
27
 
28
- Every human reference in every artifact — approvals, revisions, decisions, changelog attributions, review adjudications — is written `operator (<github-username>)`:
28
+ Every human reference in every artifact — approvals, revisions, decisions, changelog attributions, review adjudications — names the operator by their GitHub username in parentheses, with no title before it — `(<github-username>)`:
29
29
 
30
- - Approval: `Approved by operator (<username>) on DD-MM-YYYY: "<their words>"`
31
- - Register line: `- DD-MM-YYYY operator (<username>) — <decision>`
30
+ - Approval: `Approved by (<username>) on DD-MM-YYYY: "<their words>"`
31
+ - Register line: `- DD-MM-YYYY (<username>) — <decision>`
32
32
 
33
33
  ## Revision markers
34
34
 
35
- Any artifact edited after its first approval: the heading gains `(v2)`, the marker gains `rev=2`, and a `Revisions:` line is appended at the bottom — `v2 — DD-MM-YYYY: <what changed>, per operator (<username>) correction`. Existing revision lines are never rewritten.
35
+ Any artifact edited after its first approval: the heading gains `(v2)`, the marker gains `rev=2`, and a `Revisions:` line is appended at the bottom — `v2 — DD-MM-YYYY: <what changed>, per (<username>) correction`. Existing revision lines are never rewritten.
36
36
 
37
37
  ## Scope classes
38
38
 
@@ -25,14 +25,14 @@ Every workflow-generated issue comment opens with an invisible HTML marker follo
25
25
 
26
26
  ## Operator identity
27
27
 
28
- Every human reference in every artifact — approvals, revisions, decisions, changelog attributions, review adjudications — is written `operator (<github-username>)`:
28
+ Every human reference in every artifact — approvals, revisions, decisions, changelog attributions, review adjudications — names the operator by their GitHub username in parentheses, with no title before it — `(<github-username>)`:
29
29
 
30
- - Approval: `Approved by operator (<username>) on DD-MM-YYYY: "<their words>"`
31
- - Register line: `- DD-MM-YYYY operator (<username>) — <decision>`
30
+ - Approval: `Approved by (<username>) on DD-MM-YYYY: "<their words>"`
31
+ - Register line: `- DD-MM-YYYY (<username>) — <decision>`
32
32
 
33
33
  ## Revision markers
34
34
 
35
- Any artifact edited after its first approval: the heading gains `(v2)`, the marker gains `rev=2`, and a `Revisions:` line is appended at the bottom — `v2 — DD-MM-YYYY: <what changed>, per operator (<username>) correction`. Existing revision lines are never rewritten.
35
+ Any artifact edited after its first approval: the heading gains `(v2)`, the marker gains `rev=2`, and a `Revisions:` line is appended at the bottom — `v2 — DD-MM-YYYY: <what changed>, per (<username>) correction`. Existing revision lines are never rewritten.
36
36
 
37
37
  ## Scope classes
38
38
 
@@ -47,6 +47,7 @@ A changeset entry's first line is **one plain sentence** naming the change in be
47
47
  Before claiming ANY status: **identify** the command that proves it → **run** it fresh and complete → **read** the full output and exit code → only then claim, with the evidence. Tests pass ⇒ a fresh run with 0 failures — never "should pass", never a previous run. Build succeeds ⇒ exit 0. Bug fixed ⇒ the original symptom re-tested. A subagent finished ⇒ you inspected its diff or report file — never its say-so.
48
48
 
49
49
  - Run what dev.md's `tests:` knob requires; a `risky` issue gets focused security, failure, and recovery checks on top. When dev.md has a `## Verify` runbook, run the app and smoke-check the flows it names. Verify is pre-merge only; post-release checks live in `## Ship` and belong to dev-ship.
50
+ - Run the skill-scan guard here, unconditionally: `node <path-to-dev-review>/scripts/skill-scan.mjs --json` — it reads dev.md's `skill-scan:` knob itself and exits 0 saying it skipped when the project authors no skills, so there is no condition to remember. Exit 2 blocks the hand-back: fix the finding, or take it to the operator for a justified baseline rule — never widen a suppression to get past it. Its findings below the blocking bar are the security axis's to triage at review.
50
51
  - UI changed and `ui-evidence: playwright` → capture screenshots of the key states and upload to the shared evidence repo (dev.md `evidence-repo`) under `<this-repo-name>/<issue-number>/<timestamp>-<name>.png` via the contents API, never a clone: `base64 < <file> | tr -d '\n' | gh api -X PUT repos/<evidence-repo>/contents/<path> -f message="evidence #<issue>" -F content=@-` (piped stdin so large screenshots never hit argv limits; timestamped names avoid collisions; a 409 from a concurrent upload just means retry). Link them in the evidence comment — links, never embeds (private-repo images don't render inline). Evidence repo unreachable → name local paths and say so; the hand-back never blocks on it.
51
52
  - dev.md's Ship or Verify section is an empty TODO next to visible machinery → finish normally, then suggest re-running dev-setup.
52
53
 
@@ -25,14 +25,14 @@ Every workflow-generated issue comment opens with an invisible HTML marker follo
25
25
 
26
26
  ## Operator identity
27
27
 
28
- Every human reference in every artifact — approvals, revisions, decisions, changelog attributions, review adjudications — is written `operator (<github-username>)`:
28
+ Every human reference in every artifact — approvals, revisions, decisions, changelog attributions, review adjudications — names the operator by their GitHub username in parentheses, with no title before it — `(<github-username>)`:
29
29
 
30
- - Approval: `Approved by operator (<username>) on DD-MM-YYYY: "<their words>"`
31
- - Register line: `- DD-MM-YYYY operator (<username>) — <decision>`
30
+ - Approval: `Approved by (<username>) on DD-MM-YYYY: "<their words>"`
31
+ - Register line: `- DD-MM-YYYY (<username>) — <decision>`
32
32
 
33
33
  ## Revision markers
34
34
 
35
- Any artifact edited after its first approval: the heading gains `(v2)`, the marker gains `rev=2`, and a `Revisions:` line is appended at the bottom — `v2 — DD-MM-YYYY: <what changed>, per operator (<username>) correction`. Existing revision lines are never rewritten.
35
+ Any artifact edited after its first approval: the heading gains `(v2)`, the marker gains `rev=2`, and a `Revisions:` line is appended at the bottom — `v2 — DD-MM-YYYY: <what changed>, per (<username>) correction`. Existing revision lines are never rewritten.
36
36
 
37
37
  ## Scope classes
38
38
 
@@ -55,7 +55,7 @@ Before posting any brief, run `node <path-to-this-skill>/scripts/brief-lint.mjs
55
55
 
56
56
  - A new issue starts at `needs-operator`, plus its scope label; add `risky` when it touches security, money, user data, or production. (Names come from dev.md's `labels:` knob.)
57
57
  - Approval is only the operator's explicit words, clearly tied to the issue. Labels, silence, or time never create approval.
58
- - Record it as one approval marker comment per conventions — `scope=brief`, or `scope=brief+plan` when the inline plan was posted with it — quoting the operator's words in the operator (username) format. That comment is what preflight verifies.
58
+ - Record it as one approval marker comment per conventions — `scope=brief`, or `scope=brief+plan` when the inline plan was posted with it — quoting the operator's words in the (username) format. That comment is what preflight verifies.
59
59
  - Then flip the state: `research` and `quick-build` → `ready`; `full-plan` → `needs-plan` (dev-plan takes it from there).
60
60
  - An issue with an unresolved Assumptions entry cannot leave `needs-operator` — resolve every entry (confirmed, corrected, or moved to a spike) first; the section is deleted once resolved.
61
61
  - A directional decision this work settles — one passing the Decisions test in dev.md — is proposed as one register line on the operator's yes; `dev-ship` records at merge.
@@ -25,14 +25,14 @@ Every workflow-generated issue comment opens with an invisible HTML marker follo
25
25
 
26
26
  ## Operator identity
27
27
 
28
- Every human reference in every artifact — approvals, revisions, decisions, changelog attributions, review adjudications — is written `operator (<github-username>)`:
28
+ Every human reference in every artifact — approvals, revisions, decisions, changelog attributions, review adjudications — names the operator by their GitHub username in parentheses, with no title before it — `(<github-username>)`:
29
29
 
30
- - Approval: `Approved by operator (<username>) on DD-MM-YYYY: "<their words>"`
31
- - Register line: `- DD-MM-YYYY operator (<username>) — <decision>`
30
+ - Approval: `Approved by (<username>) on DD-MM-YYYY: "<their words>"`
31
+ - Register line: `- DD-MM-YYYY (<username>) — <decision>`
32
32
 
33
33
  ## Revision markers
34
34
 
35
- Any artifact edited after its first approval: the heading gains `(v2)`, the marker gains `rev=2`, and a `Revisions:` line is appended at the bottom — `v2 — DD-MM-YYYY: <what changed>, per operator (<username>) correction`. Existing revision lines are never rewritten.
35
+ Any artifact edited after its first approval: the heading gains `(v2)`, the marker gains `rev=2`, and a `Revisions:` line is appended at the bottom — `v2 — DD-MM-YYYY: <what changed>, per (<username>) correction`. Existing revision lines are never rewritten.
36
36
 
37
37
  ## Scope classes
38
38
 
@@ -25,14 +25,14 @@ Every workflow-generated issue comment opens with an invisible HTML marker follo
25
25
 
26
26
  ## Operator identity
27
27
 
28
- Every human reference in every artifact — approvals, revisions, decisions, changelog attributions, review adjudications — is written `operator (<github-username>)`:
28
+ Every human reference in every artifact — approvals, revisions, decisions, changelog attributions, review adjudications — names the operator by their GitHub username in parentheses, with no title before it — `(<github-username>)`:
29
29
 
30
- - Approval: `Approved by operator (<username>) on DD-MM-YYYY: "<their words>"`
31
- - Register line: `- DD-MM-YYYY operator (<username>) — <decision>`
30
+ - Approval: `Approved by (<username>) on DD-MM-YYYY: "<their words>"`
31
+ - Register line: `- DD-MM-YYYY (<username>) — <decision>`
32
32
 
33
33
  ## Revision markers
34
34
 
35
- Any artifact edited after its first approval: the heading gains `(v2)`, the marker gains `rev=2`, and a `Revisions:` line is appended at the bottom — `v2 — DD-MM-YYYY: <what changed>, per operator (<username>) correction`. Existing revision lines are never rewritten.
35
+ Any artifact edited after its first approval: the heading gains `(v2)`, the marker gains `rev=2`, and a `Revisions:` line is appended at the bottom — `v2 — DD-MM-YYYY: <what changed>, per (<username>) correction`. Existing revision lines are never rewritten.
36
36
 
37
37
  ## Scope classes
38
38
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: dev-review
3
- description: Independent review of finished implementation work — a diff against its brief and plan. Use when dev-implement's review step runs, when asked to "review this branch/diff/issue", "give this a second pair of eyes", "check the finished work on issue N", when a cross-agent session (Claude or Codex) is handed a REVIEW REQUEST, or when review findings need a fix loop, re-review, or adjudication. Not for reviewing an unbuilt plan (dev-plan's approval gate), architecture review (dev-architect), shipping gates (dev-ship), or generic PR review in repos outside this workflow.
3
+ description: Independent review of finished implementation work — a diff against its brief and plan — and the skill-scan vulnerability guard. Use when dev-implement's review step runs, when asked to "review this branch/diff/issue", "give this a second pair of eyes", "check the finished work on issue N", when a cross-agent session (Claude or Codex) is handed a REVIEW REQUEST, when review findings need a fix loop, re-review, or adjudication, or when asked to scan skills for vulnerabilities, triage scanner findings, or judge whether a third-party skill is safe to install. Not for reviewing an unbuilt plan (dev-plan's approval gate), architecture review (dev-architect), shipping gates (dev-ship), or generic PR review in repos outside this workflow.
4
4
  ---
5
5
 
6
6
  # dev-review
@@ -13,13 +13,15 @@ Nearest neighbors: `dev-implement` invokes this per dev.md's `review:` knob and
13
13
 
14
14
  Build the review package first: `git log --oneline <base>..<head>` + `git diff --stat` + `git diff -U10`, written to `.vegastack/.tmp/<issue>-<slug>/review-<base7>..<head7>.diff`. Reviewers get paths — the brief (issue body), the plan comment, the package file, the project's `.vegastack/review-known-patterns.md` — plus the binding constraints copied verbatim. Reviewers write their full reports to `.tmp` files and return short status; a dead reviewer's findings survive on disk.
15
15
 
16
+ When dev.md names a `skill-scan:` root, the security dispatch also gets the scan report: `node <path-to-this-skill>/scripts/skill-scan.mjs --json > .vegastack/.tmp/<issue>-<slug>/skill-scan.json` (add `--llm` for the semantic pass — advisory only, never a gate; it is non-deterministic and a degraded run inflates scores). The same guard runs at `dev-implement`'s Verify gate, so by review time it has already passed; the axis is here to triage what sits below the blocking bar and to judge whether anything above it was suppressed rather than fixed.
17
+
16
18
  ## The axes — parallel, fresh, never merged
17
19
 
18
20
  | Axis | Runs | Judges |
19
21
  |---|---|---|
20
22
  | **Spec** | always | the diff vs the CURRENT brief + plan: missing, scope creep, implemented-but-wrong — quoting the brief line per finding; includes the tests-are-real rubric |
21
23
  | **Standards** | always | project rules (known-patterns file + repo docs, which override) + the fixed smell baseline pasted in full into its prompt |
22
- | **Security** | on `risky`, or when touch points hit auth, money, user data, or external input | data-flow traces, exploitability before severity — method in [security-axis](references/security-axis.md) |
24
+ | **Security** | on `risky`, when touch points hit auth, money, user data, or external input, **or when the diff touches a skill under dev.md's `skill-scan:` root** | data-flow traces, exploitability before severity, and triage of the skill scan's findings — method in [security-axis](references/security-axis.md) |
23
25
 
24
26
  Each axis is a fresh subagent with no memory of writing the code (its prompt: [dispatch-prompts](references/dispatch-prompts.md)). Axes report separately and are never re-ranked into one list — a change can pass one axis and fail another, and merging lets one mask the other.
25
27
 
@@ -59,6 +61,11 @@ Severities: `[CRITICAL]` (security axis: exploitable now — blocks) > `[MUST-FI
59
61
 
60
62
  - Default quiet profile: spec, bugs, and security always; style only where a documented rule exists. The comment count is the noise metric.
61
63
  - `.vegastack/review-known-patterns.md` (seed: [template](assets/review-known-patterns.md.template)) holds the project's never-flag patterns — each entry REQUIRES a **"Still flag if:"** exception clause; a suppression without one is a blind spot. Operator dismissals of findings get appended there by dev-implement's corrections loop, so a dismissed pattern stays dismissed.
64
+ - The skill scan's suppressions follow the same discipline in its own baseline file, and the guard enforces the clause rather than trusting it — a rule scoped `id:` with no `path:` is a repo-wide blind spot. A finding suppressed rather than fixed is a review finding, not a settled matter.
65
+
66
+ ## A scan with no issue attached
67
+
68
+ A scan run outside an issue — a standalone check, or the pre-publish guard in dev.md's `## Ship` — has no review comment to land in, and never gets attached to an unrelated issue. Findings there route to `dev-intake`: offer the operator one `risky` issue whose **brief body** carries the findings, their locations, and what is already known about each cause. That is intake's job, with its questions, its scope call, and its approval — not a comment posted somewhere convenient.
62
69
 
63
70
  ## Cross-agent — the independence upgrade
64
71
 
@@ -10,7 +10,7 @@ Format, one entry per pattern:
10
10
  - **Pattern:** <what the reviewer keeps flagging, concretely — code shape, file area>
11
11
  - **Why it's safe here:** <the project fact that makes it a false positive>
12
12
  - **Still flag if:** <the exception that makes it a real finding after all>
13
- - **Origin:** <date + issue where the dismissal happened — operator (<username>)>
13
+ - **Origin:** <date + issue where the dismissal happened — (<username>)>
14
14
  ```
15
15
 
16
16
  The four fields are LIST ITEMS — this file is read in a repo's file view, where single newlines soft-wrap into one paragraph; bullets are what guarantee a line per field. Appended entries (dev-implement's corrections loop) keep the same shape.
@@ -25,14 +25,14 @@ Every workflow-generated issue comment opens with an invisible HTML marker follo
25
25
 
26
26
  ## Operator identity
27
27
 
28
- Every human reference in every artifact — approvals, revisions, decisions, changelog attributions, review adjudications — is written `operator (<github-username>)`:
28
+ Every human reference in every artifact — approvals, revisions, decisions, changelog attributions, review adjudications — names the operator by their GitHub username in parentheses, with no title before it — `(<github-username>)`:
29
29
 
30
- - Approval: `Approved by operator (<username>) on DD-MM-YYYY: "<their words>"`
31
- - Register line: `- DD-MM-YYYY operator (<username>) — <decision>`
30
+ - Approval: `Approved by (<username>) on DD-MM-YYYY: "<their words>"`
31
+ - Register line: `- DD-MM-YYYY (<username>) — <decision>`
32
32
 
33
33
  ## Revision markers
34
34
 
35
- Any artifact edited after its first approval: the heading gains `(v2)`, the marker gains `rev=2`, and a `Revisions:` line is appended at the bottom — `v2 — DD-MM-YYYY: <what changed>, per operator (<username>) correction`. Existing revision lines are never rewritten.
35
+ Any artifact edited after its first approval: the heading gains `(v2)`, the marker gains `rev=2`, and a `Revisions:` line is appended at the bottom — `v2 — DD-MM-YYYY: <what changed>, per (<username>) correction`. Existing revision lines are never rewritten.
36
36
 
37
37
  ## Scope classes
38
38
 
@@ -88,6 +88,18 @@ violations of documented standards may be [MUST-FIX]; baseline smells are
88
88
 
89
89
  Compose the security dispatch from [security-axis](security-axis.md): the shared preamble above, then that file's Method steps, finding format (the three extra lines), severity definitions, and standing red lines, quoted into the prompt — the reviewer must receive them in full, not a pointer it cannot follow.
90
90
 
91
+ Where a scanner report exists, add its path and that file's "Scanner evidence" rules to the same dispatch:
92
+
93
+ ```
94
+ Scanner report: <path to skill-scan.json or the project's equivalent>.
95
+ Treat every entry as a CANDIDATE finding, never a verdict: read the source at
96
+ its file:line, trace the flow, and assign severity yourself by exploitability.
97
+ The report's aggregate score is context, not a ranking. Entries the baseline
98
+ suppressed are in scope — judge whether each rule is scoped as narrowly as its
99
+ cause and whether its stated re-trigger condition would actually fire. Say so
100
+ in your verdict line if the report says the scan did not complete.
101
+ ```
102
+
91
103
  ## Re-review brief (scoped, every fix round)
92
104
 
93
105
  ```
@@ -1,6 +1,18 @@
1
1
  # The security axis
2
2
 
3
- Runs on `risky` issues, and whenever the diff's touch points hit an auth surface, money, user data, or externally-controlled input — the trigger is the surface, not the label alone.
3
+ Runs on `risky` issues, whenever the diff's touch points hit an auth surface, money, user data, or externally-controlled input, and whenever the diff touches a skill under dev.md's `skill-scan:` root — the trigger is the surface, not the label alone.
4
+
5
+ ## Scanner evidence — a finding's start, never its end
6
+
7
+ Where the project runs a scanner (this family ships `scripts/skill-scan.mjs` for agent skills; a project may name others), its report is an **input to this axis**, on the same footing as the diff. It is evidence, not a verdict:
8
+
9
+ - **A scanner hit is a candidate finding.** It arrives with a rule ID and a `file:line` and nothing else — no data flow, no attacker, no exploitability. Promote it to a finding only after the Method below fills those in; a hit you cannot trace goes to the collapsed low-confidence block like any other hunch.
10
+ - **Read the source at the location before judging it.** The scanner matched text; whether that text is a vulnerability is your call, made against the file, not the summary.
11
+ - **Severity is yours, not the scanner's.** Map its finding onto this file's ladder by exploitability. A scanner HIGH that cannot be exploited is not `[CRITICAL]`; a scanner MEDIUM with a traced path to a real sink can be.
12
+ - **Never downgrade an unexplained HIGH or CRITICAL** on reputation, score, or "it's our own code". Either the trace shows why it does not hold, or it stands.
13
+ - **The aggregate risk score is not a finding.** It is distorted upward by documentation of the very mechanics being scanned and downward by unrelated suppressions. Quote it for context; never rank on it.
14
+ - **Suppressions are in scope for this axis.** A finding silenced by a baseline rule rather than fixed is reviewable: check the rule is scoped as narrowly as its cause and that its stated re-trigger condition is one that would actually fire.
15
+ - **A degraded or partial scan is not a clean scan.** If the report says the run did not complete, say so in the verdict line rather than reporting its numbers.
4
16
 
5
17
  ## Method — evidence before severity
6
18