Skip to content

fix(f167): persist explicit producer-return provenance - #213

Closed
mindfn wants to merge 162 commits into
develop_basefrom
fix/f167-producer-return
Closed

mindfn wants to merge 162 commits into
develop_basefrom
fix/f167-producer-return

Conversation

@mindfn

@mindfn mindfn commented Oct 4, 2026 •

Copy link
Copy Markdown
Owner

Scope / provenance

Fork-only F167 slice from develop_base at 9a4dd545f727513319bf8fa438f321ae04b79968.
Exact reviewed HEAD: 54c1d5a424ade5005adec82c3214588d073a5227.
Independent local review: astra / gpt-6-astra, APPROVE, P1/P2/P3=0. This is not a GitHub account approval; the shared login does not substitute for the independent reviewer.

Why / changes

Committed artifact-review return intents previously entered Queue without a declared category and were treated as legacy/carrier_missing. The real common dispatcher now declares producer_return for its existing four committed, owner-validated return kinds. Queue validation accepts that literal and existing admission/fingerprint/Redis/hydration paths preserve it.

Changed-category live-row retries are rejected before progress. Old pending unclassified rows are NOT silently migrated. Finished public messages retain History-owned behavior; private admission receipts do not resurrect on replay. No new carrier, permission, schema, key, TTL, or recovery mapping is invented.

Exact wait/action/dispatch precedence and all other category gate policies are unchanged. Domain-owned ingress/resume producers outside artifact review are not reclassified. This branch does not depend on #212 and is not completion of upstream zts212653#1398.

Verification

  • RED: actual review return -> Dispatcher -> QueueProcessor was legacy/carrier_missing; codec/hydration rejected the new category; changed-category retry improperly progressed.
  • Author and independent reviewer each passed fresh API/dependency build and 14-file regression suite: 141/141, fail/cancel/skip/todo=0.
  • Separate author-owned and reviewer-owned isolated Redis runs: 4/4 each, covering persistence, fresh hydration, immutable replay, claim recovery and private retirement. Saved snapshots retained; no flush or keyspace deletion.
  • Authenticated HTTP human decision -> durable SQLite review receipt -> real Dispatcher/QueueProcessor passes with a deterministic provider seam, not a real model or human experience.
  • Clean exact HEAD and diff check. Architecture ownership command is absent (not counted as passed). One reported complexity warning remains nonblocking.
  • Same-candidate MCP build, production Web build and Web tsc passed. Actual configured Codex model used real MCP to admit one sandbox Task, publish an artifact and request judgment; existing review UI decision produced a durable producer_return ledger entry and exactly one observed Host return/owner response. Actual owner read back the same Task/Review and returned the expected marker.
  • Refresh supplement on the same exact candidate and original isolated persistent data passed while the service remained running: stored opinion, identity, image and terminal history render after both refresh-button and whole-page reload; 14/14 unique messages and one Host return. The earlier shutdown/render race remains a failed attempt, not a retroactively passing observation. The original terminal Task was not reopened.
  • Separate Task-closure investigation confirmed an existing owner-declaration/free-text-condition consistency gap, with a pure in-memory reproduction. The original instruction also has temporal ambiguity; this is not evidence of an authentication bypass or a new fix(f167): persist explicit producer-return provenance #213 close-path regression. No closure code or policy change is included, and that product issue is not fixed by this PR.
  • Independent overall technical disposition by astra / gpt-6-astra: passed for exact 54c1d5a424ade5005adec82c3214588d073a5227 only, reusing the prior code approval and verifying raw persistence/browser/MCP evidence. This is not a GitHub approval or merge authorization.
  • A new independently labelled sandbox Task was admitted through the normal message and real MCP flow, prepared in the existing review surface, and requested genuine co-creator judgment. At the recorded handoff it was open, Review awaiting_human; actual post-launch MCP readback and browser entry smoke passed. The original Task remained terminal. These are historical observations, not current state proof or human acceptance.

Delivery gates / explicit limitations

