Skip to content

refactor(learn): drop em dashes from the course content - #107

Merged
joaopcm merged 1 commit into
mainfrom
t3code/no-em-dashes
Aug 22, 2026
Merged

refactor(learn): drop em dashes from the course content#107
joaopcm merged 1 commit into
mainfrom
t3code/no-em-dashes

Conversation

@joaopcm

@joaopcm joaopcm commented Aug 22, 2026

Copy link
Copy Markdown
Owner

Em dashes are one of the more reliable AI-writing tells, and the course content had 175 of them across the nine units and their quizzes. This removes all of them from reader-facing text.

Scope

In: the nine unit.mdx files, every quiz.ts prompt and explanation, and the running prose in page.tsx, setup-note.tsx, and progress-note.tsx.

Out, deliberately:

  • Code comments. Not something a learner reads, and this repo's own comment style already reaches for the dash in asides throughout the codebase — changing that here would be inconsistent with everywhere else.
  • The Label — value UI convention: Unit 00 — locked (gate.tsx), Run this — auth (lookup.tsx), Next — {title} (quiz.tsx), and the same shape in spine.tsx, exam.tsx, start-link.tsx. That's a deliberate, consistent design pattern for compact status strings, not prose with an AI tic. Changing it would be a design decision, not a writing fix.
  • lookups.spec.ts's own explanatory comments, same reasoning as the first point.

How, not just what

No mechanical find-and-replace. A uniform substitution is its own tell — real writing doesn't reach for the same punctuation mark every time. Each instance was read in its sentence and repunctuated for what that sentence is actually doing:

  • Colon where the second clause explains or elaborates the first — the most common case by far
  • Comma where a conjunction (and, so, but, which) already carried the logical relation and the dash was doing nothing
  • Parentheses where the text was a genuine aside — usually a paired em dash wrapping an example or a gloss
  • Period, splitting into two sentences, where the clauses were fully independent

Example of the range, from unit 6:

- deliberately — a verify that consulted one resolver and a sweep that
+ deliberately: a verify that consulted one resolver and a sweep that

- both servers are listed in the delegation — so a resolver
+ both servers are listed in the delegation, so a resolver

- getting the once-per-episode property out of it — rather than out of a
- separate suppression rule somewhere else — is why there is nothing here
+ getting the once-per-episode property out of it (rather than out of a
+ separate suppression rule somewhere else) is why there is nothing here

Three different fixes for three different sentences, because they needed different things.

What I checked

  • grep -rc '—' apps/learn/src/content --include=*.mdx → 0
  • grep -rc '—' apps/learn/src/content --include=*.ts → 0 outside lookups.spec.ts comments
  • Read every rewritten sentence back for flow, not just for the absence of the character
  • curriculum.spec.ts reads unit.mdx headings off disk and matches them against the declared curriculum; no heading text was touched, so that guard still holds
  • pnpm --filter @propgate/learn build and the full pnpm --filter @propgate/learn vitest run (70/70)
  • Workspace-wide pnpm lint, pnpm check, pnpm test --force — 12/12 tasks, nothing cached

134 changes across 19 files, all 1:1 line replacements — no prose restructuring beyond the punctuation itself, no new claims, nothing added or removed in substance.

Reader-facing prose only: the nine unit.mdx files, quiz.ts prompts and
explanations, and the running copy in page.tsx, setup-note.tsx and
progress-note.tsx.

No mechanical find-replace. Each instance is read in context and repunctuated
for what that sentence is actually doing: a colon where one clause explains
the one before it, a comma where a conjunction already carried the relation
and the dash was redundant, parentheses where the text was a true aside, or a
period splitting two independent clauses. Which is also why the fix is not
uniform: the same construction gets different punctuation depending on what
the surrounding sentence needs.

Left alone, deliberately:
- Code comments (JSDoc-style, prefixed with `*`) — not something a learner
  reads, and this repo's own comment style already leans on the dash for
  asides throughout the codebase
- The "Label — value" UI convention (spine.tsx, gate.tsx, exam.tsx, quiz.tsx,
  start-link.tsx, lookup.tsx) — a deliberate, consistent design pattern for
  compact status strings, not prose
- lookups.spec.ts's own explanatory comments

134 changes across 19 content/component files. Verified: 70/70 apps/learn
specs pass, workspace build/lint/check/test all clean, and the heading-match
guard in curriculum.spec.ts (which reads unit.mdx off disk) still holds since
no heading text was touched.

@greptile-apps greptile-apps Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Your trial has ended. Reactivate Greptile to resume code reviews.

@joaopcm
joaopcm merged commit ed2cab9 into main Aug 22, 2026
14 checks passed
@joaopcm
joaopcm deleted the t3code/no-em-dashes branch August 22, 2026 00:38
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