Skip to content

refactor(skills)!: remove OpenSpec workflow and factory skills - #93

Merged
patextreme merged 5 commits into
mainfrom
cleanup
Nov 2, 2026
Merged

patextreme merged 5 commits into
mainfrom
cleanup

Conversation

@patextreme

@patextreme patextreme commented Nov 1, 2026 •

Copy link
Copy Markdown
Owner

Summary

Remove the OpenSpec workflow and everything it governed:

  • openspec/ change store (active changes, archive, specs, config)
  • OpenSpec lifecycle/orchestration skills: openspec-review, openspec-propose-issue, orc-openspec-*, orc-issue-to-pr, cleanup-merged-issues, plus their local .pi copies
  • manual semantic suites under tests/semantic/, the test:semantic script, and the three gate tests that backed them
  • ADR-0001 with the semantic-evidence policy it governed

pr-review-repair remains, without the OpenSpec finalization contract. AGENTS.md, README.md, GLOSSARY.md, and docs/agents/* are updated to match, and .gitignore now covers multi-output Nix result-* symlinks.

No flake outputs are removed or renamed — pi-permission, pi-ollama-usage, pi-opencode-usage, pi-codex-alias, pi-notify-me, pi-prompts, and pi-skills still exist. The breaking part is the removed packaged skills and OpenSpec store for pi install consumers.

Verification

  • nix flake check — all checks pass, including the hermetic node-tests tier (400/400, 0 skipped)
  • npm test — 399 pass, 1 Nix-only skip; biome check . and tsc --noEmit clean
  • no dangling references (grep sweep) and 0 broken relative Markdown links
  • downstream check against patextreme/dotfiles develop (the current config, agent-mod locked at 6b4820b): it consumes pi-acp, pi-permission, pi-ollama-usage, pi-opencode-usage, pi-codex-alias, pi-notify-me, pi-prompts/init.md, and pi-skills/pr-review-repair. None of the removed skills, prompts, or the openspec/ store are referenced; the one skill it takes from pi-skills is pr-review-repair, which this branch retains. (pkgs.llm-agents.openspec in its module list is the external CLI package, unrelated to this repository.)

The OpenSpec change store, its orchestration/proposal/review/cleanup
skills, local .pi skill copies, semantic suites, and their gate tests
are gone. pr-review-repair remains, without the OpenSpec finalization
contract.

- drop openspec/ changes, archive, specs, and config
- drop openspec-review, openspec-propose-issue, orc-*, and
  cleanup-merged-issues skills
- drop tests/semantic, the test:semantic script, and three gate suites
- retire ADR-0001 with the semantic evidence it governed
- update AGENTS.md, README, GLOSSARY, and issue-tracker docs
pr-review-repair is the only packaged skill and stays model-invocable,
so humanOnlySkills had no members left. Assert the invocability
directly instead of comparing against an empty set.
The gate now covers the single surviving skill, so the "factory" vocabulary
was a dead leading word: rename the file, the packagedSkills map, the notice
helper, the temp dir, and the hermetic PI_FACTORY_SKILLS_OUTPUT variable to
PI_SKILLS_OUTPUT (test and nix check both sides).
- README: collapse the scattered toolkit headings into prerequisites, a round
  boundary, and one set of caveats; drop the one-skill "Applies to" table
  column and the duplicated authorisation/assurance statements; fold the acpx
  and OpenSpec skill retirements into one "Retired tooling" section; replace
  the stale `^0.99.1` codex-alias peer claim with a pointer to Requirements.
- AGENTS.md: document that a published skill needs an entry in the
  skills-distribution gate's packagedSkills map, and correct the notify-me
  command list (`/notify-me-cancel` is a separate command, not a reserved
  argument).
- skills/pr-review-repair: drop the leftover "change/store context" hand-off
  vocabulary from the removed OpenSpec procedures.
The first page carried ~270 lines of per-extension contracts (notify-me
alone was 177). Keep README.md as the index, install path, and dev setup,
and let each component document itself beside its code.

- extensions/<name>/README.md now holds each extension's behavior,
  configuration, privacy, and retry contracts; links are rewritten to
  resolve from the new location
- README keeps a one-line-per-extension table as the only pointer
- Skill toolkit compressed to prerequisites + link; the round-boundary
  and budgeting text stays in SKILL.md where it already lives
- Retired tooling history moved to docs/retired-tooling.md
- tests/gates/readme-index.test.mjs guards the split: every extension
  owns a README, the index links all of them, and no relative
  documentation link dangles
- AGENTS.md: document the per-extension README convention, repoint the
  notify-me documentation reference, and add the missing ollama-usage
  Repo Layout entry
@patextreme

Copy link
Copy Markdown
Owner Author

Review complete — limited coverage, no repair-worthy findings

Fresh Standards and Spec reviews covered the full PR diff at e3f55d4 (194 files, +474/−13,015). 0 blockers · 0 significant bugs · 0 unresolved investigations · 7 report-only · 2 refuted.

Report-only highlights:

  • F-006 — PR-body verification counts are stale: at HEAD, direct npm test is 403 tests / 402 pass / 1 skip and the hermetic tier is 403/403; the body says 399/400.
  • F-007 — Escalation left GLOSSARY.md while pr-review-repair still uses it; the glossary's scope now excludes skill vocabulary.
  • F-001, F-004, F-005, F-008 — minor test/doc hygiene: dead provenance assertion, duplicated link extractors, “status bar” wording, narrow link gate.
  • F-009 — deleted OpenSpec specs covered surviving capabilities; intended by the PR.

Validation: fresh rebuilds of biome-check, tsc-check, node-tests (403/403) and all 8 flake outputs passed; direct npm test 402 pass / 1 skip; no dangling relative links. nix flake check itself was cache-only and is not counted as independent evidence.

Scope: limited coverage — no tracked issue/spec; the PR body was used as stated intent. The downstream patextreme/dotfiles claim, live-model execution, and a real pi install were not verified.

Reviewed: e3f55d4 · Repairs: none · Attempts: 0/10 · Human input: none

Full review reports, judge ledger, and audit details

Standards

Complete original report:

Standards axis report — 7a8166a...e3f55d4

Verification run: npm test → 403 tests, 402 pass, 1 skip (the hermetic PI_SKILLS_OUTPUT tier), 0 fail.

(a) Documented-standard violations

Hard: none found. Checked and satisfied:

  • AGENTS.md “Every extension must have a flake output” — 5 extensions/* dirs, 5 pi-<name> derivations, all in both packages and checks (nix/modules/pi-package.nix:19-149).
  • AGENTS.md “Every published skill needs a gate entry” — packagedSkills in tests/gates/skills-distribution.test.mjs:34-41 matches what ships (skills/pr-review-repair only; references/policy.md exists).
  • AGENTS.md “Every extension documents itself” — 5 READMEs added, all linked from the README.md table; tests/gates/readme-index.test.mjs passes; docs/retired-tooling.md links resolve.
  • AGENTS.md removal rule — README ## <Name> Extension sections correctly relocated; rule text updated in the same diff (AGENTS.md:71).
  • No dangling references: git grep finds no survivor pointing at tests/semantic/, docs/adr/0001, openspec/, flows/, PI_FACTORY_SKILLS_OUTPUT, or removed skills. PI_SKILLS_OUTPUT is consistent between nix/modules/pi-package.nix:136 and the gate.
  • Test placement — new gate is tests/gates/readme-index.test.mjs, the allowed root.

(b) Baseline smells (judgement calls)

  1. Speculative Generality / stale artifact — tests/gates/skills-distribution.test.mjs:641: assert.ok(!packedPaths.has("skills/FACTORY-PROVENANCE.md")); still guards a file the rename commit claims is retired (“historical provenance was retired, so no provenance document is expected”, line ~143).
  2. Speculative Generality — externalSkills now denies code-review-project/code-review-agents (line 40-41); no surviving doc or pr-review-repair text names these. The skill requires only code-review. The deny list overstates externals it cannot describe.
  3. Mysterious Name / mis-grouping — docs/retired-tooling.md:6 files cleanup-merged-issues and orc-issue-to-pr under “OpenSpec workflow skills”; neither is OpenSpec-specific, and the deleted ADR-0001 (“semantic suites… evidence stays local”) is compressed into “manual semantic suites” with no pointer — docs/agents/domain.md still tells agents to “Read decisions in docs/adr/”, which now loses that decision silently (deleted, not superseded).
  4. Duplicated Code — relativeLinksIn (readme-index.test.mjs:29-40) and localMarkdownTargets (skills-distribution.test.mjs:66-82) reimplement markdown-link extraction with divergent rules (one drops spaces/parens, one keeps absolute paths). One shared helper would serve both gates.
  5. Glossary avoided synonym — GLOSSARY.md “Status slot … Avoid: Status bar” vs the newly added files: extensions/ollama-usage/README.md:5, extensions/opencode-usage/README.md:5, extensions/permission/README.md:31, and README.md:28-29 (“in the status bar”). docs/agents/domain.md says “Respect explicitly avoided synonyms.” Wording is inherited from the old README, so severity is low.

Spec

Complete original report:

Spec axis report — e3f55d4 vs 7a8166a

(a) Missing or partial

Stale verification numbers. PR body: "npm test — 399 pass, 1 Nix-only skip" and "the hermetic node-tests tier (400/400, 0 skipped)". At HEAD npm test reports 403 tests, 402 pass, 1 skipped. The +3 are the three top-level tests in tests/gates/readme-index.test.mjs (every extension owns a README, the main README links every extension README, relative documentation links resolve), added in the final commit e3f55d4. The quoted numbers predate the reviewed head, so the verification claim does not describe HEAD.

Glossary term dropped, term survives. PR body: "AGENTS.md, README.md, GLOSSARY.md, and docs/agents/* are updated to match." GLOSSARY.md lost its **Escalation** entry, yet surviving skills/pr-review-repair/SKILL.md uses escalation five times as a load-bearing stage outcome ("Own sequencing, evidence acceptance, repair accounting, and escalation"). Rewritten-to-match is true only for the removed lifecycle; one retained concept now has no canonical definition.

Everything else asked for checks out: openspec/, tests/semantic/, the three gate tests, ADR-0001, the seven .pi/skills/openspec-* copies, and all named skills are gone; test:semantic removed from package.json/AGENTS.md; git grep finds no live references beyond deliberate historical mentions in README.md:98 and docs/retired-tooling.md; the seven pi-* derivations are unchanged in name and still wired into both packages and checks; pr-review-repair retains no archive/finalization language; .gitignore has result-*.

(b) Not asked for (scope creep)

  • PR body says only that the docs "are updated to match"; the diff instead restructures them: five new extensions/*/README.md files, a new enforcing gate tests/gates/readme-index.test.mjs, and two new AGENTS.md conventions ("Every extension documents itself", "Every published skill needs a gate entry").
  • 0c26b97 renames factory-skills.test.mjs → skills-distribution.test.mjs and, in nix/modules/pi-package.nix, PI_FACTORY_SKILLS_OUTPUT → PI_SKILLS_OUTPUT inside the node-tests build.
  • 4d2ada4 drops "empty human-only skill bookkeeping" (FACTORY-PROVENANCE.md assertion).
  • Unrequested but correct factual fixes: AGENTS.md /notify-me cancel → /notify-me-cancel (matches extensions/notify-me/adapter.ts:113) and a new ollama-usage Repo Layout bullet.
  • New file docs/retired-tooling.md (not named in the body).

(c) Implemented but wrong

None found beyond (a). npx biome check . and tsc --noEmit are clean at HEAD; the retired-tooling claims in README.md match the removals.

Judge ledger

Judgment — run e3f55d4 · round 1. Outcome: limited coverage · no repair-worthy findings. Actionable queue: none. Prior actionable IDs: none existed (first judgment, empty ledger) — nothing to reconcile.

Report-only findings

ID Provenance Evidence Impact Correction
F-001 Standards (a3) tests/gates/skills-distribution.test.mjs:641 !packedPaths.has("skills/FACTORY-PROVENANCE.md") Vacuous: the file never existed in this repo (git log --all -- skills/FACTORY-PROVENANCE.md empty; absent at base 7a8166a). Not introduced here — carried through the rename. No runtime consequence. Drop the dead assertion when the file is next touched.
F-004 Standards (a4) readme-index.test.mjs:16,25-34 vs skills-distribution.test.mjs:63-76 Two divergent markdown-link extractors; grep shows 0 broken relative links across all 21 tracked .md files (judge scan). Maintenance smell only. Optional shared helper; no behavior change.
F-005 Standards (a5) GLOSSARY.md:31-33 (_Avoid_: Status bar) vs README.md:28-29, extensions/{permission,ollama-usage,opencode-usage}/README.md Wording violation of docs/agents/domain.md:16; but the phrase moved verbatim out of the old README, so nothing was newly invented. Cosmetic. Reword to "status slot" on next edit.
F-006 Spec (a1) PR body "399 pass, 1 skip" / "hermetic (400/400, 0 skipped)" vs measured npm test = 403 tests, 402 pass, 1 skip; hermetic derivation passes with the skip tier enabled Stale by exactly the 3 tests e3f55d4 added (readme-index.test.mjs). The substance ("all pass, 0 skipped hermetically") holds; only counts are wrong. Misleading evidence, no delivery risk. Correct the numbers in the PR body or in the round summary; do not repair code.
F-007 Spec (a2) GLOSSARY.md dropped **Escalation**; skills/pr-review-repair/SKILL.md:9,33,38,50 and references/pseudocode.md:16-77 use escalation as a load-bearing outcome One surviving concept has no canonical definition. GLOSSARY.md:3 explicitly narrows scope to "test suites and usage-reporting extensions", and the skill defines escalation operationally, so this is a documentation gap, not a contract breach. Optional one-line glossary re-entry if the author wants skill vocabulary centralized.
F-008 Judge readme-index.test.mjs:16 MARKDOWN_LINK = /\[[^\]]*\]\(([^)\s]+)\)/g; coverage limited to README.md, extensions/*/README.md, docs/retired-tooling.md (:14) Gate silently ignores links with titles and reference-style links, and never checks AGENTS.md/docs/agents/*. No dangling link exists today (verified), so the gate is weak, not wrong. Harden later; not a defect in this PR's claims.
F-009 Judge (adversarial) Deleted openspec/specs/{permission-yolo,notify-me,testing-harness}/spec.md Requirements docs for surviving capabilities now live only in AGENTS.md, the extension READMEs, and tests. Deleting the store is the explicit PR intent (PR body), so this is an accepted information loss, not a deviation. None within this PR; flag for the author's future spec source.

Refuted

  • F-002 (Standards a2, externalSkills) — refuted. tests/gates/skills-distribution.test.mjs:38-42 is a deny list of default skill names that must not be loaded; the same names are seeded as fake defaults at :663-664 (seedDefaultSkill). The list's purpose is to prove includeDefaults: false isolation, not to document externals, so absence of prose about code-review-project/-agents is not a defect.
  • F-003 (Standards a3, domain docs) — refuted as stated. docs/adr/ still exists with 0002-opencode-usage-reads-undocumented-inference-meters.md, so docs/agents/domain.md:8 is not dangling. cleanup-merged-issues and orc-issue-to-pr genuinely routed the OpenSpec pipeline, so the grouping in docs/retired-tooling.md:6 is defensible, and ADR-0001's governing feature (tests/semantic/) is removed with it — deletion, not silent supersession.
  • "Removed gates lost non-OpenSpec coverage" — refuted. cleanup-merged-issues.test.mjs (305 lines) and both openspec-implement* gates asserted only removed skill/spec text plus the removed tests/semantic materializer's storage admission. No surviving contract depended on them.
  • "Renamed gate stopped enforcing its claims" — refuted. packagedSkills matches the shipped tree exactly (git ls-files skills = LICENSE + pr-review-repair/*), reference presence, installed-link portability, npm pack contents, MIT notice, and isolated discovery all still assert (:560-714); the humanOnlySkills removal is behavior-preserving because the set was already empty and only pr-review-repair remains (4d2ada4).
  • "pr-review-repair broke its own contract" — refuted. The four edited files remove only OpenSpec/archival clauses; git grep -i archiv -- skills returns nothing, prepare.md/pseudocode.md/SKILL.md stay mutually consistent (issue/spec "when one exists"), and the report-contract examples still match the contract text (report-contracts.md tests pass).

Ledger (all findings)

F-001 Standards · report-only · open · skills-distribution.test.mjs:641. F-004 Standards · report-only · open. F-005 Standards · report-only · open. F-006 Spec · report-only · open (fix in PR prose/summary, not code). F-007 Spec · report-only · open. F-008 Judge · report-only · open. F-009 Judge · report-only · accepted-by-design. F-002, F-003 · refuted, resolution evidence above at e3f55d4.

Removal completeness (verified, no finding)

No live reference remains to openspec/, tests/semantic, test:semantic, docs/adr/0001, PI_FACTORY_SKILLS_OUTPUT, or the seven removed skills outside deliberate mentions (README.md:98, docs/retired-tooling.md:5-6). nix/modules/pi-package.nix:136 and the gate agree on PI_SKILLS_OUTPUT. Flake outputs unchanged in name: nix eval reports 8 packages (pi-acp, pi-codex-alias, pi-notify-me, pi-ollama-usage, pi-opencode-usage, pi-permission, pi-prompts, pi-skills) and 11 checks wiring every package plus biome-check/tsc-check/node-tests. Breaking-change claim for pi install consumers is supported: only skills/pr-review-repair is packed now.

Check status at reviewed head

  • Fresh (judge): npm test → 403 tests, 402 pass, 1 skip, 0 fail; nix build --rebuild of biome-check and tsc-check → exit 0; repo-wide relative-link scan → 0 dangling.
  • Fresh (review): nix build --no-link --rebuild of biome-check, tsc-check, node-tests → exit 0 (node-tests 403/403); all 8 flake package outputs rebuilt → exit 0.
  • Cached but content-addressed to HEAD (flake src = clean git tree): node-tests (/nix/store/2rq1z3…-node-tests, built earlier, all 403 pass with PI_SKILLS_OUTPUT), plus package outputs and the pi-acp check, which were evaluated but not force-rebuilt by the judge.
  • nix flake check -L itself ran 0 checks (cache-only), so it is not counted as independent evidence.

Limitations

Requirements coverage is limited to the PR body (untrusted); its downstream patextreme/dotfiles claim is unverifiable here. No live-model execution of pr-review-repair, no GitHub markdown rendering check, and no test of pi install against a real Pi host. No escalation questions.

Audit record

  • Run ID: e3f55d4501cfa9b459d2567cb1fb2491aec6eeb5 (reported as e3f55d4); round 1; kind summary.
  • PR: refactor(skills)!: remove OpenSpec workflow and factory skills #93 (patextreme/agent-mod#93), base main, head cleanup, same repository.
  • Pinned base / merge-base: 7a8166a755da44b3036b6fd1a7aa18c7f21d0b81 / same.
  • Reviewed / local / remote head: e3f55d4501cfa9b459d2567cb1fb2491aec6eeb5 (all equal). Delivered head: not applicable — no commits or pushes.
  • Worktree: /home/pat/Desktop/workspace/personal/agent-mod, clean before and after review/judgment.
  • Repairs used: 0/10. Repair-start / scope-amendment records: not applicable (no repair attempt).
  • Checks: nix flake check -L exit 0 but cache-only (0 checks run); fresh rebuilds as listed above; direct npm test 403 tests / 402 pass / 1 skip / 0 fail. No required check failed; no check was unavailable.
  • Coverage: limited coverage explicitly authorized by the user; no tracked issue/spec exists. Standards sources: AGENTS.md, docs/agents/*, README.md, GLOSSARY.md, docs/adr/0002-*, gate tests, biome.json, tsconfig.json, package.json, .github/workflows/, plus the code-review smell baseline.
  • Reviewers: fresh Standards and Spec agents with no prior reports/history; independent judge re-verified the reports and adversarially swept the full 194-file diff. Prior-ID reconciliation: none (first round; 0 prior comments/reviews).
  • Delivery state: no commit, no push, no merge; final PR decision recorded by this comment. Merge remains the user's decision.

@patextreme
patextreme merged commit e391c28 into main Nov 2, 2026
1 check passed
@patextreme
patextreme deleted the cleanup branch November 2, 2026 07:39
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant