Skip to content

specs(crons): real tests for 13 cron cards, 999-multibots-telegraf and railway (Closes #8157) - #8158

Merged
gHashTag merged 2 commits into
masterfrom
vac/crons-1
Oct 9, 2026
Merged

gHashTag merged 2 commits into
masterfrom
vac/crons-1

Conversation

@gHashTag

@gHashTag gHashTag commented Oct 9, 2026 •

Copy link
Copy Markdown
Owner

Closes #8157. Part of #6063 (t27b coverage), which is item C10 of #6488.

What changes

13 cron cards of specs/crons had no test block: the 12 cards of 999-multibots-telegraf and railway-jobsearch-cron. They passed vacuously (0 runtime asserts) under the reference and under t27b, and broke L4 TESTABILITY. Each now carries tests that hold it to the schema of specs/crons/README.md. Which tests a card gets depends on its HOST, because the fields differ: a timer has INTERVAL_MS and no SCHEDULE.

test cards what it checks
id_is_host_repo_and_slug all HOST is one of the five hosts. ID opens with HOST, /, REPO, /, then a slug that is one path segment, not empty
vocabularies_and_the_control_link all KIND is cron; ON_FAILURE is issue, log or unknown; CONTROL is one of the four handles; an empty RUNS (the control link) carries its reason in RUNS_NOTE
schedule_is_a_five_field_cron_expression Inngest, GitHub Actions five fields, one space apart, made of digits and * / , -
a_timer_names_its_file_and_line the 4 timers SERVICE is <file>:<line>, and the slug ends in -L<line> for that line: the line the card's header says the schedule was read from
the_workflow_file_is_the_slug 999-multibots-telegraf-ci SERVICE is .github/workflows/<slug>.yml
a_dashboard_schedule_says_where_it_is railway-jobsearch-cron SCHEDULE is "" when only a dashboard holds it, SCHEDULE_NOTE says so, and CONTROL is railway-dashboard

railway-jobsearch-cron has ID = "railway-cron/999/jobsearch-cron" but REPO = "railway". That breaks the README's <host>/<repo>/<slug> (see #7911). Its first test therefore checks only the shape of ID (<host>/<a>/<b>). No test restates a constant; each relates fields, or a field to the grammar it must follow, and walks strings with a var index, so its asserts are runtime asserts.

Specs changed (all specs/crons/<name>.t27):

spec host reference t27b
999-multibots-telegraf-agent-autopilot-L1118 timer 3/3 3/3, 64 asserts
999-multibots-telegraf-bot-owner-billing-L474 timer 3/3 3/3, 63 asserts
999-multibots-telegraf-check-stuck-trainings inngest 3/3 3/3, 69 asserts
999-multibots-telegraf-ci github-actions 4/4 4/4, 79 asserts
999-multibots-telegraf-client-telemetry-daily inngest 3/3 3/3, 67 asserts
999-multibots-telegraf-club-invoice-abandoned-watch inngest 3/3 3/3, 74 asserts
999-multibots-telegraf-crm-proactive-sweep inngest 3/3 3/3, 67 asserts
999-multibots-telegraf-crmProactive-L375 timer 3/3 3/3, 58 asserts
999-multibots-telegraf-daily-sales-advisor inngest 3/3 3/3, 64 asserts
999-multibots-telegraf-generate-jobs-L164 timer 3/3 3/3, 59 asserts
999-multibots-telegraf-robokassa-unclaimed-watch inngest 3/3 3/3, 71 asserts
999-multibots-telegraf-ton-pending-watch inngest 3/3 3/3, 62 asserts
railway-jobsearch-cron railway-cron 3/3 3/3, 37 asserts
  • Reference: t27c test-report <spec> on the t27c lab (zig 0.16.0): every test passes, 0 vacuous.
  • t27b: t27b test <spec> --check on the t27b lab (aarch64 under qemu).
  • Seals: t27c seal --save, then --verify: all hashes MATCH. The 13 seal files are new.
  • No existing line of any spec changed; the tests are appended.

Mutants

Hand mutants of the constants, each a plausible slip, run under t27c test-report:

  • ID with the host part drifted, the repo part drifted, or the slug split by a /;
  • HOST, ON_FAILURE or CONTROL outside its vocabulary;
  • RUNS_NOTE emptied while RUNS is empty; KIND changed;
  • a SCHEDULE that gains or loses a field, carries a letter, or has a double space;
  • a timer whose SERVICE line drifts, whose slug line drifts, or whose SERVICE loses its line;
  • a workflow file that drifts from the slug, is .yaml, or is outside .github/workflows;
  • a dashboard card whose note is emptied, whose schedule is filled, or whose CONTROL is code-only.

On the 13 cards: 153 applied, 153 killed, none survived. Over all 26 cron cards of this lane: 339 of 339.

Skipped

None in this directory: the other 13 cron cards without tests get the same treatment in the next PR.

Superseded, not duplicated: see #6901 and #6721, open PRs of an earlier attempt that add tests to 8 of these 13 cards. Their tests restate each constant (assert NAME == "agent-autopilot-L1118", assert HOST == "timer"). This lane rules out restated constants, and their integer asserts are comptime, so they execute no runtime assert. This PR does not reuse them.

Ledger

docs/reports/t27b_expectations.json: the 13 rows move from pass_vacuous to pass; nothing else changes. The rows come from bless in scripts/tri_loop/t27b.py (what tri t27b ratchet --bless runs) over lab run 3fe4e68, with this branch's t27b verdicts for the 13 specs, composed onto master's ledger with only these rows. Derived: pass 1075 -> 1088, pass_vacuous 122 -> 109.

Gates

On the t27c lab, from master's gen/c/policy/own_language.c, with lefthook.yml's one-line C main:

  • check_all() over origin/master:tools/policy/foreign-exceptions.txt, -- and git diff --name-status origin/master...HEAD: exit 0.
  • check_budget() over git diff --numstat --no-renames origin/master...HEAD: exit 0. No foreign line is added.

t27b lab: signed receipts (#7686)

Head 857ae9f (this branch), requested with a fresh 32-byte challenge, against base a97cb9e, its merge-base. Both are signed runs of the deployed lab.

/work/t27c-master corpus-receipt compare BASE HEAD --challenge-head <mine>, from /work/t27 on the t27b lab (the input/output/verdict changed lines left out):

base "a97cb9e551a100331b2618580f0198c7da01c7e6" AUTH_MISSING_NONE AUTHOR leaves-bound true
head "857ae9f73448472705c96edcf0f8593e92ca79e9" AUTH_MISSING_NONE FRESH leaves-bound true
  lane improved specs/crons/999-multibots-telegraf-agent-autopilot-L1118.t27
  lane improved specs/crons/999-multibots-telegraf-bot-owner-billing-L474.t27
  lane improved specs/crons/999-multibots-telegraf-check-stuck-trainings.t27
  lane improved specs/crons/999-multibots-telegraf-ci.t27
  lane improved specs/crons/999-multibots-telegraf-client-telemetry-daily.t27
  lane improved specs/crons/999-multibots-telegraf-club-invoice-abandoned-watch.t27
  lane improved specs/crons/999-multibots-telegraf-crm-proactive-sweep.t27
  lane improved specs/crons/999-multibots-telegraf-crmProactive-L375.t27
  lane improved specs/crons/999-multibots-telegraf-daily-sales-advisor.t27
  lane improved specs/crons/999-multibots-telegraf-generate-jobs-L164.t27
  lane improved specs/crons/999-multibots-telegraf-robokassa-unclaimed-watch.t27
  lane improved specs/crons/999-multibots-telegraf-ton-pending-watch.t27
  lane improved specs/crons/railway-jobsearch-cron.t27
totals false inputs false verdicts false outputs false: IMPROVED_ONLY

Exit 3, IMPROVED_ONLY. The PR head 0986def is 857ae9f with master merged in from master's side; it changes no spec beyond master's.

base a97cb9e head 857ae9f
t27b pass / pass_vacuous (where the reference passes) 1089 / 122 1102 / 109
reference pass 1236 1236
reference disagree (files / tests) 0 / 0 0 / 0
jit_interp_mismatch / crash 0 / 0 0 / 0

13 specs move from pass_vacuous to pass; none regresses.

Generated with Claude Code

…d railway (Closes #8157)

Each card held no test block and passed vacuously (0 runtime asserts) under
both the reference and t27b. The tests hold each card to the schema of
specs/crons/README.md, byte by byte:

- ID is <host>/<repo>/<slug>: HOST (one of the five), then REPO, then one
  path segment;
- ON_FAILURE and CONTROL come from their vocabularies; an empty RUNS carries
  its reason in RUNS_NOTE;
- a SCHEDULE is a five-field cron expression;
- a timer's SERVICE is <file>:<line> and its slug ends in -L<line>;
- a GitHub Actions card's SERVICE is .github/workflows/<slug>.yml;
- a Railway dashboard schedule is "" with a SCHEDULE_NOTE.

railway-jobsearch-cron breaks the first rule (see #7911); its test checks
only the shape of ID.

t27c test-report: 3 or 4 tests per card, 0 vacuous. t27b test --check: all
pass, 37 to 79 runtime asserts. Sealed (seal --save, then --verify).

docs/reports/t27b_expectations.json: `bless` of scripts/tri_loop/t27b.py
over lab run 3fe4e68 with this branch's t27b verdicts for the 13 specs,
composed onto master's ledger with only these rows: pass_vacuous -> pass.

Closes #8157

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A clean merge from master's side; the ledger keeps master's rows and this
branch's 13.

Closes #8157

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions

github-actions Bot commented Oct 9, 2026

Copy link
Copy Markdown
Contributor

PR Dashboard

Generated at: 2026-10-09 12:23:07 UTC

Summary

Status Count
Total Open PRs 50
PRs with Failing Checks 45
PRs with All Checks Green 5
READY 0
FAILING 45
PENDING 0
NO CHECKS YET 0

These columns do not partition: 0 + 45 + 0 + 0 = 45, and there are 50 open PRs. A PR is being counted twice or not at all.

Seal Status

  • ⚠️ STALE -- sha256(compiler.rs)=3c0ade9e73e4 != manifest seal=87e5cbd3ad94.
    The committed NMSE numbers were certified against an older compiler.rs.
    Run scripts/reseal-check.sh locally for the two-step reseal command (advisory; not a merge gate).

@github-actions

github-actions Bot commented Oct 9, 2026

Copy link
Copy Markdown
Contributor

PR Dashboard

Generated at: 2026-10-09 13:02:09 UTC

Summary

Status Count
Total Open PRs 50
PRs with Failing Checks 48
PRs with All Checks Green 2
READY 0
FAILING 48
PENDING 0
NO CHECKS YET 0

These columns do not partition: 0 + 48 + 0 + 0 = 48, and there are 50 open PRs. A PR is being counted twice or not at all.

Seal Status

  • ⚠️ STALE -- sha256(compiler.rs)=3c0ade9e73e4 != manifest seal=87e5cbd3ad94.
    The committed NMSE numbers were certified against an older compiler.rs.
    Run scripts/reseal-check.sh locally for the two-step reseal command (advisory; not a merge gate).

@gHashTag
gHashTag merged commit 66c8097 into master Oct 9, 2026
29 of 35 checks passed
gHashTag added a commit that referenced this pull request Oct 9, 2026
…loses #8220) (#8221)

Each card held no test block and passed vacuously (0 runtime asserts) under
both the reference and t27b. The tests hold each card to the schema of
specs/crons/README.md, chosen by its HOST:

- ID is <host>/<repo>/<slug>; ON_FAILURE and CONTROL come from their
  vocabularies; an empty RUNS carries its reason in RUNS_NOTE;
- a SCHEDULE is a five-field cron expression;
- a GitHub Actions card's SERVICE is .github/workflows/<slug>.yml;
- a launch agent is code-only, its SERVICE is the Label ai.t27.<x>, its ID
  is launchd/<repo>/<x> and INTERVAL_MS is whole seconds;
- a crontab line has SERVICE crontab and runs in Asia/Bangkok, code-only.

With #8158, every cron card of specs/crons now carries a test.

t27c test-report: 3 or 4 tests per card, 0 vacuous. t27b test --check: all
pass, 44 to 99 runtime asserts. Sealed (seal --save, then --verify).

docs/reports/t27b_expectations.json: `bless` of scripts/tri_loop/t27b.py
over lab run 857ae9f with this branch's t27b verdicts for the 13 specs,
composed onto master's ledger with only these rows: pass_vacuous -> pass.

Closes #8220

Co-authored-by: Claude <claude@anthropic.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

t27b coverage: real tests for 13 cron cards in specs/crons (999-multibots-telegraf and railway)

2 participants