/develop:review's perf brief asks for current behavior versus expected improvement per finding, which its report section requires.
- Restyle the animated execution diagrams of the
/develop:fix,feature,refactorandreviewskills: card text is short fragments instead of sentences, key names are bold and conditions or bounds are italic, and each diagram's legend explains the emphasis; stop and skip conditions and gates are unchanged.
- Review outcomes now distinguish bounded, low-impact correctness, test and compatibility repairs from material behavioral defects or substantial repair. Final verdicts cite the controlling findings and their impact, keeping required fixes actionable under Minor and verification readiness separate from source approval.
- Weigh production impact above file type: documentation and test gaps normally remain Minor without evidence supporting a stronger judgment. These factors inform one combined judgment: high-impact findings can control the verdict and are never diluted by minor items. Use the strongest confirmed consequence as the baseline, account for proven joint effects, and keep severity, source disposition and verification separate. Missing tests no longer receive an automatic High rating; numeric topic discounts require independent calibration before they can determine verdicts.
run_pytest_short.pycloses the child's output pipe after reading, including when output is truncated, preventing leaked pipes and unclosed-file ResourceWarnings.dev_run_repro.pycloses the child's output pipe from its reader thread when the output ends, so a run that hits the timeout no longer leaks the pipe or emits a ResourceWarning, and a pipe a grandchild still holds is closed when that grandchild exits.
- Require proportional planning and challenge before accepted execution, then consolidate actual results with independent review and verification; routine authorized work gains no user approval prompt. Validate bounded outcomes, decompose larger work, and complete branches depth-first with focused context and useful disjoint sibling delegation; parent consolidation retains valid-evidence and mandatory acceptance gates.
- The loop cost log moves to schema 2 and adds
tokens_total, so a Claude review round records the background agent'ssubagent_tokenstotal andduration_ms(asduration_s) instead of leaving tokens null; schema 1 records stay accepted. - Review loops record the failing-before/passing-after check as a literal command line in the pre-baseline attestation and as a
probe:entry onfixactions, so the parent can rerun it after later edits; the helper never executes it and reviewers do not receive it as a resolver account. - Assess confidence in the delivered result and how it was checked separately from completion status, while retaining required gates.
- Accept case variations in reviewer invariant labels while preserving the original evidence, so valid challenge findings can proceed to action validation.
/develop:setupno longer stops at the permissions merge when the gh-write guard reads the retiredBash(gh api repos/*:*)allow rule in the command text as a gh write. The retired allow rules now ship inpermissions-allow-retired.jsonand reachmerge_settings_permissions.pythrough the new--drop-allow-fileoption, sosettings.jsonloses the same rules and the command no longer namesgh api. The merge also stops with settings unchanged when a retired-rules file is null or holds a non-string entry or an option path is empty, and refuses a drop or retire option given without the allow or deny merge it modifies.
- Review loops add a pre-baseline attestation: before the first review of a diff the parent or its resolver wrote, the author lists each changed behavior's invariant, sibling routes, consumer and failing-before/passing-after check, and fixes the gaps within scope. Fewer avoidable defects reach a paid independent review. The reviewer never sees the attestation, it never counts toward scoring or clean acceptance, and it is skipped for review-only requests, unauthored code and continuations of a prior ledger.
adversarial_loop.py --append-metricsrecords each round's cost (route, brief bytes, duration, tokens, attested gaps; unknown values staynull) in an advisoryloop-metrics.jsonlbeside the ledger, so later investigations can price review rounds. It never affects scores, recurrence or clean acceptance.- The loop rule names where a first-reported finding's origin class is stored (an
origin:evidence entry), so missed versus fix-introduced defects can be counted from the ledger. - Review loops report why a stalled round stalled:
adversarial_loop.py --plateau-kindprintsstuck(the fix did not land),whack-a-mole(the fix exposed new siblings) ormixedon stderr, and the loop rule recommends the matching next step. It is informational only and never changes the stop decision, exit status or JSON summary. - The cost log's
routefollows a shared vocabulary (parent,agent:…,bridge:…,codex:…,other:…) so routes can be joined to outcomes, and--appendwarns, never refuses, when a finding first reported after round 1 has noorigin:evidence entry. - Review loops can pilot a leaner reviewer brief:
adversarial_loop.py --brief-armassignsleanorfullper run directory, only for loops that are not filter or gate reviews and have no open security or critical finding. The cost log records the wording sent (brief), so about 10 runs can be compared by first-reported weight, rounds and brief size. A high or higher severity finding first found after a lean baseline pauses the lean arm. - The review-loop cost log and pilot flags are hardened: a rejected cost record now only warns (
warning: metrics-rejected:…) and no longer hides the committed round's summary or progress table; records bind only to a valid current ledger, take fractionalduration_s, keep one stripped route per line even after a partial write, and abrief-arm-pausefile carries the lean-arm pause.--brief-armrefuses to combine with another action,--plateau-kindspeaks only at a plateau or non-converging stop, theorigin:warning also fires for an unknown class, and the attestation goes to a randomly named temp file outside the workspace so a reviewer cannot derive its path, andattested_gapsisnullwhenever no attestation was written.
- Blueprint manifest re-checks reject unsupported shell forms and command overrides. Stale or tampered entries cannot regain auto-approval through the following forms:
- Parameter expansions beyond supported reads.
- Arithmetic beyond read-only
$((…))expressions. - Malformed or unterminated heredocs.
- zsh glob qualifiers and misplaced array assignments.
- Shell options outside
pipefail,errexit,nounsetandnomatch, including wrapped or constructed flags. - Wrapper options requiring operands.
- Lookup-variable writes, including disguised names, invisible characters and arithmetic operands.
- Unsupported
$expansions and named-descriptor redirections. - Unmodeled brace compounds, including inside nested
casearms. - Command-shadowing functions and
source/..
- Blueprint checks keep ordinary text operands and quoted-delimiter heredocs as data, while checking command substitutions across lines in unquoted heredocs. Quoted assignment text avoids false rejections, and dangerous commands cannot hide in expanded heredoc text. Shell script paths held in variables require
--before the path to remain auto-allowed. - Blueprint checks and sentinel reads accept literal string-only
printf/printformats with fixed widths, literal percent signs and newline, tab or backslash escapes. Supported formatted output remains auto-allowed under the stricter checks. Nonliteral formats, non-string conversions and unsupported escapes are rejected. Every format word is checked against that closed list whatever its first character, so a dash-leadingprint -forprintfformat can no longer write a lookup variable, whileprint -rf,printf -- '-%s',env printfand inert quoted text stay allowed. - Sentinel reads require plain target names and reject lookup variables, prompt strings, hook arrays and command tables. Only empty
IFS=prefixes onreadare allowed, preventing other field-separator writes and shell-environment changes. Arguments accept supported variable reads, literal or variable defaults and trims; unsupported expansions and named-descriptor redirections are rejected. - Review → fix loops now keep a round ledger and progress table, making review history visible. Repeated invariants are tracked across all earlier rounds, including renamed findings, requiring root-cause evidence on repetition and stopping at the third occurrence. Action invariants must match their ledger findings after whitespace and case normalization, preventing inconsistent recurrence tracking.
- Filter reviews require grammar coverage across every reader, exposing unmodeled constructs as findings and preventing clean verdicts with incomplete coverage. Repeated filter failures require defaults that reject unmodeled input, preventing another narrow bypass fix.
- Debug compaction labels its test target
test_path=. The block remains auto-allowed under lookup-variable write checks.
- The adversarial-loop rule and the challenger dispatch rule list a reviewer reply truncated before its required closing block (envelope or
## Confidence) as an agent failure, so a cut-off reply is no longer scored as a complete round with fewer findings. Where the host can continue that reviewer, the parent asks it for only the remainder, in replies short enough to pass the transport, until the closing block arrives; a reply that adds nothing new records the failure.
- The adversarial-loop progress table shows security findings in their own
Securitycolumn ahead ofCritical, instead of folding them intoCritical, so a reader sees how many open findings are security bypasses. Score weights and theWeighted scorecolumn are unchanged. - The adversarial-loop rule treats any reviewer round that returns no deliverable, a refused findings write, an unparsable envelope, a safety-classifier stop or a
blockedenvelope as an agent failure, records its cause inloop-report.md(never as a round, where it would read as a clean review), re-dispatches that reviewer once with a brief that removes the cause, switches to another permitted reviewer route if the same one fails again or cannot be re-dispatched (no attempt left, no approval, or a cause no brief can remove), and stops asindependence-unavailableonly when no route remains, instead of letting the round drop out asnot-run.
- Adversarial review loops treat a
foundry:challengerround that returns no deliverable or ablockedenvelope as an agent failure, never a silentnot-run: the cause is recorded and the round re-dispatched once. Security-filter reviews keep Codex enabled, so the challenger runs the bypass search through its Codex cross-check and needs no separate Codex row. - The file-handoff protocol lists the report names Claude Code refuses for a subagent Write (
findings.md,report.md,summary.md,analysis.mdand suffixedfindings-*.md), so an agent names its file after itself and the report is no longer lost.
- The runtime
blueprint-allow.jshook refuses, even on a manifest hit, every command that can point a command name at another program:hash,builtin,alias,enable,functions,evaland their kin; any mention of the zshcommands/functions/aliasesor bashBASH_CMDS/BASH_ALIASEStables, attached option prefixes included (set -Acommands);set -A,read -a,printf -v, name references and indirect expansions. Spellings that slipped past the earlier per-spelling checks, such asset -Acommands ruff /bin/echoandbuiltin -- hash -p …, are now refused. - The same hook reads each command as the shell's own words before judging it: quotes, backslash escapes,
$'…'strings and line continuations are resolved and joined, and redirections are set aside with their targets.\rm,r""m,h$'a'sh,\-vandco""mmandstherefore count asrm,hash,-vandcommands, and a redirection such asprintf 2>/dev/null -v …or2>"a b" set -A …no longer hides the option or the command. A command word written as a pattern that can expand to a refused name (/bin/r?,{ha,}sh) is refused. The hook reads past the zsh precommand modifiersnoglob,nocorrectand-and past a wrapper's own arguments (timeout 5 set -A …), and it judges the command text carried by a shell's-c(after options such as-o shwordsplit), atrapaction,watchandenv -S, sonoglob rm -rf xandzsh -o shwordsplit -c 'set -A …'are refused. An option written after another option's argument (set -o noglob -A …,read -t 5 -a …,print -f '%s %s' -v …) still counts. Text the reader cannot settle is refused rather than guessed: a command that ends inside an unclosed quote; a$'…'escape bash and zsh decode differently, wherever it stands, assignment and redirection target included (a NUL byte,\u…,\c…, an unknown letter such as\m, an octal value above\377); an expansion inside a command word (h${x}sh); and a pattern among a wrapper's words or a POSIX bracket class in a command pattern (command h[a]sh …,/bin/r[[:lower:]]). A shell's-cscript written after--is judged like any other. Short options are read as clusters, sozsh -co shwordsplit '…',zsh -xo name -c '…'andenv -iS '…'still reach the carried script, and every argument after a-ccluster is judged as script text. A/inside an expansion (h${x:-/}sh) no longer counts as a path separator.unset -f,-For-m, which remove a function that shadows a command, is refused likeunalias. A-cstring counts as a bare variable (bash -c "$METRIC_CMD") only when it is exactly that variable, so invisible Unicode whitespace around it no longer makes the hook and the generator disagree. An expansion whereprintf,print,set,read,unsetor a declaring builtin still reads options (printf "$o" …) is refused, since its value may be-vor-A. A quoted or escaped prefix ('h'${x}sh) no longer hides an expansion inside a command word, and a bracket class holding a quote or backslash (h[\!a]sh) is matched as any one character. The command after a zsh short or brace form (for x (a) cmd,select x (a) cmd,if true { cmd },while … { cmd },repeat 1 cmd) or after bashcoprocis judged like any other command. The&of2>&1or&>no longer splits a command in two, an escaped quote in$'\''no longer ends the string early (also when a line continuation splits$from'), a parenthesis inside a quoted string no longer ends a$(…), and a{fd}>redirection is set aside like2>. - The blueprint hook refuses a command whose raw text has a backslash-escaped blank at a line end or before
#. The shell ends the command there, or keeps the rest of the line as an argument, while normalization would read a continuation or a comment, so a shipped digest could approve a different command. No shipped block contains the shape. - The sentinel-read shape lane judges every word a
readreceives: a sensitive variable such asPATHnamed anywhere, attached to an option (-aPATH) or after an option's argument, or a computed name (read "$V") refuses the command. Only the first name was checked before, soread -r IGNORE PATH < filecould rebind command lookup without a prompt. - The plugin's blueprint manifest no longer auto-allows a line that is not a complete command on its own, a block that writes heredoc data, a block that sources a state file, or one that runs a variable's value as a command; those run after a prompt.
- Follow the active Codemap provider’s automatic missing/stale-index preparation contract, preserving explicit confirm-first and frozen preferences across later tool calls and nested query helpers.
- Disabling Codemap now disables only structural lookup: feature, fix, refactor and batch loops still select heuristic tests, execute them and propagate failures.
- Helper scripts that write or read a session sentinel (
dev_run_dir.py,dev_parse_args.py,dev_codemap_gate.py,codemap_resolve.pyand the otherbin/sentinel helpers) fall back to/tmpon POSIX whenTMPDIRis unset, the directory a skill's${TMPDIR:-/tmp}names, instead oftempfile.gettempdir(), which picksTEMPorTMPfirst. With either set,dev_run_tests.pyreported an unresolved runner (exit 64) and the red gates could not see its verdict file. Native Windows keepsgettempdir(). - Keep supported review source judgments separate from blocked verification and include the reviewed full commit SHA in report headers; retain explicit unavailable identity for unversioned or historical abbreviated sources.
- Keep the working-tree-base qualification for explicit review targets even with
--worktree, so dirty existing worktrees and external paths are not labelled committed source. /develop:fix,/develop:featureand/develop:refactorrun tests through the newdev_run_tests.pyinstead ofeval "$PYTEST_CMD …"andeval "$TEST_CMD":pytestmode appends literal arguments to the allow-listed pytest runner,suitemode also acceptstox,tox -q,make test,npm test,cargo testandgo test ./.... A planted or foreign-owneddev-pytest-cmd/dev-test-cmdsession file, or a project test command outside that list, or an unresolved sentinel, is refused with exit 64 and nothing runs, so a gate never mistakes a refused command for a failing test (1), an interrupted run (2) or a missing runner; a crash inside the wrapper and invalid wrapper arguments also exit 64, and a reader that closes the output pipe early does not change the status; a test command that itself exits 64 is reported as 2, never 1, so it cannot pass a red-demo gate. The gates infix,featureandrefactorname exit 64 as a runner that refused to start. Gates that cut output with--tail Nkeep the test command's own exit status.dev_run_tests.py pytestanddev_run_repro.py(/develop:debug) read a pytest exit of 1 as a reproduced failure only when the output carries pytest's failure summary (a wholeN failed … in Xsstats line, or aFAILED path::testline naming a test node id; colour codes from--color=yesare ignored, and the same text inside an interpreter error message does not count): a missing pytest, a plugin that cannot load or a startup hook that exits 1 now returns 64 from the wrapper and aGATE ERRORfrom the debug runner instead of unlocking the fix step (with-qqq --no-summarya real failure prints no summary, so that setup is reported as no test run). The project's ownconftest.pyand pytest plugins are trusted: they run inside pytest and could print a counterfeit summary, so the check catches a runner that never started, not a project faking its own results.- The
/develop:fixreproduction and Outcome B gates and the/develop:featuredoctest demo gate accept exit 1 only together with afailed <nonce>verdict thatdev_run_tests.pywrites to thedev-tests-verdictsession file, where the gate exports a fresh nonce for every run and trusts the file only when it is a regular file the user owns: a Python that dies during start-up (for example a brokenPYTHONHOME) also exits 1, and used to printGATE OKwithout any test running. The gate never writes the file itself, and the wrapper replaces it without following a link planted at its name. A session id outside[A-Za-z0-9_-]records no verdict, so the gate stops instead of reading a file another session shares. The example-script demo gate first checks that Python can run a script. The demo gate block no longer carries an inline comment that kept it out of the blueprint manifest, so it runs without a permission prompt again. dev_run_repro.py(/develop:debug) anddev_run_tests.py --tailenforce their 600 s cap on the whole run: output is read on a helper thread, so at the cap the test command is killed and the gate returns even when a test worker it started keeps the output open. Such a worker is not killed and runs until it exits by itself.- The
/develop:featureexample-script demo gate reads the demo's own status throughpipefail(no log file under$TMPDIR), accepts only exit 0 (feature may already exist) or 1 (red demo), and stops withGATE ERRORfor any other status; before, every non-zero status counted asGATE OK, because the pipe reported the status oftail. - The runtime
blueprint-allow.jshook treatsuv runandpoetry runas carrying their wrapped command and flagshash name=/path,hash -p /path name(also the attached-p/pathand bundled-rpspellings),builtin hash …and any write to the zshcommands/ bash 4BASH_CMDStables (commands[x]=,commands=(…),+=,${…:=…},printf -v,read -A, or a write nested in a lookup subscript such as${commands[$(…)]}; a plain${commands[x]}or${commands[$name]}lookup stays allowed), so a destructive command behind one of those, or a rebound command name, is refused even on a manifest hit. /develop:planand/develop:featureread the derived module and function from per-session sentinels written byderive_codemap_target.py --keep-stateinstead of runningevalon its output; option abbreviations are not accepted, so a goal starting with--keepstays goal text.- The propagated quality stack builds its runner array from a closed
caseinstead ofeval, so a missing, stale or plantedquality-stack-runnersession file stops with! BLOCKEDrather than running or silently falling back topython -m. The runner blocks of the quality stack are no longer pre-approved by the blueprint hook (the runner array is an expansion in command position, which the hook declines), so they prompt where theevalform ran silently. /develop:featurecounts only a failing run (exit 1) as the red demo: an interrupted, internal-error, usage-error, no-tests or refused run now stops with! GATE ERRORinstead ofGATE OK.Bash(eval:*)is no longer in the shipped allow list and/develop:setupremoves it fromsettings.json, including an identical entry added by hand: ad-hocevalcommands now prompt, while shipped blocks no longer useeval.
/develop:reviewtest gaps default to[low]and reach[medium]only for a changed (or, for file and directory targets, reviewed) public entry point with no tests; the checklist anchors documented-contract violations at MEDIUM, and the blocking section sets placement, never severity.- The
/develop:reviewconsolidator keeps each root-cause-merged row with its own validated severity and section, so/oss:resolve(requiresossplugin) can fold it into the survivor's item with the group's strongest routing. - The shared file-handoff protocol adds an
unsupporteddecline status that orchestrators surface as a routing miss instead of a timeout.
- Narrow broad
find,node,claude, andsedallows while retaining scoped read-only rules and broadeval/pythonfor existing recipes; ad-hoc commands outside shipped blocks now prompt unless a narrower rule covers them. Setup removes the old broad entries fromsettings.json, including an identical entry added by hand. - Shared keep-state and codemap helpers reject unsafe sentinel slugs or session IDs before changing state, while codemap keeps its documented
sharedsession fallback. /develop:featurekeeps its TDD cycle count and 30-minute wall clock across Step 4 → Step 3 returns, so the 5-cycle cap now trips across review returns instead of silently resetting; each new run still starts from zero./develop:refactorkeeps one wall clock per run the same way (its cycle count still resets per Step 4 pass, as documented), and its Step 4 loop states a single increment site, so a change-test pair no longer counts twice./develop:refactorwrites its characterization-gate exit to its owndev-refactor-gate-exitsentinel instead of thedev-gate-exitsentinel/develop:debugalso writes, declares<module_name>,<target_module>and<test_file>as substitution tokens (unsubstituted,evalparsed them as shell redirects), and no longer trips the mixed-goal split question on "add type annotations/hints" goals./develop:featureruns the pre-change baseline suite once, at the pre-loop gate, instead of a second identical run in TDD step 1; no longer claims solo Step 4 spawnsfoundry:qa-specialist(edge-case tests come from team mode Wave 2 or the quality stack's Progressive Review); and the "no test suite" Branch Safety Guard branch now keys on the full-suite run exiting 5, not on a missing$TEST_CMDthat the gate already blocks./develop:setupvalidates the merged~/.claude/settings.jsonwithpython -m json.toolinstead ofjq: on a machine withoutjq(native Windows) the validation used to exit 127 and restore the backup over a good merge. Setup and the README now say to re-run/develop:setupafter foundry's rules are delivered or removed, so thedevelop-quality-gates.mdlink switches between the delta and full form.parse-skill-flags.pyno longer drops a--keepvalue whose quotes the shell consumed when the host substituted$ARGUMENTS(--keep "a b"used to arrive as--keep a band persist an empty keep list); it now also accepts--keep 'a b'and--keep="a b", strips a dangling--keepfromCLEAN_ARGS, and warns on stderr when the value was unquoted or empty, so a lost compaction keep list is visible instead of silent./develop:debug,/develop:feature,/develop:planand the shared--planpre-flight read parsed flags from per-sessionparse-skill-flags.py --keep-statesentinels instead of runningevalon script output, leaving the compaction contract alone (--inlined).parse-skill-flags.pygains--keep-state,--out-fileand--inlined(synced from oss).dev_load_shared.pyapplies the same source-repository gate on its cold path: with no usabledev-sharedsentinel and no installed develop plugin, a working directory without develop's own manifest gets one! BREAKINGline and exit 1,--optionalincluded, instead of the planted document's text.resolve_shared_path.pywithout a registry or cache hit uses a cwd-relativeplugins/<dir>/...tree only inside that plugin's own source repository (its.claude-plugin/plugin.jsonnames it); elsewhere it exits 1 with a!message, so a repository under analysis can no longer supply the codemap-py contract or the foundry compaction gate path.dev_shared_resolve.pywithout an installed develop plugin prints the cwd-relativeplugins/cc_develop/skills/_sharedonly when the working directory is the develop source repository (itsplugins/cc_develop/.claude-plugin/plugin.jsonnamesdevelop). In any other repository it exits 1 with a!message and--initwrites no sentinel, so a repository under analysis can no longer supply the protocol docs a develop skill loads.heal_git_artifacts.py worktreeskeeps unregistered directories unless--include-orphansis passed, re-checks one right before deleting it, reports symlinked children as skipped and rejects a*managed prefix. The worktree-isolation leftover report and its approved removal both pass--include-orphans, so the list you approve and what gets removed stay the same./develop:plan,review,fix,refactor,debugandfeatureload their shared protocol docs through the newbin/dev_load_shared.py: one command per load instead of a sentinel read, a fallback and a cat. An empty or stale shared-dir sentinel now re-resolves the install instead of failing on a dead path./develop:reviewchallenger brief now uses the consolidator's severity map (Blockers → critical/high, Concerns → medium, Nitpicks → low), so challenger findings rank the same as the other reviewers'./develop:feature,/develop:fix,/develop:debugand/develop:refactorkeep a quoted--keepspec intact, read the cleaned arguments for slug, issue and Codemap-target detection, and write the negated-flag sentinels under a variable-named file too (for examplechallenge-enabled), keeping the flag-named file as an alias.- Sentinel writes in the bin helpers are atomic (temp file, then replace), so a symlink planted at a predictable sentinel name in a shared temp dir is replaced, never followed; the plan namespace stays confined to
dev-plan-*under the temp dir. - Sentinel writers in the bin helpers refuse a sentinel another user already owns (the write fails with an error instead of reusing a planted value; the codemap currency status is skipped), every directory they create is mode 0700, and the codemap gate rejects a plan namespace that is a symlink, a regular file or another user's directory.
extract-keep-flag.pygains the same owner refusal and 0700 state directory. Sentinel names and paths are unchanged, so existing skill reads keep working. /develop:fixand/develop:debuggate on the real pytest exit code: only exit 1 printsGATE OK, exit 4, 5, 127 or any other code printsGATE ERROR, and an empty runner command is refused instead of being misread as a reproduced bug.bin/dev_run_repro.pynow runs the reproduction./develop:fixruns the final gate once when the project's test command is not plain pytest, since the quality stack only runs pytest; a NOT-for or non-Python abort now points to direct editing or the native toolchain, not/develop:feature./develop:featureand/develop:refactor--teamruns now execute the Step 5 quality stack and the final gate before the Final Report, and never report the suite green earlier; the feature challenger decision is two-state and the impossible pre-implementation QA challenge is gone.--teammodes drop the liveness probe and the*-team-checksentinel; teammates are watched through armedagent_watch.pydeadlines (1800 s), and spawn prompts carrynameanddescriptionslots with a delta-first first line.bin/setup_worktree.pyno longer accepts or creates a health sentinel./develop:featureteamsw-engineermay create newtests/files for its own red-green tests; existing test files stay QA-owned./develop:review --worktreenow reviews the last commit: the resolver gains--committed(HEAD~1..HEAD), because a fresh worktree starts clean atHEAD.resolve_review_target.pyexits 1 for a missing path or a target with no Python file, caps its Python scan at 200k entries, and the review skill stops on that exit./develop:reviewconsolidator records new or strengthened claims as null-disposition candidates with an open concern and lists them in the new envelope fieldnew_claims;Editis dropped from the review tools./develop:plankeepsCLEAN_ARGSin the plan namespace for the slug, keys the depth checkpoint on the goal, lets Revise edit the plan in place, and routes blockers throughAskUserQuestion; the breaking-change gate revises once and then re-gates.ci-log-extractfetches, strips and falls back in one self-contained fence and reloads the digits-only run ID; batch mode ships its run fence with an owner stamp so a staleBATCH_IDfrom an aborted run is discarded.- Issue bodies are fenced as untrusted data, an invalid
dev-upstreamrepo override exits 1,issue_fetch --repois validated as[HOST/]OWNER/REPO, option-shaped pytest targets are rejected,--log,--record-dirand the codemap batch output are confined to the working directory or temp dir, plan-mode--pytest-cmdis checked against the runner allowlist, andextract_json_fieldcaps input at 1M characters. dev_shared_resolve.pyannounces its working-directory fallback on stderr;sync_rules.pyrejects a plugin name outside[a-z0-9][a-z0-9-]*; the codemap currency sentinel is written atomically.- The codemap gate, issue fetch and worktree setup wrappers time out (60, 120 and 30 s) and fail closed; new shared-sentinel and wrapper tests cover them.
/develop:setupprobes the barepythoncommand only, with nopython3orpy -3fallback, since every later step runs barepython.- The shared agent-resolution fallback tiers for
qa-specialistandlinting-expertaresonnet, matching their frontmatter. - The quality stack uses
uv runonly when the project has auv.lockandpoetry runonly with apoetry.lock, so a project without them no longer fails on a missing runner. It runs ruff through the project's pinned pre-commit hooks when the config pins it, avoiding version drift against CI, and saves the loading plugin's shared directory to a sentinel so later steps stop withBLOCKEDinstead of reading an empty path. resolve_shared_path.pyrejects an absolute (/etc) or empty-segment (skills//_shared) subdirectory and a plugin name with a trailing newline, which could resolve to a path outside the plugin install. It also reads its own plugin name fromplugin.json: in the installed cache the directory name is the version number, so the own-plugin lookup never matched there.extract-keep-flag.pyno longer clears a compaction contract that another session owns or that an inlined--keepalready wrote, so a parallel session's resume state survives. It also validates the slug and session ID and writes its sentinels atomically.verify_blueprint_audit.py verifyreports an audit-log line nested deeper than Python's recursion limit as a damaged line, like invalid JSON, instead of crashing the whole check.- The report-delivery hook recognises a
/research:topicfollow-up question that offers/research:topic planas that workflow's own gate, so its report path, title and header-table checks apply instead of being skipped. /develop:reviewmoves each dimension brief and the Security augmentation into its owntemplates/brief-*.mdfile; the parent passes only the directory and each child reads only its own brief, andbatch-mode.mdmoves its bisect section to_shared/batch-bisect.md, loaded on the failure path only.- Skills load
worktree-isolation.md,codemap-context.mdandci-log-extract.mdonly when worktree mode, codemap or a CI run ID applies, andfixandrefactorno longer loadpreflight-helpers.mdtwice. - New
bin/dev_batch_gate.pyprints the batch-mode verdict forfeatureandrefactor;dev_run_dir.py --persist <skill>writes the run-dir sentinel atomically;dev_shared_resolve.py --initwrites the shared-dir and agent-watch sentinels in one call;dev_test_targets.py --skill {feature,fix,refactor}reads the runner and run-dir sentinels, and an empty runner exits 1. - Compaction boundary blocks in
fixandreviewcallbin/compaction_boundary.py, and six contract writers pass--keep-sentinel dev-<skill>-keep-itemsinstead of reading the keep sentinel inline. /develop:setupmerges the shipped allow and deny rules throughmerge_settings_permissions.pyin one atomic write, so allow can no longer land without deny and the deny-rollback branch is gone./develop:debugaborts with! BLOCKEDwhen the symptom-mode test path is left unsubstituted or empty, and its timeout handling relies on armedagent_watch.pydeadlines instead of a sentinel andfind -newerprobe.- Test-run policy, substitution-token and issue-ID parsing rules are stated once per skill and cross-referenced;
planno longer mentions Codex corrections or a Codex design review it never runs. /develop:debugderives its file-name slug once after mode selection, so the Step 1-3 analysis, blocker and hypothesis files and the Step 4 diagnosis share one name; issue mode stops with! BLOCKEDinstead of fetching an issue from raw, flag-carrying arguments; the compaction contract keeps the test path; team mode persists its run-dir timestamp; the lead cross-checks competing hypotheses inline, and the Step 1sw-engineerwrites its analysis file as a watched deliverable./develop:fix --teamprompts read~/.claude/TEAM_PROTOCOL.md(the${HOME}form never expanded inside a prompt; same fix in the feature team prompts and the shared spawn template), no longer send teammates to the lead-facing spawn template, and the health check stops instead of inventing a fresh run-dir timestamp when its sentinel is lost./develop:featureand/develop:refactorstage checkpoint lines and accepted-risk records incheckpoint.md.recand append them withappend_ledger.py, like/develop:fix, so the resume offer has step lines to read./develop:plansaves a prose-wrapped feasibility reply to.temp/develop/and recovers the role verdicts from that file, replacing the unrunnableecho "$RESPONSE"pipeline./develop:plannow writes a compaction contract before each gate that waits on you (debug-cycle cap, breaking change, challenger blockers, final Proceed/Revise) and ends those questions with a/compacthint naming where the scope findings or plan are saved, so compacting during a long wait resumes without losing the goal or plan path; a crashed run's stale contract is cleared at start and the contract is removed when the plan ends. The effort-sizing and challenger blocks now stop with! BLOCKEDon a lost namespace sentinel instead of reading paths at the filesystem root, and the plan namespace directory is created private (mode 700), so other users on a shared temp dir cannot read or plant plan state in it.--teamin/develop:feature,/develop:fix,/develop:refactorand/develop:debugchecks for~/.claude/TEAM_PROTOCOL.mdbefore creating a run directory and stops with one shared! BLOCKEDline naming/foundry:setupwhen it is missing — feature no longer offers to silently continue solo, and the other three no longer spawn teammates told to read a missing file. Team spawn blocks also stop when the run timestamp or run-dir sentinel is lost, instead of building empty output paths./develop:debugdrops the partial-install check for/develop:fix, which ships in the same plugin and so could never be missing./develop:reviewloadscodex-prepass.mdwithcatlike every other shared doc, and prints the report date and the Codex-output path from shipped blocks instead of assigning them in prose.dev_parse_args.pyspec mode rejects a variable name that is not a shell identifier, since itsVAR=valueoutput iseval'd;read_sentinelignores a sentinel owned by another user, so a value planted in a shared temp dir never reaches a command./develop:reviewdetects a PR number after flag parsing:dev_parse_args.pyclassifies the flag-stripped target into the newdev-review-pr-numbersentinel, so42 --fullnow offers/oss:review 42, a quote or newline in the arguments no longer breaks the gate block,/oss:reviewreceives only the bare number, and a missing clean-args sentinel reviews the diff instead of the raw argument text./develop:reviewchecks for the oss plugin through Claude Code's install record instead of globbing the plugin cache, so an orphaned oss version left in the cache no longer offers a/oss:reviewthat cannot run./develop:reviewships its own severity checklist (templates/review-checklist.md) instead of reading the oss plugin's, so review agents and the consolidator apply severity anchors without oss installed; PR/issue-linkage patterns a local diff cannot satisfy are left out./develop:fixPart A reports a candidate test that could not run (pytest exit other than 0 or 1, such as a rejected runner) as! GATE ERRORinstead of letting it pass for "Outcome A: fails already".review_impact_tier.pyreads at most 10 MiB of diff-impact JSON; larger input is not parsed and/develop:reviewfalls back to theFULLlineup instead of holding the whole payload in memory.- The quality stack (
foundry--quality-stack.md) halts on a failing doctest in the separate doctest pass (GENUINE FAILURE) and on any other non-zero pytest exit except 5 (CONFIG ERROR), instead of recording the exit code and reportingnot-mergedwhile the run continued. resolve_shared_path.pyno longer executes aplugins/<dir>/bin/get_plugin_install_path.pyfound in the working directory; it runs the helper shipped beside itself, and ignores a registryinstallPathoutside~/.claude/plugins/cache/borda-ai-rig.blueprint-manifest.jsonis regenerated with the allowlist gate: 906 of the 936 entries the previous gate admitted stay auto-allowed, including the quality-stackeval "$RUNNER …"fences and theeval "$PYTEST_CMD …"andeval "$TEST_CMD"gates. Only single lines lifted out of those blocks drop out, because their runner variable orcasecontext lives elsewhere in the block; the whole blocks still match.- The bundled
blueprint-allow.jsrefuses a manifest hit that hides a destructive command behind acasearm label or inside a function definition (case x in a) rm -rf /;; esac,f() { rm -rf x; }), which it let through before.
- Sync
write-guard.js: a tracked file never asks, and an untracked or gitignored file asks only forCLAUDE.md,AGENTS.md,.claude/settings*.json,.pre-commit-config.yamlandpyproject.toml..github/**,CHANGELOG.mdand lockfiles are no longer protected, so editing a newly created file there no longer prompts on every edit. A protected file that does not exist yet asks once on creation; later writes to it in the same session pass.
/develop:planstep tables gain aVerificationcolumn for simple and staged plans (fix plans already had one), and each savedSuggested approachstep ends with— verify: <check>, so/develop:featureand/develop:fixreceive it./develop:feature,/develop:fixand/develop:refactorwith--plan(or an inline-generated plan) record the plan file's hash through the newbin/plan_hash.pyand re-check it first in the Final Report; a change leads the report with! BLOCKED — plan changed during build. Detection only:.plans/is gitignored, so edits leave no diff, and nothing is reverted.- Sync the file-handoff protocol: a tool or permission denial that blocked part of a task returns
done_with_concerns, neverdone.
/develop:reviewand/develop:fixfollow foundry's non-blocking compaction boundary gate through the shared compaction contract: anadvisedecision continues with the next phase and shows a short one-line/compacthint at the next natural pause; onlyFOUNDRY_COMPACT_GATE=stopholds the run untilcontinue.
- Sync
write-guard.js: a protected file git already tracks no longer asks before a write, since the write is diffable and revertible; untracked, new and gitignored protected files still ask, and.claude/settings*.jsonand.pre-commit-config.yamlalways ask. - Sync the adversarial-loop rule: reviewer briefs that run adversarial shell cases require case files written with a file-editing tool and fake
gh/gitbinaries.
- Keep review coverage and confidence gaps as factual limitations; require a specific user decision for additional review and omit declined requests from findings and final actions.
- Sync the cross-validation protocol, and state in the review consolidator prompt that aggregate
readiness: completerequires every assessment complete and no open concerns, and that a missing required role or anullcandidate makes the aggregateincomplete, overridingblocked, also under a null aggregate outcome.
- Sync the quality-gates rule: after each validated adversarial-loop round, print the progress table exactly, with all rows kept and each cell as
old + new.
- Sync the cross-validation protocol: assessment evidence and limits are string arrays, open concerns cover only UNVERIFIED or pending candidates, and an open candidate forbids complete readiness.
- Render reviewer attribution with readable role names and square-bracketed ratings, omit execution-origin labels, and display null judgments as “no source judgment.”
- Gate existing compaction boundaries with persisted metadata and optional Foundry
compact_gate.py; append the fix checkpoint before writing its contract. Follow-up questions carry the report path and key outcome, while the final reply preserves the full report header. - Route skill questions through saved-content and plain-summary delivery without previews, using persisted session/digest ownership metadata and atomic contract writes.
- Validate each review candidate against allowed source evidence before publishing findings; retain revision, checks, counterevidence, disposition and durable open concerns through remediation.
- Define source ratings as 1 approve, 2 minor edits, 3 major revision, 4 insufficient-but-promising, and 5 reject only for an evidenced conflict with binding constraints. A completed undecidable assessment (
null) differs from a missing reviewer; neither implies rejection or approval, and ratings never replace the aggregate verdict. - Breaking report-intake change: add versioned
review-validation.jsonwithsource-5-v1ratings andREVIEW_V1_PASS/REVIEW_V1_BLOCK/REVIEW_V1_REJECT_<GROUND>gate headers. These prefixes deliberately block legacy resolver intake: upgrade the resolver and rerun its report gate rather than stripping the prefix.
- Remove shipped repository-API, GraphQL, branch and tag allow grants; new installs use normal permission handling, including routine-read prompts when no other grant matches. Remove shipped GitHub-write and local branch/tag-deletion denies while retaining force-push and mirror-push denies.
- Develop setup preserves existing repository-API, GraphQL, branch and tag allow entries because Foundry may also have installed them; standalone users remove them manually. Foundry setup owns stale GitHub-deny cleanup.
- Add an optional
gh-readdecision lane after blueprint and shape; a missing optional module falls through.
- Require the report header in the first follow-up question text or in every eligible option preview before
develop:reviewproceeds; record delivery only after the question is shown. When the full header exceeds preview limits, use a compact summary and saved-report path. - Warn about stale session state and offer a choice; debug/fix hypothesis teammates are read-only, while team edits share the orchestrator worktree and need no separate teammate merges.
- Add
--force-if-includesand mirror pushes to Develop’s explicit force-push deny list. The agent router resolves the newest Haiku model dynamically from environment/cache/API and falls back with diagnostics.
- Require evidence-backed findings and completion claims in review and fix; retain representative real-case acceptance, use mocks only as supplementary checks, and do not weaken assertions or requested behavior.
- Retry transcript reads for up to two seconds before denying review-header delivery; report the visible-reply character count and distinguish thinking/reasoning and tool output from user-visible delivery.
- Keep the report-print exception available and enforce Stop when
develop:reviewfollow-up is skipped; return a short terminal summary while retaining full findings in the report. - Account for confidence with two-decimal gap deductions summing to
1 - score; use(-0.00)for nonreducing limits and one residual entry for unexplained shortfall.
- Add a native Windows Python launcher and runtime probes, preserving workload arguments and exit status; use portable launcher commands in the existing adversarial-log instructions.
- Add a portable
pythonfallback for hosts that only providepython3; Develop hooks also probe for Node and report once when hooks cannot run.
- Require strict score descent for unchanged scope; plateau, increased score, stale evidence or a stricter caller budget stops the loop. Completion questions are conditional on missing decisions or authority, and authorized next actions continue without an unconditional skill menu.
- Remove the arbitrary three-review cap: strict integer score descent bounds reviews while stricter caller budgets still apply.
- Record append-only adversarial round logs with a split header and staged-append protocol while retaining historical-reader compatibility.
- Make debug’s hypothesis ledger append-only and select review depth from the Codemap code path rather than diff size. Run the challenger at every diff size;
--challengebecomes a compatibility no-op and--no-challengedisables it. - List Codex-eligible mechanical findings under Recommended Next Steps; review names candidates for the fix workflow or user and never invokes
bridge:implementor edits code itself.
- Correct Develop’s GitHub repository API allow rule and migrate only the exact obsolete entry in setup.
- Add
dev_test_targets.pyto select focused tests from fresh, complete Codemap impact data or fall back to name/import heuristics; record selections intest-targets.jsonl. Feature, fix and refactor loops run targeted tests, then require a fresh full-suite gate after any later fix. Agent-watch notifications/deadlines have an explicit timeout fallback.
- Correct a stale step reference in
develop:debugand split long Markdown prose without changing its instructions.
- Create worktrees before asking about existing trees, and report a leaked worktree only when creation retries fail with a matching path or branch.
- Warn when loaded plugin paths are stale and clean up report-template attribution.
- Deliver Develop’s quality-gate deltas only when Foundry ownership is verified; tests compare the full rule with its reduced delta.
- Batch non-overlapping edits and tests into fewer test runs in
develop:featureanddevelop:refactor; failures bisect the batch, and--no-batchopts out. Probe parallel runners, merge doctest collection, retry focused failing nodes and classify isolation failures. - Breaking report change: use the Final Report Doctests values
pass/fail/not-merged, replacing the earlier pass/fail contract; failed merged collection uses a separate doctest pass and reportsnot-merged. - Repair zsh multi-token runner expansion and pipeline-exit capture across workflows.
- Split long helper functions in Develop’s
bin/modules and addmain()docstrings; refresh its blueprint manifest.
- Move six Codemap test files into
tests/codemap/and update affected repository-root anchors. - Expand adversarial review coverage to first-pass inventories, invariant/original/consumer/sibling evidence, finding-origin accounting and the loop-actions schema 2.
- Reject CLI-option-shaped Codemap module names before subprocess calls, contain Git-artifact cleanup within the selected repository, atomically replace propagated rules, and handle oversized audit lines without crashing the verifier.
- Make
develop:reviewfail closed when its run directory is missing, correct challenger-severity and checklist handling, and surface breaking changes explicitly for background callers without a foreground question path.
- Record challenge progress cumulatively and require a later independent review after fixes; keep completion bound to validated rounds and the caller’s source, role and evidence gates.
- Add scoped reviewer ratings and a finding-author column to
develop:review, preserving the aggregate verdict without averaging ratings. Ratings distinguish approval, minor changes, changes required, insufficient evidence and block/reject; missing reviewers remain unrated, and the legend, summary and findings overview travel with the header.
- Show cumulative adversarial-loop progress after each completed review while keeping unresolved and unavailable reviews distinct from clean results.
- Preserve Codemap package-initializer queries across mixed diffs and Windows/source-layout paths; keep incomplete preflight data partial and legitimate source reads available.
- Block the review follow-up until the report exists and its complete header is visibly delivered.
- Add an isolated blind-solve reviewer to
develop:reviewfor feature or mixed changes only when an active plan names an affected module; compare its blueprint with the implementation and report explainable divergences as questions. - Refresh the review compaction contract and hint before follow-up.
- Read Codemap’s shared context live from its active install, remove
--semble, and retain the standalone path fallback. Add bounded shutdown timeouts to Develop session hooks.
- Compress prose and nonfunctional code comments across Develop skills, templates, shared files and rules while preserving frontmatter, headings, code, load paths and functional comments.
- Preload deferred task-tool schemas before task-hygiene calls. Clarify OSS PR-scoped versus Develop timestamp-scoped report paths and repair README rendering and anchors.
- Include unchanged consumers and the next ordinary user action in workflow reviews; require outcome probes for identity, destination, lifetime, retry and resume assumptions.
- Adopt the bounded adversarial convergence procedure for review-and-fix cycles, with validated independent evidence, fresh source snapshots and explicit stop or recovery decisions.
- Restore four quality-gate obligations in the Develop rule copy: route files by copy intent, avoid option questions whose actions cannot be executed, merge instruction blocks without losing rules, and record deferred work in the delivered artifact.
- Parse skill flags in shared helpers, avoiding zsh’s empty
BASH_REMATCH; derive feature and plan Codemap targets inderive_codemap_target.py. - Use TSV only for supported query shapes and feature-probe it, falling back to JSON with older Codemap CLI installs.
- Add a weighted loop capped at three independent review/fix iterations; stop on plateau or non-convergence, and leave structural findings unapplied until explicit approval for separately scoped work.
- Dispatch reviewers in the background, end the turn and resume on completion notifications; bound inactivity handling to about 15 minutes and retain partial/error outputs instead of silently omitting failed reviewers.
- Extract argument-target parsing, review-target resolution and skill-compaction contract writing into tested Python helpers; persist the tried-candidate ledger so resumed debugging uses state that was actually written.
- Ship Develop-local Codemap context and gate contracts so standalone installs do not depend on another plugin’s private shared directory; prefer the active install and fall back to file reads when Codemap is unavailable.
- Register the shared Bash allow-audit hook in Develop, preserving the existing command decisions while adding an audit trail.
- Record ranked allow-hook decisions and completion/session events, storing command digests rather than raw commands; audit can be disabled, and verification/pruning does not make the log tamper-evident.
- Clarify bridge detection, diagnosis containment and JSON recovery contracts, and strengthen helper tests and test-marker metadata.
- Add a shipped deny list and permission-merge setup step for Develop, with backup, validation and rollback if settings are malformed.
- Replace routine self-review and score-triggered adversarial passes with named-gap triggers; retain findings before presentation filtering and raise feature/refactor effort to xhigh.
- Merge paired review dimensions into one spawn, enforce fan-out limits and bound feature iteration by cycle and wall-time caps.
- Replace the legacy Codex integration with explicit bridge calls for implementation, advice and review; preserve unavailable behavior and local review fallbacks.
- Close sentinel-read hook allow bypasses found by adversarial review while retaining the reviewed read-only command cases.
- Add a protected-file write guard to Develop and document the propagated blueprint allow hook in its README.
- Add shared stale-lock and worktree healing with repository-root containment; reduce review fan-out to keep total agents bounded.
- Add the blueprint-manifest auto-allow hook to Develop while preserving the existing read-only command policy.
- Replace runtime test skips with collection-time capability markers and synchronize Develop documentation with current commands and skill roster.
- Anchor Codemap index and logs at the Git root, and resolve module names from the index so Develop queries work from subdirectories and do not guess from paths.
- Choose a task-fit Codemap route before fix retrieval; use no query for a fully localized edit unless a structural fact or explicit tool request remains unresolved.
- Trim overlong comments in Develop workflow scripts without changing commands or functional rationale.
- Rank only review dimensions selected by scope and evidence, cap default fan-out at four, and let
--fullrun every eligible dimension without widening the scope.
- Extract Codemap gating, issue fetching and worktree setup into tested Python helpers, and split team-mode prompts into loadable files. Add a language preflight before pytest runs in projects without Python markers.
- Check review-header delivery in the transcript as a nudge before follow-up; the hard delivery gate arrives later.
- Add shared-path fallback guards at every resolver call so zsh and broken installs cannot silently use an empty path.
- Add
/develop:setupto install and clean up only Develop’s namespaced rules without editing settings or another plugin’s rules.
- Use closed option sets for Develop’s scan-source and spec-type values, deriving command choices from the accepted values.
- Resolve shared files from Develop’s own installed plugin rather than Foundry’s cache or user-level skill links, allowing standalone use.
- Ship Develop-local quality-stack, Codex and validation/handoff instructions so standalone workflows retain those protocols.
- Repair shared-shell state and sentinel handling so Develop workflows retain paths and flags between calls.
- Add explicit
--issue Nmode and improve report/header and sentinel recovery paths.
- Add a fail-open, expiring hook that blocks an active review follow-up until its report file exists; printing and delivering the header remains a skill obligation.
- Keep report header table cells on one physical line so long values cannot break the rendered table.
- Add
--worktreeto feature, fix, debug, refactor and review; edits run in a HEAD-based worktree and report its branch/path for manual integration. Plan remains read-only and does not accept the flag. - Worktrees start from committed
HEAD; debug diagnoses and review reports return to the main tree for manual integration.
- Require Develop review to print its report header before asking the follow-up question.
- Label injected structural context as
codemap-pythroughout Develop and keep debug-to-fix result matching in sync.
- Migrate Develop’s structural context and test-impact calls to the
codemap-pyCLI while preserving existing preflight behavior.
- Point Develop’s Codemap wrappers and fallback paths at the dual-runtime
codemap-pypackage.
- Propagate the sentinel-read allow hook to Develop so pre-canned read-only state reads no longer trigger avoidable permission prompts.
- Use Codemap
diff-impactfor function-level review context; remove bare-module calls tofn-rdeps/fn-blastwhile retaining module-levelrdepsqueries.
- Render YAML report metadata as a two-column Markdown table while retaining machine-readable YAML in the saved report.
- Add the session ID to temporary sentinels so parallel sessions and projects do not share state.
- Move the source directory to
plugins/cc_develop/while preserving the installeddevelop:namespace.
- Review public API changes against neighboring symbols and established naming, placement, parameter and return-shape patterns.
- Make Codemap helper loads version-proof and correct build/rebuild wording across Develop’s shared gates.
- Use
catfor shared-document loads so documented shell permissions survive plugin updates, remove a superseded team-prompt copy and ship a Develop permission-allow manifest.
- Compress Develop’s Markdown prose while preserving commands, code, frontmatter and functional annotations.
- Align Develop’s issue-ID routing and remove a review flag step that the parser did not support.
- Recover the final top-level JSON object from helper output and repair router timeout handling.
- Add explicit
--helpand argument validation to Develop’s bin scripts.
- Move shared Codemap context and currency gates into the provider contract while keeping Develop’s flags and graceful fallback in its own wrapper.
- Change Develop’s plugin license to Apache-2.0.
- Use indexed symbol spans for targeted edits in larger files; fall back to full reads when spans drift or replacement text is ambiguous.
- Reuse test-impact results from debug in fix while the index remains current; size plans from structural dependency and coupling data.
- Batch Codemap preflight queries for Develop review in one process and extract the query builder into a tested Python helper.
- Prioritize Codemap results in reviewer prompts; recognize direction-scoped
query_completewith the legacyexhaustivealias and invoke the Semble companion when available for incomplete context or a missing index.
- Document that Develop never auto-invokes OSS skills and the shared quality loop escalates to
develop:reviewonly when a concern signal warrants it.
- Add per-skill compaction contracts to Develop review, feature, fix, refactor and debug so the workflow can resume from persisted state after context compaction.
- Add
--keepcontext preservation and harden argument parsing for tokenized and quoted values.
- Skip the default challenger on small single-file changes while allowing
--challengeto force it;--no-challengestill disables it.
- Fix cross-platform runner handling, test ordering and flag spelling across feature, fix, refactor and debug.
- Gate characterization tests on unmodified source before refactoring, then rerun the same tests afterward. Failed or no-test prechecks require recovery, explicit acceptance of proceeding without a safety net, or abort.
- Persist shell state between calls so Develop review retains its selected target and shared path, while feature keeps its Codemap module target.
- Synchronize Develop’s agent router with the canonical implementation, enforce source-drift checks and add SessionStart agent indexing with optional OpenAI-embedding/Anthropic matching and fallback.
- Correct Foundry detection in Develop’s agent fallback so installed specialist agents are no longer silently replaced by general-purpose agents.
- Verify the user’s premise before debugging, and use a synthesis-only general agent to consolidate local review findings.
- Remove self-evident shell comments from Develop skill bodies while preserving comments that explain constraints.
- Restore missing/stale Codemap index gates in debug, feature, fix, plan and refactor, and document automatic build/rebuild prompts.
- Require resolved literal paths in reviewer prompts and preserve agent descriptions when the router rewrites dispatches.
- Clean feature/refactor team sentinels on exit, move trigger/skip guidance into skill descriptions and surface strict Codemap failures.
- Add two-tier Codemap currency checks and wire missing/stale-index gates into all six Develop workflows.
- Query direct reverse dependencies before blast-radius results in Develop review, and warn when Codemap context is unavailable.
- Query direct function callers before transitive impact and move feature team/report plus review consolidator prompts into loadable templates.
- Consume Codemap
test-impactto select affected tests in feature, fix and refactor, falling back to the full suite; record query counts, completeness, coverage caveats and gaps.
- Add Codemap preflight checks to Develop review so index materialization and per-agent queries are explicit before findings are written.
- Refresh changed Codemap files incrementally and query richer function, test and documentation context before review findings are written.
- Remove comments that merely restate Develop workflow commands while preserving rationale and behavior.
- Add a
Titlefield to report metadata.
- Classify changes by intent, including chore work, and align report metadata with explicit cosmetic-through-critical severity sections.
- Add premise verification before Develop workflows form a diagnosis or design; review findings must cite file and line evidence and meet the source threshold.
- Honor
CODEMAP_INDEX_DIRin Develop’s Codemap consumers, allowing indexes outside the default project cache.
- Migrate debug, feature, fix and refactor to the shared skill-driven argument parser; persist parsed flags in per-skill and compatible legacy temp files instead of caller-side eval blocks.
- Add trigger and skip metadata to Develop skills, and clarify Python-project eligibility and CI-only failure handoffs.
- Persist run-directory and parsed-argument values across fresh shell calls, and derive Codemap targets from the active traceback or symptom.
- Add the shared argument parser, automatic Codemap context with strict/off overrides, and safer issue/test helper argument handling.
- Replace the pinned Haiku model ID with the
haikualias in Develop’s agent router.
- Add
--repoto feature, fix and debug issue fetching and parse it in refactor for consistency; add two-wave feature teams and per-agent debug health sentinels. Persist plan flags across calls, bound plan/debug dispatch depth and distinguish public breaking changes from internal signature-change risks.
- Pass the resolved diagnosis path directly from debug’s follow-up question into
/develop:fix.
- Update Develop’s runtime and documentation references to the consolidated Foundry setup entrypoint.
- Update Develop’s Codemap references to the unambiguous
scan-codebaseandquery-codeskill names.
- Remove a trivial Codemap flag helper in favor of direct skill prose and extend the plugin’s hook and workflow regression coverage.
- Use inline doctests for simple feature contracts and example scripts for complex ones before converting them to formal pytest tests.
- Persist and reload the Codex output path across shell calls, and distinguish failed reviewer outputs from roles that were legitimately skipped.
- Replace Develop shell utilities with cross-platform Python CLIs and update skill callers; keep only permitted shell wrappers.
- Narrow debug tool permissions, remove debug/feature effort overrides and update test/configuration support.
- Restrict Codemap scans to the project tree and cap them at 2,000 Python files; sanitize project and sentinel names, validate issue IDs and pytest commands, parse diagnosis paths without shell evaluation, and reject missing diagnosis files.
- Add a non-Python preflight to feature; feature's lead or software engineer owns primary red-green tests, while QA adds edge-case and regression tests after implementation. In fix, retain the challenger on diagnosis handoff, stop for a decision without a reproduction path, and preserve pre-existing regression tests.
- Gate mixed feature/refactor goals and broad refactors spanning 3+ modules, 5+ files or any public-API rename; require a scope decision before proceeding.
- Extract structural scan logic into
codemap_scan.py; add pytest-gate, short-run and worktree shell helpers and connect their skill callers.
- Add plugin-owned helpers for issue fetching, shared-path resolution, run directories and Codemap flags; reduce repeated shell parsing in Develop skills.
- When review receives a PR-like argument, detect whether OSS is installed before routing and ask explicitly when its PR workflow is unavailable. Treat pytest exit 5 as a no-tests/collection condition, cap refactor cycles, and author new QA reproduction tests only when no relevant existing test is found; strengthen weak existing tests instead.
- Fix Develop’s shared-path guard so SemVer rules resolve correctly before a fix workflow uses them.
- Standardize report YAML headers, add the report path, list challenger in review fallback roles and adjust shared-path fallback handling.
- Accept full GitHub Actions URLs in
--ci-run, extract CI log handling and inline plan generation into shared helpers, and repair feature team-mode dispatch and fix-plan initialization.
- Remove the explicit
opusplanmodel override from Develop review so runtime model selection applies.
- Limit deprecation checks in Develop review to public API surfaces.
- Separate temporary reviewer handoffs from final reports under
.reports/review/; the consolidated Develop review names the source handoff files.
- Add the breaking-change gate to fix and plan work, and preserve the confirmed diagnosis in debug/fix handoffs.
- Add
--teammodes with explicit reviewer/teammate dispatch and keep the shared quality-stack and Codemap contracts aligned with their callers.
- Keep issue-ID normalization and fetching in one shell call, repair Foundry fallback paths, recognize team flags, and distinguish workflow routing metadata.
- Extract reusable preflight handling; detect unsupported flags and ask whether to abort or continue ignoring them.
- Make Codemap and Semble opt-in with explicit flags; strict preflight stops with a clear status when a requested tool is unavailable.
- Extract task-hygiene instructions for reuse across Develop workflows and bound agent-router matching with a five-second timeout.
- Parse
--planand--diagnosishandoffs in fix/refactor and fail fast when the referenced file is missing. Offer Codemap’s optional Semble companion query only when structural coverage is incomplete, then combine reverse-dependency results.
- Add a three-tier agent-router fallback: exact installed agent, optional LLM-selected local role, then
general-purpose. Require a selected follow-up skill to run in the same turn.
- Require analysis agents to self-check claims and coverage, and route low-confidence work for adversarial review when available. Debug issue mode fetches the issue first and runs a referenced test before falling back to the full suite when the path is absent or invalid.
- Centralize Codemap context and task hygiene in shared Develop files; add challenger coverage and reliable
--plan/--diagnosisparsing across applicable modes. - Protect existing plans with a counter suffix instead of silently overwriting them.
- Reconcile existing tasks before creating new ones and correct the plugin-prefixed workflow dispatch and scope boundaries.
- Run a read-only adversarial challenger across Develop’s six workflows by default;
--no-challengeskips the extra review.
- Accept issue identifiers with or without a leading
#in feature, fix and debug commands.
- Keep local review in
develop:reviewand reserveoss:reviewfor pull requests; integer input to local review now redirects to the PR workflow.
- Extract agent fallback and test-runner detection into shared sidecars, add a bounded refactor cycle cap, and reuse Codemap blast-radius context for multi-file work. Missing Codemap indexes now return a failing status so callers can gate correctly.
- Separate
PYTEST_CMDfrom the project test runner and detect the repository’s runner before testing. Add--planand--diagnosishandoffs, early exit-code gates, and persisted checkpoints to feature, fix and debug flows. Review loops now stop when findings stabilize. - Persist structured plans with feasibility review/resolution and Codex validation before implementation.
- Establish the standalone Develop plugin with feature, fix, refactor, plan and debug workflows under its own namespace.
- Extract shared branch-safety, quality-gate, review-loop and Codex-delegation instructions for Develop workflows to reuse.
- Remove the former Foundry Develop skill copy after moving its workflows into the plugin.
- Add
develop:reviewfor local Python files, directories and diffs, with six scoped specialist roles consolidated into a report. - Add external-API detection/fetch/citation checks, surfaced assumptions and five-axis feature/fix quality scans.
- Inject optional Codemap hotspots and dependency/reverse-dependency context into reviews, with risk tiers.
- Remove Foundry as a required dependency; absent named agents fall back to
general-purposewith role descriptions.