Skip to content

Factory CI: a Lint job runs upstream's lint and format checks - #64

Merged
tomkaczocha merged 1 commit into
mainfrom
t3/factory-issue-56
Oct 16, 2026
Merged

tomkaczocha merged 1 commit into
mainfrom
t3/factory-issue-56

Conversation

@rawphp

@rawphp rawphp commented Oct 16, 2026

Copy link
Copy Markdown

Closes #56

Contract

  • done: .github/workflows/factory-ci.yml gains a second job lint (name Lint) with the same checkout (sparse, no .repos/), the same Setup Vite+ and vp i steps as check, then vp check, the command upstream's ci.yml Lint job runs. The check job and factory/scripts/check.sh are unchanged; the gate in .dw/config.yml is unchanged. factory/README.md "Checks" says CI runs Lint beside check.sh and that the gate does not run it.
  • out: knip:check, ensure:electron, the PR-assets step, making Lint a required check (Wait for a repo's required CI checks before marking a pull request ready #26), gate changes, factory/SEAMS, upstream files.
  • risk: none (CI configuration and a README paragraph)
  • test: skip (no vitest covers the workflow file). Verified instead by actionlint .github/workflows/factory-ci.yml (exit 0) and by vp check run locally on the branch's tree, see below.

Acceptance criteria

  • Second job lint (name Lint), same checkout and Vite+ setup as check, then vp check — .github/workflows/factory-ci.yml:46-71; steps 1 to 3 are byte-identical to the check job's.
  • check job, check.sh and the gate unchanged — the diff touches only lines 46-71 of the workflow and one paragraph of the README; factory/scripts/check.sh and .dw/config.yml are not in the diff.
  • On a branch with a lint error under apps/server/src/factory/, Lint fails and Check passes; on main, Lint passes; the PR body links both runs — cannot be produced yet: GitHub Actions is disabled for this repository (gh api repos/original-solutions/t3code-factory/actions/permissions → "enabled": false; gh run list shows no run of any workflow, ever). Verified locally on the branch's tree instead:
    • clean tree: vp check → exit 0 (pass: All 5724 files are correctly formatted, Found 0 errors and 954 warnings); warnings do not fail it.
    • with // oxlint-disable-next-line eslint/no-unused-vars and no reason appended to apps/server/src/factory/text.ts: vp check → exit 1 (x t3code(require-suppression-reason) at text.ts:28), while vp run --filter t3 typecheck → exit 0. The Check job's other steps do not read that line.
    • a plain import { sep } from "node:path" is not a usable demo: vp check fails on it, but so does the server typecheck (effect(nodeBuiltinImport)), so Check would fail too.
  • No vp check findings on main to fix — vp check exits 0 on the main tree, so no fork or upstream file needed a change.
  • README "Checks" names Lint beside check.sh and says the gate does not run it — factory/README.md:22.

Needs info

Actions is off at the repository level, so neither the Lint demonstration run nor a Lint run on main can exist until a person turns it on. factory/docs/design.md ("Actions are off for the whole repo") says the same step should disable every upstream workflow first, so upstream's ci.yml and its Blacksmith-runner jobs do not fire on every push. Questions:

  1. Will you enable Actions on original-solutions/t3code-factory (and disable the upstream workflows as design.md says), so this run can produce the two runs and link them here?
  2. The failing demonstration needs a second, throwaway draft pull request from a branch stacked on this one with the suppression directive above added to a factory file. Shall I open it, link its run here, and close it with its branch deleted afterwards?
  3. If you would rather not enable Actions now, is the local evidence above enough to merge this change, with the run links added later?

Gate

  • vp test run apps/server/src/factory → exit 0 (33 files, 1129 tests)
  • vp run --filter t3 typecheck → exit 0

Models

  • maker: claude-sonnet-5-5 (no models block in .dw/config.yml; roster default)
  • checker: claude-opus-5-5
  • orchestrator: this session (Fable 5.1)

Review

  • cycles: 1
  • cycle 1 (correctness, read-only, on 3480eb91f): Approve, no findings. No testing persona: the diff holds no tests and no runtime code, and the only behaviour (vp check's exit code) was exercised directly as described above.
  • red/green: no red phase. The change is CI configuration and prose with no test; the vp check exit-code checks above stand in for it.
  • leftovers: none

Isolate

  • The worktree was behind origin/main with a clean tree; fast-forwarded e4bcce9f6 → ff23fa2fd before provisioning.
  • Labels: all seven factory:* labels already existed; none created.
  • Provision: vp i → exit 0.

Lessons

  • A criterion that cites a CI run is an outside-system check at Contract time. Symptom: every local check passed and the work was ready to ship before it was clear that no workflow run could ever appear. Cause: GitHub Actions was disabled at the repository level, which gh workflow list does not show (every workflow reads active); only gh api repos/<owner/repo>/actions/permissions and an empty gh run list do. Default: when an acceptance criterion names a workflow run or a check, query those two at Contract, and when Actions is off, build the change, open the draft, and stop needs-info with the questions in the same message, rather than discovering it at Ship.

Commits

  • 3480eb91f ci(factory): a Lint job runs vp check beside Check — Make slice (no red phase: CI config)

Files

  • .github/workflows/factory-ci.yml — new lint job (Lint): checkout, Setup Vite+, vp i, vp check; check job untouched
  • factory/README.md — "Checks" names the Check job and the Lint job and says the gate does not run Lint

@tomkaczocha
tomkaczocha marked this pull request as ready for review October 16, 2026 08:15
@tomkaczocha
tomkaczocha merged commit 376bb80 into main Oct 16, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Factory CI: a Lint job runs upstream's lint and format checks

2 participants