Release 3.29.0 — Jira/ADO backends follow-ups, release discipline, first-run slides - #91
Release 3.29.0 — Jira/ADO backends follow-ups, release discipline, first-run slides#91laird wants to merge 35 commits into
Conversation
The Claude plugin manifests had drifted below marketplace.json: autocoder plugin.json was 4.3.0 vs marketplace 4.7.0, and modernize was 3.2.0 vs 3.3.0 — so an installed plugin self-reported a stale version even after updating. Root cause: CLAUDE.md's version-management rule only listed the two marketplace.json locations, so .claude-plugin/plugins/<name>/plugin.json was silently left behind across releases. - Bump .claude-plugin/plugins/autocoder/plugin.json 4.3.0 -> 4.7.0 - Bump .claude-plugin/plugins/modernize/plugin.json 3.2.0 -> 3.3.0 (both now equal their marketplace.json plugins[] version) - CLAUDE.md: make the version rule a three-place checklist so plugin.json stays in step, and note that the .factory-plugin/codex-plugins packagings version independently. Factory and Codex packagings were already internally consistent and are left at their own versions. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015zJKDkbj54vZeGaTWLJEHv
Mirror of jira-smoke-test.sh for issues-ado.sh: authenticates to a real Azure DevOps org, then exercises the full 9-verb lifecycle (any-claimable, list, create, get, claim/release, comment, update, close) against the configured project and closes the throwaway work item it creates. Test tooling only — needs ADO_ORG_URL / ADO_PROJECT / ADO_PAT and egress to dev.azure.com, so it runs on a developer machine, not in CI (the hermetic fake-server test covers CI). No secrets in the script. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015zJKDkbj54vZeGaTWLJEHv
…ude Code)
Rewrites Installation → Claude Code into a numbered sequence with the exact
commands, marking which are typed in Claude Code vs the terminal:
1. /plugin marketplace add laird/agents (corrects the stale
"/plugin add marketplace <url>" form; owner/repo shorthand)
2. /plugin install autocoder@plugin-marketplace + /reload-plugins
(one plugin per command — drops the invalid "install both in one")
3. /install — documents the utility scripts it symlinks into ~/.local/bin
(start-parallel, add-worker, join-parallel, ...) and PATH setup
4. /set-issue-source (github/file)
5. /fix, /fix-loop, /stop-loop
6. start-parallel N --agent claude --mux tmux --issue-source github,
plus --paused and --route manager, and the swarm-management utilities
Adds a prerequisites note (git repo, tmux/cmux, gh auth). Keeps Jira/ADO out
of the run walkthrough pending live validation.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015zJKDkbj54vZeGaTWLJEHv
Introduces the three-tier branch model (feature/* → integration → master) with enforced version discipline for releases. - CONTRIBUTING.md: documents the flow — feature branches PR into integration, releases PR from integration → master, and the version rules that gate a release. Includes the one-time branch-protection settings the repo owner enables. - scripts/check-release-version.sh: the release gate. Fails unless (1) the marketplace root version is strictly greater than master's, and (2) every plugin's marketplace version equals its own plugin.json (three-place consistency). Runnable locally before opening a release PR. - .github/workflows/release-gate.yml: runs the gate on PRs whose base is master only (feature → integration PRs are unaffected). - tests/test_release_gate.sh: hermetic test (throwaway git repo) covering the pass case, no-bump, plugin.json drift, and version regression — 6 assertions. - CLAUDE.md: Branching & Releases section pointing at the flow and the gate. Verified: the gate run against the current tree correctly flags both the missing bump and the autocoder/modernize plugin.json drift (which PR #84 fixes) — demonstrating it catches the exact class of error it's meant to. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015zJKDkbj54vZeGaTWLJEHv
Marp deck with one slide per agentic platform — Claude Code, Codex, Droid, Antigravity/Gemini, OpenCode — each showing the exact install → run → swarm commands, plus a title slide and a "verified against the repo" summary. - docs/slides/first-run.md — Marp source - docs/slides/first-run.pdf — rendered deck - docs/slides/README.md — how to regenerate Antigravity and Gemini deliberately share one slide, with a note explaining why: both drive Google's Gemini models but are different runtimes (the Antigravity IDE loads .agent/, the Gemini CLI loads skills/) — install whichever you use. Every command was verified against the repo. That surfaced 3 stale references in the current README (noted on the summary slide, not yet fixed here): codex-stop-loop.sh / droid-stop-loop.sh don't exist, and the Antigravity install URL points at a nonexistent `main` branch (corrected to `master` on the slide). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015zJKDkbj54vZeGaTWLJEHv
Cuts the first release under the new discipline. This integration line bundles: - #84 Jira/ADO follow-ups (plugin.json version-drift fix, ADO smoke test, README install walkthrough) - #89 release discipline (branch model, version-bump gate, CONTRIBUTING.md) - #90 first-run slide deck Versions are consistent across all three locations (marketplace root 3.29.0; autocoder 4.7.0 and modernize 3.3.0 equal in marketplace plugins[] and their plugin.json). The release gate passes: ✅ bump 3.28.0 → 3.29.0 ✅ consistency autocoder/modernize Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015zJKDkbj54vZeGaTWLJEHv
…g to N-clean; scope + exercise preflight; swarm cadence)
Design spec for adding a human-gated planning capability to the manager session (brainstorm → spec → critical review → decompose to stories → existing fleet implements), plus renaming /fix→/dev and /fix-loop→/dev-loop with aliases. Reuses existing skills and the decomposed/subtask convention; adds two backlog-aware behaviors to the manager loop. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Critical-design-review round 1 approved the planning-pipeline spec as-is: 0 literal-wrongness findings, 0 forced decisions. Empirically confirmed the two load-bearing hand-off facts (subtask is claimable; decomposed parents are excluded from claiming). Recorded the CDR approval in the spec status and carried the three CIR-deferred items forward as notes B8/B9 (+ existing B5). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…eview-1 to autocoder-planning-pipeline-implementation-plan
Tracks the 2026-07-28 handoff documenting the /fix→/dev rename and peters-toolkit:bugfix integration, plus the still-unaddressed critical review of the planning-pipeline implementation plan. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…aim lock until a terminal outcome
…ver reached the ship branch
…ini/droid markers, stale comments)
…rs.sh (GraphQL replay lands new files 644)
… exclusion, drift repair), marketplace to 3.32.0
…ound/improved/learned per round, verdict chapter)
…e v2 removal Atlassian removed POST /rest/api/2/search from Jira Cloud (HTTP 410, CHANGE-2046). list and any-claimable now use POST /rest/api/3/search/jql with an explicit fields list, nextPageToken pagination (no startAt), and existence-of-first-page instead of the removed total for any-claimable. Issue lifecycle endpoints stay on v2 (not removed; plain-string bodies). The fake serves the new contract, enforces a settable page cap to exercise the token loop, and returns 410 on v2 search so regressions cannot pass. Live verification against real Jira Cloud pending by coordinator.
…text Live smoke showed /rest/api/3/search/jql returns description as an ADF document object, not v2's plain string. The list reshape now walks ADF content nodes collecting text (paragraphs joined with newlines; tolerates null, plain strings, malformed nodes), so body stays a plain string for all consumers. v2 CRUD read paths are untouched (still plain strings). The fake now serves ADF descriptions from v3 search to pin the contract.
…mp autocoder 4.10.1 / marketplace 3.32.1
…-smoke-test.sh; live validation pending an ADO sandbox)
…gents The SKILL.md had no model guidance. Top-level coordinator (scope/grade/fix decisions) uses the deep model; subagents and swarm workers use the balanced model. Mirrors the autocoder manager/worker tier pattern. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
… model selection (#110) * feat(autocoder): add model-config startup confirmation and env-var-driven model selection Autocoder agents now resolve model tiers from env vars → .autocoder.json → built-in defaults (claude-opus-5 / claude-sonnet-5 / claude-haiku-4-5 on Claude Code; gemini-2.5-pro / gemini-2.0-flash on Antigravity). On first run with no model config found, the agent presents the defaults and asks the user to confirm or override before proceeding. The confirmed models are exported as MANAGER_MODEL / WORKER_MODEL / FAST_MODEL and referenced in every Task tool call in the workflow so agents actually use them. Also adds skills/autocoder/references/model-config.md documenting the tier system and how to persist overrides via .autocoder.json. Parallel maintenance: plugins/autocoder/commands/fix.md ↔ .agent/workflows/fix.md Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * chore: bump autocoder to 4.11.0, marketplace to 3.33.0 Reflects model-config startup confirmation and env-var-driven model selection added in the previous commit. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
#112) Switch fix.md and model-config.md from full API model IDs (claude-opus-5) to platform tier shorthand (opus/sonnet/haiku for Claude Code, pro/flash for Gemini). Agents inherit credentials from the running session — no separate API keys needed. Rename skills/harden → skills/improve to reflect the general improvement and validation loop, not just security hardening. Bump autocoder 4.11.0 → 4.12.0, marketplace 3.33.0 → 3.34.0. Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
integration had fallen ~39 commits behind master (work merged straight to master, bypassing the feature→integration→master flow). This catch-up merge brings integration current while preserving its unique release-discipline additions. Conflict/staleness resolution (master is authoritative for shared code): - .claude-plugin/marketplace.json + both plugin.json: taken from master (root 3.34.0, autocoder 4.12.0, modernize 3.3.0). - plugins/autocoder/scripts/ado-smoke-test.sh (add/add): took master's copy; integration's earlier version is superseded. - Re-applied the three-place version consistency: plugin.json now equals marketplace plugins[] (master itself still carried the 4.3.0/3.2.0 drift that #84 had fixed only on integration). - Fixed a broken doc reference master left after the harden→improve rename: README pointed at skills/harden/ (gone) → skills/improve/. - Verified master's newer code survived (v3 Jira search backend + tests). Preserved from integration: the release gate (release-gate.yml, check-release-version.sh, tests/test_release_gate.sh), CONTRIBUTING.md, the CLAUDE.md Branching & Releases section, and docs/slides. Consistency gate passes; root-equal-to-master is expected (a release PR bumps root). Full shell suite green except the pre-existing tests/test_worker_launch_lib.sh failure, which is red on master too and unrelated to this merge. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015zJKDkbj54vZeGaTWLJEHv
|
This PR is now obsolete — recommend closing it. Both red checks are expected, not defects:
Why #91 is stale. Its title/body describe "Release 3.29.0" with versions Recommendation: close #91. When you're ready to cut the next release, open a fresh Generated by Claude Code |
#117) The Gemini branch of resolve_worker_launch was converted to the same shell-loop model as Claude (gemini-fix-loop.sh restarts the process per issue for a fresh context), but the test still asserted the old interactive `/fix-loop` slash-command contract, so it failed with: Gemini worker command: expected '/fix-loop', got 'bash .../scripts/gemini-fix-loop.sh' Update the Gemini assertions to match the shell-loop contract, mirroring how the Claude branch is already asserted: check WORKER_CMD runs gemini-fix-loop.sh, assert the shell/interactive modes, and keep the MANAGER_CMD /monitor-loop check. Claude-Session: https://claude.ai/code/session_015zJKDkbj54vZeGaTWLJEHv Co-authored-by: Claude <noreply@anthropic.com>
…n nothing (#78) * Show suite status, not just counts, in the run summary (#73) Both summary lines printed only "$PASSED/$TOTAL passed" in green, discarding $UNIT_STATUS. On a failed run — especially the "no parseable test summary" case — the reason was written to the report file and never shown, so an operator watching the run saw a green "0/0 passed" and no explanation. Now prints the status and colours the label by outcome, so a red run is visibly red at the point a human is actually looking. Verification: tests/test_regression_test_config.sh 16/16 (the last assertion covers exactly this — an unparseable summary must be *reported*, not merely exit non-zero); all tests/test_*.sh 18/18; pytest 59/59; BUILD_OK. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> * Fix #85: sum per-suite test counts instead of reporting the last one (#86) regression-test.sh reported "7/0 passed" for a green run of 178 assertions across 11 suites. Root cause: count_before() ended in `tail -1`, taking the last "<N> passed" in the log. Correct for Jest/Playwright, which emit one summary per run; wrong for this repo's unit command, which loops over a dozen independent bash scripts that each print their own "Results: N passed, M failed". The denominator was worse — no bash suite prints the word "total", so UNIT_TOTAL was always the literal 0. Changes: - count_before() sums matches via awk instead of tail -1. It still returns EMPTY when nothing matched, which the no-parseable-summary guard depends on to distinguish "runner never ran" from a real zero. - UNIT_TOTAL is derived from passed+failed only when the runner reports no total, and only AFTER that guard, so an unparseable run cannot synthesise 0+0=0 and read as green. A total the runner did report is never overwritten — Jest's includes skipped tests. - Mirrored both into .agent/scripts/regression-test.sh per the parallel maintenance requirement in CLAUDE.md. Scope: reporting only, not a false green. UNIT_EXIT comes from PIPESTATUS, and the failure path is unaffected because `|| exit 1` makes a failing script the last summary in the log. Verification: two new fixtures in tests/test_regression_test_config.sh pin both directions (green suites sum to 26/26; failing suites sum to 9/14 and still exit non-zero). Suite 21/21. Full regression now reports 178/178, exit 0. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
Correction / update to my earlier note — the What the merge produces (PR #91 =
Why the lib is wrong on Correct resolution (Gemini should be shell-mode, matching the real script +
Generated by Claude Code |
First release cut through the new discipline:
integration → master, gated on a version bump. Therelease-gatecheck runs on this PR — this is the demonstration you asked for.What ships in 3.29.0
Bundles the three feature branches that landed on
integration:plugin.jsonversion-drift fix (autocoder → 4.7.0, modernize → 3.3.0),ado-smoke-test.sh, README install/run walkthrough.release-gate.yml+check-release-version.sh+ hermetic test + CONTRIBUTING.md.docs/slides/).Version
autocoder4.7.0 andmodernize3.3.0 in bothmarketplace.jsonplugins[]and eachplugin.json.Gate status (verified locally)
Full shell suite green (19/19, incl. the new
test_release_gate.sh).masterPer the test-then-approve plan, the live checks are still yours to run (this environment can't reach Atlassian / dev.azure.com):
jira-smoke-test.shagainst real Jiraado-smoke-test.shagainst a real Azure DevOps orgMerging this PR is the release. I've opened it and confirmed the gate passes; I have not merged it — that's your call after the live checks.
🤖 Generated with Claude Code
Generated by Claude Code