Skip to content

Share commander HUD columns, grouped heartbeat and retained alarms - #3589

Merged
trissim merged 31 commits into
mainfrom
work/commander-screen--agent-comms
Oct 30, 2026
Merged

trissim merged 31 commits into
mainfrom
work/commander-screen--agent-comms

Conversation

@trissim

@trissim trissim commented Oct 29, 2026 •

Copy link
Copy Markdown
Contributor

Summary

P930, paired with OpenHCSDev/toad#1321. 31 commits; +1,942/-566 across 56 files against origin/main 62c029335647dd11381effbb99099ccce8bbd527. Pushed pair: Core 078fb1d29a270e1a9233450dda31c45288548324, Toad 53e8554ebdb7fd3c7ba8002cbdeeb8240bd902da (native main c59b3766249f928c710a981e1fc40d491141e5b1). Both remote refs equal their local HEADs; previous reviewed checkpoints remain ancestors. The latest source correction deletes both description forwarders and Product, migrates every Core/native/test caller, and relocks NRA to merged #158. Both nominal alarm views, the shared health prefix, current main's ratchet deletion and individual committed publication witnesses remain. Not installed or behavior-qualified.

This is a source delivery, not behavioral, typing, installed or performance acceptance. Author performed AST/source compilation and diff checks only. Root owns the combined changed-owner controls, dependency/measure repairs, Core-first landing/install and actual saved-session display acceptance.

Every new presentation family and its replaced owner

These are source deletions, not proof that the new UI has run. AST spans below count complete declarations/method bodies at the comparison base; they overlap the file diff and must not be summed as extra deletions. disclosure_text.py adds 390 lines. field_codec.py changes 218 lines: 179 added, 39 deleted, not 218 net growth. The full paired native deletion is 388 lines.

New owner/family Before → after; exact replaced path
DisclosureKey / RecordKey / RootKey / FieldKey / EntityKey / AnonymousKey / MappingKey, DisclosureEntry Moved the existing semantic identity declarations out of native declared_disclosure.py; deleted every native declaration, not duplicated or aliased. The whole old key/value block at native base lines20–194 is absent. This is relocation of identity ownership, not a claimed reduction in required identities.
DisclosureText, StructuredText, RecordText, IdentifiedRecordText, ClassText, FamilyText, CollectionText, SequenceText, MappingText Replace native DisclosedValue (53-line AST span), StructuredValue (9), RecordValue (13), IdentifiedRecordValue (11), ClassValue (5), CollectionValue (7), SequenceValue (9), MappingValue (9). Native file diff is +25/-191. Native no longer detects dataclasses, extracts identity fields, formats collection counts, reconstructs children or decides scalar-vs-record shapes. It consumes the prepared Core tree and retains only expansion/focus/paint. FamilyText adds a required declared-name display rather than leaking Python class names.
DisclosedRecord, ValueDescription Replace the native DisclosedValue.of dataclass/identity probe and singledispatch construction. Existing records explicitly inherit their disclosure capability; cached FieldPlans select identity once. The sole factory is DisclosureText; inherited handlers return Self, without a Product parameter or recursive string argument. FieldCodec.describe and DisclosureText.of are deleted rather than retained as forwarding aliases. Presentation dispatch remains separate from external decoding: no wire decoder class is replaced or copied. The earlier branch-only ValueShape/DisclosureShapes experiment was also removed, but is not counted as a deletion against main.
ViewColumn, FieldPlan(ViewColumn), Projected(ViewColumn, property) Stored and computed fields share label/current/exclusion behavior. Deletes the old 5-line FieldPlan.key_in string-name loop, 3-line excluded_in loop, view_names and view_exclusions caches; native RecordValue.children no longer copies field-label and identity interpretation. FieldPlan's AST body shrinks198→187 lines while inheriting the shared column contract. Projected retains the original read-only property and Python descriptor lifecycle.
Existing ViewExclusion family extended with HudExclude, StatusExclude, ReportExclude, ArgumentsExclude Nominal declarations replace free string selectors throughout production/tools/tests. Existing SnapshotExclude owns its SnapshotName behavior. No alternate string API survives; wire decoding is unchanged. The old deleted ratchet and its ReportExclude copy stay deleted.
ViewTable, StackedViewTable Replace Core CommanderUnit.line (11-line body), brief_parts (8), brief (3), frame rows (17) and brief (17), plus native CommanderUnitCard.brief_lines (12), fit_title (2), on_resize (2). One prepared table owns columns, original entities, cells, full text, measured widths and narrow stacking. Native DeclaredTable consumes layout/widths; it does not choose a second geometry policy. The older native HudRowText class (13 lines) and CommanderUnitCard class (107) are deleted.
HudTone plus Muted/Warning/Success/Accent/Error; ViewHeading Replace native card-only .-needs-hand colour policy and uncoloured, independently assembled headings with shared declaration-owned tones/headings used by unit and alarm groups. This adds the requested five-tier colour behavior; it does not pretend five old colour implementations were deleted. Native UnitTone binds Core tones to existing theme colours; terminal colour encoding is not transported into the widget.
ViewFacts, ViewSectionFacts, HudDisplayFacts Required stable displayed-value evidence for committed packet comparison. Replace CommanderFrame.changed as the publication baseline; disposable files no longer serve as successful-message receipts. Original identities and failures remain in comparison; ticking ages do not. No second writable fact store is introduced.

