Commit Graph

35 Commits

Author SHA1 Message Date
Chinesezjc
65f679b33a ci: split failover switch into per-platform Linux and Windows variables
Replace the single DSH_CI_FAILOVER variable with two independent
switches so an outage on one platform no longer retargets the other:

- DSH_CI_FAILOVER_LINUX: the three required Linux workers (node-24,
  node-24-coverage, node-24-consumers) and the all-checks-passed verdict,
  which resolves its pool to vm-backup and keeps its concurrency and
  cache-restore branches.
- DSH_CI_FAILOVER_WINDOWS: the non-blocking windows-native job, which
  resolves to the dsh-win-ci pool.

all-checks-passed rides the Linux switch because it aggregates the
required Linux workers and runs on the vm-backup pool. The Dependabot
exclusion is preserved on both switches. The failover runbook (EN/ZH)
and its translation pairing, plus the docs that referenced the old
variable, are updated in the same change.
2026-08-13 16:54:57 +08:00
Tianyi Cui
03fafca0e0 fix(windows): close native coverage review gaps 2026-08-09 13:59:49 +08:00
Tianyi Cui
6d09c315b9 cleanup: remove private repository references 2026-08-08 01:10:57 +08:00
Tianyi Cui
6d6c146f81 ci: allocate consumer runner independently 2026-07-30 19:02:10 +08:00
Turtle
95a995968b refactor: migrate linting to Oxlint 2026-07-29 14:32:11 +08:00
Chinesezjc
24d7211f09 docs(ci): stop claiming no PR-editable path reaches the standby pool
The standby lane itself is push-only, but under failover pull_request
jobs do reach these runners with the PR merge ref's workflow. The
workflow comment and the larger-runner note (both languages) now state
that plainly and name the actual boundary — repository membership
(private, forking disabled, Dependabot excluded) — matching the
runbook. Static gate green locally: 32 passed, 0 failed.
2026-07-27 16:02:56 +08:00
Chinesezjc
e2eca69e9c docs(ci): writer-level trust boundary stated everywhere; serial note counts four references
- Sweep every remaining 'admin-only' claim (workflow comments, runbook
  lines 13/40, topology note, all zh pairs): the variable is
  writer-manageable, and the boundary against untrusted code is
  repository membership (private, forking disabled, Dependabot
  excluded) — stated identically at every site instead of only in the
  'who can flip' paragraph.
- Serial cross-platform reference note (both languages): master now
  runs four references — the three hosted OS legs plus the self-hosted
  standby drill, linked to the failover runbook.
Static gate green locally: 32 passed, 0 failed.
2026-07-27 15:54:59 +08:00
Chinesezjc
5fa74343aa docs(ci): six always-on instances, no pre-registered spares
The spare tier is retired. Steady-state pool load is one serial standby
job per master push, so six always-on instances already are the
failover capacity; pre-registered offline runners are a silently
expiring guarantee (GitHub garbage-collects them after 30 days
offline). Incident-time extra capacity is a one-minute org-token
registration, now documented in the runbook.
2026-07-27 12:54:35 +08:00
Chinesezjc
68e280ce4f docs(ci): make the failover runbook a conforming dated Agent Note
The failover runbook landed as .agents/notes/implemented/process/ci-failover-runbook.md,
which fails three doc-sync gates: the classification/format gates require a
yyyy-mm-dd-topic.md filename and the implemented Agent Note skeleton
(Problem/Decision/Alternatives/Consequences), and the bilingual pairing gate
requires cross-note link targets to match between the two language sides.

Rename to 2026-07-26-ci-failover-runbook.md/.zh.md, reshape both sides into the
implemented skeleton (the runbook steps live in bespoke sections under Decision),
point the sibling topology note and the ci.yml comment at the dated filename, and
make both sides link the canonical .md per the bilingual convention. Re-recorded
the i18n pairing records.
2026-07-26 05:22:28 +08:00
Chinesezjc
1a60140729 Merge remote-tracking branch 'origin/master' into ci/offload-coverage-to-vm-backup
# Conflicts:
#	.agents/notes/implemented/process/2026-07-22-evidence-based-larger-hosted-runners.i18n.yaml
2026-07-26 03:53:19 +08:00
Chinesezjc
0fd6dc8924 ci: pre-wire admin-only failover from hosted pools to the in-house pool
The three required Linux jobs now resolve their pool through the
DSH_CI_FAILOVER repository variable. Unset, everything runs exactly as
today on the hosted enterprise pools. Setting it to 'selfhosted'
(repo-admin-only, not PR-editable, no merge required — a merge would be
deadlocked behind the failing checks themselves) retargets all three
onto the vm-backup pool, halves the coverage worker bound and snapshot
concurrency for the shared VM, and skips the hosted-path cache restores.

