Repository navigation
Simple Format import: ask for a role when the bracket doesn't name one, instead of guessing (#91) - #139
Conversation
…Table Topics' with no timing rules Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
plan: The cause is the role ladder in
With a valid key, import and START in both apps work unchanged. The fix updates the tests that assert the old result. Two of them are #90 oracle tests; their #90 point still holds, only the role string changes. It also updates Open questions (default in bold):
|
…atch The first plan fixed the keyword ladder so "(Table Topics)" landed on Table Topics Speech. The direction changed: a fallback to a built-in can land on a role the user removed, and the closest-match step from #77 gives false positives ("(Table Topics)" became a custom Table Topics Master). Import now takes only an exact role name and highlights the rest on the Agenda tab for a manual pick.
…e rest A line gets a role only when its bracket names one of the roles in the dropdown (same words; case, spacing and punctuation ignored). Any other line keeps its text as written, with no rules. The Agenda tab highlights such rows, with a "Pick a role" list of the saved roles and a banner that counts them; clicking one asks for a role instead of opening the Live tab. The check is derived from the current roles, so rows saved earlier as 'Table Topics' and rows whose role was later removed are highlighted too. Completed rows and breaks never are. matchCustomRole and detectRoleFromText had no callers left and are removed. Add Item now starts on the first listed role when Standard Speech is hidden, so it never saves a role the picker didn't show. agenda-import gains IM-06 and new expectations for IM-02 and IM-05. timer-core is reviewed: importBulkSpeakers is under its Not covered.
The real-client run was blocked: the Mac's screen was locked, so no step ran. The branch is deployed to dev (version 9b18a973) for the rerun. verified_at stays at the last real run.
Both specs ran green in the real Zoom client against dev a249d5d7: agenda-import IM-01..IM-06 and timer-core TC-01..TC-08, TC-10, TC-11 (TC-09 and TC-12 are human steps). The device hides every built-in role, so the agenda-import needs line now says to use a listed role in its place, and to keep the device's own custom roles unless one clashes with a line in the spec.
INDEX conflict on the timer-core row: kept #140's Covers text and #139's verified column (b029a29, 2026-11-13). timer-core stays `stale` here: its full run on b029a29 predates #140's LiveTab.jsx change, on which only TC-13 ran (5de8185). agenda-import takes #139's `current`; #140 changes none of its covered files. timer-core's #91 note now names the steps that reran on b029a29.
Closes #91
Plan:
.factory/plans/91-table-topics-role.md(rewritten 2026-11-13 for the new direction).Why
Simple Format import guessed a role whenever the bracket did not name one of your roles exactly. Verified on
deva4439d6:(Table Topics Speech)→Table Topics, not a rules key: Standard Speech timing, START refused (the original report).(Table Topics)→ a customTable Topics Master(10/20/30 s),(Speaker)→Keynote Speaker: the closest-match step from Simple Format import ignores custom roles in "Name (Custom Role)" lines #77 gives false positives.(Ice Breaker)with Ice Breaker hidden → still Ice Breaker, with Standard Speech rules. Defaults can be removed, so a fallback to them is not safe.The organizer finds out when the card changes colour at the wrong time. The first plan (fix the keyword ladder) kept the guessing; this PR drops it.
What changes
agenda_importedgainsneeds_role_count; a newagenda_role_pickedevent (is_custom).agendaItemNeedsRole), so rows saved earlier asTable Topics, and rows whose role you later removed, are highlighted too. Completed rows and breaks never are.findRoleByName,agendaItemNeedsRoleand a newparseSimpleFormatTextcontract ({ name, role, roleText }) inpackages/shared/simpleFormatParser.js;importBulkSpeakers(now returns{ count, needsRole }) andAgendaTabin both apps.matchCustomRoleanddetectRoleFromTextare removed (no callers left). EasySpeak's mapping is unchanged.Security
None. Client-side parsing and UI only.
Production impact
After release, master users who paste loosely named roles get highlighted rows to pick instead of a guessed role, in both the Zoom app and the web app. Agenda rows already saved with a role that is not in the user's list (e.g.
Table Topics) show highlighted. No flags, no migration, no API or sync format change. Rows synced to an older build keep their text asroleand norules; that build times them with Standard Speech, as it does today forTable Topics. Rollback is a revert.Testing
npm test: 2266 pass (116 files). New:apps/zoom-app/src/components/AgendaTab.test.jsx; rewrittensimpleFormatParser.test.js;importBulkSpeakerscases in bothTimerContext.test.jsx; needs-role cases in webAgendaTab.test.jsx.npm run test:e2e: 43 pass.zoom.timer-flowandweb.agenda-flowimport tests now expect 3 highlighted rows, the click guard and the picks; new Zoom test "(Table Topics Speech) times 1/1.5/2 min, (Table Topics) needs a pick (Simple Format import: ask for a role when the bracket doesn't name one, instead of guessing #91)" presses START.npm run test:specs: valid (8 specs).Evidence (real Zoom client)
Run 2026-11-13 14:06–14:27 EST on branch @ b029a29 (code 568a64d), deployed to dev as version a249d5d7 (committed vars), Zoom 7.2.5 on macOS 26.7.2. Log:
test-runs/2026-11-13-91-zoom-specs/run.md(local; the folder is git-excluded). Specs updated in 95fbaeb (status: current,verified_at: b029a29).agenda-import: IM-01…IM-06 all ✅
agenda_imported:items_count6,custom_role_count2,needs_role_count4.agenda_role_pickedevents.needs_role_count2 and twoagenda_role_pickedevents.timer-core: TC-01…TC-08, TC-10, TC-11 all ✅ (TC-09 and TC-12 ⏭, human)
zoom.host. The count-up shows on the video. Green, yellow and red came on at 0:36, 0:50 and 1:06 (thresholds 0:30/0:45/1:00). Finish reset the video. The backgrounds folder stayed at 12 files.timer_startedcarriedaudience_size: 1(host-only meeting).Substitutions: this device runs its own copy of Claude Test Club's list, which has 17 custom roles and hides every built-in. Listed roles stood in where the spec names a hidden built-in, so
is_customwas true on the picks. The spec'sneedsline and a run note under IM-06 now describe this.Not verified
localStorage(toastmaster_agenda,toastmaster_role_order) or the debug log'ssetVirtualBackgroundcounts. The rows on screen and PostHog stood in for them.Look here first
agendaItemNeedsRoleroleand gets norules:313)🤖 Generated with Claude Code