Context
.claude/skills/contributing-to-loopover/reference.md section 1 ("Every CI check → local command → what fails it") documents every CI-gating check with its local reproduction command, and separately calls out local-only checks with no dedicated CI status (e.g. the engine package's own node --test suite). It also states, right after the table:
One command for everything except security: npm run test:ci.
Both claims are now inaccurate. .github/workflows/ci.yml's validate-code job runs four extension-lane steps, gated by github.event_name == 'push' || needs.changes.outputs.ui == 'true' (same trigger as the ui → * rows already in the table):
- name: Extension lint
run: npm run extension:lint && npm run miner-extension:lint
- name: Extension typecheck
run: npm run extension:typecheck && npm run miner-extension:typecheck
None of extension:lint, extension:typecheck, miner-extension:lint, miner-extension:typecheck appear anywhere in reference.md's CI table. Worse, they are also absent from npm run test:ci itself (verified: package.json's test:ci script chains git diff --check && ... && npm run ui:lint && npm run ui:typecheck && npm run ui:test && npm run ui:build — no extension:* or miner-extension:* commands anywhere in the chain). So a contributor touching apps/loopover-extension/** or apps/loopover-miner-extension/** has:
- no row in the CI table telling them these checks exist and gate the required
validate status check, and
- no way to catch a failure locally even by running the documented "one command for everything except security" —
test:ci silently skips them.
This is the same class of gap reference.md itself already warns about for the engine package's own test suite ("a past PR shipped a genuine, undetected ... regression ... specifically because test --workspace @loopover/engine isn't part of ci.yml"), just in the opposite direction: here the gap is in test:ci, not in ci.yml.
Requirements
- Add a row (or rows) to reference.md's CI table for the extension lint/typecheck checks, following the existing
ui → * row style, with their real trigger condition (push || ui==true, matching the existing ui → lint etc. rows).
- Correct the "One command for everything except
security" claim — either by adding the four missing commands to package.json's test:ci script (the more useful fix, since it closes the actual local-verification gap, not just the doc) or, if that's out of scope for a docs-only PR, by explicitly listing extension:lint/extension:typecheck/miner-extension:lint/miner-extension:typecheck in reference.md's existing "Local-only checks with no separate named CI status" callout so the claim stops being false.
- Prefer the
test:ci fix if in scope: it's a one-line addition to the existing &&-chained script in package.json, no new files, and it's exactly the kind of drift this repo's own docs already warn contributors to watch for.
Deliverables
Test Coverage Requirements
If package.json's test:ci is extended, that's a script-chain change with no src/** code touched — outside coverage.include, no Codecov gate. If the fix is doc-only (reference.md), it's also outside coverage.include (*.md). Either way, verify by actually running npm run test:ci locally after the change and confirming extension:lint/extension:typecheck execute (their absence today is exactly what's being fixed).
Expected Outcome
The CI table lists every check that gates the required validate status, including the extension lint/typecheck steps; npm run test:ci's "one command for everything except security" claim is either true again or no longer claimed.
Links & Resources
.github/workflows/ci.yml (validate-code job, "Extension lint"/"Extension typecheck" steps) — the CI-side source of truth
package.json's test:ci script — the local aggregate command
.claude/skills/contributing-to-loopover/reference.md section 1 — the table and claim to fix
Context
.claude/skills/contributing-to-loopover/reference.mdsection 1 ("Every CI check → local command → what fails it") documents every CI-gating check with its local reproduction command, and separately calls out local-only checks with no dedicated CI status (e.g. the engine package's ownnode --testsuite). It also states, right after the table:Both claims are now inaccurate.
.github/workflows/ci.yml'svalidate-codejob runs four extension-lane steps, gated bygithub.event_name == 'push' || needs.changes.outputs.ui == 'true'(same trigger as theui → *rows already in the table):None of
extension:lint,extension:typecheck,miner-extension:lint,miner-extension:typecheckappear anywhere in reference.md's CI table. Worse, they are also absent fromnpm run test:ciitself (verified:package.json'stest:ciscript chainsgit diff --check && ... && npm run ui:lint && npm run ui:typecheck && npm run ui:test && npm run ui:build— noextension:*orminer-extension:*commands anywhere in the chain). So a contributor touchingapps/loopover-extension/**orapps/loopover-miner-extension/**has:validatestatus check, andtest:cisilently skips them.This is the same class of gap reference.md itself already warns about for the engine package's own test suite ("a past PR shipped a genuine, undetected ... regression ... specifically because
test --workspace @loopover/engineisn't part ofci.yml"), just in the opposite direction: here the gap is intest:ci, not inci.yml.Requirements
ui → *row style, with their real trigger condition (push || ui==true, matching the existingui → lintetc. rows).security" claim — either by adding the four missing commands topackage.json'stest:ciscript (the more useful fix, since it closes the actual local-verification gap, not just the doc) or, if that's out of scope for a docs-only PR, by explicitly listingextension:lint/extension:typecheck/miner-extension:lint/miner-extension:typecheckin reference.md's existing "Local-only checks with no separate named CI status" callout so the claim stops being false.test:cifix if in scope: it's a one-line addition to the existing&&-chained script inpackage.json, no new files, and it's exactly the kind of drift this repo's own docs already warn contributors to watch for.Deliverables
.claude/skills/contributing-to-loopover/reference.md: new CI-table row(s) for the extension lint/typecheck checkspackage.json'stest:ciscript extended to runextension:lint && extension:typecheck && miner-extension:lint && miner-extension:typecheck, or reference.md's "local-only checks" callout updated to list them as a knowntest:cigap (pick one; the former is preferred).claude/skills/contributing-to-loopover/SKILL.mdchecked for the same "runnpm run test:ci, you're covered" framing and updated if it repeats the same now-inaccurate claimTest Coverage Requirements
If
package.json'stest:ciis extended, that's a script-chain change with nosrc/**code touched — outsidecoverage.include, no Codecov gate. If the fix is doc-only (reference.md), it's also outsidecoverage.include(*.md). Either way, verify by actually runningnpm run test:cilocally after the change and confirmingextension:lint/extension:typecheckexecute (their absence today is exactly what's being fixed).Expected Outcome
The CI table lists every check that gates the required
validatestatus, including the extension lint/typecheck steps;npm run test:ci's "one command for everything except security" claim is either true again or no longer claimed.Links & Resources
.github/workflows/ci.yml(validate-codejob, "Extension lint"/"Extension typecheck" steps) — the CI-side source of truthpackage.json'stest:ciscript — the local aggregate command.claude/skills/contributing-to-loopover/reference.mdsection 1 — the table and claim to fix