Repository navigation
ci(watch): the main red watch; the validator reads the spec; card tokens - #1779
Conversation
Two bounces in one day (#1763 on a 12-4000 result bound, #1766 on an 80-4000 outline bound), each learned from a seven-minute queue. The numbers now live once, in specs/report/work_report.t27: MIN_RESULT 12, MIN_OUTLINE 80, MAX_FIELD 4000, inclusive, with a boundary fn and tests pinning every edge. Enforcement stays in pr-blog-report.yml; the spec is what a local hand check reads. Closes #1774
Three halves of one acceleration ask (owner, 2026-10-27): 1. .github/workflows/main-red-watch.yml (NEW foreign file, owner-approved-foreign quoted in the PR): the thin host for the rules in specs/crons/ trinity-main-red-watch.t27 (Trinity-S-AI-DNA/t27#12766) - daily 05:47 UTC, newest main-failure or stale (>24h) PR-failure opens one issue, clean day logs one line. Born from docs-check sitting red 2026-10-24..26 behind a paths filter. 2. pr-blog-report.yml reads MIN_RESULT/MIN_OUTLINE/MAX_FIELD from specs/report/work_report.t27 with the POST_DIR sed pattern; pr_blog_report.py takes them from WR_* env (the literals are the spec's own values). One home for the numbers that cost two CI bounces on 2026-10-26. 3. Card chrome tokens in :root (index.css); Course.css .course-card* and the blog card block read them, fallbacks keep the look on either sheet alone. Closes #1778
X Brain Health CheckScore: 100.0/100 X Brain is above merge threshold |
Summary by t27-beesChecked by the t27 compilert27c parse, parse-complete and typecheck on each changed .t27 file at
Read by the modelThis PR bundles three independent changes: a new daily "red watch" workflow that surfaces silently-failing CI, the report validator reading its bounds from the spec instead of hardcoding them, and unifying card styling via CSS custom properties. Worth a look
Read: 6 files, +160 -22, the whole diff. Head |
🧪 Brain Stress Test ResultsTests: 261/261 passed, 0 leaked |
ci(watch): the main red watch; the validator reads the spec; card tokens (#1779) Closes #1778. The watch (rules in the t27 card Trinity-S-AI-DNA/t27#12767, merged the same hour), the validator reading the work-report spec through WR_* env, and the card chrome tokens. New foreign file owner-approved-foreign per the owner's 2026-10-27 instruction quoted in the body.
Follow-up to #1779: the first live run met the endpoint's total_count with the wrong iterator; one word fixes it. Foreign edit owner-approved-foreign per the owner's standing 2026-10-27 instruction.
Closes #1778. Refs Trinity-S-AI-DNA/t27#12766/#12767 (the paired cron card, same hour — the registry honesty rule).
1. The main red watch
.github/workflows/main-red-watch.yml(new foreign file, owner-approved-foreign quoted below): the thin host for the rules inspecs/crons/trinity-main-red-watch.t27(Trinity-S-AI-DNA/t27#12767). Daily 05:47 UTC: a workflow whose newest main run concluded failure, or whose newest pull_request run has been failure for over 24h, opens one issue naming it; a clean day logs one line and touches nobody. Born from docs-check sitting red on every docs-touching PR for two days (2026-10-24..26) behind a paths filter.2. The validator reads the spec
pr-blog-report.ymlreadsMIN_RESULT/MIN_OUTLINE/MAX_FIELDfromspecs/report/work_report.t27(#1775) with the same sed pattern the workflow already uses for POST_DIR, and fails loudly if the constants are missing.scripts/pr_blog_report.pytakes them from theWR_*env; the literals it falls back to are the spec's own values, so a run without the env behaves identically. One home for the numbers that cost two CI bounces on 2026-10-26.3. Card chrome tokens
The courses card values now live once as
:roottokens inindex.css(--card-border/-radius/-pad/-gap/-catalog-gap/-title-size/-desc-color/-foot-color);Course.css's.course-card*rules and the blog card block read them, with the tokens' own values as fallbacks so either sheet alone keeps the look.Foreign-code note
main-red-watch.ymlis a NEW foreign file; the other touched files (pr-blog-report.yml, pr_blog_report.py, index.css, Course.css) are existing hand-written foreign files. This PR carriesowner-approved-foreign.Owner approval: given 2026-10-27 in the owner's OpenCode session, in Russian, verbatim: "да все три и сделай сам автономно и в конце три варианта ускорения по правилу парето и писать все на .t27" — the instruction to land all three acceleration items autonomously, with the rules written in .t27 (which they are: the card and the spec).
{ "version": 1, "head_sha": "d92377ef715a2a778a4587927b059cea9199f553", "summary": "Three acceleration items in one pull request: the main red watch workflow (thin host, rules in the t27 cron card), the work-report validator reading its bounds from the t27 spec through the workflow's env, and the mirrored courses/blog card values becoming one set of root tokens.", "changes": [ ".github/workflows/main-red-watch.yml (new): daily 05:47 UTC watch; newest-main-failure and stale-over-24h pull_request failure each open one issue naming the workflow and its run; a clean day prints one line. Rules and birth story live in specs/crons/trinity-main-red-watch.t27 (gHashTag/t27#12767).", ".github/workflows/pr-blog-report.yml: a step reads MIN_RESULT/MIN_OUTLINE/MAX_FIELD from specs/report/work_report.t27 with the POST_DIR sed pattern, fails if any is missing, and exports them as WR_* env before the validate step.", "scripts/pr_blog_report.py: MIN_RESULT/MIN_OUTLINE/MAX_FIELD module constants from the WR_* env with the spec's own literals as fallback; the text() defaults and the result/outline call sites use them.", "apps/website/src/index.css + apps/website/src/pages/Course.css: card chrome tokens in :root; .course-card* and the blog card block read them with literal fallbacks." ], "tests": [ { "command": "python3 -m py_compile scripts/pr_blog_report.py", "result": "the validator compiles with the env-driven constants", "status": "passed", "evidence": "Run on this tree, 2026-10-27, before the commit." }, { "command": "python3 -c \"import yaml; yaml.safe_load(...both workflows...)\"", "result": "both workflow files parse as valid YAML", "status": "passed", "evidence": "Run on this tree, 2026-10-27, before the commit." }, { "command": "the bounds-reading step dry-run against the spec", "result": "the three sed patterns extract 12, 80 and 4000 from specs/report/work_report.t27, the exact values the validator held inline", "status": "passed", "evidence": "The patterns are byte-identical in shape to the POST_DIR precedent that already runs in this workflow on every PR." }, { "command": "lefthook pre-commit on the commit", "result": "explorer bilingual contract, queen bilingual contract (497/497 keys) and english-only all pass", "status": "passed", "evidence": "Hook output on commit d92377ef7, 2026-10-27." } ], "limitations": [ "The red watch's first scheduled run is 05:47 UTC tomorrow; until then the workflow is dispatch-only and unexercised by the schedule.", "The watch walks every workflow with two API calls each (about 80 for this repository); a repository with hundreds of workflows would want pagination hygiene revisited.", "The tokens unify the mirrored values, not the rules that use them; a future card style still edits two files, but now only once per value." ], "tags": [ "Ci", "Crons", "Css" ], "blog": { "title": "The watch, the spec and the tokens: three small laws", "summary": "A gate that sat red for two days behind a paths filter, a validator whose bounds lived only where they bit, and a card style mirrored by hand in three places: three small single-home laws landed in one pull request.", "outline": [ "What two days of docs-check silence measured about gates that live off main, and why the watch reads every workflow's newest run on both main and the pull_request lane.", "How the validator learned its numbers from the spec through the same sed pattern the workflow already used, and why the fallback literals are the spec's own values.", "What a set of root tokens changes for the next restyle of the courses and blog cards, and what it deliberately does not try to unify." ] } }