refactor(linkedin-studio): move agent fasit fixtures + tests out of agents/ (v0.5.3)

The 6 long-form-review fasit fixtures (agents/fixtures/*-cases.md) were registered
by Claude Code as junk `fixtures:*` agents because agents/ is scanned recursively.
They are test fixtures, not capabilities. Moved them + their 6 lint tests to
tests/ + tests/fixtures/ and retargeted the 5 agent fasit-refs. Count-neutral
namespace hygiene (ls agents/*.md still 19).

- agents/fixtures/*-cases.md            -> tests/fixtures/        (6)
- agents/__tests__/*-fixture.test.mjs   -> tests/                 (6; ../fixtures -> ./fixtures)
- 5 agent refs ${CLAUDE_PLUGIN_ROOT}/agents/fixtures -> /tests/fixtures
- version-sync 0.5.2 -> 0.5.3 (plugin.json / README badge / CLAUDE.md / CHANGELOG)

Verify: fixture-lint 35/35 at new path; render 20/20, hooks 139/139; test-runner 109/0/0.
Reinstall/reload required for the 6 spurious agents to leave the registry.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CrTb8ktf1XZWEVwgz5MTTo
This commit is contained in:
Kjell Tore Guttormsen 2026-06-24 13:29:57 +02:00
commit 9111f006cc
21 changed files with 24 additions and 14 deletions

View file

@ -1,6 +1,6 @@
{
"name": "linkedin-studio",
"version": "0.5.2",
"version": "0.5.3",
"description": "LinkedIn Studio — full-spectrum LinkedIn content engine: feed posts, carousels, video scripts, and long-form newsletter editions, with the 2026 relevance-ranking model baked in. v4.0.0 is an audit-remediation release (Voyage Phase 03): every user-facing claim is made honest or removed, all 11 previously-orphaned agents are wired (→ 19 agents), a `/linkedin:firsthour` post-publish command is added (→ 27 commands), the algorithm-signal claims are reconciled to one sourced statement (no unpublishable model name or date), short-form de-AI and video quality gates are added, and the structure lint is rebuilt to guard the real layout plus version/count/stat consistency. Breaking: the newly-wired agents register only on reinstall/reload, and this consolidates the v3.0.0 identity break (slug, agent namespace `linkedin-studio:<agent>`, state-file path `~/.claude/linkedin-studio.local.md`). v3.1.0 added the cold adversarial review package (`/linkedin:headless-review` + Step 6.5 + `/linkedin:pivot` + per-artifact personas); the `/linkedin:*` commands are unchanged. v4.1.0 adds a journey layer: two guided front-doors (`/linkedin:create`, `/linkedin:measure`) plus a router re-tiered into five journeys (Start · Create · Engage · Measure · Grow), with the 27 existing commands kept as the execution tier (→ 29 commands; additive, reload registers the two new commands).",
"author": {
"name": "Kjell Tore Guttormsen"

View file

@ -5,6 +5,16 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [0.5.3] - 2026-06-24
### Changed — registration hygiene: agent fasit fixtures moved out of `agents/`
**Stops Claude Code from registering 6 spurious agents.** The six long-form-review fasit fixtures lived in `agents/fixtures/*-cases.md`; because Claude Code scans `agents/` recursively, each was registered as a junk `fixtures:*` agent (`fixtures:content-reviewer-cases`, …). They are test fixtures, not capabilities. **Count-neutral** (no real agent/command/reference/skill change; `ls agents/*.md` still 19) — pure namespace hygiene.
- **Moved** the 6 fasit fixtures `agents/fixtures/*-cases.md``tests/fixtures/*-cases.md`, and their 6 lint tests `agents/__tests__/*-fixture.test.mjs``tests/*-fixture.test.mjs` (co-located; each test's relative fixture path retargeted `../fixtures/``./fixtures/`). `agents/fixtures/` and `agents/__tests__/` are now removed.
- **Retargeted** the 5 agent fasit-refs (`content`/`language`/`persona`/`editorial`/`fact-reviewer`) from `${CLAUDE_PLUGIN_ROOT}/agents/fixtures/…` to `${CLAUDE_PLUGIN_ROOT}/tests/fixtures/…`.
- **Tests.** Fixture-lint 35/35 at the new path (`node --test 'tests/*.test.mjs'`); render 20/20, hooks 139/139 unaffected; gate `scripts/test-runner.sh` green (counts + version-consistency). Reinstall/reload required for the 6 spurious agents to disappear from the registry.
## [0.5.2] - 2026-06-23
### Added — SB-S2: the evolution loop (second-brain arc)

View file

@ -1,4 +1,4 @@
# LinkedIn Studio Plugin (v0.5.2)
# LinkedIn Studio Plugin (v0.5.3)
> **Version re-baseline (2026-05-31) · M0 landed (2026-06-18, v0.5.0).** Previously numbered 1.0.04.1.0; those were pre-release iterations. The honest maturity is **v0.5.0****the architecture workstream (M0) is complete: user data now lives in a per-user data dir (`${LINKEDIN_STUDIO_DATA:-$HOME/.claude/linkedin-studio}/`) resolved through one seam per runtime, with automatic idempotent migration on session-start** (see `references/data-path-convention.md`). No command has yet passed the hardening quality-gate, command testing is incomplete, and there is no GUI. The remaining path to **v1.0.0** is three workstreams: **hardening** (every command through the quality-gate), **command testing**, and a **GUI**. The development narrative below is preserved as history.

View file

@ -6,7 +6,7 @@
*AI-generated: all code produced by Claude Code through dialog-driven development. [Full disclosure →](../../README.md#ai-generated-code-disclosure)*
![Version](https://img.shields.io/badge/version-0.5.2-blue)
![Version](https://img.shields.io/badge/version-0.5.3-blue)
![Platform](https://img.shields.io/badge/platform-Claude_Code_Plugin-purple)
![Commands](https://img.shields.io/badge/commands-29-green)
![Agents](https://img.shields.io/badge/agents-19-orange)

View file

@ -283,6 +283,6 @@ Read these for the contract and the pipeline position:
lock (Step 8).
- `${CLAUDE_PLUGIN_ROOT}/references/longform-quality-rules.md` — the broad quality
pass; this agent is the *finer* argument-integrity gate that runs cold after it.
- `${CLAUDE_PLUGIN_ROOT}/agents/fixtures/content-reviewer-cases.md` — fasit
- `${CLAUDE_PLUGIN_ROOT}/tests/fixtures/content-reviewer-cases.md` — fasit
fixture: the Del 4 (Security Champions, Maskinrommet, 2026-05-29) worked cases
mapping real argument defects to C1C5 + severities.

View file

@ -276,6 +276,6 @@ Read these for the contract and the pipeline position:
the gate that runs *after* this one; the role boundary is craft vs. response.
- `${CLAUDE_PLUGIN_ROOT}/agents/fact-checker.md` — the Step 5 sweep (truth);
this agent runs *after* it on the fact-checked draft.
- `${CLAUDE_PLUGIN_ROOT}/agents/fixtures/editorial-reviewer-cases.md` — fasit
- `${CLAUDE_PLUGIN_ROOT}/tests/fixtures/editorial-reviewer-cases.md` — fasit
fixture: the Del 4 v5 gold-standard (KTG's eight editorial points mapped to the
two axes + severities).

View file

@ -349,6 +349,6 @@ Read these for the package, the boundary, and the pipeline position:
for the five-archetype cold adversarial-review package.
- `${CLAUDE_PLUGIN_ROOT}/commands/newsletter.md` — Step 6.5 (where this agent runs,
cold, on the frozen draft) and Step 8 (lock + pivot-detection).
- `${CLAUDE_PLUGIN_ROOT}/agents/fixtures/fact-reviewer-cases.md` — fasit fixture:
- `${CLAUDE_PLUGIN_ROOT}/tests/fixtures/fact-reviewer-cases.md` — fasit fixture:
the six Del 4 (Security Champions) worked cases mapped to F1F4 + risk sort +
the pivot-premise rationale.

View file

@ -314,6 +314,6 @@ Read these for the boundary and the pipeline position:
- `${CLAUDE_PLUGIN_ROOT}/references/longform-quality-rules.md` — the broad quality
pass; rule 3 (AI-slop ban-list) is `voice-scrubber`'s; your axis is the cold
Norwegian-language re-read, not the de-AI ban-list.
- `${CLAUDE_PLUGIN_ROOT}/agents/fixtures/language-reviewer-cases.md` — fasit
- `${CLAUDE_PLUGIN_ROOT}/tests/fixtures/language-reviewer-cases.md` — fasit
fixture: the Del 4 / F5 language blind spots (the «Vi» vs «Vi i Nav» quote
error, anglicisms, repetitions) mapped to L1L5 + severities.

View file

@ -394,4 +394,4 @@ the skeleton + pitches (NOT prose — there is none yet) and re-runs this sweep.
Read these files for the persona contract and pipeline position:
- `${CLAUDE_PLUGIN_ROOT}/config/personas.template.md` — the reader persona library, five-field contract, primær rule, two-mode usage
- `${CLAUDE_PLUGIN_ROOT}/agents/fixtures/persona-reviewer-cases.md` — fasit fixture: one persona + sample draft + six axes + both modes
- `${CLAUDE_PLUGIN_ROOT}/tests/fixtures/persona-reviewer-cases.md` — fasit fixture: one persona + sample draft + six axes + both modes

View file

@ -13,7 +13,7 @@ import { fileURLToPath } from 'node:url';
// [GATE]/[OPERATØR], never self-certified here.
const FIXTURE_PATH = fileURLToPath(
new URL('../fixtures/content-reviewer-cases.md', import.meta.url)
new URL('./fixtures/content-reviewer-cases.md', import.meta.url)
);
const fixture = readFileSync(FIXTURE_PATH, 'utf8');

View file

@ -12,7 +12,7 @@ import { fileURLToPath } from 'node:url';
// never self-certified here.
const FIXTURE_PATH = fileURLToPath(
new URL('../fixtures/editorial-reviewer-cases.md', import.meta.url)
new URL('./fixtures/editorial-reviewer-cases.md', import.meta.url)
);
const fixture = readFileSync(FIXTURE_PATH, 'utf8');

View file

@ -11,7 +11,7 @@ import { fileURLToPath } from 'node:url';
// self-certified here.
const FIXTURE_PATH = fileURLToPath(
new URL('../fixtures/fact-checker-cases.md', import.meta.url)
new URL('./fixtures/fact-checker-cases.md', import.meta.url)
);
const VERDICTS = ['🟢', '🔴', '🟡'];

View file

@ -13,7 +13,7 @@ import { fileURLToPath } from 'node:url';
// [GATE]/[OPERATØR], never self-certified here.
const FIXTURE_PATH = fileURLToPath(
new URL('../fixtures/fact-reviewer-cases.md', import.meta.url)
new URL('./fixtures/fact-reviewer-cases.md', import.meta.url)
);
const fixture = readFileSync(FIXTURE_PATH, 'utf8');

View file

@ -13,7 +13,7 @@ import { fileURLToPath } from 'node:url';
// the fasit directions is [GATE]/[OPERATØR], never self-certified here.
const FIXTURE_PATH = fileURLToPath(
new URL('../fixtures/language-reviewer-cases.md', import.meta.url)
new URL('./fixtures/language-reviewer-cases.md', import.meta.url)
);
const fixture = readFileSync(FIXTURE_PATH, 'utf8');

View file

@ -12,7 +12,7 @@ import { fileURLToPath } from 'node:url';
// never self-certified here.
const FIXTURE_PATH = fileURLToPath(
new URL('../fixtures/persona-reviewer-cases.md', import.meta.url)
new URL('./fixtures/persona-reviewer-cases.md', import.meta.url)
);
const fixture = readFileSync(FIXTURE_PATH, 'utf8');