linersh 0.5.6 → 1.0.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 (98) hide show
  1. package/README.md +65 -165
  2. package/bin/liner.js +82 -44
  3. package/cli-update-docs/ABOUT.md +16 -16
  4. package/cli-update-docs/AI-HANDOFF.md +62 -190
  5. package/cli-update-docs/CURATION.md +48 -19
  6. package/cli-update-docs/JTBD-MASTER-PROMPT-ABOUT.md +9 -12
  7. package/cli-update-docs/JTBD-MASTER-PROMPT.md +1 -1
  8. package/cli-update-docs/LINER-MASTER.md +77 -63
  9. package/cli-update-docs/LINER-MD-PRD.md +531 -0
  10. package/cli-update-docs/MIXTAPE-FORMAT.md +76 -44
  11. package/cli-update-docs/PLATFORM.md +47 -46
  12. package/cli-update-docs/README.md +6 -6
  13. package/cli-update-docs/SKILL.md +72 -37
  14. package/cli-update-docs/TUI-BACKLOG.md +205 -26
  15. package/cli-update-docs/quality-check-tests.md +256 -8
  16. package/cli-update-docs/source-finding-tactics.md +140 -3
  17. package/cli-update-docs/source-quality-hierarchy.md +83 -0
  18. package/cli-update-docs/synthesis-guidance.md +19 -5
  19. package/dist/agents/artifact-validation.js +440 -0
  20. package/dist/agents/artifact-validation.js.map +1 -0
  21. package/dist/agents/candidate-longlist.js +100 -0
  22. package/dist/agents/candidate-longlist.js.map +1 -0
  23. package/dist/agents/detect.js +3 -2
  24. package/dist/agents/detect.js.map +1 -1
  25. package/dist/agents/evaluation-assembly.js +270 -0
  26. package/dist/agents/evaluation-assembly.js.map +1 -0
  27. package/dist/agents/headless-runner.js +227 -0
  28. package/dist/agents/headless-runner.js.map +1 -0
  29. package/dist/agents/jtbd-clarify.js +42 -41
  30. package/dist/agents/jtbd-clarify.js.map +1 -1
  31. package/dist/agents/models.js +6 -7
  32. package/dist/agents/models.js.map +1 -1
  33. package/dist/agents/prompts.js +220 -20
  34. package/dist/agents/prompts.js.map +1 -1
  35. package/dist/agents/runner.js +462 -21
  36. package/dist/agents/runner.js.map +1 -1
  37. package/dist/phases.js +13 -13
  38. package/dist/phases.js.map +1 -1
  39. package/dist/source-inbox.js +297 -0
  40. package/dist/source-inbox.js.map +1 -0
  41. package/dist/version.js +3 -9
  42. package/dist/version.js.map +1 -1
  43. package/dist/yaml-io.js +42 -11
  44. package/dist/yaml-io.js.map +1 -1
  45. package/package.json +26 -23
  46. package/cli-update-docs/JOB-STORY-MIGRATION.md +0 -99
  47. package/dist/App.js +0 -220
  48. package/dist/App.js.map +0 -1
  49. package/dist/colors.js +0 -132
  50. package/dist/colors.js.map +0 -1
  51. package/dist/components/Header.js +0 -15
  52. package/dist/components/Header.js.map +0 -1
  53. package/dist/components/KeyHints.js +0 -17
  54. package/dist/components/KeyHints.js.map +0 -1
  55. package/dist/components/LabeledBox.js +0 -53
  56. package/dist/components/LabeledBox.js.map +0 -1
  57. package/dist/components/NextSteps.js +0 -18
  58. package/dist/components/NextSteps.js.map +0 -1
  59. package/dist/index.js +0 -17
  60. package/dist/index.js.map +0 -1
  61. package/dist/screens/AgentSetup.js +0 -224
  62. package/dist/screens/AgentSetup.js.map +0 -1
  63. package/dist/screens/BootSplash.js +0 -163
  64. package/dist/screens/BootSplash.js.map +0 -1
  65. package/dist/screens/CompileView.js +0 -567
  66. package/dist/screens/CompileView.js.map +0 -1
  67. package/dist/screens/FramingConfirmReview.js +0 -197
  68. package/dist/screens/FramingConfirmReview.js.map +0 -1
  69. package/dist/screens/Gate1Review.js +0 -147
  70. package/dist/screens/Gate1Review.js.map +0 -1
  71. package/dist/screens/Gate2Review.js +0 -162
  72. package/dist/screens/Gate2Review.js.map +0 -1
  73. package/dist/screens/ImportPrompt.js +0 -173
  74. package/dist/screens/ImportPrompt.js.map +0 -1
  75. package/dist/screens/JsSetup.js +0 -77
  76. package/dist/screens/JsSetup.js.map +0 -1
  77. package/dist/screens/LocalFilePicker.js +0 -139
  78. package/dist/screens/LocalFilePicker.js.map +0 -1
  79. package/dist/screens/NewMixtapeWizard.js +0 -662
  80. package/dist/screens/NewMixtapeWizard.js.map +0 -1
  81. package/dist/screens/PhaseRunner.js +0 -1203
  82. package/dist/screens/PhaseRunner.js.map +0 -1
  83. package/dist/screens/ProcessManifest.js +0 -160
  84. package/dist/screens/ProcessManifest.js.map +0 -1
  85. package/dist/screens/ProjectHub.js +0 -557
  86. package/dist/screens/ProjectHub.js.map +0 -1
  87. package/dist/screens/SourceModal.js +0 -269
  88. package/dist/screens/SourceModal.js.map +0 -1
  89. package/dist/screens/TapeBrowser.js +0 -312
  90. package/dist/screens/TapeBrowser.js.map +0 -1
  91. package/dist/screens/TapeDraftReview.js +0 -444
  92. package/dist/screens/TapeDraftReview.js.map +0 -1
  93. package/dist/screens/TapeEditor.js +0 -310
  94. package/dist/screens/TapeEditor.js.map +0 -1
  95. package/dist/screens/cassette-art.js +0 -72
  96. package/dist/screens/cassette-art.js.map +0 -1
  97. package/dist/store.js +0 -10
  98. package/dist/store.js.map +0 -1
@@ -1,227 +1,99 @@
1
1
  # Liner AI Handoff
2
2
 
3
- Last updated: 2026-06-01
3
+ Last updated: 2026-06-25
4
4
 
5
- This handoff summarizes the current Liner state after the 0.5.5 TUI/core release,
6
- marketing-site launch-prep pass, and 0.5.6 source-extraction hardening prep. It
7
- is intended for any AI agent continuing the work without the full chat history.
5
+ This is the short orientation document for an AI agent continuing Liner work without the full chat history. It intentionally avoids release-candidate scratch paths and old local worktrees; verify the current checkout with `pwd` and `git status --short` before editing.
8
6
 
9
7
  ## Current Product State
10
8
 
11
- - `linersh@0.5.5` is published on npm and promoted to `latest`.
12
- - The published Python core/platform packages are `0.5.5`; matching
13
- `linersh-*@0.5.5` platform packages are published on npm and promoted to
14
- `latest`.
15
- - The repo is prepared for `0.5.6` (`pyproject.toml`, `src/liner/__init__.py`,
16
- and `packages/tui/package.json`). It needs rebuilt platform packages because
17
- the Python core changed.
18
- - Platform packages are available for macOS arm64/x64, Linux arm64/x64, and Windows x64.
19
- - The TUI is installed/tested locally from the packed tarball in `/tmp/liner-playwright-test`.
20
- - The main tested mixtape is `staff-design-engenieer` (typo preserved in the folder name).
21
- - Clean npm smoke passed with `npx linersh@latest --version`: `liner 0.5.5 (tui) · 0.5.5 (core)`.
22
-
23
- ## Important Local Paths
24
-
25
- - Active repo/worktree for this thread: `/Users/arturo/.codex/worktrees/875c/liner`
26
- - Previous v0.5.5 implementation worktree: `/Users/arturo/.codex/worktrees/44f8/liner`
27
- - Original Liner project folder: `/Users/arturo/Documents/Projects/Youtube Grabber/liner`
28
- - Original mixtapes folder: `/Users/arturo/Documents/Projects/Youtube Grabber/liner/mixtapes`
29
- - CMD-UX copied mixtapes folder: `/Users/arturo/Documents/Projects/CMD-UX/Case Studies/mixtapes`
30
- - Local TUI test install: `/tmp/liner-playwright-test`
31
- - 0.5.5 release artifacts: `/tmp/liner-release-artifacts-0.5.5`
32
- - 0.5.6 release artifacts: `/tmp/liner-release-artifacts-0.5.6`
33
- - Tested mixtape now moved back to: `/Users/arturo/Documents/Projects/Youtube Grabber/liner/mixtapes/staff-design-engenieer`
34
-
35
- ## What Was Fixed In This Pass
36
-
37
- 0.5.6 source-extraction hardening:
38
-
39
- - Remote web PDFs are detected before HTML extraction and extracted through the
40
- shared PDF helper. This prevents raw `%PDF-` bytes from entering generated
41
- source Markdown.
42
- - Bad web cache entries are purged and refetched when they contain raw PDF
43
- bytes, stale PDF URL fallbacks, tiny soft/playwright fallback bodies, or
44
- cookie-consent-only text.
45
- - Server HTML that looks like an empty client-side app shell now raises
46
- `JsRenderingRequired`, so existing auto-fallback can try Playwright.
47
- - Cookie-consent-only output is rejected as unusable, including after Playwright
48
- rendering. This is intentionally an honest failure, not an automatic
49
- cookie-clicker.
50
- - Partial compile output now says how many source files are usable versus
51
- unavailable placeholders.
52
-
53
- 0.5.5 TUI/core release:
54
-
55
- - Skill bundle resolution for npm installs:
56
- - TUI now resolves the bundled `cli-update-docs/SKILL.md` reliably from the installed package.
57
- - `LINER_SKILL_PATH` can point either at the skill directory or at `SKILL.md`.
58
-
59
- - Playwright/JS rendering onboarding:
60
- - First-run TUI flow now asks whether to install JS rendering support after agent/model setup.
61
- - Compile results that detect missing Chromium show a `JS rendering needed` callout.
62
- - The callout says: `Some pages require headless Chromium to fetch correctly. Press j to run liner setup-js --yes (~150MB).`
63
- - Pressing `j` runs setup and retries compile.
64
-
65
- - Compile result UX:
66
- - Long source lists use an internal viewport with `↑↓` and `pgup/pgdn`.
67
- - PhaseRunner done screens use an internal viewport for the final response.
68
- - Partial compiles now count as complete when `MIXTAPE.md` is written.
69
- - The hub shows `Ready to use — compiled with warnings` when some sources failed.
70
- - Pressing Enter on completed Compile opens the existing compile result instead of fetching again.
71
- - Recompile/retry is explicit with `r` from CompileView.
72
-
73
- - Web extraction fallback:
74
- - `trafilatura` crashes are caught.
75
- - Web handlers keep useful fallback text where possible and surface a soft warning instead of raw Python errors like `'NoneType' object is not subscriptable`.
76
-
77
- - Clean reinstall:
78
- - `liner uninstall` was added to the npm shim.
79
- - It removes `~/.liner`, npm `_npx`, and Playwright Chromium cache.
80
- - It does not remove mixtape project folders.
81
-
82
- ## Known Gotchas
83
-
84
- - The tested mixtape folder is misspelled `staff-design-engenieer`; do not silently rename it unless the user asks, because existing references and copied paths use that spelling.
85
- - `LINER_BIN` matters during local testing. To test TUI changes plus local Python handler fixes, run the TUI with:
9
+ - Repo version files currently agree on `1.0.0`:
10
+ - `pyproject.toml`
11
+ - `src/liner/__init__.py`
12
+ - `packages/tui/package.json`
13
+ - The npm package is `linersh`; running `liner` opens the TUI and forwards CLI subcommands to the bundled core.
14
+ - The TUI can run agent-backed methodology phases with Claude or Codex, using
15
+ the tracked skill bundle at `docs/curation-skill/`. During npm packaging, it
16
+ is copied into `packages/tui/cli-update-docs/`.
17
+ - JS rendering support is optional. `liner setup-js` installs Playwright Chromium; the TUI offers this during onboarding and again when compile detects a source that needs browser rendering.
18
+ - Compilation is the product completion milestone. If `MIXTAPE.md` is written with warnings, the project can still be ready to use with warnings shown.
86
19
 
87
- ```sh
88
- cd /tmp/liner-playwright-test
89
- LINER_BIN=/Users/arturo/.codex/worktrees/875c/liner/.venv/bin/liner ./node_modules/.bin/liner
90
- ```
20
+ ## What Liner Is Building
91
21
 
92
- - Running `./node_modules/.bin/liner` without `LINER_BIN` uses the bundled platform binary, which may not include local Python source edits until platform packages are rebuilt.
93
- - If Python source changed, publishing only the main `linersh` package is not
94
- enough. Rebuild and publish all platform packages at the same version first.
95
- - Cookie-banner auto-dismissal is not implemented in 0.5.6. The safety net is
96
- to reject cookie-only output; a future dismissal pass should keep that final
97
- rejection in place.
98
- - The TUI package generated `packages/tui/cli-update-docs/` during `prepack`; the canonical docs live at repo-root `cli-update-docs/`.
99
- - The old root `docs/` folder was removed. `LINER-MASTER.md` now lives at `cli-update-docs/LINER-MASTER.md`.
100
- - The Jhey source URL currently 404s on the live site. The useful archived version is:
101
-
102
- ```text
103
- https://web.archive.org/web/20250408204038id_/https://jhey.dev/cheep/rotating-gallery-with-css-scroll-driven-animations/
104
- ```
22
+ Liner creates a hyper-specific corpus that helps a downstream AI agent perform one task better. It is not a generic research collector and not a persona builder.
105
23
 
106
- ## Verification Already Run
24
+ The durable artifact set is:
107
25
 
108
- TUI package:
26
+ - `tape.yaml` - source recipe
27
+ - `synthesis.md` - curator framing
28
+ - `working/` - methodology trace
29
+ - `MIXTAPE.md` and `sources/` - compiled consumable context
30
+ - `LINER.md` and root `SKILL.md` - operating layer files that tell future agents how to discover and use the project
109
31
 
110
- ```sh
111
- cd /Users/arturo/.codex/worktrees/875c/liner/packages/tui
112
- npm run typecheck
113
- npm run build
114
- npm test
115
- npm pack --json
116
- ```
32
+ For the current design rationale, read `docs/tui/TERMINAL_TOOLING_DESIGN_FRAMEWORK.md`. The final section, "Always Last: Arturo As A Designer," should stay at the bottom when updating that document.
117
33
 
118
- Python suite:
34
+ ## Current Methodology Shape
119
35
 
120
- ```sh
121
- cd /Users/arturo/.codex/worktrees/875c/liner
122
- uv run --extra dev pytest
123
- ```
36
+ Phase 1 framing must now produce more than a knowledge map. `working/01-jtbd-and-knowledge-map.md` needs:
124
37
 
125
- Result from the latest full Python run in this pass: `190 passed, 1 deselected`.
38
+ - `Capability Brief`
39
+ - `Required source roles`
40
+ - knowledge map
126
41
 
127
- Release-prep verification:
42
+ Each source role needs role name, why it matters, good evidence, and minimum coverage. This is generic: an Art Director Liner, a medical SEO Liner, and a CI debugging Liner should infer different roles from their task.
128
43
 
129
- ```sh
130
- cd /Users/arturo/.codex/worktrees/875c/liner/packages/tui
131
- npm ci
132
- npm run typecheck
133
- npm test
134
- npm run build
135
- npm pack --dry-run
136
-
137
- cd /Users/arturo/.codex/worktrees/875c/liner
138
- python3 -m compileall -q src/liner
139
- uv run --extra dev pytest
140
- ```
44
+ Phase 2 searches against both the knowledge map and required source roles. Phase 5 includes required source-role fit as a quality test. A source is useful only if fetched content actually supports the role it was kept for.
141
45
 
142
- Results: TUI `92 passed`; Python `179 passed, 1 skipped, 1 deselected`.
46
+ ## TUI UX Rules To Preserve
143
47
 
144
- Platform artifact workflow:
48
+ - Enter should advance the primary next action. Preview/log/retry/open actions need their own keys.
49
+ - Long-running work should use the established loading/progress pattern and keep default logs short.
50
+ - Warnings need a recovery route: open, drop, replace, retry, add sources, or continue with a documented limitation.
51
+ - Letter commands must not interfere with typing.
52
+ - Two-option setup/improvement screens should use the shared option style: active orange, inactive gray, selected description white, inactive description gray.
53
+ - Completed compile should open the existing result by default; recompile is explicit.
145
54
 
