@vegastack/skills 0.11.1 → 0.12.0

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/README.md CHANGED
@@ -13,10 +13,10 @@ npx @vegastack/skills add dev-architect
13
13
  |---|---|
14
14
  | `skill-maintainer` | Encodes the Agent Skills standards (Claude Code, Codex, Hermes, agentskills.io) for creating, updating, and releasing skills in a skills repo |
15
15
  | `skillify` | Turns a feature or workflow into a complete skill conforming to the VegaStack skills contract, or audits an existing one |
16
- | `dev-architect` | Architecture advisor: the locked stack, recorded rejections, and lean-first principles as evidence-distilled decision tables, dated source-verified platform facts behind a verify-before-you-recommend protocol, reading the `## Architecture` section of `.vegastack/dev.md` |
17
16
  | `dev-setup` | Bootstraps any project, greenfield included, for the issue-driven dev workflow: stack-playbook-drafted profile, AGENTS.md section, labels, guards, decision register |
18
17
  | `dev-intake` | Turns ideas, brainstorms, and SOWs into agent-ready GitHub issues with recorded user approval |
19
18
  | `dev-plan` | Plans an approved issue before any code exists: fresh-grounded questionnaire, strict plan format with Interfaces blocks, the scope ratchet, quick-build inline mode |
19
+ | `dev-architect` | Architecture advisor: the locked stack, recorded rejections, and dated platform facts behind a verify-before-you-recommend protocol |
20
20
  | `dev-implement` | Implements an approved issue end to end, dark: preflight, claim, build, test, review, evidence in the issue |
21
21
  | `dev-debug` | Reproduce-first bug diagnosis: red command, ranked suspects, regression-test-before-fix |
22
22
  | `dev-review` | Independent multi-axis review of finished work: spec/standards/security axes, bounded fix loop, cross-agent Codex mode |
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vegastack/skills",
3
- "version": "0.11.1",
3
+ "version": "0.12.0",
4
4
  "description": "Installer and verifier for VegaStack Agent Skills (Claude Code, Codex, and Hermes)",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -6,7 +6,8 @@ verify-before-you-recommend protocol, and the ONLY file in this skill that goes
6
6
  itself — the weekly refresh (see refresh/REFRESH.md) re-verifies it. When a recommendation
7
7
  leans on a fact older than 60 days, re-verify that one fact against its source first.
8
8
 
9
- All facts below verified 2026-08-12.
9
+ Facts carry their own verification dates — sections verified 2026-08-12 unless a
10
+ bullet says otherwise; Better Auth and EVE re-verified 2026-08-29.
10
11
 
11
12
  ## Cloudflare
12
13
 
@@ -58,27 +59,42 @@ All facts below verified 2026-08-12.
58
59
  events/day, 3-day retention; automatic tracing starts billing 2026-10-01; OTLP export
59
60
  needs Workers Paid. [developers.cloudflare.com/workers/platform/limits]
60
61
 
61
- ## Better Auth (1.6.27, 2026-08-11)
62
-
63
- - **1.7.0 is in RC** (rc.5 shipped 2026-08-11, same day as the pinned patch). Stay on
64
- 1.6.x until 1.7 is stable; queued breaking changes include the MCP plugin restructure
65
- (moves to `@better-auth/mcp`) and SAML IdP-initiated default-off. [github.com/better-auth]
62
+ ## Better Auth (1.7.2, 2026-08-29)
63
+
64
+ - **1.7 is stable** — 1.7.0 shipped 2026-08-18, current 1.7.2 (2026-08-26, npm latest).
65
+ The former 1.6.x hold is retired; adopt 1.7.x via the official migration steps. Notable
66
+ 1.7.0 breaks beyond the bullets below: accounts rekeyed on `(issuer, accountId)` with a
67
+ migration backfill; `validAudiences` → `resources` + `oauthClientResource`;
68
+ `experimental.joins` → `advanced.database.joins`; generic OAuth rewritten on OAuth 2.1
69
+ defaults. [github.com/better-auth releases, verified 2026-08-29]
70
+ - **The MCP plugin lives in `@better-auth/mcp` since 1.7.0** — requires
71
+ `@better-auth/cimd` and the `jwt()` plugin; `withMcpAuth` → `requireMcpAuth`,
72
+ `mcpHandler` → `createMcpProtectedRequestHandler`; options are flat, no `oidcConfig`
73
+ nesting. [releases/tag/v1.7.0]
74
+ - **SAML IdP-initiated sign-in is default-off since 1.7.0** (`saml.allowIdpInitiated`
75
+ defaults to false); opt back in explicitly only where the IdP flow is required.
76
+ [releases/tag/v1.7.0, verified 2026-08-29]
66
77
  - **The organizations plugin models teams, invitations, and custom RBAC end-to-end**
67
- (`teams: { enabled: true }`, `invite-member` with `teamId`, `createAccessControl`).
68
- [better-auth.com/docs]
69
- - **Better Auth ships an apiKey plugin** (docs/plugins/api-key verified live
70
- 2026-08-12; an older internal note claiming otherwise was wrong). Default to the plugin
71
- for new projects; the flagship platform's native implementation is a recorded project
72
- decision, not the house default. The `bearer` plugin covers token session transport
73
- (the mobile/Flutter mechanism).
78
+ (`teams: { enabled: true }`, `inviteMember` with `teamId`, `createAccessControl`)
79
+ unchanged in 1.7 (SCIM was decoupled from it; irrelevant unless SCIM is used).
80
+ [better-auth.com/docs, verified 2026-08-29]
81
+ - **The apiKey plugin is the standalone `@better-auth/api-key` package** (lockstep
82
+ 1.7.2) import from `@better-auth/api-key`, not `better-auth/plugins` (core's exports
83
+ no longer carry it). Default to the plugin for new projects; the flagship platform's
84
+ native implementation is a recorded project decision, not the house default. The
85
+ `bearer` plugin stays in core and covers token session transport (the mobile/Flutter
86
+ mechanism). [better-auth.com/docs/plugins/api-key, verified 2026-08-29]
74
87
  - **`twoFactor` supports `allowPasswordless: true`** for users without password accounts
75
- (passkey/OAuth/magic-link signups).
88
+ (passkey/OAuth/magic-link signups). Since 1.7.0, `enableTwoFactor` takes and returns a
89
+ discriminated `method: "otp" | "totp"` (default totp) — pass `method: "otp"` for OTP
90
+ enrollment.
76
91
 
77
92
  ## Agents & jobs
78
93
 
79
- - **EVE (`eve` on npm, github.com/vercel/eve) is Vercel's durable-agent framework —
80
- v0.33.2, still beta/pre-GA, shipping near-daily.** Filesystem-first agents; every
81
- session a durable, resumable workflow. [vercel.com/docs/eve]
94
+ - **EVE (`eve` on npm, github.com/vercel/eve) is Vercel's durable-agent framework — v0.47.3
95
+ (2026-08-28), still beta/pre-GA, shipping multiple releases per day; pin behavior, not
96
+ minor versions.** Filesystem-first agents; every session a durable, resumable
97
+ workflow. [vercel.com/docs/eve]
82
98
  - **Self-hosted EVE durability (`@workflow/world-postgres`, stable 4.3.x) explicitly
83
99
  requires a long-lived worker process — "not compatible with serverless platforms".**
84
100
  The 5.0.0-beta channel exists; don't pin it without a documented reason. Internally it
@@ -34,7 +34,7 @@
34
34
  "references/data.md"
35
35
  ],
36
36
  "checksum": "fda2870b95deffce48dca7f3df3707325b1bc4a2d58a17708ee9220bfba5eba1",
37
- "retrievedAt": "2026-08-12T14:33:11.062Z"
37
+ "retrievedAt": "2026-08-29T05:56:59.737Z"
38
38
  },
39
39
  {
40
40
  "id": "CF-R2-PRICING",
@@ -57,7 +57,7 @@
57
57
  "references/stack.md"
58
58
  ],
59
59
  "checksum": "bd5e8d26f7bbf2f92182ad4ac1a59ae9b1d90695120062adaf54c281bd88e81f",
60
- "retrievedAt": "2026-08-12T14:33:11.062Z"
60
+ "retrievedAt": "2026-08-29T05:56:59.737Z"
61
61
  },
62
62
  {
63
63
  "id": "CF-WORKFLOWS-PRICING",
@@ -80,7 +80,7 @@
80
80
  "references/ai-agents.md"
81
81
  ],
82
82
  "checksum": "64e10ca4ced4edc042d12a9a24f2e165ea71cb9481c30ac5f067f2f6c9218cda",
83
- "retrievedAt": "2026-08-12T14:33:11.062Z"
83
+ "retrievedAt": "2026-08-29T05:56:59.737Z"
84
84
  },
85
85
  {
86
86
  "id": "BETTER-AUTH-DOCS",
@@ -103,10 +103,10 @@
103
103
  "references/pinned-facts.md",
104
104
  "references/security.md"
105
105
  ],
106
- "currentVersion": "1.6.27",
107
- "versionCheckedAt": "2026-08-12T14:33:11.062Z",
108
- "checksum": "30edf1b6658a473a00005153a3eafc07de5c3decd6b8f09fc6c32f3a21c4db1c",
109
- "retrievedAt": "2026-08-12T14:33:11.062Z"
106
+ "currentVersion": "1.7.2",
107
+ "versionCheckedAt": "2026-08-29T05:56:59.737Z",
108
+ "checksum": "905fef0ef5b216abae2fcb14c7c7ea9b74c4788acc7fd65e8ad72600b13d670f",
109
+ "retrievedAt": "2026-08-29T05:56:59.737Z"
110
110
  },
111
111
  {
112
112
  "id": "EVE-DOCS",
@@ -129,10 +129,10 @@
129
129
  "references/pinned-facts.md",
130
130
  "references/ai-agents.md"
131
131
  ],
132
- "currentVersion": "0.33.2",
133
- "versionCheckedAt": "2026-08-12T14:33:11.062Z",
134
- "checksum": "a777f9da0cb3966a9c7cc06a3c12be34b2928800b370e966e8b6e0f5a5622915",
135
- "retrievedAt": "2026-08-12T14:33:11.062Z"
132
+ "currentVersion": "0.47.3",
133
+ "versionCheckedAt": "2026-08-29T05:56:59.737Z",
134
+ "checksum": "84a499a2bc49274d6736703b0d82b774822c7d5e9d69954a73262eff4af72614",
135
+ "retrievedAt": "2026-08-29T05:56:59.737Z"
136
136
  },
137
137
  {
138
138
  "id": "WORKFLOW-SDK-POSTGRES",
@@ -155,10 +155,10 @@
155
155
  "references/pinned-facts.md",
156
156
  "references/ai-agents.md"
157
157
  ],
158
- "currentVersion": "4.3.3",
159
- "versionCheckedAt": "2026-08-12T14:33:11.062Z",
160
- "checksum": "3eca56b5ec9668638d4e00b290c157383dfe8ceaaa334de13bb6244b32fa6839",
161
- "retrievedAt": "2026-08-12T14:33:11.062Z"
158
+ "currentVersion": "4.3.5",
159
+ "versionCheckedAt": "2026-08-29T05:56:59.737Z",
160
+ "checksum": "d99e33159e2259f8f71d22f2bd19ffbc284ff55e1d8e9916d4930725fb55461a",
161
+ "retrievedAt": "2026-08-29T05:56:59.737Z"
162
162
  },
163
163
  {
164
164
  "id": "NEXTJS-BLOG",
@@ -181,10 +181,10 @@
181
181
  "references/pinned-facts.md",
182
182
  "references/web.md"
183
183
  ],
184
- "currentVersion": "16.3.0",
185
- "versionCheckedAt": "2026-08-12T14:33:11.062Z",
186
- "checksum": "9d5d2503e2e8aa7ed1c3f0cb972c78e64b2e3aae5f3ad264bb0a79bd179708f0",
187
- "retrievedAt": "2026-08-12T14:33:11.062Z"
184
+ "currentVersion": "16.3.3",
185
+ "versionCheckedAt": "2026-08-29T05:56:59.737Z",
186
+ "checksum": "5485cefce17dd80d1062364c597dbef4ebe39b7a59e869458b53d618c4f6f57d",
187
+ "retrievedAt": "2026-08-29T05:56:59.737Z"
188
188
  },
189
189
  {
190
190
  "id": "PG-BOSS-NPM",
@@ -206,11 +206,11 @@
206
206
  "affected": [
207
207
  "references/pinned-facts.md"
208
208
  ],
209
- "currentVersion": "12.27.0",
210
- "versionCheckedAt": "2026-08-12T14:33:11.062Z",
209
+ "currentVersion": "12.28.1",
210
+ "versionCheckedAt": "2026-08-29T05:56:59.737Z",
211
211
  "checksumScope": "http-body",
212
- "checksum": "abf4bc2795e2df03181a21dfd29c7b9234c933a9dcafa72b4583d590cad609da",
213
- "retrievedAt": "2026-08-12T14:33:41.513Z"
212
+ "checksum": "6d1863268232526ae87582d9cba6f7ba148d91888409456a033c1f6b7e2f00f4",
213
+ "retrievedAt": "2026-08-29T05:56:59.737Z"
214
214
  },
215
215
  {
216
216
  "id": "FLUTTER-RELEASES",
@@ -232,8 +232,8 @@
232
232
  "references/pinned-facts.md",
233
233
  "references/mobile.md"
234
234
  ],
235
- "checksum": "94f9df6f67615ee05d826995f9709309c5453d0d8e4be11232ca5d463929ed2b",
236
- "retrievedAt": "2026-08-12T14:33:11.062Z"
235
+ "checksum": "833a60e3142d8944af96eb33a6266fb27cdbfedb3f72db9765098f81bdabfa9d",
236
+ "retrievedAt": "2026-08-29T05:56:59.737Z"
237
237
  }
238
238
  ]
239
239
  }
@@ -12,17 +12,19 @@ Nearest neighbors: `dev-implement` writes the entries at hand-back (the write ru
12
12
  ## The entry — one per behavior-changing branch
13
13
 
14
14
  ```markdown
15
- ## DD-MM-YYYY — <title: the change as a human outcome — not a mechanism, not a commit subject> (#<issue>)
15
+ ## DD-MM-YYYY — <title: the change as a human outcome — not a mechanism, not a commit subject> ([#<issue>](<issue url>))
16
+
17
+ - **What:** <2–4 plain sentences: what exists now that didn't, from the operator's point of view>
18
+ - **Why:** <the need that prompted it>
19
+ - **How it went:** <the honest one-liner: smooth / what fought back / what was cut>
20
+ - **Changed:** <the user-visible changes, simple words — sub-bullets or one ·-separated line>
21
+ - **Decisions:** <register lines it produced, or "none">
16
22
 
17
- **What:** <2–4 plain sentences: what exists now that didn't, from the operator's point of view>
18
- **Why:** <the need that prompted it>
19
- **How it went:** <the honest one-liner: smooth / what fought back / what was cut>
20
- **Changed:** <the user-visible changes, simple words — bullets or one ·-separated line>
21
- **Decisions:** <register lines it produced, or "none">
22
23
  — approved by operator (<username>) · built by <agent> · branch <name>
23
24
  ```
24
25
 
25
- - Titles name the outcome ("Invoice reminders now chase late payers"), never the mechanism ("add reminderAt column").
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.
27
+ - The fields are LIST ITEMS and the footer sits after a blank line — single newlines soft-wrap into one paragraph in rendered markdown; bullets are what guarantee a line per field.
26
28
  - Prepend — newest first. File missing → create it with a two-line header naming this skill as the format home.
27
29
  - **How it went** is where honesty lives: what fought back, what was cut, what surprised. "Smooth" is a fine answer; silence is not.
28
30
  - Research issues get an entry only when the findings changed direction; docs/test-only merges get none (ship-gate's excuse flag covers both records at once).
@@ -40,6 +40,8 @@ Honesty over green: a failing test gets fixed at the root or reported as failing
40
40
 
41
41
  Every behavior-changing branch carries its changelog entry per dev.md's `changelog:` knob (`changesets` → write `.changeset/<slug>.md` directly, never the interactive CLI; `keep-a-changelog` / `pubspec+changelog` → one bullet under `## [Unreleased]`, creating CHANGELOG.md with the `# Changelog` + `## [Unreleased]` skeleton in the same branch when absent; `none` → skip) **and**, when dev.md says `chronicle: on`, its story entry prepended to `.vegastack/chronicle.md` (format: the `dev-chronicle` skill) — both on the branch, landing atomically with the merge. Docs the brief names as affected get updated in the same branch.
42
42
 
43
+ A changeset entry's first line is **one plain sentence** naming the change in behavior terms; detail follows after a blank line as sub-bullets, one line each. The published changelog and the release notes that lead with it reproduce the entry verbatim, so a single 1,000-character sentence ships as a wall of text.
44
+
43
45
  ## Verify — the gate function
44
46
 
45
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.
@@ -68,7 +70,7 @@ Run the `dev-review` skill per dev.md's `review:` knob — fresh subagent axes b
68
70
  Branch: <name> @ <sha7>
69
71
  ```
70
72
 
71
- The `**Review:**` line is the one home of surfaced rulings: every ledger `Ruling:` appears there, in the order made. Run `node <path-to-this-skill>/scripts/evidence-check.mjs --file <draft> --json` before posting — exit 2 means the shape is incomplete; fix, don't post. Post it, swap `working` → `for-operator`, stop, and close with the plain-language summary (which repeats, never replaces, the evidence content): what was built, which paths were taken, the rulings, what's worth the operator double-checking.
73
+ The tail's sha stays bare: GitHub auto-links a 7-character sha mid-comment as soon as the commit is on the remote, so the tail becomes a live commit link the moment the branch is pushed — while an explicit `/commit/<sha>` link written at hand-back points at a commit that has not been pushed yet, and 404s. The `**Review:**` line is the one home of surfaced rulings: every ledger `Ruling:` appears there, in the order made. Run `node <path-to-this-skill>/scripts/evidence-check.mjs --file <draft> --json` before posting — exit 2 means the shape is incomplete; fix, don't post. Post it, swap `working` → `for-operator`, stop, and close with the plain-language summary (which repeats, never replaces, the evidence content): what was built, which paths were taken, the rulings, what's worth the operator double-checking.
72
74
 
73
75
  ## Corrections loop — code and docs move together
74
76
 
@@ -7,24 +7,26 @@ Format, one entry per pattern:
7
7
  ```markdown
8
8
  ## <short pattern name>
9
9
 
10
- **Pattern:** <what the reviewer keeps flagging, concretely — code shape, file area>
11
- **Why it's safe here:** <the project fact that makes it a false positive>
12
- **Still flag if:** <the exception that makes it a real finding after all>
13
- **Origin:** <date + issue where the dismissal happened — operator (<username>)>
10
+ - **Pattern:** <what the reviewer keeps flagging, concretely — code shape, file area>
11
+ - **Why it's safe here:** <the project fact that makes it a false positive>
12
+ - **Still flag if:** <the exception that makes it a real finding after all>
13
+ - **Origin:** <date + issue where the dismissal happened — operator (<username>)>
14
14
  ```
15
15
 
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.
17
+
16
18
  ## Worked examples (replace with real entries)
17
19
 
18
20
  ### Sequential awaits in setup scripts
19
21
 
20
- **Pattern:** consecutive `await` calls in bootstrap/setup code flagged as a parallelization miss.
21
- **Why it's safe here:** setup steps have ordering dependencies the reviewer can't see locally (labels before issues, scaffold before wiring).
22
- **Still flag if:** the awaits are inside a hot request path or a loop over user data.
23
- **Origin:** seeded example — delete when the first real entry lands.
22
+ - **Pattern:** consecutive `await` calls in bootstrap/setup code flagged as a parallelization miss.
23
+ - **Why it's safe here:** setup steps have ordering dependencies the reviewer can't see locally (labels before issues, scaffold before wiring).
24
+ - **Still flag if:** the awaits are inside a hot request path or a loop over user data.
25
+ - **Origin:** seeded example — delete when the first real entry lands.
24
26
 
25
27
  ### Direct `gh` CLI calls without a wrapper
26
28
 
27
- **Pattern:** scripts shelling to `gh` flagged as needing an API client abstraction.
28
- **Why it's safe here:** the workflow standardizes on `gh` for auth and pagination; a wrapper would duplicate it.
29
- **Still flag if:** arguments are interpolated into a shell string instead of an execFile arg array.
30
- **Origin:** seeded example — delete when the first real entry lands.
29
+ - **Pattern:** scripts shelling to `gh` flagged as needing an API client abstraction.
30
+ - **Why it's safe here:** the workflow standardizes on `gh` for auth and pagination; a wrapper would duplicate it.
31
+ - **Still flag if:** arguments are interpolated into a shell string instead of an execFile arg array.
32
+ - **Origin:** seeded example — delete when the first real entry lands.
@@ -12,7 +12,7 @@ Each playbook fills the same six slots: **detect** (file signals) · **ship draf
12
12
  - `ask: tag v<version> and push — the tag triggers the publish pipeline`
13
13
  - `guard: tag matches the package version` · `guard: changelog has an entry for the tagged version`
14
14
  - `auto: confirm the registry shows the new version; report old → new`
15
- - **Changelog:** `changesets`. Per behavior-changing branch, dev-implement writes `.changeset/<slug>.md` **directly** — frontmatter `"<package-name>": <patch|minor|major>` (from the brief's version-impact line) plus a one-paragraph summary. `changeset add` (the bare `changeset` prompt) is interactive; never invoke it in a dark run — `changeset version` at release time is the only CLI use. The release changelog is changesets-written — never hand-edited.
15
+ - **Changelog:** `changesets`. Per behavior-changing branch, dev-implement writes `.changeset/<slug>.md` **directly** — frontmatter `"<package-name>": <patch|minor|major>` (from the brief's version-impact line) plus the entry itself, shaped per dev-implement's changelog rule. `changeset add` (the bare `changeset` prompt) is interactive; never invoke it in a dark run — `changeset version` at release time is the only CLI use. The release changelog is changesets-written — never hand-edited.
16
16
  - **Version identity:** `package.json` `version`, changesets-managed. Monorepos: identity is per-package; changesets handles multiple packages natively — the guard reads the released package's manifest. A private workspace root carries no *real* version — pin it at `0.0.0` (some tooling, e.g. `npm sbom` purl generation, requires every package to have one) and never bump it; deleting the field outright breaks such tooling.
17
17
  - **Guards:** changeset-presence (PR-time) · tag↔version · changelog-entry.
18
18
  - **Rollback:** `Rollback is roll-forward: revert on main, release previous-good as a new patch, deprecate the bad version on the registry.`
@@ -34,7 +34,7 @@
34
34
  "SKILL.md"
35
35
  ],
36
36
  "checksum": "e989818335ae45abb756df759d4859aa9daa6764393a3e39c46e505f181a33b6",
37
- "retrievedAt": "2026-08-27T08:19:24.132Z"
37
+ "retrievedAt": "2026-08-29T05:57:02.492Z"
38
38
  },
39
39
  {
40
40
  "id": "CC-SKILLS",
@@ -55,8 +55,8 @@
55
55
  "affected": [
56
56
  "references/harness-facts.md"
57
57
  ],
58
- "checksum": "8d03177dcc10ffbff5313c43023da15ff1059197c1fff05eb9dba3fe6361c767",
59
- "retrievedAt": "2026-08-27T08:19:24.132Z"
58
+ "checksum": "88007b9a77d7a0881f2367604ab02b8e80abe475f33cfd4e4cf87913c5786ad3",
59
+ "retrievedAt": "2026-08-29T05:57:02.492Z"
60
60
  },
61
61
  {
62
62
  "id": "CC-TOOLS",
@@ -78,8 +78,8 @@
78
78
  "references/harness-facts.md",
79
79
  "SKILL.md"
80
80
  ],
81
- "checksum": "3bdd8429e76be8213e9263103134ac7b6892f4574820e40bf84032a98c5d0aeb",
82
- "retrievedAt": "2026-08-27T08:19:24.132Z"
81
+ "checksum": "21937941459c5909a41ff7d1bac3b7f7bf8d17c6ea3858e6d44a0a90d46a59e5",
82
+ "retrievedAt": "2026-08-29T05:57:02.492Z"
83
83
  },
84
84
  {
85
85
  "id": "CODEX-AGENTS",
@@ -101,7 +101,7 @@
101
101
  "references/harness-facts.md"
102
102
  ],
103
103
  "checksum": "9eacb3d812b87be4acc1213af58ded35e8f387bcf1589c203bbb452ead0c4774",
104
- "retrievedAt": "2026-08-27T08:19:24.132Z"
104
+ "retrievedAt": "2026-08-29T05:57:02.492Z"
105
105
  },
106
106
  {
107
107
  "id": "CODEX-SKILLS",
@@ -124,7 +124,7 @@
124
124
  "SKILL.md"
125
125
  ],
126
126
  "checksum": "44aa6d490f4567c0b1fb064deab642bfac590f0e721228e0c53fe738db191026",
127
- "retrievedAt": "2026-08-27T08:19:24.132Z"
127
+ "retrievedAt": "2026-08-29T05:57:02.492Z"
128
128
  },
129
129
  {
130
130
  "id": "CC-HOOKS",
@@ -146,8 +146,8 @@
146
146
  "references/harness-facts.md",
147
147
  "SKILL.md"
148
148
  ],
149
- "checksum": "936bd443066df08a514972673358e102fd23b80bee9a289d3d53a1ed8aca1a64",
150
- "retrievedAt": "2026-08-27T14:41:39.189Z"
149
+ "checksum": "1a156c294dc35c1f5291e84766e0bd5de3f29d63916a1cdc648ff05f9f20d55a",
150
+ "retrievedAt": "2026-08-29T05:57:02.492Z"
151
151
  },
152
152
  {
153
153
  "id": "CODEX-HOOKS",
@@ -170,7 +170,7 @@
170
170
  "SKILL.md"
171
171
  ],
172
172
  "checksum": "430f2d85a4791dc695bcdc063193c225343104a342e8adf80a544ab87ae4223d",
173
- "retrievedAt": "2026-08-27T14:41:39.189Z"
173
+ "retrievedAt": "2026-08-29T05:57:02.492Z"
174
174
  },
175
175
  {
176
176
  "id": "CODEX-EXEC",
@@ -192,7 +192,7 @@
192
192
  "references/harness-facts.md"
193
193
  ],
194
194
  "checksum": "df82c4bbf3b5bffca926a244549222c1235154cfba973b9a0bb1d7a0abd28d66",
195
- "retrievedAt": "2026-08-27T08:19:24.132Z"
195
+ "retrievedAt": "2026-08-29T05:57:02.492Z"
196
196
  }
197
197
  ]
198
198
  }
@@ -29,8 +29,8 @@ Ready to build (N): - <linked title> — <scope>
29
29
  In flight (N): - <linked title> — working, task <x>/<y>, ledger moved <n>d ago
30
30
  Stale (N): - <linked title> — working <age>d, ledger silent <n>d → check or reclaim
31
31
  Open PRs (N): - <linked title> — checks <green|pending-or-red|no-checks>
32
- Pending decisions (N): "<gist>" (<linked issue>) — records at that issue's merge
33
- Last chronicle chapter: <date> — <title>
32
+ Pending decisions (N): "<gist-plain>" (<linked issue>) — records at that issue's merge
33
+ Last chronicle chapter: <date> — <title-plain>
34
34
  Next: <the single most valuable operator action, and why>
35
35
  ```
36
36
 
@@ -38,7 +38,8 @@ Next: <the single most valuable operator action, and why>
38
38
  - Sections with zero entries are omitted, not rendered empty. A completely quiet board is one line: "Nothing needs you — <n> issues ready for agents, nothing in flight."
39
39
  - `risky` issues get their flag shown inline wherever they appear.
40
40
  - **Next** is one line, chosen not computed-looking: the action that unblocks the most (a plan approval blocking several ready issues beats a lone review).
41
- - <linked title> means a markdown link wrapping the issue/PR title around its URL; numbers ride inside the link, never stand alone.
41
+ - <linked title> means a markdown link this report builds around the issue/PR title and its URL; numbers ride inside the link, never stand alone. That governs the references the board itself makes.
42
+ - `<title-plain>` / `<gist-plain>` are the script's `titlePlain` / `gistPlain` fields — text quoted from elsewhere (a chronicle title, a decision gist) may arrive carrying markdown links, and raw bracket-and-parenthesis markup means nothing in a terminal, so it is quoted with the markup removed rather than relinked.
42
43
 
43
44
  ## Honesty rules
44
45
 
@@ -31,6 +31,17 @@ function gh(args) {
31
31
  return JSON.parse(out);
32
32
  }
33
33
 
34
+ // Link markup carries no meaning in a terminal, so the board renders link-free
35
+ // variants alongside the raw fields — and register comparison uses them, so a
36
+ // linked gist still matches its plain register line. URLs containing `)` are not
37
+ // a shape this workflow produces (issue and commit URLs never do).
38
+ const LINK = /\[([^\]]*)\]\((?:[^)]*)\)/g;
39
+
40
+ export function stripLinks(text) {
41
+ if (typeof text !== 'string') return '';
42
+ return text.replace(LINK, '$1');
43
+ }
44
+
34
45
  export function ageDays(iso, now = Date.now()) {
35
46
  return Math.floor((now - Date.parse(iso)) / 86_400_000);
36
47
  }
@@ -67,6 +78,12 @@ export function ledgerMovedAt(comments) {
67
78
  return at;
68
79
  }
69
80
 
81
+ // Register lines are written plain, proposals may carry links — compare link-free
82
+ // so a recorded decision does not stay "pending" forever on its markup alone.
83
+ function recorded(gist, registerText) {
84
+ return stripLinks(registerText).includes(stripLinks(gist).slice(0, 60));
85
+ }
86
+
70
87
  // Decision proposals not yet in the register: marker type=decision comments
71
88
  // (and evidence **Decision:** lines) whose text isn't in the register file.
72
89
  export function pendingDecisions(comments, registerText) {
@@ -75,11 +92,11 @@ export function pendingDecisions(comments, registerText) {
75
92
  const type = parseMarker(c.body)?.keys?.type;
76
93
  if (type === 'decision') {
77
94
  const gist = (c.body.split('\n').find((l) => l.trim() && !l.startsWith('<!--') && !l.startsWith('#')) ?? '').trim();
78
- if (gist && !(registerText ?? '').includes(gist.slice(0, 60))) pending.push(gist);
95
+ if (gist && !recorded(gist, registerText)) pending.push(gist);
79
96
  }
80
97
  if (type === 'evidence') {
81
98
  const m = /\*\*Decision:\*\*\s*([^\n]+)/.exec(c.body);
82
- if (m && !/^none\b/i.test(m[1].trim()) && !(registerText ?? '').includes(m[1].trim().slice(0, 60))) pending.push(m[1].trim());
99
+ if (m && !/^none\b/i.test(m[1].trim()) && !recorded(m[1].trim(), registerText)) pending.push(m[1].trim());
83
100
  }
84
101
  }
85
102
  return pending;
@@ -118,7 +135,7 @@ export function gatherStatus({ repo, staleDays = 3, devMdPath = '.vegastack/dev.
118
135
  const moved = ledgerMovedAt(comments);
119
136
  issue.ledgerAgeDays = moved ? ageDays(moved, now) : null;
120
137
  issue.stale = bucket === knobs.states[3] && (issue.ledgerAgeDays === null || issue.ledgerAgeDays >= staleDays);
121
- decisions.push(...pendingDecisions(comments, registerText).map((d) => ({ issue: issue.number, gist: d })));
138
+ decisions.push(...pendingDecisions(comments, registerText).map((d) => ({ issue: issue.number, gist: d, gistPlain: stripLinks(d) })));
122
139
  }
123
140
  }
124
141
 
@@ -131,7 +148,7 @@ export function gatherStatus({ repo, staleDays = 3, devMdPath = '.vegastack/dev.
131
148
  let lastChronicle = null;
132
149
  if (existsSync(chroniclePath)) {
133
150
  const m = /^## (\d{2}-\d{2}-\d{4}) — (.+)$/m.exec(readFileSync(chroniclePath, 'utf8'));
134
- if (m) lastChronicle = { date: m[1], title: m[2] };
151
+ if (m) lastChronicle = { date: m[1], title: m[2], titlePlain: stripLinks(m[2]) };
135
152
  }
136
153
 
137
154
  return { repo: resolvedRepo, staleDays, board, prs, pendingDecisions: decisions, lastChronicle };
@@ -23,7 +23,7 @@ profile carries a schema version to validate against.
23
23
 
24
24
  ## Release flow (tag-driven)
25
25
 
26
- 1. Every PR that changes released behavior lands with a changeset — a `.changeset/<slug>.md` written directly, since the `changeset` add prompt is interactive (`bunx changeset version` at release time is the only CLI use) — whose bump follows the table above.
26
+ 1. Every PR that changes released behavior lands with a changeset — a `.changeset/<slug>.md` written directly, since the `changeset` add prompt is interactive (`bunx changeset version` at release time is the only CLI use) — whose bump follows the table above and whose shape follows dev-implement's changelog rule.
27
27
  2. Maintainer, at release time: `bunx changeset version` (applies changesets to `packages/cli/package.json` and the changelog), then `bun install` so `bun.lock` does not go stale, commit. The release record is `packages/cli/CHANGELOG.md`, changesets-written — never by hand; the root `CHANGELOG.md` is the frozen pre-0.3.0 record pointing there.
28
28
  3. Tag the release commit `v<version>`, push the tag.
29
29
  4. The release workflow runs on the tag: `bun run check`, tag↔version guard, `npm publish` via trusted publishing (OIDC, token-free, provenance by default; idempotently skipped if already on the registry), SBOM, GitHub release. Never pass `--provenance` explicitly — it conflicts with trusted-publishing config.
@@ -30,8 +30,8 @@
30
30
  "affected": [
31
31
  "ref:standards"
32
32
  ],
33
- "checksum": "1aecfc21328fcf51b456615477d7aebfa05b779c56d75c7721c4fd5f969af8f7",
34
- "retrievedAt": "2026-08-08T07:52:08.251Z"
33
+ "checksum": "f2c589e5fd5e4b4684fdf6567262c24dea6a3b14eca795ab1dca3c4b7a3e1eea",
34
+ "retrievedAt": "2026-08-29T05:57:04.887Z"
35
35
  },
36
36
  {
37
37
  "id": "CLAUDE-CODE-SKILLS",
@@ -52,8 +52,8 @@
52
52
  "affected": [
53
53
  "ref:standards"
54
54
  ],
55
- "checksum": "a2651c4f1a7aa43978c549c9f376c47b738ac53532fecc8168aee0d3b796469a",
56
- "retrievedAt": "2026-08-08T07:52:08.251Z"
55
+ "checksum": "92f9993b6c2cb79be4ecf3d2785c310978d4daf308df6a0d4d076845028b170b",
56
+ "retrievedAt": "2026-08-29T05:57:04.887Z"
57
57
  },
58
58
  {
59
59
  "id": "CODEX-SKILLS",
@@ -74,8 +74,8 @@
74
74
  "affected": [
75
75
  "ref:standards"
76
76
  ],
77
- "checksum": "b7667a87600436ae5d70e414a2a0fcb207e11c8ffdb7a28d93637980f3ff565d",
78
- "retrievedAt": "2026-08-08T07:52:08.251Z"
77
+ "checksum": "e6ede44b27e6195c1920bdfb2f3f15e548f3ba34feeffad3a0cb23c54a0f63b9",
78
+ "retrievedAt": "2026-08-29T05:57:04.887Z"
79
79
  },
80
80
  {
81
81
  "id": "HERMES-SKILLS",
@@ -96,8 +96,8 @@
96
96
  "affected": [
97
97
  "ref:standards"
98
98
  ],
99
- "checksum": "c4ed10a90e9303adb7a80aa5531ea92a1debbe6c4edff588199b123429065893",
100
- "retrievedAt": "2026-08-08T07:52:08.251Z"
99
+ "checksum": "d3cbea81c2c03c6ab480848c79d75d4914109898509344b774428579cc642223",
100
+ "retrievedAt": "2026-08-29T05:57:04.887Z"
101
101
  }
102
102
  ]
103
103
  }
@@ -89,7 +89,7 @@ Now that quality is proven:
89
89
 
90
90
  1. Write unit tests for the deterministic branches of any bundled scripts, plus fixtures. A prose-only skill keeps just its trigger-query fixture.
91
91
  2. Write `refresh/sources.json` + `refresh/REFRESH.md` for the volatile facts marked in Phase 2 — or the one-line evergreen waiver.
92
- 3. Finish `README.md` and `agents/openai.yaml`; fill in the wiring TODOs the scaffolder left (README row description, changeset text).
92
+ 3. Finish `README.md` and `agents/openai.yaml`; fill in the wiring TODOs the scaffolder left (README row description, changeset text — shaped per dev-implement's changelog rule).
93
93
 
94
94
  ## Phase 6 — Verify
95
95
 
@@ -10,18 +10,18 @@
10
10
  "references/data.md": "781d3ae7d3bca0b269c123a10013226f3878503dd1224ee526edd102bfc270f0",
11
11
  "references/infra.md": "a6d07c5e9ea67788edac7b80742a5588a1f019e387163bfdab531314fb54d009",
12
12
  "references/mobile.md": "b6ee481df810f3fd5466487848287ceeb33ac98bf6db0bc2d65c4d6fa397284f",
13
- "references/pinned-facts.md": "aefb50040c0a2c4256cef51cc7789e838977ac265e997d4c63a313de422e37f0",
13
+ "references/pinned-facts.md": "28c07d9258c839290c6e003aa3e33138d809f09f53dc50185357595eb1a1d2a5",
14
14
  "references/principles.md": "f8b7e40010a3094bcc3d4d2f285d40430ea9f3a9b554ed0ff54731b7e7754cd4",
15
15
  "references/security.md": "e3afe3fc9d223a7e3742ea1d27a91df8f1811729060d3778a6a51fdde5b90764",
16
16
  "references/stack.md": "0bc2247865624f06a90b2c35794dacf6bd37220babbc8b2e4b5a47c5cfb2961c",
17
17
  "references/web.md": "1a08b96eb93be56f3176d409b2985ab4fc2ffaef870eb8dac4ca2940ad9f084f",
18
18
  "refresh/REFRESH.md": "abdc377fcf79afcbd41c96ad51be7b20b4292378c0891ab6b309755459dde715",
19
- "refresh/sources.json": "2cfd851090f5a0b661bd88c9bbe62ca3f99b744066817cc1067378520616f68e"
19
+ "refresh/sources.json": "a82d6873306beb95028f76aae2625043858f3a9fc8ceb59ddc7a2193425ae6ed"
20
20
  }
21
21
  },
22
22
  "dev-chronicle": {
23
23
  "files": {
24
- "SKILL.md": "115dc19b93fd266d001592a50acfd21ebd7ec38dec774466b7b18226a20abcc4",
24
+ "SKILL.md": "e43f50fc570992de0766d4e569693babd05cde08d2e1c271c267df6b7552ac89",
25
25
  "agents/openai.yaml": "765b12e17b7fce88c53ca0fae735bf0efceb843cc3703b91bc1801ab5cac06b4",
26
26
  "references/conventions.md": "815f5189daff1b71b3251b7a57de183a4a387fcdedbd5875e673d5bd3de398fc",
27
27
  "refresh/REFRESH.md": "760e66642eec426cd5ab2319613e817adf5bbd7b64c8eaa22dd13497351bf9c1",
@@ -40,7 +40,7 @@
40
40
  },
41
41
  "dev-implement": {
42
42
  "files": {
43
- "SKILL.md": "781d8686a763489983d7e9a37ee6817c5e6f41bb794b53d4d72d20abfdc580af",
43
+ "SKILL.md": "8be83688920875aa16566d20497b2a249a53de6f2fceeae463825154e064e502",
44
44
  "agents/openai.yaml": "1abab383deca54d32749fd9156f9a6211fe96e02e0166dc8a16ff8459ac31b74",
45
45
  "references/conventions.md": "815f5189daff1b71b3251b7a57de183a4a387fcdedbd5875e673d5bd3de398fc",
46
46
  "references/ledger-and-resume.md": "46bd4ad38eb70376d9ad36ac80269abc337c12e692e2b7de6483584f1003346a",
@@ -77,7 +77,7 @@
77
77
  "files": {
78
78
  "SKILL.md": "00c1b86038ef8497480b440ee490019702013692c8ac5266a8340464745e0cf5",
79
79
  "agents/openai.yaml": "3f35d3dc60f179d4ac2526997c4d10173ba3018d06f0dbe77e209ce2978fa702",
80
- "assets/review-known-patterns.md.template": "a521aba1e59c44645bbb9f9b6b0fbba3423f694b2e7bbcb1dbabe7d2c8e5756a",
80
+ "assets/review-known-patterns.md.template": "2fe7dbcc4d0eeac542e7624111130265b2bb4f08806f20dbd2087842cbb22b5c",
81
81
  "references/conventions.md": "815f5189daff1b71b3251b7a57de183a4a387fcdedbd5875e673d5bd3de398fc",
82
82
  "references/cross-agent.md": "3541715d0563703373ea3d93582119b80356d1cbdee19ce17f958c0f7c914884",
83
83
  "references/dispatch-prompts.md": "259e8f468cedb961359bad6d080515d4682a9e5aafd268a192d51454d2842c50",
@@ -94,9 +94,9 @@
94
94
  "assets/dev-profile.md.template": "45b2a90fc7aee39e7b975151f1281787d6dd4d3b7d5f9df5b8f282d020a1d7a9",
95
95
  "references/conventions.md": "815f5189daff1b71b3251b7a57de183a4a387fcdedbd5875e673d5bd3de398fc",
96
96
  "references/harness-facts.md": "2be1d81f6a616d40dc865aaeefaf53c61bc13ade4ba1de8fb406c520bf15be40",
97
- "references/stack-playbooks.md": "3586a0f03830a9bfaba2d9373a2e745d2207213923af601bf472849f07a7d9e9",
97
+ "references/stack-playbooks.md": "f70975d482d5061da16f45662d2fe7a6c2e4cd83c2a91818d5ff0789954f758c",
98
98
  "refresh/REFRESH.md": "debda6ab96e899dd7e38309f714e9d65a3fbc53fd8ca68b8156f1348226c87b9",
99
- "refresh/sources.json": "3deab13addeff1d8c6aac17955694c914064a9eba89eb4c833163448b2351497"
99
+ "refresh/sources.json": "1252b43433d8799e9e577542f0898f8f2c83f17e661ca2d3e2d4fa57c8d3689a"
100
100
  }
101
101
  },
102
102
  "dev-ship": {
@@ -112,27 +112,27 @@
112
112
  },
113
113
  "dev-status": {
114
114
  "files": {
115
- "SKILL.md": "3d512a6fa30591fc762b11ef4861006defb3ba9ceac03eb77488a15d2489b49c",
115
+ "SKILL.md": "42d1dfbda5602d68b114060c83cc9f61e14b9059d09a2b436218afdf0f009706",
116
116
  "agents/openai.yaml": "72435947f5afef0c8a2c170e987b14fe6057b174318c16b6b538ae8d129791fb",
117
117
  "references/conventions.md": "815f5189daff1b71b3251b7a57de183a4a387fcdedbd5875e673d5bd3de398fc",
118
118
  "refresh/REFRESH.md": "52aee9bae64d8342e127704d1db282e43ed57c101148727bf10172d6cb975bfa",
119
119
  "refresh/sources.json": "a7ba2340964dc70410626087686145b5790a0e763a18ef2c4d9aa37e950f2e04",
120
- "scripts/status.mjs": "70c959f46764613d4645b1dce54b05a3800c0b689ee5bd14f807b6150dce3cb7"
120
+ "scripts/status.mjs": "bc56d0b5d996676cfccb752d9d77d0e9e7d64932741cd39d6a503e9761fbe34d"
121
121
  }
122
122
  },
123
123
  "skill-maintainer": {
124
124
  "files": {
125
125
  "SKILL.md": "0947155a4e7c87d6f200a1e565013beac8e3093b17e3216d6901a20be863bb21",
126
126
  "agents/openai.yaml": "0b89d4e6416cf20b448f5322f3d7433cfde333d2b4a05b42ed53db3759701fb4",
127
- "references/release-ops.md": "6ce36667a019339d6586dc9f898398331f2c078b52f88ec4c0f9aae21a4c88c5",
127
+ "references/release-ops.md": "16515b2c8c33da43a56871f6e62a459184a983cd650e1a91434160336c0ca374",
128
128
  "references/standards.md": "3646d0dd0560a87b333f70febf670b093c89b35111132cdb641b763bf184b02f",
129
129
  "refresh/REFRESH.md": "3955bff5f0a14c83336a73cdbd07ba18d9398996934af87fac4454206cd14023",
130
- "refresh/sources.json": "cf38cdf8123a50ea7ef2d1466a87faa648c12e5bc90d9ee9b6ae45632e7d0800"
130
+ "refresh/sources.json": "4977152381d53555196ac676f95e61b4eaa301309a17560da5cda722010eb80f"
131
131
  }
132
132
  },
133
133
  "skillify": {
134
134
  "files": {
135
- "SKILL.md": "378b66998575b8e316190fa2bbe435852fb191448806e2ec8943037e716a9f9d",
135
+ "SKILL.md": "8469080261cf1911d054fb5b08cdec170566f5fcd07de6fa374d847d1b9d87aa",
136
136
  "agents/openai.yaml": "df320cf32a8db06c213f7892844dab810b7e96cfbf32502d25185d4a4167ef87",
137
137
  "assets/templates/README.md.template": "68230ada702ad39f5de1f35e838ba590d89ca19b23868d4499353db6034fcc2c",
138
138
  "assets/templates/REFRESH.md.template": "ff86afade565d668333e7f6d0432213760fd68a62b8ba22897a8601b74c94ac0",