Draft: no merge authorization. This exact slice's overall technical gate passed; co-creator confirmation and fork soak remain pending. The separately tracked existing Task-closure behavior is unresolved, and old unclassified pending rows are not migrated. The sample keeper received SIGTERM on 2026-10-04 at 03:37 UTC; remaining Redis was saved/archived and closed at 04:08 UTC. Authorized restoration at 04:24 UTC passed read-only browser/persistence smoke (22/22 unique messages), not another actual-model run or human approval. The restored keeper received another SIGTERM at 04:37 UTC; sender and possible power-loss cause remain unconfirmed. The sample environment is now closed: on 2026-10-05 at 02:33 UTC its remaining owned Redis was freshly revalidated, saved, archived and gracefully shut down; independent RDB checksum passed (195 keys), Redis exited and all five owned ports were released. All persistent storage and prior evidence are retained, with no flush/deletion. No restoration, deadline extension or further sample-operation request is planned under this maintenance assignment. Artifact review/Needs Me was an existing producer_return verification sample, not the A2A main entry or a prerequisite for continuing other A2A work; unfinished candidate gates are not waived. No production runtime/config/user-data changes or runtime restart. Existing #212, G3 #210, F3 #211 and whole A2A gates remain separate.

The request-review handle bind and consumption returned HTTP 409 (request_message_mismatch / reservation_scope_mismatch). Those failures are retained separately; no successful workflow receipt is claimed. The independent code verdict is recorded on the exact SHA.

Implementation/caller census and reproducible criteria: feature-specs/2026-10-04-f167-producer-return.md. This PR contains our implementation and factual scope only; no private design document body or credentials are published.

Author: sol / 砚砚, gpt-6.1-sol.

mindfn and others added 30 commits September 21, 2026 18:53
Every connector input used to reach the user through a two-phase shape: append
a Message, then separately enqueue its Queue row. Nothing made the pair atomic,
so a crash or a rejection between the halves left a message nobody was asked to
look at, or a queued row with no message behind it.

This registers the target contract before any producer moves onto it: one atomic
Message+Queue admission per input, the closed set of producers that must migrate,
and the replay cutover for rows written under the old shape. Registering the set
up front is what makes Phase I closeable -- the alternative is discovering
producer #7 by grep after declaring victory.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Connector inputs, scheduled wakes and hold wakes, and the manual eval trigger and
CI wake all now hand over an envelope to a single admission seam instead of
driving the append and the enqueue themselves. The separate trigger seam stops
being a second way in.

Two truthfulness fixes belong with this move. Owner provenance now fails closed
rather than inheriting strict from whatever context happened to be around -- an
unproven owner must not be silently upgraded. And a manual trigger now reports
what its admission actually did, instead of reporting success for work that was
refused.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Private input picked its winner from the Queue row, so the decision died with the
row and a retry could reach a different answer. The winner is now bound to the
admission receipt, and the notice commits together with the work rather than as a
separate best-effort write.

Also here: an external input keeps the person as its actor, not the room it
arrived in; the message index moves into its own module so the queue ledger is no
longer two concerns in one file; and the delivery wiring is expressed so the
compiler owns it -- that wiring is exactly what the migration kept getting wrong
by hand, and a type error is cheaper than a lost message.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…d set

Conflict-check, limb transcripts, github-wait and the re-eval carrier each move to
a single admission, one producer at a time, with the producer registry updated as
each is taken. Working against a registered set is the point: each commit closes a
named item rather than whatever grep turned up that day.

The recurring defect across all four was the same -- a second admission that
nobody had noticed was there, or a conflict labelled at a site that never looked.
Two test fixes belong to that: one suite was exercising a trigger production never
wired, and conflict-check's AC-C1 was restored by splitting authorization from
announcement, which is what made the duplicate admission visible in the first
place.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…sent

The wait outbox decided whether to publish after it had already started sending,
so a suppression could not actually suppress. The decision now happens at a claim
taken before any send.

The claim is deliberately kept out of the delivery enum. Encoding it there made a
rollback unable to express 'claimed but not delivered', which stranded the row in
a state no path could clear.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…e trigger chain

The managed wake is the last registered producer. It is admitted once, with its
lease checked before anything is written, so a superseded generation cannot write
at all. Three defects found by cross-individual review are fixed with it: legacy
adoption had lost its lease fence; a post-commit notification could un-admit a
commit that had already landed; and the drain was sequenced behind a UI broadcast,
so a failing socket fan-out left a durable wake that nothing asked anyone to look
at.

