@friedbotstudio/create-baseline 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.
@@ -0,0 +1,234 @@
1
+ // Domain — tier dispatch + BASE-content recovery + semantic-merge staging.
2
+ // Consumed by src/cli/merge.js's customized-file branch. See
3
+ // docs/specs/upgrade-flow-rework.md §Behavior #2/#3/#4/#5/#6.
4
+
5
+ import { mkdir, mkdtemp, readFile, readdir, unlink, writeFile } from 'node:fs/promises';
6
+ import { existsSync } from 'node:fs';
7
+ import { dirname, join, resolve, sep } from 'node:path';
8
+ import { tmpdir } from 'node:os';
9
+ import { spawnSync } from 'node:child_process';
10
+ import { createHash, randomUUID } from 'node:crypto';
11
+
12
+ export class NoBaseError extends Error {
13
+ constructor(message, opts = {}) {
14
+ super(message);
15
+ this.name = 'NoBaseError';
16
+ this.kind = opts.kind ?? 'unknown';
17
+ this.rel = opts.rel ?? null;
18
+ if (opts.cause) this.cause = opts.cause;
19
+ }
20
+ }
21
+
22
+ export async function resolveBase(rel, baseline_version, target, opts = {}) {
23
+ const { oldManifest = null, pack = null } = opts;
24
+ const expectedSha = readExpectedSha(oldManifest, rel);
25
+ const cached = await readCacheIfPresent(target, rel);
26
+ if (cached) {
27
+ if (expectedSha && sha256(cached) === expectedSha) return cached;
28
+ if (expectedSha) {
29
+ throw new NoBaseError(`cache sha mismatch for ${rel}`, { kind: 'cache_sha_mismatch', rel });
30
+ }
31
+ return cached;
32
+ }
33
+ if (!baseline_version) {
34
+ throw new NoBaseError(`legacy manifest; cannot recover BASE for ${rel}`, { kind: 'legacy_manifest', rel });
35
+ }
36
+ const fetched = await fetchFromNpm(rel, baseline_version, pack);
37
+ if (expectedSha && sha256(fetched) !== expectedSha) {
38
+ throw new NoBaseError(`npm tarball sha mismatch for ${rel}`, { kind: 'npm_sha_mismatch', rel });
39
+ }
40
+ await writeCacheThrough(target, rel, fetched);
41
+ return fetched;
42
+ }
43
+
44
+ export async function findPendingStage(target) {
45
+ const stageRoot = join(target, '.claude/state/upgrade');
46
+ if (!existsSync(stageRoot)) return null;
47
+ const stages = await listSubdirs(stageRoot);
48
+ for (const ts of stages) {
49
+ const manifestPath = join(stageRoot, ts, 'manifest.json');
50
+ if (!existsSync(manifestPath)) continue;
51
+ const pending = await readPendingFiles(manifestPath);
52
+ if (pending.length > 0) return { stage_ts: ts, files: pending };
53
+ }
54
+ return null;
55
+ }
56
+
57
+ export async function dispatchByTier(rel, tier, ctx) {
58
+ if (tier === 'BINARY_PROMPT') {
59
+ return { kind: 'SKIP_CUSTOMIZED', path: rel, reason: 'tier BINARY_PROMPT: user prompt deferred' };
60
+ }
61
+ if (tier === 'MECHANICAL') return runMechanicalMerge(rel, ctx);
62
+ if (tier === 'SEMANTIC') return runSemanticStage(rel, ctx);
63
+ throw new Error(`unknown tier: ${tier}`);
64
+ }
65
+
66
+ export async function writeStage(ctx, rel, baseBuf, incomingBuf, localBuf) {
67
+ if (!ctx.stageRunTs) ctx.stageRunTs = stageTimestamp();
68
+ const stageDir = join(ctx.target, '.claude/state/upgrade', ctx.stageRunTs);
69
+ await mkdir(stageDir, { recursive: true });
70
+ await writeStageArtifact(stageDir, `${rel}.baseline-base`, baseBuf);
71
+ await writeStageArtifact(stageDir, `${rel}.baseline-incoming`, incomingBuf);
72
+ await appendToStageManifest(stageDir, ctx, rel, baseBuf, incomingBuf, localBuf);
73
+ }
74
+
75
+ // --- foundation helpers ---
76
+
77
+ function sha256(buf) {
78
+ return createHash('sha256').update(buf).digest('hex');
79
+ }
80
+
81
+ function readExpectedSha(oldManifest, rel) {
82
+ const entry = oldManifest?.files?.[rel];
83
+ if (typeof entry === 'string') return entry;
84
+ if (entry && typeof entry === 'object' && typeof entry.sha256 === 'string') return entry.sha256;
85
+ return null;
86
+ }
87
+
88
+ async function readCacheIfPresent(target, rel) {
89
+ const cachePath = join(target, '.claude/.baseline-prior', rel);
90
+ if (!existsSync(cachePath)) return null;
91
+ return await readFile(cachePath);
92
+ }
93
+
94
+ async function writeCacheThrough(target, rel, bytes) {
95
+ const cachePath = join(target, '.claude/.baseline-prior', rel);
96
+ await mkdir(dirname(cachePath), { recursive: true });
97
+ await writeFile(cachePath, bytes);
98
+ }
99
+
100
+ async function fetchFromNpm(rel, baseline_version, packOverride) {
101
+ const packFn = packOverride ?? defaultPack;
102
+ const spec = `@friedbotstudio/create-baseline@${baseline_version}`;
103
+ let result;
104
+ try {
105
+ result = await packFn(spec);
106
+ } catch (err) {
107
+ throw new NoBaseError(`npm fetch failed for ${rel}: ${err.message}`, {
108
+ kind: 'npm_fetch_failed', rel, cause: err,
109
+ });
110
+ }
111
+ const bytes = await extractFromPackResult(result, rel);
112
+ if (!bytes) {
113
+ throw new NoBaseError(`npm tarball missing ${rel}`, { kind: 'npm_missing_file', rel });
114
+ }
115
+ return bytes;
116
+ }
117
+
118
+ async function defaultPack(spec) {
119
+ const mod = await import('libnpmpack');
120
+ const fn = mod.default ?? mod.pack ?? mod;
121
+ return fn(spec);
122
+ }
123
+
124
+ async function extractFromPackResult(result, rel) {
125
+ if (result instanceof Map) return result.get(rel) ?? null;
126
+ if (Buffer.isBuffer(result) || result instanceof Uint8Array) {
127
+ return extractFromTarball(Buffer.from(result), rel);
128
+ }
129
+ throw new Error(`unsupported pack result type: ${typeof result}`);
130
+ }
131
+
132
+ async function extractFromTarball(tarballBytes, rel) {
133
+ const tmp = await mkdtemp(join(tmpdir(), 'baseline-prior-extract-'));
134
+ const tmpRoot = resolve(tmp) + sep;
135
+ const result = spawnSync('tar', ['-xz', '-C', tmp, '-f', '-'], { input: tarballBytes });
136
+ if (result.status !== 0) {
137
+ throw new Error(`tar extract failed: ${(result.stderr || '').toString()}`);
138
+ }
139
+ const candidate = join(tmp, 'package', rel);
140
+ // Defense in depth: although bsdtar (macOS default) and GNU tar both refuse
141
+ // absolute paths and `..` components by default when extracting, validate
142
+ // the candidate resolves under tmp before reading. Refuses to follow a
143
+ // malicious tarball that somehow planted bytes outside the extraction root.
144
+ const resolved = resolve(candidate);
145
+ if (!resolved.startsWith(tmpRoot)) {
146
+ throw new NoBaseError(`tarball entry escapes extraction root: ${rel}`, { kind: 'tarball_path_traversal', rel });
147
+ }
148
+ if (!existsSync(resolved)) return null;
149
+ return await readFile(resolved);
150
+ }
151
+
152
+ async function listSubdirs(root) {
153
+ const entries = await readdir(root, { withFileTypes: true });
154
+ return entries.filter((e) => e.isDirectory()).map((e) => e.name).sort();
155
+ }
156
+
157
+ async function readPendingFiles(manifestPath) {
158
+ try {
159
+ const manifest = JSON.parse(await readFile(manifestPath, 'utf8'));
160
+ return (manifest.files || []).filter((f) => f.status === 'PENDING').map((f) => f.rel);
161
+ } catch {
162
+ return [];
163
+ }
164
+ }
165
+
166
+ // --- domain helpers ---
167
+
168
+ async function runMechanicalMerge(rel, ctx) {
169
+ const base = await resolveBase(rel, ctx.baseline_version, ctx.target, {
170
+ oldManifest: ctx.oldManifest, pack: ctx.pack,
171
+ });
172
+ const remote = await readFile(join(ctx.templateDir, rel));
173
+ const localPath = join(ctx.target, rel);
174
+ const tmpBase = join(tmpdir(), `merge-base-${randomUUID()}`);
175
+ const tmpRemote = join(tmpdir(), `merge-remote-${randomUUID()}`);
176
+ await writeFile(tmpBase, base);
177
+ await writeFile(tmpRemote, remote);
178
+ const result = spawnSync('git', ['merge-file', '--diff3', localPath, tmpBase, tmpRemote], { encoding: 'utf8' });
179
+ await unlink(tmpBase).catch(() => {});
180
+ await unlink(tmpRemote).catch(() => {});
181
+ if (result.status === 0) {
182
+ return { kind: 'MECHANICAL_MERGE_CLEAN', path: rel, reason: 'git merge-file clean' };
183
+ }
184
+ if (typeof result.status === 'number' && result.status > 0 && result.status < 128) {
185
+ return { kind: 'MECHANICAL_MERGE_CONFLICTED', path: rel, hunks: result.status, reason: `${result.status} conflict hunk(s)` };
186
+ }
187
+ throw new Error(`git merge-file failed for ${rel}: status=${result.status} stderr=${(result.stderr || '').toString()}`);
188
+ }
189
+
190
+ async function runSemanticStage(rel, ctx) {
191
+ const base = await resolveBase(rel, ctx.baseline_version, ctx.target, {
192
+ oldManifest: ctx.oldManifest, pack: ctx.pack,
193
+ });
194
+ const remote = await readFile(join(ctx.templateDir, rel));
195
+ const local = await readFile(join(ctx.target, rel));
196
+ await writeStage(ctx, rel, base, remote, local);
197
+ return { kind: 'SEMANTIC_MERGE_STAGED', path: rel, reason: 'staged for /upgrade-project' };
198
+ }
199
+
200
+ async function writeStageArtifact(stageDir, rel, bytes) {
201
+ const dst = join(stageDir, rel);
202
+ await mkdir(dirname(dst), { recursive: true });
203
+ await writeFile(dst, bytes);
204
+ }
205
+
206
+ async function appendToStageManifest(stageDir, ctx, rel, baseBuf, incomingBuf, localBuf) {
207
+ const manifestPath = join(stageDir, 'manifest.json');
208
+ const manifest = existsSync(manifestPath)
209
+ ? JSON.parse(await readFile(manifestPath, 'utf8'))
210
+ : newStageManifest(ctx);
211
+ manifest.files.push({
212
+ rel,
213
+ base_sha256: sha256(baseBuf),
214
+ incoming_sha256: sha256(incomingBuf),
215
+ local_sha256: sha256(localBuf),
216
+ status: 'PENDING',
217
+ });
218
+ await writeFile(manifestPath, JSON.stringify(manifest, null, 2) + '\n');
219
+ }
220
+
221
+ function newStageManifest(ctx) {
222
+ return {
223
+ stage_version: 1,
224
+ slug: ctx.slug ?? 'upgrade',
225
+ created_at: new Date().toISOString(),
226
+ baseline_version_from: ctx.oldManifest?.baseline_version ?? 'unknown',
227
+ baseline_version_to: ctx.baseline_version ?? 'unknown',
228
+ files: [],
229
+ };
230
+ }
231
+
232
+ function stageTimestamp() {
233
+ return new Date().toISOString().replace(/[:.]/g, '-');
234
+ }
@@ -11,7 +11,7 @@
11
11
 