146
- ```text
147
- Status: latest post-release-prep run is green; check `gh run list --workflow platform-bundles.yml --limit 3` if you need the current run ID.
148
- Artifacts downloaded to: /tmp/liner-release-artifacts-0.5.5
149
- Local npm bundle smoke: liner 0.5.5 (tui) · 0.5.5 (core)
150
- ```
55
+ ## Active Docs
151
56
 
152
- npm release smoke:
57
+ Read these first for product and methodology work:
153
58
 
154
- ```sh
155
- rm -rf ~/.npm/_npx
156
- npx linersh@latest --version
157
- # liner 0.5.5 (tui) · 0.5.5 (core)
158
- ```
59
+ 1. `README.md`
60
+ 2. `docs/tui/TERMINAL_TOOLING_DESIGN_FRAMEWORK.md`
61
+ 3. `docs/curation-skill/CURATION.md`
62
+ 4. `docs/curation-skill/SKILL.md`
63
+ 5. `docs/curation-skill/source-finding-tactics.md`
64
+ 6. `docs/curation-skill/quality-check-tests.md`
65
+ 7. `packages/tui/README.md` if changing user-facing TUI keybindings or flows
159
66
 
160
- ## Useful Test Commands
67
+ Marketing-site work has separate docs in `marketing/site/`.
161
68
 
162
- Install the local TUI tarball into the scratch project:
69
+ ## Verification Commands
163
70
 
164
- ```sh
165
- cd /tmp/liner-playwright-test
166
- npm install /tmp/liner-release-artifacts-0.5.5/linersh-darwin-arm64/linersh-darwin-arm64-0.5.5.tgz /tmp/liner-release-artifacts-0.5.5/linersh-tui/linersh-0.5.5.tgz
167
- ```
168
-
169
- Run the TUI against the local Python core:
170
-
171
- ```sh
172
- cd /tmp/liner-playwright-test
173
- LINER_BIN=/Users/arturo/.codex/worktrees/875c/liner/.venv/bin/liner ./node_modules/.bin/liner
174
- ```
175
-
176
- Force a fresh compile/fetch:
71
+ TUI:
177
72
 
178
73
  ```sh
179
- cd /tmp/liner-playwright-test
180
- LINER_BIN=/Users/arturo/.codex/worktrees/875c/liner/.venv/bin/liner ./node_modules/.bin/liner cache clear --yes
181
- LINER_BIN=/Users/arturo/.codex/worktrees/875c/liner/.venv/bin/liner ./node_modules/.bin/liner
74
+ npm --prefix packages/tui test -- --run
75
+ npm --prefix packages/tui run typecheck
76
+ npm --prefix packages/tui run build
182
77
  ```
183
78
 
184
- Run JS setup explicitly:
79
+ Python/core:
185
80
 
186
81
  ```sh
187
- cd /tmp/liner-playwright-test
188
- LINER_BIN=/Users/arturo/.codex/worktrees/875c/liner/.venv/bin/liner ./node_modules/.bin/liner setup-js --yes
82
+ uv run --extra dev pytest
83
+ python3 -m compileall -q src/liner
189
84
  ```
190
85
 
191
- Clean local state for reinstall testing:
86
+ Docs hygiene:
192
87
 
193
88
  ```sh
194
- liner uninstall --yes
195
- npm uninstall -g linersh 2>/dev/null || true
89
+ git diff --check
90
+ rg -n "four tests|five tests|two gates|two human-in-the-loop|current release v0\\.5\\.[56]|EAI-HANDOFF" README.md docs packages/tui/README.md --glob "*.md" --glob "!docs/curation-skill/TUI-BACKLOG.md" --glob "!docs/curation-skill/AI-HANDOFF.md"
196
91
  ```
197
92
 
198
- ## Documentation State
199
-
200
- Canonical docs now live in `cli-update-docs/`:
201
-
202
- - `LINER-MASTER.md` — current conceptual and technical overview.
203
- - `AI-HANDOFF.md` — this document.
204
- - `TUI-BACKLOG.md` — backlog and done log.
205
- - `MIXTAPE-FORMAT.md` — tape/mixtape format.
206
- - `CURATION.md` — methodology.
207
- - `SKILL.md` and companion files — bundled curation skill.
208
-
209
- Package-specific docs still live in `packages/tui/`:
210
-
211
- - `packages/tui/README.md`
212
- - `packages/tui/PUBLISH-CHECKLIST.md`
213
- - `packages/tui/PLATFORM-BUNDLES.md`
214
-
215
- ## Suggested Next Work
93
+ ## Gotchas
216
94
 
217
- - Deploy the marketing site from `marketing/site` once DNS/Vercel details are ready.
218
- - Update the public website docs and changelog for 0.5.6 after the release
219
- artifacts are ready.
220
- - Consider a conservative Playwright cookie-banner dismissal pass for common,
221
- low-risk labels, while still rejecting cookie-only output if dismissal fails.
222
- - Consider surfacing extraction mode/body length in the TUI compile details.
223
- - Consider adding `liner doctor-source <url>` or equivalent single-source
224
- diagnostics.
225
- - Consider adding Wayback as an automatic fetcher tier between Playwright and agent-summary fallback.
226
- - Add per-source failure actions in CompileView: open URL, drop source, retry one source.
227
- - Add a regression test for completed Compile opening existing results rather than running `streamCompile`.
95
+ - `docs/curation-skill/` is packaged into the npm TUI, so stale methodology docs become user-facing.
96
+ - Do not update archived research transcripts just to quiet searches.
97
+ - Do not reintroduce "advisor" language for the operating layer. Use artifact names and concrete roles.
98
+ - Do not treat URL existence as source quality. Fetched content quality is the real gate.
99
+ - Before reporting state, separate your edits from pre-existing dirty worktree changes.
@@ -6,7 +6,7 @@ A methodology for assembling AI-consumable context bundles that actually work.
6
6
 