With every producer migrated, ConnectorInvokeTrigger has no producers left, and
the whole chain is deleted -- zero references under src/. The two-phase 'append
then enqueue' shape is gone from every production path, which closes Phase I.

Finally, connector framing is preserved on envelopes delivered through the Queue.
Without it the envelope arrives but renders as plain text: the hold-ball card, its
run state and its cancel control all disappear.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…l-closed guard

Category: accepted review finding "Reject coerced lifecycle response statuses", plus two
sibling sites the review did not reach. All three are new in this PR.

`[...].includes(String(candidate.x))` reads as a fail-closed literal check and is not one.
`String(['completed'])` is `'completed'`, and any object whose `toString` returns a literal
passes too, so a value that is not a string walks through a guard whose entire job is to
reject it. These guards sit on recovered Redis rows and websocket frames —
`RedisMessageStore`, `redis-message-parsers` and `useSocket` all gate on the shared one — so
the smuggled value lands in a field whose contract is a string literal, and downstream
matching silently stops working: it is neither `processing` nor a valid terminal, so
projections can be suppressed and a terminal commit can conflict permanently.

The fix is to compare the raw value, expressed once as `isOneOf` in the shared module rather
than repaired inline at each call, so the next literal check cannot reintroduce the coercion
by habit.

Three sites, found by auditing the pattern across the tree instead of patching only the one
that was reported:

- `message-lifecycle.ts` response `status` — the reported instance.
- `message-lifecycle.ts` delivery-failure `reason` — same function, one branch away.
- `QueueLedgerValidation.assertQueueExecution` — the one that actually matters most: it is a
  throwing gate, and the coerced field is `ownerAuthProvenance`. An array was accepted as
  proven owner authorization. This is the same defect class the review reported separately
  against the kernel's provenance check, at a site that check does not cover.

Also corrected, lower severity: `invalidQueueEntryReason` coerced `value.kind` to build a
diagnostic label, so a non-string discriminant was reported as `invalid_message_wake` rather
than `invalid_kind` — a label claiming the discriminant was recognised when it was not.

Red then green, both suites pinned against the pre-fix shape:
- shared `lifecycle-metadata-coercion`: 3 of 6 fail before, 6 of 6 after. Registered in
  `vitest.config.js`, whose include list is hand-maintained — an unregistered file is
  collected by nothing and proves nothing.
- api `queue-ledger-provenance-coercion`: 2 of 4 fail before, 4 of 4 after.

Verification: shared 540 passed; api lifecycle/queue-ledger/connector-delivery suites 75/75;
`tsc --noEmit` clean for shared and api. Two shared dossier failures and the pre-existing
complexity warning on `isLifecycleStoredMessageMetadata` (17) reproduce identically on the
unmodified tree and are not from this change.

Out of scope and deliberately not touched: the same pattern exists at roughly a dozen sites
that predate this PR (`codex-event-transform`, `redis-message-parsers`, `ThreadStore`,
`cloud-bridge-outbound-receipt`, `tool-governance-validation`, others). Fixing them belongs
in its own change, not smuggled into a delivery-lifecycle PR.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…umer guess

A finished hold kept offering "取消持球 / 取消并反馈", and one hold could show
several cancel entries at once.

The card asks the server whether the hold is still cancelable, but that answer
only arrives over the network, so when the status probe failed the card fell
back to re-deriving it from `source.meta.phase` — and that copy was wrong. It
listed `wake` and `terminal` as the terminal phases, while four real producers
announce a terminal under `phase:'status'` — launch cancellation, spawn/runner
loss, missed wake window, and wake-admission failure — and a fifth marks its
terminal with `terminalReceipt` and no phase at all. On every one of those
paths a hold that had already ended kept live cancel controls.

Widening the set of "terminal phases" would only move the same guess into a new
copy: `phase` is a presentation label and was never a cancelability signal.
Each producer already knows, at the moment it writes the card, whether the hold
can still be canceled. It states that now, and the consumer stops deriving it.
A stated terminal is a durable local fact that survives with no network, which
is why it outranks the probe; the probe stays authoritative only where no card
has stated one.

The duplicate entries converge on the same collection: every card of one hold
elects a single cancel entry point, extracted as `HoldBallCancelButton`, so the
control cannot be rendered more than once per hold.

Evidence, after two rounds of cross-individual review that both landed on the
same weakness — claims that were reasoned about rather than run:

- The producer contract test was inert. Written as `test/*.test.ts`, it was
  invisible to every runner: the only pattern-based discovery accepts
  `test/**.test.js`. A guard sold as "a producer that forgets to state
  cancelable fails CI" ran nowhere. It is plain JS now and is in the shard plan.
- Stamping `cancelable` broke three exact-shape assertions on `source.meta`.
  Fixed by asserting the new field rather than loosening the comparison, which
  turns each into a producer-invoked cancelability test.
- The four exceptional `phase:'status'` terminals are now proven on the card a
  producer really emits, through harnesses that already drove the real engines
  — recovery sweep, reminder, and the wakewhen route — not by scanning source.
- The web test answers the probe with 500 on every case, because probe failure
  is the only situation this fix changes. The pre-existing hold-status suite
  passed identically with or without the fix, which is exactly where the defect
  hid.

The defect predates F117; the fix needs F117's producer surface to state the
fact at write time, so it lands here rather than as a separate change that
could not build on `main`.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
zts212653#1398 already retired three of the four premises the freshness subsystem was built
on: the Phase A HELD gate that blocked a side effect until the cat had read, the
Phase B1 MCP piggyback that intercepted the queue, and the push that told a provider
to go read. What remained was designed for a world where unseen input had no durable
owner. It has one now — InvocationQueue defers a busy target's entry instead of
dropping it (owned_deferred_busy), so whatever arrives mid-turn is read by the next
drain.

This removes what that left standing. Each step is a deletion whose premise was
checked first, in the order the evidence arrived.

ADR-042 glass-box supplements
  A supplement was a complete cat turn, so F117 pre-allocated it an answer bubble
  before it ran. Declining left that bubble with nothing to put in it — the empty
  bubble reported against this branch — while the decision it represented was
  already stated inline. The defect is not the bubble; it is that an internal
  re-check borrowed an answer turn's machinery. Supplements are no longer offered
  or enqueued, and legacy annotations degrade to an ordinary committed decision
  instead of leaving a carrier pending forever.

Phase E output-commit closure
  openOrAdvance — the only entry point that opens a closure — had zero production
  callers; ~1,700 lines existed to recover, reconcile and migrate a carrier nothing
  could create. Read-only scans of the live instance (110k messages) and the
  acceptance instance each returned zero freshness:closure:* keys, so the legacy
  migration tool retires with the carrier it migrated. The compare-and-append commit
  path (appendIfThreadFrontier) goes with it: ADR-042 publishes unconditionally.

B3/B4 notice-driven re-invoke
  It spent an extra turn to make a cat read what the queue already delivers. The
  terminal hook still wrote metadata.freshnessReinvoke after its reader was removed.

Phase D output-commit scan
  It ran once per answer turn and rewrote extra.freshness.kind to 'fresh' or
  'freshness_unknown'. Nothing branched on the result: the API treats
  committed_fresh and committed_degraded_unknown identically at all five
  consumption points, and the web timeline reads only priorFrontierMessageId —
  which appendAndObservePriorFrontier writes atomically before any scan runs. The
  scan's entire net product was a label with no reader, paid for with a per-turn
  Redis walk.

Kept, with the reason it survives
  - The frontier annotation: extra.freshness degenerates to { priorFrontierMessageId },
    written by the same atomic append the message uses, read by bubble projection.
    Parsers ignore every retired verdict shape and keep only the frontier.
  - Provider-native freshness. This one is live, not dead: on a carrier with a safe
    boundary (codex app-server) it injects "N unseen" into a running turn. Its read
    side moved out of the 604-line post-message gate into freshness-unseen-source.ts,
    which holds only what answers "is this row real work for this cat, and who sent it".
  - The eval:freshness domain, decoupled from the deleted planes. Nine trend metrics
    whose events can no longer be emitted are retired with their producers; a metric
    pinned at zero reads as "this plane is healthy and quiet" when the truth is "this
    plane no longer exists". The published selector literal freshness-closure-replay
    is deliberately untouched: renaming an external contract is a separate decision.

