native-ui: verify --settings theme selection end to end, then land the launch flags #241
Labels
No labels
autonomy
async-consult
autonomy
epic
autonomy
headless
autonomy
live-collab
coherence-core
priority
P0
priority
P1
priority
P2
priority
P3
priority
P4
qa-fixture
role/ai
role/creator
role/design
role/director
role/engineer
role/exec
role/human
role/ops
role/qa
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
coilyco-flight-deck/agent-compose#241
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Tracks the remaining native-UI work after
native-uilanded onmain(themes, spinner verbs, and spinner tips for all eight roles).The one unverified claim
Everything downstream rests on this: a composed session can receive its whole native identity as launch arguments, with no host mutation, because
--settingsloads into theflagSettingsprecedence tier.Read from the Claude Code 2.1.221 binary: the tier order above,
flagSettingsas the--settingstier, andtheme/spinnerVerbs/spinnerTipsEnabled/spinnerTipsOverrideall living in the schema that tier validates, withthemeaccepting acustom:prefixed slug.Not verified: that an emitted fragment passed as
--settingsactually selects a custom theme in a live session. That is inference from the three facts above, not an observation.The check needs an interactive session, because print mode silently ignores settings files that fail validation, so
-pwould report success either way. It also needs the theme file present under<home>/.claude/themes/, since acustom:reference resolves against that directory.Remaining work, in order
--settingsselection interactively. Blocks the rest. If it fails, the launch path needs a different mechanism and agentic-os#962 grows back the settings-merge scope it just lost.--name <seat>plus--settings <bundle>/claude-settings.json. One code path, one job.Done when
--settingsselection is confirmed or disproven in a live session, the result is recorded on this issue, and agent-compose#236 and agentic-os#962 are corrected if it was wrong.Verified:
--settingsselects a custom theme in a live session, and beats userSettingsObserved, not inferred. Claude Code 2.1.221 on macOS, run under a pty so the TUI actually renders, with the raw output bytes captured and scanned for 24-bit foreground sequences.
Setup:
<home>/.claude/themes/holdsaos-design.jsonandaos-engineer.json, both straight fromexamples/claude-native-ui/themes/.<home>/.claude/settings.jsonalready carried"theme": "custom:aos-design", so the user tier had a competing selection. That makes the test a precedence check as well as a selection check.Control, no flag:
Test,
--settings examples/claude-native-ui/settings.engineer.json:Every design triple is absent from the test capture, and every engineer triple is absent from the control. So the flag both selected the custom theme and overrode the user settings file, which is what the
flagSettingstier position predicted.What this settles
--nameand--settings. One insight, one code path.Still not observed
Theme selection only.
spinnerVerbs,spinnerTipsEnabled, andspinnerTipsOverrideride the same tier and the same schema, so they are expected to apply, but a fresh screen renders no spinner and the capture shows none. Confirming those needs a probe that drives a turn.Note for whoever repeats this: matching on prompt text needs the escape sequences stripped first. Claude Code emits a cursor-column sequence between words, so the trust prompt reads as
trust\x1b[20Gthis\x1b[25Gfolderin the raw stream.State of the remaining work
--settingsselection interactively - done, evidence above.mainat10a78e1. Closed.mainat0a7683f. Closed. The tick contract turned out to be the inverse of what #237 assumed on both halves: one invocation per tick carrying every row, and strict JSONL out rather than text. Details on that issue.Two calls left on this program
#239 detection. The issue asks whether refreshing is a manual chore or something the repo detects. Detection is feasible but the shape matters. The 184 verbs sit in one JS array literal and re-extract cleanly. The theme tokens do not: the base objects are keyed identically across
dark,light,dark-ansi,light-ansi, and both daltonized variants, and the name-to-object mapping is not recoverable by a simple read, so there is no honest way to re-extract the dark set specifically. What is recoverable is the union of token keys across every base, which still catches a rename as a missing key.That suggests: pin the version in one place, vendor both lists side by side with the extraction method recorded, and check drift by comparing extracted content rather than the version string. A version-string gate would fail on every Claude Code auto-update and get bypassed within a week.
#238 packaging. The issue flags the caveat worth weighing first, and it still stands. Packaging concentrates more of the identity behind
--safe-mode, and after #236 the settings half no longer needs installing at all, so the only thing packaging saves is the eight theme files. That is a much smaller prize than when the step was written.Both are worth a human decision before implementation, so this issue is the wall.
Closing. Every item on this issue is resolved.
--settingsselection - done. Observed, evidence above.10a78e1. Closed.0a7683f. Closed. Contract corrected against the binary.--safe-modeblast radius stayed the same size.Vendored list refresh (#239) - done,
6cfbb56and3a1bf5f. Detection is by content rather than version, and it found real drift on its first run: the verb list was 184 where the harness ships 186.What the program actually delivered
A composed Claude session receives its whole native identity as launch arguments.
--name <seat>and--settings <bundle>/claude-settings.jsoncarry the seat name, the theme selection, the spinner verbs, the tips, and now the subagent status line. Nothing is written into~/.claudeat compose or launch time. The single remaining host dependency is the theme document, and its absence degrades to losing the colors while keeping everything else.The unverified claim this issue was opened to settle is settled, and it held.
Deferred, tracked at #242
Two inferences that need a session driving a real turn: whether Ink honors ANSI inside subagent row
content, and whether the verbs and tips actually apply through--settingsas their shared tier and schema predict. Neither blocks anything shipped, and both fail quietly if wrong, which is why they are written down rather than assumed.