adventure: tell the story of a run, not just how it ended
Pete only ever heard that an expedition happened once it was over — a zone cleared, a retreat, a death. The run itself was narrated into one Matrix DM and thrown away. The map on the adventurer page has always shown where somebody is; this shows what happened there. Beats arrive on their own channel, append-only and idempotent on (run_id, seq). They are the one thing gogobee pushes that is history rather than state, so they accumulate instead of replacing — and they stay off the dispatch queue so a chatty run can never spend the retry budget a death dispatch depends on. The run header is derived from the beats rather than pushed: a run whose start beat never arrived still gets a readable, unattributed log instead of being dropped for want of a name. An unknown beat kind renders as its own noun rather than 400ing. That is the same lesson the dispatch ingest learned the hard way, and the regression test covers the class, not the case. Claude-Session: https://claude.ai/code/session_012bxpQQJDjC1mTtLN3VVtBQ
This commit is contained in:
@@ -2831,4 +2831,33 @@ html[data-room] .pete-felt {
|
||||
.siege-fill { transition: none; }
|
||||
.siege-live .siege-fill { animation: none; }
|
||||
}
|
||||
|
||||
/* The expedition liveblog: a column of what happened, room by room, under the
|
||||
map that says where. Deliberately plainer than the rest of the page — this
|
||||
is a log, and forty decorated cards would be unreadable at the length a real
|
||||
run reaches. The rail down the left is what makes it read as one journey
|
||||
rather than as a list of unrelated lines. */
|
||||
.runlog {
|
||||
list-style: none; margin: 0; padding: 0 0 0 1.1rem;
|
||||
border-left: 2px solid color-mix(in srgb, var(--ink) 12%, transparent);
|
||||
display: flex; flex-direction: column; gap: 0.55rem;
|
||||
max-height: 26rem; overflow-y: auto;
|
||||
}
|
||||
.runlog-line {
|
||||
display: grid; grid-template-columns: 1.4rem 1fr auto;
|
||||
align-items: baseline; gap: 0.5rem;
|
||||
font-size: 13px; line-height: 1.4;
|
||||
color: color-mix(in srgb, var(--ink) 78%, transparent);
|
||||
}
|
||||
.runlog-emoji { font-size: 14px; }
|
||||
.runlog-text { min-width: 0; overflow-wrap: anywhere; }
|
||||
.runlog-meta {
|
||||
font-size: 11px; font-variant-numeric: tabular-nums; white-space: nowrap;
|
||||
color: color-mix(in srgb, var(--ink) 42%, transparent);
|
||||
}
|
||||
/* Two tints and no more. A log where every second line is coloured is a log
|
||||
with no emphasis at all; these mark the beats a reader is scanning for —
|
||||
what hurt, and what was worth having. */
|
||||
.runlog-hurt .runlog-text { color: color-mix(in srgb, #c0392b 62%, var(--ink)); font-weight: 600; }
|
||||
.runlog-good .runlog-text { color: color-mix(in srgb, #3fa66a 60%, var(--ink)); }
|
||||
}
|
||||
|
||||
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user