Skip to content

Promachos mode: chat-first view with bubbles #116

Description

@lukemaj

What: Chromeria has a Promachos mode: a chat-first view of the Promachos's conversations with his replies as bubbles.
Why: The user wants to talk to the Promachos like a colleague, and the standard thread view shows work logs and full-width markdown.
So what: An agent builds it; the user reviews the look in the desktop app.

Parent

#113

Outcome

A switch moves between the standard view and Promachos mode. Promachos mode lists the conversations in the project the user designates as the Promachos home, using Chromeria's familiar layout; his replies show as bubbles, one per short paragraph, tool activity collapses to a working indicator, and question and approval cards appear in chat.

Elon record

  • Requirements and who asked: A chat-first mode with a toggle (user, 2026-09-29); bubbles now, not later (user, 2026-10-01); reuse Chromeria's look rather than new sections (user, 2026-10-01).
  • Deleted: A separate Satrapy section, custom layouts for Wight threads, and contract changes for message splitting.
  • Bottleneck: None; the prototype at /tmp/bots-prototype/ shows the intended look.
  • Checked myself: The prototype screenshots; ChatView.tsx churn upstream (241 commits in 90 days), which is why the view lives in new files.

Acceptance criteria

  • The switch moves between the standard view and Promachos mode on web and desktop.
  • Promachos mode lists the Promachos home's conversations and starts new ones there.
  • His replies render as bubbles per paragraph; code blocks and lists stay whole.
  • Question and approval cards work in chat.

