Skip to content

feat(start): segments 1/3 enter at C1 — lint gate 19b flip blocked, evidence inside (#673, #676) - #893

Merged
thomgabriel merged 1 commit into
mainfrom
feat/c1-segment-flip-30-07-2026
Jul 30, 2026
Merged

feat(start): segments 1/3 enter at C1 — lint gate 19b flip blocked, evidence inside (#673, #676)#893
thomgabriel merged 1 commit into
mainfrom
feat/c1-segment-flip-30-07-2026

Conversation

@thomgabriel

Copy link
Copy Markdown
Collaborator

Final monorepo step of the C1 flip wave. C1 course-solana-for-web-devs is authored (courses-academy #25), in the committed bundle (meta.json sha c5c625e, 6 courses / 66 lessons) and live on-chain — deployment row synced + active, rendering in the anon catalog.

1. Segment flip (#673)

SEGMENT_ENTRY_COURSE — segments 1 and 3 flip course-rust-for-program-devscourse-solana-for-web-devs. Segment 2 is unchanged (course-building-first-program; it "enters here" and skips the on-ramp). The TODO(#599/#673) becomes a statement of the completed flip.

Test change + red-proof. entry-course-live.test.ts (the #794-era guard that runs the real resolver against the real bundle) gains an explicit expected-table assertion. Both of its existing invariants are untouched and unweakened:

  • no segment enters a retired course
  • every segment entry deep-links to a real bundle lesson (not the catalog fallback)

Red-proof — with the new test file and the old constant restored:

× segments 1 and 3 enter at C1, segment 2 at C3
  AssertionError: segment 1 entry course: expected 'course-rust-for-program-devs' to be 'course-solana-for-web-devs'
  Tests  1 failed | 3 passed (4)

The 3 passed is the load-bearing part: under the old table both original invariants still passed (C2 is live and non-retired, so it deep-links fine). They could not have detected this flip in either direction — the literal expected table is what pins it, which is precisely why it was added rather than relying on the generic invariants.

With the new constant: 4 passed.

2. Gate 19b (#676) — NOT flipped, with evidence

The instruction on #676 was to flip only if content is clean, and to report violations rather than ship a red gate. It is not clean. Running content-lint the CI way (validate-content.yml invocation) against courses-academy main @ c5c625e:

content-lint: OK (58 diagnostics, 0 errors)
  gate-19b: 30 warnings — 23 single-use slugs, 7 dead vocabulary entries

Flipping the tier today turns content CI red on main. The issue itself pairs the tier change with a sweep of the then-current warning list, and that sweep lives in skills.yaml in the content repo — it cannot land in this PR. So #676 stays open and this PR does not close it.

What this PR does instead: re-points the stale precondition. The old comment and diagnostic text said "flips once the 5-course catalog lands" — the catalog has landed, so that text now reads as satisfied while the gate stays a warning. It now names the real remaining blocker (the skills.yaml sweep) and the order of operations.

The 23 single-use slugs
slug sole lesson
keypairs-wallets building-your-first-solana-program/fund-your-wallet
program-testing building-your-first-solana-program/pre-flight-check
react dapp-and-sdk-with-kit/connect-with-wallet-standard
token-2022 stablecoin-agentic-payments/token-or-token-2022
transfer-hook stablecoin-agentic-payments/token-or-token-2022
protocol-versioning stablecoin-agentic-payments/pay-the-402-programmatically
version-pinning stablecoin-agentic-payments/write-the-deep-dive
solana-pay stablecoin-agentic-payments/payment-rails-decision-map
api-monetization stablecoin-agentic-payments/meter-an-endpoint-with-x402
subscriptions-program stablecoin-agentic-payments/write-the-deep-dive
subscription-authority stablecoin-agentic-payments/subscription-authority-and-allowance
recurring-delegation stablecoin-agentic-payments/recurring-delegation-paid-tier
rust-control-flow rust-for-program-devs/functions-and-control-flow
rust-move-semantics rust-for-program-devs/moves-copy-and-clone
rust-slices rust-for-program-devs/lifetimes-and-slices
rust-modules rust-for-program-devs/build-the-vault-core
compiler-errors rust-for-program-devs/fix-the-borrow-checker
build-server rust-for-program-devs/your-first-rust-build
toolchain-versions rust-for-program-devs/your-first-rust-build
client-codegen dapp-and-sdk-with-kit/idl-to-typed-client
semver dapp-and-sdk-with-kit/package-surface-and-readme
ci dapp-and-sdk-with-kit/publish-the-package
simulation dapp-and-sdk-with-kit/simulate-before-you-send

Note react is also a NON_REVIEW_ELIGIBLE_SKILLS facet (gate 19d notice) — a candidate for reviewExempt rather than a second tagging.

The 7 dead vocabulary entries (0 lessons)

defi, amm, lending, staking, oracles, wallet-adapter, siws — all survivors of the retired-course sweep (CATALOG §3). Deletion candidates.

Verification

check result
pnpm typecheck 6/6 successful
apps/web vitest (full suite) 245 files / 2221 tests passed
packages/content-lint vitest 17 files / 107 tests passed
pnpm lint successful (pre-existing import/order warnings only, 0 errors)
prettier --check on changed files clean
content-lint vs courses-academy main (CI invocation) OK (58 diagnostics, 0 errors)

Refs #676. Does not close it — the tier flip is still pending the content-repo skills.yaml sweep.
Part of #673's flip checklist; #673 closes manually with the wave summary after this merges.

C1 is authored, in the committed bundle (content.lock sha c5c625e) and live
on-chain, so SEGMENT_ENTRY_COURSE's placeholder entry at C2 is retired:
segments 1 and 3 now enter at course-solana-for-web-devs. Segment 2 is
unchanged (enters at C3, skips the on-ramp).

The #794-era live-bundle regression suite gains an explicit expected-table
assertion. Its two existing invariants (no segment enters a retired course;
every entry deep-links to a real bundle lesson) both stayed GREEN under the
old table, so they could not have caught the flip on their own — the literal
table is what pins it.

Gate 19b (#676) is NOT flipped: an audit of courses-academy main (c5c625e)
still reports 30 gate-19b findings, so the tier change waits on the paired
skills.yaml sweep in the content repo. The in-code TODO and the diagnostic
text are re-pointed at that real precondition instead of the now-satisfied
catalog one.
@vercel

vercel Bot commented Jul 30, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
superteam-academy-web Ready Ready Preview Jul 30, 2026 11:25pm

Request Review

@claude

claude Bot commented Jul 30, 2026

Copy link
Copy Markdown

Claude finished @thomgabriel's task in 2m 9s —— View job


Code Review

  • Read CLAUDE.md + docs/TASK-CODES.md conventions
  • Gather PR diff and changed files
  • Verify "Done when" claims (segment flip + gate 19b evidence, not closing content-lint gate 19b: flip the minimum-reuse bar from warning to error once the 5-course catalog lands #676)
  • Review learner-segment.ts segment table change
  • Review entry-course-live.test.ts red-proof assertion
  • Review gate19-skills.ts comment/diagnostic re-pointing
  • Review gate19.test.ts change
  • Scrutinize trust-boundary / RLS / on-chain / secrets priorities (n/a — no such files touched)
  • Post final review

No blocking findings. This is a clean, well-scoped PR — the diff matches exactly what the body claims, no more and no less.

Verified

  • Segment flip is correct and minimal. learner-segment.ts:78-82SEGMENT_ENTRY_COURSE[1] and [3] now point at course-solana-for-web-devs, segment 2 untouched. Confirmed course-solana-for-web-devs exists in the committed bundle (apps/web/src/content/generated/courses.json) and content.lock is pinned to c5c625e03b23f6ce527da884456f7b2d36c26bed — matches the sha cited in the PR body.
  • Red-proof claim is credible. entry-course-live.test.ts:68-92 adds a literal EXPECTED_ENTRY table asserted via entryCourseForSegment, independent of the two pre-existing invariants (no retired-course entry, real lesson deep-link). Walked through the logic: under the old table, C2 (course-rust-for-program-devs) is live and non-retired, so both pre-existing invariants pass — only the new literal-table assertion would catch a reverted/wrong flip. That matches the PR's stated rationale for why this test was necessary rather than redundant.
  • Gate 19b is genuinely NOT flipped — verified by diff, not just the prose. gate19-skills.ts:150-193 has zero logic changes; "warning" severity (line 187) and the #676 diagnostic reference (line 190) are unchanged. gate19.test.ts:129 (expect(g[0]?.severity).toBe("warning") / .toContain("#676")) still expects warning tier — consistent with the claim that only comments/prose moved (precondition-met → blocker-is-the-content-repo-sweep). No risk of an accidental tier flip slipping through.
  • No RLS, on-chain, secrets, or client-trust-boundary surface touched by this PR — those priorities don't apply here.

Non-blocking

  • learner-segment.ts:57-59 docblock still shows the abstract 5-course ladder (C1 → C2 → C3 → C4 → C5) unchanged, which is fine — but worth double-checking in a future pass that nothing else in the codebase (docs, other routing tables) still assumes segment 1/3 enter at C2, now that this is the last flip in the wave per the PR body.
  • Could not execute pnpm typecheck / vitest / content-lint locally in this sandboxed review environment (Bash tool access is restricted here) to independently reproduce the reported 245 files / 2221 tests passed and 4 passed red-to-green numbers — verification of those specific counts relies on the PR's self-report and CI. CI (CI, Lighthouse) was still in progress at review time; no failures observed so far (Action pin guard × 2 green).

Advisory only — CI is the hard gate, and per repo policy this still needs human sign-off before merge (routine here since no RLS/on-chain/secrets/mainnet surface is touched, but the flip does affect the live /start funnel).
· Branch

@thomgabriel
thomgabriel merged commit 2cbe779 into main Jul 30, 2026
26 checks passed
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.

1 participant