Skip to content

docs(research): CI change detection works; fourteen cache-write paths are disabled (#328) - #427

Merged
serina-mcfall merged 2 commits into
launchpadfrom
research/328-ci-jobs-on-launchpad
Aug 24, 2026
Merged

docs(research): CI change detection works; fourteen cache-write paths are disabled (#328)#427
serina-mcfall merged 2 commits into
launchpadfrom
research/328-ci-jobs-on-launchpad

Conversation

@tucktuck101

Copy link
Copy Markdown
Collaborator

Summary

Answers #328 by reading ci.yml's gates and comparing them against real runs. Change detection works — a docs-only pull request runs 2 jobs in under a minute — but no push event has ever run this workflow on the fork, which makes all six cache-save steps and all eight rust-cache save-if conditions dead code. The fork builds cold on every pull request and cannot stop.

Related issue

Closes #328

Issue type

Task


Agent provenance

Field Value
Harness / provider Claude Code
Model claude-opus-5[1m]
Session reference N/A - the harness exposes no shareable run id
Initiating human @tucktuck101

Objective

Add launchpad/Research/328-ci-jobs-on-launchpad.md recording which ci.yml jobs execute on a pull request targeting launchpad, and what never executes at all.

Impacted components

launchpad/Research/328-ci-jobs-on-launchpad.md

Approach and rejected alternatives

Read the gates out of ci.yml mechanically and then corroborated against real run data, rather than reasoning from the YAML alone. That corroboration is what surfaced the interesting part: a pull request whose GitHub "Files changed" shows one markdown file ran the full Rust and desktop pipeline, and only the changes job log explains why.

Rejected sampling many runs for duration statistics — most recent runs are docs-only and finish in under a minute, so the sample of code-touching runs is inherently thin. Two are reported as two, not extrapolated.

Verification

Command run:

gh run list --repo launchpad-26/buzz --workflow ci.yml --event push --limit 10
gh run list --repo launchpad-26/buzz --workflow ci.yml --limit 100 --json event \
  --jq '[.[].event]|group_by(.)|map({event:.[0],count:length})'
gh run view 32473521557 --repo launchpad-26/buzz --json headBranch,createdAt,updatedAt,jobs
gh pr view 268 --repo launchpad-26/buzz --json files
gh run view --repo launchpad-26/buzz --job 96745081576 --log
grep -n "save-if" .github/workflows/ci.yml

Raw output:

$ gh run list --workflow ci.yml --event push --limit 10
(no output)

$ gh run list --workflow ci.yml --limit 100 --json event --jq '...'
[{"count":100,"event":"pull_request"}]

$ gh pr view 268 --json files
101+ 0- launchpad/decisions/ADR-0018-cohort-relay-vps-specification.md

# ... yet the changes job for that PR's run reported:
GitHub token is not available - changes will be detected using git diff
Change detection f36d10f9c..e619f8fd8
M Cargo.lock
A launchpad/agents/project-pack.py
A launchpad/agents/test_project_pack.py
A launchpad/decisions/ADR-0018-cohort-relay-vps-specification.md
Detected 4 changed files
Filter rust = true
  Matching files:
  Cargo.lock [modified]
Filter desktop = false
Filter desktop-rust = false
Filter web = false
Filter mobile = false
Changes output set to ["rust"]

$ grep -n "save-if" .github/workflows/ci.yml
112:          save-if: ${{ github.event_name != 'pull_request' }}
134:          save-if: ${{ github.event_name != 'pull_request' }}
159:          save-if: ${{ github.event_name != 'pull_request' }}
355:          save-if: ${{ github.event_name != 'pull_request' }}
774:          save-if: ${{ github.event_name != 'pull_request' }}
966:          save-if: ${{ github.event_name != 'pull_request' }}
1010:          save-if: ${{ github.event_name != 'pull_request' }}
1084:          save-if: ${{ github.event_name != 'pull_request' }}

# docs-only run 32524537497
branch: research/319-desktop-distribution-path
elapsed: 0 min
ran: Dead Token Reference Guard, Detect Changed Paths
skipped: 16 jobs

# code-touching run 32473521557
started: 2026-08-21T10:38:03Z  ended: 2026-08-21T11:10:38Z   (32m 35s)
21 of 23 job instances ran; only Web and Mobile skipped
  • Tests or checks were run and the raw output is pasted above
  • The diff is confined to the scope of the linked issue
  • No secrets, keys, tokens or hostnames were added to tracked files

Not verified

Whether the cache restores actually miss. That the fork never writes a cache is established from the gate conditions; that the restores therefore miss is inference. I did not open a restore step's log to observe a miss, and that is the one measurement that would turn "the pipeline is cold" into an observation.

The stale-base mechanism rests on one run. The changes log for 32473521557 is unambiguous about what happened there, but the general rule — that a pull request's job set depends on how far the base branch moved since it was opened — is inferred from that plus pull_request.base.sha semantics, not reproduced a second time.

Duration sampling is thin: two code-touching runs (32 min, 24 min), neither cache-warm, so there is no warm comparison point.

Only ci.yml was audited. The other 22 workflow files were not examined.

Whether any status check is currently required was not re-checked here; ADR-0019 records zero and #358 is looking at it separately.

Security implications

None. Adds one markdown research document. It quotes workflow line numbers and public run logs; no credentials, tokens or private hostnames. Note that the document records SCCACHE_GHA_RW_MODE referencing a hardcoded upstream pull request number, which is already public in ci.yml.

Escalations

  1. The fork pays full cold-build cost on every pull request and cannot stop. Caches are written only on push to main/release; this fork has neither branch. Fixing it means changing ci.yml's triggers, which is an upstream file and therefore an ADR under launchpad/AGENTS.md §3 rather than a patch. I have not proposed a change.
  2. Which contexts are safe to require. Only changes and dead-token-guard are unconditional; every other job can legitimately skip, and a check required on a skippable job sits pending forever. This bears directly on prd: the cohort test suite — what we test that upstream doesn't #290 criterion 5 and on task: make the ADR-0005 boundary check a required status check #153, but the choice is a human's.
  3. The "19 CI jobs" figure in prd: the cohort test suite — what we test that upstream doesn't #290 and ADR-0020 is 18. Recorded in the document; whether those texts get corrected is not my call.

…s fork is dead (#328)

Signed-off-by: tucktuck101 <jeffreytaylorrobertson@gmail.com>
@tucktuck101 tucktuck101 added the by:agent Filed or authored by an AI agent, not a human label Aug 21, 2026

@serina-mcfall serina-mcfall left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Blocker — "every cache-save on this fork is dead" is refuted by this note's own exemplar run

The note's headline, frontmatter description, PR title and escalation 1 all rest on:

This fork never writes a CI cache. Every pull request builds cold, and always will…
Six step-level conditions, every one of them a cache write

There are nine actions/cache/save steps, not six:

$ grep -n 'actions/cache/save' .github/workflows/ci.yml
229  276  386  459  575  845  879  895  1133

The three the note omits carry no push gate at all:

ci.yml:878   - name: Save Hermit package cache
             if: always() && steps.hermit-cache.outputs.cache-hit != 'true'
ci.yml:894   - name: Save pub cache
             if: always() && steps.pub-cache.outputs.cache-hit != 'true'
ci.yml:1132  - name: Save mesh llama build cache
             if: steps.llama_cache.outputs.cache-hit != 'true'

And it is refuted by observation on run 32473521557 — the run the note itself uses as its exemplar:

$ gh run view 32473521557 --repo launchpad-26/buzz --json event,headBranch
pull_request on docs/adr-0018-relay-vps-specification

$ gh run view 32473521557 --json jobs --jq '...Save.*cache...'
{"conclusion":"success","job":"Desktop Build (macOS)",
 "saves":[{"c":"success","n":"Save mesh llama build cache"}]}

A cache-save step ran to success, on a pull_request event, on this fork.

Your "Not checked" section honestly flags that cache restores were not observed to miss. The error is on the saves, which the note treats as established rather than as the six it actually inspected.

The narrower claim survives intact and is worth keeping: six pnpm/Playwright/relay-artifact saves are push-gated and therefore never fire on this fork, which is a real and useful finding. It is the universal quantifier that has to go — and it is currently the title.

Medium — the justfile filter entry can never match, and that is a live CI defect

This one is worth pulling out because it is not just a note defect. §2 quotes the paths-filter list accurately, including - 'justfile', then asserts that touching the justfile triggers the desktop E2E shards, the macOS build and the Windows Rust job.

The tracked filename is Justfile, capitalised. dorny/paths-filter matches case-sensitively against git diff --name-status output, so that entry never fires. The Cargo.lock and ci.yml halves of the claim hold.

I am filing this as an issue against ci.yml as well, since the fix belongs there rather than in the note.

Medium — ADR-0019 and ADR-0020 are cited as records; neither is merged

The note says "the '19 CI jobs' figure in #290 and ADR-0020 is 18" and "ADR-0019 records zero". Both ADRs are open pull requests (#281, #291), not records in launchpad/decisions/ — where the sequence currently runs 0018 → 0021 → 0022. The quotations are accurate; the status is not. Filed as a shared issue, since #424 and #437 do the same thing.

What is right — and this note is mechanically excellent almost everywhere

I re-checked the spine of it and it holds line for line:

  • ci.yml:2-5 on: push: branches: [main, release] / pull_request: — exact.
  • All eight save-if: ${{ github.event_name != 'pull_request' }} at 112, 134, 159, 355, 774, 966, 1010, 1084 — exact.
  • token: '' at line 37; SCCACHE_GHA_RW_MODE … pull_request.number == 5224 at line 331; the rust filter's 12-entry path list — all verbatim.
  • "18 jobs, not 19" is correct, and so is the diagnosis. grep -n '^ [a-z0-9-]*:$' returns 19 lines, one of which is push: at line 3 — exactly the naive-grep artefact you name. The "19 CI jobs" figure genuinely does appear in #290's body and in ADR-0020's draft.
  • Run 32473521557 reproduces exactly: branch, event, 10:38:03Z → 11:10:38Z, 23 job instances, 21 ran, 2 skipped.

Catching the 19→18 miscount in someone else's document, and diagnosing why the wrong number was produced, is the best thing in this note. It is the same class of error as the one above — which is worth sitting with.


Reviewed at head ee37ecbcb. The cache-save refutation was verified by me directly against run 32473521557, not taken on report.

🤖 Review drafted by Claude Code (claude-opus-5) for @serina-mcfall.

Signed-off-by: tucktuck101 <jeffreytaylorrobertson@gmail.com>
@tucktuck101 tucktuck101 changed the title docs(research): CI change detection works; every cache-save on this fork is dead (#328) docs(research): CI change detection works; fourteen cache-write paths are disabled (#328) Aug 23, 2026

@serina-mcfall serina-mcfall left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Re-review — the blocker is addressed. No blocker remains.

Agent-authored under @serina-mcfall's instruction. I do not approve; this records what I verified.

Blocker (the universal "this fork never writes a CI cache", refuted by the note's own exemplar run) — fixed, and fixed the honest way. The universal is gone from the frontmatter and the finding, the three ungated saves are no longer swept in, and the refuting observation is recorded rather than quietly dropped:

$ git show origin/research/328-ci-jobs-on-launchpad:launchpad/Research/328-ci-jobs-on-launchpad.md | sed -n '2p;79,80p'
description: ... change detection works, while six explicit saves and eight rust-cache writes are disabled on pull requests.
79:The mesh llama save completed successfully in pull-request run `32473521557`. The accurate result
80:is therefore narrower: the six saves above, all eight `rust-cache` writes, and sccache writes are

Naming the run that refuted your own claim, in the note, is the part that makes this reusable rather than merely corrected.

The two Mediums are tracked, not lost. #442 is open for the justfile/Justfile case-sensitivity defect in the paths filter — which is a live CI bug rather than a note defect, and the right place for it. The "ADR-0019/ADR-0020 cited as records while both are still open PRs" item I could not find a filed issue for; flagging that rather than assuming, since the review said it was filed as a shared issue across #424 and #437. Worth confirming before this closes.

Nothing new found. The spine of the note still reproduces line for line — the eight save-if conditions at 112/134/159/355/774/966/1010/1084, the token: '', the sccache PR-number gate, and the 19→18 job-count diagnosis that remains the best thing in it.


Reviewed at head 84836598c.

🤖 Review drafted by Claude Code (claude-opus-5) for @serina-mcfall.

@serina-mcfall
serina-mcfall merged commit 1b5ad1e into launchpad Aug 24, 2026
24 checks passed
@serina-mcfall
serina-mcfall deleted the research/328-ci-jobs-on-launchpad branch August 24, 2026 01:28
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

by:agent Filed or authored by an AI agent, not a human

Projects

None yet

Development

Successfully merging this pull request may close these issues.

task: find out which CI jobs actually run on a pull request targeting launchpad

2 participants