12
12
  **Mandatory binding language.** Each numbered section (§) below specifies a binding requirement for the baseline. Implementations SHALL conform; `CLAUDE.md` Articles SHALL reference the corresponding §; project amendments (per `CLAUDE.md` Art. X) SHALL NOT contradict any § here.
13
13
 
14
- The baseline turns soft engineering rules (no unauthorized commits, no stubs, no mocks of internal code, no self-approved specs) into structural guarantees enforced by write-boundary hooks. Eleven workflow phases plus one stripped-down chore track (skips TDD; runs verify + archive mandatorily, simplify/integrate/document conditionally), seventeen write/run-boundary guards plus four lifecycle hooks plus one input-boundary hook (twenty-two hook scripts total — twenty `.sh` + two `.mjs` after the JS-port pilot), thirty-seven skills, one subagent, and four consent gates. Decisions live in main context; the lone subagent (`swarm-worker`) executes pre-decided recipes in parallel worktrees during `/swarm-dispatch`. Every artifact is archived; every third-party API is looked up against live docs. Project memory accumulates across sessions in `.claude/memory/` — auto-extracted by a Stop hook, curated in main context via `/memory-flush`, self-healing via re-verification.
14
+ The baseline turns soft engineering rules (no unauthorized commits, no stubs, no mocks of internal code, no self-approved specs) into structural guarantees enforced by write-boundary hooks. Eleven workflow phases plus one stripped-down chore track (skips TDD; runs verify + archive mandatorily, simplify/integrate/document conditionally), seventeen write/run-boundary guards plus four lifecycle hooks plus one input-boundary hook (twenty-two hook scripts total — twenty `.sh` + two `.mjs` after the JS-port pilot), thirty-eight skills, one subagent, and four consent gates. Decisions live in main context; the lone subagent (`swarm-worker`) executes pre-decided recipes in parallel worktrees during `/swarm-dispatch`. Every artifact is archived; every third-party API is looked up against live docs. Project memory accumulates across sessions in `.claude/memory/` — auto-extracted by a Stop hook, curated in main context via `/memory-flush`, self-healing via re-verification.
15
15
 
16
16
  ---
17
17
 
@@ -110,7 +110,7 @@ Applies to every language. Mappings for TSX, Node, Python, Go, Rust ship inside
110
110
  │ │ └── lib/common.sh # shared helpers
111
111
  │ ├── agents/ # 1 subagent: swarm-worker (rendered from src/agents/swarm-worker.template.md)
112
112
  │ ├── commands/ # 5 consent/bootstrap gates (user-only — structurally)
113
- │ ├── skills/ # 37 skills: artifact (4) + phases (11) + workers (5) + spec helpers (4) + orchestration (3) + memory (1) + shared globals (7) + audit (1) + alt tracks (1)
113
+ │ ├── skills/ # 38 skills: artifact (4) + phases (11) + workers (5) + spec helpers (4) + orchestration (3) + memory (1) + shared globals (7) + audit (1) + alt tracks (1) + maintenance (1)
114
114
  │ ├── memory/ # project memory: 7 canonical files + _pending.md (gitignored body) + README.md
115
115
  │ └── state/ # runtime: workflow.json, approvals, swarm plans, verdicts, logs
116
116
  ├── src/ # pristine ship-time templates (overlay source for `npx @friedbotstudio/create-baseline`)
@@ -181,7 +181,7 @@ The baseline ships exactly one subagent. The architectural reason: subagents los
181
181
 
182
182
  **Automated re-rendering by `/init-project`.** Step 6.4 re-renders `swarm-worker.md` from the template, driven by the recommender's `additions.swarm_worker_skills`. The recommender does **not** propose new subagent types — only stack-skill additions for the existing worker. Specialization happens via skills loaded into the worker's context, not via parallel agent personas; new decision-making roles belong in skills, which run in main context.
183
183
 
184
- ### §4.3 Skills (37)
184
+ ### §4.3 Skills (38)
185
185
 
186
186
  Each at `.claude/skills/<name>/SKILL.md`, frontmatter `name` + `description`, plus optional `template.md` (artifact skills) or helper scripts.
187
187
 
@@ -516,7 +516,7 @@ Seed-level requirement: no stale workflow artifacts in the working tree after co
516
516
 
