Skip to content

Credit interventions to the right actor: steers, task notices and unknown root prompts #133

Closed

Description

@lukemaj

What: Observer credits interventions to the right actor: T3 steers and delegated-task notices stop counting as Luke's rejections and prompts, and unknown root-thread actors carry a reason.
Why: In the 2026-10-12 to 2026-10-19 window all 9 "user rejections" were test fixtures or tool calls stopped by a T3 steer, completion notices counted as user prompts, and 574 root-thread rows had no actor, so the user-intervention view overstates human corrections.
So what: A Sol worker implements it, Grok and Muse Spark review, and Luke approves the merge.

Outcome

agent-observer interventions --created-by user lists only moments a person acted, with one row per steer, and every unknown actor says why it is unknown.

Evidence (bestia ledger, window 2026-10-12T14:20+02:00 to 2026-10-19T14:20+02:00)

  • Six "rejections" in claude:d8e0df86-1aab-4821-a85d-0f0c1dc151ec are the Chromeria urgent-interrupt-delivery fixture; three were sent by agents but stored as created_by=user.
  • ev:claude:0dfef3b4-54d3-4696-b518-342a8578a8b8/permission/toolu_01KCee4y9ufc3NL3N66XcnrY, ev:claude:170e2046-0af7-466f-b6f6-1292c00e829b/permission/toolu_01ShEowpLDCTcko5WKtDwxxV, ev:claude:77c7e955-ce6b-470d-9112-1f8e4510ea53/permission/toolu_01CJN2hHVnn7H2oFMFVZBD6Y: tool results denied by a T3 steer whose next prompt is the T3 "interrupted your previous turn" note. One steer yields up to three user rows (rejection, interrupt, prompt).
  • "Delegated task … reached a terminal state" notices stored as user prompts: sub:codex:msg_01a13ed6-5dfc-7bd1-b8d5-1d343ae8dd69, sub:codex:msg_01a13f20-d551-7c72-8dcf-ba06bfde3f2e, sub:codex:msg_01a144e1-590d-7c50-99d3-5c6395b5c64b.
  • 1,972 unknown-actor interventions: 1,302 on child threads (expected), 96 with no thread, 574 on root threads, 570 of those Claude prompts.
  • This continues the 2026-10-04 finding that cancelled turns were counted as human corrections without an actor.

Contribution to the Objective: explicit ownership with visible gaps ("gaps stay visible").

Elon record

  • Requirements and who asked: Luke (2026-10-19 review follow-up): user-intervention counts must reflect people, not transport events, so weekly reviews judge real moments.
  • Deleted: deleting raw permission or interrupt records; they stay as evidence, only actor and grouping change.
  • Bottleneck: reviewers spent rounds disputing fixture and steer rows; correct attribution removes that work.
  • Checked myself: intervention counts and the cited rows via agent-observer interventions --json on bestia.

Acceptance criteria

  • A tool denial caused by a T3 steer or interrupt yields one interrupt intervention linked to its follow-up prompt, attributed to the steer's sender (agent when an agent sent it); raw events remain.
  • Delegated-task completion notices are created_by=agent.
  • Unknown actor on a root-thread prompt carries a stored reason; fix the cause for the Claude root prompts if it is an Observer defect.
  • Re-running interventions --created-by user for the window above shows none of the cited non-human rows.

Non-goals

  • Judging whether interventions were corrections (that is the verdict layer).
  • Changing child-thread attribution, where unknown is expected.

Blockers

None. Release PR #122 (1.3.0) is open with a Human Gate; coordinate the version transition with it.

Required proof

  • Regression tests from sanitized real records for each case (fixture steer, agent steer, completion notice, root-thread unknown).
  • Window recount before and after, reported on the PR.
  • Full test suite; independent review on the exact head.