7
7
  ## What this document is
8
8
 
9
- A methodology for building mixtapes — curated bundles of sources designed to give an AI substantive context on a specific topic, so it can produce better answers, better drafts, and better judgments than it would from its training data alone.
9
+ A methodology for building mixtapes — curated bundles of sources designed to help an AI agent perform one hyper-specific task better than it could from its training data alone.
10
10
 
11
11
  This document is platform-agnostic. It describes *how to curate well*, not how any specific tool implements curation. Liner is one implementation; the methodology applies equally to mixtapes built with other tools or by hand.
12
12
 
@@ -43,9 +43,15 @@ Every mixtape moves through the same phases. The phases are ordered because each
43
43
 
44
44
  ### Phase 1 — Framing
45
45
 
46
- Define the job-to-be-done. Not the topic. The *use case*.
46
+ Define the reusable capability. Not the topic. The *specific thing a future AI agent should be able to do*.
47
47
 
48
- The JTBD is written as a Job Story: **"When [circumstance], I want [motivation], so I can [outcome]."** All three slots are required. The form is permissive on what fills them — a legal, clinical, or engineering Job Story share this shape but no vocabulary. What it guarantees is that no slot can be empty, which raises the floor on what counts as a JTBD before any qualitative judgment kicks in.
48
+ The user-facing prompt is:
49
+
50
+ > What do you want this Liner to help your AI agent do?
51
+
52
+ The user may answer in normal language. They do not need to provide source categories, research lanes, or a formal Job Story. Liner's job is to infer those from the desired capability, ask a few targeted follow-up questions only when the capability is under-specified, and then create a source-grounded resource that future AI sessions can load.
53
+
54
+ Liner still derives an internal job-to-be-done because the downstream phases need a testable target. A Job Story is one useful internal shape: **"When [circumstance], I want [motivation], so I can [outcome]."** The user should not have to know or write this format. The AI may translate the capability into a Job Story silently, then expose the plain-language intent and research plan for review.
49
55
 
50
56
  "Mobile design" is a topic. It is too vague to curate against. Three Job Stories in that same topic produce three different mixtapes:
51
57
 
@@ -53,15 +59,29 @@ The JTBD is written as a Job Story: **"When [circumstance], I want [motivation],
53
59
  - *When I review mobile design portfolios as a senior IC hiring manager, I want to compare candidates against a consistent rubric of taste and decision-making, so I can decide who to advance with confidence.*
54
60
  - *When I'm choosing a platform strategy for a new mobile product, I want to weigh native vs. cross-platform against the specific constraints of my team and timeline, so I can commit to one path without re-litigating the question every quarter.*
55
61
 
56
- If the job-to-be-done can't be stated as a tight Job Story — single circumstance, single motivation, single outcome, no solutions named, no aspirational mush — the mixtape will be unfocused. This is the single most common failure mode. The [JTBD Master Prompt](JTBD-MASTER-PROMPT.md) is a drop-in interview that elicits one in a single human turn; use it (or have the AI use it) at the start of any new mixtape.
62
+ If the desired capability cannot be made hyper-specific, the mixtape will be unfocused. This is the single most common failure mode. "SEO" is a topic; "SEO keyword research for a mental-health startup specialized in brain surgery" is specific enough for Liner to infer research lanes such as search strategy, medical-content constraints, brain-surgery terminology, and Google guidance.
63
+
64
+ Write a short Capability Brief alongside the internal JTBD. It should name:
65
+
66
+ - what future AI sessions should be able to do,
67
+ - what outputs or decisions the resource should support,
68
+ - the research lanes Liner inferred,
69
+ - source requirements and obvious exclusions,
70
+ - runtime behavior for the future agent, including when to ask the user clarifying questions.
71
+
72
+ Sketch a knowledge map alongside the Capability Brief and internal JTBD: the major areas of the domain, the sub-areas, the edge cases. For mobile design, that might be foundations, patterns, craft, process, edge cases. For another domain, the buckets are different. The map serves three purposes: it structures research, it surfaces gaps, and it becomes the section structure of the finished mixtape.
57
73
 
58
- Sketch a knowledge map alongside the JTBD: the major areas of the domain, the sub-areas, the edge cases. For mobile design, that might be foundations, patterns, craft, process, edge cases. For another domain, the buckets are different. The map serves three purposes: it structures research, it surfaces gaps, and it becomes the section structure of the finished mixtape.
74
+ Also write a capability brief and required source roles.
75
+
76
+ The **capability brief** says what this mixtape should make a downstream AI agent better at. It is not a persona. It is the operational job the corpus must support.
77
+
78
+ **Required source roles** name the kinds of evidence the corpus needs before it can be trusted. Each role should say why it matters, what good evidence looks like, and the minimum coverage needed. For a medical SEO mixtape, roles might include search-engine guidance, medical-topic authority, patient-language evidence, and compliance boundaries. For an art-direction mixtape, roles might include visual-analysis vocabulary, translation methods, high-craft examples, and critique language. The roles change with the JTBD; the requirement does not.
59
79
 
60
80
  Treat the map as a hypothesis. It will get revised during research.
61
81
 
62
82
  ### Phase 2 — Candidate discovery
63
83
 
64
- Generate a long list of candidate sources covering the knowledge map. Lots of them. This phase is about recall, not precision — gather more than you need; you'll cut later.
84
+ Generate a long list of candidate sources covering the knowledge map and the required source roles. Lots of them. This phase is about recall, not precision — gather more than you need; you'll cut later.
65
85
 
