Added
- Role-based execution profiles (#616, community contribution by @Jhacarreiro; maintainer landing): unified resolver (
scripts/lib/execution-profile.sh) for provider, model, reasoning level, and reasoning policy by role or phase. Backward compatible withprovider:modelstring routes; object routes let one provider use different models per role. Reasoning translates to native controls (Codex-c model_reasoning_effort, Claude--effort, OpenAI-compatiblereasoning_effortwithstrict/best_effortpolicy and unsupported-field retry). Maintainer fix on landing:xhigh/maxprofile levels clamp tohighfor OpenAI-compatible providers, whose reasoning domain and command validator only acceptlow|medium|high.
Fixed
-
Removed the last
type: "prompt"PreToolUse hook ("Before running tangle phase, check if there are existing validation results that need review", bareBashmatcher). Like the three banner prompts removed in #622, its text reaches Claude Code's hook adjudicator as a policy condition; because the condition is never satisfiable for ordinary commands, the adjudicator denied unrelated Bash calls outright, blocking sessions. Tangle validation reminders belong in the orchestrate dispatch path, not a global Bash prompt hook. -
Hook scripts converted to the current hook stdout contract (#621 Defect 2). ~60 emission sites across 25 hook scripts printed the legacy root-level
{"decision": "continue"|"allow"}shape, which current Claude Code rejects withHook JSON output validation failed, silently discarding the hooks' output. Pass-through paths now emit nothing (silence means continue); PreToolUse gate verdicts moved tohookSpecificOutput.permissionDecision(deny/askwithpermissionDecisionReason), including the codex-exec-guard block and all careful-mode confirmations; SessionStart/PostToolUse/PreToolUse context injection moved tohookSpecificOutput.additionalContext. Still-valid shapes kept:{"decision":"block"}on PostToolUse (quality-gate), SubagentStop (subagent-stop-gate), and PreCompact (pre-compact agent-in-flight guard). Test assertions updated to the new contract. -
Provider PID tracking after delayed spawn (#618, community contribution by @Jhacarreiro; maintainer landing):
spawn_agent_capture_pidnow waits for the real provider PID (configurable viaOCTOPUS_SPAWN_PID_WAIT_ATTEMPTS, default 1200 × 0.1s) instead of falling back to the short-lived wrapper PID after 10s, and fails dispatch if no provider PID is ever produced — the wrapper fallback left providers orphaned mid-billing and triggered false missing-completion-marker correction loops. Maintainer fix on landing: the wait-attempts env var is validated as a positive integer before arithmetic use. -
Gate hooks moved from
.claude-plugin/hooks.jsontohooks/hooks.jsonand converted to the documented hook schema (#611). Claude Code only loads plugin hooks fromhooks/hooks.json(or a path declared in plugin.json'shooksfield); a hooks file inside.claude-plugin/is never read, so all 45 gate hook commands across 20 events have been silently inert in every install — the reported "marketplace strips hooks.json" symptom was actually "hooks never loaded from any location". The file now lives at the auto-discovered path, wrapped in the standard top-levelhookskey, with object matchers ({"tool": ..., "pattern": ...}) converted to documented string matchers; command-level filtering was already done inside each hook script (allow-by-default), so droppedpatternfields lose no behavior; all other hook fields are preserved verbatim. Note this activates the gate hooks for the first time on plugin update. -
Repository review follow-ups: clarified README provider counting and cost assumptions, routed marketplace-sync errors through the script logger, and made release manifest updates portable while keeping browse-manifest hook and routine counts current.
-
Review aggregation follow-up hardening (#592): each Round 1 agent now has an independent progress timer; completed results require anchored terminal statuses; provider exits without a terminal status are classified as partial; leading-zero timing inputs are normalized as decimal; stall cleanup snapshots and terminates the full descendant process tree; and findings extraction accepts only arrays while preferring the last non-empty result.
-
Plugin commands moved from
.claude/commands/tocommands/—.claude/commandsis Claude Code's reserved user/project command directory, so the installed plugin cache registered all 50 commands bare (unnamespaced) in addition to theocto:namespace. Bare/resume,/review,/plan, and/usageshadowed Claude Code built-ins (typing/resumeopened octo's agent-resume instead of the native session picker). Commands now live in the standardcommands/plugin directory; onlyocto:*names register. All path references updated across plugin.json, scripts, hooks, tests, and docs;.claude/skillsand.claude/agentshave the same bare-registration pollution (no built-in collisions) and are tracked as a follow-up.