Adds a bilingual failover runbook (switch, capacity via the four
registered spare instances, switch-back, trust boundary) and links it
from the topology note. The push-triggered standby lane remains the
continuous proof that the failover target works.
2026-07-26 00:34:53 +08:00
Chinesezjc
310a387b14 ci: pivot — keep coverage hosted, add self-hosted serial standby lane
Direction change after review discussion. Moving a REQUIRED check onto
a single in-house VM traded merge-path availability for modest savings
and accumulated trust/contention caveats (six review rounds' worth).
Revert every coverage-lane change: coverage stays on the enterprise
Ubuntu 24.04 32-core pool exactly as on master.

Instead, add serial-linux-selfhosted: on every master push the in-house
pool (vm-backup) runs the complete unsharded primary aggregate as a
hot-standby drill. It blocks nothing, yet continuously proves the
environment end to end, so any hosted-pool outage can be answered with
a one-line runs-on retarget onto continuously verified capacity.

Push-triggered lanes execute the base branch's own workflow definition,
so no PR-editable path selects these runners — the entire fork-trust
discussion is structurally moot for this lane. Topology notes (en/zh +
pairing records) describe the standby lane and the switch play.
2026-07-26 00:08:26 +08:00
Turtle
3feb05fef8 docs(agent-notes): consolidate superseded decisions 2026-07-25 16:43:07 +08:00
Chinesezjc
f09539581d docs(ci): record disabled forking as an explicit precondition of the self-hosted lane
The pool selector is defense-in-depth only — pull_request executes the
PR's own workflow definition, so YAML cannot enforce runner trust. Make
the actual enforcement boundary explicit in the decision record:
org-side disabled forking (the public release is an isolated read-only
mirror under a separate org), with migration to a repo-restricted
org-level runner group with base-branch workflow pinning as a hard
gate before forking could ever be enabled.
2026-07-25 00:54:35 +08:00
Chinesezjc
8d53d44b60 docs(ci): reconcile every present-tense topology description with the coverage lane move
Sweep all remaining sources that still described coverage as an
enterprise 32-core job: the ci.yml jobs preamble, the three-job
paragraph of the larger-hosted-runners note, and the required-pool
sentence of the portable-recovery note — English and Chinese sides of
both notes, with their i18n pairing records re-recorded.
2026-07-24 23:49:58 +08:00
Chinesezjc
5818fd6224 ci: address second review round — dependabot lane, drop dead restore, update topology note
- Route untrusted PRs (forks + Dependabot, same author test as e2e.yml)
  back to the hosted enterprise pool via a runs-on expression: Dependabot
  PRs are same-repo, so the previous head.repo guard admitted
  dependency-supplied code onto the persistent self-hosted VM. A single
  job with pool selection keeps all-checks-passed free of skips.
- Drop the pnpm-store cache restore from this lane: on self-hosted the
  hosted-path cache actually HIT (Linux key) and spent ~52 s pulling
  181 MB into a path pnpm never reads; the persistent local store
  already serves warm installs in seconds.
- Update the larger-hosted-runners Agent Note (en/zh + i18n pairing
  record) so the decision record describes the shipped topology:
  coverage on the in-house vm-backup pool for trusted PRs, hosted
  Ubuntu 24.04 32-core retained for untrusted PRs.
2026-07-24 23:00:56 +08:00
Tianyi Cui
2dc3bf6005 ci: reuse the primary Linux build 2026-07-23 18:02:17 +08:00
Tianyi Cui
0c678766a4 ci: isolate enterprise Linux critical paths 2026-07-23 17:49:16 +08:00
Tianyi Cui
f111359239 fix(ci): isolate lint from NodeNext temp consumers 2026-07-23 16:57:59 +08:00
Tianyi Cui
91dfaee36c docs(ci): update enterprise runner decisions 2026-07-23 16:49:49 +08:00
Tianyi Cui
fc1b308266 ci: keep required PR checks on portable runners 2026-07-23 14:31:01 +08:00
Tianyi Cui
3c397e594f ci: remove critical setup variance 2026-07-22 20:29:33 +08:00
Tianyi Cui
dcf9eee3c5 ci: bound Linux gate contention 2026-07-22 20:19:56 +08:00
Tianyi Cui
9b8320cb94 ci: remove the final Linux lint tail 2026-07-22 20:06:50 +08:00
Tianyi Cui
a952aaed72 ci: trim remaining hosted setup 2026-07-22 20:00:15 +08:00
Tianyi Cui
17983d72bb ci: use process-safe coverage pools 2026-07-22 19:37:45 +08:00
Tianyi Cui
02f6d919c8 ci: remove primary setup overhead 2026-07-22 19:13:07 +08:00
Tianyi Cui
cbbef79fa3 ci: retune consolidated jobs for stacked workload 2026-07-22 19:00:55 +08:00
Tianyi Cui
41609c4ce4 ci: consolidate primary checks on one larger runner 2026-07-22 17:53:01 +08:00
Tianyi Cui
11236c46fb docs: record final larger-runner evidence 2026-07-22 16:55:39 +08:00
Tianyi Cui
5e4776500d docs: record stable coverage concurrency 2026-07-22 16:33:47 +08:00
Tianyi Cui
2bd466a4a6 docs: record all-pool validation 2026-07-22 16:21:17 +08:00
Tianyi Cui
d7945da13e docs: record reduced-fanout validation 2026-07-22 15:57:39 +08:00
Tianyi Cui
cc22492ddd docs: record consolidated runner decision 2026-07-22 15:30:02 +08:00
Tianyi Cui
da1bee87c7 ci: use four-core hosted runners 2026-07-22 14:13:49 +08:00