presentation.py is not another generic text/geometry system: its existing BusPresentation, ThreadRecord/View, notification windows and WireRevision capture canonical UI source state. P930 only changes its nominal PresenceExclude callers (+8/-8). None of those classes supplies disclosure keys, recursive child formatting, table width allocation or commander rendering. Those answers formerly lived in native declared_disclosure.py and commander card prose; the replaced implementations are deleted. The prepared table/tree is consumed by both heartbeat text and native widgets, not a dormant parallel renderer.

Source evidence: p930-replacement-spans.txt (base/head AST declaration spans and bases), p930-new-owner-deletions.diff, p930-native-deletions.diff; follow-up owner map parses1,819 tracked Core/native Python modules with zero omissions. Dynamic aliases remain unproved.

Latest hosted failure and source correction

Run 41009379844 on previous Core ba3b05bf87 produced real debt-src FAIL / debt-tools FAIL (unlike the older0d37 checker crash). Every grown category is retained:

  • BuiltinHandlerTypeSwitch +4; FamilyFlattened +1; StringIdentity +1; StringSubscript +1, all in disclosure_text.py.
  • ClientTypeErrors +5 in the old native consumer: deleted BoardRow/HudRow/QuietUnits imports (:7), brief_parts (:85), rows (:213). Paired P357: centralize named store paths in RootFile #1321 replaces all five consumers; no compatibility alias is restored in Core.
  • TypeCheckingImport +1 each in heartbeat_subjects.py and standing_rules.py: source correction moves RegistrySnapshot to a regular import and makes alarm_pings generic, deleting the unnecessary reverse Ping import.
  • TypeErrors +2 in commander_hud.py: imported the missing dataclasses.replace; +1 standing_rules.py: conflicts now read first.source.frame.pulls, the actual captured owner.
  • TypeErrors +1 field_codec.py: Python3.14 property.set_name is absent from the checker stub. The original descriptor lifecycle remains intact, without an ignore/cast/base-call deletion.

Root corrected the later send-back in message a01cf5af2ec9: the accepted external Python-shape boundary stays, as do FamilyText's cached identity return and property.set_name. ClientTypeErrors +5 describes canonical-main Toad, not the already-replaced paired consumers. NRA #158 fixes cached identity-return recognition; uv lock --upgrade-package nominal-refactor-advisor, using declared uv0.13.1, advances the lock from 595d19725 to d0667af3c2733b3de298be1af4bd69f963cb9e23. Uv also regenerates lock-format revision3→5. No NRA source, exemption or alternate dispatcher was added here.

Correction fd6edbe deletes the recursive Product argument and both forwarding APIs; all paired callers now invoke inherited DisclosureText.describe. The uncommitted annotation traversal/property/base-call changes were removed before this commit, following Root's correction. Root's admitted factory domain is DisclosureText only: calling ClassText.describe(record) would not satisfy a general Self promise because it returns sibling RecordText. This excluded case is explicit, not claimed proven by compilation. Root retains exact-head typing, property-stub and behavioral qualification.

Earlier correction36d2959f3 remains an ancestor. Current-main merges retain inherited commander-fork tags and P930's keyword ServicePassFailing fixture. Source-only parsing/compilation and whitespace checks pass; no local checker, imports, tests or application run was launched. Latest established hosted outcome remains ba3b debt-src FAIL/debt-tools FAIL; new-head hosted success is not claimed.

Shared presentation and native geometry

Before: Core brief_parts/brief() flattened records; native cards rebuilt that prose, repeated the PR and leaked Python class names. After:

ViewColumn
├── FieldPlan
└── Projected(property)
FieldCodec.view_columns(record, view)
└── ViewTable: cells, text, facts, widths and layout
    ├── heartbeat text
    └── native DeclaredTable

The record declares Unit/State/Work/Change/Next, identity, labels and exclusions. State-owned HudGroup declarations own order, tone, action and folding. No column/state/unit roster or second PR string remains. Full original detail fields remain even when an identity-only summary is displayed.

ViewTable.layout/widths, minimums, fit_widths and StackedViewTable are real production APIs used by paired Toad DeclaredTable. CommanderAlarm consumes alarm_detail for every original ping. They remain. Only the unused DisclosureText.view helper and its direct assertions were deleted.

Foreign shapes: delete the mirrors

Before:

FieldCodec.shape -> ValueShape + seven shape subclasses
    -> DisclosureShapes (seven one-to-one factories) -> DisclosureText variant

After:

DisclosureText(ValueDescription).describe(foreign value) -> Self
    -> concrete shared DisclosureText variants

The prior seven-arm isinstance ladder is deleted. ValueDescription(MroDispatch) owns presentation dispatch separately from FieldCodec's external-decoder table: adding a presentation handler cannot become an external decoder. Concrete handlers are declared on DisclosureText for object/str/bytes, type/FamilyMeta, dict/mappingproxy and list/tuple/frozenset; there is no ABC virtual-subclass adapter or manual type roster. The inherited ValueDescription.describe is the single typed dispatch call; FieldCodec.describe and DisclosureText.of are deleted. Seventeen existing roots/records in the actual commander/detail family now declare DisclosedRecord; that base owns record/identified-record construction from its cached FieldPlans identity metadata. Ordinary unrelated foreign objects retain scalar presentation.

The earlier ValueShape/seven mirror subclasses (60 lines), DisclosureShapes forwarders (30 lines), and unused view helper (seven lines) stay deleted. Toad's entire DisclosedValue/RecordValue/IdentifiedRecordValue/SequenceValue/MappingValue family is now deleted too. Core DisclosureText owns prepared child entries, semantic keys, field values and summaries; native DeclaredDisclosure only paints leaf or StructuredText capabilities. ViewTable shares each row's prepared values between identity and cells, and owns the immutable entities map and duplicate-identity rejection. Native selection and tables borrow that same map rather than recovering identity twice.

Child entries and summary strings cache only on each source description. summary is now a cached property to stop expansion, title resize, plain text and facts from formatting/decoding an unchanged value repeatedly—not to hide the FamilyText audit finding. Original field children remain separate from identity-only summary values and share their prepared field descriptions. No cross-source cache or original-field deletion was introduced.

View identity is nominal across the complete projection call family: existing ViewExclusion classes replace view strings in Projected, FieldCodec projections/project/view_columns, ViewTable, encoded field traversal and their production/tool/test callers. Exclusion uses the selected directive's read operation; SnapshotExclude owns its SnapshotName behavior. Status/Report/Arguments now have declarations rather than free strings. No string-accepting compatibility path remains.

Projected retains native property.__set_name__, read-only name/annotation contracts and signature-owned return annotation. FamilyText's cached summary still returns its declared identity directly. Root's NRA #158 correction is included through the upgraded dependency; exact-head audit success and the typeshed repair remain Root's qualification. No Any/cast/ignore, base-call deletion or allowlist was added.

One action cut, one delivery, one HUD

Before: CommanderHud.of read previous packets and disposal evidence, then pass_body discarded that board, recaptured history and replaced the partial HUD. Open and overdue sweeps repeated the same subject queries. CommanderFrame.changed treated a disposable file as a delivery receipt, including after a failed send.

After:

  1. Read the previous typed packet once; enforcement and provider/forge acquisition precede history capture.
  2. CommanderHistory holds the captured registry/alias/actor cut and a per-instance subject-to-EventTime memo. UnitSubject supplies its latest addressed message, HeadSubject its latest deciding verdict and PassSubject the original completion time. UnlandedHeadSubject selects exact-head supersession through its nominal clears override; AnswerSubject remains explicitly unrecorded.
  3. Ping.acted delegates disposition to the subject using each ping's original since and the shared timestamp evidence; no boolean-by-subject cache. Ordinary subjects remain time-bound; exact supersession retires the lost head independently of an old observation's publication time. Derive returns one CommanderDelivery per recipient, with that recipient's original ping ages. Its selected open set supplies waiting membership and its HUD board.
  4. CommanderHud.of prepares the shared board once from the lead's frozen frame and acquired usage. Current main's CommanderService declares the recipients and all commander actors. CommanderHud.for_delivery reuses the prepared unit/phase records while selecting the recipient's packet, open set, identity and original completion evidence; it does not reacquire the board or history.
  5. Frozen HUD groups, alarms and display_facts cache on each derived view. New alarm selection is captured once before sibling grouping; ages/status still paint from supplied time.

No cross-beat cache or second action ledger was added. Existing failure packets retain original handled pings, ages, refusal evidence and exact commander birth.

Archived holders and retained LOST packets

Before, WorkBranches._checkout matched a registered path without consulting the registration's archive state. It now reads snapshot.statuses[thread.name].archived while preserving exact resolved-path matching, sorted names, the caller's worktree map and the BranchCheckout family. A stopped nonarchived worker remains a holder; an archived-only checkout is UnregisteredBranchCheckout. ProgressRead and the actual OrderlessPullRequest/StuckMerge consumers retain the unmerged work rather than deleting it.

IMPL-4: the missing answer was which head verdict clears which subject. HeadSubject.clears delegates to verdict.decides; UnlandedHeadSubject overrides it with verdict.supersedes. The existing action_at reader and per-history memo remain the only review-evidence path. EventTime.occurred answers whether original evidence exists without fabricating a timestamp, magic cutoff or second clearance ledger. Ordinary OK/BACK/reviewing never clear LOST. No packet history was edited.

Main #3622's OwnerNotice publication path is retained, with the witness attached to the actual published task. Main #3617's CommanderLoad/ServiceReading parent owns health, completion and stale detail refusal. CommanderLoad.health_lines at commander_hud.py:289 now supplies both header and status_strip: failure/error/age, completion, then retained status before values. Native #1321 consumes only status_strip. HudDisplayFacts includes original failure records but excludes ticking completion clocks. New main wire projectors use the nominal view API. No second native header or duplicate heartbeat field was introduced.

Latest correction and current-main integration

  • TIME-1: the previous checkpoint left a duplicate ReportExclude in the old debt_ratchet body. Both hosted debt jobs crashed there, not in typeshed. Current main removes that entire entrypoint through the NRA migration; this branch retains the deletion, not a revived local gate. The sole tracked Core ReportExclude is field_codec.py:344. No frozen migration owner was independently edited.
  • BOUND-8: AlarmSection.tables at commander_pings.py:463/466 passes HudExclude for both AlarmLine and AlarmOverflow. All tracked Core/Toad ViewTable calls were inspected by AST; no quoted view caller remains.
  • IMPL-12: CommanderLoad.health_lines removes the repeated header prefix from status_strip; the required load/table values remain distinct.
  • UnpushedBranch.line describes commits that exist only locally and tells the holder to push; it no longer pretends that every unpublished branch predicts a disk failure.
  • Shared-board main changes are integrated without discarding per-recipient committed witnesses or recapturing action history. The failure callback also captures its history once before all recipients at commander_heartbeat.py:76. The existing real shared-recipient control now checks both native frame identities and suppression after quiet publication for every served recipient; UNRUN.
  • ClaudeBridge inherits the shared original-message wake/delivery implementation, preserving main's message-identity correction without duplicate transport methods.

Theorem basis: paper1 Theorems 4.6/4.7 for deleting outside copies; Theorem 4.8 for retaining distinct recipient histories while sharing board preparation. No nominal identity, geometry API or original detail capability was flattened.

Committed packet owns quiet publication

CommanderUpdate now carries PublicationFacts: explicit UnpublishedFacts by default, or PublishedFacts containing the existing FieldCodec comparison digest/TextDigest of HudDisplayFacts. The digest follows declaration comparison fields; there is no manual display-field roster.

CommanderNotice compares current facts with the latest committed packet's witness. Send attaches the witness to the actual message task. If publication fails before commit, latest() still returns the prior packet and the next identical beat retries. CommanderFrame can still display the current view on failure, but changed() and its broad ToolRefusedError-as-changed path are deleted. Historical packets receive no fabricated digest and no retained messages/inputs are rewritten or replayed. The publication witness is excluded from observation equality; suppression compares that field explicitly, and the disposable HUD is not a second receipt.

Controls authored, UNRUN

  • Real private-bus SQLite trigger refuses quiet publication before commit. The disposable view changes, retained packet does not; the identical next beat must publish, and a further identical committed beat must append nothing. A subsequent actual recorded service failure changes stable facts and publishes its header.
  • Existing genuine Git-worktree holder control now registers stopped workers, archives the exact author publicly, and proves request9 remains with an UnregisteredBranchCheckout/no registered holder. Ordered and armed routing plus the ordinary armer remain covered.
  • Four real closed-head/store/packet cases retain superseded, OK, BACK or reviewing before publication. The original packet is committed, its board is read, and the next packet is derived/published. Only exact-head supersession clears LOST, including when older than ping.since; other repository/head/PR identities and ordinary HeadSubject timing stay negative.
  • Real addressed-message evidence sits between two pings' original start times. Both disposal outcomes differ while the same history reads subject evidence once; open, overdue and HUD board reuse it. A fresh history observes a later real action.
  • Removing only the witness from an actual serialized message decodes to UnpublishedFacts without changing message ID, reference or body; recommit eligibility and codec roundtrip are checked.
  • Existing typed failure/recovery, overflow membership, commander birth, stale detail and native narrow/wide controls remain. Direct controls use the shared captured-input fixture rather than restoring implicit HUD acquisition.
  • Paired native controls cover fresh equal frozen tables retaining their source/native keys, actual changed records with unchanged paint updating selection/details, filter clear/refill, group movement, resizing and unconditional Refresh.