66
86
  Methods that produce better candidates than generic search:
67
87
 
@@ -75,21 +95,23 @@ Methods that produce better candidates than generic search:
75
95
 
76
96
  **Conference proceedings.** Going through three years of a specific conference is more efficient than searching for talks topic-by-topic.
77
97
 
78
- **Ask the AI to find gaps, not sources.** Once you have a candidate list, ask: *what's missing from this collection for someone trying to [job-to-be-done]?* AI is bad at recall and good at critique. Use it for the right thing.
98
+ **Ask the AI to find gaps, not sources.** Once you have a candidate list, ask: *what's missing from this collection for an AI agent trying to [capability]?* AI is bad at recall and good at critique. Use it for the right thing.
99
+
100
+ **Search by source role.** A knowledge-map section can look populated while a required evidence role is missing. Search directly for the role the source needs to play: canonical method, domain authority, applied example, boundary/risk, or whatever the Phase 1 source roles require.
79
101
 
80
102
  No fetching yet. This phase produces URLs and titles, not content.
81
103
 
82
104
  ### Phase 3 — Fetching
83
105
 
84
- Pull content for every candidate into the cache. Transcripts, articles, metadata. This is the expensive phase — network calls, transcript scraping, content extraction.
106
+ Pull content for every candidate into the cache. Transcripts, articles, PDFs, local files, and only then metadata when the content cannot be reached. This is the expensive phase — network calls, transcript scraping, content extraction.
85
107
 
86
108
  Two things matter here. First, fetching is part of research, not a tail step. A source can't be honestly evaluated without reading it. Second, fetched content should be cached. The same source used in multiple mixtapes should be fetched once.
87
109
 
88
- After fetching, every candidate has readable content available for evaluation.
110
+ After fetching, every candidate has either readable content available for evaluation or an explicit failure state. Search snippets, titles, and URLs are not source evidence.
89
111
 
90
112
  ### Phase 4 — Evaluation
91
113
 
92
- Read the fetched content and rate each candidate against the job-to-be-done. This is where keep/trim/drop decisions actually happen.
114
+ Read the fetched content and rate each candidate against the Capability Brief and internal JTBD. This is where keep/trim/drop decisions actually happen. Kept and trimmed sources must include `fetch_status`, `content_quality`, and at least two content-specific evidence bullets so the corpus can prove the decision came from content, not just URL plausibility.
93
115
 
94
116
  Source quality, roughly in order of preference:
95
117
 
@@ -113,7 +135,7 @@ Evaluations should include a brief reason. "This source is canonical for the fou
113
135
 
114
136
  ### Phase 5 — Quality checks
115
137
 
116
- Four tests every mixtape should pass. Run them deliberately.
138
+ Run the quality tests deliberately. This phase checks whether the corpus can actually support the future agent's task, not just whether it has plausible sources.
117
139
 
118
140
  **The redundancy test.** Read each source's role in the mixtape. Are any two sources making essentially the same point? If yes, keep the better one and cut the other. Mixtape volume is not a virtue. Five excellent sources beat fifteen good ones.
119
141
 
@@ -121,11 +143,15 @@ Four tests every mixtape should pass. Run them deliberately.
121
143
 
122
144
  **The disagreement test.** Pick the strongest claim made by sources in the mixtape. Find someone credible who disagrees with it. Either include the disagreement or explicitly note that the mixtape takes a position. A mixtape that only includes one side of a contested question produces worse AI output, because the AI then can't see the contested-ness.
123
145
 
124
- **The framing-gap test.** Step back and look at the whole mixtape. Is there a major perspective on this topic that's missing entirely — not just an individual source, but a whole way of thinking about the JTBD? If yes, the framing was too narrow. Expand the knowledge map and revisit Phase 2.
146
+ **The framing-gap test.** Step back and look at the whole mixtape. Is there a major perspective on this capability that's missing entirely — not just an individual source, but a whole way of thinking about the task? If yes, the framing was too narrow. Expand the knowledge map and revisit Phase 2.
125
147
 
126
- This last test is the one most curators skip. It's also the highest-leverage. Single-pass curation tends to produce mixtapes that are well-covered within one narrow framing. The framing-gap test catches this.
148
+ **The source-kind balance test.** Check the distribution of reference, principle, prescription, and example sources. A zero in any role is a decision, not an accident. Backfill or defend it.
127
149
 
128
- If a mixtape fails any of these tests, fix it before moving on.
150
+ **The required source-role fit test.** Return to the roles from Phase 1. Does each role have fetched, readable, useful evidence? Is the evidence strong enough for the role, or merely adjacent? If a role is weak or absent, run a backfill pass, narrow the capability claim, or document the limitation and what custom source the curator should add.
151
+
152
+ The framing-gap and source-role fit tests are the ones most curators skip. They are also the highest-leverage. Single-pass curation tends to produce mixtapes that are well-covered within one narrow framing. These tests catch what the first pass could not see.
153
+
154
+ If a mixtape fails any of these tests, fix it before moving on when the fix is small enough for the quality phase. If the failure points to a wider source-role gap, write `working/05-operating-fit-audit.md` with `status: improvement_recommended`: name the missing role, explain why it matters, suggest search lanes, and list concrete custom sources the user could add if public research remains thin. Do not call the corpus ready with a limitation when the right next step is to run a focused improvement pass.
129
155
 
130
156
  ### Phase 6 — Synthesis
131
157
 
@@ -154,11 +180,11 @@ Theory aside — here's how to know if the mixtape is actually working:
154
180
 
155
181
  1. Compile the mixtape
156
182
  2. Paste it into an AI conversation as context