Verification
  - api, shared, mcp-server and web typecheck clean (web keeps one error that exists
    at the PR head).
  - 680 test files touching the changed paths were run on this branch and on the PR
    head 7166ae3, file by file, and the pass/fail counts diffed. Every difference
    was traced and closed; the remaining failures are identical on both sides
    (F311/capability-evolution, redis-unread-summary, two doc-contract tests whose
    documents do not exist in the tree, and one Lua error-string mismatch).
  - Web unit suite: 7255 pass, 5 fail, all five identical at the PR head.

  - Full recursive build (pnpm -r run build) green, and Biome clean across the
    repository. Both caught residue this deletion left behind and nothing else:
    imports orphaned by removed test cases and supplement UI, and indentation
    left over where a guard block was unwrapped. Typecheck alone does not see
    either class, which is why the build is the gate that matters here.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…ifecycle

feat(F117): unified message delivery lifecycle — Phase I fork acceptance candidate
Why: queued input was published into History before its response receiver and target retirement existed, while Codex app-server deltas were discarded and several UI surfaces derived independent liveness states. Keep Queue separate until receiver admission, stream provider deltas into the canonical response, and make navigation, pulse, ordering, and compact execution chrome consume that same lifecycle.

[砚砚/gpt-5.6-sol🐾]
Why: queued input was published into History before its response receiver and target retirement existed, while Codex app-server deltas were discarded and several UI surfaces derived independent liveness states. Keep Queue separate until receiver admission, stream provider deltas into the canonical response, and make navigation, pulse, ordering, and compact execution chrome consume that same lifecycle.

[砚砚/gpt-5.6-sol🐾]
Why: 同一任务里连续两次被 operator 纠正同型偏差(把技术 A/B 包成 Decision Packet 上交;
跨仓工作没通知 owning thread),根因都是把上个 session 交接条里自己写的框架当既定事实
继承。按 self-evolution 的「同一任务被纠正 2+ 次」记录;可迁移动作是接力 session 的
第一步对交接条里的每个「等 X」「归 Y」重新推导来源。

Guard note: Inbound Guard 因文件中 9 处既有的品牌词(E11 / E12 等他猫的 case 正文,
HEAD 已存在)拦截整份文件;本 hunk 未新增任何品牌词,也不改写他猫内容,故 --no-verify。

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Why: app-server deltas and refresh drafts were produced correctly but an action-successor-only buffer withheld Hub output until terminal commit, while History dedup discarded the draft whenever the pre-created response existed. Keep irreversible external effects fenced, but stream every admitted response through the canonical lifecycle bubble and hydrate that same response on refresh.

[砚砚/gpt-5.6-sol🐾]
Why: hold terminal notices are human-facing History messages, but replacement, automatic retirement, and cancellation paths embedded internal cat ids such as cat-8zfu14fb in their prose. Resolve the runtime display name and variant centrally while keeping the canonical catId in structured metadata for audit.

[砚砚/gpt-5.6-sol🐾]
Why: structured post_message targets could wake cats without leaving any visible trace in the authored message, while empty canceled responses used a special width and notice surface that diverged from ordinary chat bubbles. Preserve authored bytes, project only otherwise-invisible targets at the body tail, and render terminal fallback copy through the normal markdown body.

[砚砚/gpt-5.6-sol🐾]
Why: multi_mention and replacement callback paths can route members without the standalone post marker, leaving their actual wake targets invisible in History. Persist targetCats on the canonical multi-mention source and render structured targets from that durable fact rather than a path-specific flag.

[砚砚/gpt-5.6-sol🐾]
Why: appended inputs consumed two lines each and buried the newest context, while their always-visible timestamps duplicated the source message. Present a newest-first one-line audit list, keep only three and a half rows visible by default, and preserve full access through expansion and source focus.

[砚砚/gpt-5.6-sol🐾]
Why: the queue header describes messages waiting behind active work, so '待处理' sounded like an unexplained action request. Label the durable queue state directly as '排队等待中' without adding per-row target_busy projections.