Latest correction evidence: p930-corrected-order-source.txt parses/compiles all54 changed Core and four changed native modules with zero omissions and no product imports. It lists the actual ValueDescription/DisclosedRecord/DisclosureText/Projected declarations, preserved descriptor and cached identity behavior, and whole-src/tests/tools searches in both repositories: no DisclosureText.of, FieldCodec.describe or ValueDescription[...] callers remain. Both whitespace checks pass. No changed-owner tests, checker or real application run was launched. Dynamic aliases remain unresolved; compilation is not import or typing proof.

Historical source evidence: p930-merge-owner-map.txt retains existing refactor-audit ParsedModule/FunctionFacts maps for the changed owners at both merge-parent revisions. p930-final-source.txt parses all 1,183 tracked Core and 636 tracked Toad Python files across src/tests/tools with zero parse omissions, and compiles the 54 changed Core plus four changed Toad modules without executing them. It lists every ViewTable caller, the sole ReportExclude declaration, shared health consumers and original-history methods. Dynamic aliases remain unresolved; AST is not behavior proof. The final one-line failure-history move was separately parsed/compiled in p930-failure-cut-push.log. Whole-diff whitespace checks pass. No tests/checkers/product import probes ran. Main's old row/prose control was migrated to packet order plus declaration-owned groups; valid service-health controls remain.

Earlier source evidence: retained complete source map and targeted p930-disclosure-targeted-map.txt use existing refactor-audit ParsedModule; zero parse omissions, dynamic aliases unresolved. p930-owner-source.log parses/compiles all 36 changed Python modules, reports zero decisions in FieldCodec.describe and no presentation handlers in FieldCodec's decoder table; diff check clean. p930-view-migration.log records the one-shot AST argument migration; its converter was deleted after its one successful run. Paired native source checks parse/compile four modules and find zero remaining callers of the deleted native family over src/tests/tools. No product imports, tests, checker, App/provider/install or live mutations were run.

Production growth rationale against main

File + / - Required behavior / deletion
cli_bridges/claude.py 7 / 21 Consume packet-owned waking HUD; delete duplicate prose path.
cli_bridges/shared.py 5 / 1 Shared typed board publication consumer.
commander/publication_rules.py 2 / 2 Shared HUD identity and accurate local-only commit warning.
commander/standing.py 4 / 6 Shared board facts, not a second renderer.
commander/vibe_check.py 7 / 4 Captured load/review inputs and nominal wire view.
commander_heartbeat.py 34 / 26 One prepared board/history, per-recipient delivery and committed witness; remove repeated acquisition/baseline.
commander_hud.py 212 / 146 Declaration-driven groups/status/layout/facts, nominal views and recipient views; shared health prefix; delete brief renderer and frame receipt.
disclosure_text.py 390 / 0 Shared cached child tree, semantic keys, values, text and real geometry; replaces the native reconstruction, not a second renderer.
field_codec.py 179 / 39 Nominal views/record capability and independent typed presentation dispatch; deletes the seven-arm ladder and view-name comparisons.
heartbeat_frame.py 5 / 0 Captured review timers, not recomputed clock decisions.
heartbeat_subjects.py 47 / 30 Per-history original action evidence and nominal ordinary/superseded clearance; delete repeated boolean queries.
recorded_time.py 29 / 3 Shared original-clock paint, disclosure capability and nominal event occurrence without sentinel cutoffs.
service_passes.py 2 / 2 New main's health projector uses the nominal wire view.
standing_rules.py 13 / 8 Captured review timing and shared owned observations.
task_attachments/commander_pings.py 211 / 83 Packet witness, direct delivery, shared open set, nominal alarm views and bounded alarm/full-original behavior.
thread_identity.py 3 / 2 Declaration-owned disclosure identity.
ui_model/unit_state.py 84 / 14 State-owned HUD grouping/actions, frame.pulls consumer closure and clock disclosure capability.
child_process.py 2 / 2 CheckPrinted declares disclosure capability for actual nested progress readings; no lifecycle edits.
cli_options.py 2 / 2 JsonFlagRecord supplies the shared record capability to thread incarnations.
order_story.py 3 / 3 Original StoryLine/ProblemStory records declare disclosure capability.
todos.py 6 / 5 PullRequest/OrderProgress/ProgressPoint/DistanceReading(s) declare the capability.
tool_result.py 2 / 2 Existing DeclaredReply base supplies the shared capability.
activity.py 1 / 1 Nominal artifact view.
connector.py 3 / 1 Nominal wire view.
context_store.py 3 / 1 Nominal identity view.
coordination_snapshot.py 3 / 1 Nominal snapshot view.
coordination_tables/assignments.py 5 / 5 Nominal snapshot declarations.
coordination_tables/attempts.py 4 / 4 Nominal snapshot declarations.
coordination_tables/executions.py 2 / 2 Nominal snapshot declarations.
coordination_tables/responses.py 3 / 3 Nominal snapshot declarations.
diagnostics.py 3 / 1 Nominal artifact view.
history_views.py 3 / 1 Nominal presence view.
messages.py 3 / 1 Nominal wire projection.
native_tools.py 3 / 1 Nominal arguments view.
presentation.py 8 / 8 Nominal presence projections and consumers.
tools.py 3 / 1 Nominal wire projection.
transcript_events.py 8 / 8 Nominal activity projections.
transcripts.py 5 / 5 Nominal content projections and comparison.
turn_digests.py 6 / 4 Nominal activity and new main wire views.
work_branches.py 5 / 2 Nominal wire projection and archive-aware holder selection at the original owner.

pyproject.toml declares the presentation annotation dependency. Uv regenerated uv.lock and advanced NRA to merged d0667af3; Root retains stack refresh/installation. Test growth is the retained real publication/native controls, not executed qualification.

Retained qualification and unresolved owners

Main 62c029335647dd11381effbb99099ccce8bbd527 is included through normal merges. The final requested 22-commit main update is merge078fb1d29, changes no P930 feature delta, and its remote readback equals HEAD. The recorded source claim was made at feature checkpoint fd6edbe immediately before this requested merge; Root reconciles the claim head. The merges preserve shared-command service, NRA migration/deletions, #3622 OwnerNotice publication and #3617 shared service-health evidence. P941's complete allocated publication cut, per-remote batching, captured review timers and frozen frame.pulls ownership remain; deleted aggregate preparation and discarded home-branch comparison stay deleted. Root's P941 twelve-plus-six results and native-pin qualification remain evidence for those original cuts, not a claim about this changed head.

Archived matched Core b7c7748 / Toad 56c3f1caf diagnostics are retained under /home/ts/.cache/agent-scratch/codex-greentext/p930-matched-types-20261029-164858/. Toad's three selected files exited0 in23.149s. Core's real three stale UnitObservation.self.pulls accesses were repaired in the preceding merge. Those runs do not qualify this new head.

Hosted jobs 123827933676 (debt-src) and 123827933620 (debt-tools), both for old Core 0d37, crashed on the duplicate ReportExclude and never produced a structural growth verdict. Their raw logs are retained in p930-debt-src.log/p930-debt-tools.log. Old native a131 job 123816989615 reported TypeErrors growth +12 in commander.py and +1 in each disclosure/table file; it is not a matched qualification of this pushed pair. Root owns matched typing/dependency/fresh-interpreter/codec checks, actual measure failures and the real private/copy-safe application journey. No allowlist, naming deletion, Any/cast/ignore or gate-only native patch was added. No green CI, installed display acceptance or speedup is claimed.

The allocated Core tree retains the now-untracked former refactor-audit submodule directory after main removed its gitlink. It was used read-only for the source map and is not included in this PR; no other owner's work or source was removed.

Assumed: DisclosureText is the sole admitted description factory, as Root specified; inherited factory calls through concrete result variants are outside that domain. Root runs the necessary combined changed-owner controls and fresh-interpreter/codec/typing checks, verifies the upgraded NRA's actual gate results, repairs the property stub, refreshes the stack after accepted landings, and verifies the real paired commander journey without touching human read markers or uncertain inputs.

The disposable frame is a view again, not a receipt for a message nobody received.

Copilot AI balanced review requested due to automatic review settings October 29, 2026 06:03

Copilot AI 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.

Copilot was unable to review this pull request because the user who requested the review has insufficient remaining quota.

An organization owner can choose the repository organization as the billing source for reviews requested by members with a paid Copilot license. Learn about Copilot code review billing.

@trissim
trissim enabled auto-merge October 29, 2026 06:03
@trissim
trissim disabled auto-merge October 29, 2026 06:04
@trissim
trissim enabled auto-merge October 29, 2026 06:08
@github-actions

github-actions Bot commented Oct 29, 2026 •

Copy link
Copy Markdown

debt-src at 04a5e0b, every finding:

