feat(tui): picks-v4 clawd inward eyes + codex chevron hint (values finalize)

PICKS-OF-RECORD v4 (sha256-16 14afeb74, founder amendment via pm-lead,
byte-verified; assignment 3c8e4665, qitem 266e4c14):

- clawd eyes become literally '><' — left '>' right '<', pointing INWARD,
  squinty (image-cache 102): dark #181818 eyes on the #ad6755 terracotta
  field, 2-cell form unchanged. Founder rationale: edge-eyes do not read
  as eyes; inward brackets make it read as a FACE. Supersedes the round-4
  outer-quadrant pair (kept in comment lineage).
- codex blue-hint pick (item a): CHEVRON-ONLY — codexMark's '>' now
  carries the OFFICIAL sampled #6867aa (token codexBlue); '_' stays light
  ink; text stays exactly ASCII '>_' (web identity); detail/topology only.
  codexHintVariants stays as the decision-lineage record.
- items b (mono icons kept) and c (motion approved) require no code
  change. Explorer mark-absence extended to ban the new '><' pair; every
  ▘▝-era pin updated citing the amendment; new chevron SGR pin on detail.

Gates: TUI 212/212 · repo lint · TUI/CLI/daemon builds. Front-door is
environment-flaky on this host today (PTY timeouts, counts vary 1-4 per
run, PARENT-REPRODUCED at the clean base via stash round-trip in this
worktree; the diff touches no packages/cli file). Never push.

Co-Authored-By: Claude Fable 5 <[email protected]>
This commit is contained in:
v-openrig-buildandClaude Fable 5 committed 2026-08-04 19:58:49 +00:00
1 parent 8fe43fd290
commit 2156f5307a
6 files changed
+45 -42

No files matched your search

