Skip to content

Release 3.29.0 — Jira/ADO backends follow-ups, release discipline, first-run slides - #91

Open
laird wants to merge 35 commits into
masterfrom
integration
Open

Release 3.29.0 — Jira/ADO backends follow-ups, release discipline, first-run slides#91
laird wants to merge 35 commits into
masterfrom
integration

Conversation

@laird

@laird laird commented Jul 29, 2026

Copy link
Copy Markdown
Owner

First release cut through the new discipline: integration → master, gated on a version bump. The release-gate check 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:

Version

  • Marketplace root 3.28.0 → 3.29.0.
  • Consistent across all three locations: autocoder 4.7.0 and modernize 3.3.0 in both marketplace.json plugins[] and each plugin.json.

Gate status (verified locally)

✅ bump: marketplace root 3.28.0 → 3.29.0
✅ consistency: modernize 3.3.0 (marketplace == plugin.json)
✅ consistency: autocoder 4.7.0 (marketplace == plugin.json)
✅ release gate passed.

Full shell suite green (19/19, incl. the new test_release_gate.sh).

⚠️ Before merging — this is the actual release to master

Per 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.sh against real Jira
  • ado-smoke-test.sh against a real Azure DevOps org
  • Walk the README install flow in a scratch repo
  • (Optional) apply the parked "advertise Jira/ADO" doc edits + the 3 README stale-reference fixes first

Merging 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

claude and others added 30 commits July 29, 2026 00:53
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>
… reimplemented on master + platform drift repair
… 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.
…-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>
laird and others added 2 commits August 8, 2026 14:45
#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

laird commented Aug 8, 2026

Copy link
Copy Markdown
Owner Author

This PR is now obsolete — recommend closing it. Both red checks are expected, not defects:

version-gate — failing as designed. After reconciling integration up to master (merge 6c4bb7a), the marketplace root version is 3.34.0 on both base and head. The gate blocks because there is no version bump — which is exactly correct: there is nothing new to release, so it refuses to let integration → master through. The gate is working.

shell — pre-existing, unrelated failure. The only failing test is test_worker_launch_lib.sh (the Gemini worker-command assertion). It is red on master as well, so it predates this branch. Everything else is green, including the new test_release_gate.sh (6/6).

Why #91 is stale. Its title/body describe "Release 3.29.0" with versions autocoder 4.7.0 / modernize 3.3.0. Those no longer match reality — master and integration are both at root 3.34.0 (autocoder 4.12.0 / modernize 3.3.0). The three feature branches this PR meant to ship already landed on master independently, and integration has since been reconciled to match.

Recommendation: close #91. When you're ready to cut the next release, open a fresh integration → master PR after bumping the marketplace root version (and keeping the three-place consistency) — the gate will then pass on a real bump. I have not closed this or bumped any version, since releasing to master is yours to approve.


Generated by Claude Code

laird and others added 2 commits August 8, 2026 19:21
#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>

laird commented Aug 9, 2026

Copy link
Copy Markdown
Owner Author

Correction / update to my earlier note — the shell failure here is not the harmless "pre-existing test" I first described. After integration and master both advanced, this is a genuine semantic conflict on the Gemini worker launch, and the root cause is a factual error on master:

What the merge produces (PR #91 = integrationmaster):

Why the lib is wrong on master: commit ae7c8f0 ("fix: resolve three failing test suites", #116) reverted the Gemini branch from shell-mode back to interactive /fix-loop, with the stated rationale that gemini-fix-loop.sh is "a non-existent … shell script." That premise is falsescripts/gemini-fix-loop.sh exists on both master and integration (a real 150-line script, identical on both), alongside the rest of the Gemini shell-loop toolkit (gemini-manage-workers-loop.sh, gemini-monitor-loop.sh). ae7c8f0 therefore reverted the intentional shell-mode switch from 099a08a ("switch Gemini workers to shell mode for fresh context per issue") and broke parity with the codex/droid workers, which both launch via their own *-fix-loop.sh shell scripts.

Correct resolution (Gemini should be shell-mode, matching the real script + 099a08a + codex/droid):

  • Restore the shell-mode Gemini branch in plugins/autocoder/scripts/worker-launch-lib.sh on master (revert ae7c8f0's gemini hunk).
  • Update master's tests/test_worker_launch_lib.sh Gemini assertions to expect gemini-fix-loop.sh (as integration already does).

integration is already self-consistent and correct on this (shell-mode lib + shell-mode test). I'm not pushing this to master unilaterally — it reverses a merged decision on the protected branch, so it's the maintainer's call. Flagging for a decision.


Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants