Repository navigation
ci(site): the apex publisher returns to an hourly schedule; the fast checks run before push - #1763
Conversation
…checks run before push Two halves of the site freshness loop (issue #1762): 1. publish-apex-on-merge.yml gains schedule 37 * * * *. The publisher is the only door to t27.ai and publishes only when the built bytes changed, so an hourly run is a self-healing retry that costs nothing while the site is fresh; when a verify gate breaks (2026-10-25/26, #1761, a day unpublished), this is the loop that keeps knocking until the fix lands and then ships it without anyone re-firing the door by hand. Its cron card lands in gHashTag/t27 specs/crons (t27#12655) and is vendored here; public/crons/spec-crons.json regenerated (56 cards, the new one witness spec-only until sync-crons runs, the pattern two inngest cards already carry). 2. lefthook pre-push gains the fast lane: the course-ladder contract check and the translations check, the two that bounce copy PRs, run in seconds locally so a wording change enters the Actions queue already clean. Merge-on-green needs nothing: auto-merge.yml already sweeps every ten minutes (work-report dispatch + bee-reviewed merge).
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 restores an hourly schedule to the apex publisher workflow so it self-heals after a broken verify gate (issue #1761), and adds two fast website checks to Worth a look
Read: 9 files, +75 -6, the whole diff up to 60000 characters (the rest was not read). Head |
🧪 Brain Stress Test ResultsTests: 261/261 passed, 0 leaked |
ci(site): the apex publisher returns to an hourly schedule; the fast checks run before push (#1763) Closes #1762. Hourly self-healing apex publish with its cron card in the t27 registry (t27#12656, vendored); the fast website checks in the pre-push lane. Merge-on-green confirmed as already built. Foreign yaml files carry owner-approved-foreign per the owner's 2026-10-26 instruction quoted in the body.
Closes #1762. The site freshness loop: the apex publisher returns to an hourly schedule, the fast checks run before push, and merge-on-green is confirmed as already built.
1. The publisher gets its hourly schedule back
.github/workflows/publish-apex-on-merge.ymlgainsschedule: 37 * * * *beside its push and dispatch triggers. Measured 2026-10-25/26 (issue #1761, closed): the publisher failed its verify gate for a day and nothing retried it - its only triggers were push and a merge-time dispatch, so a healed main sat unpublished until a human asked. The workflow publishes only when the built bytes changed, so an hourly run is a self-healing retry that costs nothing while the site is fresh. Its cron card lands in gHashTag/t27 specs/crons (t27#12655) and is vendored here.2. The fast lane runs before push
lefthook.ymlpre-push gains the two website checks that bounce copy PRs, root-scoped like the pre-commit contracts:node scripts/course-ladder-from-spec.mjs --checknode check_translations.mjsMeasured in #1758: its one bounce (the work-report bounds) plus the queue wait cost ~40 minutes; both of these checks answer in seconds and both pass on this tree.
3. Merge-on-green needs nothing
auto-merge.ymlalready sweeps every ten minutes (work-report dispatch for heads lacking their status; squash-merge only for bee-reviewed heads post-dating their last push, the owner's 2026-10-02 rule). Confirmed in place; no change.Foreign-code note
.github/workflows/publish-apex-on-merge.ymlandlefthook.ymlare existing hand-written YAML - foreign debt under the Only-t27 law. Both need theowner-approved-foreignlabel, which this PR carries.Owner approval: given 2026-10-26 in the owner's OpenCode session, in Russian, verbatim: "да все три и сделай сам автономно и в конце три варианта ускорения по правилу парето" - the owner's approval to land all three acceleration variants autonomously, in the session that measured the delays this PR removes (the day-stale apex, #1761; the 40-minute queued PR; the sleep-polling waits).
{ "version": 1, "head_sha": "cd391709d477ec4d7640f0d1e82ef90d72d4665d", "summary": "The apex publisher regains its hourly schedule with its cron card in the t27 registry and the card vendored here; the lefthook pre-push gains the two fast website checks that bounce copy PRs; merge-on-green is confirmed as already built and unchanged. Together these remove the three measured delays of the release-day session: a day-stale apex behind a broken gate, a 40-minute queued PR that bounced on a check that runs locally in seconds, and the agent's own sleep-polling.", "changes": [ ".github/workflows/publish-apex-on-merge.yml: schedule 37 * * * * added beside push and workflow_dispatch, with the comment naming the incident (trinity#1761) and the card location; the push and dispatch doors are untouched.", "lefthook.yml: pre-push gains course-ladder-contract and translations-contract, root-scoped to apps/website, mirroring the pre-commit contracts' shape.", "apps/website/public/t27/files/specs/crons/trinity-publish-apex-on-merge.t27: the new card vendored from gHashTag/t27#12656 (ID github-actions/trinity/publish-apex-on-merge, SCHEDULE 37 * * * *).", "apps/website/public/crons/spec-crons.json regenerated with agents-from-specs.mjs: 56 cards, the new one witness spec-only until scripts/sync-crons.mjs runs again - the pattern two inngest cards already carry; the skills/tools/functions/providers/agents catalogs regenerated in the same pass (their code links follow the vendored SKILL.md files)." ], "tests": [ { "command": "node scripts/agents-from-specs.mjs", "result": "607/607 typecheck ok across skills, crons, agents, functions, tools; the new card compiles clean and appears in public/crons/spec-crons.json", "status": "passed", "evidence": "Run in the fix session on 2026-10-26 against this tree." }, { "command": "node scripts/course-ladder-from-spec.mjs --check", "result": "up to date; 61 words in 2 languages", "status": "passed", "evidence": "The new pre-push lane's own command, run on this tree." }, { "command": "node check_translations.mjs", "result": "exit 0; every locale bundle holds exactly the English key set with no extra keys, including the new course-ladder strings", "status": "passed", "evidence": "The new pre-push lane's own command, run on this tree." }, { "command": "lefthook pre-commit on the commit itself", "result": "sacred constants pass, explorer and queen bilingual contracts pass, english-only passes", "status": "passed", "evidence": "Hook output on commit cd391709d, 2026-10-26." } ], "limitations": [ "The new cron card reads witness spec-only until scripts/sync-crons.mjs regenerates public/crons/manifest.json from on-disk checkouts; two inngest cards live in that state today and the site marks it health: warn, not fail.", "The hourly run keeps failing loudly if a future verify gate breaks - that is its job; the fix for the gate that broke this week is already merged (ghashtag.github.io#51).", "Merge-on-green still requires the bee-reviewed label for any squash-merge by auto-merge.yml; this PR merges before the bee reaches it, by the owner's explicit autonomy instruction." ], "tags": [ "Site", "Crons", "Ci" ], "blog": { "title": "The site heals itself hourly now", "summary": "A day of unpublished courses behind one broken gate showed where the loop had no loop; the publisher is back on an hourly schedule with its spec card, and the checks that bounce copy PRs run before the queue sees them.", "outline": [ "What a day of silence from t27.ai measured about the pipeline: one gate, three failed runs, and no door that knocks again by itself.", "The hourly schedule and its cron card, the pre-push fast lane, and why merge-on-green needed nothing new.", "The end-to-end proof: a green publisher run, a fresh last-modified on the domain, and a copy PR that enters the queue already clean." ] } }