docs(0110): close the synth split as won't-do — the tail is 29s - #165
Conversation
Reverts 5bbfbc8 (baseline marker) and a74077b (experiment: Node/TS tail removed). Both were pushed only to force two comparable `rust` runs on this branch and were marked do-not-merge in their own bodies. The measurement they produced is recorded in task 0110. ci.yml is now byte-identical to blob 91e84b7, its state at 5c37ad7, so the 0077 Lambda asset guards are provably untouched.
The task assumed the rust job's Node/TS tail cost 2-3 minutes. Measured via an A/B on this branch (runs 30904595104 / 30904701513), it costs 29s of a 5m08s job — off by ~5x. Only ~20s of that is removable; synth's own 9s relocates rather than disappearing, and the replacement job would cost ~50-70s serialized after rust because it needs rust's ~110 MB artifact. PR wall-clock would go 5m08s -> ~5m50s and billed minutes would rise. The split also would not remove the duplicate TypeScript build, which was the other stated motivation. The step actually worth attention is `Build Lambda bootstraps` at 3m24s, 67% of the job. Recorded so this is not re-opened on intuition. Adds lore/3-wiki/project/ci-pipeline.md documenting the pipeline's current shape and cost profile, and a pointer comment at the setup-node step so the tail is not mistaken for cruft. Archives 0110.
Code review —
|
Six review findings, all in the decision record rather than in ci.yml. Two documented verification paths did not work for anyone who followed them. The task claimed ci.yml was "byte-identical" to its pre-0110 state, but the pointer comment moved the blob to f305ff6 — the check now stated is `git diff develop -- .github/workflows/ci.yml` showing only comment lines, which is both true and reproducible. The option-1 implementation was said to be "preserved in a git stash on this branch"; stashes are local to one working copy and the reviewer got nothing. It is now committed as notes/G-option-1-synth-split.md, which is what pushed this task from a file into a directory. `status: done` is not in the schema and failed the validator twice. The archive convention for a won't-do is canceled + reason, now applied. The decision table charged synth's 9s to both the rust job and its replacement, and labelled a seconds-granularity column "billed minutes" when GitHub bills per job rounded up to the whole minute. Corrected in the task and the wiki; the conclusion is unchanged either way. The finding that outlived the task: AC #1 asserted synth runs on every PR that could break it. It does not — the rust job's paths filter omits infra/**, so an infra-only PR carrying a stack-level construct error is never synthesized and fails at deploy instead. That is the 0070 failure mode, still open. Overclaim withdrawn, gap spawned as 0145. Not fixed, deliberately: the validator also rejects `type: PERF` (6 tasks use it) and unquoted history dates (237 unquoted, 0 quoted repo-wide). Both are repo-wide schema drift; fixing them here would leave this file the only one that differs from its siblings.
The pointer comment asserted the synth split makes "billed minutes" worse, which is the exact phrasing PR #165 review finding 6 objected to: GitHub bills each job rounded up to the whole minute at per-runner-class rates, so no seconds-granularity figure is an invoice figure. The task file and the wiki both carry that caveat; ci.yml was the one place left stating it flat. Now says the split saves nothing on billing, with the real arithmetic inline (6 ARM minutes today vs 5 ARM plus 1-2 on the synth runner). The wall-clock claim is unchanged and still the load-bearing one. Comment-only, as before.
|
@karczuRF ready for re-review at
Two things worth your call rather than mine:
The measurement and the won't-do conclusion are unchanged. |
The ID was claimed twice. `0145_BUG_synth-not-run-on-infra-only-prs` landed on develop with PR #165 (the 0110 won't-do closure), while the unmerged PR #168 branch had already claimed 0145 for the pre-roll `argMax(close_usd, ...)` guard. The pre-roll task keeps the number: it is referenced nine times across four files, gates both the 0088 pass-2 pre-roll and 0136's 07-21 gap pre-roll, and develop's own generated index already resolves 0145 to it. This task is referenced three times and moves. 0152 is deliberately left free for the OpenAPI license task on PR #169, which collides with 0144 the same way and is not ours to renumber. Nothing about the synth work itself changed. lore/README.md is not regenerated here — it already points 0145 at the pre-roll task, and regenerating on this branch would conflict with PR #168's index.
Close 0110 as won't-do — the synth tail is 29s, not 2–3 minutes
This PR started as a throwaway A/B measurement and is now the decision record it produced.
ci.ymlships comment-only changes; everything else is lore.Task 0110 assumed the Node/TypeScript tail on the
rustjob cost 2–3 minutes. Measured directly, it costs 29 seconds — and splitting synth into its own job would make CI slower. Closed under the task's own AC #2, which permits exactly that with the number recorded.Method
Two commits pushed 95 seconds apart on this branch, so both runs shared runner class and cache state:
ci.yml(run30904595104, rust job 5m08s)30904701513, rust job 4m17s)Both were reverted in
0aae4f4. Step-level timings, not job totals:Build Lambda bootstrapsalone varied 17s between the two runs on identical content, so the 51s job delta is not the saving.Result
synthjobThe tail is 29s, of which only ~20s actually disappears — synth's own 9s relocates into the new job. That job costs ~50–70s, serialized after
rustbecause it needs its artifact, plus an unmeasuredactions/upload-artifactstep for ~110 MB.The real cost centre is
Build Lambda bootstrapsat 3m24s — 67% of the job. This task optimized the wrong 10%.What ships
ci.yml— a comment block at thesetup-nodestep carrying the number, so the next reader doesn't re-open this.git diff develop -- .github/workflows/ci.ymlshows only#lines; every executable step is untouched and the 0077 guards are intact.canceled/obsolete, converted to a directory.notes/G-option-1-synth-split.md— the complete, never-CI-tested implementation of the split, kept in case the arithmetic ever changes.lore/3-wiki/project/ci-pipeline.md— measured cost profile of therustjob.cdk synthnever runs on infra-only PRs.Review
Findings 1–6 of the review on this PR are applied. The one that outlived the task: 0110 had ticked "synth still runs on every PR that could break it", and it does not — the
rustjob's paths filter omitsinfra/**, so an infra-only PR with a stack-level construct error goes green and fails at deploy. That is the 0070 failure mode, still open. The overclaim is withdrawn here and the gap is now 0145.