grew BuiltinHandlerTypeSwitch:src/agent_comms/disclosure_text.py +4
grew ClientTypeErrors:batrachian-toad/src/toad/screens/commander.py +5: this change removes or changes an agent_comms name that client file uses; run mypy on it to see which
::warning file=src/agent_comms/commander/publication_rules.py::LintFindings +1 (warns, never blocks)
::warning file=src/agent_comms/commander/standing.py::LintFindings +1 (warns, never blocks)
::warning file=src/agent_comms/commander_hud.py::LintFindings +5 (warns, never blocks)
::warning file=src/agent_comms/disclosure_text.py::LintFindings +15 (warns, never blocks)
::warning file=src/agent_comms/field_codec.py::LintFindings +10 (warns, never blocks)
::warning file=src/agent_comms/heartbeat_frame.py::LintFindings +1 (warns, never blocks)
::warning file=src/agent_comms/heartbeat_subjects.py::LintFindings +1 (warns, never blocks)
::warning file=src/agent_comms/native_tools.py::LintFindings +1 (warns, never blocks)
::warning file=src/agent_comms/recorded_time.py::LintFindings +1 (warns, never blocks)
::warning file=src/agent_comms/task_attachments/commander_pings.py::LintFindings +1 (warns, never blocks)
::warning file=src/agent_comms/ui_model/unit_state.py::LintFindings +1 (warns, never blocks)
::warning file=src/agent_comms/work_branches.py::LintFindings +1 (warns, never blocks)
grew TypeErrors:src/agent_comms/field_codec.py +1
::warning file=src/agent_comms/disclosure_text.py::Unformatted +1 (warns, never blocks)
found ClientTypeErrors:batrachian-toad/src/toad/screens/commander.py at batrachian-toad/src/toad/screens/commander.py:7 (Module "agent_comms.commander_hud" has no attribute "BoardRow"  [attr-defined]) batrachian-toad/src/toad/screens/commander.py:7 (Module "agent_comms.commander_hud" has no attribute "HudRow"  [attr-defined]) batrachian-toad/src/toad/screens/commander.py:7 (Module "agent_comms.commander_hud" has no attribute "QuietUnits"  [attr-defined]) batrachian-toad/src/toad/screens/commander.py:85 ("CommanderUnit" has no attribute "brief_parts"  [attr-defined]) batrachian-toad/src/toad/screens/commander.py:213 ("CommanderHud" has no attribute "rows"  [attr-defined])
found LintFindings:src/agent_comms/commander/publication_rules.py at src/agent_comms/commander/publication_rules.py:46 (E501 Line too long (102 > 100))
found LintFindings:src/agent_comms/commander/standing.py at src/agent_comms/commander/standing.py:335 (E501 Line too long (132 > 100)) src/agent_comms/commander/standing.py:387 (E501 Line too long (144 > 100))
found LintFindings:src/agent_comms/commander_hud.py at src/agent_comms/commander_hud.py:42 (E501 Line too long (105 > 100)) src/agent_comms/commander_hud.py:348 (E501 Line too long (102 > 100)) src/agent_comms/commander_hud.py:391 (E501 Line too long (106 > 100)) src/agent_comms/commander_hud.py:411 (E501 Line too long (104 > 100)) src/agent_comms/commander_hud.py:413 (E501 Line too long (106 > 100))
found LintFindings:src/agent_comms/disclosure_text.py at src/agent_comms/disclosure_text.py:3 (I001 [*] Import block is un-sorted or un-formatted) src/agent_comms/disclosure_text.py:12 (UP035 [*] Import from `collections.abc` instead: `Hashable`) src/agent_comms/disclosure_text.py:17 (E501 Line too long (122 > 100)) src/agent_comms/disclosure_text.py:159 (B905 `zip()` without an explicit `strict=` parameter) src/agent_comms/disclosure_text.py:159 (E501 Line too long (101 > 100)) src/agent_comms/disclosure_text.py:177 (E501 Line too long (102 > 100)) src/agent_comms/disclosure_text.py:178 (E501 Line too long (102 > 100)) src/agent_comms/disclosure_text.py:209 (E501 Line too long (102 > 100)) src/agent_comms/disclosure_text.py:210 (E501 Line too long (108 > 100)) src/agent_comms/disclosure_text.py:211 (B905 `zip()` without an explicit `strict=` parameter) src/agent_comms/disclosure_text.py:212 (B905 `zip()` without an explicit `strict=` parameter) src/agent_comms/disclosure_text.py:212 (E501 Line too long (112 > 100)) src/agent_comms/disclosure_text.py:220 (B905 `zip()` without an explicit `strict=` parameter) src/agent_comms/disclosure_text.py:236 (B905 `zip()` without an explicit `strict=` parameter) src/agent_comms/disclosure_text.py:330 (E501 Line too long (102 > 100))
found LintFindings:src/agent_comms/field_codec.py at src/agent_comms/field_codec.py:15 (F401 [*] `collections.abc.Sequence` imported but unused) src/agent_comms/field_codec.py:51 (F401 [*] `.declared_family.FamilyMeta` imported but unused) src/agent_comms/field_codec.py:573 (E501 Line too long (110 > 100)) src/agent_comms/field_codec.py:585 (B905 `zip()` without an explicit `strict=` parameter) src/agent_comms/field_codec.py:589 (B905 `zip()` without an explicit `strict=` parameter) src/agent_comms/field_codec.py:1686 (E501 Line too long (101 > 100)) src/agent_comms/field_codec.py:2671 (E501 Line too long (103 > 100)) src/agent_comms/field_codec.py:2682 (E501 Line too long (107 > 100)) src/agent_comms/field_codec.py:2802 (E501 Line too long (108 > 100)) src/agent_comms/field_codec.py:3485 (E501 Line too long (101 > 100))
found LintFindings:src/agent_comms/heartbeat_frame.py at src/agent_comms/heartbeat_frame.py:84 (E501 Line too long (115 > 100))
found LintFindings:src/agent_comms/heartbeat_subjects.py at src/agent_comms/heartbeat_subjects.py:52 (E501 Line too long (103 > 100))
found LintFindings:src/agent_comms/native_tools.py at src/agent_comms/native_tools.py:3 (I001 [*] Import block is un-sorted or un-formatted)
found LintFindings:src/agent_comms/recorded_time.py at src/agent_comms/recorded_time.py:12 (E501 Line too long (116 > 100))
found LintFindings:src/agent_comms/task_attachments/commander_pings.py at src/agent_comms/task_attachments/commander_pings.py:216 (E501 Line too long (104 > 100)) src/agent_comms/task_attachments/commander_pings.py:308 (E501 Line too long (104 > 100)) src/agent_comms/task_attachments/commander_pings.py:331 (B008 Do not perform function call `UnpublishedFacts` in argument defaults; instead, perform the call within the function, or read the default from a module-level singleton variable) src/agent_comms/task_attachments/commander_pings.py:413 (E501 Line too long (103 > 100)) src/agent_comms/task_attachments/commander_pings.py:424 (E501 Line too long (110 > 100))
found LintFindings:src/agent_comms/ui_model/unit_state.py at src/agent_comms/ui_model/unit_state.py:8 (I001 [*] Import block is un-sorted or un-formatted)
found LintFindings:src/agent_comms/work_branches.py at src/agent_comms/work_branches.py:9 (I001 [*] Import block is un-sorted or un-formatted)
found TypeErrors:src/agent_comms/field_codec.py at src/agent_comms/field_codec.py:2343 ("__set_name__" undefined in superclass  [misc])
found Unformatted:src/agent_comms/disclosure_text.py at src/agent_comms/disclosure_text.py:1 (Black would reformat this file)

@trissim
trissim disabled auto-merge October 29, 2026 07:04
@trissim
trissim force-pushed the work/commander-screen--agent-comms branch from 8636a6f to 40da81c Compare October 29, 2026 07:04
@trissim trissim changed the title Declare commander HUD columns and delete duplicate PR summaries Share commander HUD columns, grouped heartbeat and retained alarms Oct 29, 2026
@trissim
trissim force-pushed the work/commander-screen--agent-comms branch from 40da81c to c3c13dc Compare October 29, 2026 08:28
@github-actions

github-actions Bot commented Oct 29, 2026 •

Copy link
Copy Markdown

debt-tools at a0ccebd, every finding:

grew StringIdentity:src/agent_comms/disclosure_text.py +1

trissim and others added 13 commits October 29, 2026 20:18
…--agent-comms

# Conflicts:
#	src/agent_comms/commander/vibe_check.py
#	src/agent_comms/commander_heartbeat.py
#	src/agent_comms/commander_hud.py
#	src/agent_comms/heartbeat_frame.py
#	src/agent_comms/task_attachments/commander_pings.py
#	tests/test_commander_notifications.py
…mander-screen--P930

# Conflicts:
#	src/agent_comms/todos.py
#	tests/guards/test_debt_ratchet.py
#	tools/debt_ratchet.py
…--P930

# Conflicts:
#	tests/test_commander_notifications.py
@trissim
trissim enabled auto-merge October 30, 2026 07:23
@trissim
trissim merged commit 2a98023 into main Oct 30, 2026
8 of 9 checks passed
trissim added a commit that referenced this pull request Oct 30, 2026
Main (#3589/#3661) owns the commander wake on every bridge and hands the
Monitor the original message, so the branch's Claude-only wake override
goes, and with it WakeOnlyMonitor, the PendingMonitor family it was the
second member of, the reception parameter threaded through monitor.py and
shared.py, and the frame's displayed body. Their one test goes with them.
CommanderUnitDetail is both the comms_commander_unit tool reply and a
disclosed record, so it inherits ToolResult and DisclosedRecord.
commander_pings imports the DeliveredOutcome main's notice returns.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
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.

2 participants