diff --git a/.agents/plugins/marketplace.json b/.agents/plugins/marketplace.json
new file mode 100644
index 0000000..b2412d9
--- /dev/null
+++ b/.agents/plugins/marketplace.json
@@ -0,0 +1,21 @@
+{
+ "name": "propulsion",
+ "interface": {
+ "displayName": "Propulsion",
+ "developerName": "Moon Pixels"
+ },
+ "plugins": [
+ {
+ "name": "propulsion",
+ "source": {
+ "source": "local",
+ "path": "./"
+ },
+ "policy": {
+ "installation": "AVAILABLE",
+ "authentication": "ON_INSTALL"
+ },
+ "category": "Coding"
+ }
+ ]
+}
diff --git a/.agents/skills b/.agents/skills
new file mode 120000
index 0000000..42c5394
--- /dev/null
+++ b/.agents/skills
@@ -0,0 +1 @@
+../skills
\ No newline at end of file
diff --git a/.codex-plugin/plugin.json b/.codex-plugin/plugin.json
new file mode 100644
index 0000000..461331f
--- /dev/null
+++ b/.codex-plugin/plugin.json
@@ -0,0 +1,47 @@
+{
+ "name": "propulsion",
+ "version": "1.0.0",
+ "description": "Propulsion workflow routing and skills for agentic coding.",
+ "author": {
+ "name": "Moon Pixels"
+ },
+ "homepage": "https://github.com/moonpixels/propulsion",
+ "repository": "https://github.com/moonpixels/propulsion",
+ "license": "MIT",
+ "keywords": [
+ "propulsion",
+ "codex",
+ "codex-plugin",
+ "opencode",
+ "opencode-plugin",
+ "agentic-coding",
+ "skills",
+ "workflow",
+ "planning",
+ "tdd",
+ "debugging",
+ "review",
+ "guardrails",
+ "developer-tools"
+ ],
+ "skills": "./skills/",
+ "hooks": "./hooks/hooks.json",
+ "interface": {
+ "displayName": "Propulsion",
+ "shortDescription": "Workflow routing and skills for agentic coding.",
+ "longDescription": "Propulsion adds a compact workflow skill set and high-priority startup routing guidance while preserving Codex tools and permissions.",
+ "developerName": "Moon Pixels",
+ "category": "Coding",
+ "capabilities": ["Interactive", "Read", "Write"],
+ "websiteURL": "https://github.com/moonpixels/propulsion",
+ "defaultPrompt": [
+ "Turn my idea into an implementation-ready plan with Propulsion",
+ "Debug and fix this bug with Propulsion guardrails",
+ "Review these changes with the Propulsion review workflow"
+ ],
+ "brandColor": "#FF4F00",
+ "composerIcon": "./assets/propulsion_icon_square.png",
+ "logo": "./assets/banner.png",
+ "screenshots": []
+ }
+}
diff --git a/.opencode/package.json b/.opencode/package.json
deleted file mode 100644
index a286ab1..0000000
--- a/.opencode/package.json
+++ /dev/null
@@ -1,6 +0,0 @@
-{
- "type": "module",
- "dependencies": {
- "@opencode-ai/plugin": "1.4.10"
- }
-}
diff --git a/.opencode/plugins/propulsion.js b/.opencode/plugins/propulsion.js
deleted file mode 100644
index cd60b64..0000000
--- a/.opencode/plugins/propulsion.js
+++ /dev/null
@@ -1,229 +0,0 @@
-import fs from 'node:fs';
-import path from 'node:path';
-import { fileURLToPath } from 'node:url';
-
-const dirname = path.dirname(fileURLToPath(import.meta.url));
-const skillsDir = path.resolve(dirname, '../../skills');
-const additionalSkillsDir = path.resolve(dirname, '../../additional/skills');
-const additionalCommandsDir = path.resolve(
- dirname,
- '../../additional/commands',
-);
-const propulsionWorkflowPath = path.join(
- skillsDir,
- 'propulsion-workflow',
- 'SKILL.md',
-);
-
-const parseFrontmatterValue = (value) => {
- const trimmed = value.trim();
-
- if (
- (trimmed.startsWith('"') && trimmed.endsWith('"')) ||
- (trimmed.startsWith("'") && trimmed.endsWith("'"))
- ) {
- return trimmed.slice(1, -1);
- }
-
- if (trimmed === 'true') {
- return true;
- }
-
- if (trimmed === 'false') {
- return false;
- }
-
- return trimmed;
-};
-
-const extractFrontmatter = (raw) => {
- const match = raw.match(/^---\r?\n([\s\S]*?)\r?\n---\r?\n?([\s\S]*)$/);
-
- if (!match) {
- return { frontmatter: {}, content: raw };
- }
-
- const frontmatter = {};
- const frontmatterBlock = match[1] ?? '';
- const content = match[2] ?? '';
-
- // This intentionally supports the tiny flat frontmatter surface used by bundled
- // commands. It is not a general YAML parser.
- for (const line of frontmatterBlock.split(/\r?\n/)) {
- const entryMatch = line.match(/^([A-Za-z0-9_-]+):\s*(.*)$/);
-
- if (!entryMatch) {
- continue;
- }
-
- const key = entryMatch[1];
- const value = entryMatch[2];
-
- if (!key || value === undefined) {
- continue;
- }
-
- const parsedValue = parseFrontmatterValue(value);
-
- switch (key) {
- case 'description':
- if (typeof parsedValue === 'string' && parsedValue) {
- frontmatter.description = parsedValue;
- }
- break;
- case 'agent':
- if (typeof parsedValue === 'string' && parsedValue) {
- frontmatter.agent = parsedValue;
- }
- break;
- case 'model':
- if (typeof parsedValue === 'string' && parsedValue) {
- frontmatter.model = parsedValue;
- }
- break;
- case 'subtask':
- if (typeof parsedValue === 'boolean') {
- frontmatter.subtask = parsedValue;
- }
- break;
- default:
- break;
- }
- }
-
- return { frontmatter, content };
-};
-
-const addSkillsPath = (config, skillsPath) => {
- config.skills = config.skills ?? {};
- config.skills.paths = config.skills.paths ?? [];
-
- if (!config.skills.paths.includes(skillsPath)) {
- config.skills.paths.push(skillsPath);
- }
-};
-
-const loadAdditionalCommands = () => {
- if (!fs.existsSync(additionalCommandsDir)) {
- return {};
- }
-
- const commands = {};
-
- for (const entry of fs.readdirSync(additionalCommandsDir, {
- withFileTypes: true,
- })) {
- if (!entry.isFile() || !entry.name.endsWith('.md')) {
- continue;
- }
-
- const filePath = path.join(additionalCommandsDir, entry.name);
- const raw = fs.readFileSync(filePath, 'utf8');
- const { frontmatter, content } = extractFrontmatter(raw);
-
- if (!content.trim()) {
- continue;
- }
-
- commands[path.basename(entry.name, '.md')] = {
- template: content,
- ...(frontmatter.description
- ? { description: frontmatter.description }
- : {}),
- ...(frontmatter.agent ? { agent: frontmatter.agent } : {}),
- ...(frontmatter.model ? { model: frontmatter.model } : {}),
- ...(typeof frontmatter.subtask === 'boolean'
- ? { subtask: frontmatter.subtask }
- : {}),
- };
- }
-
- return commands;
-};
-
-const mergeAdditionalCommands = (config, additionalCommands) => {
- if (Object.keys(additionalCommands).length === 0) {
- return;
- }
-
- config.command = config.command ?? {};
-
- // Bundled commands are defaults only. A user command with the same name wins.
- for (const [name, definition] of Object.entries(additionalCommands)) {
- if (!(name in config.command)) {
- config.command[name] = definition;
- }
- }
-};
-
-const getBootstrapContent = () => {
- if (!fs.existsSync(propulsionWorkflowPath)) {
- return null;
- }
-
- const raw = fs.readFileSync(propulsionWorkflowPath, 'utf8');
- const { content } = extractFrontmatter(raw);
-
- return `
-**If you were dispatched as a subagent to execute a specific task, IGNORE THIS MESSAGE.**
-
-You are using the Propulsion workflow.
-
-**IMPORTANT: The workflow skill content is included below. It is ALREADY LOADED - you are currently following it. Do NOT use the skill tool to load "propulsion-workflow" again - that would be redundant.**
-
-${content}
-`;
-};
-
-export const PropulsionPlugin = async (_pluginInput, options = {}) => {
- const { additional = false } = options;
- const additionalCommands = additional ? loadAdditionalCommands() : {};
-
- return {
- config: async (config) => {
- addSkillsPath(config, skillsDir);
-
- if (additional && fs.existsSync(additionalSkillsDir)) {
- addSkillsPath(config, additionalSkillsDir);
- mergeAdditionalCommands(config, additionalCommands);
- }
- },
-
- 'experimental.chat.messages.transform': async (
- _transformInput,
- output,
- ) => {
- const bootstrap = getBootstrapContent();
-
- if (!bootstrap || output.messages.length === 0) {
- return;
- }
-
- const firstUser = output.messages.find(
- (message) => message.info.role === 'user',
- );
-
- if (!firstUser || firstUser.parts.length === 0) {
- return;
- }
-
- if (
- firstUser.parts.some(
- (part) =>
- part.type === 'text' &&
- part.text.includes('EXTREMELY_IMPORTANT'),
- )
- ) {
- return;
- }
-
- const ref = firstUser.parts[0];
-
- if (!ref || ref.type !== 'text') {
- return;
- }
-
- firstUser.parts.unshift({ ...ref, text: bootstrap });
- },
- };
-};
diff --git a/.oxfmtrc.json b/.oxfmtrc.json
index 6204260..398f676 100644
--- a/.oxfmtrc.json
+++ b/.oxfmtrc.json
@@ -2,19 +2,17 @@
"$schema": "./node_modules/oxfmt/configuration_schema.json",
"ignorePatterns": ["node_modules/**", ".opencode/node_modules/**"],
"printWidth": 80,
+ "tabWidth": 4,
"singleQuote": true,
"sortImports": {
"groups": [
- "builtin",
- "external",
- "internal",
- "parent",
- "sibling",
- "index"
+ ["builtin", "external"],
+ ["internal", "subpath"],
+ ["parent", "sibling", "index"],
+ "unknown"
]
},
"sortPackageJson": {
"sortScripts": true
- },
- "tabWidth": 4
+ }
}
diff --git a/AGENTS.md b/AGENTS.md
index 9473976..2b9a46a 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -1,2 +1,2 @@
-- When the user corrects your approach with a reusable, global rule for future work, ask whether they want it added to `AGENTS.md`; if they do, load the `agentic-config` skill and update `AGENTS.md`.
+- When the user corrects you with a reusable, global rule, ask if they want it added to `AGENTS.md`.
- After implementing changes run `bun run checks` before handoff.
diff --git a/README.md b/README.md
index 971a41c..667f266 100644
--- a/README.md
+++ b/README.md
@@ -2,24 +2,47 @@
# Propulsion
-Propulsion is a compact skill set for agentic coding.
-
-It gives coding agents a stronger workflow: explore unclear work first, write a PRD, turn it into a plan, execute in thin slices with an objective implementation-review loop, and debug from evidence instead of guesses.
+Propulsion is a compact skill set for agentic coding. It gives coding agents a stronger workflow.
## Installation
-Propulsion is installed as an OpenCode plugin.
+### Codex CLI
-Install it for a project by adding it to that project's `opencode.json`:
+Add the Propulsion marketplace:
-```json
-{
- "$schema": "https://opencode.ai/config.json",
- "plugin": ["propulsion@git+https://github.com/moonpixels/propulsion.git"]
-}
+```sh
+codex plugin marketplace add moonpixels/propulsion
+```
+
+Open Codex, run `/plugins`, select the Propulsion marketplace, install
+Propulsion, then restart Codex.
+
+To update:
+
+```sh
+codex plugin marketplace upgrade propulsion
```
-Or install it globally in `~/.config/opencode/opencode.json`:
+### Codex Desktop
+
+Add the Propulsion marketplace with the Codex CLI:
+
+```sh
+codex plugin marketplace add moonpixels/propulsion
+```
+
+Open the desktop app's Plugins page, select the Propulsion marketplace, install
+Propulsion, then restart the app.
+
+To update:
+
+```sh
+codex plugin marketplace upgrade propulsion
+```
+
+### OpenCode
+
+Add Propulsion to `opencode.json`:
```json
{
@@ -28,8 +51,6 @@ Or install it globally in `~/.config/opencode/opencode.json`:
}
```
-Optional extras, including agent-authoring helpers and extra workflow commands, are documented in [`additional/README.md`](additional/README.md).
-
## Acknowledgements
Propulsion is heavily inspired by:
diff --git a/additional/README.md b/additional/README.md
deleted file mode 100644
index b65b7e8..0000000
--- a/additional/README.md
+++ /dev/null
@@ -1,23 +0,0 @@
-# Additional OpenCode Assets
-
-These assets are separate from the default Propulsion workflow.
-
-They are optional skills and commands, including agent-authoring helpers and extra workflow commands, and are only included when you explicitly enable them.
-
-## Installation
-
-Add Propulsion to your OpenCode config with the `additional` option enabled:
-
-```json
-{
- "$schema": "https://opencode.ai/config.json",
- "plugin": [
- [
- "propulsion@git+https://github.com/moonpixels/propulsion.git",
- {
- "additional": true
- }
- ]
- ]
-}
-```
diff --git a/additional/commands/commit.md b/additional/commands/commit.md
deleted file mode 100644
index c9a87f8..0000000
--- a/additional/commands/commit.md
+++ /dev/null
@@ -1,56 +0,0 @@
----
-description: Automatically stage safe changes and create one local commit
-agent: build
-subtask: true
----
-
-**You are a subagent executing a specific task.**
-
-## Inputs
-
-- Current git status: `git status --short`
-- Current git diff (staged and unstaged): `git diff HEAD`
-- Current branch: `git branch --show-current`
-
-## Instructions
-
-1. Create exactly one commit from current local changes.
-2. Auto-stage relevant changes with `git add -A`, including untracked files.
-3. Unstage excluded files before commit when they are staged.
-4. If there are no committable changes after exclusions, stop and output exactly:
- - `No changes to commit.`
-5. Generate a normal imperative commit subject from the diff, and enforce this format:
- - one line only
- - short descriptive subject line
- - imperative mood
- - normal natural wording
- - no trailing punctuation
-
-## Rules
-
-- NEVER commit likely secret files, ALWAYS unstage them if applicable. Exclude these patterns:
- - `.env`
- - `.env.*`
- - `*.pem`
- - `*.key`
- - `*.p12`
- - `*.pfx`
- - `credentials.json`
- - `*credentials*`
- - `*secret*`
- - `*token*`
- - `.ssh/*`
-- DO NOT push, open PRs, amend, reset, or force anything.
-
-## Output
-
-Use this exact format for your output when the commit succeeds:
-
-- Run `git status --short` before producing the final response.
-
-```md
-Commit created:
-Message:
-Files:
-Excluded secret-like files:
-```
diff --git a/additional/commands/init.md b/additional/commands/init.md
deleted file mode 100644
index 082883e..0000000
--- a/additional/commands/init.md
+++ /dev/null
@@ -1,13 +0,0 @@
----
-description: Create or prune AGENTS.md into minimal global steering for this project
-agent: build
-subtask: true
----
-
-**You are a subagent executing a specific task.**
-
-You are initialising OpenCode by creating or pruning AGENTS.md into minimal global steering.
-
-## Instructions
-
-1. Load the `agentic-config` skill immediately and follow it strictly.
diff --git a/additional/commands/pr.md b/additional/commands/pr.md
deleted file mode 100644
index c78939a..0000000
--- a/additional/commands/pr.md
+++ /dev/null
@@ -1,89 +0,0 @@
----
-description: Create or reuse a pull request from the current branch with safe commit + push
-agent: build
-subtask: true
----
-
-**You are a subagent executing a specific task.**
-
-## Inputs
-
-User input: $ARGUMENTS
-
-- If `$ARGUMENTS` is non-empty then treat it as the base branch name
-
-## Instructions
-
-1. Resolve the base branch from `$ARGUMENTS`, or default to the repo's main development branch (e.g. `main`).
-2. Collect context first:
- - `git status --short`
- - `git branch --show-current`
- - `git log --oneline ...HEAD`
- - `git diff ...HEAD`
- - `git diff --stat ...HEAD`
-3. If the current branch matches the chosen base branch, stop and ask the user to confirm the intended base branch.
-4. If the worktree is dirty, invoke `/commit` with no arguments before pushing.
-5. After `/commit`, refresh the branch context before generating PR metadata:
- - `git status --short`
- - `git log --oneline ...HEAD`
- - `git diff ...HEAD`
- - `git diff --stat ...HEAD`
-6. If there is no upstream for the current branch, push with `git push -u origin `. Otherwise, run `git push`.
-7. If push fails because of authentication, permissions, or remote access requires user action, stop and report the failing command with one concrete unblock action.
-8. Check for an existing open PR for the current head branch with `gh pr list --head --state open --json url,number,title,body,baseRefName,headRefName`.
-9. If an open PR already exists with a different base branch than the chosen ``, stop and ask the user whether to correct the PR base.
- - If the user agrees, update the base with `gh pr edit --base ` before any title or body refresh.
- - If the user declines, stop and ask them to rerun `/pr` with the intended base branch.
-10. If an open PR already exists on the chosen base, handle it before generating new metadata.
- - If no commit delta exists against the base branch, reuse the existing PR unchanged and output its URL.
- - Otherwise, show its URL and ask whether to refresh the title and summary.
- - If the user agrees, update only the title and body with `gh pr edit`.
- - If the user declines, reuse the existing PR unchanged.
-11. If no commit delta exists against the base branch, output exactly:
- - `No PR changes to open.`
-12. Infer a Conventional Commit PR title from the full `...HEAD` scope.
- - use the complete branch diff and commit history, not just the latest commit
- - approved types beyond `feat:` and `fix:` are allowed:
- - `build`: production dependencies or build-system changes
- - `chore`: maintenance, admin, or dev-only dependency work
- - `ci`: CI or automation pipeline changes
- - `docs`: documentation-only changes
- - `feat`: a new feature or functionality
- - `fix`: a bug fix for incorrect behaviour
- - `perf`: a performance improvement
- - `refactor`: code changes without behaviour changes
- - `revert`: reverts an earlier change
- - `style`: formatting or style-only clean-up
- - `test`: adds or updates tests
- - make the title a valid Conventional Commit subject suitable for squash merge history
-13. Use a PR body with this exact shape:
-
- ```md
- ## Summary
-
- -
- ```
-
-14. If no open PR exists, create one with `gh pr create --base --title "" --body ""`.
-15. Verify with `gh pr view --json url,number,title,baseRefName,headRefName,state`.
-
-## Rules
-
-- NEVER force push, reset, amend older commits, or change git config.
-- ALWAYS stop for correction when the current branch equals the base branch.
-- ALWAYS stop for user action when push or GitHub auth fails.
-- ALWAYS collect context first.
-- DO use the complete branch diff and commit history, not just the latest commit.
-- ALWAYS make the title a valid Conventional Commit subject suitable for squash merge history.
-
-## Output
-
-Use this exact format for your output when PR creation or reuse succeeds:
-
-```md
-PR URL:
-Title:
-Base branch:
-Head branch:
-State:
-```
diff --git a/additional/commands/review.md b/additional/commands/review.md
deleted file mode 100644
index f4ea3e7..0000000
--- a/additional/commands/review.md
+++ /dev/null
@@ -1,51 +0,0 @@
----
-description: Run a report-first senior code review with PR-first context gathering and local fallback modes.
-agent: build
-subtask: true
----
-
-**You are a subagent executing a specific task.**
-
-## Inputs
-
-User input: $ARGUMENTS
-
-- Interpret `$ARGUMENTS` as review scope only.
-- Accepted review scope forms:
- - `#`
- - `uncommitted`
- - `branch`
- - `branch `
-
-## Instructions
-
-1. Resolve the review scope from `$ARGUMENTS`.
-2. If mode is missing, use the question tool:
- - header: Review mode
- - question: Which changes should I review?
- - options:
- - `Pull request (Recommended)` - Review a real GitHub PR by number
- - `Branch diff` - Review current branch changes against a base branch
- - `Uncommitted` - Review staged, unstaged, and untracked changes
-3. If PR review is selected, ask one follow-up question for the PR reference in `#123` form.
-4. If mode is `branch` and base branch is missing, use the question tool:
- - header: Base branch
- - question: Compare current branch against which base branch?
- - options:
- - `main (Recommended)` - Use `main...HEAD`
- - `Custom base branch` - I will provide another branch name
-5. If custom base is selected, ask one follow-up question for the branch name.
-6. Once the review mode and any required follow-up answers are resolved, load the `code-review` skill and follow it strictly.
-7. Pass the resolved review mode, PR reference, and base branch into `code-review`.
-
-## Rules
-
-- ALWAYS keep the accepted review scope forms explicit: `#`, `uncommitted`, `branch`, and `branch `.
-- ALWAYS validate a custom base branch against local refs or `origin/` refs before proceeding.
-- ALWAYS ask exactly one corrective question when the branch is not found:
- - header: Branch not found
- - question: I could not find that branch. Did you mean the ?
- - options:
- - ` (Recommended)` - Use the closest matching branch
- - `Enter a different branch` - I will provide another branch name
-- ALWAYS repeat the same branch validation and corrective question flow after `Enter a different branch`.
diff --git a/additional/skills/agentic-commands/SKILL.md b/additional/skills/agentic-commands/SKILL.md
deleted file mode 100644
index 6b45f6f..0000000
--- a/additional/skills/agentic-commands/SKILL.md
+++ /dev/null
@@ -1,37 +0,0 @@
----
-name: agentic-commands
-description: Create OpenCode command files for workflow automation. Use when defining slash commands, updating .opencode/commands, or when asked to add/modify OpenCode command templates.
----
-
-# Create Agentic Commands
-
-Write OpenCode command templates that agents can execute reliably in TUI or headless mode.
-
-## Quick Start
-
-```markdown
----
-description: Run tests with coverage and report failures
-agent: build
----
-
-Run the full test suite:
-
-`bun test --coverage`
-
-If tests fail, list each failure with file:line and suggest fixes.
-```
-
-## Core Rules
-
-- Store commands in `.opencode/commands/{name}.md` (global: `~/.config/opencode/commands/{name}.md`).
-- Use `$ARGUMENTS` (or `$1`, `$2`) for user input, `cmd` for shell output, and `@file` to include file contents.
-- Write explicit success/failure handling and verification steps.
-- Avoid destructive shell commands unless the user explicitly asks; if needed, require confirmation.
-- Prefer `subtask: true` for noisy or multi-step workflows.
-- Do not set `model` unless the user requests it.
-
-## References
-
-- [references/examples.md](references/examples.md) - Compact, safe command templates
-- [references/agent-basics.md](references/agent-basics.md) - Agent selection and subtask behavior
diff --git a/additional/skills/agentic-commands/references/agent-basics.md b/additional/skills/agentic-commands/references/agent-basics.md
deleted file mode 100644
index a4835b9..0000000
--- a/additional/skills/agentic-commands/references/agent-basics.md
+++ /dev/null
@@ -1,24 +0,0 @@
-# Agent Basics for Commands
-
-Use these pointers when choosing `agent:` or `subtask: true` in command files.
-
-## Built-in Agents
-
-| Agent | Mode | Use Case |
-| --------- | -------- | ---------------------------------------- |
-| `build` | primary | Default agent for most command workflows |
-| `plan` | primary | Planning/analysis only, no writes |
-| `general` | subagent | Research or multi-step assistance |
-| `explore` | subagent | Fast codebase exploration |
-
-## Agent Selection Tips
-
-- Omit `agent` to use the current/default agent.
-- Use `plan` when you need analysis only (no edits).
-- Use specialized agents (like `code-reviewer`) for focused tasks.
-
-## When to Use `subtask: true`
-
-- Long-running workflows
-- Commands that generate large output
-- Tasks you want isolated from the main conversation
diff --git a/additional/skills/agentic-commands/references/examples.md b/additional/skills/agentic-commands/references/examples.md
deleted file mode 100644
index b01da5f..0000000
--- a/additional/skills/agentic-commands/references/examples.md
+++ /dev/null
@@ -1,55 +0,0 @@
-# Command Examples
-
-Short, safe templates for OpenCode `.opencode/commands/*.md` files.
-
-## Example 1: Targeted Test Run
-
-`.opencode/commands/test-filter.md`:
-
-```markdown
----
-description: Run a specific test by name and summarize failures
-agent: build
----
-
-Run tests matching: $ARGUMENTS
-
-`bun test --testNamePattern="$ARGUMENTS" --verbose`
-
-If tests fail, summarize each failure with file:line and likely cause.
-```
-
-## Example 2: Lint and Fix Guidance
-
-`.opencode/commands/lint.md`:
-
-```markdown
----
-description: Run ESLint and report errors with suggested fixes
-agent: build
----
-
-Run ESLint:
-
-`bun run lint`
-
-If errors exist, list each error with file:line and suggested fix.
-```
-
-## Example 3: Code Review (Subtask)
-
-`.opencode/commands/review.md`:
-
-```markdown
----
-description: Review recent changes for quality issues
-agent: code-reviewer
-subtask: true
----
-
-Review changes from the last commit:
-
-`git diff HEAD~1`
-
-Report issues with file:line references and concise recommendations.
-```
diff --git a/additional/skills/agentic-config/SKILL.md b/additional/skills/agentic-config/SKILL.md
deleted file mode 100644
index d26f210..0000000
--- a/additional/skills/agentic-config/SKILL.md
+++ /dev/null
@@ -1,60 +0,0 @@
----
-name: agentic-config
-description: Create or prune AGENTS.md into minimal global steering for agentic tools. Use when initializing projects, reducing redundant context, or updating reusable repo-wide agent rules.
----
-
-# Create Minimal AGENTS.md
-
-AGENTS.md should be a tiny global protocol, not a repository overview.
-
-## Quick Start
-
-```
-1) Read AGENTS.md if present.
-2) Preserve or add the default correction rule.
-3) Remove anything discoverable from source (stack, dirs, scripts, architecture summaries).
-4) Keep only non-discoverable, repo-wide, high-impact constraints.
-```
-
-## Default Rule
-
-Always retain this line, even if it is the only line left in the file:
-
-```markdown
-- When the user corrects your approach with a reusable, global rule for future work, ask whether they want it added to `AGENTS.md`; if they do, load the `agentic-config` skill and update `AGENTS.md`.
-```
-
-## Line Admission Test
-
-Keep every non-default line only if all are true:
-
-- Global: applies to every task/session in this repo.
-- Non-discoverable: the agent cannot reliably infer it from files.
-- Operationally critical: likely to cause mistakes if missing.
-
-If any check fails, remove the line.
-
-## Keep
-
-- The default correction rule above.
-- Environment gotchas the agent cannot infer (path/platform quirks).
-- Hidden operational landmines (legacy coupling, unsafe directories).
-- Repo-wide constraints not encoded elsewhere.
-
-## Remove
-
-- Tech stack, versions, key directories, architecture summaries.
-- Command/script inventories copied from package files.
-- Style guidance already enforced by lint/format/tests.
-- Task-specific workflows that belong in skills or commands.
-
-## Output Contract
-
-- Produce the smallest useful AGENTS.md after the default rule (often 1-20 lines).
-- If no repo-specific constraints qualify, leave AGENTS.md as a one-rule file and explain why.
-- Report removed categories and where that truth is already documented.
-
-## References
-
-- [Research process](references/research-process.md)
-- [Examples](references/examples.md)
diff --git a/additional/skills/agentic-config/references/examples.md b/additional/skills/agentic-config/references/examples.md
deleted file mode 100644
index e39d4f2..0000000
--- a/additional/skills/agentic-config/references/examples.md
+++ /dev/null
@@ -1,36 +0,0 @@
-# Minimal AGENTS.md Examples
-
-These examples show protocol-style files. They only include invisible, global constraints.
-
-## Example 1: Environment Gotcha Only
-
-```markdown
-# AGENTS.md
-
-- When the user corrects your approach with a reusable, global rule for future work, ask whether they want it added to `AGENTS.md`; if they do, load the `agentic-config` skill and update `AGENTS.md`.
-- You are running in WSL on Windows; use POSIX paths and avoid Windows drive assumptions.
-```
-
-## Example 2: Hidden Landmine
-
-```markdown
-# AGENTS.md
-
-- When the user corrects your approach with a reusable, global rule for future work, ask whether they want it added to `AGENTS.md`; if they do, load the `agentic-config` skill and update `AGENTS.md`.
-- `legacy/` appears unused but is imported dynamically in production; do not delete or bulk-move it.
-- Always run integration tests with `--no-cache`; cached fixtures cause false positives.
-```
-
-## Example 3: Default Rule Only
-
-```markdown
-# AGENTS.md
-
-- When the user corrects your approach with a reusable, global rule for future work, ask whether they want it added to `AGENTS.md`; if they do, load the `agentic-config` skill and update `AGENTS.md`.
-```
-
-## Anti-Patterns to Avoid
-
-- Full command lists copied from `package.json`.
-- "Project overview" sections (stack, folder map, architecture recap).
-- Generic coding style rules already enforced by tools.
diff --git a/additional/skills/agentic-config/references/research-process.md b/additional/skills/agentic-config/references/research-process.md
deleted file mode 100644
index 23c8b3b..0000000
--- a/additional/skills/agentic-config/references/research-process.md
+++ /dev/null
@@ -1,55 +0,0 @@
-# Pruning-First Process for AGENTS.md
-
-Use this workflow when creating or updating AGENTS.md under the minimal-context model.
-
-## 1) Read the Existing File First
-
-1. Read `AGENTS.md` end-to-end.
-2. Preserve or add the default correction rule before pruning anything else.
-3. Treat every other line as suspect until it passes the admission test.
-
-## Default Rule
-
-Always keep this line, even when no repo-specific constraints survive:
-
-```markdown
-- When the user corrects your approach with a reusable, global rule for future work, ask whether they want it added to `AGENTS.md`; if they do, load the `agentic-config` skill and update `AGENTS.md`.
-```
-
-## 2) Classify Every Line
-
-For each non-default line, decide `keep` or `remove`.
-
-- Keep only if it is global, non-discoverable, and operationally important.
-- Remove if it is discoverable from repository files.
-
-## 3) Remove Common Redundant Buckets
-
-Delete these by default:
-
-- Tech stack and versions
-- Key directories and architecture summaries
-- Command/script inventories from `package.json`/build files
-- General style conventions that tooling already enforces
-
-## 4) Preserve Only Invisible Logic
-
-Typical keepers:
-
-- Environment-specific gotchas the agent cannot infer
-- Hidden coupling and landmines not obvious from code structure
-- Repo-wide constraints not encoded in config/tooling
-
-## 5) Draft the Smallest Useful File
-
-1. Prefer a short protocol-style file.
-2. If no repo-specific line qualifies, keep AGENTS.md as the default rule only.
-3. Push task-scoped guidance into skills/commands.
-
-## 6) Validate Before Finalizing
-
-1. The default rule is present exactly once.
-2. Every other line passes the admission test.
-3. No duplicated truths from source files.
-4. No section filler added to hit a line count target.
-5. Output includes a short keep/remove rationale.
diff --git a/additional/skills/agentic-skills/SKILL.md b/additional/skills/agentic-skills/SKILL.md
deleted file mode 100644
index af8d50c..0000000
--- a/additional/skills/agentic-skills/SKILL.md
+++ /dev/null
@@ -1,57 +0,0 @@
----
-name: agentic-skills
-# prettier-ignore
-description: Create OpenCode agent skills with strict progressive disclosure rules. Use when creating skills, updating SKILL.md files, validating skill format, or when user mentions skills, SKILL.md, skill validation, or skill documentation.
----
-
-# Create Agent Skills
-
-Create OpenCode skills that are compact, triggerable, and enforce progressive disclosure with validation.
-
-## Skill Locations
-
-```
-.opencode/skills/{skill-name}/SKILL.md # Project skills
-~/.config/opencode/skills/{skill-name}/SKILL.md # Global skills
-```
-
-## Frontmatter Rules (Level 1)
-
-- `name` matches directory and regex: `^[a-z0-9]+(-[a-z0-9]+)*$`
-- `description` is ONE line, 1-300 chars (warn >200)
-- `description` MUST include `Use when`, `Use for`, or `Use to`
-- `description` is action-oriented and third person
-
-## SKILL.md Body Rules (Level 2)
-
-- Hard limit: 50 lines (frontmatter excluded)
-- 1 code block preferred; warn if >2, error if >3
-- 3-5 sections recommended; warn if >8
-- Long explanations move to `references/`
-
-## References (Level 3)
-
-- Linked with `[text](references/examples.md)` from SKILL.md
-- No nesting beyond depth 1
-- No orphaned reference files
-
-## Workflow
-
-1. Draft SKILL.md using the template in `assets/template.md`
-2. Add detailed docs to `references/`
-3. Run `bun additional/skills/agentic-skills/scripts/validate-skill.mjs `
-4. Fix errors, re-run validation
-5. Use `bun additional/skills/agentic-skills/scripts/doctor-skill.mjs ` for multiline description
- fixes
-
-## Validator Expectations
-
-- Detects multiline descriptions and missing trigger phrases
-- Enforces 50-line Level 2 limit
-- Validates reference links and nesting depth
-- Checks keyword overlap between description and body
-
-## References
-
-- [references/checklist.md](references/checklist.md) - Full quality checklist
-- [references/examples.md](references/examples.md) - Short, compliant examples
diff --git a/additional/skills/agentic-skills/assets/template.md b/additional/skills/agentic-skills/assets/template.md
deleted file mode 100644
index 7e3ac1d..0000000
--- a/additional/skills/agentic-skills/assets/template.md
+++ /dev/null
@@ -1,40 +0,0 @@
-# SKILL.md Template
-
-Copy this template to create a new skill. Replace all `{placeholders}` with actual values.
-
----
-
-```markdown
----
-name: {skill-name}
-# prettier-ignore
-description: {Action-oriented summary}. Use when {trigger contexts} or when user mentions {keywords}.
----
-
-# {Skill Title}
-
-{Brief overview: 1-2 sentences.}
-
-## Core Rules
-
-- {Rule 1}
-- {Rule 2}
-- {Rule 3}
-
-## Common Pattern
-
-{Short pattern description (<= 80 words).}
-
-## References
-
-- [references/patterns.md](references/patterns.md) - Advanced patterns
-- [references/examples.md](references/examples.md) - Additional examples
-
-
-```
diff --git a/additional/skills/agentic-skills/references/checklist.md b/additional/skills/agentic-skills/references/checklist.md
deleted file mode 100644
index 444c587..0000000
--- a/additional/skills/agentic-skills/references/checklist.md
+++ /dev/null
@@ -1,93 +0,0 @@
-# Skill Quality Checklist
-
-Use this checklist before finalizing or publishing a skill.
-
-## Contents
-
-- [Pre-Creation Checklist](#pre-creation-checklist)
-- [SKILL.md Checklist](#skillmd-checklist)
-- [Progressive Disclosure Checklist](#progressive-disclosure-checklist)
-- [Testing Checklist](#testing-checklist)
-
----
-
-## Pre-Creation Checklist
-
-Before writing the skill:
-
-- [ ] Identified 3-5 concrete usage examples
-- [ ] Listed trigger phrases users would say
-- [ ] Determined what context agent doesn't already have
-- [ ] Planned which resources to include (scripts/references/assets)
-- [ ] Confirmed this isn't duplicate of existing skill
-
----
-
-## SKILL.md Checklist
-
-### Frontmatter
-
-- [ ] `name` is lowercase with single hyphen separators
-- [ ] `name` is 1-64 characters
-- [ ] `name` matches parent directory name
-- [ ] `name` matches regex `^[a-z0-9]+(-[a-z0-9]+)*$`
-- [ ] `description` is one line only
-- [ ] `description` is <= 300 characters (warn > 200)
-- [ ] `description` includes what the skill does
-- [ ] `description` includes `Use when`, `Use for`, or `Use to`
-- [ ] `description` includes natural trigger keywords
-- [ ] `description` is third person and action-oriented
-
-### Body Content (Level 2)
-
-- [ ] Body is <= 50 lines (frontmatter excluded)
-- [ ] 1 code block preferred (warn if >2, error if >3)
-- [ ] 3-5 sections recommended (warn if >8)
-- [ ] No verbose explanations of common knowledge
-- [ ] No README, CHANGELOG, or auxiliary files
-
-### References (Level 3)
-
-- [ ] All `references/*.md` links resolve
-- [ ] No nested references beyond depth 1
-- [ ] No orphaned reference files
-- [ ] Relative paths used: `[file](references/examples.md)`
-
----
-
-## Progressive Disclosure Checklist
-
-### Level 1: Metadata
-
-- [ ] Description is short and triggerable
-- [ ] Description keywords match skill content
-
-### Level 2: SKILL.md
-
-- [ ] Essential workflow only
-- [ ] Extra detail moved to references
-
-### Level 3: Resources
-
-- [ ] References are focused and self-contained
-- [ ] Scripts are tested and executable
-
----
-
-## Testing Checklist
-
-### Before Finalizing
-
-- [ ] Triggered skill with natural phrases from description
-- [ ] Verified correct skill loads (not a similar one)
-- [ ] Tested main workflow end-to-end
-- [ ] Confirmed examples work
-- [ ] Ran validator: `bun additional/skills/agentic-skills/scripts/validate-skill.mjs `
-- [ ] Fixed multiline description with doctor if needed
-
-### After Real Usage
-
-- [ ] Observed agent using the skill on real tasks
-- [ ] Noted any confusion or misses
-- [ ] Updated skill based on observations
-- [ ] Re-tested after changes
diff --git a/additional/skills/agentic-skills/references/examples.md b/additional/skills/agentic-skills/references/examples.md
deleted file mode 100644
index b92f434..0000000
--- a/additional/skills/agentic-skills/references/examples.md
+++ /dev/null
@@ -1,75 +0,0 @@
-# Skill Examples
-
-Compact examples that comply with the 50-line Level 2 rule.
-
-## Example 1: Simple Skill
-
-**Directory structure:**
-
-```
-types/
-└── SKILL.md
-```
-
-**SKILL.md:**
-
-```markdown
----
-name: types
-# prettier-ignore
-description: Create TypeScript types and interfaces for data models. Use when defining types, interfaces, data shapes, or when user mentions TypeScript types.
----
-
-# Types
-
-Define type-safe models and interfaces for data shapes.
-
-## Core Rules
-
-- Use `interface` for object shapes
-- Use `type` for unions and computed types
-- Prefer `as const` objects for enum-like values
-
-## References
-
-- [references/examples.md](references/examples.md) - Extended examples
-```
-
-## Example 2: Skill with References
-
-**Directory structure:**
-
-```
-
-hooks/
-├── SKILL.md
-└── references/
- ├── patterns.md
- └── examples.md
-
-```
-
-**SKILL.md:**
-
-```markdown
----
-name: hooks
-# prettier-ignore
-description: Create custom React hooks for reusable logic. Use when creating hooks, extracting shared state, or when user mentions custom hooks.
----
-
-# Hooks
-
-Encapsulate reusable stateful logic in hook functions.
-
-## Core Rules
-
-- Prefix names with `use`
-- Return objects, not arrays
-- Accept options objects for >1 param
-
-## References
-
-- [references/patterns.md](references/patterns.md) - Advanced patterns
-- [references/examples.md](references/examples.md) - Full examples
-```
diff --git a/additional/skills/agentic-skills/scripts/doctor-skill.mjs b/additional/skills/agentic-skills/scripts/doctor-skill.mjs
deleted file mode 100644
index 06cf2ad..0000000
--- a/additional/skills/agentic-skills/scripts/doctor-skill.mjs
+++ /dev/null
@@ -1,106 +0,0 @@
-#!/usr/bin/env bun
-import { existsSync, readFileSync, writeFileSync } from 'node:fs';
-import { join, resolve } from 'node:path';
-
-const args = process.argv.slice(2);
-const targetPath = args[0] ? resolve(args[0]) : process.cwd();
-const skillMdPath = join(targetPath, 'SKILL.md');
-
-if (!existsSync(skillMdPath)) {
- console.error(`SKILL.md not found at ${skillMdPath}`);
- process.exit(1);
-}
-
-const content = readFileSync(skillMdPath, 'utf-8');
-
-if (!content.startsWith('---')) {
- console.error('Missing YAML frontmatter in SKILL.md');
- process.exit(1);
-}
-
-const fixed = fixMultilineDescription(content);
-
-if (fixed === content) {
- console.log('No changes needed.');
- process.exit(0);
-}
-
-writeFileSync(skillMdPath, fixed, 'utf-8');
-console.log(
- 'Fixed multi-line description and added # prettier-ignore if needed.',
-);
-
-function fixMultilineDescription(source) {
- const lines = source.split('\n');
- const out = [];
- let inFrontmatter = false;
- let frontmatterCount = 0;
- let inDescription = false;
- const descriptionParts = [];
- let hasPrettierIgnore = false;
-
- for (let i = 0; i < lines.length; i++) {
- const line = lines[i];
-
- if (line.trim() === '---') {
- frontmatterCount += 1;
- if (frontmatterCount === 2 && inDescription) {
- out.push(`description: ${descriptionParts.join(' ')}`);
- descriptionParts.length = 0;
- inDescription = false;
- }
- inFrontmatter = frontmatterCount === 1;
- out.push(line);
- continue;
- }
-
- if (!inFrontmatter) {
- out.push(line);
- continue;
- }
-
- if (line.trim() === '# prettier-ignore') {
- hasPrettierIgnore = true;
- out.push(line);
- continue;
- }
-
- if (line.match(/^description:/)) {
- const valueMatch = line.match(/^description:\s*(.*)$/);
- const valueOnLine = valueMatch ? valueMatch[1].trim() : '';
- if (!hasPrettierIgnore) {
- out.push('# prettier-ignore');
- hasPrettierIgnore = true;
- }
- if (valueOnLine) {
- out.push(`description: ${valueOnLine}`);
- continue;
- }
- inDescription = true;
- continue;
- }
-
- if (inDescription) {
- if (line.match(/^[a-z_-]+:/)) {
- out.push(`description: ${descriptionParts.join(' ')}`);
- descriptionParts.length = 0;
- inDescription = false;
- out.push(line);
- continue;
- }
- const trimmed = line.trim();
- if (trimmed && !trimmed.startsWith('#')) {
- descriptionParts.push(trimmed);
- }
- continue;
- }
-
- out.push(line);
- }
-
- if (inDescription && descriptionParts.length > 0) {
- out.push(`description: ${descriptionParts.join(' ')}`);
- }
-
- return out.join('\n');
-}
diff --git a/additional/skills/agentic-skills/scripts/validate-skill.mjs b/additional/skills/agentic-skills/scripts/validate-skill.mjs
deleted file mode 100644
index 3d331cc..0000000
--- a/additional/skills/agentic-skills/scripts/validate-skill.mjs
+++ /dev/null
@@ -1,361 +0,0 @@
-#!/usr/bin/env bun
-import { existsSync, readdirSync, readFileSync, statSync } from 'node:fs';
-import { basename, join, resolve } from 'node:path';
-
-const args = process.argv.slice(2);
-const targetPath = args[0] ? resolve(args[0]) : process.cwd();
-const outputJson = args.includes('--json');
-const strict = args.includes('--strict');
-
-const errors = [];
-const warnings = [];
-
-const limits = {
- descriptionMax: 300,
- descriptionWarn: 200,
- bodyLineMax: 50,
- codeBlockWarn: 2,
- codeBlockMax: 3,
- sectionWarn: 8,
-};
-
-function error(message) {
- errors.push(message);
-}
-
-function warn(message) {
- warnings.push(message);
-}
-
-function stripCodeBlocks(content) {
- return content.replace(/```[\s\S]*?```/g, '');
-}
-
-function stripHtmlComments(content) {
- return content.replace(//g, '');
-}
-
-function countWords(text) {
- return text
- .trim()
- .split(/\s+/)
- .filter((word) => word.length > 0).length;
-}
-
-function estimateTokens(wordCount) {
- return Math.round(wordCount * 1.3);
-}
-
-function extractKeywords(text) {
- const words = text
- .toLowerCase()
- .replace(/[^\w\s-]/g, ' ')
- .split(/\s+/)
- .filter((word) => word.length > 3);
- const unique = [...new Set(words)];
- const stopwords = new Set([
- 'this',
- 'that',
- 'with',
- 'from',
- 'have',
- 'will',
- 'when',
- 'what',
- 'where',
- 'which',
- 'their',
- 'them',
- 'then',
- 'than',
- 'these',
- 'those',
- 'there',
- ]);
- return unique.filter((word) => !stopwords.has(word));
-}
-
-function hasYamlFrontmatter(content) {
- return content.startsWith('---\n') || content.startsWith('---\r\n');
-}
-
-function extractFrontmatter(content) {
- if (!hasYamlFrontmatter(content)) {
- return {
- name: null,
- description: null,
- body: content,
- rawFrontmatter: '',
- };
- }
- const parts = content.split('---\n');
- if (parts.length < 3) {
- return {
- name: null,
- description: null,
- body: content,
- rawFrontmatter: '',
- };
- }
- const frontmatter = parts[1];
- const body = parts.slice(2).join('---\n');
- const nameMatch = frontmatter.match(/name:\s*(.+)/);
- const name = nameMatch ? nameMatch[1].trim() : null;
- const descMatch = frontmatter.match(/description:\s*(.+?)(?=\n[a-z]+:|$)/s);
- const description = descMatch ? descMatch[1].trim() : null;
- return { name, description, body, rawFrontmatter: frontmatter };
-}
-
-function isDescriptionMultiline(frontmatter) {
- const descLineMatch = frontmatter.match(/^description:\s*(.*)$/m);
- if (!descLineMatch) return false;
- const valueOnLine = descLineMatch[1].trim();
- if (!valueOnLine) return true;
- const lines = frontmatter.split('\n');
- let foundDesc = false;
- for (const line of lines) {
- if (line.match(/^description:/)) {
- foundDesc = true;
- continue;
- }
- if (foundDesc) {
- if (
- line.match(/^\s+\S/) &&
- !line.trim().startsWith('#') &&
- !line.match(/^[a-z_-]+:/)
- ) {
- return true;
- }
- if (line.match(/^[a-z_-]+:/)) {
- break;
- }
- }
- }
- return false;
-}
-
-function validateNameFormat(name, dirName) {
- if (!name) {
- error('SKILL.md frontmatter missing name');
- return;
- }
- if (!/^[a-z0-9]+(-[a-z0-9]+)*$/.test(name)) {
- error(`Skill name must match regex ^[a-z0-9]+(-[a-z0-9]+)*$: ${name}`);
- }
- if (name.length > 64) {
- error(`Skill name too long (max 64 chars): ${name.length}`);
- }
- if (name !== dirName) {
- error(`Skill name '${name}' must match directory '${dirName}'`);
- }
-}
-
-function validateDescription(description, frontmatter) {
- if (!description) {
- error('SKILL.md frontmatter missing description');
- return;
- }
- if (isDescriptionMultiline(frontmatter)) {
- error('Description must be single-line YAML (multiline detected)');
- }
- if (description.length > limits.descriptionMax) {
- error(
- `Description too long (${description.length}, max ${limits.descriptionMax})`,
- );
- } else if (description.length > limits.descriptionWarn) {
- warn(
- `Description length ${description.length} (recommended <= ${limits.descriptionWarn})`,
- );
- }
- const lower = description.toLowerCase();
- const hasTrigger =
- lower.includes('use when') ||
- lower.includes('use for') ||
- lower.includes('use to');
- if (!hasTrigger) {
- error('Description missing trigger phrase: Use when/Use for/Use to');
- }
- if (/\b(I can|I will|I help|my|me)\b/i.test(description)) {
- warn('Description uses first person (prefer third person)');
- }
- const actionVerbs =
- /^(create|build|design|analyze|test|validate|generate|process|manage|execute|handle|provide)/i;
- if (!actionVerbs.test(description.trim())) {
- warn('Description is not action-oriented (start with a verb)');
- }
-}
-
-function validateBody(body) {
- const bodyWithoutComments = stripHtmlComments(body);
- const lines = bodyWithoutComments
- .trim()
- .split('\n')
- .filter((line) => line.length > 0);
- const lineCount = lines.length;
- if (lineCount > limits.bodyLineMax) {
- error(
- `SKILL.md body has ${lineCount} lines (max ${limits.bodyLineMax})`,
- );
- }
- const codeBlocks = (body.match(/```[\s\S]*?```/g) || []).length;
- if (codeBlocks > limits.codeBlockMax) {
- error(
- `SKILL.md has ${codeBlocks} code blocks (max ${limits.codeBlockMax})`,
- );
- } else if (codeBlocks > limits.codeBlockWarn) {
- warn(
- `SKILL.md has ${codeBlocks} code blocks (recommended <= ${limits.codeBlockWarn})`,
- );
- }
- const sections = (body.match(/^#{1,6}\s/gm) || []).length;
- if (sections > limits.sectionWarn) {
- warn(
- `SKILL.md has ${sections} sections (recommended <= ${limits.sectionWarn})`,
- );
- }
- const wordCount = countWords(body);
- const estimatedTokens = estimateTokens(wordCount);
- return { lineCount, codeBlocks, sections, wordCount, estimatedTokens };
-}
-
-function validateReferences(skillPath, body) {
- const referencesDir = join(skillPath, 'references');
- const skillContent = stripCodeBlocks(body);
- const referencePattern = /\[([^\]]+)\]\((references\/[^)]+\.md)\)/g;
- const matches = [...skillContent.matchAll(referencePattern)];
-
- const referencedFiles = matches.map((match) => match[2]);
- const missing = [];
- const nesting = [];
-
- for (const filePath of referencedFiles) {
- const fullPath = join(skillPath, filePath);
- if (!existsSync(fullPath)) {
- missing.push(filePath);
- error(`Referenced file not found: ${filePath}`);
- continue;
- }
- const depth = referenceDepth(skillPath, filePath);
- if (depth > 1) {
- warn(
- `Reference nesting depth ${depth} for ${filePath} (recommended 1)`,
- );
- }
- nesting.push({ file: filePath, depth });
- }
-
- if (existsSync(referencesDir)) {
- const files = readdirSync(referencesDir).filter((file) =>
- file.endsWith('.md'),
- );
- for (const file of files) {
- const referenced = referencedFiles.some((ref) =>
- ref.endsWith(file),
- );
- if (!referenced) {
- warn(`Reference file not linked from SKILL.md: ${file}`);
- }
- }
- }
-
- return { referencedFiles, missing, nesting };
-}
-
-function referenceDepth(skillPath, filePath, visited = new Set()) {
- if (visited.has(filePath)) return 0;
- visited.add(filePath);
- const fullPath = join(skillPath, filePath);
- if (!existsSync(fullPath)) return 0;
- const content = stripCodeBlocks(readFileSync(fullPath, 'utf-8'));
- const referencePattern = /\[([^\]]+)\]\((references\/[^)]+\.md)\)/g;
- const matches = [...content.matchAll(referencePattern)];
- if (matches.length === 0) return 1;
- let maxDepth = 1;
- for (const match of matches) {
- const nestedDepth = referenceDepth(
- skillPath,
- match[2],
- new Set(visited),
- );
- maxDepth = Math.max(maxDepth, 1 + nestedDepth);
- }
- return maxDepth;
-}
-
-function validateKeywords(description, body) {
- const descKeywords = extractKeywords(description);
- const bodyKeywords = extractKeywords(body);
- if (descKeywords.length < 5 || bodyKeywords.length < 5) return;
- const overlap = descKeywords.filter((keyword) =>
- bodyKeywords.includes(keyword),
- );
- const overlapRatio = overlap.length / descKeywords.length;
- if (overlapRatio < 0.3) {
- warn(
- `Low keyword overlap between description and body (${Math.round(overlapRatio * 100)}%)`,
- );
- }
-}
-
-function validateSkillPath(skillPath) {
- const stats = statSync(skillPath);
- if (!stats.isDirectory()) {
- error(`Path is not a directory: ${skillPath}`);
- return null;
- }
- const skillMdPath = join(skillPath, 'SKILL.md');
- if (!existsSync(skillMdPath)) {
- error('SKILL.md not found in skill directory');
- return null;
- }
- const content = readFileSync(skillMdPath, 'utf-8');
- if (!hasYamlFrontmatter(content)) {
- error('Missing YAML frontmatter in SKILL.md');
- }
- const { name, description, body, rawFrontmatter } =
- extractFrontmatter(content);
- const dirName = basename(skillPath);
-
- validateNameFormat(name, dirName);
- validateDescription(description, rawFrontmatter);
- const bodyStats = validateBody(body);
- validateReferences(skillPath, body);
- if (description) {
- validateKeywords(description, body);
- }
-
- return { name, description, bodyStats };
-}
-
-if (!existsSync(targetPath)) {
- error(`Path does not exist: ${targetPath}`);
-}
-
-const result = existsSync(targetPath) ? validateSkillPath(targetPath) : null;
-
-const report = {
- path: targetPath,
- valid: errors.length === 0,
- errors,
- warnings,
- stats: result?.bodyStats ?? null,
-};
-
-if (outputJson) {
- console.log(JSON.stringify(report, null, 2));
- process.exit(report.valid && !(strict && warnings.length) ? 0 : 1);
-}
-
-if (errors.length > 0) {
- console.log('Errors:');
- errors.forEach((message) => console.log(`- ${message}`));
-}
-if (warnings.length > 0) {
- console.log('Warnings:');
- warnings.forEach((message) => console.log(`- ${message}`));
-}
-if (errors.length === 0) {
- console.log('Skill is valid.');
-}
-
-process.exit(report.valid && !(strict && warnings.length) ? 0 : 1);
diff --git a/additional/skills/agentic-subagents/SKILL.md b/additional/skills/agentic-subagents/SKILL.md
deleted file mode 100644
index 01c305e..0000000
--- a/additional/skills/agentic-subagents/SKILL.md
+++ /dev/null
@@ -1,44 +0,0 @@
----
-name: agentic-subagents
-description: Create OpenCode subagents for automatic routing and safe workflows. Use when defining .opencode/agents, descriptions, and permissions.
----
-
-# Create OpenCode Subagents
-
-## Quick Start
-
-Create `.opencode/agents/code-reviewer.md`:
-
-```markdown
----
-description: Reviews code for bugs, security, and maintainability without changes. Automatically invoke this agent after code changes or when the user requests review. Use when reviewing diffs, PRs, refactors, or audits.
-mode: subagent
-temperature: 0.1
-permission:
- edit: deny
- bash:
- '*': deny
- 'git diff*': allow
- 'git log*': allow
- 'git status*': allow
----
-
-You are a code reviewer. Provide prioritized findings with file:line references and fixes.
-```
-
-## Rules
-
-- Store subagents in `.opencode/agents/` with kebab-case filenames; set `mode: subagent`.
-- Treat `description` as the routing contract: capability + auto-invoke trigger + "Use when" clause.
-- Prefer `permission` over legacy `tools`; grant only the tools the workflow needs.
-- Use `steps` to cap iteration loops; include exit criteria for test/lint/run loops.
-- Keep each subagent focused on one workflow; delegate for multi-specialist tasks.
-
-## References
-
-- [references/agent-files.md](references/agent-files.md)
-- [references/description-routing.md](references/description-routing.md)
-- [references/permission-recipes.md](references/permission-recipes.md)
-- [references/advanced.md](references/advanced.md)
-- [references/patterns.md](references/patterns.md)
-- [references/examples.md](references/examples.md)
diff --git a/additional/skills/agentic-subagents/references/advanced.md b/additional/skills/agentic-subagents/references/advanced.md
deleted file mode 100644
index c2fba4e..0000000
--- a/additional/skills/agentic-subagents/references/advanced.md
+++ /dev/null
@@ -1,31 +0,0 @@
-# Advanced Patterns
-
-## Task Delegation Controls (Optional)
-
-Use `permission.task` to restrict which subagents can be invoked via the Task tool.
-Only use this when you need a strict orchestrator.
-
-```yaml
-permission:
- task:
- '*': deny
- 'code-reviewer': allow
- 'test-fixer': allow
- 'security-auditor': ask
-```
-
-## Hidden Internal Helpers
-
-Hide internal subagents from the @ menu:
-
-```yaml
-hidden: true
-```
-
-## Iteration Limits
-
-Use `steps` to cap agentic loops on costly workflows:
-
-```yaml
-steps: 25
-```
diff --git a/additional/skills/agentic-subagents/references/agent-files.md b/additional/skills/agentic-subagents/references/agent-files.md
deleted file mode 100644
index d01cf77..0000000
--- a/additional/skills/agentic-subagents/references/agent-files.md
+++ /dev/null
@@ -1,21 +0,0 @@
-# Subagent Files (.opencode/agents)
-
-Create each subagent as a markdown file in `.opencode/agents/`.
-The filename (kebab-case) becomes the agent name for `@` mentions.
-
-## Required Frontmatter
-
-- `description` (required): routing contract for auto-delegation
-- `mode: subagent`
-
-## Common Frontmatter
-
-- `temperature` (defaults vary by model)
-- `model` (optional override; otherwise inherits from invoker)
-- `steps` (max agentic iterations; use for iterative workflows)
-- `permission` (preferred over legacy `tools`)
-
-## Notes
-
-- Prefer `permission` over deprecated `tools` booleans.
-- Use kebab-case names like `code-reviewer.md`, `test-fixer.md`.
diff --git a/additional/skills/agentic-subagents/references/description-routing.md b/additional/skills/agentic-subagents/references/description-routing.md
deleted file mode 100644
index 0d93adc..0000000
--- a/additional/skills/agentic-subagents/references/description-routing.md
+++ /dev/null
@@ -1,21 +0,0 @@
-# Routing-Friendly Descriptions
-
-OpenCode auto-invokes subagents based on `description`. Keep it short and aligned to user phrasing.
-
-## Recommended Format
-
-1. Capability statement
-2. Auto-invoke trigger
-3. "Use when" clause with 4-8 high-signal keywords
-
-Example:
-
-```
-description: Runs tests and fixes failures until all pass. Automatically invoke this agent when tests fail or after code changes. Use when fixing tests, debugging failures, or stabilizing CI.
-```
-
-## Avoid
-
-- Long keyword lists or unrelated terms
-- Implementation detail in description
-- Vague triggers like "use when needed"
diff --git a/additional/skills/agentic-subagents/references/examples.md b/additional/skills/agentic-subagents/references/examples.md
deleted file mode 100644
index 36db984..0000000
--- a/additional/skills/agentic-subagents/references/examples.md
+++ /dev/null
@@ -1,529 +0,0 @@
-# Full Agent Examples
-
-Complete, production-ready agent configurations demonstrating best practices.
-
-## Example 1: Code Reviewer (Read-Only Pattern)
-
-`.opencode/agents/code-reviewer.md`:
-
-````markdown
----
-description: Reviews code for quality, security, and best practices without making changes. Automatically invoke this agent after code changes. Use for code review, quality checks, or when user mentions reviewing code, checking security, or auditing quality.
-mode: subagent
-temperature: 0.1
-permission:
- edit: deny
- bash:
- '*': deny
- 'git diff*': allow
- 'git log*': allow
- 'git status*': allow
----
-
-You are a senior code reviewer specializing in Astro and modern web applications.
-
-Review focus areas:
-
-1. **Security**
- - Exposed secrets, insecure storage
- - Improper deep link handling
- - Insecure data transmission
-
-2. **Type Safety**
- - Full TypeScript coverage
- - No `any` types, proper type annotations
- - Correct use of generics
-
-3. **Testing**
- - Adequate coverage (>=90%)
- - Quality assertions, edge case coverage
-
-4. **Performance**
- - Unnecessary re-renders
- - Missing memoization (useMemo, useCallback, React.memo)
- - Heavy computations in render path
- - Large bundle size concerns
-
-5. **Astro/Web Patterns**
- - Server-first rendering with selective `client:*` hydration
- - Clear server/client boundaries and minimal shipped JS
- - Proper use of content collections and `astro:assets`
- - Avoid `client:only` unless SSR is not possible
-
-Output format:
-
-## Critical Issues
-
-**File**: `path/to/file.tsx:123`
-**Issue**: [Clear description]
-**Impact**: [Why this matters]
-**Fix**:
-
-```tsx
-// Suggested implementation
-```
-````
-
-**Reasoning**: [Why this is better]
-
----
-
-## High Priority
-
-[Same format]
-
----
-
-## Suggestions
-
-[Same format]
-
----
-
-## Good Practices
-
-**File**: `path/to/file.tsx`
-**Observation**: [What's well implemented]
-**Why it works**: [Pattern explanation]
-
----
-
-## Summary
-
-- Total files reviewed: X
-- Critical issues: X
-- High priority: X
-- Suggestions: X
-
-**Priority actions**: [Top 3 things to fix first]
-
-Guidelines:
-
-- Always include file paths and line numbers
-- Explain the "why" behind recommendations
-- Acknowledge good patterns
-- You **cannot make changes** - only provide feedback
-
-````
-
-## Example 2: Test Fixer (Evaluator-Optimizer Pattern)
-
-`.opencode/agents/test-fixer.md`:
-
-```markdown
----
-description: Runs tests iteratively and fixes failures until all tests pass with adequate coverage. Automatically invoke this agent after code changes. Use when fixing tests, debugging failures, or ensuring test suite is green.
-mode: subagent
-temperature: 0.2
-steps: 30
-permission:
- edit: allow
- bash:
- "*": deny
- "bun test*": allow
----
-
-You are a test fixing specialist for Astro and web applications.
-
-Workflow:
-
-1. **Run Tests**
- ```bash
- bun test --coverage
-````
-
-2. **Evaluate Results** (ground truth)
- - If all pass with >=90% coverage -> Report success and exit
- - If failures -> Continue to step 3
-
-3. **Fix Failures**
- For each failing test:
- - Identify test file and failing assertion
- - Analyze failure reason
- - Determine root cause:
- - Code bug -> Fix in source files
- - Test bug -> Fix in test files
- - Missing mock -> Add appropriate mock
- - Implement the fix
- - Explain what was fixed and why
-
-4. **Re-run Tests** (verify against ground truth)
-
- ```bash
- bun test --coverage
- ```
-
- Repeat from step 2.
-
-5. **Final Report**
- After all tests pass:
-
- ```
- All X tests passing
- Coverage: X% (threshold: 90%)
-
- Summary of fixes:
- - [What was fixed and why]
- ```
-
-Exit criteria:
-
-- All tests passing
-- Coverage >=90%
-
-Guidelines:
-
-- Fix root causes, not symptoms
-- Never remove tests to make them pass
-- Never use `.skip()` as a solution
-- Maintain or improve coverage
-- Follow project conventions
-
-````
-
-## Example 3: Quality Auditor (Multi-Step Evaluator Pattern)
-
-`.opencode/agents/quality-auditor.md`:
-
-```markdown
----
-description: Runs all quality checks (TypeScript, ESLint, Prettier, tests, coverage) and fixes issues iteratively. Automatically invoke this agent before committing. Use when running quality checks, ensuring code quality, or when user mentions quality, checks, or linting.
-mode: subagent
-temperature: 0.2
-steps: 40
-permission:
- edit: allow
- bash:
- "*": deny
- "bun run lint*": allow
- "bun run format*": allow
- "bun test*": allow
- "bunx tsc*": allow
----
-
-You are a quality auditor for Astro and web applications.
-
-Execute checks in order, fixing issues iteratively:
-
-**Step 1: TypeScript**
-```bash
-bunx tsc --noEmit
-````
-
-Fix type errors until clean.
-
-**Step 2: ESLint**
-
-```bash
-bun run lint
-```
-
-Fix linting errors until clean.
-
-**Step 3: Prettier**
-
-```bash
-bunx prettier --check .
-```
-
-If issues found, run `bunx prettier --write .`
-
-**Step 4: Tests**
-
-```bash
-bun test --coverage
-```
-
-Ensure all pass with >=90% coverage.
-
-For each step:
-
-1. Run the check
-2. If issues found, fix them
-3. Re-run until clean
-4. Move to next step
-
-Exit criteria:
-
-- All four steps passing
-- Coverage >=90%
-
-Final report:
-
-```
-Quality Audit Complete
-
-TypeScript: Clean
-ESLint: Clean
-Prettier: Formatted
-Tests: All passing, X% coverage
-
-Summary of fixes:
-- [Brief list]
-
-The codebase meets all quality standards.
-```
-
-Guidelines:
-
-- Never skip tests with `.skip()`
-- Never lower standards to pass checks
-- Always fix root causes
-- Run full workflow, don't stop early
-
-````
-
-## Example 4: Security Auditor (Read-Only Specialist)
-
-`.opencode/agents/security-auditor.md`:
-
-```markdown
----
-description: Performs security audits identifying vulnerabilities, insecure patterns, and data exposure risks. Automatically invoke this agent after implementing auth, payments, or sensitive data storage. Use when doing security review, vulnerability scanning, or compliance checks.
-mode: subagent
-temperature: 0.1
-permission:
- edit: deny
- bash:
- "*": deny
- "bun audit*": allow
- "bun outdated*": allow
----
-
-You are a security expert specializing in web application security.
-
-Audit checklist:
-
-## 1. Data Handling
-- Secrets or API keys exposed in client bundles
-- Sensitive data stored in localStorage/sessionStorage
-- Unsafe handling of user-generated content
-
-## 2. Network Security
-- HTTP instead of HTTPS
-- Missing CSP or unsafe inline scripts
-- Unvalidated external requests from server code
-
-## 3. Authentication
-- Insecure cookie flags (HttpOnly, Secure, SameSite)
-- Token exposure in client code
-- Missing CSRF protection for form submissions
-
-## 4. Routing & Rendering
-- XSS risks in Markdown/MDX or raw HTML rendering
-- Unsafe use of `set:html` without sanitization
-- Leaky server-only data into client islands
-
-## 5. Dependencies
-- Vulnerable dependencies (bun audit)
-- Outdated packages with known CVEs
-
-## 6. Build/Deployment
-- Debug code in production
-- Console.log with sensitive data
-- Public source maps when not intended
-
-Output format:
-
-## Critical Vulnerabilities
-
-**File**: `path/to/file.tsx:123`
-**Issue**: API key exposed in source code
-**Impact**: Attacker can access backend services
-**Fix**: Move to server-only env vars and avoid client exposure
-**CVSS**: 9.8 (Critical)
-
-## High Risk
-
-[Significant security concerns]
-
-## Medium Risk
-
-[Issues requiring attention]
-
-## Low Risk / Best Practices
-
-[Minor improvements]
-
-## Security Strengths
-
-[Good security practices observed]
-````
-
-## Example 5: Feature Builder (Skill-Enhanced Pattern)
-
-`.opencode/agents/feature-builder.md`:
-
-````markdown
----
-description: Builds complete Astro features end-to-end (pages, layouts, components, islands, tests). Automatically invoke this agent when a task requires implementing a full feature with multiple integrated parts. Use when adding features, building user flows, or creating new routes.
-mode: subagent
-temperature: 0.3
-permission:
- edit: allow
- bash: ask
-skills:
- - astro-component
- - astro-page
- - astro-layout
- - astro-test
----
-
-You are a feature builder for Astro applications.
-
-You have specialized skills loaded for creating:
-
-- Components (Astro/React UI in components/)
-- Pages (routes in src/pages/)
-- Layouts (shared shells in src/layouts/)
-- Tests (unit/integration tests alongside source files)
-
-Workflow:
-
-1. **Understand Requirements**
- Clarify feature scope and acceptance criteria.
-
-2. **Create Types**
- TypeScript interfaces for data structures.
-
-3. **Create Hooks**
- Custom hooks for business logic and state.
-
-4. **Create Components**
- Reusable UI components with proper styling.
-
-5. **Create Page**
- Astro route integrating components and layouts.
-
-6. **Write Tests**
- Unit tests for hooks, component tests for UI.
-
-7. **Run Quality Checks**
- ```bash
- bun run checks
- ```
-
-Guidelines:
-
-- Follow patterns from loaded skills
-- Use strict TypeScript everywhere
-- Write tests for all new code
-- Follow the project's styling conventions (e.g. Tailwind classes when available)
-- Handle loading and error states
-````
-
-## Example 6: Debugger with Hooks
-
-`.opencode/agents/debugger.md`:
-
-```markdown
----
-description: Debugging specialist for errors, test failures, and unexpected behavior. Automatically invoke this agent when encountering issues.
-mode: subagent
-temperature: 0.3
-steps: 25
----
-
-You are an expert debugger specializing in Astro and web applications.
-
-Workflow:
-
-1. **Capture Context**
- - Error message and stack trace
- - Reproduction steps
- - Recent changes (git log)
-
-- Runtime (SSR/static, browser, deployment target)
-
-2. **Form Hypothesis**
- - Identify likely failure points
- - Check recent code changes
- - Review related tests
-
-- Check for hydration mismatches or server/client boundary issues
-
-3. **Isolate Issue**
- - Add strategic console.log statements
-
-- Use React/Astro devtools if UI issue
- - Check network requests if API issue
- - Narrow down to specific code
-
-4. **Implement Fix**
- - Make minimal, targeted change
- - Fix root cause, not symptom
-
-5. **Verify Solution**
- - Run relevant tests
- - Confirm error resolved
- - Check for regressions
- - Test on affected platform(s)
-
-Output for each issue:
-
-- **Root cause**: Why it happened
-- **Evidence**: How you identified it
-- **Fix**: What was changed
-- **Prevention**: How to avoid in future
-
-Guidelines:
-
-- Focus on understanding before fixing
-- Make minimal changes
-- Verify fixes with tests
-- Consider runtime-specific behavior (SSR vs client)
-- Restart dev server and clear browser cache if caching suspected
-```
-
-## Example 7: Documentation Writer (Path-Restricted)
-
-`.opencode/agents/docs-writer.md`:
-
-```markdown
----
-description: Writes and maintains project documentation with clear explanations and examples. Use for creating docs, updating README, or documenting features.
-mode: subagent
-temperature: 0.4
-permission:
- bash: deny
- edit:
- 'docs/*': allow
- 'README.md': allow
- 'CHANGELOG.md': allow
- '*.md': ask
- '*': deny
----
-
-You are a technical documentation specialist.
-
-Scope:
-
-- Can edit files in docs/ directory
-- Can edit README.md and CHANGELOG.md
-- Must ask before editing other .md files
-- Cannot edit source code files
-
-Focus on:
-
-- Clear explanations of functionality
-- Step-by-step setup instructions
-- Code examples with context
-- Runtime-specific notes (SSR vs static, deployment targets)
-- Troubleshooting guidance
-
-Format guidelines:
-
-- Use headings for structure
-- Code blocks with language specification
-- Lists for steps or features
-- Tables for comparisons
-- Screenshots for UI documentation
-
-Guidelines:
-
-- Write for the target audience
-- Prefer concise over verbose
-- Include examples for complex concepts
-- Keep formatting consistent
-- Note Astro SSR vs static output differences
-```
diff --git a/additional/skills/agentic-subagents/references/patterns.md b/additional/skills/agentic-subagents/references/patterns.md
deleted file mode 100644
index 9113acf..0000000
--- a/additional/skills/agentic-subagents/references/patterns.md
+++ /dev/null
@@ -1,364 +0,0 @@
-# Workflow Patterns for Subagents
-
-Patterns for designing subagents. The goal is to keep each subagent focused, easy to route to via `description`, and safe via `permission`.
-
-## Pattern 1: Evaluator-Optimizer (Iterative)
-
-**From Anthropic's "Building Effective Agents"**: One LLM generates a response while another (or the same one) provides evaluation and feedback in a loop.
-
-**Best for:** Test fixing, quality auditing, code refinement, any task with verifiable success criteria.
-
-**Why it works:** Agents perform best when they have clear targets to iterate against. Ground truth feedback (test results, linter output) allows objective progress measurement.
-
-```markdown
----
-description: Runs tests and fixes failures iteratively until all pass. Automatically invoke this agent after code changes. Use when fixing tests, debugging failures, or ensuring test suite passes.
-mode: subagent
-temperature: 0.2
-steps: 30
-permission:
- edit: allow
- bash:
- '*': deny
- 'bun test*': allow
- 'bunx tsc*': allow
----
-
-You are a test fixing specialist.
-
-Workflow:
-
-1. **Run Tests**
- Execute the test suite to identify failures.
-
-2. **Evaluate Results** (ground truth)
- - If all pass -> Report success and exit
- - If failures -> Continue to step 3
-
-3. **Fix Failures**
- For each failing test:
- - Identify root cause (code bug vs test bug)
- - Implement targeted fix
- - Explain the fix
-
-4. **Re-run Tests** (verify against ground truth)
- Repeat from step 2.
-
-Exit criteria:
-
-- All tests passing
-- Coverage >=90%
-
-Guidelines:
-
-- Fix root causes, not symptoms
-- Never remove tests to make them pass
-- Never use .skip() as a solution
-
-Final report:
-All X tests passing
-Coverage: X%
-Summary of fixes applied
-```
-
-**Key characteristics:**
-
-- Ground truth feedback loop (test results)
-- Clear exit criteria
-- Explicit anti-patterns
-
-## Pattern 2: Read-Only Reviewer
-
-**Best for:** Code review, security audits, architecture analysis, any task requiring analysis without modification.
-
-**Why it works:** Tool restrictions enforce behavior that matches intent. Cannot accidentally make changes while reviewing.
-
-```markdown
----
-description: Reviews code for quality, security, and best practices without making changes. Automatically invoke this agent after code changes. Use for code review or when user mentions reviewing code.
-mode: subagent
-temperature: 0.1
-permission:
- edit: deny
- bash:
- '*': deny
- 'git diff*': allow
- 'git log*': allow
----
-
-You are a senior code reviewer.
-
-Review focus areas:
-
-1. **Security** - Data exposure, insecure storage, deep link handling
-2. **Type Safety** - Full TypeScript coverage, no `any` types
-3. **Testing** - Adequate coverage, edge cases
-4. **Performance** - Unnecessary re-renders; avoid manual memoization unless justified
-5. **Architecture** - SOLID, DRY, Astro/web patterns
-
-Output format:
-
-## Critical Issues
-
-**File**: `path/to/file.tsx:123`
-**Issue**: [Description]
-**Impact**: [Why this matters]
-**Fix**: [Code example]
-
-## High Priority
-
-[Same format]
-
-## Suggestions
-
-[Same format]
-
-## Good Practices
-
-[What's working well]
-
-## Summary
-
-- Total files reviewed: X
-- Critical issues: X
-- Priority actions: [Top 3]
-
-Guidelines:
-
-- Always include file paths and line numbers
-- Explain the "why" behind recommendations
-- Acknowledge good patterns
-```
-
-**Key characteristics:**
-
-- All edit tools disabled
-- Structured output format
-- Low temperature for consistency
-
-## Pattern 3: Orchestrator-Workers
-
-**From Anthropic's "Building Effective Agents"**: A central LLM dynamically breaks down tasks, delegates to workers, and synthesizes results.
-
-**Best for:** Complex multi-step workflows requiring different specialists.
-
-**Why it works:** Separates coordination from execution. Each worker has focused context and can be optimized independently.
-
-```markdown
----
-description: Orchestrates complex workflows by coordinating specialized subagents. Automatically invoke this agent for multi-step tasks needing multiple specialists. Use when planning work across review, debugging, tests, or security.
-mode: subagent
-temperature: 0.3
-permission:
- task:
- '*': deny
- 'code-reviewer': allow
- 'test-fixer': allow
- 'security-auditor': ask
----
-
-You are a workflow orchestrator managing complex development tasks.
-
-Available specialists:
-
-- code-reviewer: Code quality and best practices
-- test-fixer: Fix failing tests iteratively
-- security-auditor: Security vulnerability assessment
-
-Workflow:
-
-1. **Analyze Task**
- Break down into subtasks.
- Identify which specialists are needed.
-
-2. **Delegate to Specialists**
- Invoke appropriate subagents with clear, focused instructions.
- Provide each with specific scope.
-
-3. **Synthesize Results**
- Gather findings from all subagents.
- Identify conflicts or dependencies.
- Create comprehensive solution.
-
-4. **Verify**
- Ensure all aspects addressed.
- Run final validation if needed.
-
-Guidelines:
-
-- Delegate to specialists rather than doing work yourself
-- Provide clear, focused instructions to each subagent
-- Synthesize results into cohesive output
-```
-
-**Key characteristics:**
-
-- Task permissions control which subagents can be invoked
-- Delegates rather than executes
-- Synthesizes results from multiple specialists
-
-## Pattern 4: Exploration Agent
-
-**From OpenCode's built-in agents**: Fast, read-only agent for codebase discovery.
-
-**Best for:** Finding files, understanding architecture, answering questions about the codebase.
-
-**Why it works:** Isolated context keeps exploration out of main conversation. Compressed findings returned to parent.
-
-```markdown
----
-description: Fast codebase exploration and pattern discovery. Automatically invoke this agent when you need quick file/pattern discovery. Use when searching the codebase, understanding architecture, or finding implementations.
-mode: subagent
-temperature: 0.3
-permission:
- edit: deny
- bash:
- '*': deny
----
-
-You are a codebase exploration specialist.
-
-Your role:
-
-- Quickly discover relevant files and patterns
-- Understand codebase architecture
-- Find specific implementations
-- Return compressed, relevant findings
-
-Workflow:
-
-1. Understand the search goal
-2. Use Glob to find relevant files
-3. Use Grep to search for keywords
-4. Read key files to understand implementation
-5. Return compressed findings with file references
-
-Output format:
-
-## Findings
-
-### Relevant Files
-
-- `path/to/file.tsx:123` - Brief description
-- `path/to/other.tsx:45` - Brief description
-
-### Key Patterns
-
-- Pattern 1: Explanation
-- Pattern 2: Explanation
-
-### Recommendations
-
-- Next steps or suggestions
-```
-
-**Key characteristics:**
-
-- Read-only for safety
-- Fast discovery focus
-- Compressed output to avoid context pollution
-
-## Pattern 5: Path-Restricted Writer
-
-**Best for:** Documentation, focused file updates, scoped modifications.
-
-**Why it works:** Permissions enforce scope boundaries, preventing unintended changes outside designated areas.
-
-```markdown
----
-description: Writes and maintains documentation with clear explanations. Automatically invoke this agent when documentation updates are needed. Use when creating docs, updating README, or documenting features.
-mode: subagent
-temperature: 0.4
-permission:
- bash: deny
- edit:
- 'docs/*': allow
- 'README.md': allow
- '*.md': ask
- '*': deny
----
-
-You are a technical documentation specialist.
-
-Scope restrictions:
-
-- Can edit files in docs/ directory
-- Can edit README.md
-- Must ask before editing other .md files
-- Cannot edit source code files
-
-Guidelines:
-
-- Write clear, concise documentation
-- Include code examples
-- Use proper markdown formatting
-- Structure content logically
-```
-
-**Key characteristics:**
-
-- Path-specific permissions
-- Cannot touch source code
-- Clear scope boundaries
-
-## Pattern 6: Debugger with Hooks
-
-## Pattern 6: Skill-Enhanced Agent
-
-**Best for:** Agents that need specialized knowledge loaded at startup.
-
-**Why it works:** Skills provide domain-specific instructions without bloating the agent's system prompt.
-
-```markdown
----
-description: Builds Astro features following best practices. Automatically invoke this agent when a task requires implementing a full feature across pages, layouts, components, and tests. Use when implementing new functionality or user flows.
-mode: subagent
-temperature: 0.3
-permission:
- edit: allow
- bash: ask
-skills:
- - astro-component
- - astro-page
- - astro-layout
- - astro-test
----
-
-You are a feature builder for Astro applications.
-
-You have specialized skills loaded for:
-
-- Creating Components (Astro/React UI)
-- Creating Pages (routes in src/pages/)
-- Creating Layouts (shared shells)
-- Writing Tests (unit/integration tests)
-
-Follow the patterns from your loaded skills when implementing features.
-
-Workflow:
-
-1. Understand feature requirements
-2. Create TypeScript types/interfaces
-3. Create custom hooks for logic
-4. Create reusable components
-5. Create screen integrating components
-6. Write tests
-7. Run quality checks
-```
-
-**Key characteristics:**
-
-- Skills loaded at startup (not invoked on-demand)
-- Agent has specialized knowledge available
-- Follows patterns from loaded skills
-
-## Choosing the Right Pattern
-
-| Pattern | Use When | Key Feature |
-| -------------------- | ------------------------------- | -------------------------- |
-| Evaluator-Optimizer | Iterating to verifiable success | Ground truth feedback loop |
-| Read-Only Reviewer | Analysis without modification | Tool restrictions |
-| Orchestrator-Workers | Complex multi-specialist tasks | Task delegation |
-| Exploration | Finding and understanding code | Context isolation |
-| Path-Restricted | Scoped file modifications | Permission boundaries |
-| Skill-Enhanced | Domain expertise needed | Skills loaded at startup |
diff --git a/additional/skills/agentic-subagents/references/permission-recipes.md b/additional/skills/agentic-subagents/references/permission-recipes.md
deleted file mode 100644
index ec03ba9..0000000
--- a/additional/skills/agentic-subagents/references/permission-recipes.md
+++ /dev/null
@@ -1,62 +0,0 @@
-# Permission Recipes
-
-Use `permission` to align tool access with the workflow. Grant only what the agent needs.
-
-## Read-Only Reviewer
-
-```yaml
-permission:
- edit: deny
- bash:
- '*': deny
- 'git diff*': allow
- 'git log*': allow
- 'git status*': allow
-```
-
-## Test Runner (Read-Only)
-
-```yaml
-permission:
- edit: deny
- bash:
- '*': deny
- 'bun test*': allow
- 'bunx tsc*': allow
-```
-
-## Test Fixer (Edit + Test)
-
-```yaml
-permission:
- edit: allow
- bash:
- '*': deny
- 'bun test*': allow
- 'bunx tsc*': allow
-```
-
-## Feature Builder (Full Build)
-
-```yaml
-permission:
- edit: allow
- bash: ask
-```
-
-## Docs Writer (Path-Restricted)
-
-```yaml
-permission:
- edit:
- 'docs/*': allow
- 'README.md': allow
- '*.md': ask
- '*': deny
- bash: deny
-```
-
-## Notes
-
-- `edit` covers all file modifications (edit/write/patch). Use it instead of `write`.
-- Put "\*" first; last matching rule wins.
diff --git a/additional/skills/code-review/SKILL.md b/additional/skills/code-review/SKILL.md
deleted file mode 100644
index af5230f..0000000
--- a/additional/skills/code-review/SKILL.md
+++ /dev/null
@@ -1,38 +0,0 @@
----
-name: code-review
-# prettier-ignore
-description: Reviews code changes for senior-level PR feedback with parallel reviewer passes, disprove-first validation, and exact report output. Use when reviewing PR or local changes.
----
-
-# Code Review
-
-Review diffs like a senior engineer. Stay evidence-first. Stay merge-relevant.
-
-## Instructions
-
-1. Resolve review scope and allowed context with [references/mode-selection.md](references/mode-selection.md).
-2. Dispatch fresh reviewer subagents in parallel with the prompt in [references/reviewer-prompt.md](references/reviewer-prompt.md). Cover the axes in [references/review-axes.md](references/review-axes.md).
-3. Dispatch fresh validator subagents with the prompt in [references/validator-prompt.md](references/validator-prompt.md). Discard anything unconfirmed.
-4. Produce the final report exactly as defined in [references/report-format.md](references/report-format.md). Use only `approve`, `approve-with-comments`, `request-changes`, or `needs-clarification`.
-5. After the report, for a real PR only, optionally post inline comments with [references/comment-template.md](references/comment-template.md). Default to validated blocking findings only.
-
-## Rules
-
-- ALWAYS use a severity-first model: `critical`, `high`, `medium`, `low`, `nitpick`, `question`.
-- ALWAYS report only validated findings or validated missing-context questions with concrete evidence and exact `file:line` refs when code is involved.
-- DO keep findings issue-focused. DO NOT add a positive-notes section.
-- DO NOT keep style nits, speculative risks, weak evidence, pre-existing issues, or linter-catch comments.
-- DO treat blocking recommendations as requiring material production, security, UX, or maintenance risk.
-- DO treat blocking findings as the validated `critical` and `high` findings that would materially harm code health or create unacceptable production, security, UX, or maintenance risk if shipped.
-- DO NOT post unvalidated findings.
-
-## References
-
-- [references/mode-selection.md](references/mode-selection.md) - Scope parsing and allowed context.
-- [references/review-axes.md](references/review-axes.md) - Parallel reviewer-pass contracts.
-- [references/reviewer-prompt.md](references/reviewer-prompt.md) - Prompt template for one reviewer pass.
-- [references/issue-schema.md](references/issue-schema.md) - Candidate finding and question schema.
-- [references/validator-prompt.md](references/validator-prompt.md) - Prompt template for one validator pass.
-- [references/validation-rubric.md](references/validation-rubric.md) - Separate disprove-first validator rules.
-- [references/report-format.md](references/report-format.md) - Exact final report shape and decision rules.
-- [references/comment-template.md](references/comment-template.md) - Post-report inline comment format.
diff --git a/additional/skills/code-review/references/comment-template.md b/additional/skills/code-review/references/comment-template.md
deleted file mode 100644
index ec5cf66..0000000
--- a/additional/skills/code-review/references/comment-template.md
+++ /dev/null
@@ -1,33 +0,0 @@
-# Inline Comment Template
-
-Use this reference when posting validated inline PR comments after the report is shown.
-
-Default posting scope is blocking findings only unless the user explicitly widens it.
-
-## Template
-
-```markdown
-[]
-
-This is a real issue because . .
-
-Validated evidence:
-
-- Code: https://github.com///blob//#L-L
-- Rule (if applicable): https://github.com///blob//#L-L
-- Precedent (if applicable): https://github.com///blob//#L-L
-- Intent (if applicable): PR description or linked artefact reference
-```
-
-## Rules
-
-- ALWAYS use full commit SHA in all links.
-- ALWAYS prefix title with the validated severity.
-- ALWAYS include `Code` evidence.
-- DO include `Rule` evidence for `rule-violation` and `skill-contract-violation`.
-- DO include `Precedent` evidence for `consistency-drift` and any precedent-backed finding.
-- DO name the principle in the prose for principle-backed findings and cite the changed code link.
-- DO keep comments concise, factual, and non-speculative.
-- DO post only findings that survived the validator pass and are in the user-approved posting scope.
-- DO default posting scope to blocking findings only unless the user explicitly widens it.
-- DO NOT post duplicate comments for the same dedupe key.
diff --git a/additional/skills/code-review/references/mode-selection.md b/additional/skills/code-review/references/mode-selection.md
deleted file mode 100644
index 11e2b72..0000000
--- a/additional/skills/code-review/references/mode-selection.md
+++ /dev/null
@@ -1,47 +0,0 @@
-# Mode Selection
-
-Use this reference when resolving review scope.
-
-## Accepted forms
-
-- `#`
-- `uncommitted`
-- `branch`
-- `branch `
-
-No other scope forms are supported.
-
-## PR-first scope rule
-
-- If an explicit PR reference is provided, that is the primary review scope.
-- Resolve explicit PR references with `gh pr view --json number,title,body,baseRefName,headRefName,files`.
-- For explicit PR review, use GitHub PR metadata for base branch, head branch, changed files, title, body, and linked artefact discovery.
-- If the current branch has an associated PR, prefer the PR as review scope for branch review.
-- If the current branch has an associated PR, prefer the PR title, description, and explicitly linked artefacts as intent context even for local fallback review.
-- If no PR exists, fall back to the requested local mode.
-- If no PR exists, use explicit user-stated review goals when intent context is needed.
-
-## Uncommitted mode
-
-- Scope includes staged, unstaged, and untracked files.
-- Review only workspace changes, not prior commits.
-
-## Branch mode
-
-- Default base branch is `main` when the user selects the default.
-- Custom base branch is allowed and must be validated.
-- Use merge-base diff: `...HEAD`.
-
-## Validation checks
-
-- Confirm explicit PR references match `#`.
-- Confirm branch exists locally or as `origin/`.
-- If PR lookup fails, ask one corrective follow-up instead of guessing another PR.
-- If base is missing or invalid, ask one corrective follow-up.
-- If mode is missing, ask the user to choose PR review, `branch`, or `uncommitted`.
-- If the resolved scope has no reviewable file changes, still return the standard review report and state that the scope was empty.
-
-## Rules
-
-- DO accept only the documented mode forms.
-- ALWAYS preserve explicit PR scope before branch or uncommitted fallback.
diff --git a/assets/propulsion.png b/assets/propulsion_icon.png
similarity index 100%
rename from assets/propulsion.png
rename to assets/propulsion_icon.png
diff --git a/assets/propulsion2.png b/assets/propulsion_icon_square.png
similarity index 100%
rename from assets/propulsion2.png
rename to assets/propulsion_icon_square.png
diff --git a/bun.lock b/bun.lock
index 164d1c4..24e4053 100644
--- a/bun.lock
+++ b/bun.lock
@@ -6,7 +6,7 @@
"name": "propulsion",
"devDependencies": {
"oxfmt": "^0.44.0",
- "oxlint": "^1.59.0",
+ "oxlint": "^1.62.0",
"oxlint-tsgolint": "^0.20.0",
},
},
diff --git a/docs/propulsion/skill-authoring.md b/docs/propulsion/skill-authoring.md
deleted file mode 100644
index ffd8992..0000000
--- a/docs/propulsion/skill-authoring.md
+++ /dev/null
@@ -1,218 +0,0 @@
-# Propulsion Skill Authoring
-
-Use this document when creating or updating any Propulsion skill.
-
-## Goal
-
-Write skills that are explicit, strict, low-token, and hard to misread.
-
-Propulsion skills are workflow contracts. Nothing important should be implied. State the exact prerequisite, exact artifact, exact stop condition, exact completion gate, and exact next skill by name.
-
-## Core Rules
-
-- Use exact supported skill names in backticks: `propulsion-workflow`, `exploration`, `planning`, `execution`, `tdd`, `debugging`.
-- State every stage boundary explicitly. Never imply what should happen next.
-- All bug work enters through `exploration`, reaches `planning` from an approved `prd.md`, and hands off to `debugging` after planning.
-- `execution` owns feature implementation only. `debugging` owns bug diagnosis, bug-fix orchestration, review feedback loops, and closure.
-- When authoring bug-work contracts, require one living `docs/propulsion/.../debug.md` artifact that debugging creates or resumes on entry and keeps through closure.
-- Put critical gates in `SKILL.md`. Do not hide them only in `references/`.
-- Prefer hard commands over soft guidance: `MUST`, `DO NOT`, `NEVER`, `ONLY`, `STOP`, `ALL`.
-- Keep sentences short, imperative, and binary.
-- Use subagents explicitly when the workflow depends on them.
-- State what to do when prerequisites are missing. Usually: `STOP` and route to another skill by exact name.
-- State what artifact must exist, where it lives, and whether explicit user approval or a visible user-facing transition prompt is required.
-- Add a completion checklist. Do not let the skill exit without it.
-- Start each major section with its standard intro line.
-- Move explanation, examples, and long formats into `references/`.
-
-## Tone
-
-- Lead with imperatives.
-- Prefer one instruction per line.
-- Use CAPS only for control words.
-- Avoid filler, motivation, and commentary.
-- Avoid hedging like `prefer`, `usually`, `maybe`, unless the choice is genuinely optional.
-- Avoid vague language like `continue if needed`, `consider`, `handle appropriately`, `similar to`, `etc.`.
-
-## Required Shape
-
-Every Propulsion `SKILL.md` except `propulsion-workflow` MUST use this structure.
-
-`propulsion-workflow` is the only exception. It is an entry-only contract, not a standard stage skill.
-
-```md
-# Skill Name
-
-One-line mission.
-
-## Prerequisites
-
-ALL prerequisites MUST be true before following this skill.
-
-- Requirement 1
-- Requirement 2
-
-If any prerequisite are false, STOP. Load `other-skill`.
-
-## Instructions
-
-Follow these steps IN ORDER. Do NOT skip steps.
-
-1. Step 1.
-2. Step 2.
-3. Step 3.
-
-## Rules
-
-These rules are MANDATORY.
-
-- MUST ...
-- DO NOT ...
-- NEVER ...
-- ONLY ...
-
-## Completion Gate
-
-Do NOT leave this skill until ALL items are complete.
-
-- [ ] Outcome 1
-- [ ] Outcome 2
-- [ ] Outcome 3
-
-## Next Skill
-
-Once the completion gate is fully checked:
-
-- If condition A is true, load `next-skill`.
-- If condition B is true, load `different-skill`.
-
-## References
-
-Use these references when you need detail.
-
-- [references/file.md](references/file.md) - Why it exists.
-```
-
-## Section Contract
-
-Use the same section meaning every time.
-
-### Prerequisites
-
-Use this section to define the legal entry point.
-
-Standard intro line:
-
-- `ALL prerequisites MUST be true before following this skill.`
-
-- Name the prior skill if there is one.
-- Name the required artifact if there is one.
-- Name the required approval if there is one.
-- Say what to do if anything is missing.
-
-Good:
-
-- Approved `docs/propulsion/.../prd.md` exists.
-- `exploration` has completed.
-- If the PRD is missing or unapproved, STOP. Load `exploration`.
-
-### Instructions
-
-Use this section for the ordered workflow only.
-
-Standard intro line:
-
-- `Follow these steps IN ORDER. Do NOT skip steps.`
-
-- Put steps in strict sequence.
-- Put loops in plain language: `Repeat until ...`.
-- Put review and re-review loops here, not only in references.
-- If a step uses a reference file, name it inline.
-
-### Rules
-
-Use this section for non-negotiable constraints.
-
-Standard intro line:
-
-- `These rules are MANDATORY.`
-
-- Ban stage skipping.
-- Ban guessing.
-- Ban hidden transitions.
-- Ban artifact-free handoffs.
-- Ban self-approval where a fresh subagent or human approval is required.
-
-### Completion Gate
-
-Use this section as the exit test.
-
-Standard intro line:
-
-- `Do NOT leave this skill until ALL items are complete.`
-
-- Every checkbox should be observable.
-- Include artifact creation.
-- Include required approval.
-- Include verification or review if required.
-- If a checkbox is not checkable, rewrite it.
-
-### Next Skill
-
-Use exact skill names. Do not imply transitions.
-
-Standard intro line:
-
-- `Once the completion gate is fully checked:`
-
-Good:
-
-- If `prd.md` is approved, load `planning`.
-- If plan review finds missing product intent, load `exploration`.
-- If implementation review returns findings during phase execution, keep the loop inside `execution` and send the findings back to the active implementer context.
-
-Bad:
-
-- Move to the next stage.
-- Continue the workflow.
-- Review if needed.
-
-### References
-
-Use this section as the exhaustive reference list for the skill.
-
-Standard intro line:
-
-- `Use these references when you need detail.`
-
-## References Rules
-
-Use `references/` for detail, not for gates.
-
-- Put templates, formats, examples, and deeper heuristics in `references/`.
-- Mention critical references inside the ordered instructions.
-- Keep references focused and single-purpose. Consolidate tiny overlapping references when one stronger reference is clearer.
-- Do not hide approval gates, stop conditions, or next-skill routing in references.
-
-## Reference Shape
-
-Use the same reference layout every time.
-
-- Start with `# Title`.
-- Follow with one line that says when to use the reference, for example `Use this reference ...` or `Use this template ...`.
-- Put the actual template, format, heuristics, or examples next.
-- End with `## Rules` and only the reference-local rules.
-- For prompt templates, keep the full prompt in a fenced block and keep dispatch-only rules after the fence.
-
-## Author Checklist
-
-Use this before finalizing a skill.
-
-- [ ] The skill names the exact legal prerequisite skill, if any.
-- [ ] The skill names the exact legal next skill, if any.
-- [ ] The skill states what artifact must exist or be written.
-- [ ] The skill states whether explicit user approval or a visible transition prompt is required.
-- [ ] The skill states what the agent must do if inputs are missing.
-- [ ] The skill uses strong explicit wording, not implied behavior.
-- [ ] The skill keeps long detail in `references/`.
-- [ ] The skill conforms to `agentic-skills`.
diff --git a/hooks/hooks.json b/hooks/hooks.json
new file mode 100644
index 0000000..1668310
--- /dev/null
+++ b/hooks/hooks.json
@@ -0,0 +1,15 @@
+{
+ "hooks": {
+ "SessionStart": [
+ {
+ "matcher": "startup|clear|compact|resume",
+ "hooks": [
+ {
+ "type": "command",
+ "command": "./hooks/run-hook.cmd session-start"
+ }
+ ]
+ }
+ ]
+ }
+}
diff --git a/hooks/run-hook.cmd b/hooks/run-hook.cmd
new file mode 100755
index 0000000..8041bfd
--- /dev/null
+++ b/hooks/run-hook.cmd
@@ -0,0 +1,7 @@
+#!/bin/sh
+set -eu
+
+script_name="${1:?missing hook script name}"
+script_dir="$(CDPATH= cd -- "$(dirname -- "$0")" && pwd)"
+
+exec "$script_dir/$script_name"
diff --git a/hooks/session-start b/hooks/session-start
new file mode 100755
index 0000000..f27cd64
--- /dev/null
+++ b/hooks/session-start
@@ -0,0 +1,14 @@
+#!/bin/sh
+set -eu
+
+plugin_dir="$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd)"
+PLUGIN_DIR="$plugin_dir" node <<'JS'
+const { PROPULSION_BOOTSTRAP_GUIDANCE } = require(`${process.env.PLUGIN_DIR}/lib/bootstrap-guidance.js`);
+
+process.stdout.write(JSON.stringify({
+ hookSpecificOutput: {
+ hookEventName: 'SessionStart',
+ additionalContext: PROPULSION_BOOTSTRAP_GUIDANCE,
+ },
+}));
+JS
diff --git a/index.mjs b/index.mjs
new file mode 100644
index 0000000..5f25e26
--- /dev/null
+++ b/index.mjs
@@ -0,0 +1,22 @@
+import { createRequire } from 'node:module';
+
+const require = createRequire(import.meta.url);
+const {
+ getPropulsionBootstrapGuidance,
+} = require('./lib/bootstrap-guidance.js');
+
+async function PropulsionPlugin() {
+ return {
+ 'experimental.chat.messages.transform': async (_input, output) => {
+ output.messages = [
+ {
+ role: 'system',
+ content: getPropulsionBootstrapGuidance(),
+ },
+ ...(output.messages ?? []),
+ ];
+ },
+ };
+}
+
+export default { server: PropulsionPlugin };
diff --git a/lib/bootstrap-guidance.js b/lib/bootstrap-guidance.js
new file mode 100644
index 0000000..6f3f8b3
--- /dev/null
+++ b/lib/bootstrap-guidance.js
@@ -0,0 +1,32 @@
+const { readFileSync } = require('node:fs');
+const { join } = require('node:path');
+
+const PROPULSION_SKILL_PATH = join(
+ __dirname,
+ '..',
+ 'skills',
+ 'propulsion',
+ 'SKILL.md',
+);
+
+function buildPropulsionBootstrapGuidance() {
+ const propulsionSkill = readFileSync(PROPULSION_SKILL_PATH, 'utf8').trim();
+
+ return `
+Propulsion workflow entry point: load and follow the propulsion skill when the request is software work.
+Route software work through Propulsion before downstream stages.
+
+${propulsionSkill}
+`;
+}
+
+const PROPULSION_BOOTSTRAP_GUIDANCE = buildPropulsionBootstrapGuidance();
+
+function getPropulsionBootstrapGuidance() {
+ return PROPULSION_BOOTSTRAP_GUIDANCE;
+}
+
+module.exports = {
+ PROPULSION_BOOTSTRAP_GUIDANCE,
+ getPropulsionBootstrapGuidance,
+};
diff --git a/package.json b/package.json
index 4ea3b78..96a7c84 100644
--- a/package.json
+++ b/package.json
@@ -1,37 +1,14 @@
{
"name": "propulsion",
- "version": "0.10.0",
- "description": "Compact workflow skills for agentic coding in OpenCode.",
- "homepage": "https://github.com/moonpixels/propulsion#readme",
- "bugs": {
- "url": "https://github.com/moonpixels/propulsion/issues"
- },
- "license": "ISC",
- "repository": {
- "type": "git",
- "url": "git+https://github.com/moonpixels/propulsion.git"
- },
- "files": [
- ".opencode/package.json",
- ".opencode/plugins/propulsion.js",
- "skills",
- "additional/commands",
- "additional/skills",
- "README.md",
- "additional/README.md"
- ],
- "type": "module",
- "main": "./.opencode/plugins/propulsion.js",
- "exports": {
- ".": "./.opencode/plugins/propulsion.js"
- },
+ "version": "1.0.0",
+ "main": "./index.mjs",
+ "exports": "./index.mjs",
"scripts": {
"checks": "bun run lint && bun run format && bun run test",
"format": "oxfmt .",
"format:check": "oxfmt --check .",
"lint": "oxlint",
- "test": "bun test ./tests && bash tests/opencode/run-tests.sh",
- "test:opencode": "bash tests/opencode/run-tests.sh",
+ "test": "bun test ./tests",
"test:unit": "bun test ./tests"
},
"devDependencies": {
diff --git a/skills/brainstorm/SKILL.md b/skills/brainstorm/SKILL.md
new file mode 100644
index 0000000..c0e0055
--- /dev/null
+++ b/skills/brainstorm/SKILL.md
@@ -0,0 +1,61 @@
+---
+name: brainstorm
+# prettier-ignore
+description: Create an approved PRD through repo inspection and interrogation. Use when scope, UX, constraints, or success criteria are unclear, or when user needs a PRD.
+---
+
+# Brainstorm
+
+Turn vague feature, UX, API, product-scope, or requirements work into an approved PRD.
+
+## Prerequisites
+
+ALL prerequisites MUST be true before following this skill.
+
+- If an approved `docs/propulsion/.../prd.md` already exists for this work, STOP. Enter the `plan` skill.
+
+## Instructions
+
+Follow these steps IN ORDER. Do NOT skip steps.
+
+1. Load `interrogate` skill to close blocking branches and reach shared understanding before PRD writing.
+2. If the request is too large, decompose it and explore only the first phase or subsystem.
+3. After all blocking branches are closed and brainstorming is complete, check for relevant non-Propulsion skills and load them before writing `prd.md`.
+4. Write `docs/propulsion/{yyyymmdd}-{feature-name}/prd.md` using the template in [references/prd-template.md](references/prd-template.md), including resolved decisions, project facts, and constraints from `interrogate`.
+5. Compare `prd.md` against the conversation for missing decisions, facts, constraints, requested behaviours, or success criteria; update `prd.md` before approval if relevant content is missing.
+6. Ask the user to review `prd.md`; treat only explicit approval, such as "approved" or "yes, proceed", as approval before entering `plan`.
+
+## Rules
+
+These rules are MANDATORY.
+
+- MUST close every blocking branch before writing `prd.md`. Blocking branches include anything that would change scope, UX, architecture, sequencing, or success criteria.
+- BEFORE writing `prd.md`, ALWAYS check for relevant non-Propulsion skills and load them IMMEDIATELY.
+- Propulsion skills and workflow MUST take precedence over any conflicting non-Propulsion skill UNLESS the user instructions state otherwise.
+- MUST keep the PRD product-facing while recording durable implementation and testing decisions.
+- ENSURE the PRD includes ALL relevant decisions, even if they seem obvious or minor.
+- You CAN create supporting documents such as `docs/propulsion/.../research.md` or `docs/propulsion/.../diagrams.md` if needed, but the PRD must include all durable decisions.
+- DO include the supporting documents as implementation inputs in the PRD, but DO NOT rely on them for durable decisions.
+- DO NOT print the PRD, or other workflow artefacts in the chat, keep them in files.
+- If you cannot write files, STOP, ask the user to switch to write mode, then continue to write the PRD.
+
+## Completion Gate
+
+Do NOT leave this skill until ALL items are complete.
+
+- [ ] Used `interrogate` skill to reach shared understanding and close every blocking branch.
+- [ ] `prd.md` written to `docs/propulsion/.../prd.md`.
+- [ ] `prd.md` sanity-checked against the conversation and updated if relevant content was missing.
+- [ ] User has explicitly approved `prd.md` after self-review.
+
+## Next Steps
+
+Once the completion gate is fully checked:
+
+- If `prd.md` is approved, enter the `plan` skill.
+
+## References
+
+Use these references when you need detail.
+
+- [references/prd-template.md](references/prd-template.md) - PRD shape and output path.
diff --git a/skills/exploration/references/prd-template.md b/skills/brainstorm/references/prd-template.md
similarity index 93%
rename from skills/exploration/references/prd-template.md
rename to skills/brainstorm/references/prd-template.md
index 9ce7eea..03d1fc0 100644
--- a/skills/exploration/references/prd-template.md
+++ b/skills/brainstorm/references/prd-template.md
@@ -33,11 +33,11 @@ Describe the proposed behaviour end-to-end from the user's perspective.
- Durable module or boundary decisions
- Data shape or API contract decisions
-- Interaction rules that planning should not re-litigate
+- Interaction rules that the `plan` skill should not re-litigate
## Testing Decisions
-- What public behavior matters
+- What public behaviour matters
- Which modules or seams deserve tests
- Prior art worth copying from the repo
diff --git a/skills/commit/SKILL.md b/skills/commit/SKILL.md
new file mode 100644
index 0000000..6a49c5b
--- /dev/null
+++ b/skills/commit/SKILL.md
@@ -0,0 +1,54 @@
+---
+name: commit
+description: Create one safe local git commit from current changes. Use when asked to commit, save changes, or make a local checkpoint.
+---
+
+# Commit
+
+Create exactly one local git commit from safe current changes and report the result.
+
+## Prerequisites
+
+ALL prerequisites MUST be true before following this skill.
+
+- The current directory is inside a git repository with a writable index.
+
+## Instructions
+
+Follow these steps IN ORDER. Do NOT skip steps.
+
+1. Inspect current state with `git status --short`, `git diff HEAD`, and `git branch --show-current`.
+2. Stage all local changes with `git add -A`, including untracked files.
+3. Unstage every staged secret-like file matching [references/workflow.md](references/workflow.md).
+4. Check staged changes after exclusions. If none remain, stop and output exactly `No changes to commit.`
+5. Generate a one-line imperative commit subject from the staged diff.
+6. Create exactly one local commit with that subject.
+7. Run `git status --short` before the final response.
+8. Report the result using the exact success format in [references/workflow.md](references/workflow.md).
+
+## Rules
+
+These rules are MANDATORY.
+
+- MUST create exactly one local commit when committable changes remain after exclusions.
+- MUST stage with `git add -A` before applying exclusions.
+- MUST unstage secret-like files before committing when they are staged.
+- MUST stop with exactly `No changes to commit.` when exclusions leave no committable changes.
+- NEVER commit secret-like files.
+- NEVER push, open pull requests, amend, reset, force, or run destructive git commands unless user explicitly instructs.
+
+## Completion Gate
+
+Do NOT leave this skill until ALL items are complete.
+
+- [ ] `git add -A` was run.
+- [ ] Secret-like staged files were unstaged or none were present.
+- [ ] Exactly one local commit was created, or `No changes to commit.` was returned.
+- [ ] No push, pull request, amend, reset, force, or destructive git command was run.
+- [ ] Final output matches the required contract.
+
+## References
+
+Use these references when you need detail.
+
+- [references/workflow.md](references/workflow.md) - Secret-like exclusion patterns, commit message rules, and output contract.
diff --git a/skills/commit/references/workflow.md b/skills/commit/references/workflow.md
new file mode 100644
index 0000000..34cdc77
--- /dev/null
+++ b/skills/commit/references/workflow.md
@@ -0,0 +1,51 @@
+# Commit Workflow Reference
+
+## Inputs
+
+- Current git status: `git status --short`
+- Current git diff, staged and unstaged: `git diff HEAD`
+- Current branch: `git branch --show-current`
+
+## Secret-Like Exclusions
+
+Never commit likely secret files. Always unstage staged files matching these patterns before committing:
+
+- `.env`
+- `.env.*`
+- `*.pem`
+- `*.key`
+- `*.p12`
+- `*.pfx`
+- `credentials.json`
+- `*credentials*`
+- `*secret*`
+- `*token*`
+- `.ssh/*`
+
+## Commit Message
+
+Use a normal imperative commit subject with this format:
+
+- one line only
+- short descriptive subject line
+- imperative mood
+- normal natural wording
+- no trailing punctuation
+
+## No Committable Changes Output
+
+If no staged changes remain after exclusions, stop and output exactly:
+
+```md
+No changes to commit.
+```
+
+## Success Output
+
+Run `git status --short` before producing the final response. When the commit succeeds, output exactly:
+
+```md
+Commit created:
+Message:
+Excluded secret-like files:
+```
diff --git a/skills/debug/SKILL.md b/skills/debug/SKILL.md
new file mode 100644
index 0000000..064de92
--- /dev/null
+++ b/skills/debug/SKILL.md
@@ -0,0 +1,61 @@
+---
+name: debug
+# prettier-ignore
+description: Handle concrete bug reports through direct intake, reproduce, diagnose, TDD-fix, verify, reset, and escalate loops. Use when failures need repair.
+---
+
+# Debug
+
+Use when a concrete failure or bug report needs diagnosis and repair.
+
+## Prerequisites
+
+ALL prerequisites MUST be true before following this skill.
+
+- The work is a bug, regression, crash, incorrect output, flaky behaviour, or other concrete failure.
+- If the work is feature-shaped or expected behaviour is intentionally being designed, STOP. Load `brainstorm`.
+
+## Instructions
+
+Follow these steps IN ORDER. Do NOT skip steps.
+
+1. Create or resume `docs/propulsion/{yyyymmdd}-{bug-slug}/debug.md` using [references/debug-template.md](references/debug-template.md).
+2. Load `interrogate` skill for missing user-answerable intake: report provenance, expected behaviour, actual behaviour, impact, environment, reproduction, and questions answered.
+3. Record intake answers and resolved decisions from `interrogate` in `debug.md`; if expected behaviour is unknowable, stay in `debug` and ask or block.
+4. Complete targeted codebase exploration in `debug.md` before reproduction, diagnosis, or fix work: relevant files, existing tests, commands, logs, ownership, and candidate boundaries only.
+5. Reproduce, reduce, isolate, diagnose, reset, and escalate with [references/investigation-loop.md](references/investigation-loop.md).
+6. Do not allow production-code changes until `debug.md` contains a grounded diagnosis, supporting evidence, fix constraints, and one chosen fix hypothesis.
+7. Start a fresh bug-worker subagent with [references/bug-worker-prompt.md](references/bug-worker-prompt.md), then review with [references/bug-reviewer-prompt.md](references/bug-reviewer-prompt.md).
+8. If review rejects the fix, send findings back with [references/bug-feedback-prompt.md](references/bug-feedback-prompt.md). Repeat until approved, reset when evidence contradicts the diagnosis, or reassess architecture and patterns before escalating after 3 failed fix loops.
+9. If the fix is verified and approved, record closure in `debug.md` and finish.
+
+## Rules
+
+These rules are MANDATORY.
+
+- MUST keep `debug.md` current from direct entry or resumed entry through closure.
+- MUST complete intake for expected behaviour, actual behaviour, impact, environment, and reproduction before broad code inspection or fix work.
+- MUST record `interrogate` intake answers and resolved decisions in `debug.md`.
+- MUST record targeted codebase exploration before reproduction, diagnosis, or fix work.
+- MUST stabilise reproduction, reduce the failing case, and isolate the first bad boundary or divergence before choosing a fix.
+- NEVER edit production code in the main `debug` stage.
+- EVERY fix attempt MUST start with a failing regression test and target one fix hypothesis.
+- MUST record each failed hypothesis, diagnostic edit, fix attempt, review outcome, reset, escalation, and closure in `debug.md`.
+
+## Completion Gate
+
+Do NOT leave this skill until ALL items are complete.
+
+- [ ] `debug.md` exists at `docs/propulsion/{yyyymmdd}-{bug-slug}/debug.md` and was created or resumed on entry.
+- [ ] Intake, `interrogate` answers and resolved decisions, targeted codebase exploration, reproduction, reduction, evidence, ranked hypotheses, experiments, diagnosis gate, fix attempts, review outcomes, verification, and closure are recorded in `debug.md`.
+- [ ] The bug is either closed with verified evidence or escalated after architecture and pattern reassessment following 3 failed fix loops.
+
+## References
+
+Use these references when you need detail.
+
+- [references/debug-template.md](references/debug-template.md) - Living `debug.md` template for the full bug dossier.
+- [references/investigation-loop.md](references/investigation-loop.md) - Core bug loop for reproduce, reduce, isolate, diagnose, reset, and escalate.
+- [references/bug-worker-prompt.md](references/bug-worker-prompt.md) - Prompt template for one diagnosis-gated TDD fix attempt.
+- [references/bug-reviewer-prompt.md](references/bug-reviewer-prompt.md) - Prompt template for independent review of one bug fix attempt.
+- [references/bug-feedback-prompt.md](references/bug-feedback-prompt.md) - Prompt template for feeding review findings back into the active bug fix attempt.
diff --git a/skills/debugging/references/bug-feedback-prompt.md b/skills/debug/references/bug-feedback-prompt.md
similarity index 82%
rename from skills/debugging/references/bug-feedback-prompt.md
rename to skills/debug/references/bug-feedback-prompt.md
index 72f5a5a..1f77357 100644
--- a/skills/debugging/references/bug-feedback-prompt.md
+++ b/skills/debug/references/bug-feedback-prompt.md
@@ -1,6 +1,6 @@
# Bug Feedback Prompt Template
-Use this template when returning reviewer findings to the active implementer during a bug-fix loop in `debugging`.
+Use this template when returning reviewer findings to the active bug-worker during a bug-fix loop in `debug`.
````markdown
**You are a subagent completing work in the Propulsion workflow.**
@@ -55,16 +55,18 @@ Use this exact format for your output.
-
- Classification:
- Resolution:
- - Evidence:
+ - Evidence:
```
## Rules
These rules are MANDATORY.
+- Preserve the diagnosis reset and one-hypothesis discipline.
- Triage every finding before changing code.
- Do not continue coding once the diagnosis is contradicted.
- Preserve the one-hypothesis, one-fix-loop discipline.
-- Update `debug.md` before handing control back to `debugging`.
+- Do not start a second fix hypothesis inside feedback handling; if the chosen fix hypothesis fails, update `debug.md` and reset back to diagnosis.
+- Update `debug.md` before handing control back to `debug`.
- Follow the output format EXACTLY as defined above.
````
diff --git a/skills/debugging/references/bug-reviewer-prompt.md b/skills/debug/references/bug-reviewer-prompt.md
similarity index 63%
rename from skills/debugging/references/bug-reviewer-prompt.md
rename to skills/debug/references/bug-reviewer-prompt.md
index 3a91a17..43e34d9 100644
--- a/skills/debugging/references/bug-reviewer-prompt.md
+++ b/skills/debug/references/bug-reviewer-prompt.md
@@ -1,26 +1,26 @@
# Bug Reviewer Prompt Template
-Use this template when dispatching a fresh reviewer subagent for one bug-fix loop in `debugging`.
+Use this template when starting a fresh bug-reviewer subagent for one bug-fix loop in `debug`.
````markdown
**You are a subagent completing work in the Propulsion workflow.**
-You are an implementation reviewer for one bug-fix attempt under the `debugging` skill.
+You are an implementation reviewer for one bug-fix attempt under the `debug` skill.
## Inputs
-- **Plan location**: ``
- **Debug artifact**: ``
## Implementation Report
-This is the full self-review implementation report submitted by the implementer. **Do not trust it blindly, be sceptical and verify all claims yourself.**
+This is the full self-review implementation report submitted by the bug-worker. **Do not trust it blindly, be sceptical and verify all claims yourself.**
-
+
## Review Focus
- Confirm the diagnosis gate was satisfied before any production-code change.
+- Reject if any required diagnosis evidence is missing: exact symptom, reduced reproduction or flaky classification, full error reading / error-reading conclusion, recent-change conclusion, applicable working example or explicit N/A, boundary tracing, first bad boundary or divergence / first-bad-divergence, fix constraints, chosen fix hypothesis, fail-then-pass regression proof, or reset evidence from prior failed loops.
- Confirm the regression-test-first requirement was followed.
- Confirm the fix matches the chosen fix hypothesis and fix constraints in `debug.md`.
- Confirm verification is sufficient for the reported bug behaviour.
@@ -32,10 +32,10 @@ Follow these steps IN ORDER. Do NOT skip steps.
1. Read the current `debug.md` and implementation report in full.
2. Inspect the real code and diff, not just the report.
-3. Verify the regression test failed first, then passed after the fix.
+3. Verify the regression test failed first, then passed after the fix; `debug.md` must show the failing result before fix and passing result after fix.
4. Verify the change stays within the chosen fix hypothesis and does not hide unexplained evidence.
5. Return approval only if the diagnosis gate, regression-test-first requirement, diagnosis status, and verification all hold.
-6. If anything fails, reject the attempt and state whether `debugging` must reset back to diagnosis.
+6. If anything fails, reject the attempt and state whether `debug` must reset back to diagnosis.
## Output
@@ -49,16 +49,18 @@ Use this exact format for your output.
**Diagnosis Status**
-
- - Evidence:
+ - Evidence:
**Verification Status**
- Regression-test-first requirement:
- - Evidence:
+ - Evidence:
+- Failing result before fix and passing result after fix:
+ - Evidence:
- Chosen fix hypothesis respected:
- - Evidence:
-- Verification sufficient for bug behavior:
- - Evidence:
+ - Evidence:
+- Verification sufficient for bug behaviour:
+ - Evidence:
@@ -83,9 +85,10 @@ Use this exact format for your output.
These rules are MANDATORY.
- Treat the diagnosis gate as required, not advisory.
-- ALWAYS check for non-Propulsion skills that are relevant to this task and load them IMMEDIATELY using the skill tool.
+- ALWAYS check for relevant non-Propulsion skills and load them IMMEDIATELY.
- Propulsion skills and workflow MUST take precedence over any conflicting non-Propulsion skill UNLESS the user instructions state otherwise.
- Reject speculative or symptom-only fixes.
+- Reject missing root-cause evidence, missing fail-then-pass proof, changes outside the chosen fix hypothesis, or permanent code changes made outside the bug-worker subagent.
- Call out missing verification or contradictory evidence explicitly.
- MUST return exactly one `Status:` line with either `approved` or `rejected`.
- If `Status: rejected`, MUST include at least one finding.
diff --git a/skills/debugging/references/bug-implementer-prompt.md b/skills/debug/references/bug-worker-prompt.md
similarity index 58%
rename from skills/debugging/references/bug-implementer-prompt.md
rename to skills/debug/references/bug-worker-prompt.md
index 2b923e8..fe00be5 100644
--- a/skills/debugging/references/bug-implementer-prompt.md
+++ b/skills/debug/references/bug-worker-prompt.md
@@ -1,15 +1,14 @@
-# Bug Implementer Prompt Template
+# Bug Worker Prompt Template
-Use this template when dispatching a fresh implementer subagent for one bug-fix loop in `debugging`.
+Use this template when starting a fresh bug-worker subagent for one bug-fix loop in `debug`.
````markdown
**You are a subagent completing work in the Propulsion workflow.**
-You are a senior software engineer implementing one bug-fix attempt under the `debugging` skill.
+You are a senior software engineer implementing one bug-fix attempt under the `debug` skill.
## Bug Context
-- **Plan location**: ``
- **Debug artifact**: ``
- **Chosen fix hypothesis**: ``
- **Fix constraints**: ``
@@ -19,11 +18,12 @@ You are a senior software engineer implementing one bug-fix attempt under the `d
Follow these steps IN ORDER. Do NOT skip steps.
1. Review the bug context and ask questions if the diagnosis gate, scope, or repo state is unclear. Do not guess.
-2. If the diagnosis gate is not satisfied, STOP and report that `debugging` must return to diagnosis before a fix attempt.
-3. Load the `tdd` skill NOW and follow the guidance.
-4. Implement one bug-fix attempt for the chosen fix hypothesis.
-5. Update `debug.md` with the regression test, fix attempt, verification result, and any contradictory evidence.
-6. Return an implementation report in the exact format defined below.
+2. Verify the full diagnosis gate evidence checklist in `debug.md`: exact symptom, reduced reproduction or flaky classification, full error reading, recent-change conclusion, applicable working example or explicit N/A, boundary tracing, first bad boundary or divergence, fix constraints, chosen fix hypothesis, and reset evidence from prior loops if any.
+3. If the diagnosis gate is not satisfied, STOP and report that `debug` must return to diagnosis before a fix attempt.
+4. Load the `tdd` skill NOW and follow it.
+5. Implement one bug-fix attempt for the chosen fix hypothesis.
+6. Update `debug.md` with the regression test, fix attempt, verification result, and any contradictory evidence.
+7. Return an implementation report in the exact format defined below.
## Output
@@ -58,9 +58,10 @@ Use this exact format for your output.
These rules are MANDATORY.
- Load the `tdd` skill NOW.
-- ALWAYS check for non-Propulsion skills that are relevant to this task and load them IMMEDIATELY using the skill tool.
+- ALWAYS check for relevant non-Propulsion skills and load them IMMEDIATELY.
- Propulsion skills and workflow MUST take precedence over any conflicting non-Propulsion skill UNLESS the user instructions state otherwise.
- NO PRODUCTION CODE before the failing regression test.
+- Only bug-worker subagents make permanent code changes; the debug controller may make temporary diagnostic edits only when they are recorded and reverted before fix handoff.
- Work only on the chosen fix hypothesis for this loop.
- Make one minimal fix attempt only.
- If evidence contradicts the diagnosis, STOP, update `debug.md`, and reset back to diagnosis.
diff --git a/skills/debug/references/debug-template.md b/skills/debug/references/debug-template.md
new file mode 100644
index 0000000..298b0ab
--- /dev/null
+++ b/skills/debug/references/debug-template.md
@@ -0,0 +1,174 @@
+# Debug Template
+
+Write a living `docs/propulsion/{yyyymmdd}-{bug-slug}/debug.md` artifact using this exact section order.
+
+```md
+# Debug Note:
+
+## User Report Provenance
+
+- Source: ``
+- Reporter and timestamp: ``
+- Original report excerpt: ``
+- Prior artifact resumed: ``
+
+## Intake Questions Answered
+
+- Exact symptom: ``
+- Expected behaviour: ``
+- Actual behaviour: ``
+- Impact: ``
+- Environment: ``
+- Reproduction: ``
+- Questions answered: ``
+- Open questions or blockers: ``
+
+## Targeted Codebase Exploration
+
+- Relevant files or areas: ``
+- Existing tests or commands: ``
+- Ownership and prior context: ``
+- Likely seams or boundaries: ``
+- Exploration limits: ``
+
+## Reproduction
+
+- Status: ``
+- Exact command or path: ``
+- Expected behaviour: ``
+- Actual behaviour: ``
+- Reduced reproduction or flaky classification: ``
+
+## Full Error Reading
+
+- Full error, stack, warning, assertion, and exit code: ``
+- First meaningful frame: ``
+- Relevant surrounding logs or traces: ``
+- Error-reading conclusion: ``
+
+## Environment Facts
+
+- Revision / branch / artifact: ``
+- Runtime and platform: ``
+- Inputs, flags, config, and data facts: ``
+- Scope: ``
+
+## Recent Changes
+
+- Working tree and staged diff: ``
+- Recent commits or release delta: ``
+- Dependencies, config, environment, CI, and runtime drift: ``
+- Recent-change conclusion: ``
+
+## Reduction And Isolation
+
+- Smallest failing case found: ``
+- What was removed or controlled: ``
+- Good / bad comparison points: ``
+
+## Working Examples
+
+- Working example or reference implementation: ``
+- Broken versus working comparison: ``
+- First observed divergence: ``
+
+## Diagnostic Edits
+
+- Temporary diagnostic edits made: ``
+- Revert status: ``
+- Diagnostic edit outcome: ``
+
+## Boundary Tracing
+
+- Boundary map: ``
+- Ingress observations: ``
+- Egress observations: `