@vegastack/skills 0.4.0 → 0.6.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 +4 -2
- package/dist/index.js +38 -45
- package/package.json +1 -1
- package/skill/architect/SKILL.md +68 -0
- package/skill/architect/agents/openai.yaml +4 -0
- package/skill/architect/assets/adr-template.md +21 -0
- package/skill/architect/assets/arch-template.md +20 -0
- package/skill/architect/references/advisory.md +102 -0
- package/skill/architect/references/ai-agents.md +95 -0
- package/skill/architect/references/data.md +90 -0
- package/skill/architect/references/infra.md +128 -0
- package/skill/architect/references/mobile.md +78 -0
- package/skill/architect/references/pinned-facts.md +108 -0
- package/skill/architect/references/principles.md +91 -0
- package/skill/architect/references/project-profile.md +37 -0
- package/skill/architect/references/security.md +97 -0
- package/skill/architect/references/stack.md +38 -0
- package/skill/architect/references/web.md +152 -0
- package/skill/architect/refresh/REFRESH.md +29 -0
- package/skill/architect/refresh/sources.json +244 -0
- package/skill/skill-maintainer/references/release-ops.md +11 -15
- package/skill/skill-maintainer/refresh/REFRESH.md +3 -3
- package/skill-integrity.json +20 -44
- package/skill/arch-guardian/SKILL.md +0 -84
- package/skill/arch-guardian/agents/openai.yaml +0 -4
- package/skill/arch-guardian/assets/adr-template.md +0 -25
- package/skill/arch-guardian/assets/answers-example.json +0 -10
- package/skill/arch-guardian/assets/architecture-profile.json +0 -13
- package/skill/arch-guardian/assets/architecture-profile.schema.json +0 -31
- package/skill/arch-guardian/assets/deployment-review-template.md +0 -24
- package/skill/arch-guardian/assets/service-design-template.md +0 -33
- package/skill/arch-guardian/assets/threat-model-template.md +0 -34
- package/skill/arch-guardian/references/advisory-report.md +0 -65
- package/skill/arch-guardian/references/architecture/agent-product.md +0 -22
- package/skill/arch-guardian/references/architecture/ai-cost.md +0 -24
- package/skill/arch-guardian/references/architecture/ai-data-boundaries.md +0 -21
- package/skill/arch-guardian/references/architecture/ai-evals.md +0 -28
- package/skill/arch-guardian/references/architecture/connectors-sandbox.md +0 -39
- package/skill/arch-guardian/references/architecture/data-memory.md +0 -25
- package/skill/arch-guardian/references/architecture/delivery-operations.md +0 -34
- package/skill/arch-guardian/references/architecture/durable-execution.md +0 -45
- package/skill/arch-guardian/references/architecture/flutter.md +0 -26
- package/skill/arch-guardian/references/architecture/foundation.md +0 -31
- package/skill/arch-guardian/references/architecture/hosting-reliability.md +0 -37
- package/skill/arch-guardian/references/architecture/identity-tenancy.md +0 -37
- package/skill/arch-guardian/references/architecture/model-lifecycle.md +0 -20
- package/skill/arch-guardian/references/architecture/models-observability.md +0 -23
- package/skill/arch-guardian/references/architecture/realtime-channels.md +0 -16
- package/skill/arch-guardian/references/architecture/security-privacy.md +0 -27
- package/skill/arch-guardian/references/architecture/topology-monorepo.md +0 -47
- package/skill/arch-guardian/references/architecture/web.md +0 -29
- package/skill/arch-guardian/references/foundation-compatibility.json +0 -44
- package/skill/arch-guardian/references/golden-patterns.md +0 -43
- package/skill/arch-guardian/references/profile-governance.md +0 -40
- package/skill/arch-guardian/references/rule-model.json +0 -36
- package/skill/arch-guardian/references/workflows.md +0 -48
- package/skill/arch-guardian/refresh/REFRESH.md +0 -47
- package/skill/arch-guardian/refresh/sources.json +0 -1171
- package/skill/arch-guardian/scripts/lib.mjs +0 -48
- package/skill/arch-guardian/scripts/profile-tool.mjs +0 -217
- package/skill/arch-guardian/scripts/refresh-evidence.mjs +0 -366
- package/skill/arch-guardian/scripts/schema-validate.mjs +0 -63
- package/skill/arch-guardian/scripts/validate-profile.mjs +0 -65
- package/skill/arch-guardian/scripts/verify-corpus.mjs +0 -136
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
# Web — frontend, design system, backend/API taste
|
|
2
|
+
|
|
3
|
+
## Project layout
|
|
4
|
+
|
|
5
|
+
- Top-level `server/` (or `packages/*` server code) holds DB, services, integrations — it
|
|
6
|
+
is sacred: never imported from client code, enforced with `server-only` + a boundary
|
|
7
|
+
check. The app router lives in `src/app/`; features are self-contained modules under
|
|
8
|
+
`src/features/<domain>/` (components/hooks per feature); shared pieces in
|
|
9
|
+
`src/{components,hooks,lib,store,messages}/`. Pages stay thin — they compose features.
|
|
10
|
+
- The house convention scopes agent instructions per directory (a short CLAUDE.md/AGENTS.md
|
|
11
|
+
at each boundary-bearing directory) — follow it where a project already does this.
|
|
12
|
+
|
|
13
|
+
## Frontend architecture
|
|
14
|
+
|
|
15
|
+
- Server state → RSC + TanStack Query; URL state → nuqs; ephemeral UI state → Zustand.
|
|
16
|
+
Remote/tenant data is never persisted client-side (IndexedDB/local-first was evaluated and
|
|
17
|
+
rejected for multi-tenant SaaS on governance grounds — a confirmed single-tenant/offline
|
|
18
|
+
product is the only exception, and that's a decision to ask for, not assume).
|
|
19
|
+
- Next config: `output: 'standalone'`, `cacheComponents: true` (PPR flags no longer exist).
|
|
20
|
+
Query key factories live in non-`'use client'` `.keys.ts` modules so RSC pages can prefetch.
|
|
21
|
+
- Server Components by default; `'use client'` only at the lowest leaf that needs it.
|
|
22
|
+
`/server` (or `packages/*` server code) is never imported from client code — `server-only`
|
|
23
|
+
plus a boundary check, not convention.
|
|
24
|
+
- Request interception: on OpenNext/Cloudflare, `proxy.ts`/Node middleware does NOT work
|
|
25
|
+
as of 2026-08 (open adapter issues — see infra.md); use what the adapter actually
|
|
26
|
+
supports and re-check its docs per feature. Either way interception is never the auth
|
|
27
|
+
boundary (see security.md).
|
|
28
|
+
- Internal navigation uses `next/link`; bare `<a>` only for true external links/downloads.
|
|
29
|
+
- Never TypeScript `any` — `unknown` and narrow.
|
|
30
|
+
- Dependencies: prefer the native/browser API when it covers the need
|
|
31
|
+
(`Intl.RelativeTimeFormat` over date-fns); self-implement simple behavior (a tween, a diff
|
|
32
|
+
view) by composing design-system primitives before adding a library; any non-trivial new
|
|
33
|
+
dependency needs a stated justification and approval. **Why:** self-contained code has no
|
|
34
|
+
supply-chain, licensing, or upgrade surface, and MK rejects "library because library".
|
|
35
|
+
|
|
36
|
+
## Design system (consuming `@vegastack/design` / `@vegastack/ui`)
|
|
37
|
+
|
|
38
|
+
- First-time setup in a fresh project (npm install, Tailwind wiring, provider, registry
|
|
39
|
+
auth) is a separate, already-built skill — `vegastack-consume` — use it; don't
|
|
40
|
+
re-derive the wiring here.
|
|
41
|
+
- Consume through the package barrel, never deep imports; never edit shipped component files.
|
|
42
|
+
A missing component or variant is an upstream request MK decides — the recommended
|
|
43
|
+
interim pattern is a local presentational composition in the app (inferred — confirm on
|
|
44
|
+
first use); don't fork the system.
|
|
45
|
+
- Semantic tokens only: no inline `style={}`, no arbitrary values (`bg-[#123]`, `h-[13px]`),
|
|
46
|
+
no raw palette classes (`bg-neutral-900`), not even for opacity. Dynamic values go through
|
|
47
|
+
CSS custom properties.
|
|
48
|
+
- Visual language: borders-only cards, flat surfaces (shadows only for true overlays); accent
|
|
49
|
+
color rationed to the primary action and real selected/active state — never hover, roughly
|
|
50
|
+
≤10 accent elements a page. Focus stays visible always (WCAG 2.2 AA floor) — the house
|
|
51
|
+
mechanism is a darker border or native outline, never a `ring-*` utility. Control heights
|
|
52
|
+
on the 28/32/40 scale = `h-7`/`h-8`/`h-10` (no off-scale `h-9`); radius: `rounded-md`
|
|
53
|
+
controls, `rounded-sm` menu items, `rounded-lg` containers, `rounded-full` pills — never
|
|
54
|
+
`rounded-xl` on cards/dialogs. Touch-target minimum is genuinely unresolved (24px WCAG AA
|
|
55
|
+
vs 44px mobile-HIG both appear in the record) — ask MK when it matters.
|
|
56
|
+
- Typography: product code caps at `font-semibold` and uses it sparingly (inside the design
|
|
57
|
+
system package itself the cap is `font-medium`); headings `font-lora`; numbers, versions,
|
|
58
|
+
costs, and card digits always `font-mono`; uppercase only in mono at ≤14px. Fonts are
|
|
59
|
+
self-hosted via `next/font` — never a Google Fonts CDN request.
|
|
60
|
+
- Icons: Lucide only. Toasts: sonner, never native/OS prompts. 4px spacing scale.
|
|
61
|
+
- Motion: subtle and minimal — no button hover/press animations, no `transition-all`; motion
|
|
62
|
+
is for state feedback (success/error) and structural changes. `prefers-reduced-motion`
|
|
63
|
+
disables animation entirely (instant, not softened).
|
|
64
|
+
- No decorative filler: no gratuitous badges, eyebrow text, or "3 of 3" counters — MK cuts
|
|
65
|
+
these on sight as AI-generated design tells.
|
|
66
|
+
- Light AND dark theme on every shipped surface (internal-only tools may opt out, stated
|
|
67
|
+
up front).
|
|
68
|
+
|
|
69
|
+
## UI completeness bar (every real surface, before it's "done")
|
|
70
|
+
|
|
71
|
+
- Full state matrix: loading skeleton shaped like the real content · empty state with
|
|
72
|
+
guidance · error routed to the specific failure (401/403, 404, 410, 429, generic — never
|
|
73
|
+
swallowed into `{}`) · success feedback. Optimistic updates where a mutation changes
|
|
74
|
+
visible state; the UI reflects backend mutations without a manual refresh.
|
|
75
|
+
- Forms: Enter submits; spinner replaces the button icon (not beside it); first field
|
|
76
|
+
auto-focused; all fields disabled while the primary action runs; state resets on error or
|
|
77
|
+
navigation.
|
|
78
|
+
- Responsive: no horizontal scroll at any width; computed layout math, never hardcoded pixel
|
|
79
|
+
offsets; truncation driven by available space, not character counts; iOS inputs must not
|
|
80
|
+
zoom on focus; the mobile keyboard must never occlude the active input.
|
|
81
|
+
- Systemic fixes: a defect found in one component (scroll leaking through an overlay, missing
|
|
82
|
+
cursor, wrong token) is fixed across the whole family in one sweep, with evidence.
|
|
83
|
+
- Perceived speed is the named pattern "instant shell": the layout shell renders
|
|
84
|
+
immediately (RSC + `cacheComponents`), every data region streams in behind a skeleton
|
|
85
|
+
shaped like its content — never a blank page or a full-page spinner.
|
|
86
|
+
- Long lists (>~50 rows) virtualize with `@tanstack/react-virtual` (the approved package —
|
|
87
|
+
still state the justification when adding it).
|
|
88
|
+
- Cloning/rebranding a reference site: strip every trace of the source tool's provenance
|
|
89
|
+
(class names, external asset domains, meta) so the result is fully self-contained, and
|
|
90
|
+
verify parity by clicking through as a real user — screenshot diffing alone doesn't count.
|
|
91
|
+
|
|
92
|
+
## SEO and metadata (every public-facing app)
|
|
93
|
+
|
|
94
|
+
- Every route exports `metadata`/`generateMetadata` — not just the root layout. Public
|
|
95
|
+
apps ship `sitemap.ts` and `robots.ts`; `llms.txt` is generated at build time, never
|
|
96
|
+
hand-maintained. OG images follow the house convention (generated, mono for
|
|
97
|
+
names/numbers). i18n uses next-intl `localePrefix: 'as-needed'` (stack.md) so default-
|
|
98
|
+
locale URLs stay clean. **Why:** MK has demanded "100% SEO" coverage on shipped sites
|
|
99
|
+
twice — treat it as a completeness bar, not an enhancement.
|
|
100
|
+
|
|
101
|
+
## Testing (web/backend — test where it pays off)
|
|
102
|
+
|
|
103
|
+
- Unit-test services and pure logic (Vitest); component/a11y tests run in Vitest browser
|
|
104
|
+
mode with the Playwright provider (real Chromium — jsdom's ARIA/layout gaps produce
|
|
105
|
+
false a11y results and are not trusted).
|
|
106
|
+
- E2E is a walking skeleton: one real happy path (boot → auth → core mutation → verify)
|
|
107
|
+
plus targeted adversarial invariants — not a blanket suite. DB-gated tests are authored
|
|
108
|
+
even when execution is blocked, and gated behind an env flag (`RUN_DB_TESTS=1` pattern);
|
|
109
|
+
E2E doubles implement real ports, never a parallel mock pathway.
|
|
110
|
+
- Every confirmed bug gets a regression test; no coverage-percentage targets — "100%"
|
|
111
|
+
means audit completeness, never a coverage metric. VRT/demo content is deterministic
|
|
112
|
+
(no `Date.now()`/`Math.random()`).
|
|
113
|
+
|
|
114
|
+
## Backend / API design
|
|
115
|
+
|
|
116
|
+
- Contract-first: zod schemas are the single source → OpenAPI 3.1 under `/api/v1`, camelCase,
|
|
117
|
+
cursor pagination on every list, RFC 9457 problem-details errors with a stable error-code
|
|
118
|
+
catalog. One contract serves web, Flutter, MCP, and public consumers.
|
|
119
|
+
- Every route: auth before parse, through the shared route-handler wrapper — no route-local
|
|
120
|
+
zod, no raw `request.json()`. Sanitize responses: secrets and credential references never
|
|
121
|
+
leave the server. Enforce with a CI ratchet (unwrapped routes fail the build), not review.
|
|
122
|
+
- Return what the view renders, not everything — no mega-responses. Select columns explicitly.
|
|
123
|
+
- Body limits stream: count bytes as they arrive and abort at the limit; never buffer the
|
|
124
|
+
whole body first.
|
|
125
|
+
- Webhooks over polling; the database is the source of truth. Once provider state lands in
|
|
126
|
+
Postgres via webhook, don't re-poll the provider — and don't build intermediary "waiting"
|
|
127
|
+
pages; redirect on success and let the rest arrive in the background.
|
|
128
|
+
- Money paths (Stripe): isolated intake (own worker or route), idempotency keys on every
|
|
129
|
+
mutation, event dedupe, append-only ledgers as the single cost source of truth, audit
|
|
130
|
+
events written in the same transaction as the business change. Pricing/quoting math is
|
|
131
|
+
deterministic code with server-enforced invariants — AI drafts and judges; deterministic
|
|
132
|
+
code calculates and enforces (a proven client-project pattern; treat as the strong
|
|
133
|
+
default for money paths).
|
|
134
|
+
- Centralize the boring: one ID helper (never raw `crypto.randomUUID` scattered), one logger
|
|
135
|
+
(never `console.log`; request/org context auto-injected; never log secrets or PII beyond
|
|
136
|
+
user IDs), one typed fail-hard zod env parser validated at startup — no
|
|
137
|
+
`DISABLE_AUTH`-style escape hatches, no plaintext fallbacks.
|
|
138
|
+
- Dead endpoints get deleted, not deprecated-and-kept. (Exception: a versioned `/api/v1`
|
|
139
|
+
contract consumed by a shipped mobile app outlives web deploy cycles — app-store install
|
|
140
|
+
lag means mobile clients keep the old contract alive; see mobile.md.)
|
|
141
|
+
- Outbound webhooks to customers (when a product offers them): a defined event catalog,
|
|
142
|
+
Standard Webhooks-style signing with rotatable secrets, delivery via the transactional
|
|
143
|
+
outbox → queue with retries/backoff, auto-disable an endpoint after N consecutive
|
|
144
|
+
failures, and a replay surface. Never fire webhooks inline from request handlers.
|
|
145
|
+
- Platform-native mentions over plain text: when the data allows it, resolve and mention
|
|
146
|
+
the real entity (Slack user @mentions, Notion Person fields) instead of rendering names
|
|
147
|
+
as text — the recurring "don't just fix, improve" integration principle.
|
|
148
|
+
- Wizard/checkout flow-state persistence (Zustand + sessionStorage vs server-side draft)
|
|
149
|
+
is not yet a settled house rule — ask MK when building one.
|
|
150
|
+
- Rate-limited responses return 429 with a `Retry-After` header.
|
|
151
|
+
- Timestamps stored UTC (`timestamptz`), rendered in the user's timezone; durations as
|
|
152
|
+
integer milliseconds; money in integer minor units.
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
# Freshness contract — architect
|
|
2
|
+
|
|
3
|
+
Most of this skill is durable taste and recorded decisions; it does not go stale on its
|
|
4
|
+
own. Exactly one file decays with the platform landscape: `references/pinned-facts.md`
|
|
5
|
+
(plus the version claims embedded in `references/stack.md` and `references/mobile.md`).
|
|
6
|
+
|
|
7
|
+
## Mechanism
|
|
8
|
+
|
|
9
|
+
1. **Weekly scheduled agent (primary).** A scheduled Claude Code/Codex job re-verifies
|
|
10
|
+
each pinned fact against its stated source URL and opens ONE pull request quoting
|
|
11
|
+
evidence for anything that changed (fact text, version, date, source). The diffing
|
|
12
|
+
judgment lives in the agent run, not in maintained scripts. The PR is human-reviewed —
|
|
13
|
+
never auto-merged.
|
|
14
|
+
2. **Refresh-on-use (safety net, written into SKILL.md).** When a recommendation leans on
|
|
15
|
+
a pinned fact older than 60 days, the consuming agent re-verifies that one fact first
|
|
16
|
+
and says so. Never bulk-refresh in-session.
|
|
17
|
+
3. **Registry baseline (`sources.json`).** The repo-shared refresh runner
|
|
18
|
+
(`tooling/refresh/refresh-evidence.mjs`) keeps checksum baselines for the critical
|
|
19
|
+
source pages so CI can detect upstream drift deterministically between weekly runs.
|
|
20
|
+
|
|
21
|
+
## Rules
|
|
22
|
+
|
|
23
|
+
- Critical sources (Hyperdrive supported versions, Better Auth docs, eve/Workflow SDK
|
|
24
|
+
deploy constraints) get `critical: true` — drift there warrants a prompt PR, not a
|
|
25
|
+
batch.
|
|
26
|
+
- Every edited fact keeps the pattern: fact → why it changes a decision → source URL →
|
|
27
|
+
verified date. The file carries one blanket verified-date for facts checked together;
|
|
28
|
+
a fact re-verified alone gets its own inline date, superseding the blanket one.
|
|
29
|
+
- A fact that stops being decision-changing is deleted, not kept for completeness.
|
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
{
|
|
2
|
+
"schemaVersion": 1,
|
|
3
|
+
"policy": {
|
|
4
|
+
"criticalTopics": [
|
|
5
|
+
"hyperdrive-postgres",
|
|
6
|
+
"better-auth",
|
|
7
|
+
"eve-deploy"
|
|
8
|
+
],
|
|
9
|
+
"defaultChecksumScope": "html-text-v1",
|
|
10
|
+
"offline": "Use cached metadata only; fail closed when a critical entry is missing or older than thresholdDays.",
|
|
11
|
+
"drift": "Any drift requires reading the changed page and a human-reviewed PR updating references/pinned-facts.md (and version claims in references/stack.md / references/mobile.md); never auto-apply.",
|
|
12
|
+
"copyright": "Store claim metadata, URLs, hashes, and concise excerpts only; never archive third-party documentation corpora.",
|
|
13
|
+
"cadence": "weekly scheduled-agent refresh; thresholdDays must be >= 14 (2x cadence) so a single missed run never breaches a threshold"
|
|
14
|
+
},
|
|
15
|
+
"sources": [
|
|
16
|
+
{
|
|
17
|
+
"id": "CF-HYPERDRIVE-VERSIONS",
|
|
18
|
+
"service": "Cloudflare Hyperdrive supported databases",
|
|
19
|
+
"kind": "official-docs",
|
|
20
|
+
"stability": "vendor-docs",
|
|
21
|
+
"thresholdDays": 14,
|
|
22
|
+
"critical": true,
|
|
23
|
+
"urls": {
|
|
24
|
+
"primary": "https://developers.cloudflare.com/hyperdrive/reference/supported-databases-and-features/"
|
|
25
|
+
},
|
|
26
|
+
"versionDetection": {
|
|
27
|
+
"type": "manual-review"
|
|
28
|
+
},
|
|
29
|
+
"topics": [
|
|
30
|
+
"hyperdrive-postgres"
|
|
31
|
+
],
|
|
32
|
+
"affected": [
|
|
33
|
+
"references/pinned-facts.md",
|
|
34
|
+
"references/stack.md",
|
|
35
|
+
"references/data.md"
|
|
36
|
+
],
|
|
37
|
+
"checksum": "fda2870b95deffce48dca7f3df3707325b1bc4a2d58a17708ee9220bfba5eba1",
|
|
38
|
+
"retrievedAt": "2026-08-12T14:33:11.062Z"
|
|
39
|
+
},
|
|
40
|
+
{
|
|
41
|
+
"id": "CF-R2-PRICING",
|
|
42
|
+
"service": "Cloudflare R2 pricing",
|
|
43
|
+
"kind": "official-docs",
|
|
44
|
+
"stability": "vendor-docs",
|
|
45
|
+
"thresholdDays": 30,
|
|
46
|
+
"critical": false,
|
|
47
|
+
"urls": {
|
|
48
|
+
"primary": "https://developers.cloudflare.com/r2/pricing/"
|
|
49
|
+
},
|
|
50
|
+
"versionDetection": {
|
|
51
|
+
"type": "manual-review"
|
|
52
|
+
},
|
|
53
|
+
"topics": [
|
|
54
|
+
"r2-economics"
|
|
55
|
+
],
|
|
56
|
+
"affected": [
|
|
57
|
+
"references/pinned-facts.md",
|
|
58
|
+
"references/stack.md"
|
|
59
|
+
],
|
|
60
|
+
"checksum": "bd5e8d26f7bbf2f92182ad4ac1a59ae9b1d90695120062adaf54c281bd88e81f",
|
|
61
|
+
"retrievedAt": "2026-08-12T14:33:11.062Z"
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
"id": "CF-WORKFLOWS-PRICING",
|
|
65
|
+
"service": "Cloudflare Workflows limits and pricing",
|
|
66
|
+
"kind": "official-docs",
|
|
67
|
+
"stability": "vendor-docs",
|
|
68
|
+
"thresholdDays": 30,
|
|
69
|
+
"critical": false,
|
|
70
|
+
"urls": {
|
|
71
|
+
"primary": "https://developers.cloudflare.com/workflows/reference/limits/"
|
|
72
|
+
},
|
|
73
|
+
"versionDetection": {
|
|
74
|
+
"type": "manual-review"
|
|
75
|
+
},
|
|
76
|
+
"topics": [
|
|
77
|
+
"workflows"
|
|
78
|
+
],
|
|
79
|
+
"affected": [
|
|
80
|
+
"references/pinned-facts.md",
|
|
81
|
+
"references/ai-agents.md"
|
|
82
|
+
],
|
|
83
|
+
"checksum": "64e10ca4ced4edc042d12a9a24f2e165ea71cb9481c30ac5f067f2f6c9218cda",
|
|
84
|
+
"retrievedAt": "2026-08-12T14:33:11.062Z"
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
"id": "BETTER-AUTH-DOCS",
|
|
88
|
+
"service": "Better Auth documentation",
|
|
89
|
+
"kind": "official-docs",
|
|
90
|
+
"stability": "vendor-docs",
|
|
91
|
+
"thresholdDays": 14,
|
|
92
|
+
"critical": true,
|
|
93
|
+
"urls": {
|
|
94
|
+
"primary": "https://better-auth.com/docs/plugins/organization"
|
|
95
|
+
},
|
|
96
|
+
"versionDetection": {
|
|
97
|
+
"type": "npm",
|
|
98
|
+
"package": "better-auth"
|
|
99
|
+
},
|
|
100
|
+
"topics": [
|
|
101
|
+
"better-auth"
|
|
102
|
+
],
|
|
103
|
+
"affected": [
|
|
104
|
+
"references/pinned-facts.md",
|
|
105
|
+
"references/security.md",
|
|
106
|
+
"references/stack.md"
|
|
107
|
+
],
|
|
108
|
+
"currentVersion": "1.6.27",
|
|
109
|
+
"versionCheckedAt": "2026-08-12T14:33:11.062Z",
|
|
110
|
+
"checksum": "30edf1b6658a473a00005153a3eafc07de5c3decd6b8f09fc6c32f3a21c4db1c",
|
|
111
|
+
"retrievedAt": "2026-08-12T14:33:11.062Z"
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
"id": "EVE-DOCS",
|
|
115
|
+
"service": "Vercel eve agent framework",
|
|
116
|
+
"kind": "official-docs",
|
|
117
|
+
"stability": "beta",
|
|
118
|
+
"thresholdDays": 14,
|
|
119
|
+
"critical": true,
|
|
120
|
+
"urls": {
|
|
121
|
+
"primary": "https://vercel.com/docs/eve"
|
|
122
|
+
},
|
|
123
|
+
"versionDetection": {
|
|
124
|
+
"type": "npm",
|
|
125
|
+
"package": "eve"
|
|
126
|
+
},
|
|
127
|
+
"topics": [
|
|
128
|
+
"eve-deploy"
|
|
129
|
+
],
|
|
130
|
+
"affected": [
|
|
131
|
+
"references/pinned-facts.md",
|
|
132
|
+
"references/ai-agents.md",
|
|
133
|
+
"references/stack.md"
|
|
134
|
+
],
|
|
135
|
+
"currentVersion": "0.33.2",
|
|
136
|
+
"versionCheckedAt": "2026-08-12T14:33:11.062Z",
|
|
137
|
+
"checksum": "a777f9da0cb3966a9c7cc06a3c12be34b2928800b370e966e8b6e0f5a5622915",
|
|
138
|
+
"retrievedAt": "2026-08-12T14:33:11.062Z"
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
"id": "WORKFLOW-SDK-POSTGRES",
|
|
142
|
+
"service": "Workflow SDK Postgres world deployment constraints",
|
|
143
|
+
"kind": "official-docs",
|
|
144
|
+
"stability": "vendor-docs",
|
|
145
|
+
"thresholdDays": 14,
|
|
146
|
+
"critical": true,
|
|
147
|
+
"urls": {
|
|
148
|
+
"primary": "https://workflow-sdk.dev/worlds/postgres"
|
|
149
|
+
},
|
|
150
|
+
"versionDetection": {
|
|
151
|
+
"type": "npm",
|
|
152
|
+
"package": "@workflow/world-postgres"
|
|
153
|
+
},
|
|
154
|
+
"topics": [
|
|
155
|
+
"eve-deploy"
|
|
156
|
+
],
|
|
157
|
+
"affected": [
|
|
158
|
+
"references/pinned-facts.md",
|
|
159
|
+
"references/ai-agents.md"
|
|
160
|
+
],
|
|
161
|
+
"currentVersion": "4.3.3",
|
|
162
|
+
"versionCheckedAt": "2026-08-12T14:33:11.062Z",
|
|
163
|
+
"checksum": "3eca56b5ec9668638d4e00b290c157383dfe8ceaaa334de13bb6244b32fa6839",
|
|
164
|
+
"retrievedAt": "2026-08-12T14:33:11.062Z"
|
|
165
|
+
},
|
|
166
|
+
{
|
|
167
|
+
"id": "NEXTJS-BLOG",
|
|
168
|
+
"service": "Next.js release blog",
|
|
169
|
+
"kind": "official-docs",
|
|
170
|
+
"stability": "vendor-docs",
|
|
171
|
+
"thresholdDays": 30,
|
|
172
|
+
"critical": false,
|
|
173
|
+
"urls": {
|
|
174
|
+
"primary": "https://nextjs.org/blog"
|
|
175
|
+
},
|
|
176
|
+
"versionDetection": {
|
|
177
|
+
"type": "npm",
|
|
178
|
+
"package": "next"
|
|
179
|
+
},
|
|
180
|
+
"topics": [
|
|
181
|
+
"nextjs"
|
|
182
|
+
],
|
|
183
|
+
"affected": [
|
|
184
|
+
"references/pinned-facts.md",
|
|
185
|
+
"references/web.md",
|
|
186
|
+
"references/stack.md"
|
|
187
|
+
],
|
|
188
|
+
"currentVersion": "16.3.0",
|
|
189
|
+
"versionCheckedAt": "2026-08-12T14:33:11.062Z",
|
|
190
|
+
"checksum": "9d5d2503e2e8aa7ed1c3f0cb972c78e64b2e3aae5f3ad264bb0a79bd179708f0",
|
|
191
|
+
"retrievedAt": "2026-08-12T14:33:11.062Z"
|
|
192
|
+
},
|
|
193
|
+
{
|
|
194
|
+
"id": "PG-BOSS-NPM",
|
|
195
|
+
"service": "pg-boss job queue",
|
|
196
|
+
"kind": "package-registry",
|
|
197
|
+
"stability": "stable",
|
|
198
|
+
"thresholdDays": 30,
|
|
199
|
+
"critical": false,
|
|
200
|
+
"urls": {
|
|
201
|
+
"primary": "https://registry.npmjs.org/pg-boss/latest"
|
|
202
|
+
},
|
|
203
|
+
"versionDetection": {
|
|
204
|
+
"type": "npm",
|
|
205
|
+
"package": "pg-boss"
|
|
206
|
+
},
|
|
207
|
+
"topics": [
|
|
208
|
+
"jobs"
|
|
209
|
+
],
|
|
210
|
+
"affected": [
|
|
211
|
+
"references/pinned-facts.md",
|
|
212
|
+
"references/ai-agents.md"
|
|
213
|
+
],
|
|
214
|
+
"currentVersion": "12.27.0",
|
|
215
|
+
"versionCheckedAt": "2026-08-12T14:33:11.062Z",
|
|
216
|
+
"checksumScope": "http-body",
|
|
217
|
+
"checksum": "abf4bc2795e2df03181a21dfd29c7b9234c933a9dcafa72b4583d590cad609da",
|
|
218
|
+
"retrievedAt": "2026-08-12T14:33:41.513Z"
|
|
219
|
+
},
|
|
220
|
+
{
|
|
221
|
+
"id": "FLUTTER-RELEASES",
|
|
222
|
+
"service": "Flutter release notes",
|
|
223
|
+
"kind": "official-docs",
|
|
224
|
+
"stability": "vendor-docs",
|
|
225
|
+
"thresholdDays": 30,
|
|
226
|
+
"critical": false,
|
|
227
|
+
"urls": {
|
|
228
|
+
"primary": "https://docs.flutter.dev/release/release-notes"
|
|
229
|
+
},
|
|
230
|
+
"versionDetection": {
|
|
231
|
+
"type": "manual-review"
|
|
232
|
+
},
|
|
233
|
+
"topics": [
|
|
234
|
+
"flutter"
|
|
235
|
+
],
|
|
236
|
+
"affected": [
|
|
237
|
+
"references/pinned-facts.md",
|
|
238
|
+
"references/mobile.md"
|
|
239
|
+
],
|
|
240
|
+
"checksum": "94f9df6f67615ee05d826995f9709309c5453d0d8e4be11232ca5d463929ed2b",
|
|
241
|
+
"retrievedAt": "2026-08-12T14:33:11.062Z"
|
|
242
|
+
}
|
|
243
|
+
]
|
|
244
|
+
}
|
|
@@ -4,26 +4,22 @@ Condensed operational playbook. The authoritative policies live at the repo root
|
|
|
4
4
|
|
|
5
5
|
## Semver for skill content
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
Content is advisory prose and decision tables — no rule IDs, no machine-extracted rule format.
|
|
8
8
|
|
|
9
9
|
| Bump | Content change |
|
|
10
10
|
|---|---|
|
|
11
|
-
| MAJOR | Removing or renaming a
|
|
12
|
-
| MINOR | New
|
|
13
|
-
| PATCH | Factual refreshes: version pins, vendor mechanism names, URLs, registry checksums.
|
|
11
|
+
| MAJOR | Removing or renaming a skill. A breaking change to a per-project profile format (e.g. `.vegastack/arch.md`) that invalidates existing committed profiles. |
|
|
12
|
+
| MINOR | New reference file or reference section. New or changed recorded decision (e.g. a new "use/not/why" row, a new red line). New skill. |
|
|
13
|
+
| PATCH | Factual refreshes: pinned-fact updates, version pins, vendor mechanism names, URLs, registry checksums. Wording clarifications that don't change the recorded decision. Test/fixture-only changes. |
|
|
14
14
|
|
|
15
15
|
Installer/CLI changes follow ordinary semver on the same package version; a release takes the highest bump either side requires.
|
|
16
16
|
|
|
17
|
-
##
|
|
17
|
+
## One version identity
|
|
18
18
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
- Bumping the **package** (even MAJOR) must never invalidate a deployed profile — profiles bind to the foundation version.
|
|
25
|
-
- Bumping the **foundation** version is a content-contract event: it requires a compatibility entry describing how existing baselines are treated, and at minimum a MINOR package release.
|
|
26
|
-
- Each identity has one source of truth; never introduce additional copies of either number.
|
|
19
|
+
There is a single source of truth: the **package version** (`packages/cli/package.json`,
|
|
20
|
+
changesets-managed) — the npm release identity for the installer and every bundled skill's
|
|
21
|
+
content snapshot. No skill tracks a separate content-contract version, and no per-project
|
|
22
|
+
profile carries a schema version to validate against.
|
|
27
23
|
|
|
28
24
|
## Release flow (tag-driven)
|
|
29
25
|
|
|
@@ -44,7 +40,7 @@ Contributors do not bump versions in PRs; releases are maintainer-driven.
|
|
|
44
40
|
|
|
45
41
|
## Rename a skill
|
|
46
42
|
|
|
47
|
-
|
|
43
|
+
Skill names are consumer-facing identifiers — treat a rename as a stable-ID break:
|
|
48
44
|
|
|
49
45
|
1. Rename the directory and the frontmatter `name` in the same commit — they must always stay equal.
|
|
50
46
|
2. Update every wiring point in the same PR: the packaging allowlist in `packages/cli/scripts/sync-skill.mjs`, the root README skills table row, and any cross-skill or docs links.
|
|
@@ -60,4 +56,4 @@ Derived from the stable-ID logic in content-versioning (skill names are consumer
|
|
|
60
56
|
|
|
61
57
|
## Refresh branches
|
|
62
58
|
|
|
63
|
-
Branches named `refresh/**` are reserved for the automated freshness loop and are CI-restricted to `skills/*/refresh
|
|
59
|
+
Branches named `refresh/**` are reserved for the automated freshness loop and are CI-restricted to `skills/*/refresh/`. Human content changes go on normal branches. Never hand-edit checksums/versions/timestamps anywhere — CI re-fetches claimed baselines, so hand-edited values cannot merge.
|
|
@@ -10,13 +10,13 @@ Instructions for the scheduled refresh agent (and any human running a manual ref
|
|
|
10
10
|
|
|
11
11
|
## How to refresh
|
|
12
12
|
|
|
13
|
-
The deterministic runner is repo-shared
|
|
13
|
+
The deterministic runner is repo-shared, hosted at `tooling/refresh/`. Run from the repo root:
|
|
14
14
|
|
|
15
15
|
1. **Deterministic pass first** (no LLM judgment):
|
|
16
|
-
`node
|
|
16
|
+
`node tooling/refresh/refresh-evidence.mjs --registry skills/skill-maintainer/refresh/sources.json`
|
|
17
17
|
drift/stale/unavailable results are the work-list. Exit 1 with a critical entry means fail-closed: the run must not be silently skipped. All four sources here are critical.
|
|
18
18
|
2. **Accept verified changes** in the same code path:
|
|
19
|
-
`node
|
|
19
|
+
`node tooling/refresh/refresh-evidence.mjs --registry skills/skill-maintainer/refresh/sources.json --accept-baselines`
|
|
20
20
|
This writes registry, cache, and drift report together — never hand-edit checksums, versions, or timestamps; they must always come from a run. Baselines are runner-seeded; when a new source is added or a verified change is accepted, this accept-baselines invocation is the only sanctioned way to update them.
|
|
21
21
|
3. **Semantic verification** for every source the deterministic pass flagged: read the changed page (fetch the registry URL), decide whether any `<!-- source: X -->` marked sentence in `references/standards.md` (or the mirrored SKILL.md hard-limits row) is now wrong, and propose the minimal edit. Unlike version-pin registries, checksum drift here is presumed meaningful until a human reads the diff — these pages define the standards themselves. Editorial churn may be accepted silently only after that read.
|
|
22
22
|
4. **One standing refresh PR**, branch `refresh/weekly`, force-updated on every run (never stacked duplicates; the weekly workflow .github/workflows/refresh.yml maintains it). PR body lists: each changed source, old→new checksum, links to the evidence, and which marked sentences changed and why. A maintainer review is mandatory before merge.
|
package/skill-integrity.json
CHANGED
|
@@ -1,58 +1,34 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 2,
|
|
3
3
|
"skills": {
|
|
4
|
-
"
|
|
4
|
+
"architect": {
|
|
5
5
|
"files": {
|
|
6
|
-
"SKILL.md": "
|
|
7
|
-
"agents/openai.yaml": "
|
|
8
|
-
"assets/adr-template.md": "
|
|
9
|
-
"assets/
|
|
10
|
-
"
|
|
11
|
-
"
|
|
12
|
-
"
|
|
13
|
-
"
|
|
14
|
-
"
|
|
15
|
-
"references/
|
|
16
|
-
"references/
|
|
17
|
-
"references/
|
|
18
|
-
"references/
|
|
19
|
-
"references/
|
|
20
|
-
"references/
|
|
21
|
-
"
|
|
22
|
-
"
|
|
23
|
-
"references/architecture/durable-execution.md": "4dd1c7d69e41fb0abf7f469c8eadd1695b15c502e0219108c76d8aea06f9ffe6",
|
|
24
|
-
"references/architecture/flutter.md": "f024292b89b4667c65993bba906fb16afd278824f205f0e39c96a58384c6f423",
|
|
25
|
-
"references/architecture/foundation.md": "19536e03fdbb8720e263600a298b11e980cf6c24a724f8692db83b04302b39f1",
|
|
26
|
-
"references/architecture/hosting-reliability.md": "c69b00a354d78e2a7b2845cddc0d8a642911bc009efefa141075d1d774756142",
|
|
27
|
-
"references/architecture/identity-tenancy.md": "5fb2e5d74ae24ad2efe3ba01c06b8fcc16ba1dce1b9c531b7d955352af38d4c2",
|
|
28
|
-
"references/architecture/model-lifecycle.md": "eacdeade0fa88caaca11de9a9e69f0db8a9ecfc8b472070afb7158f5e30f6ba2",
|
|
29
|
-
"references/architecture/models-observability.md": "5501655b71d85e9653e5a8c276e481e2765b2a0c67c5bc23759f869529278b94",
|
|
30
|
-
"references/architecture/realtime-channels.md": "a95738c431f3f4c8c42c153a0b940897bae8d679ed0c2dfced3cb1c4c9c67ca5",
|
|
31
|
-
"references/architecture/security-privacy.md": "28d8d1a6347df95807d274829b2fbbd852c07a74d52d7e0be18d208b559504ea",
|
|
32
|
-
"references/architecture/topology-monorepo.md": "fdad26c8eaa32b977139e6f70c90a3954332a1fa6dd6e8d98bc9fb7c5a613117",
|
|
33
|
-
"references/architecture/web.md": "560957d179f9372ff01e3e216fdc8ad1cbee290ac95f42094d04da4af08a4c0a",
|
|
34
|
-
"references/foundation-compatibility.json": "dfbf106631ebd229d683b18855e126cdc4684a252038123b25d002724571ac14",
|
|
35
|
-
"references/golden-patterns.md": "0b00ece15e0ae20450d5c20409e7be34bab0d9b47c1614fb48cef780ca66605b",
|
|
36
|
-
"references/profile-governance.md": "b3ed0b4580c73fa0340c33267707ee9515071ac2b64bdc3dd56b8c558431a0b3",
|
|
37
|
-
"references/rule-model.json": "b9d4d13d152eecbb73a5add12c8ab9bb050e0f1001495c90c8b801d029b56598",
|
|
38
|
-
"references/workflows.md": "f54c284d831e14da00886fd186bc711bb8598fca4f2fc309f6caa197835e79ae",
|
|
39
|
-
"refresh/REFRESH.md": "db15a4304d0a3d3ab7f53722d30fb76609f1823cb2dc998f1807f092e79e008a",
|
|
40
|
-
"refresh/sources.json": "d35735620325c45693c8eddb5de5e7e1867cae19554e118b45867f8984250950",
|
|
41
|
-
"scripts/lib.mjs": "4ef4910518134eea7f89b6e397e5871f66a416429c75f59bf37e0864e4cf7ca0",
|
|
42
|
-
"scripts/profile-tool.mjs": "c13230b1c6a7bce9b91fb8a6a7d6eb84e9ef8855bf8b2a544e7bbfdc38e94877",
|
|
43
|
-
"scripts/refresh-evidence.mjs": "4759cedd15470247df23485b4c8d258e7e8f22cbceaac60f7e63cb42159af779",
|
|
44
|
-
"scripts/schema-validate.mjs": "329cca29ead284949107a5e0984588373522e9ef6624dffd18d4d207ef51fc99",
|
|
45
|
-
"scripts/validate-profile.mjs": "0b1f6b6d9e21267fd1ac545fd47fe46d9ecddc6a2efe67c5518e0845719a2b4d",
|
|
46
|
-
"scripts/verify-corpus.mjs": "d752efb00145afeaa7d2e758e10c5c11670253c1387326a52d6dda7fc67cda1c"
|
|
6
|
+
"SKILL.md": "70327518548075edd58f140710273df6dba6bd49327252a085b6881aae2f6663",
|
|
7
|
+
"agents/openai.yaml": "5bee46acf49a8c01856eec2a51a57aad95257c064302fca7f5e952016054b4e0",
|
|
8
|
+
"assets/adr-template.md": "72c84eebf90a7de8a6fc79c5165bada2683b38e86ccb1e3936e305f71be67d91",
|
|
9
|
+
"assets/arch-template.md": "a3dbfbd8b8f115e5cf3a922f26571ca469e0f4962d924e88bd9d8fd280b75d89",
|
|
10
|
+
"references/advisory.md": "ecba7d92cbf4dee9a6c9b7e0cb86f863748435be9fde4c0c8f493bcbc8e48249",
|
|
11
|
+
"references/ai-agents.md": "f39af3e8e6ea111157225c2786b428d66c944546898b08e45f12069633cf007e",
|
|
12
|
+
"references/data.md": "6c0384b53b66c914e39b4ca5f146cb50f1b91ca3ca5106e43b5cc2ce17bc59d5",
|
|
13
|
+
"references/infra.md": "cd56381da2d59fb2362fc162246269116cba92f796d0847cbac03e478b600add",
|
|
14
|
+
"references/mobile.md": "19932670613c064c979cf6d675c94213d3b12a5382d6fff4eacd58cb8b2a609c",
|
|
15
|
+
"references/pinned-facts.md": "07212409f708bd00ed69c77e98c61303ed1718514d907eb135c4c8ffe081196e",
|
|
16
|
+
"references/principles.md": "1d33c9f2912c04341c50398e30482c348d98a22ea218b06eca47b7aa247685b1",
|
|
17
|
+
"references/project-profile.md": "f3455643044260405ac47cdbeef5238e87a8ff9fbb285ce256a2aca9be9ff522",
|
|
18
|
+
"references/security.md": "4be060806c63c8c56559c293a818af581c2d7aec29f1830b57570dfda3c69d4a",
|
|
19
|
+
"references/stack.md": "b3aea9bb500b14c5bdb7576252e0af3be012d8c1f849d812c446e82ca2192af4",
|
|
20
|
+
"references/web.md": "df296df0a3c4fbbeda47f49ac96b4f0e9f4c5bba5dd68a428a3e390abd7f2261",
|
|
21
|
+
"refresh/REFRESH.md": "cdf7a06dd70f4b9483aa7a1db8c5e6c8e0a1f1724be22031d1aba1f609d69e22",
|
|
22
|
+
"refresh/sources.json": "38cf2a3fb13b5b4f3eec59d40d4faa4e5edcc0aecb66fbdd031aeefb92fecc01"
|
|
47
23
|
}
|
|
48
24
|
},
|
|
49
25
|
"skill-maintainer": {
|
|
50
26
|
"files": {
|
|
51
27
|
"SKILL.md": "bbbf15a9900d9d2009ccfbe163cface9654c81a9a84777718348d97b30739aeb",
|
|
52
28
|
"agents/openai.yaml": "0b89d4e6416cf20b448f5322f3d7433cfde333d2b4a05b42ed53db3759701fb4",
|
|
53
|
-
"references/release-ops.md": "
|
|
29
|
+
"references/release-ops.md": "a32c6dd6fff7b5c44d3d6dbcb32d7f3eb14f1ca61db85c0b31de032727952c3d",
|
|
54
30
|
"references/standards.md": "3646d0dd0560a87b333f70febf670b093c89b35111132cdb641b763bf184b02f",
|
|
55
|
-
"refresh/REFRESH.md": "
|
|
31
|
+
"refresh/REFRESH.md": "badbf807de2b2b38a7acb77d4e5a82ec7677afa1cb97abef34c429a81b855508",
|
|
56
32
|
"refresh/sources.json": "cf38cdf8123a50ea7ef2d1466a87faa648c12e5bc90d9ee9b6ae45632e7d0800"
|
|
57
33
|
}
|
|
58
34
|
},
|