Repository navigation
chore(release): memhub v0.103.0 - #282
Conversation
Promoted from XTraceAI/agent-plugins-internal by scripts/promote_ship.py. Source-RevId: ca5171337a94784c0f9975f2117d1719d4c1384b
There was a problem hiding this comment.
💡 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".
| 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 |
There was a problem hiding this comment.
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 👍 / 👎.
| 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) |
There was a problem hiding this comment.
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
There was a problem hiding this comment.
💡 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".
| if (e.reason === 'clear' || e.reason === 'resume') { | ||
| band.needsRepick = true | ||
| band.repickUntil = band.frame + REPICK_FRAMES | ||
| void repick($, band) |
There was a problem hiding this comment.
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 👍 / 👎.
| stamp_cmd = (f'python3 "{script}" stamp --transcript "{moment["transcript"]}" ' | ||
| f'--turn {turn} --cwd "{moment["cwd"]}"') |
There was a problem hiding this comment.
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 👍 / 👎.
MemHub plugin v0.103.0, built from internal main.
Source-RevId:
ca5171337a94784c0f9975f2117d1719d4c1384bSHA256SUMS:
a78b8d5e6bc057e43278054b56628ed04fc33f327d7dcd4a30d4ec1589c0f314Built by promote run 36905941664 at
XTraceAI/agent-plugins-internal@ca5171337a94784c0f9975f2117d1719d4c1384b: the plugin suites pass at that commit, and theexport is verified — named
memhub, one version across all four manifests, the productionbackend in
.mcp.json, and nothing shaped like a credential. Every file's digest wasre-checked against
SHA256SUMSin the clone this branch was pushed from, so what is here iswhat that run produced.
What's in this release
Everything merged on internal
mainsince the last release, v0.88.0 (711c0c1a0): 30 change(s), 25 of them in the plugin (full range).Breaking changes
Features
Bug fixes
Changes
Merged on internal but not in the plugin (5)
Proved on staging, per surface (
scripts/surface_evidence.py, source commit and v0.103.0):releasetierreleasetierreleasetierreleasetierBefore this can merge:
mainrequires theReal agent evidencecheck, which is a commitstatus, not a check run — it exists only once someone dispatches it on this PR's exact head:
Push again and the new head needs a new run.
After merge, in this order (RELEASING.md):
memhub--v0.103.0and push the tag first — the Claude pincannot resolve a ref that is not there yet.
refandshain.claude-plugin/marketplace.jsonto that tag, by PR.Codex and Cursor ship the moment this merges: their catalogs carry no pin and cache by
version string.