Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
acdf309
feat(merge): make the trust trail's instrument a field in Phase 1.4
Aug 24, 2026
285f685
feat(agents): trust-trail-evaluator accepts the instrument and not_ap…
Aug 24, 2026
89d0e49
feat(premerge): emit a trust trail at Phase 5-trail
Aug 24, 2026
2daf12c
docs(commands): document the generalised trust gate on /merge and /pr…
Aug 24, 2026
ef8709e
test(merge): lock the generalised trust instrument in Phase 1.4
Aug 24, 2026
b91a97b
test(trust-trail): execute the premerge instrument through both suites
Aug 24, 2026
6008d31
test(premerge): retarget P10 to the review-pr instrument and keep its…
Aug 24, 2026
1d193ca
test(premerge): execute the Phase 5-trail gate and emit fences
Aug 24, 2026
3cc7977
docs(premerge): record the trust trail in RFC 0021 A7 and the README
Aug 24, 2026
7b464c9
fix(ci): re-pin two skill-size waivers, declare commands/merge.md pen…
Aug 24, 2026
939b3a6
test(trust-trail): anchor TT7 on the real Step 2, not a prose mention…
Aug 24, 2026
dbfb792
fix(vendor): re-pin the using-uberdev configuration.md digest and cit…
Aug 24, 2026
e5760c6
Merge commit 'dbfb792e13f83a5eb980a2dcacf28eebc27d480a' into chore/st…
Aug 24, 2026
9eab49c
fix(premerge): address code-review blockers on the stack (attempt 1)
Aug 24, 2026
07d57ea
fix(premerge): address code-review blockers on the stack (attempt 2)
Aug 24, 2026
1cf4027
fix(premerge): address code-review blockers on the stack (attempt 3)
Aug 24, 2026
b91a1ef
test(skill-size): re-measure both raised waivers after the attempt-3 …
Aug 24, 2026
faa98cd
chore(release): v0.57.0
Aug 24, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
"name": "uberdev",
"source": "./plugins/uberdev",
"description": "GitHub workflow commands + full Superpowers skill suite (brainstorm with visual companion, write-plan, execute-plan, subagent-driven-dev wave-based parallel execution, finish-branch, systematic-debugging, TDD, worktrees, parallel-agents, verification, code-review pair, writing-skills, using-uberdev primer) and PR review agents. /solve and /turbo dispatch autonomous agents via a platform-aware dispatch backend (Workflow-native solver fleets by default, with detached wezterm / background transports opt-in — cross-platform on macOS, Linux, WSL2, native Windows); /issue creates well-investigated, deduped issues.",
"version": "0.56.1",
"version": "0.57.0",
"category": "workflow",
"tags": [
"github",
Expand Down
63 changes: 63 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,69 @@ All notable changes to UberDev are documented here.

The format is based on [Keep a Changelog 1.1.0](https://keepachangelog.com/en/1.1.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [0.57.0] — 2026-08-24

### Added — the trust trail names its own instrument, so `/premerge` output is landable

`/merge`'s Phase 1.4 trust gate was hardcoded to one producer: it matched the
literal prefix `Reviewed-by: uberdev/review-pr@` and the bare label
`uberdev-approved`. `/premerge` emitted neither, so every stack it parked was
structurally unlandable — the condition #716 exists to remove.

The instrument is now **data**. `Reviewed-by: uberdev/<instrument>@<sha>` over the
closed set `{review-pr, premerge}`, a declared label→instrument table, and a
refusal when the two halves disagree. `/premerge` emits the same artifact shape
with its own value, gated on a green clean gate, carrying `gate=green attempt=NN`
in the immutable commit body — the payload that keeps the tier from resting on
two bare literals, since `.uberdev/` is gitignored and a fresh clone has no
`gate-NN.json`.

No third trust path was added: the generalised PATH_2 is the design.

### Fixed — `release-anchor.sh` refused every real release this repo has made

`/premerge` emits its anchor before the version bump, so `/merge` reads the
trailer through the following `chore(release)` commit only if `release-anchor.sh`
proves that commit inert. It proved nothing: measured over all 74 historical
`chore(release):` commits, **70 were refused** — 47 by the CHANGELOG rules alone.
The four survivors were the releases that shipped no notes.

The one 400-line cap was doing two jobs. It is now three: CHANGELOG prose is
bounded at 2000 lines (inert by nature — nothing in the repo reads `CHANGELOG.md`
back), the **code-bearing** diff at 200, and the total at 4000 as a pure resource
bound. The code-bearing half is therefore **half** what it was. The per-line
shape regex — which never was a content control; `- curl … | sh` satisfied it —
is replaced by a structural rule: the commit must open exactly one `## ` section
and it must be this release's.

42 of 74 now resolve, and a 19-row adversarial matrix still refuses every attack
row, two of them more strictly than before.

### Fixed — a RED `/review-pr` no longer leaves a landable trail

Because PATH_2 is now a disjunction over instruments, a RED review that cleared
only its own two labels left `premerge-approved` standing on a PR it had just
blocked. RED now clears every member of `TRUST_LABEL_ENUM`. GREEN and YELLOW
deliberately do not: their fresh anchor moves the trust head past the premerge
one, so a surviving label cannot outrank the newer trail, and clearing it would
delete another command's uncontradicted evidence.

### Fixed — the YELLOW tier is held to a commit-body token

`--accept-critical-deferred` was unenforceable wherever the gitignored audit
artifact was undiscoverable — a worktree, another machine, a fresh clone. The
evidence was already being parsed and thrown away: `/review-pr` writes
` severity=critical-deferred count=N` into the trailer. The `(b.5)` fence now
classifies it, symmetric with how `premerge` is held to its gate token.

### Fixed — the trail can no longer name a tree the gate never read

The emit fence re-derived its own `HEAD`, so any commit landing between the gate
and the emit produced a trailer claiming a gate that never saw that tree. The
gate's `HEAD=` token is now a required input and must match before the first
write.


## [0.56.1] — 2026-08-24

### Changed — the project rule file is `CLAUDE.md`, not `AGENTS.md`
Expand Down
26 changes: 19 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

**Personal Claude Code marketplace — opinionated GitHub-workflow slash commands.**

[![Version](https://img.shields.io/badge/version-0.56.1-blue)](./CHANGELOG.md)
[![Version](https://img.shields.io/badge/version-0.57.0-blue)](./CHANGELOG.md)
[![License](https://img.shields.io/badge/license-MIT-green)](./LICENSE)
[![Claude Code](https://img.shields.io/badge/Claude%20Code-plugin-8B5CF6)](https://docs.claude.com/en/docs/claude-code/plugins)
[![Repo Agnostic](https://img.shields.io/badge/repo--agnostic-yes-success)](#configuration)
Expand Down Expand Up @@ -354,7 +354,7 @@ invisible to any per-PR review:
| 2 TRIAGE | classify the review's findings and plan the fixer waves (one agent per file, disjoint files per wave, agents never touch git). Stamps the reviewed SHA into the evidence. Runs once per attempt; the cleanup findings accumulate as a union deduped by fingerprint across attempts, because a suggestion the reviewer stops repeating is unmentioned, not resolved |
| 3 CLEAN GATE + CONVERGE | blockers cleared **and** CI green **and** not conflicting; fails closed on unreadable evidence. Not green routes each failing term at something that can repair it — fixer waves at a blocker, `ci-failure-classifier` → `ci-code-fixer` / `ci-rebase-handler` at a red build, a controller-owned base merge at `CONFLICTING` — and re-enters Phase 1. A build that has not answered yet is re-probed without spending an attempt |
| 4 SIMPLIFY + VERIFY | the three lenses — **last, and only on a green stack**. Applies only behaviour-preserving findings, then re-probes CI and re-gates the polish commit on its own SHA — because Phase 4 is the last thing to touch the branch and every earlier gate was computed before it. A refactor that broke a stack which was green is `git revert`ed, not handed to a human at 3am |
| 5 BUMP + PARK | everything the run could not fix becomes an issue — surviving blockers at `BLOCKER` tier with a `Blocks: #<stack-pr>` backref, suggestions and un-applied lens findings at `SUGGESTION` — then one `bump-version.sh` for the whole stack, push, stop |
| 5 BUMP + PARK | everything the run could not fix becomes an issue — surviving blockers at `BLOCKER` tier with a `Blocks: #<stack-pr>` backref, suggestions and un-applied lens findings at `SUGGESTION` — then, on a green run only, the trust trail `/merge` reads, then one `bump-version.sh` for the whole stack, push, stop |

**The counter is a backstop, not the stop condition.** `--converge=<n>` **repair rounds** (default 3,
ceiling 6, refused rather than clamped outside that range) only bounds a runaway.
Expand All @@ -381,11 +381,23 @@ machine-checked rather than judged — so you can see which regime a run was in.
**It never merges.** Not on green CI, not on an approving review, not under any
flag. It ends at a pushed, open, bumped, parked PR. Landing is `/merge`.

**It emits no trust trail**, so `/merge`'s PATH_2 will not accept a `/premerge`
run as review evidence — that trail claims the seven-lens fanout, the
finding-verification gate and the CI-health phase all ran, and here none did. Run
`/review-pr <stack-pr>` on the parked PR when you want one; the two compose in
that order.
**It emits its own trust trail — and only its own.** On a run that reaches green
it leaves a `premerge-approved` label and an empty anchor commit carrying
`Reviewed-by: uberdev/premerge@<sha> gate=green attempt=NN` plus the base
endpoint, and `/merge`'s trust gate resolves that instead of refusing the parked
stack PR structurally. A run that does not reach green emits nothing at all. The
gate generalised rather than loosened: the producing command is now an
**instrument** field carried inside the trailer instead of a hardcoded prefix, and
`/merge` reads it from both the label and the commit body and refuses when the two
disagree. So a `/premerge` trail claims `/premerge`'s clean gate and nothing else
— not the seven-lens fanout, not the finding-verification gate, not the CI-health
phase, none of which ran here — and `/merge` records it under a distinct trust
anchor so an audit can tell the two tiers apart. Run `/review-pr <stack-pr>` on
the parked PR when you want the higher tier; the two compose in that order.

**A trail is not permission to merge.** It changes which PRs are *eligible*, never
who pulls the trigger: `/merge` still lands nothing without your explicit command
for that specific PR, and `/premerge` never dispatches it.

Design rationale and full topology in [`docs/rfc/0021-premerge-stack-integration.md`](./docs/rfc/0021-premerge-stack-integration.md).

Expand Down
Loading
Loading