From 3243f527b8929e38355303bdf3356b9be0a06e4c Mon Sep 17 00:00:00 2001 From: PN <65691345+AUN-PN@users.noreply.github.com> Date: Fri, 15 May 2026 15:33:59 +0700 Subject: [PATCH 1/3] Add Unity Agent Workflows plugin Add Unity Agent Workflows to the Development & Workflow community plugin list following CONTRIBUTING.md. --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 568a2ca2..20903376 100644 --- a/README.md +++ b/README.md @@ -139,6 +139,7 @@ Third-party plugins built by the community. [PRs welcome](#contributing)! - [Tartiner Labs](https://github.com/tartinerlabs/skills) - Agent skills for git workflows, GitHub automation, security audits, code refactoring, and project tooling. - [Team Skills Platform](https://github.com/Colin4k1024/tsp) - Role-based team delivery framework — Tech Lead-orchestrated 8-role system with 195+ skills, 27 specialist agents, 80+ commands, hooks, and ECC harness for Claude Code, Codex, and OpenCode. - [Tool Advisor](https://github.com/dragon1086/claude-skills) - Read-only meta-skill that scans your MCP servers, skills, plugins, and CLI tools, then suggests up to three ranked approaches (Methodical / Fast / Deep) with a copy-paste Quick Action table. +- [Unity Agent Workflows](https://github.com/AUN-PN/unity-agent-workflows) - Codex plugin and skill for Unity 2D agents that enforces "No proof, no edit" workflows with runtime-owner proof, Teach structure maps, and validation gates. - [Universal Design Principles](https://github.com/HDeibler/universal-design-principles) - Cross-agent UX and product-design marketplace with a root Codex collection plugin, five focused plugin bundles, and 137 Agent Skills for design review, accessibility, layout, interaction, cognition, and product polish. - [VibePortrait](https://github.com/dadwadw233/VibePortrait) - Developer personality portrait generator — analyzes AI conversation history to produce MBTI type (16 color themes), capability radar, developer rating, 3-dimension famous match, and a persona skill that lets any AI "think like you". - [Writer's Loop](https://github.com/xxsang/writers-loop) - Structured AI writing workflow for planning, critique, revision, translation, style distillation, and opt-in local preference learning. From f337b574e69eeacf58dc39f60bf86cb6593a2fb3 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 19 May 2026 08:07:51 +0000 Subject: [PATCH 2/3] chore: sync marketplace artifacts with README --- .agents/plugins/marketplace.json | 6 +- plugins.json | 2 +- .../CALLE-AI/call-e-integrations/README.md | 4 +- .../call-e-integrations/skills/calle/SKILL.md | 2 +- .../skills/calle/references/commands.md | 16 +- .../.codex-plugin/plugin.json | 1 + .../assets/spec-driven-icon.svg | 14 + .../Kanevry/session-orchestrator/README.md | 20 +- .../skills/persona-panel/SKILL.md | 329 ++++++++++++++++++ .../skills/persona-panel/persona-format.md | 163 +++++++++ .../skills/wave-executor/wave-loop.md | 85 ++++- .../claude-skills/.codex-plugin/plugin.json | 1 + .../claude-skills/assets/icon.png | Bin 0 -> 128156 bytes .../skills-codex/.agentops-manifest.json | 50 ++- .../beads/.agentops-generated.json | 4 +- .../agentops/skills-codex/beads/SKILL.md | 30 +- .../discovery/.agentops-generated.json | 4 +- .../agentops/skills-codex/discovery/SKILL.md | 7 +- .../evolve/.agentops-generated.json | 4 +- .../agentops/skills-codex/evolve/SKILL.md | 25 +- .../plan/.agentops-generated.json | 4 +- .../agentops/skills-codex/plan/SKILL.md | 6 +- .../skills-codex/rpi/.agentops-generated.json | 4 +- .../boshu2/agentops/skills-codex/rpi/SKILL.md | 4 + .../shared/.agentops-generated.json | 4 +- .../shared/validation-contract.md | 25 ++ .../ship-loop/.agentops-generated.json | 7 + .../agentops/skills-codex/ship-loop/SKILL.md | 96 +++++ .../agentops/skills-codex/ship-loop/prompt.md | 35 ++ .../swarm/.agentops-generated.json | 2 +- .../using-agentops/.agentops-generated.json | 4 +- .../skills-codex/using-agentops/SKILL.md | 1 + .../validate/.agentops-generated.json | 4 +- .../agentops/skills-codex/validate/SKILL.md | 8 + .../validation/.agentops-generated.json | 4 +- .../agentops/skills-codex/validation/SKILL.md | 7 + .../ouonet/praxis/.codex-plugin/plugin.json | 2 +- plugins/ouonet/praxis/package.json | 2 +- plugins/ouonet/praxis/skills/triage/SKILL.md | 10 +- 39 files changed, 914 insertions(+), 82 deletions(-) create mode 100644 plugins/Habib0x0/spec-driven-plugin/assets/spec-driven-icon.svg create mode 100644 plugins/Kanevry/session-orchestrator/skills/persona-panel/SKILL.md create mode 100644 plugins/Kanevry/session-orchestrator/skills/persona-panel/persona-format.md create mode 100644 plugins/alirezarezvani/claude-skills/assets/icon.png create mode 100644 plugins/boshu2/agentops/skills-codex/ship-loop/.agentops-generated.json create mode 100644 plugins/boshu2/agentops/skills-codex/ship-loop/SKILL.md create mode 100644 plugins/boshu2/agentops/skills-codex/ship-loop/prompt.md diff --git a/.agents/plugins/marketplace.json b/.agents/plugins/marketplace.json index e1a072da..c7aedcc4 100644 --- a/.agents/plugins/marketplace.json +++ b/.agents/plugins/marketplace.json @@ -149,7 +149,8 @@ "authentication": "ON_INSTALL" }, "category": "Development & Workflow", - "description": "223 production-ready skills, 23 agents, and 298 Python tools across 9 domains — engineering, marketing, product, compliance, and more." + "description": "223 production-ready skills, 23 agents, and 298 Python tools across 9 domains — engineering, marketing, product, compliance, and more.", + "icon": "./plugins/alirezarezvani/claude-skills/assets/icon.png" }, { "name": "claude-octopus", @@ -412,7 +413,8 @@ "authentication": "ON_INSTALL" }, "category": "Development & Workflow", - "description": "Three-phase Requirements → Design → Tasks workflow for Claude Code and Codex — EARS notation acceptance criteria, autonomous execution loop, cross-spec dependencies, and post-implementation acceptance testing." + "description": "Three-phase Requirements → Design → Tasks workflow for Claude Code and Codex — EARS notation acceptance criteria, autonomous execution loop, cross-spec dependencies, and post-implementation acceptance testing.", + "icon": "./plugins/Habib0x0/spec-driven-plugin/assets/spec-driven-icon.svg" }, { "name": "stark", diff --git a/plugins.json b/plugins.json index 4c75463f..c72eeb82 100644 --- a/plugins.json +++ b/plugins.json @@ -2,7 +2,7 @@ "$schema": "https://json-schema.org/draft/2020-12/schema", "name": "awesome-codex-plugins", "version": "1.0.0", - "last_updated": "2026-05-18", + "last_updated": "2026-05-19", "total": 80, "categories": [ "Development & Workflow", diff --git a/plugins/CALLE-AI/call-e-integrations/README.md b/plugins/CALLE-AI/call-e-integrations/README.md index 1ee03ce0..ba957e77 100644 --- a/plugins/CALLE-AI/call-e-integrations/README.md +++ b/plugins/CALLE-AI/call-e-integrations/README.md @@ -45,12 +45,12 @@ Keep those paths exactly as shown so the marketplace entry can resolve ## Authentication The plugin uses the repository-local CLI when available, then a global `calle` -command when available, then falls back to `npx -y @call-e/cli@0.3.2`. +command when available, then falls back to `npx -y @call-e/cli@0.3.3`. To authenticate before using the plugin: ```bash -npx -y @call-e/cli@0.3.2 auth login +npx -y @call-e/cli@0.3.3 auth login ``` When `$calle` is invoked, the skill checks authorization first. If login is diff --git a/plugins/CALLE-AI/call-e-integrations/skills/calle/SKILL.md b/plugins/CALLE-AI/call-e-integrations/skills/calle/SKILL.md index 4c3b2428..6895e2a4 100644 --- a/plugins/CALLE-AI/call-e-integrations/skills/calle/SKILL.md +++ b/plugins/CALLE-AI/call-e-integrations/skills/calle/SKILL.md @@ -77,7 +77,7 @@ env CALLE_SOURCE=codex CALLE_INTEGRATION=codex_plugin CALLE_INTEGRATION_VERSION= If neither command works, use the pinned npm package through `npx`: ```bash -env CALLE_SOURCE=codex CALLE_INTEGRATION=codex_plugin CALLE_INTEGRATION_VERSION=0.1.9 npx -y @call-e/cli@0.3.2 +env CALLE_SOURCE=codex CALLE_INTEGRATION=codex_plugin CALLE_INTEGRATION_VERSION=0.1.9 npx -y @call-e/cli@0.3.3 ``` Only tell the user to install the CLI globally if `npx` is unavailable, diff --git a/plugins/CALLE-AI/call-e-integrations/skills/calle/references/commands.md b/plugins/CALLE-AI/call-e-integrations/skills/calle/references/commands.md index c719d08b..897a4f86 100644 --- a/plugins/CALLE-AI/call-e-integrations/skills/calle/references/commands.md +++ b/plugins/CALLE-AI/call-e-integrations/skills/calle/references/commands.md @@ -17,7 +17,7 @@ env CALLE_SOURCE=codex CALLE_INTEGRATION=codex_plugin CALLE_INTEGRATION_VERSION= npx fallback base command: ```bash -env CALLE_SOURCE=codex CALLE_INTEGRATION=codex_plugin CALLE_INTEGRATION_VERSION=0.1.9 npx -y @call-e/cli@0.3.2 +env CALLE_SOURCE=codex CALLE_INTEGRATION=codex_plugin CALLE_INTEGRATION_VERSION=0.1.9 npx -y @call-e/cli@0.3.3 ``` ## Setup and readiness @@ -37,10 +37,10 @@ env CALLE_SOURCE=codex CALLE_INTEGRATION=codex_plugin CALLE_INTEGRATION_VERSION= ``` ```bash -env CALLE_SOURCE=codex CALLE_INTEGRATION=codex_plugin CALLE_INTEGRATION_VERSION=0.1.9 npx -y @call-e/cli@0.3.2 --help -env CALLE_SOURCE=codex CALLE_INTEGRATION=codex_plugin CALLE_INTEGRATION_VERSION=0.1.9 npx -y @call-e/cli@0.3.2 auth status -env CALLE_SOURCE=codex CALLE_INTEGRATION=codex_plugin CALLE_INTEGRATION_VERSION=0.1.9 npx -y @call-e/cli@0.3.2 auth login -env CALLE_SOURCE=codex CALLE_INTEGRATION=codex_plugin CALLE_INTEGRATION_VERSION=0.1.9 npx -y @call-e/cli@0.3.2 mcp tools +env CALLE_SOURCE=codex CALLE_INTEGRATION=codex_plugin CALLE_INTEGRATION_VERSION=0.1.9 npx -y @call-e/cli@0.3.3 --help +env CALLE_SOURCE=codex CALLE_INTEGRATION=codex_plugin CALLE_INTEGRATION_VERSION=0.1.9 npx -y @call-e/cli@0.3.3 auth status +env CALLE_SOURCE=codex CALLE_INTEGRATION=codex_plugin CALLE_INTEGRATION_VERSION=0.1.9 npx -y @call-e/cli@0.3.3 auth login +env CALLE_SOURCE=codex CALLE_INTEGRATION=codex_plugin CALLE_INTEGRATION_VERSION=0.1.9 npx -y @call-e/cli@0.3.3 mcp tools ``` Rules: @@ -103,7 +103,7 @@ I'll keep you updated on the phone status, call content, and summary. ```bash env CALLE_SOURCE=codex CALLE_INTEGRATION=codex_plugin CALLE_INTEGRATION_VERSION=0.1.9 node packages/cli/bin/calle.js call plan --to-phone +15551234567 --goal "Confirm the appointment" env CALLE_SOURCE=codex CALLE_INTEGRATION=codex_plugin CALLE_INTEGRATION_VERSION=0.1.9 calle call plan --to-phone +15551234567 --goal "Confirm the appointment" -env CALLE_SOURCE=codex CALLE_INTEGRATION=codex_plugin CALLE_INTEGRATION_VERSION=0.1.9 npx -y @call-e/cli@0.3.2 call plan --to-phone +15551234567 --goal "Confirm the appointment" +env CALLE_SOURCE=codex CALLE_INTEGRATION=codex_plugin CALLE_INTEGRATION_VERSION=0.1.9 npx -y @call-e/cli@0.3.3 call plan --to-phone +15551234567 --goal "Confirm the appointment" ``` Supported `call plan` options: @@ -131,7 +131,7 @@ env CALLE_SOURCE=codex CALLE_INTEGRATION=codex_plugin CALLE_INTEGRATION_VERSION= ```bash env CALLE_SOURCE=codex CALLE_INTEGRATION=codex_plugin CALLE_INTEGRATION_VERSION=0.1.9 node packages/cli/bin/calle.js call run --plan-id --confirm-token env CALLE_SOURCE=codex CALLE_INTEGRATION=codex_plugin CALLE_INTEGRATION_VERSION=0.1.9 calle call run --plan-id --confirm-token -env CALLE_SOURCE=codex CALLE_INTEGRATION=codex_plugin CALLE_INTEGRATION_VERSION=0.1.9 npx -y @call-e/cli@0.3.2 call run --plan-id --confirm-token +env CALLE_SOURCE=codex CALLE_INTEGRATION=codex_plugin CALLE_INTEGRATION_VERSION=0.1.9 npx -y @call-e/cli@0.3.3 call run --plan-id --confirm-token ``` Supported `call run` options: @@ -155,7 +155,7 @@ returned or the user asks you to stop. ```bash env CALLE_SOURCE=codex CALLE_INTEGRATION=codex_plugin CALLE_INTEGRATION_VERSION=0.1.9 node packages/cli/bin/calle.js call status --run-id env CALLE_SOURCE=codex CALLE_INTEGRATION=codex_plugin CALLE_INTEGRATION_VERSION=0.1.9 calle call status --run-id -env CALLE_SOURCE=codex CALLE_INTEGRATION=codex_plugin CALLE_INTEGRATION_VERSION=0.1.9 npx -y @call-e/cli@0.3.2 call status --run-id +env CALLE_SOURCE=codex CALLE_INTEGRATION=codex_plugin CALLE_INTEGRATION_VERSION=0.1.9 npx -y @call-e/cli@0.3.3 call status --run-id ``` Supported `call status` options: diff --git a/plugins/Habib0x0/spec-driven-plugin/.codex-plugin/plugin.json b/plugins/Habib0x0/spec-driven-plugin/.codex-plugin/plugin.json index 417fbb59..99df1053 100644 --- a/plugins/Habib0x0/spec-driven-plugin/.codex-plugin/plugin.json +++ b/plugins/Habib0x0/spec-driven-plugin/.codex-plugin/plugin.json @@ -13,6 +13,7 @@ "skills": "./skills/", "interface": { "displayName": "Spec Driven", + "composerIcon": "./assets/spec-driven-icon.svg", "shortDescription": "Turn feature ideas into requirements, design docs, tasks, and execution loops.", "longDescription": "A structured spec-driven development workflow for Codex. It guides features through brainstorming, EARS requirements, technical design, task breakdown, validation, execution, and post-completion review.", "developerName": "habib0x", diff --git a/plugins/Habib0x0/spec-driven-plugin/assets/spec-driven-icon.svg b/plugins/Habib0x0/spec-driven-plugin/assets/spec-driven-icon.svg new file mode 100644 index 00000000..ba0762b8 --- /dev/null +++ b/plugins/Habib0x0/spec-driven-plugin/assets/spec-driven-icon.svg @@ -0,0 +1,14 @@ + + Spec Driven + A teal document icon with structured checklist lines and a connected workflow mark. + + + + + + + + + + + diff --git a/plugins/Kanevry/session-orchestrator/README.md b/plugins/Kanevry/session-orchestrator/README.md index 5520e9a7..882ec371 100644 --- a/plugins/Kanevry/session-orchestrator/README.md +++ b/plugins/Kanevry/session-orchestrator/README.md @@ -11,8 +11,8 @@ Turn ad-hoc Claude Code sessions into a repeatable loop with verification gates. ## What you get -- **36 skills** for the session lifecycle (start, plan, execute, close, evolve), discovery, vault sync, MCP authoring, debugging, brainstorming, and more -- **16 slash commands** (`/session`, `/go`, `/close`, `/discovery`, `/plan`, `/evolve`, `/autopilot`, `/test`, …) +- **37 skills** for the session lifecycle (start, plan, execute, close, evolve), discovery, vault sync, MCP authoring, debugging, brainstorming, and more +- **17 slash commands** (`/session`, `/go`, `/close`, `/discovery`, `/plan`, `/evolve`, `/autopilot`, `/test`, …) - **11 typed sub-agents** (code-implementer, test-writer, security-reviewer, session-reviewer, qa-strategist, architect-reviewer, …) - **11 hook event handlers** enforcing scope, blocking destructive commands, capturing telemetry - **5812 vitest tests** passing on every commit, validate-plugin 94/94, typecheck 187 files OK, lint 0 @@ -175,8 +175,8 @@ Full table and follow-ups in `CLAUDE.md` (or `AGENTS.md` on Codex CLI) and CHANG ```mermaid flowchart LR USER([Operator]) -->|invokes /session| COORD[Coordinator] - COORD -->|reads| SK[Skills
36 user-facing] - COORD -->|invokes| CMD[Commands
16 slash-cmds] + COORD -->|reads| SK[Skills
37 user-facing] + COORD -->|invokes| CMD[Commands
17 slash-cmds] COORD -->|dispatches| AG[Agents
11 typed sub-agents] AG -.->|parallel waves| W1[code-implementer] AG -.-> W2[test-writer] @@ -188,9 +188,9 @@ flowchart LR ## Components -**Skills (36 user-facing).** Lifecycle: `session-start`, `session-plan`, `wave-executor`, `session-end`, `quality-gates`, `using-orchestrator`. Authoring: `skill-creator`, `mcp-builder`, `hook-development`, `frontmatter-guard`. Planning & discovery: `plan`, `discovery`, `repo-audit`, `brainstorm`, `write-executable-plan`, `debug`, `claude-md-drift-check`. Architecture: `architecture`, `domain-model`, `ubiquitous-language`. Cross-session: `evolve`, `convergence-monitoring`, `memory-cleanup`. Vault & docs: `vault-sync`, `vault-mirror`, `daily`, `docs-orchestrator`. Ecosystem: `bootstrap`, `gitlab-ops`, `gitlab-portfolio`, `ecosystem-health`, `mode-selector`, `autopilot`. Testing: `test-runner`, `playwright-driver`, `peekaboo-driver`. +**Skills (37 user-facing).** Lifecycle: `session-start`, `session-plan`, `wave-executor`, `session-end`, `quality-gates`, `using-orchestrator`. Authoring: `skill-creator`, `mcp-builder`, `hook-development`, `frontmatter-guard`. Planning & discovery: `plan`, `discovery`, `repo-audit`, `brainstorm`, `write-executable-plan`, `debug`, `claude-md-drift-check`. Architecture: `architecture`, `domain-model`, `ubiquitous-language`. Cross-session: `evolve`, `convergence-monitoring`, `memory-cleanup`. Vault & docs: `vault-sync`, `vault-mirror`, `daily`, `docs-orchestrator`. Ecosystem: `bootstrap`, `gitlab-ops`, `gitlab-portfolio`, `ecosystem-health`, `mode-selector`, `autopilot`. Testing: `test-runner`, `playwright-driver`, `peekaboo-driver`. Content review: `persona-panel`. -**Commands (16).** `/session`, `/go`, `/close`, `/discovery`, `/plan`, `/evolve`, `/bootstrap`, `/harness-audit`, `/autopilot`, `/autopilot-multi`, `/repo-audit`, `/test`, `/memory-cleanup`, `/portfolio`, `/brainstorm`, `/debug`. +**Commands (17).** `/session`, `/go`, `/close`, `/discovery`, `/plan`, `/evolve`, `/bootstrap`, `/harness-audit`, `/autopilot`, `/autopilot-multi`, `/repo-audit`, `/test`, `/memory-cleanup`, `/portfolio`, `/brainstorm`, `/debug`, `/persona-panel`. **Agents (11).** `code-implementer`, `test-writer`, `ui-developer`, `db-specialist`, `security-reviewer`, `session-reviewer`, `docs-writer`, `architect-reviewer`, `qa-strategist`, `analyst`, `ux-evaluator`. @@ -202,7 +202,11 @@ flowchart LR **Codex.** `.codex-plugin/plugin.json` (manifest), compatibility config, 3 agent role definitions, marketplace `composerIcon`. -**Scripts.** Deterministic CLI tools (parse-config, run-quality-gate, validate-wave-scope, validate-plugin, token-audit, autopilot, autopilot-multi) plus shared lib (`scripts/lib/*.mjs`) plus a vitest suite of 5632 tests. +**Scripts.** Deterministic CLI tools (parse-config, run-quality-gate, validate-wave-scope, validate-plugin, token-audit, autopilot, autopilot-multi) plus shared lib (`scripts/lib/*.mjs`) plus a vitest suite of 5900+ tests. + +### `/harness-audit` — Anthropic large-codebase rubric + +`scripts/harness-audit.mjs` runs **8 deterministic categories / 33 checks** (rubric `2026-06`) over a repo and emits `.orchestrator/metrics/audit.jsonl`. Category 8 ("Large-Codebase Readiness") operationalises Anthropic's [Claude Code large-codebase best-practices](https://claude.com/blog/how-claude-code-works-in-large-codebases-best-practices-and-where-to-start) checklist — layered `CLAUDE.md` (or `AGENTS.md` on Codex CLI), codebase-map presence, LSP/code-intelligence wiring, scoped test/lint commands, `permissions.deny`, and root-file structural leanness — as scored signals you can run on yourself and on consumer repos. The checks are intentionally orthogonal to repo-audit's baseline-compliance pass/fail (`skills/repo-audit/SKILL.md`); both surfaces ship. ## Comparison @@ -240,7 +244,7 @@ We see the two plugins as complementary rather than competing: session-orchestra | Feature | Claude Code | Codex CLI | Cursor IDE | |---------|------------|-----------|------------| | OS | macOS, Linux, **Windows (native)** | macOS, Linux, **Windows (native)** | macOS, Linux, **Windows (native)** | -| All 16 commands | Native slash commands | Native plugin commands | Rules-based (.mdc) | +| All 17 commands | Native slash commands | Native plugin commands | Rules-based (.mdc) | | Parallel agents | Agent tool | Multi-agent roles | Sequential only | | Session persistence | `.claude/STATE.md` | `.codex/STATE.md` | `.cursor/STATE.md` | | Shared knowledge | `.orchestrator/metrics/` | `.orchestrator/metrics/` | `.orchestrator/metrics/` | diff --git a/plugins/Kanevry/session-orchestrator/skills/persona-panel/SKILL.md b/plugins/Kanevry/session-orchestrator/skills/persona-panel/SKILL.md new file mode 100644 index 00000000..8bb2759a --- /dev/null +++ b/plugins/Kanevry/session-orchestrator/skills/persona-panel/SKILL.md @@ -0,0 +1,329 @@ +--- +name: persona-panel +user-invocable: true +tags: [review, personas, content, quality, multi-agent] +model: inherit +description: > + Use this skill when you need multi-persona parallel content review — domain experts, buyer + personas, compliance reviewers, or custom catalog entries reviewing a target file or output. + Dispatches N persona agents in parallel, consolidates verdicts via a configurable mode + (voting-quorum, hard-gate-threshold, or coordinator-summary), and writes a timestamped sidecar + to .orchestrator/persona-panel/. Invoked via /persona-panel . +--- + +# Persona Panel Skill + +## Overview + +Persona Panel runs any number of catalog-defined personas in parallel against a single target +(file, document, or output range). Each persona agent produces a structured verdict. The +coordinator consolidates the verdicts into a final result using one of three configurable modes +and persists a sidecar record for audit and trend-tracking. + +The catalog lives in `.claude/personas/*.md` — per-repo, never plugin-central. This is +intentional: climate-research repos need physicists; SaaS repos need buyer personas; +compliance repos need auditors. Plugin-central catalogs block that diversity. + +## Phase 0: Bootstrap Gate + +Read `skills/_shared/bootstrap-gate.md` and execute the gate check. If the gate is CLOSED, +invoke `skills/bootstrap/SKILL.md` and wait for completion before proceeding. If the gate is +OPEN, continue to Phase 1. + + +Do NOT proceed past Phase 0 if GATE_CLOSED. There is no bypass. Refer to +`skills/_shared/bootstrap-gate.md` for the full HARD-GATE constraints. + + +## Phase 1: Catalog Discovery + +Load the per-repo persona catalog via `loadCatalog()` from +`scripts/lib/persona-panel/catalog-loader.mjs`. + +**Failure modes — all are hard stops:** + +**(a) `.claude/personas/` directory missing:** +``` +Error (exit 2): .claude/personas/ directory not found in this repo. +Create persona files there to use /persona-panel. +See templates/personas/ for starter templates (issue #458). +``` + +**(b) `.claude/personas/` present but empty (no `.md` files):** +``` +Error (exit 2): .claude/personas/ exists but contains no persona files (*.md). +Add at least one persona file to use /persona-panel. +See templates/personas/ for starter templates (issue #458). +``` + +**(c) `--personas ` arg specified but `name` not found in catalog:** +``` +Error (exit 1): Persona "" not found in .claude/personas/. +Available personas: . +``` + +**(d) Malformed YAML frontmatter in a catalog file:** +``` +Error (exit 1): Malformed YAML in .claude/personas/.md at line : . +Fix the frontmatter before running /persona-panel. +``` + +**Model validation (H2 security guard):** The catalog loader validates each persona's `model:` +field against `MODEL_ID_RE` + `ALLOWED_MODEL_ALIASES` from `scripts/lib/agent-frontmatter.mjs` +at load time. A persona with an invalid model string triggers failure mode (d) with an +informative message: "invalid model '' — must be a Claude model ID or alias +(inherit|sonnet|opus|haiku)". + +**`output_contract` structural pre-check (H3 security guard):** After YAML parse and before +AJV compile, the loader inspects each persona's `output_contract` object for forbidden keys: +`$ref`, `$defs`, `allOf`, `anyOf`. Any occurrence triggers failure mode (d). This structural +pre-check runs BEFORE `ajv.compile()`. The AJV compile call wraps in a 2-second AbortSignal +timeout to guard against pathological schema inputs. + +After successful load, emit a one-line status banner: +``` +Catalog: [N] personas loaded from .claude/personas/. Tier breakdown: domain-expert [N], buyer-persona [N], compliance [N], custom [N]. +``` + +If `--personas ` was passed, filter to the named subset. Report the active set. + +## Phase 2: Target-Input-Resolution + +Resolve the `` argument against the project root. + +1. Expand to absolute path (relative inputs are resolved from `git rev-parse --show-toplevel`). +2. Call `validatePathInsideProject(absolutePath, projectRoot)` from + `scripts/lib/path-utils.mjs`. This function performs a two-phase lexical + realpath guard. + - If the path resolves outside the project root: exit 1 with message + "Target path escapes project root — /persona-panel only reviews files inside the repo." +3. Confirm the file exists and is readable. If not: exit 1 with "Target file not found: ". +4. If a range was specified (`--lines -`), validate that start ≤ end and both are + positive integers. + +Store the resolved absolute path as `$TARGET`. + +## Phase 3: Parallel Dispatch + +Dispatch one Agent per persona from the active catalog set. + +**Model selection per persona:** +- If `persona.model` is a full Claude model ID (`MODEL_ID_RE`): use it as-is. +- If `persona.model` is `opus` or unset AND `persona.tier == 'domain-expert'`: override to + `claude-opus-4-7` (empirically validated — Opus finds real problems Sonnet misses; see vault + learning `[[persona-opus-finds-real-failing-cibadge]]`). +- Otherwise: use the persona's declared model alias. + +**Agent dispatch contract:** +``` +Agent({ + subagent_type: "general-purpose", + model: , + prompt: , + tools: ["Read", "Grep", "Glob"] +}) +``` + +Use `buildPersonaPrompt(persona, target)` from `scripts/lib/persona-panel/persona-runner.mjs` +to compose the prompt. The runner wraps `evaluation_criteria` entries in +`...` delimiters (security M1: persona body is treated as +data, not free-form instructions; see `persona-format.md` for the full rationale). + +**Concurrency cap (security M2):** Maximum 20 personas per panel run. If the active set exceeds +20, emit a warning and truncate to the first 20 alphabetically: +``` +Warning: Persona set truncated to 20 (cap). Omitted: . +``` + +**run_in_background:** `false` for all agents. Do not proceed to Phase 4 until ALL agents +complete. + +**Dispatch summary line (before dispatch):** +``` +Dispatching [N] persona agents in parallel. Target: <$TARGET>. Mode: . +``` + +## Phase 4: Konsolidierung (Consolidation) + +After all agents complete, run consolidation via `scripts/lib/persona-panel/consolidator.mjs`. + +**Three consolidation modes** (set by `--mode` arg, default: `voting-quorum`): + +### `voting-quorum` (default) + +Deterministic M-of-N threshold. Default M = ceil(N / 2) + 1 (simple majority). Override with +`--quorum `. + +- Count personas whose `verdict == "pass"`. +- If pass-count >= M: final-verdict = `"pass"`. +- If pass-count < M: final-verdict = `"fail"`. +- Tie: impossible when M > N/2. If M == ceil(N/2) exactly and count == M - 1: final-verdict = + `"fail"` (ties go to FAIL). + +### `hard-gate-threshold` + +Strict M-of-N where default M == N (unanimity). Override with `--threshold `. + +- If ALL N personas pass: final-verdict = `"pass"`. +- If any persona returns `"fail"`: final-verdict = `"fail"`. +- If any persona returns `"warn"` and no failures: final-verdict = `"warn"`. +- Tie-break: ties go to FAIL. + +### `coordinator-summary` + +LLM aggregate via coordinator. The coordinator reads all persona outputs and produces a +synthesized summary verdict. + +**WARN (required — emit to BOTH stderr AND sidecar `consolidation.aggregator_warning`):** +``` +Warning: coordinator-summary mode triggers an additional LLM call (the coordinator aggregation +step). This incurs extra token cost. Use voting-quorum or hard-gate-threshold for deterministic, +zero-extra-LLM-call consolidation. +``` + +For each persona output, parse the structured block (see `persona-format.md` Output Contract). +Validate that `verdict ∈ {"pass", "fail", "warn"}` — if a persona output lacks a valid verdict, +treat it as `"fail"` and record it in `dissenting_personas` with reason `"missing-verdict"`. + +Emit a consolidation summary: +``` +Consolidation ([mode]): [pass-count] pass / [fail-count] fail / [warn-count] warn — Final: +Dissenting: (if any) +``` + +## Phase 5: Sidecar-Persist + Report + +Write the sidecar record and emit the final report. + +### Sidecar Persistence + +**Run ID generation (H1 security guard):** +```js +const runId = randomUUID().slice(0, 8); // format: [a-z0-9-]{8} +``` +Validate: `runId` MUST match `/^[a-z0-9-]{1,64}$/`. Reject and regenerate if it does not. + +**Timestamp format for filename:** `^\d{4}-\d{2}-\d{2}T\d{2}-\d{2}-\d{2}(\.\d+)?Z?$` +(filename-safe ISO — colons replaced with hyphens). + +Example: `2026-05-20T14-30-00Z-a1b2c3d4.json` + +**Path:** `.orchestrator/persona-panel/-.json` + +Validate the sidecar target path with `validatePathInsideProject(sidecarAbsPath, projectRoot)` +(H1 path guard) before writing. + +**Schema validation (security M3 — validate BEFORE write):** +Validate the sidecar object against `agents/schemas/persona-panel-sidecar.schema.json` using +`validateAgentOutput()` from `scripts/lib/agent-output-schema.mjs` (AJV 2020-12). If +validation fails: print the AJV errors to stderr and exit 1 — never write an invalid sidecar. + +**Write via `writeJsonAtomic()` from `scripts/lib/io.mjs`** (atomic tmp-then-rename to prevent +partial writes). + +**Sidecar schema shape** (matched by `agents/schemas/persona-panel-sidecar.schema.json`): + +```json +{ + "run_id": "", + "target": "", + "personas_invoked": [ + { + "name": "", + "version": "", + "model": "", + "prompt_hash": "", + "timestamp_start": "", + "timestamp_end": "", + "token_usage": { + "input": "", + "output": "", + "cache_read": "", + "cache_creation": "" + } + } + ], + "outputs": [ + { + "persona_name": "", + "verdict": "", + "rationale": "", + "recommendations": [""] + } + ], + "consolidation": { + "mode": "", + "final_verdict": "", + "pass_count": "", + "fail_count": "", + "warn_count": "", + "dissenting_personas": [""], + "audit_reason": "", + "aggregator_warning": "" + } +} +``` + +**Token-usage contract (H4):** Each `personas_invoked` entry records `token_usage` from the +Anthropic API response: `{ input, output, cache_read, cache_creation }`. Agents that do not +return usage data record all fields as `0`. + +### Final Report + +Emit to stdout: + +``` +## Persona Panel Report + +Target: <$TARGET> +Personas: invoked | Mode: +Final verdict: + +| Persona | Tier | Verdict | Rationale (excerpt) | +|---------|------|---------|---------------------| +| | ... | pass | ... | +| | ... | fail | ... | + +Dissenting: +Sidecar: .orchestrator/persona-panel/.json +``` + +If `final_verdict == "fail"`: exit with code 1 so CI and wave-executor hooks can gate on the +result. If `final_verdict == "warn"`: exit 0 with a warning line on stderr. If +`final_verdict == "pass"`: exit 0. + +## Critical Rules + +- **NEVER** dispatch more than 20 personas per panel (security M2 cap). +- **NEVER** write a sidecar that fails schema validation — validate BEFORE write (security M3). +- **NEVER** skip `validatePathInsideProject` for the target path OR the sidecar output path (H1). +- **NEVER** use `run_in_background: true` for persona agents — lose coordination ability. +- **ALWAYS** validate `model:` fields from the catalog against `MODEL_ID_RE` + aliases (H2). +- **ALWAYS** run `output_contract` structural pre-check before `ajv.compile()` (H3). +- **ALWAYS** emit the `aggregator_warning` to BOTH stderr and sidecar when using + `coordinator-summary` mode. +- **ALWAYS** treat missing persona verdict as `"fail"` — never silently skip or default to pass. +- Ties in consolidation go to FAIL, not pass or warn. + +## Anti-Patterns + +- Running without a catalog — Phase 1 must gate on catalog existence. +- Using a single persona as a "quick check" — dispatch all catalog members unless `--personas` + restricts deliberately. The value is the N-dimensional view. +- Ignoring dissenting personas in `voting-quorum` — record them in the sidecar even when the + majority passes. They are the signal for trend-tracking (#459). +- Writing the sidecar before schema validation passes — invalid sidecars corrupt trend analysis. +- Calling `ajv.compile()` without the AbortSignal timeout — pathological schemas can block the + event loop indefinitely. + +## See Also + +- `commands/persona-panel.md` — argument parsing and CLI contract +- `agents/schemas/persona-panel-sidecar.schema.json` — sidecar JSON Schema (Draft 2020-12) +- `scripts/lib/persona-panel/catalog-loader.mjs` — loadCatalog() implementation +- `scripts/lib/persona-panel/persona-runner.mjs` — buildPersonaPrompt() implementation +- `scripts/lib/persona-panel/consolidator.mjs` — consolidation logic (3 modes) +- `skills/persona-panel/persona-format.md` — persona file format specification +- `skills/wave-executor/wave-loop.md` — Persona-Gate hook (Phase 5b/3b, added in #458) +- `scripts/lib/path-utils.mjs` — validatePathInsideProject() +- `scripts/lib/io.mjs` — writeJsonAtomic() +- `scripts/lib/agent-frontmatter.mjs` — MODEL_ID_RE, ALLOWED_MODEL_ALIASES diff --git a/plugins/Kanevry/session-orchestrator/skills/persona-panel/persona-format.md b/plugins/Kanevry/session-orchestrator/skills/persona-panel/persona-format.md new file mode 100644 index 00000000..3dbaada7 --- /dev/null +++ b/plugins/Kanevry/session-orchestrator/skills/persona-panel/persona-format.md @@ -0,0 +1,163 @@ +# Persona File Format + +> Specification for persona catalog files used by `skills/persona-panel/SKILL.md`. +> Catalog location: `.claude/personas/*.md` (per-repo, never plugin-central). + +## File Layout + +Each persona is a single Markdown file with YAML frontmatter followed by a structured body. +Files live at `.claude/personas/.md` where `` matches the frontmatter `name:` field. + +``` +.claude/personas/ + ai-expert.md + buyer-persona-early-adopter.md + compliance-reviewer.md +``` + +--- + +## YAML Frontmatter (Required Fields) + +All six fields below are REQUIRED. Files missing any field are rejected at catalog load time +(Phase 1 failure mode d). + +```yaml +--- +name: ai-expert +schema_version: 1 +version: 2 +role: "AI/ML domain expert — evaluates technical accuracy and implementation quality" +model: claude-opus-4-7 +tier: domain-expert +output_contract: + type: object + required: [verdict, rationale] + properties: + verdict: + type: string + enum: [pass, fail, warn] + rationale: + type: string + maxLength: 4096 + recommendations: + type: array + items: + type: string +evaluation_criteria: + - "Technical claims are accurate and grounded in current research" + - "Implementation suggestions are actionable and correctly scoped" + - "No hallucinated API names, library versions, or model capabilities" +--- +``` + +### Field Specifications + +| Field | Type | Constraint | +|-------|------|-----------| +| `name` | string | Matches filename stem. Pattern: `^[a-z0-9-]{1,64}$`. Unique in catalog. | +| `schema_version` | integer | Must be `1`. | +| `version` | integer | Persona content version. Increment on any output-affecting change. Used in sidecar + trend-tracking (#459). | +| `role` | string | Identity statement. Injected verbatim as prompt opener. Keep under 200 chars. | +| `model` | string | Full model ID (`MODEL_ID_RE`) or alias (`inherit|sonnet|opus|haiku`). Validated at load time. Recommend `claude-opus-4-7` for `domain-expert` and `compliance` tiers (Opus finds real issues Sonnet misses — vault learning `[[persona-opus-finds-real-failing-cibadge]]`). | +| `output_contract` | object | Inline JSON Schema Draft 2020-12. `$ref/$defs/allOf/anyOf` FORBIDDEN (H3). Must require `verdict` + `rationale`. AJV compile wrapped in 2s AbortSignal timeout. | +| `evaluation_criteria` | array | Non-empty. Each string max 512 chars. Injected wrapped in `` delimiters (M1). Write as statements, not questions. | +| `tier` | enum | `domain-expert` \| `buyer-persona` \| `auditor` \| `compliance` \| `reviewer` \| `custom`. Affects model selection (Phase 3). | + +--- + +## Markdown Body + +The body contains four sections, in order. All headings are required even when a section has no +content (write "None." for empty Context Files). + +**`## Mission`** — One to three sentences. The persona's identity and review goal. Injected as +the agent's opening system context: "You are [role]. [Mission]." + +**`## Context Files`** — Optional vault refs (`[[path/to/note]]`) or project paths that the +agent reads as supplementary background before evaluating the target. Vault refs are allowed. + +**`## Evaluation Criteria`** — Expanded prose descriptions of the frontmatter criteria. Each +criterion should specify: what to look for, what a pass looks like, what a fail looks like. + +**`## Output Template`** — The exact JSON block the persona agent must return. Must match the +`output_contract`. Minimum shape: + +```json +{ + "verdict": "pass|fail|warn", + "rationale": "Detailed rationale (max 4096 chars).", + "recommendations": [] +} +``` + +--- + +## Verdict Contract + +Every persona output MUST include `verdict ∈ {"pass", "fail", "warn"}`. This is the only +required output field. The `output_contract` in the frontmatter MUST declare it as required. + +| Verdict | Meaning | +|---------|---------| +| `pass` | Persona approves the target. No blocking issues found. | +| `fail` | Persona rejects the target. One or more blocking issues found. | +| `warn` | Persona has concerns but does not block. Attention warranted. | + +A persona output that lacks a valid `verdict` field is treated as `"fail"` by the consolidator +in all three consolidation modes. This is a deliberate safety default — missing verdicts +indicate a malformed or incomplete response. + +--- + +## Security Contract: Criteria Delimiters (Security M1) + +The `evaluation_criteria` entries are injected into the persona prompt wrapped in +`...` XML delimiters: + +``` + +Technical claims are accurate and grounded in current research +Implementation suggestions are actionable and correctly scoped +No hallucinated API names, library versions, or model capabilities + +``` + +**Rationale:** The persona body is "data, not instructions." Humans authoring personas should +be aware that the body content is interpolated into a prompt that is then sent to an LLM agent. +Without delimiters, a malicious or careless persona body could inject instructions into the +agent's context. The delimiters create a clear boundary between orchestrator-controlled prompt +structure and human-authored persona content. The `buildPersonaPrompt()` function in +`scripts/lib/persona-panel/persona-runner.mjs` enforces this wrapping — it cannot be bypassed +by persona file content. + +--- + +## Prompt Hash and Determinism Contract + +To support trend-tracking (#459) and audit trails, each sidecar entry records a `prompt_hash` +— a sha256 over the canonicalized persona inputs. This allows detecting when a change in +persona content or model causes output drift across runs. + +**Canonicalization algorithm** (must be reproduced identically by `persona-runner.mjs`): + +1. Take the persona's YAML frontmatter as a JavaScript object (already parsed). +2. Sort all top-level keys alphabetically. +3. Serialize to JSON: `JSON.stringify(sortedFrontmatter)`. +4. Normalize the Markdown body: replace all `\r\n` with `\n` (LF normalization). +5. Concatenate: `jsonString + "\n" + normalizedBody + "\n" + persona.model`. +6. Compute sha256 hex digest of the UTF-8 encoded concatenated string. + +The hash changes when ANY of these change: frontmatter field values (including `version`), +Markdown body content, or the `model` field. This means a version bump without body changes +WILL change the hash, which is correct — version bumps signal intentional persona evolution. + +--- + +## See Also + +- `skills/persona-panel/SKILL.md` — full 6-phase execution flow +- `scripts/lib/persona-panel/catalog-loader.mjs` — loadCatalog() and validation logic +- `scripts/lib/persona-panel/persona-runner.mjs` — buildPersonaPrompt() and prompt hash +- `agents/schemas/persona-panel-sidecar.schema.json` — sidecar JSON Schema +- `scripts/lib/agent-frontmatter.mjs` — MODEL_ID_RE, ALLOWED_MODEL_ALIASES diff --git a/plugins/Kanevry/session-orchestrator/skills/wave-executor/wave-loop.md b/plugins/Kanevry/session-orchestrator/skills/wave-executor/wave-loop.md index 9443ff36..5373418f 100644 --- a/plugins/Kanevry/session-orchestrator/skills/wave-executor/wave-loop.md +++ b/plugins/Kanevry/session-orchestrator/skills/wave-executor/wave-loop.md @@ -361,8 +361,13 @@ After ALL agents in the wave complete: - **`mode: 'validated', ok: false`** — schema violation. Annotate the agent record with `schema_violation: true` and `schema_errors: [...]`. Then: - Under `enforce: warn` (default): log the violation in the wave progress update and continue. The wave is NOT blocked. - Under `enforce: strict`: surface the violation as a wave-blocking finding. Halt further agent processing and report to the coordinator before proceeding to the conflict check. - - Under `enforce: off`: skip violation recording entirely (schema_status is still set when ok=true). - - **`mode: 'parse-error'`** — the agent's output had no fenced ```json block or malformed JSON. Log a warning (backward-compat — agents that predate the schema contract routinely omit a JSON block). Do NOT block the wave. + - Under `enforce: off`: record the violation in `subagents.jsonl` for diagnostics (`schema_violation: true`, `schema_errors: [...]` are set on the agent record) but do NOT emit a log line in the wave progress update and do NOT block the wave. This is identical to `warn` minus the in-wave noise — forensic data is preserved; operator output is silenced. + - **`mode: 'parse-error'`** — two distinct diagnostic sub-cases collapsed into one mode for backward-compat; either: + - **parse-error (no-block)**: agent output contains no fenced ```json block at all. Common backward-compat case for agents that predate the schema contract. + - **parse-error (bad-json)**: a fenced ```json block exists but the block fails `JSON.parse`. Indicates an agent-side serialisation bug — more interesting than no-block from a diagnostic standpoint, and the operator may want to follow up. + + Both sub-cases share the same recovery: log a warning in the wave progress update, set `schema_status: 'parse-error'` on the agent record in `subagents.jsonl`, and do NOT block the wave (#474 LOW-8 distinguishes the two so future tooling can route diagnostics differently per sub-case). + - **`mode: 'schema-error'`** — the fenced ```json block parses cleanly but the parsed object fails AJV validation against the agent's declared `output-schema:`. This is a stronger signal than `parse-error`: the agent emitted JSON, but the shape diverged from its declared contract. Treat the same way as `validated, ok: false` under the configured `enforce` level (`warn` / `strict` / `off`) so the violation is recorded with `schema_violation: true` and `schema_errors: [...]`. Note: the legacy `validateAgentOutput()` returns `'validated', ok: false` for this case today — `schema-error` is the spec-level name (per #474 LOW-8) for the same condition, kept distinct from `parse-error` so the diagnostic log can route differently. - **`mode: 'unvalidated'`** — the agent has no declared `output-schema:` frontmatter. Silent skip (backward-compat path; as of #449 all 11 plugin agents are enrolled, but third-party agents installed via marketplace plugins may not be). Reference: agent contract at `agents/code-implementer.md`; runtime module at `scripts/lib/agent-output-schema.mjs::validateAgentOutput`. @@ -584,6 +589,82 @@ After each wave completes and before the progress update, update `/ST - [] Wave N: ``` +### 3b. Persona-Gate Hook (#458) + +> Opt-in mid-wave hook that fans out a `/persona-panel`-style review after a configured wave completes. Distinct from `### 5a. Persona-reviewer dispatch` (which uses the `wave-reviewers` Session Config key and dispatches code-oriented `architect-reviewer` / `qa-strategist` / `analyst` agents). This hook uses the `persona-gate-wave` Session Config key and dispatches catalog personas (domain-experts, buyer-personas, auditors) from `.claude/personas/`. The two keys are independent and may both be configured on the same project. + +**Gate conditions** — ALL must be true for the hook to fire: + +1. `persona-gate-wave.enabled: true` in Session Config (default: `false`). +2. The just-completed wave matches `persona-gate-wave.after` — one of `'quality'` or `'impl-polish'`. The hook runs AFTER step 3a (STATE.md updated) and BEFORE step 4 (progress update), so the dispatch context already reflects the completed wave's results. +3. `persona-gate-wave.mode !== 'off'` (when `mode: 'off'` the hook is a silent no-op even when `enabled: true`). + +When any gate condition is false, skip this step entirely — proceed to `### 4. Progress Update`. + +**Dispatch sequence:** + +```js +import { loadCatalog } from '$PLUGIN_ROOT/scripts/lib/persona-panel/catalog-loader.mjs'; +import { buildPersonaPrompt, validatePersonaOutput } from '$PLUGIN_ROOT/scripts/lib/persona-panel/persona-runner.mjs'; +import { consolidate } from '$PLUGIN_ROOT/scripts/lib/persona-panel/consolidator.mjs'; +import { parseThreshold } from '$PLUGIN_ROOT/scripts/lib/persona-panel/threshold.mjs'; +import { writeJsonAtomic } from '$PLUGIN_ROOT/scripts/lib/io.mjs'; +import { appendDeviation } from '$PLUGIN_ROOT/scripts/lib/state-md.mjs'; + +const cfg = $CONFIG['persona-gate-wave']; // already normalised by parseSessionConfig +const catalog = await loadCatalog(); // throws if .claude/personas/ missing or invalid +const rosterNames = cfg.personas.length > 0 + ? cfg.personas + : [...catalog.keys()]; // empty list → all catalog personas +const personas = rosterNames.map((n) => catalog.get(n)).filter(Boolean); +``` + +Dispatch each persona in parallel via the Agent tool, using `cfg['dispatch-model']` as the model and `Read, Grep, Glob` tools only (panel personas are read-only by contract). Each dispatch wraps the wave's scope summary + changed-files list in `buildPersonaPrompt(persona.persona, target, targetContent)`. + +After all agents return, collect their outputs and validate each via `validatePersonaOutput(persona.persona, agentText)`. Compose the panel verdict via `consolidate(outputs, 'hard-gate-threshold', { threshold: parseThreshold(cfg.threshold) })`. + +**Behaviour by mode:** + +| `mode` | Action on consolidator result | +|--------|--------------------------------| +| `off` | No dispatch (gate condition above). | +| `warn` | Log findings to the wave progress update under a `Persona-gate:` bullet. Continue to step 4 regardless of `final_verdict`. | +| `strict` | If `final_verdict === 'PROCEED'`: log to progress, continue. Otherwise pause and surface an `AskUserQuestion` with three options:
1. **proceed-as-is** — log Deviation, continue (Recommended only after operator inspects sidecar)
2. **revise-remaining-waves** — return `{ verdict: 'FIX_REQUIRED', revision_context: { dissenting_personas, recommendations } }` to the wave-executor caller
3. **abort-session** — return `{ verdict: 'BLOCKED' }` to the caller | + +**Sidecar write:** before reporting any verdict, validate the panel result against `agents/schemas/persona-panel-sidecar.schema.json` (via `validateAgentOutput` or a direct AJV compile) and then write atomically via `writeJsonAtomic(path, value, { schemaPath })`: + +``` +.orchestrator/persona-panel/-.json +``` + +The sidecar carries `personas_invoked`, per-persona `outputs`, and the full `consolidation` block — operators consult it from the AskUserQuestion prompt before deciding `strict`-mode follow-up. + +**STATE.md deviation contract:** on `warn` (with at least one dissenting persona) or any `strict`-mode non-PROCEED verdict, append one timestamped entry to `## Deviations` via `appendDeviation(stateContents, iso, message)`: + +``` +- [] Wave N persona-gate : dissenting=[, ], threshold=, mode=. Sidecar: . +``` + +On a clean `PROCEED` no deviation is written — the sidecar alone is sufficient evidence. + +**Wave metrics extension:** when persistence is enabled, extend the wave metrics record (step 7 of `### 2. Review Agent Outputs`) with a `persona_gate` block: + +```json +"persona_gate": { + "triggered": true, + "threshold": "", + "personas_pass": , + "personas_fail": , + "mode_used": "", + "final_verdict": "", + "sidecar_path": ".orchestrator/persona-panel/<...>.json" +} +``` + +When the hook is skipped (gate condition false), omit the `persona_gate` field entirely — never write `triggered: false` for skipped runs, so a downstream consumer can distinguish "hook did not fire" from "hook fired but found no dissent". + +**Motivating example:** the `gotzendorfer-v2` W5 Buyer-Panel pattern (six buyer personas at `hard-gate-threshold` `6-of-6`, `mode: 'strict'`, `after: 'quality'`) — UI work is gate-checked against every persona before commit, abort on any dissent. See `docs/session-config-reference.md § Persona-Gate Wave (#458)` and `commands/persona-panel.md` for the standalone CLI equivalent. + ### 4. Progress Update After each wave, provide a brief status: diff --git a/plugins/alirezarezvani/claude-skills/.codex-plugin/plugin.json b/plugins/alirezarezvani/claude-skills/.codex-plugin/plugin.json index 3a260d4f..c6c54abd 100644 --- a/plugins/alirezarezvani/claude-skills/.codex-plugin/plugin.json +++ b/plugins/alirezarezvani/claude-skills/.codex-plugin/plugin.json @@ -25,6 +25,7 @@ "skills": "./.codex/skills/", "interface": { "type": "cli", + "composerIcon": "./assets/icon.png", "displayName": "Claude Code Skills", "shortDescription": "223 production-ready skills for AI coding agents across 9 domains", "longDescription": "The largest open-source skills library for AI coding agents. 223 skills covering engineering (architecture, DevOps, security, AI/ML), marketing (SEO, CRO, content), product management, C-level advisory, regulatory compliance (ISO 13485, SOC 2, GDPR), project management, business growth, and finance. Includes 298 stdlib-only Python CLI tools, 416 reference guides, 23 orchestration agents, and 22 slash commands. Works with Codex, Claude Code, Gemini CLI, Cursor, Aider, Windsurf, and 5 more tools.", diff --git a/plugins/alirezarezvani/claude-skills/assets/icon.png b/plugins/alirezarezvani/claude-skills/assets/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..f51291810cb9ad4fec7182bf65b3c6c80586086d GIT binary patch literal 128156 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

{Zg1D;XpkuN`*xqXqPpQLLwpK3 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�DYD?0)ym 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 literal 0 HcmV?d00001 diff --git a/plugins/boshu2/agentops/skills-codex/.agentops-manifest.json b/plugins/boshu2/agentops/skills-codex/.agentops-manifest.json index b17bf78f..86796bb1 100644 --- a/plugins/boshu2/agentops/skills-codex/.agentops-manifest.json +++ b/plugins/boshu2/agentops/skills-codex/.agentops-manifest.json @@ -492,6 +492,12 @@ "wave": "catalog-parity", "reason": "This non-invocable shared-reference skill does not need bespoke Codex prompt wording." }, + { + "name": "ship-loop", + "treatment": "parity_only", + "wave": "core-execution", + "reason": "Vendor-neutral internal-PR cycle; Codex stays in parity with the Claude SKILL.md after slim-frontmatter conversion." + }, { "name": "standards", "treatment": "parity_only", @@ -673,8 +679,8 @@ { "name": "beads", "source_skill": "skills/beads", - "source_hash": "f8c4dc1bea40b11b49378e5106d0f818ee5003f0da6af70c735af301be35321b", - "generated_hash": "dd11ff257a092cd3d2d5e93524bd91d6afa9edac1bf9cf5f3d34d2990446961e" + "source_hash": "13720553f7e45574d0f4abc6d08525aaa80d9470a8b5be2045ad9fcd3f426ac5", + "generated_hash": "03a281fe283a103d67a668622f8d53ea786801f4bdf239a62b12025bb7c7b492" }, { "name": "bootstrap", @@ -751,8 +757,8 @@ { "name": "discovery", "source_skill": "skills/discovery", - "source_hash": "13571cf69999a8f494c03decaaf18c1da53d69fffb019f33e9a5a2762838f249", - "generated_hash": "686a8b634487ecadb38c6971ed3e97673749e96354be1c1eec49d7ac64b02b4c" + "source_hash": "f789b340a74c049017196792dc43ebcf8a5ca4bd990759abc843271ed6f7f271", + "generated_hash": "b8cfabc0511ff22e356756ec32257d760d7aa26326a0eb5eb23f21b2cdac11ab" }, { "name": "doc", @@ -775,8 +781,8 @@ { "name": "evolve", "source_skill": "skills/evolve", - "source_hash": "e9436e9c0b027867b71208c06f1ff5e00b850a82115cb041887afd4279eccc71", - "generated_hash": "4e9afe7d59f84ce1caa43e5a82e7af3b2a25423dbbe900333d62991bc37caafb" + "source_hash": "1dd505d4df6ec3c6b07aac0b2128ce9d6c4de935e2cd257420fa3d08dd9b9764", + "generated_hash": "a3620debc89b8c810ffb063185ed073dde2ff567a7ce6a84ebdc1e130da94f0d" }, { "name": "expert-council", @@ -877,8 +883,8 @@ { "name": "plan", "source_skill": "skills/plan", - "source_hash": "3744e9ad96c836a3f25df2c0c09b58ffb51a33ab41c97e41d5a3455beeb7d53b", - "generated_hash": "9c19e377394c3cbeda1536a683f7ad6f2e39e6f971d3baaffa351253e28a6fb8" + "source_hash": "cbde267e8094eafcd887a667e9184f52d8847d8c160c515463846a3a90a00524", + "generated_hash": "98f259c86afd2e462b62f4971af70c028963d1e617b38f856274d9e230c19209" }, { "name": "post-mortem", @@ -1015,8 +1021,8 @@ { "name": "rpi", "source_skill": "skills/rpi", - "source_hash": "c555c28f7a184e3c5ece9322ebd3cb1a7f19605475a7c149df1ecf76d30496e3", - "generated_hash": "93c42675016e1ce97a66f221884a56f964d1e70e4992db8ed4f5e0ae30adb354" + "source_hash": "33e82844fd7f80252bce56d67b7cdfb4603869e8b33515c59b054de3210f22ad", + "generated_hash": "c8f439c27965aa992f1dd9c94d0f80ddc8c2aff5f8b864c8a2a6d0820c1c814d" }, { "name": "scaffold", @@ -1051,8 +1057,14 @@ { "name": "shared", "source_skill": "skills/shared", - "source_hash": "203eda1b6558dcf65c3fecba46505f402e82f81bef2185c90934e6f7023f70fa", - "generated_hash": "3ccc9e98714bb19d3c27ada5fc55be040290b5e92baa0d02851806539236767d" + "source_hash": "4256885a364331916753754e092e7e3dc490d4b05bade2dff7e6d1bc5ff1d54e", + "generated_hash": "0758c94cf77d7fd1bde265f3bff580a57f15fe601c59f893502d14175d57b763" + }, + { + "name": "ship-loop", + "source_skill": "skills/ship-loop", + "source_hash": "4f0179eee207e186462b765a34c97cd0c868c6e1524715e5706cbf2f64bc82fb", + "generated_hash": "53907ded08ccbccdb2fb96c82a6b512d245b050a20445e7267ef5001de467254" }, { "name": "skill-auditor", @@ -1081,7 +1093,7 @@ { "name": "swarm", "source_skill": "skills/swarm", - "source_hash": "28449f5f6d3148c25682e5ceff1b488b613c7a0226a459725bd05dbc00991d0f", + "source_hash": "1a88221c6b8856c19b29d24fa44811e518bfd1d51c6b0423fa6364520a3186e2", "generated_hash": "cecb9fed1aaff7fc85958163aa2cb34d6a4b448eafd16494aa3661aa7f01a95b" }, { @@ -1111,20 +1123,20 @@ { "name": "using-agentops", "source_skill": "skills/using-agentops", - "source_hash": "8b3c3fcf6388fdfb48f502450b4eb2fb847ff06e8a1cb8d60b15c8dc926565e9", - "generated_hash": "ab3839b2128e74ae4cbbdd04153e0837917bed5f45f6c7e71a53c3dbd06dbefb" + "source_hash": "1e7086747727bced19ed8e1c6ecffcdd6bffd97d1e8568642795dc5f755c5a02", + "generated_hash": "87a288af2f4d15942f2f7f3999f7e7dbfd5242ad37b27e8db2cdc7c75ddda3d6" }, { "name": "validate", "source_skill": "skills/validate", - "source_hash": "ea6fb882cb0d9ee3717d7064dfdf1616247fe04476221acea7520c93cc16cfbe", - "generated_hash": "ea7a8797f288541ed91c3b060c7c0bdb29de9ec7e9ffd5acd40ccf4bf4f53e5d" + "source_hash": "58e0d601fa098d63359b7eca1d48efa117bf20e4e32427d303b921940da6b8fe", + "generated_hash": "eab1216146dff716bd142a5caf66ec72b66286855b21e5b95f6046e360f3af42" }, { "name": "validation", "source_skill": "skills/validation", - "source_hash": "91ab8fe0a5a31c12b3979cf34d765c8cc1b623985a8c7136375352bcfb4a721f", - "generated_hash": "f0d71e4e851b217768dd99fb1a124cb76849d5ed9bdb3d0cca6600a72244d420" + "source_hash": "7e717c1f437f102c53ef8a69249a3461dbc4ca5a22bc640de7083165eecb9b8b", + "generated_hash": "353b7a5dcc7e4720f355dbe37e63259482812f10605a9189c8a5e6eabcf6e851" }, { "name": "vibe", diff --git a/plugins/boshu2/agentops/skills-codex/beads/.agentops-generated.json b/plugins/boshu2/agentops/skills-codex/beads/.agentops-generated.json index fcc2a07d..1a7e8c42 100644 --- a/plugins/boshu2/agentops/skills-codex/beads/.agentops-generated.json +++ b/plugins/boshu2/agentops/skills-codex/beads/.agentops-generated.json @@ -2,6 +2,6 @@ "generator": "manual-maintained", "source_skill": "skills/beads", "layout": "modular", - "source_hash": "f8c4dc1bea40b11b49378e5106d0f818ee5003f0da6af70c735af301be35321b", - "generated_hash": "dd11ff257a092cd3d2d5e93524bd91d6afa9edac1bf9cf5f3d34d2990446961e" + "source_hash": "13720553f7e45574d0f4abc6d08525aaa80d9470a8b5be2045ad9fcd3f426ac5", + "generated_hash": "03a281fe283a103d67a668622f8d53ea786801f4bdf239a62b12025bb7c7b492" } diff --git a/plugins/boshu2/agentops/skills-codex/beads/SKILL.md b/plugins/boshu2/agentops/skills-codex/beads/SKILL.md index 993ebf8c..52d48cbe 100644 --- a/plugins/boshu2/agentops/skills-codex/beads/SKILL.md +++ b/plugins/boshu2/agentops/skills-codex/beads/SKILL.md @@ -124,14 +124,28 @@ NEVER run bare `bv`. Always use `--robot-*` flags. Convert a markdown plan into fully dependency-wired beads: -1. Read the plan file -2. Create beads with `br create` for each issue, including full context in the description -3. Wire dependencies with `br dep add` -4. Polish iteratively (run polish prompt 6-9 times until steady-state) -5. Validate: `br dep cycles` must be empty, `bv --robot-insights` for graph health -6. Begin: `bv --robot-next` for first bead - -Beads should be so detailed that a fresh agent can implement without consulting the original plan. +1. Read the full plan, AGENTS.md, README, linked intent issue, and acceptance criteria. +2. Create beads with `br create` for each issue, including full context in the description. +3. For every feature, bug, or product-facing behavior, include a fenced `gherkin` + block or link to a filled intent issue. Mechanical chores may omit Gherkin + only when their acceptance criteria are fully command/file based. +4. Include the `hexagon:` boundary block from + `docs/architecture/intent-to-loop-hexagon.md` for substantial beads: + inbound port, bounded context, adapters, context packet, and done state. +5. Wire dependencies with `br dep add` / `bd dep add`. Do not hand-edit JSONL or + database files. +6. Polish iteratively (usually 6-9 passes) until steady-state. Check for lost + features, oversimplification, missing tests, unclear boundaries, missing e2e + coverage, and weak logging. +7. Validate: `br dep cycles` must be empty; run `bv --robot-insights` for graph + health; use `bv --robot-next` for the first bead. Never run bare `bv`. +8. Sync explicitly before commit: `br sync --flush-only`, then `git add .beads/` + and commit tracker changes when appropriate. + +Beads should be so detailed that a fresh agent can implement without consulting +the original plan. Ready-to-implement beads have clear scope, explicit +dependencies, BDD or mechanical acceptance, unit/e2e test expectations, detailed +logging expectations, a named done state, and no dependency cycles. ## Troubleshooting diff --git a/plugins/boshu2/agentops/skills-codex/discovery/.agentops-generated.json b/plugins/boshu2/agentops/skills-codex/discovery/.agentops-generated.json index 3133d20d..8695c25f 100644 --- a/plugins/boshu2/agentops/skills-codex/discovery/.agentops-generated.json +++ b/plugins/boshu2/agentops/skills-codex/discovery/.agentops-generated.json @@ -2,6 +2,6 @@ "generator": "manual-maintained", "source_skill": "skills/discovery", "layout": "modular", - "source_hash": "13571cf69999a8f494c03decaaf18c1da53d69fffb019f33e9a5a2762838f249", - "generated_hash": "686a8b634487ecadb38c6971ed3e97673749e96354be1c1eec49d7ac64b02b4c" + "source_hash": "f789b340a74c049017196792dc43ebcf8a5ca4bd990759abc843271ed6f7f271", + "generated_hash": "b8cfabc0511ff22e356756ec32257d760d7aa26326a0eb5eb23f21b2cdac11ab" } diff --git a/plugins/boshu2/agentops/skills-codex/discovery/SKILL.md b/plugins/boshu2/agentops/skills-codex/discovery/SKILL.md index c353fcef..b91bb512 100644 --- a/plugins/boshu2/agentops/skills-codex/discovery/SKILL.md +++ b/plugins/boshu2/agentops/skills-codex/discovery/SKILL.md @@ -37,7 +37,9 @@ Leave `ao codex ensure-stop` to closeout skills; discovery owns startup only. ## Narrow Waist Discovery does not carry raw child-skill output forward. It records artifact -paths, verdicts, and the six Context Density Rule fields: +paths, verdicts, the `hexagon:` boundary block from +[`docs/architecture/intent-to-loop-hexagon.md`](../../docs/architecture/intent-to-loop-hexagon.md), +and the six Context Density Rule fields: | Field | Meaning | |-------|---------| @@ -53,7 +55,8 @@ Everything else stays in child artifacts and is linked by path. ## Discovery To Plan Port Use the [Skill Ports and Adapters](../../docs/contracts/skill-ports-and-adapters.md) -vocabulary for the boundary between Discovery and Plan: +vocabulary and the [Intent-to-Loop Hexagon](../../docs/architecture/intent-to-loop-hexagon.md) +for the boundary between Discovery and Plan: | Boundary piece | Discovery contract | |---|---| diff --git a/plugins/boshu2/agentops/skills-codex/evolve/.agentops-generated.json b/plugins/boshu2/agentops/skills-codex/evolve/.agentops-generated.json index 345ed617..e0ae34b1 100644 --- a/plugins/boshu2/agentops/skills-codex/evolve/.agentops-generated.json +++ b/plugins/boshu2/agentops/skills-codex/evolve/.agentops-generated.json @@ -2,6 +2,6 @@ "generator": "manual-maintained", "source_skill": "skills/evolve", "layout": "modular", - "source_hash": "e9436e9c0b027867b71208c06f1ff5e00b850a82115cb041887afd4279eccc71", - "generated_hash": "4e9afe7d59f84ce1caa43e5a82e7af3b2a25423dbbe900333d62991bc37caafb" + "source_hash": "1dd505d4df6ec3c6b07aac0b2128ce9d6c4de935e2cd257420fa3d08dd9b9764", + "generated_hash": "a3620debc89b8c810ffb063185ed073dde2ff567a7ce6a84ebdc1e130da94f0d" } diff --git a/plugins/boshu2/agentops/skills-codex/evolve/SKILL.md b/plugins/boshu2/agentops/skills-codex/evolve/SKILL.md index 897ca21b..52935fc4 100644 --- a/plugins/boshu2/agentops/skills-codex/evolve/SKILL.md +++ b/plugins/boshu2/agentops/skills-codex/evolve/SKILL.md @@ -268,8 +268,29 @@ Run at the TOP of every cycle: ```bash CYCLE_START_SHA=$(git rev-parse HEAD) -[ -f ~/.config/evolve/KILL ] && echo "KILL: $(cat ~/.config/evolve/KILL)" && exit 0 -[ -f .agents/evolve/STOP ] && echo "STOP: $(cat .agents/evolve/STOP 2>/dev/null)" && exit 0 +# Stale-kill auto-expire (closes F5 from 2026-05-18 post-mortem). +# A KILL/STOP file older than EVOLVE_KILL_TTL_DAYS (default 7) is treated as +# stale and surfaced loudly; the loop proceeds. Re-touch to keep blocking. +EVOLVE_KILL_TTL_DAYS="${EVOLVE_KILL_TTL_DAYS:-7}" +check_stale_kill() { + local path="$1" ttl_days="$2" + [ -f "$path" ] || return 1 + local mtime_epoch now_epoch age_days + mtime_epoch=$(stat -c %Y "$path" 2>/dev/null || stat -f %m "$path" 2>/dev/null) + now_epoch=$(date +%s) + age_days=$(( (now_epoch - mtime_epoch) / 86400 )) + if [ "$age_days" -gt "$ttl_days" ]; then + echo "WARN: ${path} is ${age_days} days old (> ${ttl_days}); STALE, proceeding." >&2 + return 1 + fi + return 0 +} +if check_stale_kill ~/.config/evolve/KILL "$EVOLVE_KILL_TTL_DAYS"; then + echo "KILL: $(cat ~/.config/evolve/KILL)"; exit 0 +fi +if check_stale_kill .agents/evolve/STOP "$EVOLVE_KILL_TTL_DAYS"; then + echo "STOP: $(cat .agents/evolve/STOP 2>/dev/null)"; exit 0 +fi ``` ### Step 2: Measure Fitness diff --git a/plugins/boshu2/agentops/skills-codex/plan/.agentops-generated.json b/plugins/boshu2/agentops/skills-codex/plan/.agentops-generated.json index c1d71993..928fe509 100644 --- a/plugins/boshu2/agentops/skills-codex/plan/.agentops-generated.json +++ b/plugins/boshu2/agentops/skills-codex/plan/.agentops-generated.json @@ -2,6 +2,6 @@ "generator": "manual-maintained", "source_skill": "skills/plan", "layout": "modular", - "source_hash": "3744e9ad96c836a3f25df2c0c09b58ffb51a33ab41c97e41d5a3455beeb7d53b", - "generated_hash": "9c19e377394c3cbeda1536a683f7ad6f2e39e6f971d3baaffa351253e28a6fb8" + "source_hash": "cbde267e8094eafcd887a667e9184f52d8847d8c160c515463846a3a90a00524", + "generated_hash": "98f259c86afd2e462b62f4971af70c028963d1e617b38f856274d9e230c19209" } diff --git a/plugins/boshu2/agentops/skills-codex/plan/SKILL.md b/plugins/boshu2/agentops/skills-codex/plan/SKILL.md index f9533116..78f9efb3 100644 --- a/plugins/boshu2/agentops/skills-codex/plan/SKILL.md +++ b/plugins/boshu2/agentops/skills-codex/plan/SKILL.md @@ -80,7 +80,11 @@ Feature: Plan converts dense intent into executable slices 8. **Decompose into issues.** Each issue needs title, file ownership, dependencies, acceptance criteria, test levels, and at least one mechanical conformance check (`files_exist`, `content_check`, `command`, `tests`, or - `lint`). + `lint`). Feature, bug, and product-facing behavior issues also need a + fenced `gherkin` block or a link to the upstream intent issue scenario. + Non-trivial plans and bead bodies should include the `hexagon:` boundary + block: inbound port, bounded context, adapters, context packet, and done + state. 9. **Compute waves.** Group independent issues by dependency. Serialize or merge same-file writes. Include generated artifacts, docs, schemas, fixtures, Codex companions, manifests, and hash markers in ownership. diff --git a/plugins/boshu2/agentops/skills-codex/rpi/.agentops-generated.json b/plugins/boshu2/agentops/skills-codex/rpi/.agentops-generated.json index 9043ef98..d9de7f9d 100644 --- a/plugins/boshu2/agentops/skills-codex/rpi/.agentops-generated.json +++ b/plugins/boshu2/agentops/skills-codex/rpi/.agentops-generated.json @@ -2,6 +2,6 @@ "generator": "manual-maintained", "source_skill": "skills/rpi", "layout": "modular", - "source_hash": "c555c28f7a184e3c5ece9322ebd3cb1a7f19605475a7c149df1ecf76d30496e3", - "generated_hash": "93c42675016e1ce97a66f221884a56f964d1e70e4992db8ed4f5e0ae30adb354" + "source_hash": "33e82844fd7f80252bce56d67b7cdfb4603869e8b33515c59b054de3210f22ad", + "generated_hash": "c8f439c27965aa992f1dd9c94d0f80ddc8c2aff5f8b864c8a2a6d0820c1c814d" } diff --git a/plugins/boshu2/agentops/skills-codex/rpi/SKILL.md b/plugins/boshu2/agentops/skills-codex/rpi/SKILL.md index d2914902..d471b2ab 100644 --- a/plugins/boshu2/agentops/skills-codex/rpi/SKILL.md +++ b/plugins/boshu2/agentops/skills-codex/rpi/SKILL.md @@ -56,6 +56,10 @@ packet objective. A child bead or one ready slice is context, not a replacement objective. `PARTIAL` from `$crank` means retry Phase 2 on the same objective. +Preserve the [Intent-to-Loop Hexagon](../../docs/architecture/intent-to-loop-hexagon.md) +boundary as the objective crosses `shape_intent`, `persist_intent`, +`plan_slices`, `execute_wave`, `validate_acceptance`, and `record_evidence`. + ## Route And Classify 1. Create `.agents/rpi/`. diff --git a/plugins/boshu2/agentops/skills-codex/shared/.agentops-generated.json b/plugins/boshu2/agentops/skills-codex/shared/.agentops-generated.json index eb823e2d..aa3127f4 100644 --- a/plugins/boshu2/agentops/skills-codex/shared/.agentops-generated.json +++ b/plugins/boshu2/agentops/skills-codex/shared/.agentops-generated.json @@ -2,6 +2,6 @@ "generator": "manual-maintained", "source_skill": "skills/shared", "layout": "modular", - "source_hash": "203eda1b6558dcf65c3fecba46505f402e82f81bef2185c90934e6f7023f70fa", - "generated_hash": "3ccc9e98714bb19d3c27ada5fc55be040290b5e92baa0d02851806539236767d" + "source_hash": "4256885a364331916753754e092e7e3dc490d4b05bade2dff7e6d1bc5ff1d54e", + "generated_hash": "0758c94cf77d7fd1bde265f3bff580a57f15fe601c59f893502d14175d57b763" } diff --git a/plugins/boshu2/agentops/skills-codex/shared/validation-contract.md b/plugins/boshu2/agentops/skills-codex/shared/validation-contract.md index d9f8e519..f977542b 100644 --- a/plugins/boshu2/agentops/skills-codex/shared/validation-contract.md +++ b/plugins/boshu2/agentops/skills-codex/shared/validation-contract.md @@ -18,6 +18,31 @@ CORRECT (new): --- +## Completion-Claim Kernel + +Apply this kernel whenever an artifact says a bead, task, epic, gate, or phase is +`DONE`, `closed`, `complete`, `green`, or ready to ship: + +1. Treat status fields and agent summaries as claims until fresh evidence proves + the contract is satisfied. +2. Rerun the narrowest checks that prove the acceptance criteria now, and keep + command, exit code, and relevant output in the verdict or linked evidence. +3. Separate test existence, command success, and non-trivial assertions against + production paths. Flag skipped tests, `assert true`, hardcoded success paths, + disabled code, and mocks where the spec required real integration. +4. Map each claimed acceptance criterion to file:line evidence, named tests, raw + logs, or explicit no-file evidence. +5. Check parent/child reconciliation, dependency graph health, orphaned + acceptance criteria, and cross-bead contract drift. +6. Label deterministic suspicion as `flagged-for-review` until rerun evidence + proves a true failure. + +The evidence minimum for a completion claim is: claimed scope, acceptance +criterion, proof artifact, rerun command when applicable, and parent/dependency +reconciliation outcome. + +--- + ## Specifying Validation Requirements diff --git a/plugins/boshu2/agentops/skills-codex/ship-loop/.agentops-generated.json b/plugins/boshu2/agentops/skills-codex/ship-loop/.agentops-generated.json new file mode 100644 index 00000000..f3370dc0 --- /dev/null +++ b/plugins/boshu2/agentops/skills-codex/ship-loop/.agentops-generated.json @@ -0,0 +1,7 @@ +{ + "generator": "manual-maintained", + "source_skill": "skills/ship-loop", + "layout": "modular", + "source_hash": "4f0179eee207e186462b765a34c97cd0c868c6e1524715e5706cbf2f64bc82fb", + "generated_hash": "53907ded08ccbccdb2fb96c82a6b512d245b050a20445e7267ef5001de467254" +} diff --git a/plugins/boshu2/agentops/skills-codex/ship-loop/SKILL.md b/plugins/boshu2/agentops/skills-codex/ship-loop/SKILL.md new file mode 100644 index 00000000..c0c55eac --- /dev/null +++ b/plugins/boshu2/agentops/skills-codex/ship-loop/SKILL.md @@ -0,0 +1,96 @@ +--- +name: ship-loop +description: 'Internal-PR fast-lane cycle.' +--- + +# $ship-loop — Bot-paired fast lane PR cycle + +> **Codex orchestration default:** when the operator types `$ship-loop`, run the 9-step cycle below. For fork-based OSS contributions use `$pr-implement` and the `$pr-*` family instead (different tier). + +Capture of the discipline that lands single-scenario internal PRs at ~15-30 min median time-to-merge in repos with an auto-review bot workflow and `gh pr merge --auto` enabled. + +## When to use + +| Use ship-loop when... | Use something else when... | +|---|---| +| Single-scenario internal PR in your own repo | Fork-based OSS contribution → `$pr-implement` | +| PR <100 lines with paired tests | Multi-wave epic → `$crank` | +| Closing a harvested next-work item | Architecture / contract change → slow lane / human review | +| Mechanical drift fix or regression closure | Work that can't fit one scenario → split or escalate | + +## The 9-step cycle + +1. **Claim.** `bd ready` → pick highest-severity unblocked, OR read `.agents/rpi/next-work.jsonl` for harvested items. `bd update --claim`. +2. **Branch off fresh main.** `git checkout main && git pull --rebase`. Then `git checkout -b /-`. Never stack off siblings. +3. **First failing test.** BDD scenario or unit test. Must fail for the right reason (asserting expected behavior). Per the project's L2-first/L1-always rule. +4. **Minimal implementation.** Smallest code change that makes the test green. Resist scope creep. +5. **`scripts/pre-push-gate.sh --fast`** (or full gate — see below). Diff-scoped CI. **Escalate to the full gate (`scripts/pre-push-gate.sh`, no `--fast`) when the PR adds a new skill, new contract, new schema, or any inventory surface** — `--fast` skips ~15 inventory validators (registry-check, codex-override-coverage, skill-integrity, manifest entries, context-map drift). Catching them once locally is one pass; chasing them one-at-a-time through CI is 5-10 passes. If a pre-existing blocker appears in unchanged-from-base content, file an atomic side-quest fix PR first (don't bundle). +6. **Commit with conventional-commit scope.** `feat():`, `fix():`. Body reproduces the failure mode the test catches. +7. **Push + `gh pr create`.** Body cites the bead, validation, and a learning-anchor reference in the script body (not a `.agents/learnings/` file — that breaks CI). +8. **`gh pr merge --squash --auto`.** Immediately. The bot fires the review check automatically on PR open. +9. **Close the bead.** `bd close --reason "Merged via PR #"`. For multi-PR chains: `scripts/gh-merge-chain.sh `. + +## Gate sequence + +| Gate | Enforces | +|---|---| +| `scripts/pre-push-gate.sh --fast` | Diff-scoped CI; unconditional shellcheck on staged `.sh`; mkdocs strict on docs/; registry-drift | +| Review-bot workflow (auto on PR open) | Bot half of the pair — no mention required | +| `.github/workflows/validate.yml` | Full 60+ job suite | +| `gh pr merge --squash --auto` | Auto-merge when all required checks pass | +| `scripts/gh-merge-chain.sh` (optional) | Chain N PRs through auto-merge with `update-branch` on each successor | + +## Failure-mode mapping (F1-F5 + meta) + +| ID | Failure | Mechanical guard | +|---|---|---| +| F1 | Script rewrite leaves dead variables | Unconditional shellcheck on staged `.sh` | +| F2 | Pre-existing blocker compounds across branches | **Open.** Rule: fix as atomic side-quest PR first | +| F3 | `--auto` doesn't auto-rebase BEHIND branches | `scripts/gh-merge-chain.sh` | +| F4 | Bot trigger doc claimed mention-only | Doc corrected; observed auto-fire on PR open | +| F5 | Stale `~/.config/evolve/KILL` silently blocks `$evolve` | `EVOLVE_KILL_TTL_DAYS=7` auto-expire | +| meta | Tests asserting local-only file existence | `grep -q '' "$SCRIPT"` instead of `[ -f .agents/learnings/.md ]` | + +## Anti-patterns + +1. **Running `--fast` pre-push on an inventory-touching PR** — new skill, contract, or schema → use FULL gate; `--fast` skips ~15 inventory validators +2. **Bundling pre-existing fixes** — file each as its own atomic PR +3. **Keeping copied variables after a rewrite** — first self-check after rewrite is "are all variable declarations used?" +4. **Asserting local-only state in CI tests** — grep the reference, don't check the file +5. **Branches off out-of-date main** — `git pull --rebase` at branch creation +6. **Skipping the failing-test-first step** — adding a test after the fix gives false confidence + +## Pair mechanics + +- The review-bot workflow fires automatically on `pull_request: opened/synchronize`. No mention required. +- If `IN_PROGRESS`, wait. If silent, check workflow permissions (`workflows: write` for forward-port scenarios). +- Self-revert loop (bot reverting its own forward-port): rebase the branch locally onto fresh main and force-push. + +## Anti-Patterns (DO NOT) + +| Anti-Pattern | Why It's Wrong | Correct Behavior | +|---|---|---| +| Stack feature branches on each other | Auto-merge serialization fails; conflicts compound | Always branch off fresh main | +| Bundle a pre-existing fix into a feature PR | Other branches will hit + duplicate the same fix | File atomic side-quest PR first, rebase | +| Assert `.agents/learnings/.md` exists in CI | `.agents/` is gitignored; test fails in fresh clone | `grep -q '' "$SCRIPT"` (reference assertion) | +| Add tests after the fix without seeing them fail | False confidence | Write the failing test FIRST, see it red | +| Push without `--auto` enabled immediately | Operator becomes the merge bottleneck | `gh pr merge --squash --auto` on PR open | + +## Examples + +**User says:** `$ship-loop` after picking `soc-` from `bd ready` +Run the 9-step cycle: branch, first failing test, minimal impl, pre-push --fast, commit, push, auto-merge, bd close. + +**User says:** "ship this fix from the post-mortem" +Read the harvested item from `.agents/rpi/next-work.jsonl`, run the 9-step cycle. + +**User says:** "land the 4 PRs we have open" +After all 4 PRs are open with auto-merge enabled: `scripts/gh-merge-chain.sh `. + +## See Also + +- `$pr-implement` — fork-based OSS contribution (different tier; different use case) +- `$crank` — multi-wave epic execution +- `$rpi` — full lifecycle orchestrator +- `$post-mortem` — harvests next-work items that ship-loop consumes +- `$beads` — task tracker that drives the claim step diff --git a/plugins/boshu2/agentops/skills-codex/ship-loop/prompt.md b/plugins/boshu2/agentops/skills-codex/ship-loop/prompt.md new file mode 100644 index 00000000..87fe377e --- /dev/null +++ b/plugins/boshu2/agentops/skills-codex/ship-loop/prompt.md @@ -0,0 +1,35 @@ +# Execution Profile — ship-loop + +You are running the bot-paired fast lane PR cycle. Operator typed `$ship-loop` or asked you to ship a single-scenario internal PR. + +## Mode + +- **Lane:** internal-ship (same-repo, branch off main, auto-merge to main). NOT a fork-based OSS contribution. +- **Default approval:** autonomous; the bot review fires automatically on PR open. +- **Stop conditions:** the 9-step cycle completes, OR a gate fails with a real blocker (not a pre-existing F2-class side-quest), OR the work won't fit one scenario. + +## Run + +1. Read `bd ready` and `.agents/rpi/next-work.jsonl`. Pick highest-severity unblocked item. Claim it: `bd update --claim`. +2. `git checkout main && git pull --rebase`. Branch: `git checkout -b /-`. +3. Write the first FAILING test. Confirm it fails for the right reason. +4. Write the minimal implementation. Confirm the test now passes. +5. Run `scripts/pre-push-gate.sh --fast`. If a pre-existing blocker fires on content you didn't change, STOP and file an atomic side-quest fix PR first. +6. Commit with conventional-commit scope. Body reproduces the failure mode. +7. Push + `gh pr create`. `gh pr merge --squash --auto`. +8. `bd close ` after the PR auto-merges. + +## Guardrails + +- Reject work that touches >5 non-uniform files or introduces a new shape (schema, contract surface, struct field). Surface to operator for slow-lane routing instead. +- Reject tests that assert local-only file existence (`[ -f .agents/learnings/.md ]`). Use `grep -q '' "$SCRIPT"` to assert the rationale reference in the script body instead. +- Reject "I'll add the test after" — write the failing test FIRST. + +## Verification + +- Local: `bats ` AND `scripts/pre-push-gate.sh --fast` both pass before push. +- Remote: `claude-review` and the full `validate.yml` suite via `gh pr view --json statusCheckRollup`. + +## Output + +A merged PR on `origin/main` and a closed bead. If the chain has >=3 PRs in flight, invoke `scripts/gh-merge-chain.sh` to serialize them. diff --git a/plugins/boshu2/agentops/skills-codex/swarm/.agentops-generated.json b/plugins/boshu2/agentops/skills-codex/swarm/.agentops-generated.json index f598bc2e..478d1d8f 100644 --- a/plugins/boshu2/agentops/skills-codex/swarm/.agentops-generated.json +++ b/plugins/boshu2/agentops/skills-codex/swarm/.agentops-generated.json @@ -2,6 +2,6 @@ "generator": "manual-maintained", "source_skill": "skills/swarm", "layout": "modular", - "source_hash": "28449f5f6d3148c25682e5ceff1b488b613c7a0226a459725bd05dbc00991d0f", + "source_hash": "1a88221c6b8856c19b29d24fa44811e518bfd1d51c6b0423fa6364520a3186e2", "generated_hash": "cecb9fed1aaff7fc85958163aa2cb34d6a4b448eafd16494aa3661aa7f01a95b" } diff --git a/plugins/boshu2/agentops/skills-codex/using-agentops/.agentops-generated.json b/plugins/boshu2/agentops/skills-codex/using-agentops/.agentops-generated.json index 74477480..3f71254b 100644 --- a/plugins/boshu2/agentops/skills-codex/using-agentops/.agentops-generated.json +++ b/plugins/boshu2/agentops/skills-codex/using-agentops/.agentops-generated.json @@ -2,6 +2,6 @@ "generator": "manual-maintained", "source_skill": "skills/using-agentops", "layout": "modular", - "source_hash": "8b3c3fcf6388fdfb48f502450b4eb2fb847ff06e8a1cb8d60b15c8dc926565e9", - "generated_hash": "ab3839b2128e74ae4cbbdd04153e0837917bed5f45f6c7e71a53c3dbd06dbefb" + "source_hash": "1e7086747727bced19ed8e1c6ecffcdd6bffd97d1e8568642795dc5f755c5a02", + "generated_hash": "87a288af2f4d15942f2f7f3999f7e7dbfd5242ad37b27e8db2cdc7c75ddda3d6" } diff --git a/plugins/boshu2/agentops/skills-codex/using-agentops/SKILL.md b/plugins/boshu2/agentops/skills-codex/using-agentops/SKILL.md index a08ff7a4..1b312227 100644 --- a/plugins/boshu2/agentops/skills-codex/using-agentops/SKILL.md +++ b/plugins/boshu2/agentops/skills-codex/using-agentops/SKILL.md @@ -145,6 +145,7 @@ These are the skills every user needs first. Everything else is available when y | `$pr-validate` | PR-specific validation and isolation checks | | `$pr-prep` | PR preparation and structured body generation | | `$pr-retro` | Learn from PR outcomes | +| `$ship-loop` | Bot-paired internal-PR fast-lane cycle | | `$complexity` | Code complexity analysis | | `$product` | Interactive PRODUCT.md generation | | `$handoff` | Session handoff for continuation | diff --git a/plugins/boshu2/agentops/skills-codex/validate/.agentops-generated.json b/plugins/boshu2/agentops/skills-codex/validate/.agentops-generated.json index e62ac30c..8cf7f398 100644 --- a/plugins/boshu2/agentops/skills-codex/validate/.agentops-generated.json +++ b/plugins/boshu2/agentops/skills-codex/validate/.agentops-generated.json @@ -2,6 +2,6 @@ "generator": "manual-maintained", "source_skill": "skills/validate", "layout": "modular", - "source_hash": "ea6fb882cb0d9ee3717d7064dfdf1616247fe04476221acea7520c93cc16cfbe", - "generated_hash": "ea7a8797f288541ed91c3b060c7c0bdb29de9ec7e9ffd5acd40ccf4bf4f53e5d" + "source_hash": "58e0d601fa098d63359b7eca1d48efa117bf20e4e32427d303b921940da6b8fe", + "generated_hash": "eab1216146dff716bd142a5caf66ec72b66286855b21e5b95f6046e360f3af42" } diff --git a/plugins/boshu2/agentops/skills-codex/validate/SKILL.md b/plugins/boshu2/agentops/skills-codex/validate/SKILL.md index 14d27b60..a9b0b5ec 100644 --- a/plugins/boshu2/agentops/skills-codex/validate/SKILL.md +++ b/plugins/boshu2/agentops/skills-codex/validate/SKILL.md @@ -9,6 +9,14 @@ description: 'Produce PASS/WARN/FAIL verdicts.' > **Status (2026-05-08):** introduced ADDITIVE in Phase 1 (m6v5.D.1 / soc-78s2v). Existing validators (council, vibe, pre-mortem, red-team, pr-validate, validation, review, scenario) stay until Phase 2 shim conversion (m6v5.D.2). Fix-C smoke (`soc-wb2aa`) gates Phase 2. +`$validate` is a driving adapter for the `validate_acceptance` port in the +[Intent-to-Loop Hexagon](../../docs/architecture/intent-to-loop-hexagon.md). +When the artifact contains a `hexagon:` block, preserve the bounded context, +context packet, guard adapters, and done state in the verdict. +When the artifact claims DONE/closed/green, apply the +[Completion-Claim Kernel](../shared/validation-contract.md#completion-claim-kernel) +before returning PASS. + ## Modes (≤8 per Fix-F mode-flag budget) | Mode | Purpose | Replaces (post-Phase 2) | diff --git a/plugins/boshu2/agentops/skills-codex/validation/.agentops-generated.json b/plugins/boshu2/agentops/skills-codex/validation/.agentops-generated.json index feb9a107..726df856 100644 --- a/plugins/boshu2/agentops/skills-codex/validation/.agentops-generated.json +++ b/plugins/boshu2/agentops/skills-codex/validation/.agentops-generated.json @@ -2,6 +2,6 @@ "generator": "manual-maintained", "source_skill": "skills/validation", "layout": "modular", - "source_hash": "91ab8fe0a5a31c12b3979cf34d765c8cc1b623985a8c7136375352bcfb4a721f", - "generated_hash": "f0d71e4e851b217768dd99fb1a124cb76849d5ed9bdb3d0cca6600a72244d420" + "source_hash": "7e717c1f437f102c53ef8a69249a3461dbc4ca5a22bc640de7083165eecb9b8b", + "generated_hash": "353b7a5dcc7e4720f355dbe37e63259482812f10605a9189c8a5e6eabcf6e851" } diff --git a/plugins/boshu2/agentops/skills-codex/validation/SKILL.md b/plugins/boshu2/agentops/skills-codex/validation/SKILL.md index beafcb1a..4dbafbdf 100644 --- a/plugins/boshu2/agentops/skills-codex/validation/SKILL.md +++ b/plugins/boshu2/agentops/skills-codex/validation/SKILL.md @@ -14,6 +14,13 @@ Validation delegates to `$vibe`, `$post-mortem`, `$retro`, and `$forge` (plus li See [`docs/learnings/orchestrator-compression-anti-pattern.md`](../../docs/learnings/orchestrator-compression-anti-pattern.md) for the live compression signature. +Validation owns the `validate_acceptance` port in the +[Intent-to-Loop Hexagon](../../docs/architecture/intent-to-loop-hexagon.md). +The roll-up must preserve bounded context, context packet, guard adapters, done +state, and fresh proof for each accepted scenario. Apply the +[Completion-Claim Kernel](../shared/validation-contract.md#completion-claim-kernel) +before accepting DONE/closed/green claims. + ## DAG — Execute This Sequentially ### Step 0: Load Prior Validation Context diff --git a/plugins/ouonet/praxis/.codex-plugin/plugin.json b/plugins/ouonet/praxis/.codex-plugin/plugin.json index d0f31120..d7f1b635 100644 --- a/plugins/ouonet/praxis/.codex-plugin/plugin.json +++ b/plugins/ouonet/praxis/.codex-plugin/plugin.json @@ -1,6 +1,6 @@ { "name": "praxis", - "version": "1.2.2", + "version": "1.2.3", "description": "Token-lean discipline skills for coding agents.", "author": { "name": "ouonet" }, "homepage": "https://github.com/ouonet/praxis", diff --git a/plugins/ouonet/praxis/package.json b/plugins/ouonet/praxis/package.json index 47dd2320..829fd05a 100644 --- a/plugins/ouonet/praxis/package.json +++ b/plugins/ouonet/praxis/package.json @@ -1,6 +1,6 @@ { "name": "praxis", - "version": "1.2.2", + "version": "1.2.3", "type": "module", "main": ".opencode/plugins/praxis.js" } diff --git a/plugins/ouonet/praxis/skills/triage/SKILL.md b/plugins/ouonet/praxis/skills/triage/SKILL.md index f2fd8069..7582cd4f 100644 --- a/plugins/ouonet/praxis/skills/triage/SKILL.md +++ b/plugins/ouonet/praxis/skills/triage/SKILL.md @@ -11,14 +11,14 @@ praxis: scope=, loading= | scope | signal | load | |---|---|---| -| trivial | typo, rename, doc, <=1-line, pure Q | none | -| small | one function, single file, <=50 LOC | `tdd` (intent unclear? clarify first) | -| standard | feature, multi-file, new behavior | `design` -> `plan` -> `tdd` -> `review` | -| complex | new system, >=5 tasks, parallel | `design` -> `plan` -> `worktree` -> `subagents` -> `review` -> `ship` | +| trivial | typo, rename, docs-only, <=1-line, pure Q | none | +| small | one function, single file, <=50 LOC, or test-only change | `tdd` (intent unclear? clarify first) | +| standard | feature change or source-code change | `design` -> `plan` -> `tdd` -> `review` | +| complex | large feature/source-code change: new system, >=5 tasks, or parallel edits | `design` -> `plan` -> `worktree` -> `subagents` -> `review` -> `ship` | | debug | broken, regression, failing test | `debug` first, then route fix | | onboard | existing project, no docs/tech-spec.md, "take over"/"add Praxis" | `onboard` | -Torn? Pick smaller. "just X" / "quickly" / "no tests" -> downgrade. "design it" / "properly" -> upgrade. +If multiple scopes fit, choose the smaller one. `feature change` = user-visible/public-contract change. `source code` = code/schema/config that changes shipped behavior; docs, tests, examples, CI, and tooling excluded. - Never load a skill not listed for the chosen scope. - Load selected skills via the Skill tool as `praxis:`, or in file-read harnesses from `skills//SKILL.md`. \ No newline at end of file From 563dc81034111b72aec6ecffcd6ac9bd93083d32 Mon Sep 17 00:00:00 2001 From: PN <65691345+AUN-PN@users.noreply.github.com> Date: Tue, 19 May 2026 15:12:39 +0700 Subject: [PATCH 3/3] Add SeparateWeb Capture to community plugins Adds SeparateWeb Capture to the Tools & Integrations section. SeparateWeb gives Codex real webpage context through full-page screenshots, UI crops, and JSON manifests for frontend review and visual QA. --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 4a3184a7..1f909740 100644 --- a/README.md +++ b/README.md @@ -205,6 +205,7 @@ Third-party plugins built by the community. [PRs welcome](#contributing)! - [Remotion Plugin](https://github.com/tim-osterhus/codex-remotion-plugin) - Build parameterized Remotion videos in Codex with the official Remotion docs MCP, composition scaffolding, and a data-driven launch-video workflow. - [ru-text](https://github.com/talkstream/ru-text) - Russian text quality — ~1,040 rules for typography, info-style, editorial, UX writing, and business correspondence. - [Rust Reverse Engineering](https://github.com/jingjing2222/rust-reverse-engineering-skill) - Reverse engineer Rust binaries and libraries: triage targets, demangle symbols, recover crate namespaces, and map panic, unwind, async, and FFI paths. +- [SeparateWeb Capture](https://github.com/AUN-PN/SeparateWeb) - Give Codex eyes on real webpages with full-page screenshots, UI crops, and JSON manifests for frontend visual QA. - [sitemd](https://github.com/sitemd-cc/sitemd) - Build websites from Markdown via MCP — 22 tools for creating pages, generating content, validating, running SEO audits, configuring settings, and deploying static sites to Cloudflare Pages. - [Synta MCP](https://github.com/Synta-ai/n8n-mcp-codex-plugin-synta) - Build, edit, validate, and self-heal n8n workflows with Synta MCP tools and Codex-ready workflow guidance. - [Task Scheduler](https://github.com/6Delta9/task-scheduler-codex-plugin) - OpenAI Codex plugin and local MCP server for turning task lists into realistic schedules with blocked dates, capacity overrides, overflow tracking, and markdown planning output.