Activity

  1. lukemaj commented on Oct 19, 2026

    @lukemaj
    ContributorAuthor

    Correction to the Blockers section: release PR #122 (1.3.0) was already merged at 2026-10-19 13:09 Warsaw, so it is not open. Fixes go on top of 1.3.0 as patch releases.

  2. lukemaj commented on Oct 19, 2026

    @lukemaj
    ContributorAuthor

    What: #133 is implemented and proved in draft PR #135 at abcee573722755abae9c3f5354009e4ec7e0bb3b.
    Why: Explicit transport sender evidence removes false human rejections and prompts while unmatched native authors stay explained.
    So what: The parent schedules Grok and Muse Spark reviews on this head; Luke approves merging to main.

    Canonical implementation handoff: #135. The PR body owns the complete sanitized recount, source diagnosis, acceptance evidence and Elon record.

    • Exclusive branch/workspace: fix/133-intervention-actors, /home/luke/.t3/worktrees/agent-observer/fix-133-intervention-actors; exact base 1fbbb0fe3098842d19e04bc5a6b35a3667ecda90. Branch pushed and remote head verified; working tree clean. No writes in other checkouts.
    • Version: 1.3.0 → 1.3.1, including canonical VERSION, three plugin mirrors and changelog through versionctl. chore(release): prepare 1.3.0 (Human Gate: do not merge without approval) #122 had already merged before this task. versionctl release-check passed on the clean exact commit: release candidate OK: v1.3.1 at abcee573722755abae9c3f5354009e4ec7e0bb3b (1.3.1).
    • Full proof: python3 -m unittest discover -s tests passed 863 tests in 65.490 seconds; python3 -m compileall -q agent_observer tests scripts, bin/agent-observer --version (1.3.1), and whitespace/self-review passed. No existing test expectation was weakened. The initial new foreign-key constraint failure in legacy-identity tests was repaired with ON UPDATE CASCADE, then the full suite passed.
    • Recount: copied-ledger user interventions 329 → 319, user prompts 314 → 307, user interrupts 6 → 12, user rejections 9 → 0. Three cited notices are agent; all nine cited denial events are grouped under their steers. All 375 remaining unknown-root rows have stored reasons. Details and window boundaries are on the PR.
    • External cause: historical Claude references named assistant UUIDs instead of input UUIDs; the existing forward repair is Chromeria #344/#346. Observer keeps unmatched history unknown and does not introduce weaker joins.
    • Delivery: implemented, locally proved, committed, pushed, PR open and linked to the T3 thread. Independent review deliberately not started by this child. CI state and cost-comment result follow on the PR.
    • Authority limits retained: no merge, tag, release, deployment, plugin install or live-ledger sync. Reporting and native reads used temporary --db copies or mode=ro. The worktree and branch remain for the parent's reviews; the eventual merger owns retirement. Private copied-ledger evidence remains in a task-owned temporary directory, outside Git, for review questions.
    • Treat pending gh pr checks (exit 8) as pending, not failed #132's analysis.py/failure-classification work is untouched. No rebase was needed: fetched origin/main was still the exact base at commit/push. If Treat pending gh pr checks (exit 8) as pending, not failed #132 lands first, parent must refresh shared version bookkeeping and rerun required checks before merge.
  3. lukemaj commented on Oct 19, 2026

    @lukemaj
    ContributorAuthor

    What: Round-1 fixes are pushed to PR #135 at a16938bc3b1dc504d4f6731c54863d5e433375f2.
    Why: Grouped ids must retain durable verdict references, and Grok inputs must feed the same transport evidence as Claude/Codex.
    So what: The parent schedules the requested new-head reviews; Luke approves the merge to main.

    This supersedes the implementation handoff at abcee57. The PR body is the canonical detailed proof and decision record, including the full all-actor replay and verdict-report policy.

    • Clean branch fix/133-intervention-actors and workspace /home/luke/.t3/worktrees/agent-observer/fix-133-intervention-actors, pushed head a16938bc3b1dc504d4f6731c54863d5e433375f2. Base remains 1fbbb0fe3098842d19e04bc5a6b35a3667ecda90; fetched main had not moved, so no rebase. Pending 1.3.0 → 1.3.1 transition retained in this one merge unit; clean exact-head versionctl release-check passes. If fix: treat pending gh pr checks as pending (#132) #134 merges first, parent reconciles the version before merge.
    • python3 -m unittest discover -s tests: 865 passed (63.739 seconds). Focused intervention/Grok suites: 92 passed. Compileall, whitespace and full diff self-review pass. Final new regressions fail on archived exact round-1 source for the intended causes, and pass on the repaired source.
    • Full replay on a read-only-origin ledger copy covers all actors and native sources of window intervention sessions: 209 Claude files, 1,074 Codex files, 395 Grok directories and one OpenCode database, all available. Stored verdict table is field-for-field unchanged. 327/327 spectrum-review verdict ids resolve, and actual CLI verdict list attaches every row to its canonical intervention. Recurrence counts 323 canonical interventions: 64 yes, 259 no, and explicitly reports four duplicate judgments as superseded. The cited orphaned yes resolves and shows its canonical steer with status ok.
    • Full window totals: 319 user / 4,495 agent / 1,573 unknown, 6,387 total; user rejections 9 → 0. This replaces the earlier partial recount. Grok inspection found 130 terminal notices (112 runtime-suffixed, 18 wrapped), all now agent; the one nonterminal question notice keeps its existing agent attribution. Twelve previously unknown agent steers also become agent. Full details and exact commands are on the PR.
    • Observer cost comment republished from a separate temporary ledger. Its incomplete pricing/usage/ownership coverage remains disclosed.
    • Implemented, locally proved, committed, pushed and PR updated. Independent reviews were not started. No merge, tag, release, install, deployment, live-ledger sync or other-checkout write. Treat pending gh pr checks (exit 8) as pending, not failed #132 code remains untouched. The worktree and branch remain for the parent's reviews; the eventual merger owns retirement. Copied databases and raw evidence remain private outside Git.
  4. lukemaj commented on Oct 19, 2026

    @lukemaj
    ContributorAuthor

    What: PR #135 now includes both review-round repairs at 49c3766e365fce0af524d56e5d61252dc3d212fd.
    Why: Complete notice boundaries preserve user instructions, and yes precedence preserves grouped verdict evidence regardless of timestamps.
    So what: Exact-head review remains pending with the parent; no reviewers were started and merge remains a human decision.

    PR proof and full recount supersede earlier candidates: 922 tests pass; all 327 spectrum-review verdicts resolve unchanged; recurrence counts 64 yes and 259 no across 323 canonical judgments, with four superseded records. Full window replay: 319 user, 4,484 agent, 1,584 unknown, 6,387 total. Rebased onto main eda2c8df41d75246ab11d0f7932cd0400f2f932c; one pending version transition is now 1.4.0 → 1.4.1. Observer cost comment republished. All owned ledger copies and private replay/source archives from this task were deleted and absence verified. Live ledger was read-only; no merge, release or installation.

    Requirements and who asked: Luke requires #133 and both review repairs, exact proof, cost publication and copy cleanup.
    Deleted: No guessed historical actors, verdict migration/deletion, extra service or #132 classification changes.
    Bottleneck: Whole-input parsing and canonical verdict precedence.
    Checked myself: Reviewed baseline failures, final full suite, all-source copied replay, all 327 resolutions, actual CLI reports, pushed SHA and copy deletion.

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions