Skip to content

monitor-tick: ACTION_VOCAB has no commented verb, so every comment-only ACTION tick collapses to actions:["other"] and loses the issue number #3928

Description

@tomerweller

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.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions