monitor-tick: ACTION_VOCAB has no commented verb, so every comment-only ACTION tick collapses to actions:["other"] and loses the issue number
Self-reflection finding from a live tick at 00:46Z on 2026-08-24, one tick after #3924 landed the
single-writer helper. Demonstrated, not hypothetical.
Symptom
This tick's only action was a comment on an existing open issue (#3823 — new evidence on the
cancelled-vs-failure CI blind spot). There is no vocabulary token for that, so the row degrades:
$ python3 scripts/lib/monitor-tick-artifacts.py emit-row --status ACTION --ledger 64069503 \
--build 0ac84d42 --deploys 0 --self-reflect clean --warnings "" \
--actions "commented-#3823" --watch "probe=1" --ts "2026-01-01T00:00:00Z"
{"ts": "...", "status": "ACTION", ..., "actions": ["other"], ...}
# for contrast, the filing verb round-trips with its number intact:
$ ... --actions "filed-#3823"
{"ts": "...", "status": "ACTION", ..., "actions": ["filed-#3823"], ...}
Why this is a gap, not a nuance
The skill's own Output section makes commenting a first-class ACTION trigger — same tier as filing:
Use ACTION when a corrective action was taken (restart, deploy, filed a new issue, commented on
an existing issue, session-wipe recovery).
But scripts/lib/monitor-tick-artifacts.py:104-117 does not carry a matching verb:
# Closed vocabulary for `actions`. Unlike warnings this is a small fixed set of
# verbs (not user-extensible via TOML), so it lives here. `filed-#<N>` carries a
# dynamic issue number and normalizes to the `filed` base for the vocab check
# while the full token is preserved in the row.
ACTION_VOCAB = {
"restart",
"deploy",
"filed",
"session-wiped-recovery",
"session-wiped-process-alive",
"session-wiped-rebuild-failed",
"mainnet-data-wiped",
OTHER,
}
and the dynamic-suffix normalizer at :168-173 is filed-only:
def action_base(token: str) -> str:
"""Normalize an action token to its vocabulary base (`filed-#123` -> `filed`)."""
t = token.strip()
if re.match(r"^filed-#", t):
return "filed"
return t
The SKILL's own actions enumeration in the tick-history block matches the code, not the Output
section — it lists restart, deploy, filed-#N, session-wiped-*, mainnet-data-wiped and omits any
comment verb. So the two halves of the skill disagree about whether commenting is a recorded action.
Consequence
/daily-summary aggregates the actions array. A comment-only ACTION tick therefore contributes an
untraceable other:
This is a reporting-fidelity defect only. The row still validates, emit-row exits 0, nothing is
routed to tick-history.rejected.jsonl, and the tick is unaffected. It does not mask any
validator-blocking signal.
Suggested fix
One verb plus one branch, mirroring the existing filed handling exactly:
ACTION_VOCAB = {
"restart",
"deploy",
"filed",
+ "commented",
"session-wiped-recovery",
...
}
def action_base(token: str) -> str:
- """Normalize an action token to its vocabulary base (`filed-#123` -> `filed`)."""
+ """Normalize an action token to its vocabulary base (`filed-#123` -> `filed`)."""
t = token.strip()
if re.match(r"^filed-#", t):
return "filed"
+ if re.match(r"^commented-#", t):
+ return "commented"
return t
Then add commented-#N to the --actions enumeration in the SKILL's tick-history block so the two
halves agree. A scripts/test-monitor-skill-snippets.sh case asserting
commented-#123 -> actions:["commented-#123"] would lock it in, alongside whatever now covers the
filed-#N round-trip.
Worth considering while touching this: action_base is now two near-identical prefix branches. A
single ^(filed|commented)-# capture would generalize to any future dynamic verb without a third
branch — but that is a style call for whoever picks this up, not a requirement.
Interim behaviour (what this tick actually did)
To keep the row truthful I passed commented-#3823 (which normalizes to other) and carried the
number in the free-form watch array as commented=#3823, rather than mislabelling a comment as
filed-#3823. That workaround is available to any tick but it puts the datum in the wrong column —
watch is for tracked measurements, not actions — so it is not a substitute for the verb.
Non-urgent, no label: monitor-side reporting fidelity, no validator impact. For context the mainnet
validator is down on the unrelated #3910 outage (40h10m, build_sha 0ac84d42, deploys held by the
blocked_active quarantine); nothing here bears on that.
Related: #3791 / PR #3924 (the single-writer helper that introduced this vocabulary), #3757 (the
key-signature census that motivated it).
Filed by /monitor-tick self-reflection.
monitor-tick:
ACTION_VOCABhas nocommentedverb, so every comment-only ACTION tick collapses toactions:["other"]and loses the issue numberSelf-reflection finding from a live tick at 00:46Z on 2026-08-24, one tick after #3924 landed the
single-writer helper. Demonstrated, not hypothetical.
Symptom
This tick's only action was a comment on an existing open issue (#3823 — new evidence on the
cancelled-vs-failureCI blind spot). There is no vocabulary token for that, so the row degrades:Why this is a gap, not a nuance
The skill's own Output section makes commenting a first-class ACTION trigger — same tier as filing:
But
scripts/lib/monitor-tick-artifacts.py:104-117does not carry a matching verb:and the dynamic-suffix normalizer at
:168-173isfiled-only:The SKILL's own
actionsenumeration in the tick-history block matches the code, not the Outputsection — it lists
restart, deploy, filed-#N, session-wiped-*, mainnet-data-wipedand omits anycomment verb. So the two halves of the skill disagree about whether commenting is a recorded action.
Consequence
/daily-summaryaggregates theactionsarray. A comment-only ACTION tick therefore contributes anuntraceable
other:corpus for comment-only ticks — the exact class of loss monitor: single-writer helper + schema validation for tick-history.jsonl and archive metadata.env #3791 existed to eliminate.
otheris the shared fallback for any out-of-vocabulary token, so comment actions areindistinguishable from genuinely unknown ones.
steady state is "quiet node, recurrence evidence on existing issues" — commenting is the typical
action, and filing the exception.
This is a reporting-fidelity defect only. The row still validates,
emit-rowexits 0, nothing isrouted to
tick-history.rejected.jsonl, and the tick is unaffected. It does not mask anyvalidator-blocking signal.
Suggested fix
One verb plus one branch, mirroring the existing
filedhandling exactly:Then add
commented-#Nto the--actionsenumeration in the SKILL's tick-history block so the twohalves agree. A
scripts/test-monitor-skill-snippets.shcase assertingcommented-#123 -> actions:["commented-#123"]would lock it in, alongside whatever now covers thefiled-#Nround-trip.Worth considering while touching this:
action_baseis now two near-identical prefix branches. Asingle
^(filed|commented)-#capture would generalize to any future dynamic verb without a thirdbranch — but that is a style call for whoever picks this up, not a requirement.
Interim behaviour (what this tick actually did)
To keep the row truthful I passed
commented-#3823(which normalizes toother) and carried thenumber in the free-form
watcharray ascommented=#3823, rather than mislabelling a comment asfiled-#3823. That workaround is available to any tick but it puts the datum in the wrong column —watchis for tracked measurements, not actions — so it is not a substitute for the verb.Non-urgent, no label: monitor-side reporting fidelity, no validator impact. For context the mainnet
validator is down on the unrelated #3910 outage (40h10m,
build_sha0ac84d42, deploys held by theblocked_activequarantine); nothing here bears on that.Related: #3791 / PR #3924 (the single-writer helper that introduced this vocabulary), #3757 (the
key-signature census that motivated it).
Filed by
/monitor-tickself-reflection.