Repository navigation
Training: What you'll learn lists + Workshops card (Approval Lite self-paced) - #12
Conversation
…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
left a comment
There was a problem hiding this comment.
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 andTrainingInterestDialog.tsx. No diff line touches any of them. trainingInterest.tschanges copy only. Against main, the only changed lines are the notify description, the notify and workshopsuccessMessagestrings, and fourcompanySizeOptionslabels. Intents, validation,shouldSubscribeToNewsletter, the headcount ranges, the[25+ seat quote]marker and the insert builder are unchanged.
Company-size labels: display only
- The
valuefields (1-10,11-50,51-200,201-1000,1000+) are unchanged. Onlylabelchanged, from an en dash to a plain hyphen. - The Select binds
form.companySizeto the optionvalue(TrainingInterestDialog.tsx:292-299). Thetraining_leadsinsert storescompany_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
srcandsupabasefor clone, cloneable, GitHub invite and private repo, skipping tests. No buyer-facing copy matches. The only hits areResponse.clone()calls inPurchaseBundleDialog.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.tsxand 0 intrainingInterest.ts. The SEO title dash is now a colon. - No-dash tests.
Training.test.tsxreads both source files and rejects U+2013/U+2014. It also rejects "cloneable" intrainingInterest.tsand checks the rendered page HTML. The new block intrainingInterest.test.tschecks the exported values: everydialogCopyandquoteDialogCopystring 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.
fundamentalsOutcomesandadvancedPatternsOutcomesare 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.tsis an existing file with a newdescribeblock, 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 examplefileURLToPath(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.tsstill 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.eslinton the four touchedsrcfiles: clean. Repo-widenpm run lintstill 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
left a comment
There was a problem hiding this comment.
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.tsxdrops the hero paragraph "An independent Elsa+ offering." (-3).Training.test.tsxadds 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.
Tracks https://github.com/valence-works/elsa-plus-training/issues/62 and https://github.com/valence-works/elsa-plus-training/issues/64.
Changes
fundamentalsOutcomesas the Core source so the list is not rendered twice.Training.tsx.weaver-ingesttraining page body to say "completion certificates".src/lib/trainingInterest.tscopy: unzip lab kit wording, no em/en dashes.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 removalsrcfiles lint-cleangrepofTraining.tsxandtrainingInterest.tsfor U+2014/U+2013 = 0Independent / vendor-neutral closer grep
An independent Elsa+ offering.independent/vendor-neutralcloserNeutralityDisclaimer("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.