You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
docs(spec): final review — the amendments contradicted the original text in seven places
Read start to finish. Every finding is a place where a dated amendment (§3.4
merge-queue parallelism, §3.5 SSH, §6.1 continuous triage, #3205 mini, the
one-subagent rule) was landed beside original text that still said the
opposite, so a reader could cite either.
- §1 measured the fleet with `gh api …/actions/runners` — the call the
operator rejected, a `busy` snapshot that cannot see ephemeral runners, and
the hourly average that read 9.5 % while 15/16 workers were busy. Now the
fleet-pack ledger record, instantaneous busy/online, both traps named.
- §1 said "one PR in CI at a time means gate latency IS throughput"; §3.4
was amended to 3-parallel on 2026-09-12. Bound is now 3 × 72 h / p95.
- `mini` is a declared full-time build host (#3205) and appeared only in a
§8 bullet. Added to §0 row 0, §1, §5 P0·Pack fields and Done, §7 pack:, §8.
- §0 row 3 still scheduled triage once per train; §6.1 made it per-wakeup.
- §2 named the required check `ci / gate`; the rules API says `gate` and
`workspace-test`, and `present` is not required.
- §3.4 allowed "≤ 3 read-only subagents" against the one-at-a-time rule and
§10's fan-out-through-agy.
- §8's last bullet stopped on "a second concurrent aprender PR in CI" and on
"SSH into a host" — both allowed by the amended §3.4/§3.5. Now stops on a
host CONFIG change over SSH instead of forjar.
- §9 asked for the 0.67 cascade wall to be measured; it was: 70 min,
attended 0. That is 3.5× the [A] line, so by §9's own rule the cascade is
the next kaizen target; where the minutes go is [U].
- §7 train: line said T-0..T-4; T-5 exists. §6's tail paragraph gets a §6.4
heading. §11.3 cited the one-PR rule §3.4 no longer has; fixed.
- `make build-report` does not exist on main (P0·Instrument not done) — said
so where p95 is marked [U].
Pmat-Ticket: PMAT-1098
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
|**0**|`yoga`or `gx10` is under-utilised (§1 packing rule) while intel has queue pressure |**P0, minutes not a session:** arm every green PR, route what can leave intel, reap disk (§5 P0·Pack, P0·Reap); record the `pack:`line; then continue to the first matching row below |
19
+
|**0**|`yoga`, `gx10`or `mini` is under-utilised (§1 packing rule) while intel has queue pressure — and, every wakeup regardless, anything arrived since the last sample is untriaged (§6.1) |**P0, minutes not a session:** arm every green PR, route what can leave intel, reap disk (§5 P0·Pack, P0·Reap); triage what arrived (§6.1); record the `pack:`and `triage:` lines; then continue to the first matching row below |
20
20
| 1 | ≥ 48 h since the last tag on `main`**and** no SKIPPED record for the current HEAD | run the train (§4) |
21
21
| 2 | else a §5 row whose *Done* test fails at HEAD | do the first such row, one PR |
22
-
| 3 | else the last train (shipped or skipped) has no triage record | do the triage pass (§6)|
22
+
| 3 | else the last train (shipped or skipped) has no once-per-train triage record | do the once-per-train pass: §6.3 capacity check and the T-5 reconcile receipt|
23
23
| 4 | else | emit the §7 report, exit 0 |
24
24
25
25
Nothing in this spec asks a question. Running it ten times a day is safe.
@@ -28,22 +28,28 @@ Nothing in this spec asks a question. Running it ten times a day is safe.
28
28
29
29
Ship a tag every 48–72 h (`0.67 → 0.68 → …`) **on a clock, not on scope**, and keep
30
30
shrinking the wall-clock from *PR opened* to *tag published* so the clock stays cheap.
31
-
The objective is elapsed time and green trains. **Packing rule (operator, 2026-09-12, verbatim):** "these two boxes: yoga and gx10 should be always 80% full of PRs from aprender if ANY queue pressure on intel … not acceptable to have slow releases when boxes are idel". Utilisation is not the goal for its own sake; an idle GPU box next to an intel queue is lost release time and is a **P0 defect**, not a state to tolerate. Measure it every wakeup:
31
+
The objective is elapsed time and green trains. **Packing rule (operator, 2026-09-12, verbatim):** "these two boxes: yoga and gx10 should be always 80% full of PRs from aprender if ANY queue pressure on intel … not acceptable to have slow releases when boxes are idel". Utilisation is not the goal for its own sake; an idle GPU box next to an intel queue is lost release time and is a **P0 defect**, not a state to tolerate. `mini` (Apple M4) was declared a full-time aprender build host on 2026-09-13 (#3205) and is under the same rule; its ceiling is the macOS-capable job classes, not capacity. Measure it every wakeup, **from the ledger, never from a runner-list snapshot**:
32
32
33
33
```
34
-
gh api --paginate orgs/paiml/actions/runners --jq '.runners[] | "\(.name) \(.status) \(.busy)"' # busy/online per host prefix
35
-
intel pressure = any aprender job queued, or a workspace-test running, on intel
36
-
under-utilised = intel pressure AND (busy/online < 0.8 on yogaOR on gx10)
34
+
record = docs/build-ledger/<date>/<sha>-<host>-fleet-pack-*.json # written by §5 P0·Pack
35
+
intel pressure = aprender_runs_queued > 0, or a workspace-test running, on intel
36
+
under-utilised = intel pressure AND (busy/online < 0.8 on yoga, on gx10, OR on mini)
37
37
```
38
38
39
+
Two measurement traps, both already paid for: a `busy` snapshot from the runners API cannot see
40
+
ephemeral runners, and an hourly **average** hides saturation — `occ_1h` read 9.5 % on 2026-09-14
41
+
while 15 of 16 intel workers were busy at load 162. The `pack:` line carries the instantaneous
42
+
`busy/online` at sample time; an average is a trend, not a verdict.
43
+
39
44
Coupling, one line:
40
45
41
46
```
42
-
max PRs per train ≈ 72 h / p95 `ci / gate` wall-clock (upper bound)
47
+
max PRs per train ≈ 3 × 72 h / p95 `ci / gate` wall-clock (upper bound; 3 = merge-queue parallelism, §3.4)
43
48
```
44
49
45
-
One PR in CI at a time means gate latency *is* release throughput. Compute this on every
46
-
train. p95 is `[U]` until §5 P0 lands.
50
+
The merge queue builds 3 entries in parallel (§3.4); gate latency still bounds release throughput.
51
+
Compute this on every train. p95 is `[U]` until §5 P0 lands — `make build-report` does not exist on
52
+
`main` as of 2026-09-14.
47
53
48
54
## §2 Ground truth — verify at HEAD before writing anything
49
55
@@ -52,7 +58,7 @@ train. p95 is `[U]` until §5 P0 lands.
|`main` protected; required checks are exactly `gate` and `workspace-test` — `present` is NOT required, it is the review-receipt backlog |`gh api repos/paiml/aprender/rules/branches/main`|`[V]` 2026-09-14|
56
62
| Last tag = `git describe --tags --abbrev=0` on `main`; next minor = that + 1 | git |`[V]` live |
|`workspace-test` is pinned `runs-on: [self-hosted, X64, Linux, clean-room]` (#3104) — the long pole never lands on gx10; #3139 lifts the pin (795 s on gx10-pool3, 34693750990) |`.github/workflows/ci.yml`|`[V]` 2026-09-12 |
@@ -74,7 +80,8 @@ Live `forjar.yaml` beats this table. Record the diff in the receipt and continue
74
80
(roadmap-additive guard, a red required check) and fix or trim it rather than park it. Under
75
81
intel pressure, arm every green PR and prefer the ones whose jobs can land on `yoga`/`gx10`.
76
82
Splitting *one* gate across hosts (§5 P2) is the other half of the same rule. "Parallel"
77
-
inside a session still means ≤ 3 read-only subagents, never two sessions merging.
83
+
inside a session means ONE Claude subagent at a time and fan-out through agy (§10) — never two
84
+
sessions merging.
78
85
*(Amended 2026-09-12 by operator ruling; the previous text said "one aprender PR in CI at a
79
86
time" and this session dequeued four PRs on it — #3175's group was running its workspace-test
80
87
on yoga at the time.)*
@@ -168,9 +175,10 @@ busy/online per host (§1), decide `intel pressure`, and act in minutes — arm
168
175
withdrawn CI, trim non-additive roadmap diffs, route arch-neutral work off intel, dispatch the
169
176
nightlies that produce T-1 evidence on the idle GPU boxes. Record the sample as a ledger record
0 commit comments