i3 focus block: emoji suitcase, not FA PUA

Font Awesome private-use U+F0F2 failed the i3blocks private-use
check and turned main's Shell tests CI red.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01WzxdWXa4ytX9adN7qpMAop
This commit is contained in:
Krzysztof Rudnicki 2026-11-11 15:39:47 +01:00
parent 87e6e73521
commit 1b5a040b31
4 changed files with 15 additions and 42 deletions

View File

@ -0,0 +1,11 @@
{
"intent": "Turn main's Shell tests CI green again: the focus_project i3blocks block used a Font Awesome private-use codepoint (U+F0F2) for the interview-trip suitcase, which the i3blocks config checks forbid.",
"scope": ["linux_configuration/i3blocks/focus_project.sh", "linux_configuration/tests/test_i3blocks_focus_project.sh", "Non-goal: any other change to the focus block"],
"changes": ["SUITCASE is now the luggage emoji U+1F9F3 (rendered by Noto Color Emoji, like the block's existing target emoji) in the block and its test"],
"verification": [
{"command": "bash linux_configuration/tests/test_i3blocks_efficiency.sh", "result": "pass", "evidence": "exit 0; was the failing check on CI run 43017516672"},
{"command": "bash linux_configuration/tests/test_i3blocks_focus_project.sh", "result": "pass", "evidence": "exit 0, suitcase assertions use the emoji"}
],
"risks": ["The suitcase now renders as a colour emoji instead of a monochrome Font Awesome glyph"],
"rollback": ["git revert this commit", "Shell tests CI goes red again on the private-use check"]
}

View File

@ -1,39 +0,0 @@
{
"intent": "Make the issue dashboard (~/src/issue-dashboard) one click away from the i3 bar: an [issue_dashboard] block shows issues to do, agents working and work ready to merge, turns red when an agent or a proof failed, and a click opens the dashboard window the same way [book_guard] opens book-guard.",
"scope": [
"linux_configuration/i3blocks/issue_dashboard.sh - new block script",
"linux_configuration/i3blocks/config - [issue_dashboard] entry after [book_guard], interval=30",
"linux_configuration/tests/test_i3blocks_issue_dashboard.sh - behaviour test",
"Non-goal: the dashboard itself (lives in ~/src/issue-dashboard, local repo); i3/i3blocks were not reloaded on the live session."
],
"changes": [
"issue_dashboard.sh reads the one-line status.json the dashboard server rewrites on every refresh (~/data/issue-dashboard/status.json): '📋 <to do> · ⚙ <working> · ✓ <ready>', white normally, green when something is ready to merge, red with '· ✗ <n>' when an agent or a proof failed, grey '📋 dashboard' when the file is missing, unreadable or older than 180 s (server not running). Zero forks on the hot path: one builtin read, bash regex, printf clock.",
"A click runs ~/.local/bin/issue-dashboard-desktop via setsid -f, which reuses the dashboard server or starts it detached and opens an app window.",
"~/.config/i3blocks/issue_dashboard.sh symlinked to the repo file, the way i3/install.sh links every i3blocks/* file."
],
"verification": [
{
"command": "bash linux_configuration/tests/test_i3blocks_issue_dashboard.sh",
"result": "pass",
"evidence": "fresh / ready / failed / stale / missing / broken / empty / click asserted; strace shows exactly one execve (bash) and no clone/fork on the hot path."
},
{
"command": "bash linux_configuration/tests/test_i3blocks_efficiency.sh",
"result": "pass",
"evidence": "All i3blocks efficiency regression tests passed."
},
{
"command": "~/.config/i3blocks/issue_dashboard.sh (live status.json from the real server)",
"result": "pass",
"evidence": "'📋 5 · ⚙ 0 · ✓ 0' #FFFFFF while the server ran against Sepci0/kado-no-akari; '📋 dashboard' #6272A4 before it had ever run; BLOCK_BUTTON=1 started the launcher, which opened the (stubbed) browser with --app=http://127.0.0.1:8765/."
}
],
"risks": [
"The block appears only after the next i3 reload; nothing was reloaded on the live session.",
"A click with issue-dashboard-desktop missing does nothing (errors are silenced so the bar never breaks)."
],
"rollback": [
"git revert this commit and remove ~/.config/i3blocks/issue_dashboard.sh; i3-msg reload.",
"Confirm the bar still renders [book_guard] and the other blocks."
]
}

View File

@ -38,9 +38,10 @@ readonly STALE_AFTER_SECONDS=180
readonly YELLOW='#F1FA8C'
readonly GREEN='#50FA7B'
readonly RED='#FF5555'
# FontAwesome suitcase (the bar's icon font): an interview project's trip
# Luggage emoji (not a Font Awesome private-use glyph, which the i3bar
# checks forbid): an interview project's trip
# question (milestone trip_ask:*) is still open, pending or missed.
readonly SUITCASE=$'\uf0f2'
readonly SUITCASE='🧳'
emit() {
# full_text, short_text, color: the three lines i3blocks reads.

View File

@ -65,7 +65,7 @@ assert_eq '#50FA7B' "$(line 3 "$out")" 'green at daily_minutes'
printf 'Checking interview milestones (red when missed, suitcase when a trip question is open)...\n'
RED='#FF5555'
SUITCASE=$'\uf0f2'
SUITCASE='🧳'
# focus_ms MISSED MINUTES MILESTONE_JSON_ARRAY
focus_ms() {
jq -nc --argjson x "$1" --argjson m "$2" --argjson ms "$3" \