Skip to content

Training: What you'll learn lists + Workshops card (Approval Lite self-paced) - #12

Merged
sfmskywalker merged 4 commits into
mainfrom
cursor/training-what-youll-learn-0934
Oct 4, 2026
Merged

sfmskywalker merged 4 commits into
mainfrom
cursor/training-what-youll-learn-0934

Conversation

@sfmskywalker

@sfmskywalker sfmskywalker commented Oct 3, 2026 •

Copy link
Copy Markdown
Member

Tracks https://github.com/valence-works/elsa-plus-training/issues/62 and https://github.com/valence-works/elsa-plus-training/issues/64.

Changes

  • Add What you'll learn lists on the Training page for Core (4 bullets) and Advanced Patterns (includes Approval Lite) (4 bullets, merged list). Reuses fundamentalsOutcomes as the Core source so the list is not rendered twice.
  • Replace the old fundamentals outcomes (em dash + "Studio vs code-first" claim) with the approved Core list.
  • Team packs extras (no prices in those lines): Team 5 is 5 seats, completion certificates, and 90 days of email Q&A; Team 10 is 10 seats, completion certificates, 90 days of email Q&A, plus a 60-minute live team Q&A. Existing Team prices (€349 / €599) and Buy stay on the card.
  • "a cloneable lab kit" → "a lab kit you download and unzip".
  • Remaining bare "certificates" → "completion certificates".
  • Rewrite the Workshops card: Available badge, private team workshops from €3,200, Approval Lite as self-paced in the Solo Bundle or as a private workshop, keep the existing workshop-quote button, and the note that private quotes can include Fundamentals, Approval Lite, or both.
  • Remove every em dash (U+2014) and en dash (U+2013) from Training.tsx.
  • Update weaver-ingest training page body to say "completion certificates".
  • Fold leftover src/lib/trainingInterest.ts copy: unzip lab kit wording, no em/en dashes.
  • Remove the banned closer An independent Elsa+ offering. from the Training hero (whole element).

Prices, Buy links (FUNDAMENTALS_CORE_GUMROAD_URL), the seat-quote dialog behavior, and the "until 31 Oct" launch wording are unchanged.

Verification

  • npm ci — pass (prior revision)
  • npm run build / npx tsc --noEmit -p tsconfig.app.json / npm test — re-run after this closer removal
  • Touched src files lint-clean
  • grep of Training.tsx and trainingInterest.ts for U+2014/U+2013 = 0

Independent / vendor-neutral closer grep

  • Training page: removed An independent Elsa+ offering.
  • weaver-ingest: no independent / vendor-neutral closer
  • Still on the Training page (shared component, not the banned hero closer): NeutralityDisclaimer ("independent companies" / .NET Foundation). Left in place; not the named closer.

Advisory reviewer: none live on elsa-hub, skipped per #10.

Merge gate: Elsa 3 Code Review APPROVE at head AND Kit QA solo walk on 3.8.4 passes (#62). Do not merge before both.

Open in Web Open in Cursor 

cursoragent and others added 3 commits October 3, 2026 22:11
…f-paced)

Add Core and Advanced Patterns outcomes on the Training page, refresh Team pack extras and the Workshops card, and keep weaver-ingest in sync with completion certificates.

Co-authored-by: Sipke Schoorstra <sipkeschoorstra@outlook.com>
Vitest does not expose a file-scheme import.meta.url here, so the source check now reads the page from the repo path.

Co-authored-by: Sipke Schoorstra <sipkeschoorstra@outlook.com>
Fold leftover trainingInterest.ts copy into the Training page PR: notify text now matches the download-and-unzip lab kit, and dialog/company-size copy no longer uses U+2013 or U+2014.

Co-authored-by: Sipke Schoorstra <sipkeschoorstra@outlook.com>

@sfmskywalker sfmskywalker left a comment

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

Elsa 3 Code Review: APPROVE + HIGH @ 2ade2a4

Code Review, Round 1/4

Reviewed the full diff from main (merge base 663953a) to 2ade2a4: 5 files, +156/-31. That is Training.tsx, Training.test.tsx, trainingInterest.ts, trainingInterest.test.ts and one line in weaver-ingest/index.ts. No blockers.

Scope and unchanged items

  • Prices match main. Solo Bundle EUR 29 until 31 Oct, then EUR 39. Team 5 EUR 349, Team 10 EUR 599, 25+ seats by quote, private workshops from EUR 3,200. The Team prices moved from the extras bullets to their own line ("Team 5 €349 · Team 10 €599."). The figures are the same.
  • Unchanged: the Gumroad Buy URL (FUNDAMENTALS_CORE_GUMROAD_URL), the "until 31 Oct" wording, the seat-quote dialog and TrainingInterestDialog.tsx. No diff line touches any of them.
  • trainingInterest.ts changes copy only. Against main, the only changed lines are the notify description, the notify and workshop successMessage strings, and four companySizeOptions labels. Intents, validation, shouldSubscribeToNewsletter, the headcount ranges, the [25+ seat quote] marker and the insert builder are unchanged.

Company-size labels: display only

  • The value fields (1-10, 11-50, 51-200, 201-1000, 1000+) are unchanged. Only label changed, from an en dash to a plain hyphen.
  • The Select binds form.companySize to the option value (TrainingInterestDialog.tsx:292-299). The training_leads insert stores company_size: optional(form.companySize) (trainingInterest.ts:363). The admin leads view shows that stored value. The newsletter call sends email, name and company but not company size. So stored rows, the admin view and the subscribe payload all receive exactly what they did before, and existing rows still match the options.

Copy and kit delivery

  • Kit wording. "a cloneable lab kit" becomes "a lab kit you download and unzip" on the Training page and in the notify description. This matches the kit as it now ships: an unzipped kit, with no clone step and no GitHub invite.
  • Site-wide search. I searched src and supabase for clone, cloneable, GitHub invite and private repo, skipping tests. No buyer-facing copy matches. The only hits are Response.clone() calls in PurchaseBundleDialog.tsx, which are code. Plain "invite" hits are all part of the organization-membership invitation feature, which is unrelated.
  • "completion certificates" is now used consistently in the Team extras, the Workshops card and the weaver-ingest training body.
  • Success lines read "Thanks. We'll follow up about ...". They are clear and correct.
  • Workshops card. It says Approval Lite is part of Advanced Patterns (AP0 to AP2) and is included in the Solo Bundle and every Team pack. It is self-paced after the Core labs, takes about 3 hours on Elsa 3.8.4, and is also available as a private workshop from EUR 3,200. This is accurate and reads well for a buyer.
  • Owner-approved text. I reviewed the new learning-outcome lists for accuracy and tone. I did not compare them word for word against the owner-approved text.

Dashes

  • Added lines: 0 em dashes (U+2014) and 0 en dashes (U+2013).
  • Remaining: 0 in Training.tsx and 0 in trainingInterest.ts. The SEO title dash is now a colon.
  • No-dash tests. Training.test.tsx reads both source files and rejects U+2013/U+2014. It also rejects "cloneable" in trainingInterest.ts and checks the rendered page HTML. The new block in trainingInterest.test.ts checks the exported values: every dialogCopy and quoteDialogCopy string plus the company-size labels. It also asserts the download-and-unzip wording directly. The regexes are correct.
  • Coverage overlap. The two tests overlap, but sensibly. The source scan also catches comments and strings that aren't exported. The value check keeps working if the copy moves to another file.

Code quality and tests

  • Outcome lists. fundamentalsOutcomes and advancedPatternsOutcomes are module-level constants, each rendered once. The Core list has a single source on the page.
  • Test style. The tests assert on roles, headings, list items and specific copy rather than snapshots. They are easy to read and fail with a clear message.
  • Test file. trainingInterest.test.ts is an existing file with a new describe block, not a new file.

Non-blocking notes

  • N1: Both source reads in the no-dash test build their path from process.cwd(). That only works when the test runner starts at the repo root. Resolving the path from the test file, for example fileURLToPath(new URL("../../lib/trainingInterest.ts", import.meta.url)), would make it independent of the working directory.
  • N2: The outcome strings are repeated word for word in Training.test.tsx, so every copy edit needs two edits. That's acceptable for locked copy. Alternatively, export the arrays and assert that each item renders.
  • N3: weaver-ingest/index.ts still has 9 em dashes in other entries (Home, Expert Services, Credits, Runtime Builder, and formatting templates). None are on the line this PR changes. Worth a separate cleanup if the no-dash rule is meant to cover the assistant's knowledge content too.
  • N4: The Training page never opens the notify variant of the dialog: its buttons open only the quote and provider variants. The updated notify copy is therefore a fallback today. Fixing it is still right, so the copy can't drift.
  • N5: The merge-gate line in the PR body says "APPROVE at head". The repo gate is APPROVE + HIGH at the head commit plus green CI, so please state it in full.

Verification at 2ade2a4

  • npm ci: pass.
  • npx tsc --noEmit -p tsconfig.app.json: pass.
  • npm test: 7 files, 47 tests, all passing.
  • eslint on the four touched src files: clean. Repo-wide npm run lint still reports errors, all in files this PR does not touch.
  • npm run build: pass. The blog prerender wrote 64 posts with 0 failures.
  • CI: CodeQL (javascript-typescript) success, GitGuardian success, license/cla success. The PR is mergeable and its merge state is clean.

Merge gate

No advisory reviewer is live on elsa-hub. The gate is Elsa 3 Code Review APPROVE + HIGH on the head commit plus green CI. Both hold at 2ade2a4. Any new push voids this approval.

Drop the hero paragraph 'An independent Elsa+ offering.' per the owner rule. Tests assert that closer is gone.

Co-authored-by: Sipke Schoorstra <sipkeschoorstra@outlook.com>

@sfmskywalker sfmskywalker left a comment

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

Elsa 3 Code Review: APPROVE + HIGH @ 08109c7

Code Review, Round 2/4

This round covers the one commit pushed on top of 2ade2a4f, which was approved in Round 1:

  • Training.tsx drops the hero paragraph "An independent Elsa+ offering." (-3).
  • Training.test.tsx adds an assertion that the text is gone, in the existing page-render test (+1).

Verified

  • The phrase no longer appears anywhere else in the repo.
  • The hero still ends cleanly on the price line. The shared neutrality footer is untouched.
  • No other code, copy or price changes, and no dashes added.
  • The branch is current with main and mergeable.
  • Checks at head are green: CLA, CodeQL and GitGuardian.

Everything from Round 1 still holds, and N1 to N5 there stay non-blocking.

Nit (non-blocking): the price line keeps its mb-3 bottom margin, which was spacing for the removed paragraph. Dropping it would tighten the hero, but this is optional.

@sfmskywalker
sfmskywalker merged commit a458eeb into main Oct 4, 2026
3 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.

2 participants