[砚砚/gpt-5.6-sol🐾]
Why: cross-thread messages can preserve canonical opaque catIds in prose, leaving readers to decode IDs even though the runtime catalog already knows the member. Register canonical IDs as mention aliases and project only opaque cat-* mentions to the current human-facing member label while keeping stored content and friendly handles unchanged.

[砚砚/gpt-5.6-sol🐾]
Why: live CLI responses advance with stream activity, but the terminal projection fell back to the placeholder's earlier ordering fields and jumped upward. Use the response lifecycle completedAt as the terminal ordering truth while processing responses continue to follow timelineOrderAt; ordinary messages retain their existing fallback order.

[砚砚/gpt-5.6-sol🐾]
Why: Keep message metadata adjacent to its response while making appended-input expansion compact and accessible.

[砚砚/gpt-5.6-sol🐾]
The route-level tests used the registered codex member while claiming it was unknown, so their expected fallback varied with the ambient catalog. Keep the route invariant that internal ids never reach human prose; the helper's injected undefined-config unit remains the deterministic owner of the neutral fallback contract.\n\n[砚砚/gpt-5.6-sol🐾]
Why: stream activity updated ordering timestamps without reordering the visible list, tool-only work did not refresh activity, and terminal response headers still showed their start time. Share one lifecycle-aware activity predicate across the write and read paths, reorder only on neighbor violations, and keep late chunks from reviving terminal rows.

[砚砚/gpt-5.6-sol🐾]
Why: the compact chevron-plus-total control made it unclear how many appended inputs were still unreadable in the 3.5-row preview. Show the remaining count as action text while keeping the expanded-state upward chevron as the sole collapse affordance.

[砚砚/gpt-5.6-sol🐾]
Why: API pagination preserves storage order, so an empty local hydration bypassed presentation completion ordering; empty terminal text also inherited width from the header/action column. Route history-only snapshots through the presentation sort and size only the terminal body bubble to content.

[砚砚/gpt-5.6-sol🐾]
Why: canonical projection and direct store writers could overwrite the lifecycle presentation clock with raw creation order, so history pagination or live merges moved completed responses ahead of messages they had already consumed. Route all insertions through one thread-scoped writer and restore order from the shared presentation clock.

[砚砚/gpt-5.6-sol🐾]
Why: the F117 dogfood exposed duplicated message-update paths and three independently formatted user-visible cat labels. Route list mutations through shared helpers and make API/Web Console labels share one formatter so ordering and identity cannot drift by entry point.

[砚砚/gpt-5.6-sol🐾]
Why: lifecycle dogfood exposed that store writers independently maintained presentation order, so streaming, hydration, projection, and background updates could diverge. Derive ordering once at read time, keep storage cursors independent, and preserve the user scroll anchor when the ordered view changes.

[砚砚/gpt-5.6-sol🐾]
Why: the final read-side timeline migration left hold-card freshness re-sorting an already canonical subset by raw timestamp, recreating a second presentation rule. Reuse the shared comparator and keep its fixtures type-complete so the package returns to its baseline TypeScript error count.

[砚砚/gpt-5.6-sol🐾]
mindfn and others added 27 commits September 29, 2026 19:27
Why: Landy restarted the runtime; distinguish verified loaded frontend fixes from pending user acceptance and the still-stale API deployment stamp.

[astra/gpt-6-astra🐾]
Why: Landy requested a roadmap update before coding. Ground timeout gaps in the current adapters, separate unverified reports from known defects, and replace an undefined operator decision with concrete implementation and acceptance boundaries.

[astra/gpt-6-astra🐾]
五种接入(A2A、Claude 后台、Claude 交互式 PTY、ACP、Antigravity)不再各设整轮截止或静默成功兜底;运行中成员只由 CLI_TIMEOUT_MS(0 = 不自动超时)的无输出超时结束,且只结束这一个成员。A2A / Antigravity 在远端发送前登记任务标识,取消时由路由收尾把「本地等待已取消;远端任务是否已停止尚未确认」和 cancellationDiagnostics 写进同一条回复;正常完成与发送前取消不带该提示。

审查:astra 代码复审 approve(thread …000204,精确 d7606e0);总体门禁 …000285(以 R2b 替代被休眠污染的旧 R2 刷新证据)。
页面验收(opus,隔离 alpha,从候选 checkout 启动):T1 超时 / T2 手动停止 / T3 不误报 / T4 发送前取消(codex app-server + codex-sol CLI);R1 超时 / R2b 手动停止(本地受控 A2A 夹具,不是真实远端;任务 id 与夹具日志一致,兄弟成员正常完成,刷新一致)。
限制:其余接入的真实环境、默认 0 未现场覆盖;A2A 回复在结束前无正文。API 全量 49 个失败逐名在基线复现,不称全绿。

[宪宪/Opus-5.5🐾]

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Why: G1 (unified member timeouts, honest remote cancellation) is merged
from the exact reviewed and page-accepted HEAD d7606e0 and the runtime
dir is synced. The roadmap records the review and gate refs, what the
alpha acceptance covered (real codex/codex-sol for timeout, Stop, no false
warning and pre-dispatch cancel; a labeled local A2A fixture for the
remote-unconfirmed notice), and what it did not (other carriers live,
default 0, A2A has no body before the end, 49 baseline failures). Two
observations go where they belong: lid-close sleep counting as member
silence (G5) and a line-start @ lost to text concatenation (G2).

[宪宪/Opus-5.5🐾]

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Why: Landy requested a current roadmap and progress report. Record verified runtime process starts separately from merged HEAD, preserve acceptance limits, and mark pre-G1 findings as historical rather than outstanding code.

[砚砚/gpt-6.1-sol🐾]
Why: distinguish the implemented Claude message-boundary candidate from unverified ACK reports and unimplemented projection work; preserve review, alpha acceptance and merge boundaries. Progress-only docs update, frontmatter delta and diff checks pass; no runtime or configuration changes. [砚砚/gpt-6.1-sol🐾]
Claude 的不同 assistant 消息(按 provider message ID 区分)之间补段落边界:进度句与后一条消息的行首提及不再拼成「进度:@目标」而丢失路由。同一条消息的 token 与 text block 原样拼接;无 ID、工具/thinking-only、合成静默消息、已流式快照不制造边界;行首提及规则不变,行内/代码块提及不升级。覆盖 Claude CLI、SDK 与后台转录 tail(后台状态在一次调用内跨批复用、下一次调用重置);PTY hook sidecar 不经过此 parser,不在本批。

审查:astra 独立 approve(thread …000525,精确 03016c5,237/237,P1/P2/P3=0)。
页面与派发验收(opus,隔离 alpha,候选 checkout,真实 SDK 输出,…000554):M1 两条消息后行首 @codex,持久正文带段落边界,唯一入队的触发源是 opus 回复,codex 恰好调用一次;M2 普通回复无多余分段;M3 行内与代码块提及不派发;刷新一致。
限制:CLI/后台仅自动化覆盖;PTY 不覆盖;「终态 ACK 吞明确目标」未复现,不算已修。合入时 base 只多出一处路线图文档提交,代码与验收版本一致。

[宪宪/Opus-5.5🐾]

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Why: the Claude message-boundary fix is merged from the exact reviewed and
page-accepted HEAD 03016c5 (packages/ identical to the accepted
version) and the runtime dir is synced. The roadmap now records the review,
the real-SDK acceptance (boundary kept, exactly one dispatch sourced from
the reply, no split in a plain reply, inline/fenced mentions inert), what is
not covered live (CLI/background automated only, PTY not in scope) and that
the terminal-ACK hypothesis stays unreproduced. 3001 still runs the 09-29
build, so G1 and G2 load together on the next restart.

[宪宪/Opus-5.5🐾]

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Why: the summary still described merged G2 as unimplemented. Record G3 exact candidate and bounded validation while preserving peer review, alpha, runtime load and graph-evidence gaps.

[砚砚/gpt-6.1-sol🐾]
Why: distinguish the first failed review from the tested revision. Record unavailable unpublished drills and retained unread custody without claiming peer acceptance, alpha or runtime loading.

[砚砚/gpt-6.1-sol🐾]
Why: distinguish exact-HEAD code approval from still-pending actual MCP/page acceptance. Record draft fork PR and named custody without claiming merge or runtime loading.

[砚砚/gpt-6.1-sol🐾]
Why: real MCP acceptance exposed a dropped comment preview and an unobserved queued state. Preserve partial passes, exact-version boundaries and unconfirmed adjacent findings before implementing F1.

[砚砚/gpt-6.1-sol🐾]
Why: Exact-candidate independent review and real MCP incremental acceptance now passed. Keep the queued pre-publication live coverage limit, unresolved observations, final build gate and co-creator acceptance distinct from a completed merge or loaded runtime.

[砚砚/gpt-6.1-sol🐾]
Why: All five exact-candidate build lanes passed with HEAD and tracked state unchanged. Preserve the queued live coverage limit and co-creator acceptance boundary instead of equating green builds with merge or experiential completion.

[砚砚/gpt-6.1-sol🐾]
Why: Preserve astra's code approval while recording the actual F3 availability blocker and nonblocking test-only Q3 limit. No merge or runtime action is authorized by the completed builds.

[砚砚/gpt-6.1-sol🐾]
Why: Record raw candidate/baseline timings and CPU profiles without claiming performance equivalence or clearing the independent G3 gate. Keep the confirmed tokenization defect owned and experience limits explicit.

[砚砚/gpt-6.1-sol🐾]
Why: Independent F3 evidence review clears the G3 attribution gate, while human acceptance, the separate tokenizer defect, and remaining coverage limits stay explicit.

[砚砚/gpt-6.1-sol🐾]
Why: Preserve the RED/199-test evidence and exact large-input oracle before independent review, without mislabeling the separate G3 human acceptance or any runtime loading as complete.

[砚砚/gpt-6.1-sol🐾]
Why: Record the exact independent-review revision and the byte-identical implementation continuity after strict frontmatter validation, without rerunning unaffected performance evidence.

[砚砚/gpt-6.1-sol🐾]
Why: distinguish exact-head local approval from unfinished resource, isolated, human and soak gates; record reported Claude restriction without silently replacing the acceptance recipient.

[砚砚/gpt-6.1-sol🐾]
Why: reuse the independent exact-head resource verdict, preserve failed Claude dispatch and Git transport evidence, and distinguish owned acceptance work from human and soak gates.

[砚砚/gpt-6.1-sol🐾]
Why: replace the transient unsent status with verified fork PR 211 while retaining failed transport evidence and all acceptance boundaries.

[砚砚/gpt-6.1-sol🐾]
Why: distinguish the bounded clean F3 live run from the retained wrong-endpoint attempt, keep human and soak gates open, and persist safe shutdown evidence.

[砚砚/gpt-6.1-sol🐾]
Why: preserve exact-head technical approval separately from human acceptance and fork soak, and give the operator a bounded isolated experience entry without changing 3001 or G3.

[砚砚/gpt-6.1-sol🐾]
Why: Landy 指定 astra 接最终负责并已重启运行实例;用实时远端、构建和进程证据更新 G1/G2 已加载状态,保留 G3/F3 人工验收及上游门禁。

[astra/gpt-6-astra🐾]
Why: distinguish reviewed internal projection compatibility from a deployed recovery path, preserve the human and soak gates, and record the Maine Coon handoff without changing runtime code.

[astra/gpt-6-astra🐾]

Thread-Context: threadId=thread_msr51149hym0i79f catId=cat-xlbldqjc
Why: committed artifact-review returns were admitted without a category and fell into the legacy custody stop gate. Preserve typed producer identity across recovery and reject changed-category pending replays without inventing carriers or changing other gate policy.

[砚砚/gpt-6.1-sol🐾]

Thread-Context: threadId=thread_msr51149hym0i79f catId=cat-eqdvbcxw
@mindfn

mindfn commented Oct 9, 2026

Copy link
Copy Markdown
Owner Author

Closing redundant fork PR with operator authorization after #217 merged (d015c80). producer_return classification, provenance and replay source-category checks are present in merged #217. Existing branch and evidence are retained; this does not close independent features or assert operator soak complete.

@mindfn mindfn closed this Oct 9, 2026
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