+1
View File
@@ -7473,6 +7473,7 @@
"zod": "^4.3.6"
},
"bin": {
"openrig-tui": "tui/dist/main.js",
"rig": "dist/bin-wrapper.js"
},
"devDependencies": {
+20 -18
View File
@@ -125,24 +125,25 @@ export function clawdFounderMark(): MarkSeg[] {
];
}
/** ROUND-3 LOCKED clawd row mark, round-4 quadrant-geometry correction (guard
* finding 1): a SQUARE (2 cells ≈ square at cell aspect) with two quarter-
* block EYES clearly APART — cell 1 carries the OUTER-LEFT quadrant (▘
* U+2598 QUADRANT UPPER LEFT) and cell 2 the OUTER-RIGHT (▝ U+259D QUADRANT
* UPPER RIGHT), so the inner half of BOTH cells is pure terracotta field and
* the eyes flank a real center gap. (The prior ▝▘ order put the inner-right
* and inner-left quadrants together AT the center seam — the rejected
* center-bunched form.) Eyes sit high like the source grid; dark #181818 eyes
* ON the #ad6755 terracotta field. */
/** PICKS-V4 clawd row mark (founder amendment, PICKS-OF-RECORD sha256-16
* 14afeb74, 2026-08-04 — a bounded refinement INSIDE the locked square-with-
* eyes direction): the eyes are literally the characters `><` — left eye `>`,
* right eye `<`, pointing INWARD, squinty (reference image-cache 102).
* Founder rationale verbatim: eyes at the far edges do not read as eyes;
* inward angle brackets make it read as a FACE. Dark #181818 eyes ON the
* #ad6755 terracotta field, unchanged. (Lineage: round-4 shipped the ▘▝
* outer-quadrant pair; superseded by this amendment.) */
export function clawdSquareMark(): MarkSeg[] {
return [
{ text: "▘", token: "clawdEye", bg: "clawd" },
{ text: "▝", token: "clawdEye", bg: "clawd" },
{ text: ">", token: "clawdEye", bg: "clawd" },
{ text: "<", token: "clawdEye", bg: "clawd" },
];
}
/** ROUND-3 codex blue-hint CANDIDATES (LOOK choice a — UNPICKED; the shipped
* mark stays the approved plain form until the authenticated pick): each
/** ROUND-3 codex blue-hint CANDIDATES — PICKED at picks v4 (14afeb74):
* CHEVRON-ONLY, on detail/topology surfaces only (founder delegated; pm-lead
* ruled the most restrained option). codexMark() below now ships the chevron
* form; this record keeps the presented variants for decision lineage. Each
* variant uses the OFFICIAL sampled #6867aa (token codexBlue), never a
* remembered value. */
export function codexHintVariants(): Record<"chevron" | "outline" | "none", MarkSeg[]> {
@@ -170,13 +171,14 @@ export function clawdMiniB(): MarkSeg[] {
return clawdDownsample(3, 1)[0]!;
}
/** Codex: the `>_` prompt mark, light-on-dark (the web mark is `>_` in a
* light circle; the terminal-cell form keeps the glyph pair). */
/** Codex: the `>_` prompt mark with the PICKS-V4 CHEVRON-ONLY blue hint
* (item a, 14afeb74): the `>` carries the OFFICIAL sampled #6867aa; the `_`
* stays light ink. Text stays exactly ASCII `>_` (web-identity: the SAME
* mark, not a cousin; ❯ remains vetoed). This mark renders on detail +
* topology surfaces only — the explorer carries no marks (locked). */
export function codexMark(): MarkSeg[] {
// the LOCKED token is `>_` (web mark verbatim); any restyling (e.g. ❯) is
// a founder-LOOK question, not a driver choice (guard finding 4)
return [
{ text: ">", token: "markInk", bold: true },
{ text: ">", token: "codexBlue", bold: true },
{ text: "_", token: "markInk", bold: true },
];
}
+4 -2
View File
@@ -42,7 +42,7 @@ const MARK_SGR = {
markInkFg: "38;2;250;250;249", // codex `>_` light ink
codexBlueFg: "38;2;104;103;170", // OFFICIAL sampled #6867aa
} as const;
const MARK_GLYPHS = /[▘▝▖▗▚▞▐▌█▀▄╹]|>_/;
const MARK_GLYPHS = /[▘▝▖▗▚▞▐▌█▀▄╹]|>_|></; // incl. the picks-v4 eyes pair
const RUNTIME_WORDS = /claude|codex|terminal|tty/i;
function explorerRowsFor(view: ReturnType<typeof createViewState>, s: FleetSnapshot) {
@@ -86,12 +86,14 @@ describe("POSITIVE explorer-absence regression — claude/codex/terminal rows ca
return stylizeLines(screen, createStyle("truecolor")).join("\n");
};
const claude = detail("alpha");
expect(claude).toMatch(/▘/); // clawd outer-left eye quadrant
expect(claude).toMatch(/38;2;24;24;24;48;2;173;103;85m[^\x1b]*>/); // left inward eye (picks v4)
expect(claude).toMatch(/38;2;24;24;24;48;2;173;103;85m[^\x1b]*</); // right inward eye
expect(claude).toContain(MARK_SGR.clawdEyeFg);
expect(claude).toContain(MARK_SGR.clawdBodyBg);
const codex = detail("beta");
expect(stripAnsi(codex)).toContain(">_"); // codex ASCII prompt mark
expect(codex).toContain(MARK_SGR.markInkFg);
expect(codex).toContain(MARK_SGR.codexBlueFg); // picks-v4 chevron hint on detail
const term = detail("gamma");
expect(stripAnsi(term)).toContain(">_");
expect(term).toContain(MARK_SGR.terminalCellBg);
+1 -1
View File
@@ -195,7 +195,7 @@ describe("file-tree re-skin (Direction B navigator)", () => {
const screen = renderScreen(s.get(), snap2, { cols: 150, rows: 40 });
const styled = stylizeLines(screen, createStyle("truecolor"));
const joined = styled.join("\n");
expect(joined).toMatch(/38;2;24;24;24;48;2;173;103;85m▘▝/); // eyes-apart cells on the terracotta field (round-4 order)
expect(joined).toMatch(/38;2;24;24;24;48;2;173;103;85m></); // picks-v4 inward squinty eyes on the terracotta field
styled.forEach((line, j) => expect(stripAnsi(line), `line ${j}`).toBe(screen.lines[j]));
});
+1 -1
View File
@@ -31,7 +31,7 @@ describe("clawd grid = the RuntimeMark.tsx rect list", () => {
describe("row-scale mark family", () => {
it("runtime → mark mapping: claude family = clawd cells, codex = >_, terminal = dark >_, unknown = honest ?", () => {
expect(markText(runtimeMarkSegs("claude-code"))).toBe("▘▝"); // round-4 corrected square (minis stay downsample candidates)
expect(markText(runtimeMarkSegs("claude-code"))).toBe("><"); // picks v4 amendment 14afeb74: inward squinty eyes (supersedes the round-4 quadrant pair)
expect(markText(runtimeMarkSegs("codex"))).toBe(">_"); // the LOCKED web token
expect(markText(runtimeMarkSegs("terminal"))).toBe(">_");
expect(runtimeMarkSegs("terminal").every((s) => s.bg === "markBg")).toBe(true); // the dark-cell variant
+18 -20
View File
@@ -95,7 +95,7 @@ describe("hatchet mainline in the SHIPPED content pane (frame-01 visual contract
const body = screen.lines.join("\n");
expect(body).toMatch(/┌─+┐/);
expect(body).toContain("● lead"); // member-only title (S19 MR1)
expect(body).toContain("▘▝ 18%"); // round-4 corrected square clawd mark + adjacent ctx
expect(body).toContain(">< 18%"); // picks v4 (14afeb74): inward squinty eyes + adjacent ctx
// straight connector runs + arrowhead; under the LOCKED containment an
// edge may legitimately cross a pod-container wall (─ becomes ┼ at the
// crossing) before its arrowhead
@@ -539,34 +539,28 @@ describe("ROUND-3 LOCKED SET (orch locked-scope GO; pins 02259adb/29a10b62)", ()
const s = makeStore(snap);
s.dispatch({ type: "drill", resource: "pod", name: "dev", target: { host: "vm-host", rig: FIXTURE_RIG_NAME } });
const pane = renderScreen(s.get(), snap, { cols: 150, rows: 40 }).lines.map((l) => l.slice(0, 30)).join("\n");
expect(pane).not.toMatch(/▐▌|>_|▝▘|▘▝/); // no marks in the explorer (either quadrant order)
expect(pane).not.toMatch(/▐▌|>_|▝▘|▘▝|></); // no marks in the explorer (quadrant orders AND the picks-v4 eyes)
expect(pane).toMatch(/driver\s+24%/); // name-first untruncated + bare ctx%
// cards still carry the mark
s.dispatch({ type: "tab", tab: "graph" });
const body = renderScreen(s.get(), snap, { cols: 150, rows: 40 }).lines.join("\n");
expect(body).toMatch(/▘▝ 24%|▘▝ 63%/); // square clawd mark in card meta
expect(body).toMatch(/>< 24%|>< 63%/); // picks-v4 clawd mark in card meta
// detail page shows the mark as the runtime field — spelled runtime is dead
s.dispatch({ type: "drill", resource: "agent", name: "dev.driver", target: { host: "vm-host", rig: FIXTURE_RIG_NAME, pod: "dev" } });
const detail = renderScreen(s.get(), snap, { cols: 150, rows: 40 }).lines.join("\n");
expect(detail).toMatch(/runtime:\s+▘▝/); // the mark IS the runtime value
expect(detail).not.toMatch(/▘▝ claude-code/); // no spelled runtime beside the mark
expect(detail).toMatch(/runtime:\s+></); // the mark IS the runtime value
expect(detail).not.toMatch(/>< claude-code/); // no spelled runtime beside the mark
});
it("the clawd row mark is the SQUARE with eyes clearly APART (round-4 quadrant-geometry correction)", async () => {
it("the clawd eyes are the picks-v4 INWARD SQUINTY pair `><` (founder amendment 14afeb74, supersedes the round-4 quadrant geometry)", async () => {
const { clawdSquareMark, runtimeMarkSegs, markText } = await import("../src/topology/runtime-marks.js");
const sq = clawdSquareMark();
expect(sq).toHaveLength(2); // 2 cells x 1 row ≈ square at cell aspect
// GEOMETRY, not just the string (guard round-4 finding 1): the first cell's
// eye occupies the OUTER-LEFT quadrant (U+2598 QUADRANT UPPER LEFT) and the
// second cell's the OUTER-RIGHT (U+259D QUADRANT UPPER RIGHT) — the inner
// half of BOTH cells is pure terracotta field, so the eyes sit clearly
// APART around a real center gap (the ▝▘ order put both eyes at the center
// seam — the rejected bunched form).
expect(sq[0]!.text).toBe("▘"); // ▘ upper-LEFT quadrant — eye hugs the square's left edge
expect(sq[1]!.text).toBe("▝"); // ▝ upper-RIGHT quadrant — eye hugs the right edge
expect(markText(sq)).toBe("▘▝");
expect(sq.every((g) => g.token === "clawdEye" && g.bg === "clawd")).toBe(true); // dark eyes ON the terracotta field
expect(markText(runtimeMarkSegs("claude-code"))).toBe("▘▝"); // shipped claude mark = the square
expect(sq).toHaveLength(2); // 2-cell form: literally the characters >< per the amendment
expect(sq[0]!.text).toBe(">"); // left eye points INWARD
expect(sq[1]!.text).toBe("<"); // right eye points INWARD — reads as a FACE
expect(markText(sq)).toBe("><");
expect(sq.every((g) => g.token === "clawdEye" && g.bg === "clawd")).toBe(true); // dark eyes ON the terracotta field (unchanged)
expect(markText(runtimeMarkSegs("claude-code"))).toBe("><"); // shipped claude mark = the refined face
});
it("agent-detail runtime marks keep their OWN styling in compiled output (guard round-4 finding 2)", () => {
@@ -603,15 +597,19 @@ describe("ROUND-3 LOCKED SET (orch locked-scope GO; pins 02259adb/29a10b62)", ()
};
// clawd: dark #181818 eyes ON the #ad6755 terracotta field, in compiled SGR
const cl = drillDetail("d.cl");
expect(cl.styled).toMatch(/38;2;24;24;24;48;2;173;103;85m[^\x1b]*▘/);
expect(cl.styled).toMatch(/38;2;24;24;24;48;2;173;103;85m[^\x1b]*>/);
expect(cl.styled).toMatch(/38;2;24;24;24;48;2;173;103;85m[^\x1b]*</); // both inward eyes carry the eye-on-terracotta SGR
expect(cl.plain).not.toMatch(/claude/); // spelled runtime is dead
// terminal: the dark-cell background survives to the compiled detail line
const tty = drillDetail("d.tty");
expect(tty.styled).toMatch(/48;2;12;10;9m?[^\x1b]*>/);
expect(tty.plain.slice(31)).not.toMatch(/terminal/);
// codex: exactly ASCII >_ (no ❯, no enclosure pick), no spelled runtime
// codex: ASCII >_ text with the picks-v4 CHEVRON-ONLY blue hint — the `>`
// carries the OFFICIAL sampled #6867aa (38;2;104;103;170) on detail; the
// `_` stays light ink; no ❯, no outline, no spelled runtime
const cx = drillDetail("d.cx");
expect(cx.plain.slice(31).trimEnd()).toMatch(/runtime:\s+>_$/);
expect(cx.styled).toMatch(/38;2;104;103;170m[^\x1b]*>/); // chevron pick (picks v4 item a)
expect(cx.plain).not.toMatch(/❯|codex/);
});