517
517
  **Step 4:** Write `src/agents/swarm-worker.template.md` (canonical-body store, per §4.2) — the only subagent template. Then render `.claude/agents/swarm-worker.md` from it with default tokens. The template carries four tokens — `{{NAME}}`, `{{DESCRIPTION}}`, `{{SKILLS}}`, `{{ROLE_LINE}}`. Default `SKILLS` is the YAML list block ` - scenario\n - implement` (the worker's two mandatory sub-skills). Render-parity holds at this stage. `/init-project` later re-renders the worker with stack-aware tokens when the recommender flags stack-specific skills to preload via `additions.swarm_worker_skills`.
518
518
 
519
- **Step 5:** Write `.claude/skills/` for the 37 skills (§4.3) — 29 workflow/worker/orchestration/memory/alt-track skills you author (the +1 over 28 is the `changelog` Phase 11.5 skill) plus 7 shared globals plus 1 audit skill. The breakdown: artifact drafting (4) + workflow phases (10) + phase workers (5: `scenario`, `implement`, `verify`, `prose`, `design-ui`) + spec helpers (4: `spec-lint`, `spec-render`, `spec-diagram-review`, `spec-traceability-review`) + orchestration (3: `harness`, `swarm-plan`, `swarm-dispatch`) + memory (1: `memory-flush`) + shared globals (7: `claude-automation-recommender`, `code-structure`, `humanizer`, `documentation`, `technical-tutorials`, `copywriting`, `impeccable`) + drift defender (1: `audit-baseline`) + alternate tracks (1: `chore`). The vendored `claude-automation-recommender` (Apache 2.0, from `claude-code-setup`), the writing/quality globals, and the design global ship unchanged with their licenses intact. Artifact skills (intake, brd, spec, rca) each ship a `template.md`. Helper scripts: swarm-plan gets `validate.sh`, swarm-dispatch gets `swarm_merge.sh`, spec-render gets `render.sh`, spec-lint gets `lint.sh`, archive gets `archive.sh`, audit-baseline gets `audit.sh`. All helper scripts `chmod +x`.
519
+ **Step 5:** Write `.claude/skills/` for the 38 skills (§4.3) — 29 workflow/worker/orchestration/memory/alt-track skills you author (the +1 over 28 is the `changelog` Phase 11.5 skill) plus 7 shared globals plus 1 audit skill plus 1 maintenance skill. The breakdown: artifact drafting (4) + workflow phases (10) + phase workers (5: `scenario`, `implement`, `verify`, `prose`, `design-ui`) + spec helpers (4: `spec-lint`, `spec-render`, `spec-diagram-review`, `spec-traceability-review`) + orchestration (3: `harness`, `swarm-plan`, `swarm-dispatch`) + memory (1: `memory-flush`) + shared globals (7: `claude-automation-recommender`, `code-structure`, `humanizer`, `documentation`, `technical-tutorials`, `copywriting`, `impeccable`) + drift defender (1: `audit-baseline`) + alternate tracks (1: `chore`) + maintenance (1: `upgrade-project`). The vendored `claude-automation-recommender` (Apache 2.0, from `claude-code-setup`), the writing/quality globals, and the design global ship unchanged with their licenses intact. Artifact skills (intake, brd, spec, rca) each ship a `template.md`. Helper scripts: swarm-plan gets `validate.sh`, swarm-dispatch gets `swarm_merge.sh`, spec-render gets `render.sh`, spec-lint gets `lint.sh`, archive gets `archive.sh`, audit-baseline gets `audit.sh`. All helper scripts `chmod +x`.
520
520
 
521
521
  **Step 6:** Write `.claude/commands/*.md` for the 4 gates (§4.4). All carry `disable-model-invocation: true` as belt-and-braces; structural user-only is enforced by their directory.
522
522
 
@@ -591,9 +591,9 @@ Until `/init-project` runs, this section stays empty. Once populated, every fiel
591
591
 
592
592
  ## §17 — Skill provenance and the baseline manifest
593
593
 
594
- A skill at `.claude/skills/<slug>/SKILL.md` is **baseline-owned** iff its YAML frontmatter declares `owner: baseline`. Baseline-owned skills are those that ship with the baseline; every other skill on disk — those without an `owner:` field, or those declaring `owner: user` — is user/third-party and out-of-scope of baseline audit checks. Absence-of-`owner` is the deliberate default so a project that already has its own skills can install the baseline without annotating any of those files. The build script `scripts/build-manifest.mjs` reads each `owner:` value at release time and emits the canonical baseline-skill set into `obj/template/manifest.json` under `owners.skills` (a JSON object mapping slug → `"baseline"`). The CLI mirrors this manifest verbatim to `<target>/.claude/.baseline-manifest.json` on `freshInstall`/`forceInstall`/`merge`.
594
+ A skill at `.claude/skills/<slug>/SKILL.md` is **baseline-owned** iff its YAML frontmatter declares `owner: baseline`. Baseline-owned skills are those that ship with the baseline; every other skill on disk — those without an `owner:` field, or those declaring `owner: user` — is user/third-party and out-of-scope of baseline audit checks. Absence-of-`owner` is the deliberate default so a project that already has its own skills can install the baseline without annotating any of those files. The build script `scripts/build-manifest.mjs` reads each `owner:` value at release time and emits the canonical baseline-skill set into the shipped manifest at `obj/template/.claude/manifest.json` under `owners.skills` (a JSON object mapping slug → `"baseline"`). The recursive install copies the manifest into the consumer target at `<target>/.claude/manifest.json` (same in-tree path, no special-case). The CLI separately writes `<target>/.claude/.baseline-manifest.json` post-install on `freshInstall`/`forceInstall`/`merge` — that file is the runtime snapshot of the target's actual on-disk hashes, consumed by `doctor` and `upgrade`. The two files coexist by design: the shipped manifest is frozen at release time and carries `owners.skills`; the runtime manifest is generated at install time and is hash-only.
595
595
 
596
- The audit at `.claude/skills/audit-baseline/audit.sh` consumes `manifest.owners.skills` as the canonical baseline-skill enumeration (replacing the previous hard-coded `EXPECTED_SKILLS` set). For every baseline-owned skill, the audit re-derives sha256 hashes from `manifest.files` and compares against on-disk content; a mismatch is reported as `hash mismatch at <path>` against the named slug. A baseline skill present in the manifest but absent from disk is reported as `baseline skill missing`. A SKILL.md whose `owner:` field is present but carries an invalid value (anything other than `baseline` or `user`) is reported as `invalid owner=<value>`. SKILL.md files without an `owner:` field are treated as user/third-party and silently skipped — they are excluded from the baseline count, the names-match check, and the hash-drift check, so installing the baseline into a project that already has its own skills never breaks the audit.
596
+ The audit at `.claude/skills/audit-baseline/audit.sh` consumes `manifest.owners.skills` as the canonical baseline-skill enumeration (replacing the previous hard-coded `EXPECTED_SKILLS` set). It reads the manifest from `<root>/.claude/manifest.json` first (consumer projects) and falls back to `<root>/obj/template/.claude/manifest.json` (the baseline dev repo where `npm run build` writes the manifest). For every baseline-owned skill, the audit re-derives sha256 hashes from `manifest.files` and compares against on-disk content; a mismatch is reported as `hash mismatch at <path>` against the named slug. A baseline skill present in the manifest but absent from disk is reported as `baseline skill missing`. A SKILL.md whose `owner:` field is present but carries an invalid value (anything other than `baseline` or `user`) is reported as `invalid owner=<value>`. SKILL.md files without an `owner:` field are treated as user/third-party and silently skipped — they are excluded from the baseline count, the names-match check, and the hash-drift check, so installing the baseline into a project that already has its own skills never breaks the audit.
597
597
 
598
598
  The audit also verifies constitutional citation: CLAUDE.md SHALL contain the literal string "Article XI" and a reference to the manifest, and `docs/init/seed.md` SHALL contain "§17" and a manifest reference. Missing citations trigger FAIL with `CLAUDE.md missing Article XI citation` or `seed.md missing §17 citation`.
599
599
 
@@ -1,275 +0,0 @@
1
- {
2
- "manifest_version": 2,
3
- "generated_at": "2026-05-18T19:07:49.408Z",
4
- "files": {
5
- ".claude/agents/swarm-worker.md": "1735a220f268c9765cb22e0567b728803f2edd7776cbde51dd017a9f062ae41f",
6
- ".claude/bin/LICENSE": "a8dcf2775ab71a58c7d4cc935e3a8e9974e87bb7d6082ee25ef52f8140be8e07",
7
- ".claude/bin/NOTICE": "5438f6ed6e597c70d854466d8d822157757eed289723f82cb90948e0bf4319e3",
8
- ".claude/commands/approve-spec.md": "aef2b6b0d71692bba71ae691ff1a4405557806c8ccd64107bc197238d6ec359f",
9
- ".claude/commands/approve-swarm.md": "77467e3962792d8cdc2db7947e4a7c16481d5d27bf378f6dc0e415935a02680d",
10
- ".claude/commands/grant-commit.md": "92409e2ff76bb3db4707d6deffab35877f06ecd38af2b12ca103eb7333eb7b92",
11
- ".claude/commands/grant-push.md": "770e8bc3bf1097ecdf92b86dcf6e0cf7ef3a3251b73bf35cc0385f2e2d552319",
12
- ".claude/commands/init-project.md": "222f02f65ea639c904c43114642f11422a56d8dab8c1c2786b5876e17d3b0155",
13
- ".claude/hooks/artifact_template_guard.sh": "1592700602c98c8cb733ae3ce9638bf7c3414c5e5ef4fd566528e47765be3f39",
14
- ".claude/hooks/consent_gate_grant.mjs": "308704139bf6f090fa11fdb0668810351c70dfb102eb06138a6f4031efed3b5b",
15
- ".claude/hooks/destructive_cmd_guard.sh": "ec62ffeef60e07332766ecb93b9121c59e5f8aa695ba3d2def26072d9d18f63c",
16
- ".claude/hooks/env_guard.sh": "76ffc98fa9a2709526715132981699e46043183e2b1d043a05744a40384d1361",
17
- ".claude/hooks/git_commit_guard.mjs": "95449912110be43635c8130f06ff87d851fc0ebec89fda17b3290671710dfbf6",
18
- ".claude/hooks/harness_continuation.sh": "6ceca513b9f63cae021e93c0cb1e444627d94ed0aadf38d4b3da1f5a440b2204",
19
- ".claude/hooks/lib/common.mjs": "d3ad8d607d161bf11f1814f13aeb764a23de2565fcdc3ef39c85a1cad191a51f",
20
- ".claude/hooks/lib/common.sh": "c6d4501a1480ea34aafcd7c4b4a53cadcf75bff8def2d5d5370c098574382748",
21
- ".claude/hooks/lib/resume_writer.py": "9592fb72de966cb797e51322fbf0160a6784de34934bd6587768689a34bd03b5",
22
- ".claude/hooks/lint_runner.sh": "267e08dbd9af246c0af124c32ad4aeac48dfe20ac926244ed89855deb7ff7940",
23
- ".claude/hooks/memory_pre_compact.sh": "930a7d1e02a1214037ff8c5ab47b4fc4a76193536f75a1fd6f323ed8dc46292e",
24
- ".claude/hooks/memory_session_start.sh": "76625781d6cec1dc0d069926adad65c30010b07b1c0e24a2ac441c2981d2ecb5",
25
- ".claude/hooks/memory_stop.sh": "0e9473706d670830004b180e0cd25a0956149df2960ac0bdb35987c24b995c4a",
26
- ".claude/hooks/plantuml_syntax_guard.sh": "92e4e27377cd3d8b7036f4fae76c3be4a486b419bce9bfbcb8fef741e55138b5",
27
- ".claude/hooks/process_lifecycle_guard.sh": "1342df1cb0ca0d5ce54f254651092c4054903003070b328e9d2aca62e4d1a9a9",
28
- ".claude/hooks/setup_guard.sh": "119675c2b3b00414016958a9eebd6884578822f46695d2e636003e4ba0b7098b",
29
- ".claude/hooks/spec_approval_guard.sh": "062f80c36deac29217fb5add50aadb807ce9774f3a9703da9095237c2ce74a1c",
30
- ".claude/hooks/spec_design_calls_guard.sh": "6fd5d508c40beed47973ee783a8c7a43683f6e34e8a41ca010f0058bf0e37f11",
31
- ".claude/hooks/spec_diagram_presence_guard.sh": "786d720412c5ff9e3706961f0ffa1235f8c67f87c90e6917b041b916aabe6a12",
32
- ".claude/hooks/swarm_approval_guard.sh": "537869ae8143ccddc90803fd182ed8d4e00d5709710343c86174f2d3f502b98a",
33
- ".claude/hooks/swarm_boundary_guard.sh": "b8e4278ada1e187acc4ceefe4af3c4a083510a6dbc44c762f6977fe271f37b9e",
34
- ".claude/hooks/tdd_order_guard.sh": "b2325f53a9ecaea9e614f3f4888d02e8540a76dfba359ab86b9f82d297eccfcf",
35
- ".claude/hooks/test_runner.sh": "acabe2ec8096f2e54fc321f7561c4d3232c67e06b27a5c8b8f135c0fbf47a3f5",
36
- ".claude/hooks/tests/fixtures/ac008_byte_equal_reference.txt": "da3150ef2419899b2ff2df65acb7886f508e9136080bb72addf9ad9de892340f",
37
- ".claude/hooks/tests/fixtures/memory_stop_landmark_baseline.txt": "bf975e5d50c9ebfdce2f0ed49754213fe82dbac3d2c3335e74f696f34314c5a7",
38
- ".claude/hooks/tests/fixtures/regenerate-ac008.sh": "80b55fe7bdec492aefb9eaf32868c871d8da34a3cf31225ea51cf2bc12857bc0",
39
- ".claude/hooks/tests/memory_session_start_test.sh": "858eead3865aab364f2307a5ef2b74d772ca8c35ce2bbcbee96c762559f98f93",
40
- ".claude/hooks/tests/memory_stop_intent_test.sh": "9b32b906648bbdc2bb8cb51cd8bb609e6093f31bb45f99c9292cfc6105b6faae",
41
- ".claude/hooks/tests/regenerate_ac008_test.sh": "977ab5e3a0a43419bcd4ec9cbd5fbc54a107667d4acee5ac8c317ee6506e6b9f",
42
- ".claude/hooks/track_guard.sh": "cd79823bf4c24a35133ee6fc072e8c39bdfbc49042c698dcbeb2c36986f15c5f",
43
- ".claude/hooks/verify_pass_guard.sh": "a3aba3821ff7318499012032b82279ab6d04c1287e935d3a8b1bbf38b905c79f",
44
- ".claude/memory/README.md": "af088415c3430eab6353433ca9ad8c318324965ac0b9e5550adacebbf6b91503",
45
- ".claude/memory/_pending.md": "ae6407956aadd998c17ad5ad7150dbb21ccf49cc3375efe25b2d2ffb61c0a92a",
46
- ".claude/memory/_resume.md": "7ef4da663edc2ea35d19167f776e94b3f925072e9d8388841c42c5c6b81fc2f5",
47
- ".claude/memory/backlog.md": "4e124b7ecee5aa0918fd6d9a3bb232a68c7feff6fcf916b8562ed6513715db71",
48
- ".claude/memory/conventions.md": "3f3c6baedde55483acc75da4eb3f6e6b6b59ecba6e9b6334f0181a6dccc33e1e",
49
- ".claude/memory/decisions.md": "384984c8b67e2949f19c510b3c4c0d502dde9012063ee4c0e6dfb5fec3fb32af",
50
- ".claude/memory/landmarks.md": "e79626511e304654658e44e71c56f9316836481c6a4a0f0a0a2c1277c84143aa",
51
- ".claude/memory/landmines.md": "9df9b39bbcb91623f21caa506f69a71be888e2f728f93de29e5ffab5f6e5f923",
52
- ".claude/memory/libraries.md": "0ed3f69945c54825908143ca7c504a9b92529eddce63df8c70a9309293d4644a",
53
- ".claude/memory/pending-questions.md": "4b1d8be633b5f05eff66550b8fc98d6482bdf89536f21d6b975a1d8570b484b9",
54
- ".claude/project.json": "a81f9c1341a15831fe8dd558e376dfe38d5fd938aac6291a4c59529637a8d2c7",
55
- ".claude/settings.json": "feb7d2c004b6c12cef6410d54db8ad0abc818b2aa16b1942cfdb72808c21b30d",
56
- ".claude/skills/archive/SKILL.md": "5174e8b72ab1e830912c231052d1e535023d58f0808434fe1d4abce305b80318",
57
- ".claude/skills/archive/archive.sh": "29f5b3c8870d0665ce624c6d1b5770f691f1d19f82a201767d5685fc3b0a0b58",
58
- ".claude/skills/audit-baseline/SKILL.md": "86e9955a99ade89074571320b2b9b0780bc033d201968f62edcca35d9e25f7cb",
59
- ".claude/skills/audit-baseline/audit.sh": "8b8a7db4db2aba0e0dd9948e4472feabe568e06a5f4e752c10dcd3da655bedf3",
60
- ".claude/skills/audit-baseline/tests/fixtures/_pending_opener_only.md": "9c64d7ef0b3be48b3e87acd89f9ac638db956f2c7cc5adf569d9d97d16f18163",
61
- ".claude/skills/audit-baseline/tests/fixtures/preamble_full_empty_body.md": "b757223c9b4954882b7f4ac828de7d83a105f74ba0cdf0951fbbe19c07ae892d",
62
- ".claude/skills/audit-baseline/tests/fixtures/preamble_full_with_entries.md": "9fcd049b006a7474d182a04420df6b3af08e3b6777a2ec5b4031d661ba2f4c82",
63
- ".claude/skills/audit-baseline/tests/fixtures/preamble_no_opener.md": "ef189e0e9997598874b2e26ca9e626311cc7cb99d9460ac9ca36773fff42522e",
64
- ".claude/skills/audit-baseline/tests/fixtures/preamble_opener_only.md": "d5042563a9f2ae9aaf4a5a75ed3d8af3d63d2ae0a451fed67ffb7ee6b0463239",
65
- ".claude/skills/audit-baseline/tests/preamble_check_test.sh": "73239378e51528c37f7843ff540ddfed2cd0ee1b8259589bc7cdaefd71424d95",
66
- ".claude/skills/brd/SKILL.md": "260e5d18396de21b6842ad0bc5fe74b0e124f3c2e2a4ac2867eeb543c7c2c0a3",
67
- ".claude/skills/brd/template.md": "be4095b4bed70fcebc821ad92b0217db4fee1afb9a341a9e704d2c1869ec6f43",
68
- ".claude/skills/changelog/SKILL.md": "2a305b04be3fb44dd9766fae0344725600c2269276d5fe9496d068cebcc4969c",
69
- ".claude/skills/changelog/changelog.mjs": "662ae8142ea55c70375e45d874f97b40bcb85b0d6e5378393be56aba1b254eee",
70
- ".claude/skills/changelog/classifier.mjs": "e17cd4dacb48b5ebf3addd2f651e8e2465c10aa51958c11c9272faff32e379f2",
71
- ".claude/skills/changelog/state-writer.mjs": "a773f14eb1d7d990f64eb54f70720451db279954ea5cbd025ca15f1a8d39449d",
72
- ".claude/skills/changelog/tests/consent-expired_test.sh": "60351d32cb544af33a6929f898411e43d20ec258f620ebc08179754a74811cf1",
73
- ".claude/skills/changelog/tests/golden-path_test.sh": "1ef7cdaae2dbeea25f7165b182e4b2cc80e69f3cc918089552145421fcc35d26",
74
- ".claude/skills/changelog/tests/idempotent-reentry_test.sh": "af11b08744ab3743989f9ae8017b6f01a32373971f072c233ce28741783f5de0",
75
- ".claude/skills/changelog/tests/keepachangelog-unreleased-preserved_test.mjs": "981e1831893449667b1460b13b9ef9275cc3bd23b22cd6a3cfa3d56d239ed0ad",
76
- ".claude/skills/changelog/tests/non-git-shortcircuit_test.sh": "ec5760c8790a3cd5cb21e93bd1742a4f30115f0e4e4829a8f765fecb4ddba5f4",
77
- ".claude/skills/changelog/tests/preview-only_test.sh": "b30a6c4b94a1cb87596af317f460c57c62ecde257dcd81447932564ce9e542d2",
78
- ".claude/skills/changelog/tests/run.sh": "55ba1d59d67f3e43b07fae08a7059c4e04cfe963a09a2367528d509e748f3116",
79
- ".claude/skills/changelog/unreleased-writer.mjs": "a03d9080317e2fc9c4895b7b8c68efc2ab90497a9265091f5981859cda3d6885",
80
- ".claude/skills/changelog/version-preview.mjs": "3843093b08b5407012e53d601fa6d3d4d3ddc04ae4911d0e5ad015622585c67f",
81
- ".claude/skills/chore/SKILL.md": "3479c4ef4c7706928b54ed89678c3526c790e2aeb629674bd60e5a9e4b90d80d",
82
- ".claude/skills/claude-automation-recommender/LICENSE": "cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30",
83
- ".claude/skills/claude-automation-recommender/NOTICE": "2076093d5af61a10b585562e3b40fd76ce178c56e5eebde93efdc08b3c6bb81a",
84
- ".claude/skills/claude-automation-recommender/SKILL.md": "3e151ae30a9e364175a1d2d9914950cf8e766f1d021d3a4d26996052b3b6e5ab",
85
- ".claude/skills/claude-automation-recommender/references/hooks-patterns.md": "7b6e91b53aa0f1ed471fd66e177de17a88c1d6620ce95f5c8e8cdfebd20d939e",
86
- ".claude/skills/claude-automation-recommender/references/mcp-servers.md": "64a12ab24618e4987ba947638fb598683635e80db92f3253e87d5b06c878174d",
87
- ".claude/skills/claude-automation-recommender/references/plugins-reference.md": "6570ff4c853253b3f15fb62e5d540cbf0ce3371936437791dde8fb53b7d444f3",
88
- ".claude/skills/claude-automation-recommender/references/skills-reference.md": "b4b57d953526a07146d5757ca5332034b9b4b4eeba839e4bb08111398c94556f",
89
- ".claude/skills/claude-automation-recommender/references/subagent-templates.md": "7f9a107d8619ff96fea07d5a17da31b269cec0ee343e5a9ff643c0d6cb4ba944",
90
- ".claude/skills/code-structure/SKILL.md": "4fa79beb83f9171e973cd2373af12f007aeaf95d156edf3a8e7cf3e9c2c22ace",
91
- ".claude/skills/commit/SKILL.md": "7f22653ae6832a5fc5631774f78d3feabe47c5b21c5925ae8a77e656bbac1b9c",
92
- ".claude/skills/copywriting/LICENSE": "3d015bf779e8f6f4b9366e0862c0d560aa60979bbe8d90426cede05528dc5390",
93
- ".claude/skills/copywriting/NOTICE": "ffd65b16660e4e9cbf42c5ff9bdf67b482815ebedfb515bedb65c6eb54930a15",
94
- ".claude/skills/copywriting/SKILL.md": "4631aae3a65204a1dac89fbe7606481b867b30ae3f64482d337c1e6bd5b4c902",
95
- ".claude/skills/copywriting/evals/evals.json": "bb2958b15648d180d04b676a42a22b7e2317c8c3314a71a6b56612164f7550c5",
96
- ".claude/skills/copywriting/references/ai-writing-detection.md": "4a4bf54c70b8b81d851f6c65ca69f83e3388d8d6970f6eab131cbf4287f0f860",
97
- ".claude/skills/copywriting/references/copy-frameworks.md": "f387b6ed4b510efa9f0d3c459f4898971c8b0176e8c34185040cb264eca50186",
98
- ".claude/skills/copywriting/references/natural-transitions.md": "4ff23f8943af2f65b072f26f1c53ce55f19cc26d7be211c11cae8e34b43e859f",
99
- ".claude/skills/design-ui/SKILL.md": "d7b1b95dc3ea1cac0f6bfd9b001b251fec3ec1ddc3b30ee7e7e3dfad5a669fb8",
100
- ".claude/skills/design-ui/references/design-vs-development.md": "7506f0f79e5edb0c12fcea327625f1716db0d2229f020e2a2fc74d88392ff54f",
101
- ".claude/skills/design-ui/references/intent-table.md": "56237061047a80dd242c3f0753e7d8c416a58272a9d4cb7d05f7ecc368df6674",
102
- ".claude/skills/design-ui/references/orchestration.md": "a3bb05a804427f00f857d2e23524cc644041ba49ef67bc05c60a673f9dbaa928",
103
- ".claude/skills/design-ui/references/state-machine.md": "4d31ecdbca0ba114bdf83f6575724467ce3b260479160a8c8791c2eede8fe27f",
104
- ".claude/skills/document/SKILL.md": "7345488fe50923c273dfdf3277ec7251fee9184bc7de1a12192255b5ad183fda",
105
- ".claude/skills/documentation/LICENSE": "cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30",
106
- ".claude/skills/documentation/NOTICE": "c201f68939a610c948a4d0e6bebbcb8f8df370cfe41ceb6e5861c20ab4044d06",
107
- ".claude/skills/documentation/SKILL.md": "456160c1a3398cfece91b6696d0c7f1fcb1196ea5e101acb9a0e3050f2462a5d",
108
- ".claude/skills/google-analytics/SKILL.md": "f5d8c52c103e4e1bdbb6bfdda962aad198064ced701c20df753d77ba4603547c",
109
- ".claude/skills/google-analytics/references/audiences.md": "cdae62b0f40e82a60f96a6bd0e77798c6118beaebe812961e8c9d4c3242b227f",
110
- ".claude/skills/google-analytics/references/bigquery.md": "fadc3efdd200a0bc43df4b698d46bc93e82111d8553b363d1e49ceb15bcdffce",
111
- ".claude/skills/google-analytics/references/custom-dimensions.md": "ac9e88c69fd8eb2a0bf1ae8f3daac42c6d92caa338ce2fa77a50bf2fe947dbc4",
112
- ".claude/skills/google-analytics/references/custom-events.md": "442ce8c1e7d89cb2206a85b02b287748e3e226d67cab571bc6f2a3ea520bc434",
113
- ".claude/skills/google-analytics/references/data-management.md": "1f9e80e0855937dc082d63535188fc1e7547273e626d0a3ef03c0487b42045bb",
114
- ".claude/skills/google-analytics/references/debugview.md": "f2b050db37b7927de99b0196deb7cb94d8ecb1a6668c9e08bec4f57816646e90",
115
- ".claude/skills/google-analytics/references/events-fundamentals.md": "acdeb349be2f468ba634d686691aeda0ce932db93b4872b9cd35685dcd3f31cf",
116
- ".claude/skills/google-analytics/references/gtag.md": "bef0556071bc645656d0634c26c3bad20d39517cb14689bb11e9d9bedf4f6ab8",
117
- ".claude/skills/google-analytics/references/gtm-integration.md": "3c95c7b64fbbd688907cd558c3c4d265b99c7178284b97e376334d802d11c860",
118
- ".claude/skills/google-analytics/references/measurement-protocol.md": "a5b644a5ca586173e399c229a47aad571991389232320a0f9e6baf1d4be619fb",
119
- ".claude/skills/google-analytics/references/privacy.md": "09e2db4ce4d990f4f1ff51c0e3bca08a364cba711f83f48103f69f9db427fa18",
120
- ".claude/skills/google-analytics/references/recommended-events.md": "0dccd2084060bfb3fd28476b9c0c9a6e2b8f51ce57ecf4fc32d7f82a8964b1b4",
121
- ".claude/skills/google-analytics/references/reporting.md": "37cb7cfd1dd547e86a41664ffe13893ef138194a2288d1a2c43c9195e8ec609f",
122
- ".claude/skills/google-analytics/references/setup.md": "26743b72341a5658e73c1f070b924de0f11b1681af06164cb13c19f2047a1087",
123
- ".claude/skills/google-analytics/references/user-tracking.md": "5a945df2a575291c6b35d24830b497915c82a843a93ee133577f1deda93f6d75",
124
- ".claude/skills/harness/SKILL.md": "af7cf374013d881d216462ccba353747e1727f670bd9b1c45b089ffde247d67a",
125
- ".claude/skills/humanizer/LICENSE": "5dd2bb7cb6b254edd93a87718efbfef8b81c8ef90e3f9180f06723683d7733a3",
126
- ".claude/skills/humanizer/NOTICE": "5bdb69381ab078e7fbb5fb910f10253baa6fe9dabb88143c6f613959e131cbb3",
127
- ".claude/skills/humanizer/SKILL.md": "398beef0cabe34df435972a13fb9ef21be74d942f93321b220a5dd393d554e40",
128
- ".claude/skills/humanizer/references/ai-writing-detection.md": "e896c1b31f7af57b8cda81df6ded6e9d7e9ab742a0f5fdfc73f88a6be2e78f2b",
129
- ".claude/skills/impeccable/LICENSE": "cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30",
130
- ".claude/skills/impeccable/NOTICE": "635634b6132772183c1a9ca22035d1d1a15ab17fd70e49fa812f9205bce94093",
131
- ".claude/skills/impeccable/PROJECT_NOTES.md": "dfa989f50bc6d2a164adb6b272fcb15820fef1659fc710c2b8c58878275faae2",
132
- ".claude/skills/impeccable/SKILL.md": "37ad04b8f9b41d11618f294374d9b757b70e89f33fcbceecf190794143d682e4",
133
- ".claude/skills/impeccable/agents/openai.yaml": "cbd8bd68fa00935dd0f179adb169252629cf7ee443ea9dc7db77e7ef2cf77446",
134
- ".claude/skills/impeccable/reference/adapt.md": "6b3dfd7e0ad5dd7126bedbefe0a3e8eb019d2c1de6508117bbf39ad13f4420fb",
135
- ".claude/skills/impeccable/reference/animate.md": "07afe59a7904b1f6a265d953546828a403dc9d3bf0c92906655c22b312d3342a",
136
- ".claude/skills/impeccable/reference/audit.md": "903bcc61aa8a69850da3af132cefee750fb6473c6dd65fe3ac1f12530456046e",
137
- ".claude/skills/impeccable/reference/bolder.md": "826743d6c04791e73eb74a2ff69414fada1e33765740e5c75343e01302f959e9",
138
- ".claude/skills/impeccable/reference/brand.md": "93f96410bc4302fe94721e6e9a400aaf15ecc6cb0a0a9e5a20bfecc888552934",
139
- ".claude/skills/impeccable/reference/clarify.md": "6b99c57de45a6fa31a30119a71e7fcfa91c18ddc72730d171aea0eddcda72ae4",
140
- ".claude/skills/impeccable/reference/cognitive-load.md": "7653f0a2f60f6d0471581f4b84c24df5408e70f8e2b727a6cdf3872dcf42676f",
141
- ".claude/skills/impeccable/reference/color-and-contrast.md": "3113174f4b0047027338a904e2b0c0084b353f0d5a0e2a94e21d8bf0c3e7e05f",
142
- ".claude/skills/impeccable/reference/colorize.md": "b12592856fd82699bd27891c95d8609fda2053e7dfe6fd59f97659ac64b66f80",
143
- ".claude/skills/impeccable/reference/craft.md": "dd23822d1956661e70e4ab6a3b3e1ed48a32364aa428a2beafa930ddb23c0fd2",
144
- ".claude/skills/impeccable/reference/critique.md": "f5ee2cbf5bc6244cdf50a20c57c6ff45c4264500982be93a67ee3232efd57a41",
145
- ".claude/skills/impeccable/reference/delight.md": "4a28b407abcc8e1ecb330c214419aa0a614d40b8e42c3bbbcaa8615d9ce8a52a",
146
- ".claude/skills/impeccable/reference/distill.md": "b09448c3ec1630017857051bf6b1b256de7ec5495bf7fb0d39995c5e706c7c48",
147
- ".claude/skills/impeccable/reference/document.md": "27fb84f1b4a8052810ac98544c3156965780bf74b9aa1acc711cdf07f826049d",
148
- ".claude/skills/impeccable/reference/extract.md": "93319824dedd5508d0d2565e6eef85f0b13fe19a2de89b305e89aa241e9498b6",
149
- ".claude/skills/impeccable/reference/harden.md": "ce2ba5a1e732555e719ade86f81f944ae10e6ad525b501e87769fe6fa81bb090",
150
- ".claude/skills/impeccable/reference/heuristics-scoring.md": "c047724521f6f73e2eecacf62e77498848370a8e4a0b32c900bd87ae9f1134ea",
151
- ".claude/skills/impeccable/reference/interaction-design.md": "7f545df683b1897460cdc8d94adfa1410c4c4a23fdb1545fbe95dc6e9af1b486",
152
- ".claude/skills/impeccable/reference/layout.md": "e67ad4015aad1a3ec774c804cbcff7f1a3f4e9a2d4bf3598f1c8370e88e77d2e",
153
- ".claude/skills/impeccable/reference/live.md": "fc5efcdd788c23f3d2f360e4b9429fbb1a9e9c9b0d7265bc904ca06cf7b84e59",
154
- ".claude/skills/impeccable/reference/motion-design.md": "c35a59b5f795721c914cfccf9b470e89a5010c563cd85ab46a67031531678f3f",
155
- ".claude/skills/impeccable/reference/onboard.md": "ae2e9890e30cd6cad6408155b429fc822719996e3bff951ceddf61a095df1133",
156
- ".claude/skills/impeccable/reference/optimize.md": "7d2fcb9dc380a8d327c79220ef2820afbbbbde64eafb19cf7d23ee701d816930",
157
- ".claude/skills/impeccable/reference/overdrive.md": "cc5d797297b450eb79783cd08ae29518b32fbe7f5bdea2b2eadc8b881a704643",
158
- ".claude/skills/impeccable/reference/personas.md": "ebe587eeca9acd60143512e6b57235cdb31b8263c2d4ef28c0b0784980ca134a",
159
- ".claude/skills/impeccable/reference/polish.md": "7b0c767502c14642aa9e8489227af8b57e5c2d56504c59514c7cb02b1f1a0651",
160
- ".claude/skills/impeccable/reference/product.md": "74c4063cda1aff10d45b6e3b92cd2fd61e1ed0550ba5d7a0331dff5958029fec",
161
- ".claude/skills/impeccable/reference/quieter.md": "ecb4a53ecd33b32d303d403205fa4707042b7a7093bb92374827aa4b8ffc50ad",
162
- ".claude/skills/impeccable/reference/responsive-design.md": "5add44195a42cf7fa82aecadaad79b8875446b930e06d087d73f3722533fd95a",
163
- ".claude/skills/impeccable/reference/shape.md": "f67e01467372934f8de7a0f79f672c11c61a7661d2eca1ab0cc524c2eec0e7be",
164
- ".claude/skills/impeccable/reference/spatial-design.md": "10c743ee8245fc1be9e8af2b79dd08b0dae19fcde33d46c9730c000d7e13b7cd",
165
- ".claude/skills/impeccable/reference/teach.md": "6598f70e9f973ba46fe1cd5d06a2cf7f845eb26db94b5a55f872d49b1e2f8a6e",
166
- ".claude/skills/impeccable/reference/typeset.md": "b30e50cbb418899e4a3d817c5845481c67adf74a7878a7f8e1d791148b0d6fa2",
167
- ".claude/skills/impeccable/reference/typography.md": "48df5e595ee4ccc9691845785d2ea3f53ac1096cf3128fc4fec1537273746a99",
168
- ".claude/skills/impeccable/reference/ux-writing.md": "0cd5e958d92be6e2331cb199d6ed5d98597aa20ec4922d4c3df56e7753cfc00c",
169
- ".claude/skills/impeccable/scripts/cleanup-deprecated.mjs": "5b1a36e3241e14ba8645881e8f07255748ca7f7a158a11e1df99043357a4b6d2",
170
- ".claude/skills/impeccable/scripts/command-metadata.json": "f123f30283341e2035477582d696763826725d0ef328ec3a19963f6d60cba89c",
171
- ".claude/skills/impeccable/scripts/design-parser.mjs": "6e7b463344cdf59353acaf48f554ac0aad5a0a46cb1237a0d1a697ddc7759eab",
172
- ".claude/skills/impeccable/scripts/detect-csp.mjs": "2d80520bef13cb93107699714bc0d2be5a2787a9aa079ecec91b94508a8125a4",
173
- ".claude/skills/impeccable/scripts/is-generated.mjs": "ed5b0b00e99ed385db541c7a068cb85f72456a4b6aa7a5460037d24b58bd90cd",
174
- ".claude/skills/impeccable/scripts/live-accept.mjs": "91636a22d83607c68cd1c9c04b9745176d8c36f31e4099ae067c0f712fa42636",
175
- ".claude/skills/impeccable/scripts/live-browser.js": "dca17078371a5b7388208dd929fd51f997e38a459c314fc93961417acb417b00",
176
- ".claude/skills/impeccable/scripts/live-inject.mjs": "a5670283b42c815bf75f5446e67f02a5a44f5de8d7bc1126215274f4a2bfa653",
177
- ".claude/skills/impeccable/scripts/live-poll.mjs": "c450d6240cdd3409784a9950c64a764c4cf01680c19b72cd96f85e7d3231518e",
178
- ".claude/skills/impeccable/scripts/live-server.mjs": "120b8098670645b404fa47167354598388bb5d3bd2fda4c1465a3922df60b137",
179
- ".claude/skills/impeccable/scripts/live-wrap.mjs": "bbbd0ccea8f84bbc7466dc0c350ebbe475fb592c112240f8aaac0d33d81b5173",
180
- ".claude/skills/impeccable/scripts/live.mjs": "ea2648d8a65a544d77916abd584d6ad870ed1ca496351f3bbb9d0e24e814a5a6",
181
- ".claude/skills/impeccable/scripts/load-context.mjs": "28fb64cd16a9e9f6cde3a34bed00bc4798ee83d0eb064150cca958c9a34271af",
182
- ".claude/skills/impeccable/scripts/modern-screenshot.umd.js": "bb36665889124a0b6e15f16045265737449c3bdcf2712cdb08af3cfa01563e2b",
183
- ".claude/skills/impeccable/scripts/pin.mjs": "89a7056adfaca280519a1cc679b2e33f083300c3ed02a4fe7c71cf4d8c443bb6",
184
- ".claude/skills/implement/SKILL.md": "57d91ab330dbf4e673d114fc96ed487af4d44e7c4b815faf623ef77793f5eb60",
185
- ".claude/skills/intake/SKILL.md": "7ad00f23ee28737dccef9c71ae477a54edad34a09f50b7774a34ae11e2ca016b",
186
- ".claude/skills/intake/template.md": "49262d5dd9c8b00c54822af5106671c84dff5d662285c41a2377a8b30d353661",
187
- ".claude/skills/integrate/SKILL.md": "31c54bdd0a1ea24efc078023842bd05c4db3c76d73718788dcc5fa4daf8ec771",
188
- ".claude/skills/memory-flush/SKILL.md": "825f01fe6aff5d7faeaa654df4e371cb1f76857348f28e65addd4d37e60ff726",
189
- ".claude/skills/memory-flush/sweep.py": "f04956bd98c8332feb77cd33a480d948c3b001813353fcf985e7bab8ddfda9d4",
190
- ".claude/skills/memory-flush/tests/run.sh": "5eec4486cfda45d2ce5987d6286bf61b96f816ebdd9041bc9ba0207cf00abd4b",
191
- ".claude/skills/optimize-seo/SKILL.md": "b389dc604346220d5a0a59c8f41c058c192c58a35bbff831fbc4c7f9e8c1b386",
192
- ".claude/skills/optimize-seo/scripts/pagespeed.mjs": "8bef62078833139f9175c175339d1fc0eb635a5eeaa2a3100543928ef91869e4",
193
- ".claude/skills/pagespeed-insights/LICENSE.md": "10ee2ded8c2ae373a65aacfa51f2bf540d5f20d418fc7a5595a5ccb06cde2738",
194
- ".claude/skills/pagespeed-insights/SKILL.md": "ab53af083929fbb28af0ad2c9ee1fcc51dec63c642ebc237c475b3ea9bde7c59",
195
- ".claude/skills/pagespeed-insights/reference.md": "afa03220b772ea8d6393f7366bbd6d90200c0b56585ccb2bb714e622af07345f",
196
- ".claude/skills/prose/SKILL.md": "7cfc7d4fd34d7256367eedf17c5f5b5cdb67baec72033f905dcfb715366a1849",
197
- ".claude/skills/rca/SKILL.md": "e5d1285df6d627052cfd62c3c8900bbd847ae92b37d245e8d6c2cc34c7fc32c5",
198
- ".claude/skills/rca/template.md": "8466f5737a0aeb88bcb73d4d4065293e2ff59f0c0e19de4082598d4e920caeb9",
199
- ".claude/skills/research/SKILL.md": "194552d394e31c3852c0f43fe78da1d771d42798fd754e8ab4830f304d1ab41b",
200
- ".claude/skills/scenario/SKILL.md": "aa9b5f49e201edd61fd998013afa40197b0ebcf6d9e2db1ff1b75a3cb23bf9fa",
201
- ".claude/skills/scout/SKILL.md": "5d6ee944b03022370b71a366302f1ddb48620d67e39b601da3a57b9d8003a5bc",
202
- ".claude/skills/security/SKILL.md": "d0ec521edcbbd0b7e281ea8460889ba6cc72ddca0a2028addad91e207c587c61",
203
- ".claude/skills/simplify/SKILL.md": "720904feda85a6dd67e416cb5fa98619f569c71fde5a25c50b6e5b8efc87e82c",
204
- ".claude/skills/spec-diagram-review/SKILL.md": "fdf21cd30d3f5acb42775edc1f7b85e90dd016dcd078eff141ab283037aef901",
205
- ".claude/skills/spec-lint/SKILL.md": "9ebbccdf1e47cd47e4ede4c57203437ca3f6b7254493cbc72411ce34d31c3a51",
206
- ".claude/skills/spec-lint/lint.sh": "75dfd1657ce95b632b70edd5de1352eb5d6e189042e7a6e36b8aa85f174e4edc",
207
- ".claude/skills/spec-render/SKILL.md": "244e89751a3dd33b9e6f3cd4de18b70141f29c93ef69ce9f91ab3227404ac6c4",
208
- ".claude/skills/spec-render/render.sh": "d721e6e06cd87cb82a75619dbcd2e473a2b8f48c07a02a646fa562e5ce1cc833",
209
- ".claude/skills/spec-traceability-review/SKILL.md": "7f654f2e297838babd6e553299042620b802ef4c56ee675bf56779d0e4755a3a",
210
- ".claude/skills/spec/SKILL.md": "9d42a257e3d109b7865a52ce79c8f30f3222081bd3254b679219afc3ce952314",
211
- ".claude/skills/spec/template.md": "44b4e793e8298392e15a43e7322a84d1c7257fba4bbc4e263c80ae89138213cb",
212
- ".claude/skills/swarm-dispatch/SKILL.md": "b4732c48f1ac31a4b852378dc3c9ea9e410e9285a0e87f9b93eac9714eaa73e5",
213
- ".claude/skills/swarm-dispatch/swarm_merge.sh": "e1ab58c6d990665325d7749a769afbda1232b99fc8255215891fdd0c99a483e6",
214
- ".claude/skills/swarm-plan/SKILL.md": "6e530d5b67151ad1a4d310a966fbf4e742cc077a34c931350603a05e26fb6e88",
215
- ".claude/skills/swarm-plan/validate.sh": "b97b0063ed6f98f6e653b52db760c93bebca0138f3eeebb004a7ee9f7242bf02",
216
- ".claude/skills/tdd/SKILL.md": "284a2f3737f3f25242affbb8bc04c03a48e1c151cbaa06198820184f213a4a36",
217
- ".claude/skills/tdd/drift_check.py": "8d0070eb48d97b79031d40618390dc1d8bb55d9aaa1874845ba3424a67b31066",
218
- ".claude/skills/tdd/tests/drift_check_test.sh": "db08058ce9a30dc3df32dd4d2aa9ec4037316f49a85f11edbc13ba21f3107efd",
219
- ".claude/skills/tdd/tests/run.sh": "ef81eb08a495c45ed43c7cc0683fa741bd8a79f8f4bce2092120b8d558969d45",
220
- ".claude/skills/technical-tutorials/LICENSE": "8b834880d2992ef265e235ed561dbd35636309e42c916a4d867418188a27ad97",
221
- ".claude/skills/technical-tutorials/NOTICE": "82e551a1e6758704b7566c1a0f23ce29c58bd0046de1f32dedbcddfc469eb1ca",
222
- ".claude/skills/technical-tutorials/SKILL.md": "3eabf2bcf02d21612cc7f00c878f29b702dfd2c7ec298aee0c90e2496964c691",
223
- ".claude/skills/technical-tutorials/references/audience-context-README.md": "d0470e06463cb33980b6fd91a5f0ebec268e3b63481752988fc6378c60a00fd8",
224
- ".claude/skills/technical-tutorials/references/audience-context.md": "7e00189e72d7a87a0cf59f8302aa4adad26222d3bbd14ddb498515f137a32775",
225
- ".claude/skills/technical-tutorials/references/audience-example.md": "610f559f691de5169f672e8f69b72fd44790e5e3f894cebb7e644c3331db419c",
226
- ".claude/skills/technical-tutorials/references/audience-template.md": "9e8da0e05544df3961d75fb3a7b1d6374b6a1c129ac2fc9862dc111b5a75e433",
227
- ".claude/skills/triage/SKILL.md": "499f82a26d77c60af827dd89a7fcb3eae0cd903e34c70740c297bc260aeed38e",
228
- ".claude/skills/verify/SKILL.md": "fcddba67cf7f3623fc8f8ae142303b16b9db0c9fc1652bc920e16c56fe4c7864",
229
- ".mcp.json": "8ebb7966045486187bbdf9bac643e690c4fbc7a9a70a8345e3665ba72fa19b96",
230
- "CLAUDE.md": "5aff9bb3534792961b3e5c79a23f7ae3a859bb22efc3553c62847f555c61a08d",
231
- "docs/init/seed.md": "e0d708ccf06ae1ae124e0a3ada3e77bfbdbb9f2899a548a1729c9270a12f3e98"
232
- },
233
- "owners": {
234
- "skills": {
235
- "archive": "baseline",
236
- "audit-baseline": "baseline",
237
- "brd": "baseline",
238
- "changelog": "baseline",
239
- "chore": "baseline",
240
- "claude-automation-recommender": "baseline",
241
- "code-structure": "baseline",
242
- "commit": "baseline",
243
- "copywriting": "baseline",
244
- "design-ui": "baseline",
245
- "document": "baseline",
246
- "documentation": "baseline",
247
- "harness": "baseline",
248
- "humanizer": "baseline",
249
- "impeccable": "baseline",
250
- "implement": "baseline",
251
- "intake": "baseline",
252
- "integrate": "baseline",
253
- "memory-flush": "baseline",
254
- "prose": "baseline",
255
- "rca": "baseline",
256
- "research": "baseline",
257
- "scenario": "baseline",
258
- "scout": "baseline",
259
- "security": "baseline",
260
- "simplify": "baseline",
261
- "spec": "baseline",
262
- "spec-diagram-review": "baseline",
263
- "spec-lint": "baseline",
264
- "spec-render": "baseline",
265
- "spec-traceability-review": "baseline",
266
- "swarm-dispatch": "baseline",
267
- "swarm-plan": "baseline",
268
- "tdd": "baseline",
269
- "technical-tutorials": "baseline",
270
- "triage": "baseline",
271
- "verify": "baseline"
272
- }
273
- },
274
- "build_id": "gha-26054481720"
275
- }