Skip to content

chore(release): memhub v0.103.0 - #282

Merged
sgonz-xtrace merged 3 commits into
mainfrom
promote/memhub-v0.103.0
Oct 1, 2026
Merged

sgonz-xtrace merged 3 commits into
mainfrom
promote/memhub-v0.103.0

Conversation

@sgonz-xtrace

Copy link
Copy Markdown
Contributor

MemHub plugin v0.103.0, built from internal main.

Source-RevId: ca5171337a94784c0f9975f2117d1719d4c1384b
SHA256SUMS: a78b8d5e6bc057e43278054b56628ed04fc33f327d7dcd4a30d4ec1589c0f314

Built by promote run 36905941664 at XTraceAI/agent-plugins-internal@ca5171337a94784c0f9975f2117d1719d4c1384b: the plugin suites pass at that commit, and the
export is verified — named memhub, one version across all four manifests, the production
backend in .mcp.json, and nothing shaped like a credential. Every file's digest was
re-checked against SHA256SUMS in the clone this branch was pushed from, so what is here is
what that run produced.

What's in this release

Everything merged on internal main since the last release, v0.88.0 (711c0c1a0): 30 change(s), 25 of them in the plugin (full range).

Breaking changes

  • Sessions are captured to personal memory and never routed to a brain; the import options for choosing a brain or skipping the room are removed. (#79)
  • Directive recall is retired and rules are the only harness memory; the directive hooks and brief sections are removed. (#80)

Features

  • The notice for a newly proposed rule is now prominent, states it is not active yet, and links to the rule in MemHub Studio. (#67)
  • The companion presents a proposed rule and offers Activate, Reject or Later buttons, reporting the outcome, including when you lack admin rights. (#68)
  • Starter and harness-drafted rules are labelled as written by XTrace, while rules you author show you as the owner. (#78)
  • Every animal presents proposed rules, each session gets its own animal, and a heart pets it; the rule link opens in Studio. (#81)
  • Rules can trigger on a prompt event, such as a loop wake-up or task notification, and speak as advice. (#93)
  • Adds Popo the Shiba as a fourth companion animal via /shiba, and renames the penguin Penelope. (#94)
  • The rulebook hook asks the rule judge whether a matched rule fits the turn and can hold back misfires; authored rules now carry when, do and why. (#96)

Bug fixes

  • Rule outcomes recorded by a fork land in the moment's own file, and in-flight moments are no longer marked as given up. (#74)
  • Create-rule's live test now reaches its sub-agent by running it in an isolated worktree, so the candidate rule is actually tested. (#77)
  • Recording a rule outcome now exits with an error and a reason when the ledger isn't writable, instead of silently succeeding. (#75)
  • The companion band shows the session's own animal from its first frame instead of switching after a resize. (#82)
  • Recall lookup, session import polling and repo brain resolution work again on the new 34-tool MCP surface. (#83)
  • The companion no longer re-announces the same proposed rule at every Stop when another session's fork filed it. (#86)
  • Local plugin state that nothing reads is swept daily, so the config directory stops growing, and lock files survive deletion safely. (#87)
  • The rulebook measures a push against the nearest likely base branch, so spec-ownership reminders stop firing on a long-lived staging branch's unrelated changes. (#89)
  • The harness hands the rule-drafting fork to the agent through hidden context, so you no longer see a block of error-labelled text. (#90)
  • Spec markdown files are captured again in repos without a git mirror, while mirror-owned specs are left to the mirror. (#95)
  • The Stop hook shows one short line about a spotted rule, and the fork instructions travel unseen instead of filling your screen. (#97)
  • A rule draft refused because a reviewer already dismissed a near-identical rule now ends quietly as none rather than failed. (#99)

Changes

  • The background rule author runs as an in-process fork of your session, reusing the prompt cache and cutting token use. (#73)
  • The rule-author fork launch is self-describing and announced with one line, so auto-mode permission checks are less likely to refuse it. (#76)
  • The harness judges each turn one turn late inside the Stop hook and stores no bookkeeping files, and the companion asks the server for proposals. (#85)
  • The harness judge sees each action's result and your next message, so it flags fewer moments that don't warrant a rule. (#92)
Merged on internal but not in the plugin (5)
  • The harness audit waits out the staging key's rate limit and retries instead of failing. (#69)
  • The harness gains fixtures, fault injection and credential scenarios, adding regression cases that each pass on the fix and fail on the bug. (#70)
  • The release PR now lists everything it ships, grouped into release-note buckets with one-line summaries. (#71)
  • Each host surface is proved on staging before a release PR, with Codex Desktop and Cursor lanes added to CI. (#72)
  • Adds a GitHub Action so mentioning @claude on a PR or issue triggers a review or requested change. (#88)
This PR replaces `plugins/memhub/` and nothing else.

Proved on staging, per surface (scripts/surface_evidence.py, source commit and v0.103.0):

Surface Proved by Result
Claude Code CLI harness release tier ⚠️ waived — 171 runs, 166 passed. The 3 judge-payload-redacted failures are a case/denylist mismatch (a bare token in prose isn't credential-shaped), tracked for follow-up. The 2 single-run skill failures are model variance. (run 36810891463: claude leg failure)
Codex CLI (codex exec) harness release tier ⚠️ waived — The 7 failing cases are harness setup gaps that already fail in the nightlies, or new Claude-only cases (companion, state sweep) not yet limited to Claude. Harness fixes follow this release. (run 36810891463: codex leg failure)
Codex app engine (codex app-server, the app's bundled version) harness release tier ⚠️ waived — The 7 failing cases are harness setup gaps that already fail in the nightlies, or new Claude-only cases (companion, state sweep) not yet limited to Claude. Harness fixes follow this release. (run 36810891463: codex-desktop leg failure)
Cursor CLI (cursor-agent) harness release tier ✅ run 36810891463, k=3
Claude Desktop, Code tab audit of real use ⚠️ waived — not exercised in real use for this release (no audit report)
Codex app (ChatGPT.app) audit of real use ⚠️ waived — not exercised in real use for this release (no audit report)
Cursor IDE audit of real use ⚠️ waived — not exercised in real use for this release (no audit report)

Before this can merge: main requires the Real agent evidence check, which is a commit
status, not a check run — it exists only once someone dispatches it on this PR's exact head:

gh workflow run real-agent-evidence.yml -R XTraceAI/agent-plugins --ref promote/memhub-v0.103.0

Push again and the new head needs a new run.

After merge, in this order (RELEASING.md):

  1. Tag the merge commit memhub--v0.103.0 and push the tag first — the Claude pin
    cannot resolve a ref that is not there yet.
  2. Move ref and sha in .claude-plugin/marketplace.json to that tag, by PR.
  3. Smoke-test Claude, Codex and Cursor.

Codex and Cursor ship the moment this merges: their catalogs carry no pin and cache by
version string.

Promoted from XTraceAI/agent-plugins-internal by scripts/promote_ship.py.

Source-RevId: ca5171337a94784c0f9975f2117d1719d4c1384b
@sgonz-xtrace
sgonz-xtrace deployed to production-plugin-release October 1, 2026 18:34 — with GitHub Actions Active
@sgonz-xtrace
sgonz-xtrace deployed to production-plugin-release October 1, 2026 18:34 — with GitHub Actions Active
@sgonz-xtrace
sgonz-xtrace deployed to production-plugin-release October 1, 2026 18:34 — with GitHub Actions Active
@sgonz-xtrace
sgonz-xtrace deployed to production-plugin-release October 1, 2026 18:34 — with GitHub Actions Active

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 87535f2958

ℹ️ About Codex in GitHub

Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Comment on lines +727 to +730
function buttonsAt(band: Band, build: Build, layout: Layout): ButtonsAt {
if (!askOf(band)) return null
const footer = footerOf(band.current, build, layout)
if (footer) return footer

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Associate proposal controls with the displayed bubble

When the server returns two or more previously unannounced proposals in one Stop response, askOf() always selects band.asks[0], but this function places that proposal's controls in the footer of whichever proposed bubble is currently animating. After the first bubble finishes and the next queued proposal is shown, Activate/Reject can therefore appear beneath rule B while decide() acts on rule A; an owner can dismiss the wrong proposed team rule. Only render in-bubble controls when the displayed proposal matches the current ask, or advance the ask in lockstep with the announcement queue.

Useful? React with 👍 / 👎.

Comment on lines +671 to +676
async function announceProposed($: EngineInterface, band: Band, session: string) {
const fresh = (await proposedFor($, session)).filter(p => !band.announced.has(p.ruleId))
if (fresh.length === 0) return
for (const p of fresh) band.announced.add(p.ruleId)
announce(band, fresh.map(p => ({ text: proposalSaid(p), tone: 'proposed' as const })))
band.asks.push(...fresh)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Serialize concurrent proposed-rule checks

If another Stop occurs before the first asynchronous proposedFor() call returns (the lookup permits 30 seconds), both invocations compute fresh against the same still-empty announced set and then each enqueue and append the same rules. This creates duplicate proposal prompts and leaves a duplicate ask after the first decision, so the user is prompted to decide an already-decided rule. Mark ids as pending before awaiting, or guard this lookup with a single in-flight request.

Useful? React with 👍 / 👎.

A promotion replaces plugins/memhub/ only, so public's tests/ and its
codex-hooks generator stayed at 0.88.0 while the plugin moved to 0.103.0.
Nineteen suites then failed guard and probe-tests on #282, each on an
intentional internal change: directive recall retired (#80), capture
never routed to a brain (#79), the rule judge and state sweep (#96, #87),
and the one-line harness hand-off (#90, #97).

The eighteen suites and scripts/gen_codex_hooks.py are internal's at
ca51713 (the promoted commit), with plugins/memhub-staging rewritten to
plugins/memhub. directive_recall_test.py goes from tests/ and scripts/,
as it did on internal. No file under plugins/ changes.

Locally: run_all 72/72, check-plugin.sh ALL PASS, version parity and
test registration pass.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
test: bring public's suites up to the v0.103.0 plugin
@sgonz-xtrace
sgonz-xtrace deployed to production-plugin-release October 1, 2026 19:32 — with GitHub Actions Active
@sgonz-xtrace
sgonz-xtrace deployed to production-plugin-release October 1, 2026 19:32 — with GitHub Actions Active
@sgonz-xtrace
sgonz-xtrace deployed to production-plugin-release October 1, 2026 19:32 — with GitHub Actions Active
@sgonz-xtrace
sgonz-xtrace deployed to production-plugin-release October 1, 2026 19:32 — with GitHub Actions Active

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 32664d293d

ℹ️ About Codex in GitHub

Codex has been enabled to automatically review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Comment on lines +340 to +343
if (e.reason === 'clear' || e.reason === 'resume') {
band.needsRepick = true
band.repickUntil = band.frame + REPICK_FRAMES
void repick($, band)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Clear pending proposal state on a session switch

After /clear or /resume while a proposal is still pending, this handler only schedules an animal repick. asks, queue, and announced remain from the prior session even though subsequent Stop lookups use the new session id, so the new session can render Activate/Reject controls for a rule proposed in the old session and PATCH that old rule. Clear or session-scope the proposal state when the session changes.

Useful? React with 👍 / 👎.

Comment on lines +234 to +235
stamp_cmd = (f'python3 "{script}" stamp --transcript "{moment["transcript"]}" '
f'--turn {turn} --cwd "{moment["cwd"]}"')

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Shell-quote dynamically generated stamp paths

When the transcript path or working directory contains a valid shell-special character such as ", $, or a backtick, inserting it inside double quotes makes the command the fork is instructed to run syntactically invalid or expands part of the pathname. The required stamp invocation then fails (and command substitutions can be evaluated); construct these arguments with shell-safe quoting instead.

Useful? React with 👍 / 👎.

@sgonz-xtrace
sgonz-xtrace merged commit 18c85c3 into main Oct 1, 2026
12 checks passed

This branch was successfully deployed

1 active deployment
production-plugin-release — 32664d29 Deployed Oct 1, 2026 by sgonz-xtrace via Real agent session (claude) #80
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.

1 participant