Skip to content

ci: run the full ci workflow nightly on main (PMAT-2166) - #2167

Merged
noahgift merged 3 commits into
mainfrom
ci/nightly-schedule
Oct 15, 2026
Merged

noahgift merged 3 commits into
mainfrom
ci/nightly-schedule

Conversation

@noahgift

Copy link
Copy Markdown
Contributor

Closes #2166.

xpile had no scheduled workflow. ci, book and release run only on push, pull request or tag, so an idle main never saw drift in the stable toolchain, crates.io installs or the advisory DB. For comparison, depyler's nightly went red on every target when provable-contracts-cli 0.4.0 dropped its binary.

Change: add schedule (daily at 06:23 UTC) and workflow_dispatch to .github/workflows/ci.yml. Every job runs unchanged against main. No job reads github.event_name, base_ref or head_ref, so the scheduled run is the same gate a push runs. Also registers PMAT-2166 in docs/roadmaps/roadmap.yaml.

Verified locally: the 8 tests that read ci.yml or git history pass (witness_floor, dependency_license_policy, ci_tool_install, derived_corpus_vacuity_witness, release_runbook_facts_witness, ruleset_drift, roadmap_registration, changelog_freshness), as do pv lint contracts/, cargo deny check advisories and the pre-commit clippy.

Note: pmat work add put the roadmap entry in the middle of PMAT-1414's multi-line description scalar, which corrupted the YAML. The entry here was appended by hand and parses.

🤖 Generated with Claude Code

xpile had no scheduled workflow: ci, book and release fire only on
push/PR/tag, so an idle main never noticed drift in the stable
toolchain, crates.io installs (cf. depyler's nightly, broken when
provable-contracts-cli 0.4.0 dropped its binary) or the advisory DB.
Add a daily schedule (06:23 UTC) and workflow_dispatch to ci.yml; every
job runs unchanged against main. No job reads the event type, so the
scheduled run is the same gate a push runs.

Refs #2166

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

Copy link
Copy Markdown
Contributor Author

quorum-review (AD-04): three PASS — agreed (auto_merge: checked=true was_armed=false disarmed=false)

{
 "ticket": "PMAT-2166",
 "head": "6d81cd44441536ce803d9d27bf2532aa90c8bb34",
 "width": 3,
 "executor": "agy",
 "agreed": true,
 "auto_merge": {
  "checked": true,
  "was_armed": false,
  "disarmed": false,
  "note": "auto-merge not armed"
 },
 "lanes": [
  {
   "lane": 1,
   "verdict": "PASS",
   "findings": 0
  },
  {
   "lane": 2,
   "verdict": "PASS",
   "findings": 0
  },
  {
   "lane": 3,
   "verdict": "PASS",
   "findings": 0
  }
 ]
}

Refs #2166

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
noahgift added a commit that referenced this pull request Oct 10, 2026
…epic split, with its quorum receipt (Refs #2124) (#2168)

Nothing has been tagged since v0.1.618 (2026-07-30). The rows of both epic
#2124 and epic #2125 landed on main from 2026-09-23 to 2026-09-25. v0.1.619
is the next tag. Its CORE rows: reconcile the ledger, land the nightly
schedule (#2167), move the seven non-blocking PR jobs to the night run,
repo hygiene (waiting on the owner), release mechanics, and the
pre-publish gates on a clean-room binary. v0.1.620's LOOK-AHEAD rows
re-verify #2125 on the release, add a nightly binary (#2149), add
`xpile update` (#2153), and request promotions.

Planted quorum: 4 rounds, 3 lanes (claude-sonnet-5-5 x2, claude-haiku-4-5;
degraded: same-family). Every round refused its plant (3,3,3,2 of 3).
next_tag PASS 3/3 in every round. The receipt is in docs/audits/.

Co-authored-by: Noah Gift <claude@noahgift.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Brings the branch up to main (incl. #2173). One conflict, docs/roadmaps/roadmap.yaml: both sides appended a row at EOF; resolved as main (PMAT-2172) followed by this PR's PMAT-2166 row.

Refs PMAT-2166
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

@noahgift noahgift left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

APPROVE — seat 1, aprender-a7, head 9253510

Read the full diff at this head; every check is green on it.

  • .github/workflows/ci.yml: adds schedule: '23 6 * * *' and workflow_dispatch only. No job in the file has an if: on event or ref, and none deploys or uses secrets, so a scheduled run is the same job set a push to main runs. It does not change what a PR or the merge accepts.
  • docs/audits/quorum-PMAT-2166.json follows the existing docs/audits/quorum-*.json pattern on main. docs/roadmaps/roadmap.yaml adds the PMAT-2166 row.

Non-blocking: when a nightly run goes red on an unchanged main, someone has to own it the same day, or the red sits there until the next PR finds it. Worth naming the owner in PMAT-2166.

@noahgift noahgift left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

seat 2, aprender-clerk @92535106a6 — APPROVE.

I authored none of these commits (6d81cd4, f674c48, merge 9253510; all by infra-38-worker).

  • ci.yml adds only triggers: schedule cron '23 6 * * *' and workflow_dispatch, next to pull_request and push. No job reads github.event.pull_request, base_ref/head_ref or event_name, so every job runs unchanged on the nightly trigger. No job gains an if: or continue-on-error, so there is no third state on the PR path.
  • docs/audits/quorum-PMAT-2166.json follows the existing in-tree receipt convention (docs/audits/quorum-PMAT-21xx.json). The roadmap adds rows only.
  • The two-dot diff against main covers exactly these 3 files after the merge.
    Required checks gate and workspace-test are green @92535106a6.

@noahgift
noahgift merged commit b82b1c9 into main Oct 15, 2026
11 checks passed
@noahgift
noahgift deleted the ci/nightly-schedule branch October 15, 2026 02:51
noahgift added a commit that referenced this pull request Oct 15, 2026
…edule and workflow_dispatch (Refs #2170) (#2171)

* test(ci): XPILE-NIGHT-CHECKS-001 falsifier — a check that cannot block a merge does not run on the PR path (RED on this tree) (Refs #2170)

Asserts from ci.yml alone: every job in the advisory marker carries the
job-level night if:, required jobs carry none and need no night job, and
no continue-on-error sits in a job without the night if:. RED here: all
seven advisory jobs lack the if:, and license-scan's report step is a
continue-on-error on the PR path.

PMAT-Ticket: PMAT-2170
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* ci: two-state CI — the seven non-blocking ci.yml jobs run only on schedule and workflow_dispatch (Refs #2170)

kani, lake-build, docs, wasi, lean-models, shader-validate and
license-scan cannot block a merge (the required set is gate and
workspace-test), so each gets the job-level
  if: github.event_name == 'schedule' || github.event_name == 'workflow_dispatch'
gate and workspace-test are unchanged. A comment by the enforcement
markers records the rule; docs/RELEASE.md §5 step 2 now dispatches ci on
the pinned SHA before reading the advisory statuses. Depends on #2167,
which adds the schedule and workflow_dispatch triggers.

XPILE-NIGHT-CHECKS-001 is GREEN; restoring the old ci.yml turns it RED
(seven jobs lack the if:, and license-scan's continue-on-error step is
back on the PR path).

PMAT-Ticket: PMAT-2170
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* test(ci): a night job needs a night — assert ci.yml triggers on schedule and workflow_dispatch (Refs #2170)

Quorum round 1 (2 of 3 lanes FAIL) found that the seven night jobs never
run on a tree without those triggers, and the falsifier did not see it.
Assertion 5 is RED until #2167 lands the triggers, so this branch cannot
merge before it.

PMAT-Ticket: PMAT-2170
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* ci: move the TWO-STATE note below the PMAT-1501 block it was splitting; name the trigger dependency (Refs #2170)

Quorum round 2 (gemini-4-argon-high) found the note sat between the
markers and the block that counts lines back to them ("eleven lines
above"). It now follows that block, and says that XPILE-NIGHT-CHECKS-001
also requires the schedule and workflow_dispatch triggers (PMAT-2166).

PMAT-Ticket: PMAT-2170
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* docs(audit): quorum-PMAT-2170 — 3/3 PASS on the stack over #2167, planted control 3/3 FAIL (Refs #2170)

The diff cannot be judged on a tree without #2167's triggers (rounds 1
and 2 failed on exactly that), so round 3 judged these commits cherry-
picked onto ci/nightly-schedule (head 7ca2607d): gemini-4-argon-high,
claude-sonnet-5-5-high and claude-haiku-4-5, 3/3 PASS. Planted control
(workspace-test given the night if:, assertion 2 weakened to spare it):
3/3 FAIL, each naming ci.yml:160-161. This receipt binds the stacked
head, not this branch: after #2167 merges, rebase onto main and run a
fresh round before any arming.

PMAT-Ticket: PMAT-2170
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
noahgift added a commit that referenced this pull request Oct 15, 2026
…eads the nightly first (PMAT-2174, PMAT-2175) (#2176)

* ci: a red night check opens or updates its one issue — the step ci.yml described did not exist (Refs #2174)

ci.yml's TWO-STATE CI comment said a red night job "opens or updates one
issue with one owner", and no step did. Each of the seven night jobs now
ends with the local composite action .github/actions/night-issue under
  if: failure() && github.event_name == 'schedule'
It finds the open issue titled exactly `night: <job id> red on main`,
comments the run on it, or creates it assigned to the action's one owner.
It runs only after its job has already failed, so it cannot change a job's
result; the script refuses every event but `schedule` before calling gh,
so pull_request, merge_group, push and workflow_dispatch file nothing. A
failed lookup fails the step and creates nothing (no duplicate on an API
error). The night jobs get `permissions: contents: read, issues: write`.

XPILE-NIGHT-CHECKS-001 gains assertions 6-7: the issue step is the LAST
step of every night job with exactly that if:, its own job id as check:,
issues: write; no other job calls it; one owner; and the script is
EXECUTED against a stub gh (refusal on five non-schedule events, comment
on an exact title, create on a near-miss, fail on a failed lookup).
RED arms, measured: on the pre-change ci.yml 6 of 10 tests fail; the
planted control (issue step if: also true on pull_request) fails
every_night_job_ends_by_filing_its_one_issue; letting the script accept
pull_request fails the_issue_script_refuses_every_event_but_schedule.

PMAT-Ticket: PMAT-2174
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* docs: RELEASE.md §5 step 2 reads the latest scheduled nightly on the pinned SHA and dispatches only if there is none (Refs #2175)

Since #2167 ci.yml runs on main every night, so on a frozen Friday the
pinned SHA normally already has a scheduled run. Step 2 used to dispatch
ci and wait unconditionally. It now reads
  gh run list --workflow ci.yml --event schedule --commit <PINNED_SHA>
first, waits for that run if it is still in progress, and dispatches only
when no night has run on the pinned SHA; the check-runs read is unchanged.

release_runbook_facts_witness gains
release_step_2_reads_the_scheduled_run_before_it_dispatches: inside §5
step 2 the scheduled read on <PINNED_SHA> precedes the fallback dispatch,
the dispatch is conditional, and ci.yml still has a schedule: trigger.
RED on the previous RELEASE.md.

PMAT-Ticket: PMAT-2175
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Noah Gift <noah@paiml.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.

ci: run the full ci workflow nightly on main

1 participant