KeiSeiKit-1.0/skills/ci-scaffold/phase-2-matrix.md
Parfii-bot 0be354a920 KeiSeiKit-public — clean state
Single-commit clean baseline after security scrub of niche-tells,
project codenames, internal jargon, and contributor-email leaks.

Contents:
- 100 Rust crates (_primitives/_rust/)
- 37 agent manifests (_manifests/) + generated specs (_generated/)
- 67 user-invocable skills (skills/)
- 33 hooks (hooks/)
- Composition blocks (_blocks/)
- Documentation (docs/, README.md)
- TS adapter packages (_ts_packages/)
- Assembler (_assembler/)
- Roles (_roles/)
- Templates (_templates/)
- Forgejo CI (.forgejo/)

Author: Denis Parfionovich <info@greendragon.info>

License: see LICENSE.
2026-05-01 12:09:03 +08:00

83 lines
4.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Phase 2 — Build matrix (OS × version × target)
Decide how the build fans out. Matrix minimum: OS × primary-language version. Max reasonable: 3 OS × 3 versions × 3 targets = 27 cells — beyond that CI time-to-green kills iteration speed.
## 2a — Matrix click (AskUserQuestion, multi-select across three axes)
The question encodes three axes in one screen to keep the click contract tight. Each selection is stored as a set; the cartesian product becomes `MATRIX`.
```json
{
"questions": [
{
"question": "Build OS?",
"header": "OS",
"multiSelect": true,
"options": [
{"label": "ubuntu-24.04", "description": "GH-hosted default; also available as self-hosted label on Forgejo"},
{"label": "ubuntu-22.04", "description": "Older glibc; pick if targeting older prod"},
{"label": "macos-14", "description": "Apple Silicon (M1); required for Swift/iOS/macOS builds"},
{"label": "macos-13", "description": "Intel macOS; x86_64 test matrix on Apple software"},
{"label": "windows-2022", "description": "Only when a .exe / MSVC artefact is shipped"},
{"label": "self-hosted (Forgejo runner)", "description": "Labels from ci-forgejo-actions.md: self-hosted,linux,x64,docker"}
]
},
{
"question": "Language / toolchain versions (picks combine with every OS)?",
"header": "Versions",
"multiSelect": true,
"options": [
{"label": "Rust stable + MSRV 1.80", "description": "rust: [stable, 1.80] — MSRV pin catches accidental newer-feature use"},
{"label": "Node 20 LTS + 22 LTS", "description": "node-version: [20, 22] — covers current + upcoming LTS"},
{"label": "Python 3.11 + 3.12 + 3.13", "description": "python-version: ['3.11','3.12','3.13'] — matches supported pip-audit range"},
{"label": "Go 1.22 + 1.23", "description": "go-version: ['1.22','1.23'] — current + previous minor"},
{"label": "Flutter stable", "description": "Single version; pin via flutter-version-file"},
{"label": "Swift 6.0 (Xcode 16)", "description": "xcode-select on macos-14; one version per OS cell"},
{"label": "Single version only", "description": "Matrix collapses on the version axis; OS axis still fans out"}
]
},
{
"question": "Cross-compile targets (Rust / Go only; skip otherwise)?",
"header": "Targets",
"multiSelect": true,
"options": [
{"label": "host (no cross)", "description": "Default; one per OS"},
{"label": "aarch64-unknown-linux-gnu", "description": "ARM64 server deploy; use cross or native ARM runner"},
{"label": "wasm32-unknown-unknown", "description": "Browser / edge Worker target"},
{"label": "x86_64-pc-windows-gnu", "description": "MinGW Windows from Linux build"},
{"label": "aarch64-apple-darwin", "description": "Apple Silicon; native on macos-14, cross on ubuntu"}
]
}
]
}
```
Store the three sets as `MATRIX.os`, `MATRIX.versions`, `MATRIX.targets`. The scaffold uses the cartesian product.
## 2b — Sanity check (no AskUserQuestion)
Compute `N = |os| × |versions| × |targets|`. Print inline:
```
Matrix cells: N (os=<...>) × (versions=<...>) × (targets=<...>)
Estimated runtime: ~<N × typical-cell-minutes> minutes wall-clock (parallel)
```
If `N > 12`, warn once: "Matrix is wide. Consider dropping one axis or using `strategy.fail-fast: true` for PR-time feedback. Continue?"
If `MATRIX.os` includes both `macos-*` and `MATRIX.targets` includes only `host`, collapse the targets axis silently — host-on-mac is the only useful combination.
## 2c — Fail-fast click inferred (inline, no extra AskUserQuestion)
- PR matrix: `fail-fast: false` (user wants to see ALL failing cells at once).
- Scheduled cron + release matrix: `fail-fast: true` (first failure is enough to trigger remediation).
Emitted in Phase 3 `ci.yml` / `release.yml` accordingly.
## Verify-criterion
- `MATRIX.os` has ≥1 entry.
- `MATRIX.versions` has ≥1 entry (or "Single version only").
- `MATRIX.targets` has ≥1 entry (defaults to `host`).
- `N ≤ 27` or explicit user override recorded in the final report.
- If `LANGS = {Swift}` then `MATRIX.os` MUST include a `macos-*` entry (fail-closed otherwise).