157
- 3. Ask the AI a question that the mixtape's job-to-be-done should help with
183
+ 3. Ask the AI to do something the mixtape's capability should support
158
184
  4. Ask the same question without the mixtape in a separate conversation
159
185
  5. Compare the answers honestly
160
186
 
161
- If the answer with the mixtape is meaningfully better — more specific, more correct, more nuanced, less generic — the mixtape is working. If the answers are similar, the mixtape isn't earning its place. Either the sources are too generic, the synthesis isn't doing enough work, or the JTBD is too broad.
187
+ If the answer with the mixtape is meaningfully better — more specific, more correct, more nuanced, less generic — the mixtape is working. If the answers are similar, the mixtape isn't earning its place. Either the sources are too generic, the synthesis isn't doing enough work, or the capability is too broad.
162
188
 
163
189
  This empirical check is required for library contributions. Run it. Document the result.
164
190
 
@@ -202,7 +228,7 @@ The methodology supports two intensities of engagement.
202
228
 
203
229
  **Quick mode** runs the methodology automatically. The curator provides the JTBD and confirms the AI's proposals at each gate. The AI does the heavy lifting — generating candidates, evaluating, drafting curator notes, drafting the synthesis. The curator's job is to catch obvious errors and make final calls. A complete mixtape takes 15–30 minutes. Output is good enough for personal use.
204
230
 
205
- **Methodology mode** treats the AI as a research assistant rather than the curator. The curator engages substantively at each gate — revises the knowledge map, reviews evaluation rationales, makes deliberate keep/drop decisions, writes their own synthesis. The AI accelerates the tedious work; the judgment stays human. A complete mixtape takes several hours. Output is library-eligible.
231
+ **Methodology mode** treats the AI as a research assistant rather than the curator. The curator engages substantively at each gate — revises the capability brief, knowledge map, and source roles; reviews evaluation rationales; makes deliberate keep/drop decisions; writes their own synthesis. The AI accelerates the tedious work; the judgment stays human. A complete mixtape takes several hours. Output is library-eligible.
206
232
 
207
233
  Both modes use the same lifecycle and produce the same artifact shape. They differ in how much human judgment shows up in the working notes and the synthesis. Quick mode mixtapes can be upgraded to methodology mode by going back and doing the substantive work; methodology mode mixtapes can be produced in one pass by curators who already know the domain.
208
234
 
@@ -216,7 +242,7 @@ Patterns that produce bad mixtapes. Watch for them.
216
242
 
217
243
  **The greatest-hits mixtape.** A list of the most famous resources on a topic. Looks impressive, adds little value because the AI already knows about famous resources from training. Curate for *non-obvious* sources, not popular ones.
218
244
 
219
- **The unfocused mixtape.** No clear job-to-be-done; tries to cover the entire field. Result: shallow on everything, deep on nothing.
245
+ **The unfocused mixtape.** No clear capability; tries to cover the entire field. Result: shallow on everything, deep on nothing.
220
246
 
221
247
  **The author-tribute mixtape.** Three of the five sources are by the same person, because the curator is a fan. This narrows perspective and reduces the AI's ability to synthesize across views.
222
248
 
@@ -224,10 +250,12 @@ Patterns that produce bad mixtapes. Watch for them.
224
250
 
225
251
  **The noteless mixtape.** Sources without curator notes. Either the curator was lazy or didn't actually have a reason for each source. Both are problems. If a source's role can't be articulated, it doesn't belong.
226
252
 
227
- **The aspirational mixtape.** Sources the curator thinks people *should* read, not sources that help with the actual job-to-be-done. Mixtapes are tools, not reading recommendations.
253
+ **The aspirational mixtape.** Sources the curator thinks people *should* read, not sources that help with the actual capability. Mixtapes are tools, not reading recommendations.
228
254
 
229
255
  **The single-pass mixtape.** Curated without a framing-gap test. Well-covered within one narrow framing, blind to whole perspectives the curator didn't think to look for.
230
256
 
257
+ **The role-missing mixtape.** Every section has sources, but one required evidence role is absent. The corpus looks full while still failing the job. Fix by backfilling the role, narrowing the claim, or documenting the limitation.
258
+
231
259
  ---
232
260
 
233
261
  ## A note on AI assistance
@@ -241,6 +269,7 @@ AI is especially prone to:
241
269
  - Producing generic curator notes that say "this is a useful resource" without specificity
242
270
  - Missing primary documents (specs, papers) in favor of secondary commentary
243
271
  - Failing the framing-gap test because it doesn't notice what it didn't search for
272
+ - Filling knowledge-map sections while missing required source roles
244
273
 
245
274
  Compensate deliberately. Search for primary sources yourself even when AI doesn't surface them. Verify every URL. Treat AI-drafted notes as first drafts. Run the framing-gap test with intent.
246
275
 
@@ -14,7 +14,7 @@ The JTBD Master Prompt fixes that gap. It's a single, drop-in prompt that takes
14
14
 
15
15
  ## What it is
16
16
 
17
- A self-contained master prompt stored at `cli-update-docs/JTBD-MASTER-PROMPT.md`. The body sits between `---BEGIN---` and `---END---` markers and is meant to be copy-pasted into an AI conversation, embedded inside the `curating-mixtapes` skill, or spawned as a TUI subprocess.
17
+ A self-contained master prompt stored at `docs/curation-skill/JTBD-MASTER-PROMPT.md`. The body sits between `---BEGIN---` and `---END---` markers and is meant to be copy-pasted into an AI conversation, embedded inside the `curating-mixtapes` skill, or spawned as a TUI subprocess.
18
18
 
19
19
  The prompt's sole deliverable is a single sentence in the Intercom Job Story form: *"When [circumstance], I want [motivation], so I can [outcome]."* No rationale, no knowledge map, no commentary — those belong to later phases. One sentence on one line.
20
20
 
@@ -36,10 +36,10 @@ Five moves, in order:
36
36
 
37
37
  ## Where it came from
38
38
 
39
- The prompt is the engineering output of a mixtape compiled specifically for this question. The mixtape lives at:
39
+ The prompt is the engineering output of a mixtape compiled specifically for this question. That local source mixtape is archived at:
40
40
 
41
41
  ```
42
- mixtapes/jtbd-master-prompt/
42
+ /Users/arturo/Documents/Projects/0-archive/liner-archive/2026-06-25-root-cleanup/mixtapes/jtbd-master-prompt/
43
43
  ├── MIXTAPE.md # compiled master file
44
44
  ├── tape.yaml # the recipe
45
45
  ├── synthesis.md # the curator's framing
@@ -83,7 +83,7 @@ Three deployment paths, all using the same prompt:
83
83
 
84
84
  **Agent with filesystem access (Claude Code, Cowork desktop, Codex, the Liner TUI as a subprocess).** Both file attachments and folder paths are live. The user picks; the agent reads accordingly.
85
85
 
86
- **Embedded inside the `curating-mixtapes` skill.** Drop the prompt block into `cli-update-docs/SKILL.md` as the body of Phase 1 — Framing, replacing the current "Ask the user for the JTBD" paragraph. The skill's outer context provides Liner framing; this prompt handles JTBD elicitation. Filesystem access is the default in the skill's runtime.
86
+ **Embedded inside the `curating-mixtapes` skill.** Drop the prompt block into `docs/curation-skill/SKILL.md` as the body of Phase 1 — Framing, replacing the current "Ask the user for the JTBD" paragraph. The skill's outer context provides Liner framing; this prompt handles JTBD elicitation. Filesystem access is the default in the skill's runtime.
87
87
 
88
88
  **As a TUI subprocess.** A future `liner jtbd <folder>` command could spawn this prompt with the folder path in context. The context-sharing question still fires — the user might want to add files or skip the folder — but the path is available if they want it.
89
89
 
@@ -122,12 +122,9 @@ A few decisions in the prompt aren't obvious and have been pushed back on during
122
122
  ## Related files
123
123
 
124
124
  - The prompt itself: [`JTBD-MASTER-PROMPT.md`](./JTBD-MASTER-PROMPT.md)
125
- - The format migration plan: [`JOB-STORY-MIGRATION.md`](./JOB-STORY-MIGRATION.md)
126
- - The source mixtape: [`mixtapes/jtbd-master-prompt/`](../mixtapes/jtbd-master-prompt/)
127
- - Synthesis (the bridge between JTBD theory and prompt engineering): [`mixtapes/jtbd-master-prompt/synthesis.md`](../mixtapes/jtbd-master-prompt/synthesis.md)
128
- - Tape recipe: [`mixtapes/jtbd-master-prompt/tape.yaml`](../mixtapes/jtbd-master-prompt/tape.yaml)
129
- - 32 source extracts: [`mixtapes/jtbd-master-prompt/sources/`](../mixtapes/jtbd-master-prompt/sources/)
130
- - The Liner curation methodology that places this work in Phase 1: [`cli-update-docs/CURATION.md`](./CURATION.md)
131
- - The skill that will likely embed this prompt: [`cli-update-docs/SKILL.md`](./SKILL.md)
132
- - The mixtape format spec defining the `jtbd:` field the prompt's output lands in: [`cli-update-docs/MIXTAPE-FORMAT.md`](./MIXTAPE-FORMAT.md)
125
+ - The current format spec: [`MIXTAPE-FORMAT.md`](./MIXTAPE-FORMAT.md)
126
+ - The archived source mixtape: `/Users/arturo/Documents/Projects/0-archive/liner-archive/2026-06-25-root-cleanup/mixtapes/jtbd-master-prompt/`
127
+ - The Liner curation methodology that places this work in Phase 1: [`CURATION.md`](./CURATION.md)
128
+ - The skill that will likely embed this prompt: [`SKILL.md`](./SKILL.md)
129
+ - The mixtape format spec defining the `jtbd:` field the prompt's output lands in: [`MIXTAPE-FORMAT.md`](./MIXTAPE-FORMAT.md)
133
130
  - Project-level overview of Liner: [`LINER-MASTER.md`](./LINER-MASTER.md)
@@ -134,7 +134,7 @@ The prompt's first move is always the same — ask the user whether they have pr
134
134
 
135
135
  **Agent with filesystem access (Claude Code, Cowork desktop, Codex, the Liner TUI as a subprocess).** Both file attachments and folder paths work. If the user gives a path, the agent reads from disk.
136
136
 
137
- **Inside the `curating-mixtapes` skill.** Drop the prompt block into `cli-update-docs/SKILL.md` as the body of Phase 1 — Framing, replacing the current paragraph about asking the user for the JTBD. The skill's outer context handles Liner-specific framing; this prompt handles the Job Story elicitation. The skill runs in environments with full filesystem access.
137
+ **Inside the `curating-mixtapes` skill.** Drop the prompt block into `docs/curation-skill/SKILL.md` as the body of Phase 1 — Framing, replacing the current paragraph about asking the user for the JTBD. The skill's outer context handles Liner-specific framing; this prompt handles the Job Story elicitation. The skill runs in environments with full filesystem access.
138
138
 
139
139
  **Inside the TUI as a dedicated subprocess.** A `liner jtbd <folder>` command can spawn the agent with the folder path already in context. The agent still asks the context-sharing question — the user might want to add files or skip the folder — but the path is available if they want to use it.
140
140