loadout-ai 0.3.1 → 0.4.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.
Files changed (44) hide show
  1. package/CHANGELOG.md +42 -0
  2. package/MASTER_PLAN.md +86 -13
  3. package/README.md +157 -284
  4. package/dashboard/app.js +4 -4
  5. package/dashboard/index.html +4 -4
  6. package/dist/src/cli.js +27 -21
  7. package/dist/src/core/adapters.js +10 -0
  8. package/dist/src/core/adopt.js +165 -32
  9. package/dist/src/core/agent-health-score.js +2 -2
  10. package/dist/src/core/catalog-coverage.js +2 -1
  11. package/dist/src/core/catalog-install.js +8 -1
  12. package/dist/src/core/catalog-release.js +2 -1
  13. package/dist/src/core/conformance.js +74 -0
  14. package/dist/src/core/install.js +36 -3
  15. package/dist/src/core/profiles.js +9 -4
  16. package/dist/src/core/ranking.js +1 -1
  17. package/dist/src/core/readme-claims.js +10 -0
  18. package/dist/src/core/readme-facts.js +40 -0
  19. package/dist/src/core/recommend.js +9 -3
  20. package/dist/src/core/runtime-tools.js +5 -2
  21. package/dist/src/core/scheduler.js +2 -1
  22. package/dist/src/core/snapshot.js +58 -13
  23. package/dist/src/core/state.js +8 -1
  24. package/dist/src/core/transaction.js +2 -1
  25. package/dist/src/core/uninstall.js +26 -2
  26. package/dist/src/dashboard.js +5 -2
  27. package/dist/src/shared/schemas.js +57 -0
  28. package/docs/FEATURE_TEST_MATRIX.md +16 -0
  29. package/docs/README_RESEARCH.md +36 -0
  30. package/docs/RELEASE_REVIEW.md +31 -5
  31. package/docs/REPOSITORY_STABILIZATION.md +190 -0
  32. package/docs/TESTING.md +50 -0
  33. package/docs/USER_TEST_GUIDE.md +26 -0
  34. package/docs/assets/loadout-hero.svg +259 -0
  35. package/docs/assets/loadout-mark.svg +54 -0
  36. package/docs/evidence/live-checks-2026-07-19.json +22 -0
  37. package/docs/evidence/live-checks.schema.json +28 -0
  38. package/docs/evidence/readme-claims.json +286 -0
  39. package/docs/superpowers/plans/2026-07-19-relatable-readme-hero.md +283 -0
  40. package/docs/superpowers/specs/2026-07-19-relatable-readme-hero-design.md +80 -0
  41. package/package.json +8 -4
  42. package/SIMPLE_PLAN.md +0 -44
  43. package/docs/plans/2026-07-18-release-0.3.md +0 -42
  44. package/docs/superpowers/plans/2026-07-18-cli-ux-polish.md +0 -86
@@ -0,0 +1,54 @@
1
+ <svg
2
+ xmlns="http://www.w3.org/2000/svg"
3
+ viewBox="0 0 600 168"
4
+ role="img"
5
+ aria-labelledby="loadout-mark-title loadout-mark-description"
6
+ >
7
+ <title id="loadout-mark-title">Loadout</title>
8
+ <desc id="loadout-mark-description">
9
+ Five outlined loadout slots with a terminal prompt in the selected center
10
+ slot.
11
+ </desc>
12
+ <style>
13
+ :root {
14
+ color: #24292f;
15
+ }
16
+
17
+ @media (prefers-color-scheme: dark) {
18
+ :root {
19
+ color: #f0f6fc;
20
+ }
21
+ }
22
+ </style>
23
+
24
+ <g
25
+ fill="none"
26
+ stroke="currentColor"
27
+ stroke-linecap="round"
28
+ stroke-linejoin="round"
29
+ >
30
+ <path
31
+ d="M69 44h64a12 12 0 0 1 12 12v64a12 12 0 0 1-12 12H69a12 12 0 0 1-12-12V56a12 12 0 0 1 12-12Z"
32
+ stroke-width="6"
33
+ />
34
+ <path
35
+ d="M170 44h64a12 12 0 0 1 12 12v64a12 12 0 0 1-12 12h-64a12 12 0 0 1-12-12V56a12 12 0 0 1 12-12Z"
36
+ stroke-width="6"
37
+ />
38
+ <path
39
+ d="M271 32h58a18 18 0 0 1 18 18v76a18 18 0 0 1-18 18h-58a18 18 0 0 1-18-18V50a18 18 0 0 1 18-18Z"
40
+ stroke-width="8"
41
+ />
42
+ <path
43
+ d="M366 44h64a12 12 0 0 1 12 12v64a12 12 0 0 1-12 12h-64a12 12 0 0 1-12-12V56a12 12 0 0 1 12-12Z"
44
+ stroke-width="6"
45
+ />
46
+ <path
47
+ d="M467 44h64a12 12 0 0 1 12 12v64a12 12 0 0 1-12 12h-64a12 12 0 0 1-12-12V56a12 12 0 0 1 12-12Z"
48
+ stroke-width="6"
49
+ />
50
+
51
+ <path d="m276 75 18 13-18 13" stroke-width="8" />
52
+ <path d="M302 103h22" stroke-width="8" />
53
+ </g>
54
+ </svg>
@@ -0,0 +1,22 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "generatedAt": "2026-07-19T13:45:14.945Z",
4
+ "repositoryCommit": "8f8eccdd20272ebb88d0339087fc9cd3828e65c9",
5
+ "checks": [
6
+ {
7
+ "id": "npm",
8
+ "status": "failed",
9
+ "detail": "npm registry returned HTTP 404 for loadout-ai@0.3.2"
10
+ },
11
+ {
12
+ "id": "stable-install",
13
+ "status": "verified",
14
+ "detail": "isolated Stable flow installed 4 pinned packages and completed state and filesystem rollback assertions"
15
+ },
16
+ {
17
+ "id": "github",
18
+ "status": "failed",
19
+ "detail": "GitHub branch protection is not verified for main (HTTP 404)"
20
+ }
21
+ ]
22
+ }
@@ -0,0 +1,28 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://github.com/VirajMishra1/loadout/docs/evidence/live-checks.schema.json",
4
+ "title": "Loadout bounded live-check report",
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "required": ["schemaVersion", "generatedAt", "repositoryCommit", "checks"],
8
+ "properties": {
9
+ "schemaVersion": { "const": 1 },
10
+ "generatedAt": { "type": "string", "format": "date-time" },
11
+ "repositoryCommit": { "type": "string", "pattern": "^[0-9a-f]{40}$" },
12
+ "checks": {
13
+ "type": "array",
14
+ "uniqueItems": true,
15
+ "$comment": "The JSON Schema rejects byte-equivalent duplicate result objects. scripts/check-live-evidence.mjs additionally enforces unique IDs and exact completeness for the checks requested at runtime; cross-item ID uniqueness and a caller-selected exact ID set are parser-only invariants.",
16
+ "items": {
17
+ "type": "object",
18
+ "additionalProperties": false,
19
+ "required": ["id", "status", "detail"],
20
+ "properties": {
21
+ "id": { "enum": ["npm", "stable-install", "github"] },
22
+ "status": { "enum": ["verified", "failed", "not-verified"] },
23
+ "detail": { "type": "string", "minLength": 1 }
24
+ }
25
+ }
26
+ }
27
+ }
28
+ }
@@ -0,0 +1,286 @@
1
+ {
2
+ "schemaVersion": 1,
3
+ "claims": [
4
+ {
5
+ "id": "product.scope",
6
+ "section": "Introduction",
7
+ "summary": "Loadout provides a local workflow for discovery, comparison, installation, updates, and rollback.",
8
+ "evidenceClass": "integration-verified",
9
+ "status": "bounded",
10
+ "evidence": [
11
+ "README.md",
12
+ "tests/upgrade.test.ts",
13
+ "tests/snapshot.test.ts"
14
+ ]
15
+ },
16
+ {
17
+ "id": "catalog.coverage",
18
+ "section": "Catalog, discovery, and recommendations",
19
+ "summary": "The bundled catalog exposes generated coverage facts from pinned public records.",
20
+ "evidenceClass": "structural",
21
+ "status": "proven",
22
+ "evidence": [
23
+ "catalog/packages.json",
24
+ "src/core/catalog-coverage.ts",
25
+ "tests/catalog-coverage.test.ts"
26
+ ]
27
+ },
28
+ {
29
+ "id": "selection.stable",
30
+ "section": "Choose a profile",
31
+ "summary": "Stable selection is defined by the checked-in policy and allowlist.",
32
+ "evidenceClass": "policy-selected",
33
+ "status": "proven",
34
+ "evidence": ["src/core/profiles.ts", "tests/profiles.test.ts"]
35
+ },
36
+ {
37
+ "id": "selection.power",
38
+ "section": "Choose a profile",
39
+ "summary": "Power selection is defined by the checked-in policy and allowlist.",
40
+ "evidenceClass": "policy-selected",
41
+ "status": "proven",
42
+ "evidence": ["src/core/profiles.ts", "tests/profiles.test.ts"]
43
+ },
44
+ {
45
+ "id": "selection.maximum",
46
+ "section": "Choose a profile",
47
+ "summary": "Maximum selection keeps optional components in Loadout's managed library rather than activating every component.",
48
+ "evidenceClass": "integration-verified",
49
+ "status": "bounded",
50
+ "evidence": ["src/core/active-set.ts", "tests/active-set.test.ts"]
51
+ },
52
+ {
53
+ "id": "agents.support",
54
+ "section": "Adapter compatibility",
55
+ "summary": "Supported-agent adapters are limited to checked-in definitions and tested filesystem operations.",
56
+ "evidenceClass": "integration-verified",
57
+ "status": "bounded",
58
+ "evidence": [
59
+ "src/core/adapters.ts",
60
+ "tests/adapters.test.ts",
61
+ "tests/adapter-conformance.test.ts"
62
+ ]
63
+ },
64
+ {
65
+ "id": "platforms.support",
66
+ "section": "Adapter compatibility",
67
+ "summary": "Platform support is bounded to tested local filesystem behavior and does not imply native application execution.",
68
+ "evidenceClass": "platform-verified",
69
+ "status": "bounded",
70
+ "evidence": [
71
+ "docs/FEATURE_TEST_MATRIX.md",
72
+ "tests/native-filesystem-smoke.test.ts"
73
+ ]
74
+ },
75
+ {
76
+ "id": "installation.transaction",
77
+ "section": "Preview, apply, inspect, and roll back",
78
+ "summary": "Managed installation plans and applies transactional filesystem changes with snapshots.",
79
+ "evidenceClass": "integration-verified",
80
+ "status": "proven",
81
+ "evidence": [
82
+ "src/core/install.ts",
83
+ "tests/transaction.test.ts",
84
+ "tests/install.test.ts"
85
+ ]
86
+ },
87
+ {
88
+ "id": "updates.preview",
89
+ "section": "Catalog, discovery, and recommendations",
90
+ "summary": "Update workflows present a bounded local plan before an explicit apply step.",
91
+ "evidenceClass": "integration-verified",
92
+ "status": "proven",
93
+ "evidence": ["src/core/update.ts", "tests/update.test.ts"]
94
+ },
95
+ {
96
+ "id": "updates.saved-profile",
97
+ "section": "Catalog, discovery, and recommendations",
98
+ "summary": "Update evaluates the saved Stable, Power, Maximum, or Custom profile and applies only reviewed, eligible changes after explicit approval.",
99
+ "evidenceClass": "integration-verified",
100
+ "status": "proven",
101
+ "evidence": [
102
+ "src/core/profile-state.ts",
103
+ "src/core/update.ts",
104
+ "tests/profile-state.test.ts",
105
+ "tests/update.test.ts"
106
+ ]
107
+ },
108
+ {
109
+ "id": "installation.empty-target-recovery",
110
+ "section": "State, persistence, and architecture",
111
+ "summary": "Managed installation treats recursively empty leftover skill directories as unoccupied while retaining collision protection for files and symlinks.",
112
+ "evidenceClass": "integration-verified",
113
+ "status": "proven",
114
+ "evidence": ["src/core/install.ts", "tests/install.test.ts"]
115
+ },
116
+ {
117
+ "id": "rollback.snapshot",
118
+ "section": "Preview, apply, inspect, and roll back",
119
+ "summary": "Rollback restores managed snapshot state within Loadout's supported transaction boundary.",
120
+ "evidenceClass": "integration-verified",
121
+ "status": "proven",
122
+ "evidence": [
123
+ "src/core/snapshot.ts",
124
+ "tests/snapshot.test.ts",
125
+ "tests/transaction.test.ts"
126
+ ]
127
+ },
128
+ {
129
+ "id": "recommendations.evidence",
130
+ "section": "Catalog, discovery, and recommendations",
131
+ "summary": "Recommendations expose bounded repository and local evidence rather than universal quality claims.",
132
+ "evidenceClass": "unit-verified",
133
+ "status": "bounded",
134
+ "evidence": ["src/core/recommend.ts", "tests/recommend.test.ts"]
135
+ },
136
+ {
137
+ "id": "trust.stages",
138
+ "section": "Catalog, discovery, and recommendations",
139
+ "summary": "Trust-stage labels distinguish evidence without promoting one stage to another.",
140
+ "evidenceClass": "structural",
141
+ "status": "proven",
142
+ "evidence": [
143
+ "src/core/benchmark-trust.ts",
144
+ "tests/benchmark-trust.test.ts",
145
+ "docs/CATALOG_POLICY.md"
146
+ ]
147
+ },
148
+ {
149
+ "id": "discovery.read-only",
150
+ "section": "Catalog, discovery, and recommendations",
151
+ "summary": "Discovery records candidates separately from catalog promotion and installation.",
152
+ "evidenceClass": "integration-verified",
153
+ "status": "proven",
154
+ "evidence": [
155
+ "src/core/github-discovery.ts",
156
+ "tests/daily-discovery.test.ts",
157
+ "tests/review-queue.test.ts"
158
+ ]
159
+ },
160
+ {
161
+ "id": "credentials.references",
162
+ "section": "Credentials, MCP, and executable tools",
163
+ "summary": "Shared configuration stores credential references rather than secret values.",
164
+ "evidenceClass": "structural",
165
+ "status": "proven",
166
+ "evidence": [
167
+ "src/shared/schemas.ts",
168
+ "src/shared/types.ts",
169
+ "tests/credentials.test.ts"
170
+ ]
171
+ },
172
+ {
173
+ "id": "credentials.separation",
174
+ "section": "Credentials, MCP, and executable tools",
175
+ "summary": "Model API access declarations are separated from non-model service credential requirements in setup and MCP recipe output.",
176
+ "evidenceClass": "unit-verified",
177
+ "status": "proven",
178
+ "evidence": [
179
+ "src/cli.ts",
180
+ "src/core/mcp-recipes.ts",
181
+ "tests/cli-help.test.ts",
182
+ "tests/mcp-recipes.test.ts"
183
+ ]
184
+ },
185
+ {
186
+ "id": "mcp.configuration",
187
+ "section": "Credentials, MCP, and executable tools",
188
+ "summary": "MCP configuration uses explicit plans and keeps credentials outside persisted shared manifests.",
189
+ "evidenceClass": "integration-verified",
190
+ "status": "proven",
191
+ "evidence": ["src/core/mcp.ts", "tests/mcp-config.test.ts"]
192
+ },
193
+ {
194
+ "id": "manifests.portability",
195
+ "section": "State, persistence, and architecture",
196
+ "summary": "Loadout manifests are schema-validated portable declarations and do not contain secret values.",
197
+ "evidenceClass": "structural",
198
+ "status": "proven",
199
+ "evidence": [
200
+ "src/core/manifest.ts",
201
+ "src/shared/schemas.ts",
202
+ "tests/manifest.test.ts"
203
+ ]
204
+ },
205
+ {
206
+ "id": "benchmarks.protocol",
207
+ "section": "Development and verification",
208
+ "summary": "Benchmark planning and protocol artifacts do not by themselves prove a source is benchmarked.",
209
+ "evidenceClass": "structural",
210
+ "status": "bounded",
211
+ "evidence": [
212
+ "docs/EVALUATION_PROTOCOL_V1.md",
213
+ "src/core/benchmark-campaign.ts",
214
+ "tests/benchmark-campaign.test.ts"
215
+ ]
216
+ },
217
+ {
218
+ "id": "dashboard.local",
219
+ "section": "Current beta limits",
220
+ "summary": "The dashboard presents local Loadout data and does not establish hosted-service availability.",
221
+ "evidenceClass": "integration-verified",
222
+ "status": "bounded",
223
+ "evidence": ["src/dashboard.ts", "tests/dashboard.test.ts"]
224
+ },
225
+ {
226
+ "id": "uninstall.complete",
227
+ "section": "Troubleshooting and uninstall",
228
+ "summary": "Complete uninstall previews and removes Loadout-managed files, runtime tools, scheduled jobs, and state while preserving unmanaged files and blocking drift unless forced.",
229
+ "evidenceClass": "integration-verified",
230
+ "status": "bounded",
231
+ "evidence": [
232
+ "src/core/uninstall.ts",
233
+ "src/core/remove.ts",
234
+ "tests/uninstall.test.ts"
235
+ ]
236
+ },
237
+ {
238
+ "id": "distribution.npm",
239
+ "section": "Quickstart",
240
+ "summary": "npm distribution wording is time-bounded because offline verification cannot prove current registry availability.",
241
+ "evidenceClass": "live-verified",
242
+ "status": "bounded",
243
+ "evidence": [
244
+ "package.json",
245
+ "README.md",
246
+ "docs/evidence/live-checks-2026-07-19.json"
247
+ ],
248
+ "externalPrerequisites": ["Current npm registry availability"]
249
+ },
250
+ {
251
+ "id": "release.state",
252
+ "section": "Quickstart",
253
+ "summary": "Release and beta wording is bounded to release-review artifacts and is not proof of current public publication.",
254
+ "evidenceClass": "structural",
255
+ "status": "bounded",
256
+ "evidence": [
257
+ "docs/RELEASE_REVIEW.md",
258
+ "docs/evidence/live-checks-2026-07-19.json",
259
+ "package.json"
260
+ ],
261
+ "externalPrerequisites": [
262
+ "Current package publication and release review"
263
+ ]
264
+ },
265
+ {
266
+ "id": "testing.deterministic",
267
+ "section": "Development and verification",
268
+ "summary": "The repository contains deterministic automated tests for supported local behaviors.",
269
+ "evidenceClass": "unit-verified",
270
+ "status": "proven",
271
+ "evidence": [
272
+ "package.json",
273
+ "tests/schemas.test.ts",
274
+ "tests/transaction.test.ts"
275
+ ]
276
+ },
277
+ {
278
+ "id": "limits.current",
279
+ "section": "Current beta limits",
280
+ "summary": "Current limitations are stated explicitly instead of being represented as present capabilities.",
281
+ "evidenceClass": "structural",
282
+ "status": "proven",
283
+ "evidence": ["README.md", "docs/FEATURE_TEST_MATRIX.md"]
284
+ }
285
+ ]
286
+ }
@@ -0,0 +1,283 @@
1
+ # Relatable README and Hero Implementation Plan
2
+
3
+ > **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
4
+
5
+ **Goal:** Give Viraj's Loadout repository a relatable, evidence-bounded story and original GitHub-ready hero while correcting canonical repository metadata and preserving all existing truth gates.
6
+
7
+ **Architecture:** Keep the README human-authored around the existing six machine-owned fact blocks. Add one dependency-free SVG hero under `docs/assets/`, strengthen only the README and metadata contracts that intentionally change, and leave the required CI workflow untouched because its failed job was blocked before execution by GitHub account billing.
8
+
9
+ **Tech Stack:** Markdown, SVG/XML, TypeScript, Vitest, Node.js 20+, Prettier, Playwright, GitHub Actions.
10
+
11
+ ## Global Constraints
12
+
13
+ - Base every change on `VirajMishra1/loadout` `main` at `194676910327176272ebe42982d13c6e8246f0aa`.
14
+ - Canonical repository identity is `VirajMishra1/loadout`; preserve dated historical fork evidence where it is explicitly historical.
15
+ - Keep exactly one ordered marker pair for `catalog-coverage`, `evidence-stages`, `daily-discovery`, `current-limits`, `support-summary`, and `verification-summary`.
16
+ - Preserve the unpublished `0.3.2` warning, preview/apply recomputation boundary, catalog evidence limits, native-host boundary, security statements, installation requirements, and existing executable product-flow proof.
17
+ - Do not claim the GitHub billing/spending-limit failure is reproducible locally; its job executed zero steps.
18
+ - Do not modify `.github/workflows/ci.yml`, delete/skip/weaken tests, add dependencies, copy Ponytail artwork, or add decorative badges.
19
+ - Deliver an unmerged ready pull request against Viraj's `main`.
20
+
21
+ ---
22
+
23
+ ### Task 1: Correct canonical repository identity
24
+
25
+ **Files:**
26
+
27
+ - Modify: `package.json`
28
+ - Modify: `README.md`
29
+ - Modify: `docs/evidence/live-checks.schema.json`
30
+ - Modify: `tests/live-evidence.test.ts`
31
+ - Modify: `tests/readme-product-flow.test.ts`
32
+
33
+ **Interfaces:**
34
+
35
+ - Consumes: canonical repository identity `VirajMishra1/loadout`.
36
+ - Produces: package metadata, README visitor links, schema identity, and regression expectations that agree on the canonical upstream.
37
+
38
+ - [ ] **Step 1: Add failing canonical-identity assertions**
39
+
40
+ In `tests/readme-product-flow.test.ts`, load `package.json` and `docs/evidence/live-checks.schema.json` alongside the README and assert:
41
+
42
+ ```ts
43
+ expect(readme).toContain(
44
+ "https://github.com/VirajMishra1/loadout/actions/workflows/ci.yml",
45
+ );
46
+ expect(readme).toContain(
47
+ "git clone https://github.com/VirajMishra1/loadout.git",
48
+ );
49
+ expect(readme).toContain("https://github.com/VirajMishra1/loadout/issues");
50
+ expect(readme).not.toContain("https://github.com/reddynitish/loadout");
51
+ expect(packageJson.repository.url).toBe(
52
+ "git+https://github.com/VirajMishra1/loadout.git",
53
+ );
54
+ expect(packageJson.homepage).toBe(
55
+ "https://github.com/VirajMishra1/loadout#readme",
56
+ );
57
+ expect(packageJson.bugs.url).toBe(
58
+ "https://github.com/VirajMishra1/loadout/issues",
59
+ );
60
+ expect(schema.$id).toBe(
61
+ "https://github.com/VirajMishra1/loadout/docs/evidence/live-checks.schema.json",
62
+ );
63
+ ```
64
+
65
+ Update the intentional `packageJson` fixture in `tests/live-evidence.test.ts` to Viraj only after observing the new repository-contract test fail; the fixture change follows production metadata and does not change live-check behavior.
66
+
67
+ - [ ] **Step 2: Run the focused test and confirm RED**
68
+
69
+ Run:
70
+
71
+ ```bash
72
+ npm test -- --run tests/readme-product-flow.test.ts
73
+ ```
74
+
75
+ Expected: failure showing at least the current fork CI/clone/issue or package metadata URL.
76
+
77
+ - [ ] **Step 3: Apply the smallest canonical URL changes**
78
+
79
+ Replace only current canonical fork destinations in the listed files. Do not change the historical fork observations or dated fork CI evidence in `docs/REPOSITORY_STABILIZATION.md`.
80
+
81
+ - [ ] **Step 4: Verify focused behavior and formatting**
82
+
83
+ Run:
84
+
85
+ ```bash
86
+ npm test -- --run tests/readme-product-flow.test.ts tests/live-evidence.test.ts
87
+ npm run readme:check
88
+ npx prettier --check README.md package.json docs/evidence/live-checks.schema.json tests/live-evidence.test.ts tests/readme-product-flow.test.ts
89
+ git diff --check
90
+ ```
91
+
92
+ Expected: both focused files pass; generated README blocks remain current; formatting and diff checks pass.
93
+
94
+ - [ ] **Step 5: Commit**
95
+
96
+ ```bash
97
+ git add README.md package.json docs/evidence/live-checks.schema.json tests/live-evidence.test.ts tests/readme-product-flow.test.ts
98
+ git commit -m "fix: restore Viraj repository identity"
99
+ ```
100
+
101
+ ### Task 2: Create and render the original hero
102
+
103
+ **Files:**
104
+
105
+ - Create: `docs/assets/loadout-hero.svg`
106
+
107
+ **Interfaces:**
108
+
109
+ - Produces: accessible, dependency-free, theme-aware hero consumed by the README in Task 3.
110
+
111
+ - [ ] **Step 1: Draw the approved composition**
112
+
113
+ Create a wide SVG with a developer choosing one extension tile between an unmanaged cluster and five organized loadout slots. Use original basic geometry and path-drawn symbols; include:
114
+
115
+ ```xml
116
+ role="img"
117
+ aria-labelledby="loadout-hero-title loadout-hero-description"
118
+ <title id="loadout-hero-title">Choose an intentional agent loadout</title>
119
+ <desc id="loadout-hero-description">A developer moves an extension from scattered configuration tiles into organized managed equipment slots.</desc>
120
+ ```
121
+
122
+ Use `currentColor`, an internal dark-scheme color override, a wide `viewBox`, and no external content, fonts, scripts, raster images, gradients, or animation.
123
+
124
+ - [ ] **Step 2: Validate source structure**
125
+
126
+ Run:
127
+
128
+ ```bash
129
+ xmllint --noout docs/assets/loadout-hero.svg
130
+ xmllint --xpath 'count(/*[local-name()="svg"]/*[local-name()="title"]) = 1 and count(/*[local-name()="svg"]/*[local-name()="desc"]) = 1' docs/assets/loadout-hero.svg
131
+ rg -n '<script|<image|<animate|<foreignObject|font-family|(?:href|src)="https?://' docs/assets/loadout-hero.svg
132
+ ```
133
+
134
+ Expected: XML and XPath checks succeed; the forbidden-content search has no matches.
135
+
136
+ - [ ] **Step 3: Render four visual contexts**
137
+
138
+ Use the existing Playwright/Chromium dependency or an available SVG renderer to produce untracked PNG previews at approximately 720×225 and 360×113 on white and `#0d1117` backgrounds. Store previews under `/tmp/loadout-hero-preview/`, never in the repository.
139
+
140
+ - [ ] **Step 4: Inspect and iterate**
141
+
142
+ Inspect all four images at original resolution. Confirm the unmanaged cluster, developer selection gesture, management boundary, five slots, and path-drawn symbols remain distinct; text/symbols are legible; no geometry clips; and contrast works in both themes. Iterate until every check passes.
143
+
144
+ - [ ] **Step 5: Format and commit**
145
+
146
+ Run:
147
+
148
+ ```bash
149
+ npx prettier --parser html --check docs/assets/loadout-hero.svg
150
+ git diff --check
151
+ git add docs/assets/loadout-hero.svg
152
+ git commit -m "docs: add intentional loadout hero"
153
+ ```
154
+
155
+ ### Task 3: Add the relatable story and stronger hero contract
156
+
157
+ **Files:**
158
+
159
+ - Modify: `README.md`
160
+ - Modify: `tests/readme-product-flow.test.ts`
161
+
162
+ **Interfaces:**
163
+
164
+ - Consumes: `docs/assets/loadout-hero.svg` from Task 2.
165
+ - Produces: first-visitor README hierarchy with a genuine loadout metaphor and verified hero reference.
166
+
167
+ - [ ] **Step 1: Add failing story/hero assertions**
168
+
169
+ Replace the old mark assertion with:
170
+
171
+ ```ts
172
+ expect(readme).toContain("./docs/assets/loadout-hero.svg");
173
+ expect(readme).toMatch(/skills, plugins, MCP servers, and agent settings/i);
174
+ expect(readme).toMatch(
175
+ /loadout is the deliberate set of tools chosen before a mission/i,
176
+ );
177
+ expect(readme).toMatch(
178
+ /what is installed, where it came from, or how to undo it/i,
179
+ );
180
+ expect(readme).not.toMatch(/founder|revolutionary|game-changing/i);
181
+ ```
182
+
183
+ Also require the README hero alt text to mention a developer and organized loadout slots.
184
+
185
+ - [ ] **Step 2: Run the focused test and confirm RED**
186
+
187
+ Run:
188
+
189
+ ```bash
190
+ npm test -- --run tests/readme-product-flow.test.ts
191
+ ```
192
+
193
+ Expected: failure on the absent hero reference or metaphor paragraph.
194
+
195
+ - [ ] **Step 3: Update only the intended README sections**
196
+
197
+ Replace the top image with `./docs/assets/loadout-hero.svg`, a width appropriate for the wide asset, and meaningful alt text. Add the approved concise paragraph under `## Why Loadout`, followed by the existing three bullets. Do not change the verified journey, transcript, warnings, generated blocks, trust boundaries, installation requirements, or unrelated hierarchy.
198
+
199
+ - [ ] **Step 4: Refresh and verify README contracts**
200
+
201
+ Run:
202
+
203
+ ```bash
204
+ npm run readme:update
205
+ npm run readme:check
206
+ npm run check:evidence
207
+ npm test -- --run tests/readme-product-flow.test.ts tests/readme-facts-script.test.ts tests/readme-claims.test.ts
208
+ npx prettier --check README.md tests/readme-product-flow.test.ts
209
+ git diff --check
210
+ ```
211
+
212
+ Expected: generated blocks current, evidence gate reports zero contradictions, focused tests pass, and no unrelated README section moves.
213
+
214
+ - [ ] **Step 5: Commit**
215
+
216
+ ```bash
217
+ git add README.md tests/readme-product-flow.test.ts
218
+ git commit -m "docs: explain the Loadout metaphor"
219
+ ```
220
+
221
+ ### Task 4: Verify failure boundary, render, links, and full repository
222
+
223
+ **Files:**
224
+
225
+ - Modify only files needed to resolve verified findings.
226
+
227
+ **Interfaces:**
228
+
229
+ - Produces: reviewed branch and unmerged upstream pull request.
230
+
231
+ - [ ] **Step 1: Reconfirm the failed Actions evidence**
232
+
233
+ Use `gh` to confirm run `29708871932`, job `88250042904`, zero job steps, and the billing/spending-limit annotation. Record that no repository command ran and therefore the external failure cannot be reproduced locally.
234
+
235
+ - [ ] **Step 2: Run every intended required-job command locally**
236
+
237
+ Run, separately and read each exit code:
238
+
239
+ ```bash
240
+ npm ci
241
+ npm run format:check
242
+ npm run lint
243
+ npm run typecheck
244
+ node scripts/check-catalog-attribution.mjs
245
+ node scripts/check-discovery-artifacts.mjs
246
+ npm test -- --run
247
+ npm run test:e2e:cli
248
+ npm run test:package
249
+ npm run test:performance
250
+ ```
251
+
252
+ Expected: every command exits zero. `npm test -- --run` is the exact test command the blocked workflow intended to execute.
253
+
254
+ - [ ] **Step 3: Run repository verification entry points**
255
+
256
+ Run:
257
+
258
+ ```bash
259
+ npm run verify
260
+ npm run verify:full
261
+ ```
262
+
263
+ If the combined Playwright wrapper does not return a reliable completion code, run `npm run test:e2e:dashboard` separately and require its explicit success.
264
+
265
+ - [ ] **Step 4: Validate links, XML, and final renders**
266
+
267
+ Check every README relative file target and heading fragment with a focused script, validate SVG XML/accessibility/forbidden content, re-render all four hero contexts, and inspect them. Confirm the README's canonical external links point to Viraj and all dated fork links outside canonical product metadata remain clearly historical.
268
+
269
+ - [ ] **Step 5: Obtain independent final review**
270
+
271
+ Request independent factual/claim review, code/test review, and rendered first-visitor/accessibility review for the complete branch diff. Fix every Critical and Important finding test-first and re-review until clean.
272
+
273
+ - [ ] **Step 6: Push and open an unmerged PR**
274
+
275
+ Push `codex/relatable-readme-hero` to `VirajMishra1/loadout` and open a ready PR against `main`. The PR body must report:
276
+
277
+ - billing/spending-limit root cause and zero executed steps;
278
+ - why no local reproduction of account billing is possible;
279
+ - exact local commands and test counts;
280
+ - hero render/accessibility evidence;
281
+ - files changed and preserved truth boundaries.
282
+
283
+ Do not merge the PR. Confirm its final state is `OPEN`, `isDraft: false`, and base branch `main`.