Non-goals

  • Mobile.
  • Persona delivery (it is a section of the home's AGENTS.md).

Blocked by

None

Required proof

  • Before and after screenshots, and one integrated pass in the desktop app.

Activity

  1. lukemaj commented on Oct 1, 2026

    @lukemaj
    ContributorAuthor

    What: #116 is owned exclusively in the existing feat/116-promachos-mode worktree, with one writer and one independent reviewer.
    Why: The user settled the prior ownership collision and requested a fork-owned chat-first view.
    So what: This dispatcher delivers one reviewed PR against main without merge; installed-build acceptance stays with the coordinator.

    Elon record

    Requirements and who asked: User and #116 require standard/Promachos switching, designated home conversations and creation, paragraph bubbles preserving code/lists, working indicator, functional existing questions/approvals, web and desktop. This advances the Objective's Promachos bubble conversations.
    Deleted: No persona delivery, mobile, new orchestration contracts, separate bot backend, extra dispatcher, or Prism role implementation. No versioning by design.
    Bottleneck: Preserve existing composer/question/approval behavior without copying the upstream-churning ChatView. One worker owns the coupled UI slice; dispatcher inspects and performs integrated proof after integration.
    Checked myself: Full #116 and parent #113, clean exclusive worktree at 0db8b3f19549ef369a611883e111ae20760364c8, refreshed origin/main equal HEAD, prototype HTML and actual a/b/c images, existing AppSidebarLayout/_chat routing and ChatView timeline seam.

    Decisions and continuation

    Use existing thread state and existing functional composer/question/approval paths, with Promachos presentation in fork-owned modules and minimal integration hooks. Home selection includes environment identity so multi-environment projects remain distinct. Normal conversation creation is isolated behind one function until the user instructs #115 integration. No rebase or sibling contact until instructed. Before/after and behavior screenshots are from isolated dev state; installed desktop, persona across harnesses and Prism integration remain coordinator acceptance items.

    Workspace: /Users/lukaszmaj/dev/toolboxmd/chromeria-worktrees/116-promachos-mode; branch feat/116-promachos-mode; intended base main. No writes to canonical checkout or inherited t3code cwd. Prior retired threads are not contacted. Exactly one PR, no merge, no scratch commits.

  2. lukemaj commented on Oct 1, 2026

    @lukemaj
    ContributorAuthor

    What: UI write ownership transferred cleanly to an explicitly selected Claude Opus 5.5 worker.
    Why: The user added a mandatory UI-writer model rule before implementation began.
    So what: Opus exclusively writes #116; this Codex dispatcher remains responsible for acceptance proof, independent review and the single unmerged PR.

    Verified former worker sub.sub.sub.46b03420-8643-4703-8756-8602f14b39fb.dispatcher-6c369303ffb1.dispatcher-7a9741a708e1.worker-3e065eb33700 idle, relinquished ownership, no edits or commits. Independently verified clean branch feat/116-promachos-mode at 0db8b3f19549ef369a611883e111ae20760364c8. New worker sub.sub.sub.46b03420-8643-4703-8756-8602f14b39fb.dispatcher-6c369303ffb1.dispatcher-7a9741a708e1.worker-d2451b132398 returned instanceId: claudeAgent, model: claude-opus-5-5 from spawn_thread. No competing writer.

    Prototype a/c owns the visual target; b rooms belong only to Spectrum. No fake agents or read receipts. Real action handlers stay intact. #121 person-picker sidebar consumes our contained AppSidebarLayout integration seam. #115 conversation creation seam remains unwired until user instruction.

    Setup proof: pnpm exec vp i passed, prepare passed (Node 26 versus requested 24 engine warning). Bun absent; Python sqlite opened the source read-only and completed VACUUM INTO to task-local .t3/userdata/state.sqlite. No live database writes, no server started, no port 3773 operations. T3 preview is available. If GitHub image upload is unavailable, updated common authorizes evidence paths under /tmp/promachos-coord/evidence/116/ for coordinator upload.

  3. lukemaj commented on Oct 1, 2026

    @lukemaj
    ContributorAuthor

    What: The #116 candidate is being rebased onto current main before final proof and independent review.
    Why: The merged #120 right-panel surface switch changes the shared ChatView integration.
    So what: #116 retains normal conversation creation until explicit authorization to wire merged #115.

    Durable #115 seam, supplied by the user: dispatch normal thread.turn.start with a new top-level threadId, bootstrap.createThread with valid placeholder modelSelection, and prismRole: "promachos". The server replaces the model with the first eligible role model. Inspect the configured Promachos role list: an EMPTY list starts normally without prismRole, so unconfigured users can talk. A configured list that refuses capacity must show the refusal message, with no silent normal fallback. Empty or all-ineligible server role lists produce OrchestrationDispatchCommandError.

    This is a future contract, not authorization to wire. Wire only after the user confirms PR #125 merged and after rebasing. Current implementation keeps the single useStartPromachosConversation function as the normal entry seam. No persona changes.

  4. lukemaj commented on Oct 1, 2026

    @lukemaj
    ContributorAuthor

    What: Promachos mode shows home conversations in paragraph bubbles and starts configured conversations through Prism.
    Why: The coding timeline is noisy for conversation, and Promachos needs his configured role model when a conversation starts.
    So what: This PR is review-ready with current-head CI, real-home proof and independent approval. The coordinator owns installed acceptance and evidence upload. No merge.

    PR: #128. Advances the current Objective, Promachos chats in bubbles. Candidate 3700bb61179c4ad2353a84d78016f488057c57ad is based on main 6acb2cf4887eeb709c499bed67ac018a6cb0a8e4, including merged #115, #120, #126 and #129. Earlier candidates and unwired handoffs are superseded.

    Fork-owned mode, home picker and conversation components keep upstream hooks small. Home selection includes environment identity. Markdown bubbles use one existing parser: fenced and indented code, lists, tables and shared reference definitions remain valid. The existing composer question and approval cards render inline with their real handlers, and remain attached to the composer when a retained timeline belongs to another thread. The shared right panel is reused. Outbound bubbles use theme foreground/background colors and invert in dark mode.

    The single creation entry opens a normal home draft. Its first send wraps the existing thread.turn.start: a non-empty configured Promachos list adds prismRole: "promachos" to a new top-level bootstrap.createThread, retaining a valid placeholder model. The server selects the eligible role model. An empty list starts normally without the role. Refusal stays visible and restores the draft without a normal fallback. Configured Promachos disables multi-model fan-out consistently across composer, send and workspace controls; returning to Code restores the saved selection.

    Requirements and who asked: User and #116 require mode switching, home conversations, paragraph bubbles with intact Markdown, working indicator and functional inline cards; the user authorized the merged #115 role seam and real-home proof.
    Deleted: Persona authorship, Spectrum rooms, fake agents/read receipts, mobile, new Markdown dependency and duplicated card handlers.
    Bottleneck: Prove the real creation/refusal seam and thread-owned cards without widening ChatView churn.
    Checked myself: Inspected prototype a/c/a-dark and HTML; actual parser cases including indented-code blank lines and shared references; real-home dispatch, persisted server model and harmless replies; refusal/no fallback; saved-selection transitions; light/dark bubbles and existing card dispatch/right panel. Fixed observed sidebar overflow and reviewed portal and selection bugs through the sole Opus writer.

    Proof:

    • On final HEAD, in apps/web: pnpm exec tsc --noEmit passes; pnpm exec vp test run src/components/promachos src/components/ChatView.logic.test.ts src/components/chat/MessagesTimeline.test.tsx src/components/chat/ComposerPendingApprovalPanel.test.tsx src/components/chat/ComposerPendingUserInputPanel.test.tsx passes 231 tests in 8 files. Targeted lint passes with no errors/warnings in Promachos and ChatView. bash scripts/fork-check.sh passes. git diff --check passes.
    • Behavioral tests decode recorded commands with the real contract. They cover empty/configured lists, top-level/existing/child threads, unchanged refusal with one dispatch, and effective saved selection. Markdown tests parse actual Markdown, including indented code and shared definitions; removing the plugin makes all five fail. The portal regression fails under the old ownership behavior.
    • Primary integrated T3 preview used isolated worktree .t3, seeded via read-only VACUUM INTO. Actual /Users/lukaszmaj/dev/promachos was added through the UI and selected as home. Its instruction/direction files were read only. Home HEAD remains c2441fcb3ad0e1c3fef93c01b378f597bfe1f858, clean; provider prompts explicitly prohibited tools/file changes and persona quotations.
    • Empty list: real normal bootstrap created thread c2cf0687-79ca-4422-bfc5-0a4c0151f01a in real-home project ff8fbcd0-3b04-4ee5-9482-0eb15aaebce3, no prismRole, harmless real reply in two bubbles.
    • Configured list: one bootstrap for thread a73ab281-89ac-4345-9ac1-c7f420db4132 carried the role and valid Codex/GPT-6.1-Sol placeholder. Read-only DB inspection confirmed the server selected Codex/GPT-6-Luna from the role list; the real reply was two paragraphs and one blank-line-preserving fenced block. The screenshot's composer model is the placeholder, not proof of server model selection.
    • Refusal on final rebased HEAD: isolated all-ineligible model fixture returned exactly No eligible model for this role and lane: codex/promachos-proof-unavailable (model not offered). The draft was restored and captured one role dispatch with no fallback. This exercises the real server refusal path; no real subscription was exhausted to manufacture a capacity limit.
    • Saved multi-model choice in Code became one effective model in configured Promachos. Workspace changed current checkout → new worktree → current checkout; Code restored both saved models. No worktree or provider turn was launched for this selector check.
    • Refreshed post-rebase real-home light/dark and Code/Promachos views preserve narrow paragraph bubbles and whole code. Earlier unchanged UI proof covers 208/256px switch fit, home filtering/persistence, static working indicator, rich Markdown and right-panel open/close. Question selection and approval decline emitted existing response commands with correct thread/request identity; fixture requests had no bound provider, so provider resumption remains installed acceptance.

    Current-head CI completed SUCCESS on the exact candidate: Check, Test, all three server shards, Rust and Release Smoke pass. Fork Stack Model and Native fingerprint diff pass. CI owns complete repository checks; no local repo-wide proof is claimed. Prior runs are superseded for readiness. Marking ready retriggered ancillary Native fingerprint/label jobs on the same head; these reruns are pending at handoff, while the complete CI run remains SUCCESS.

    Independent approve: exact HEAD 3700bb61179c4ad2353a84d78016f488057c57ad against 6acb2cf4887eeb709c499bed67ac018a6cb0a8e4, reviewer thread sub.sub.sub.46b03420-8643-4703-8756-8602f14b39fb.dispatcher-6c369303ffb1.dispatcher-7a9741a708e1.reviewer-f849a17bc606. GitHub review/independent is success on this SHA. Older reviews are superseded.

    Evidence fallback is explicitly authorized. GitHub binary upload is unavailable through exposed tools; the coordinator uploads these files. No proof assets are committed. Primary real-home files:

    • /tmp/promachos-coord/evidence/116/real-home-standard-before.png
    • /tmp/promachos-coord/evidence/116/real-home-after.png
    • /tmp/promachos-coord/evidence/116/real-home-prism-routing.png (same real reply image; routing independently verified by dispatch and persisted model)
    • /tmp/promachos-coord/evidence/116/real-home-dark.png
    • /tmp/promachos-coord/evidence/116/real-home-refusal.png

    Supplemental earlier card/Markdown fixtures: /tmp/promachos-coord/evidence/116/inline-question.png, inline-approval.png, promachos-after.png, and cards-and-switching.mp4. The coordinator personally inspected real-home-after.png and real-home-refusal.png, plus the earlier rich-block and question files. Synthetic proof home is supplemental only.

    Reversible assumptions: mode/home are local client preferences; bubbles apply to home threads only while enabled; no shortcut/command-palette entry. Persona remains user-owned. #121 sidebar seam stays contained in AppSidebarLayout.tsx's Promachos branch and PromachosSidebar.tsx.

    Agent Observer comment was refreshed with sync then publish --task toolboxmd/chromeria#116 --repo toolboxmd/chromeria --pr 128. Attribution/usage coverage gap: 75 sessions have usage bound to no task and 0 responses are attributed. Displayed $0.00 is not a measured actual total. Observer repair is outside #116.

    Open coordinator acceptance: installed desktop after merge, real installed question/approval provider resumption, and evidence upload. #115 is wired, not deferred. The isolated dev server was stopped through its retained session after capturing listener PIDs 10332/10325; ports 14668/6628 are free. Writer/reviewer are confirmed idle, and the clean branch/worktree remain for this open PR. No merge/installation. No versioning by design. Website impact: none, fork application UI only.

    UI implementation: Claude Opus 5.5 through T3 Code Claude harness. Coordination/proof: GPT-6.1-Sol through T3 Code Codex harness. Independent review: Prism-selected GPT-6-Luna through Codex.

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