adventure: stop dropping dispatches Pete has no words for
An event_type with no template was a 400 at ingest. That reads like caution and behaves like deletion: gogobee retries a 400 to its cap and then parks the row forever, so rejecting a type Pete hadn't learned to phrase didn't defer the event, it destroyed it. companion_hire went that way. It has been emitted from `!expedition hire` since the combat-engine work landed and has never once reached the site — the game logged a successful emit every time, and the queue row simply never sent. The mitigation on the books was "always deploy Pete first", which is a thing a person has to remember rather than a property of the system. So invert it. An unknown type now warns, gets counted, and publishes on a neutral fallback. 400 is kept for facts that are actually invalid: no guid, or a name that failed the fact-guard. gogobee can ship a new event type any day of the week now; the worst case is a thin card until Pete learns the words. It is thinner than it sounds in practice. gogobee authors dispatch prose from the fact's fields with no per-type switch, so an unrecognised type still arrives with a real headline and lede and is allowed to use them. The fallback only shows through when the model is off or the prose-guard refused the output. Untemplated types never post live to Matrix, whatever tier they claim. A thin card among cards is cheap and reversible; pinging everyone in the room with a dispatch Pete couldn't phrase is neither. The daily digest still carries it, one line among many, which is the right volume for something we don't understand yet. And give companion_hire its template. Pete is the one being hired, so it is first-person like his duels — third-person Pete filling in as a cleric reads as somebody else reporting on him. The admin status page grows a "dispatches with no template" panel, so the next one of these is a to-do list Pete can see rather than an archaeology dig. Claude-Session: https://claude.ai/code/session_012bxpQQJDjC1mTtLN3VVtBQ
This commit is contained in:
@@ -27,6 +27,29 @@
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{{/* Adventure dispatch types gogobee sent that Pete has no template for. These
|
||||
published on the neutral fallback — nothing was dropped — so this is a
|
||||
vocabulary to-do, not an incident. Admin-only; absent when there are none. */}}
|
||||
{{if and $admin .UnknownAdv}}
|
||||
<section class="mb-8">
|
||||
<div class="rounded-3xl bg-amber-500/10 border-2 border-amber-500/30 p-6">
|
||||
<h2 class="font-display text-xl font-bold">Dispatches with no template</h2>
|
||||
<p class="mt-1 text-sm text-[color:var(--ink)]/70 max-w-2xl">
|
||||
gogobee sent these event types since the last restart and Pete published them on the
|
||||
generic fallback. Nothing was lost — they just read thin until he learns the words.
|
||||
</p>
|
||||
<ul class="mt-3 flex flex-wrap gap-2">
|
||||
{{range .UnknownAdv}}
|
||||
<li class="inline-flex items-center gap-2 rounded-full bg-[color:var(--card)] border border-amber-500/40 px-3 py-1 text-sm">
|
||||
<code class="font-mono">{{.EventType}}</code>
|
||||
<span class="tabular-nums text-[color:var(--ink)]/60">×{{.Count}}</span>
|
||||
</li>
|
||||
{{end}}
|
||||
</ul>
|
||||
</div>
|
||||
</section>
|
||||
{{end}}
|
||||
|
||||
<div class="overflow-x-auto rounded-3xl bg-[color:var(--card)] border-2 border-[color:var(--ink)]/10 shadow-pete">
|
||||
<table class="w-full {{if $admin}}min-w-[52rem]{{else}}min-w-[28rem]{{end}} text-sm">
|
||||
<thead>
|
||||
|
||||
Reference in New Issue
Block a user