fix(linkedin): close dogfood friction (S14)
Close all 9 friction points from the S13 newsletter dogfood (operator elected to fix F6-F9 rather than defer): - F1: namespace all subagent_type calls in newsletter.md to linkedin-thought-leadership:<name> (4 sites + canonical note) - F2: document agent invocation form + reload requirement in CLAUDE.md + README.md (reload itself is an operator action) - F3: add edition-config / edition-delingstekst / edition-HANDOVER templates under config/ + wire into Steps 0 and 8 + footer - F4: reconcile draft path to <serie>/NN-utkast.md (series root) - F5: de-hardcode series root (explicit arg / LTL_SERIES_ROOT / default) - F6: config-derive carousel editions (remove Seres CAROUSEL set); correct samle comment - F7: build-html.mjs exits non-zero when zero HTML produced - F8: guard parseDelingstekst (graceful ENOENT) + correct Step 8 wording - F9: relocate agents/README.md -> docs/agents-capability-matrix.md Re-tested: 87/87 plugin tests pass; build-html/build-linkedin behavior re-verified live. Per-item outcomes logged in dogfood-S13-friction.md. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
parent
adfa2085fc
commit
92e0a0b4f5
11 changed files with 339 additions and 54 deletions
|
|
@ -177,19 +177,85 @@ missing delingstekst kills the whole build rather than degrading.
|
|||
|
||||
## Friction summary for Step 15 (revert/fix targets)
|
||||
|
||||
| # | Severity | Implicated file | Step 15 disposition |
|
||||
|---|----------|-----------------|---------------------|
|
||||
| F1 | BLOCKER | `commands/newsletter.md` | namespace agent calls |
|
||||
| F2 | BLOCKER/env | env + `CLAUDE.md`/`README.md` | reload + document |
|
||||
| F3 | MAJOR | `config/` + `commands/newsletter.md` | add 3 templates |
|
||||
| F4 | MAJOR | `commands/newsletter.md` | reconcile draft path/name |
|
||||
| F5 | MAJOR | `commands/newsletter.md` | de-hardcode series root |
|
||||
| F6 | MINOR | `render/build-linkedin.mjs` | defer (generalization debt) |
|
||||
| F7 | MINOR | `render/build-html.mjs` (+ Step 7) | exit non-zero on no output |
|
||||
| F8 | MINOR | `render/build-linkedin.mjs` (+ Step 8) | guard delingstekst + fix wording |
|
||||
| F9 | MINOR | `agents/README.md` | relocate / defer |
|
||||
| # | Severity | Implicated file | Step 15 disposition | Status |
|
||||
|---|----------|-----------------|---------------------|--------|
|
||||
| F1 | BLOCKER | `commands/newsletter.md` | namespace agent calls | ✅ |
|
||||
| F2 | BLOCKER/env | env + `CLAUDE.md`/`README.md` | reload + document | ✅ (doc) / 🔶 (reload = operator) |
|
||||
| F3 | MAJOR | `config/` + `commands/newsletter.md` | add 3 templates | ✅ |
|
||||
| F4 | MAJOR | `commands/newsletter.md` | reconcile draft path/name | ✅ |
|
||||
| F5 | MAJOR | `commands/newsletter.md` | de-hardcode series root | ✅ |
|
||||
| F6 | MINOR | `render/build-linkedin.mjs` | config-derive carousel; fix samle comment | ✅ |
|
||||
| F7 | MINOR | `render/build-html.mjs` (+ Step 7) | exit non-zero on no output | ✅ |
|
||||
| F8 | MINOR | `render/build-linkedin.mjs` (+ Step 8) | guard delingstekst + fix wording | ✅ |
|
||||
| F9 | MINOR | `agents/README.md` | relocate out of `agents/` | ✅ (relocated) / 🔶 (de-register on reload) |
|
||||
|
||||
**Headline:** the long-form pipeline's deterministic backbone is sound, but its
|
||||
**gate layer is currently un-runnable** (F1 + F2). Step 15 must close F1 (a concrete
|
||||
one-line-per-call edit) and F2 (reload + a doc note) before the pre-lock persona
|
||||
sweep can actually execute — the order is correctly wired, it just cannot fire yet.
|
||||
|
||||
---
|
||||
|
||||
## Step 15 (S14) — re-test outcomes
|
||||
|
||||
All nine friction points were closed (operator elected to fix F6–F9 rather than
|
||||
defer). Each was re-tested with a concrete check, not a self-asserted "fixed."
|
||||
|
||||
- **F1 — ✅ closed.** All four `Task` call sites in `commands/newsletter.md`
|
||||
(content-repurposer Step 3, fact-checker Step 5, persona-reviewer Steps 6 + 9)
|
||||
now use the namespaced `subagent_type: linkedin-thought-leadership:<name>`, plus a
|
||||
canonical "Agent invocation form (required)" note near the foreground principle.
|
||||
**Check:** `grep -nE 'subagent_type: (fact-checker|persona-reviewer|content-repurposer)' commands/newsletter.md`
|
||||
→ zero bare names; `grep -nE 'linkedin-thought-leadership:(fact-checker|persona-reviewer|content-repurposer)'`
|
||||
→ all 4 sites namespaced.
|
||||
- **F2 — ✅ doc / 🔶 reload.** Documented in `CLAUDE.md` (Agents section: invocation
|
||||
form + reload requirement) and `README.md` (Agent Architecture note). The
|
||||
environmental half — registering a newly-added agent — inherently requires a
|
||||
Claude Code **session reload**; that is an operator action, not a code change.
|
||||
Confirmed F2 persists across `/clear`: `fact-checker`/`persona-reviewer` were
|
||||
still absent from this fresh session's agent registry (only the 15 older agents +
|
||||
README appeared), proving it is a reload gap, not a per-session fluke.
|
||||
- **F3 — ✅ closed.** Added `config/edition-config.template.json`,
|
||||
`config/edition-delingstekst.template.md`, `config/edition-HANDOVER.template.md`
|
||||
(formats reverse-engineered from the render scripts, now shipped as reference).
|
||||
Wired into `newsletter.md` Step 0 (HANDOVER), Step 8 (config + delingstekst), and
|
||||
the Reference Files footer. **Check:** all three exist under `config/`;
|
||||
`edition-config.template.json` parses as valid JSON.
|
||||
- **F4 — ✅ closed.** Step 3 now writes the canonical `<serie>/NN-utkast.md` in the
|
||||
series root (the exact file Steps 7/8 render), with an explicit "do NOT write
|
||||
`linkedin/<article>.draft.md`" warning. **Check:** no `.draft.md`/`<article>` path
|
||||
refs remain except the intentional anti-pattern warning.
|
||||
- **F5 — ✅ closed.** Step 0 resolves a **series root** via an order (explicit path
|
||||
arg → `${LTL_SERIES_ROOT:-…/maskinrommet/serier}/<slug>/` → ask once); maskinrommet
|
||||
is the default, not the only path. The architecture preamble was aligned to match.
|
||||
- **F6 — ✅ closed.** `CAROUSEL = new Set(["03","06"])` removed; carousel editions are
|
||||
now config-derived (`config.carousel`, a list of NN strings) via `loadEditionConfig`
|
||||
+ `EMPTY_CONFIG` + the new config template. Misleading "samle bygges alltid" comment
|
||||
corrected (build has always been gated on `shareMap.samle`). **Check:** `grep -n
|
||||
CAROUSEL render/build-linkedin.mjs` → none; 20/20 render tests pass (one assertion
|
||||
updated to include the `carousel: []` default).
|
||||
- **F7 — ✅ closed.** `build-html.mjs main()` now counts files written, prints
|
||||
`Ingen HTML produsert …` and the CLI guard exits non-zero when zero files are
|
||||
produced (no more silent exit-0 on a typo'd filename). Step 7 wording updated to
|
||||
rely on the exit code AND verify the output file. **Re-tested live:** missing input
|
||||
→ exit 1; valid input → exit 0 + `review/NN-utkast.html` written.
|
||||
- **F8 — ✅ closed.** `parseDelingstekst()` wrapped in try/catch returning `{}` on
|
||||
ENOENT, matching `loadEditionConfig`'s fail-soft contract; Step 8 wording corrected
|
||||
("both inputs optional and graceful," not "either file throws"). **Re-tested live:**
|
||||
no delingstekst → `build-linkedin.mjs` exit 0 + `linkedin/01/POST.html` still built.
|
||||
- **F9 — ✅ relocated / 🔶 de-register on reload.** `git mv agents/README.md
|
||||
docs/agents-capability-matrix.md` — the only reliable fix, since the file registers
|
||||
by filename (it had no frontmatter yet still appeared as
|
||||
`linkedin-thought-leadership:README`). The stale registration clears on the next
|
||||
Claude Code reload (env, same as F2). **Check:** no README in `agents/`;
|
||||
`docs/agents-capability-matrix.md` present.
|
||||
|
||||
### Finding (out of Step 15 scope — recorded, not actioned)
|
||||
|
||||
`plan.md` Steps 16, 17, 18 hard-code `agents/README.md` as an explicit `grep` search
|
||||
path (plan.md:635, 727, 849). After F9's relocation that path no longer exists. The
|
||||
explicit arg is **redundant** with the recursive `agents/` search those greps already
|
||||
include, so dropping it (or repointing to `docs/agents-capability-matrix.md`) is
|
||||
safe — but `plan.md` is outside Step 15's Files list (Hard Rule 2), so this is logged
|
||||
for the operator/those steps rather than edited here. **Action for Steps 16–18:** drop
|
||||
the dangling `agents/README.md` arg from their Verify greps, or repoint to the new path.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue