Skip to content

Commit e6e68e8

Browse files
committed
Add TPS cue matrix seed and fix release tests
1 parent 6a9715b commit e6e68e8

File tree

10 files changed

+213
-5
lines changed

10 files changed

+213
-5
lines changed
Lines changed: 164 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,164 @@
1+
---
2+
title: "TPS Cue Matrix"
3+
base_wpm: 140
4+
---
5+
6+
# TPS Cue Matrix
7+
8+
## [Cue Matrix|Speaker:Host|Archetype:Educator|140WPM|neutral|0:00-8:00]
9+
10+
### [Structure Baseline|Speaker:Host|Archetype:Educator|140WPM|neutral]
11+
Today we read baseline with steady confidence.
12+
13+
### [Pause Slash Cue|Speaker:Host|Archetype:Educator|140WPM|neutral]
14+
Today we read / slash with steady confidence.
15+
16+
### [Pause Double Slash Cue|Speaker:Host|Archetype:Educator|140WPM|neutral]
17+
Today we read // double with steady confidence.
18+
19+
### [Pause Half Second Cue|Speaker:Host|Archetype:Educator|140WPM|neutral]
20+
Today we read [pause:500ms] pause with steady confidence.
21+
22+
### [Pause One Second Cue|Speaker:Host|Archetype:Educator|140WPM|neutral]
23+
Today we read [pause:1s] silence with steady confidence.
24+
25+
### [Breath Cue|Speaker:Host|Archetype:Educator|140WPM|neutral]
26+
Today we read [breath] breath with steady confidence.
27+
28+
### [Xslow Pace Cue|Speaker:Host|Archetype:Educator|140WPM|neutral]
29+
Today we read [xslow]xslow[/xslow] with steady confidence.
30+
31+
### [Slow Pace Cue|Speaker:Host|Archetype:Educator|140WPM|neutral]
32+
Today we read [slow]slow[/slow] with steady confidence.
33+
34+
### [Normal Pace Cue|Speaker:Host|Archetype:Educator|140WPM|neutral]
35+
Today we read [normal]normal[/normal] with steady confidence.
36+
37+
### [Fast Pace Cue|Speaker:Host|Archetype:Educator|140WPM|neutral]
38+
Today we read [fast]fast[/fast] with steady confidence.
39+
40+
### [Xfast Pace Cue|Speaker:Host|Archetype:Educator|140WPM|neutral]
41+
Today we read [xfast]xfast[/xfast] with steady confidence.
42+
43+
### [Custom WPM Pace Cue|Speaker:Host|Archetype:Educator|140WPM|neutral]
44+
Today we read [180WPM]180wpm[/180WPM] with steady confidence.
45+
46+
### [Loud Volume Cue|Speaker:Host|Archetype:Educator|140WPM|neutral]
47+
Today we read [loud]loud[/loud] with steady confidence.
48+
49+
### [Soft Volume Cue|Speaker:Host|Archetype:Educator|140WPM|neutral]
50+
Today we read [soft]soft[/soft] with steady confidence.
51+
52+
### [Whisper Volume Cue|Speaker:Host|Archetype:Educator|140WPM|neutral]
53+
Today we read [whisper]whisper[/whisper] with steady confidence.
54+
55+
### [Warm Emotion Cue|Speaker:Host|Archetype:Educator|140WPM|neutral]
56+
Today we read [warm]warm[/warm] with steady confidence.
57+
58+
### [Urgent Emotion Cue|Speaker:Host|Archetype:Educator|140WPM|neutral]
59+
Today we read [urgent]urgent[/urgent] with steady confidence.
60+
61+
### [Excited Emotion Cue|Speaker:Host|Archetype:Educator|140WPM|neutral]
62+
Today we read [excited]excited[/excited] with steady confidence.
63+
64+
### [Happy Emotion Cue|Speaker:Host|Archetype:Educator|140WPM|neutral]
65+
Today we read [happy]happy[/happy] with steady confidence.
66+
67+
### [Sad Emotion Cue|Speaker:Host|Archetype:Educator|140WPM|neutral]
68+
Today we read [sad]sad[/sad] with steady confidence.
69+
70+
### [Calm Emotion Cue|Speaker:Host|Archetype:Educator|140WPM|neutral]
71+
Today we read [calm]calm[/calm] with steady confidence.
72+
73+
### [Energetic Emotion Cue|Speaker:Host|Archetype:Educator|140WPM|neutral]
74+
Today we read [energetic]energetic[/energetic] with steady confidence.
75+
76+
### [Professional Emotion Cue|Speaker:Host|Archetype:Educator|140WPM|neutral]
77+
Today we read [professional]professional[/professional] with steady confidence.
78+
79+
### [Focused Emotion Cue|Speaker:Host|Archetype:Educator|140WPM|neutral]
80+
Today we read [focused]focused[/focused] with steady confidence.
81+
82+
### [Concerned Emotion Cue|Speaker:Host|Archetype:Educator|140WPM|neutral]
83+
Today we read [concerned]concerned[/concerned] with steady confidence.
84+
85+
### [Motivational Emotion Cue|Speaker:Host|Archetype:Educator|140WPM|neutral]
86+
Today we read [motivational]motivational[/motivational] with steady confidence.
87+
88+
### [Neutral Emotion Cue|Speaker:Host|Archetype:Educator|140WPM|neutral]
89+
Today we read [neutral]neutral[/neutral] with steady confidence.
90+
91+
### [Aside Delivery Cue|Speaker:Host|Archetype:Educator|140WPM|neutral]
92+
Today we read [aside]aside[/aside] with steady confidence.
93+
94+
### [Rhetorical Delivery Cue|Speaker:Host|Archetype:Educator|140WPM|neutral]
95+
Today we read [rhetorical]rhetorical[/rhetorical] with steady confidence.
96+
97+
### [Building Delivery Cue|Speaker:Host|Archetype:Educator|140WPM|neutral]
98+
Today we read [building]building[/building] with steady confidence.
99+
100+
### [Sarcasm Delivery Cue|Speaker:Host|Archetype:Educator|140WPM|neutral]
101+
Today we read [sarcasm]sarcasm[/sarcasm] with steady confidence.
102+
103+
### [Legato Articulation Cue|Speaker:Host|Archetype:Educator|140WPM|neutral]
104+
Today we read [legato]legato[/legato] with steady confidence.
105+
106+
### [Staccato Articulation Cue|Speaker:Host|Archetype:Educator|140WPM|neutral]
107+
Today we read [staccato]staccato[/staccato] with steady confidence.
108+
109+
### [Energy Contour Cue|Speaker:Host|Archetype:Educator|140WPM|neutral]
110+
Today we read [energy:8]energy[/energy] with steady confidence.
111+
112+
### [Melody Contour Cue|Speaker:Host|Archetype:Educator|140WPM|neutral]
113+
Today we read [melody:3]melody[/melody] with steady confidence.
114+
115+
### [Highlight Editorial Cue|Speaker:Host|Archetype:Educator|140WPM|neutral]
116+
Today we read [highlight]highlight[/highlight] with steady confidence.
117+
118+
### [Emphasis Editorial Cue|Speaker:Host|Archetype:Educator|140WPM|neutral]
119+
Today we read [emphasis]emphasis[/emphasis] with steady confidence.
120+
121+
### [Bold Markdown Cue|Speaker:Host|Archetype:Educator|140WPM|neutral]
122+
Today we read **bold** with steady confidence.
123+
124+
### [Italic Markdown Cue|Speaker:Host|Archetype:Educator|140WPM|neutral]
125+
Today we read *italic* with steady confidence.
126+
127+
### [Pronunciation Guide Cue|Speaker:Host|Archetype:Educator|140WPM|neutral]
128+
Today we read [pronunciation:/prəˌnʌnsiˈeɪʃən/]pronunciation[/pronunciation] with steady confidence.
129+
130+
### [Phonetic Guide Cue|Speaker:Host|Archetype:Educator|140WPM|neutral]
131+
Today we read [phonetic:/fəˈnɛtɪk/]phonetic[/phonetic] with steady confidence.
132+
133+
### [Stress Guide Cue|Speaker:Host|Archetype:Educator|140WPM|neutral]
134+
Today we read [stress:rising]stress[/stress] with steady confidence.
135+
136+
### [Edit Point Cue|Speaker:Host|Archetype:Educator|140WPM|neutral]
137+
Today we read [edit_point] edit with steady confidence.
138+
139+
### [Edit Point Medium Cue|Speaker:Host|Archetype:Educator|140WPM|neutral]
140+
Today we read [edit_point:medium] medium with steady confidence.
141+
142+
### [Edit Point High Cue|Speaker:Host|Archetype:Educator|140WPM|neutral]
143+
Today we read [edit_point:high] high with steady confidence.
144+
145+
### [Speaker Metadata Cue|Speaker:Narrator|Archetype:Educator|140WPM|neutral]
146+
Today we read speaker with steady confidence.
147+
148+
### [Archetype Metadata Cue|Speaker:Host|Archetype:Coach|140WPM|neutral]
149+
Today we read archetype with steady confidence.
150+
151+
### [Phrase Slow Pace Cue|Speaker:Host|Archetype:Educator|140WPM|neutral]
152+
Today we read [slow]slow cadence[/slow] with confidence.
153+
154+
### [Phrase Urgent Emotion Cue|Speaker:Host|Archetype:Educator|140WPM|neutral]
155+
Today we read [urgent]urgent cadence[/urgent] with confidence.
156+
157+
### [Phrase Loud Volume Cue|Speaker:Host|Archetype:Educator|140WPM|neutral]
158+
Today we read [loud]loud cadence[/loud] with confidence.
159+
160+
### [Phrase Building Delivery Cue|Speaker:Host|Archetype:Educator|140WPM|neutral]
161+
Today we read [building]building cadence[/building] with confidence.
162+
163+
### [Phrase Legato Articulation Cue|Speaker:Host|Archetype:Educator|140WPM|neutral]
164+
Today we read [legato]legato cadence[/legato] with confidence.

src/PrompterOne.Shared/Library/Services/Storage/BrowserStorageKeys.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ public static class BrowserStorageKeys
77
public const string EditorLocalHistoryKeyPrefix = "editor-local-history.";
88
public const string FolderLibrary = "prompterone.folders.v1";
99
public const string FolderSeedVersion = "prompterone.folders.seed-version";
10-
public const string LibraryMaterializationVersion = "2026-04-01-browser-library-materialized-v1";
10+
public const string LibraryMaterializationVersion = "2026-04-16-tps-cue-matrix-seed-v1";
1111
public const string SettingsPrefix = "prompterone.settings.";
1212
public const string CultureSetting = SettingsPrefix + "culture";
1313
}

src/PrompterOne.Shared/Library/Services/Storage/RuntimeLibrarySeedCatalog.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@ internal static class RuntimeLibrarySeedCatalog
2626
new("starter-security-incident-script", "Security Incident", "starter-security-incident.tps", "starter-news-reports"),
2727
new("starter-ted-leadership-script", "TED: Leadership", "starter-ted-leadership.tps", "starter-ted-talks"),
2828
new("starter-green-architecture-script", "Green Architecture", "starter-green-architecture.tps", "starter-investors"),
29-
new("starter-quantum-computing-script", "Quantum Computing", "starter-quantum-computing.tps", "starter-internal")
29+
new("starter-quantum-computing-script", "Quantum Computing", "starter-quantum-computing.tps", "starter-internal"),
30+
new("starter-tps-cue-matrix-script", "TPS Cue Matrix", "starter-tps-cue-matrix.tps", "starter-internal")
3031
];
3132

3233
private static readonly DateTimeOffset[] DocumentTimestamps =
@@ -35,7 +36,8 @@ internal static class RuntimeLibrarySeedCatalog
3536
new(2026, 3, 24, 8, 30, 0, TimeSpan.Zero),
3637
new(2026, 3, 20, 12, 0, 0, TimeSpan.Zero),
3738
new(2026, 3, 18, 10, 15, 0, TimeSpan.Zero),
38-
new(2026, 3, 15, 16, 45, 0, TimeSpan.Zero)
39+
new(2026, 3, 15, 16, 45, 0, TimeSpan.Zero),
40+
new(2026, 4, 16, 10, 0, 0, TimeSpan.Zero)
3941
];
4042

4143
public static IReadOnlyList<StoredLibraryFolder> CreateFolders() =>

src/PrompterOne.Shared/PrompterOne.Shared.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
<EmbeddedResource Include="Library/SeedData/starter-ted-leadership.tps" />
2929
<EmbeddedResource Include="Library/SeedData/starter-green-architecture.tps" />
3030
<EmbeddedResource Include="Library/SeedData/starter-quantum-computing.tps" />
31+
<EmbeddedResource Include="Library/SeedData/starter-tps-cue-matrix.tps" />
3132
</ItemGroup>
3233

3334
</Project>

tests/PrompterOne.Web.Tests/Library/LibraryBootstrapStateTests.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ public void LibraryPage_RendersRuntimeStartupSeeds_WhenHarnessSkipsTestFixtures(
2121
Assert.NotNull(cut.FindByTestId(UiTestIds.Library.FolderCreateTile));
2222
Assert.Contains(AppTestData.Scripts.DemoTitle, cut.Markup, StringComparison.Ordinal);
2323
Assert.Contains(AppTestData.Scripts.TedLeadershipTitle, cut.Markup, StringComparison.Ordinal);
24+
Assert.Contains(AppTestData.Scripts.TpsCueMatrixTitle, cut.Markup, StringComparison.Ordinal);
2425
Assert.DoesNotContain(UiTestIds.Library.FolderChips, cut.Markup, StringComparison.Ordinal);
2526
});
2627
}

tests/PrompterOne.Web.Tests/Library/LibraryFixtureContractTests.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ public sealed class LibraryFixtureContractTests
44
{
55
private static readonly string RepoRoot = ResolveRepoRoot();
66
private static readonly string RootDesignFolder = Path.Combine(RepoRoot, "design");
7+
private static readonly string StarterTpsCueMatrixSeed = Path.Combine(RepoRoot, "src", "PrompterOne.Shared", "Library", "SeedData", "starter-tps-cue-matrix.tps");
8+
private static readonly string TpsCueMatrixFixture = Path.Combine(RepoRoot, "tests", "TestData", "Scripts", "test-tps-cue-matrix.tps");
79
private static readonly string[] FixtureRoots =
810
[
911
Path.Combine(RepoRoot, "src", "PrompterOne.Shared", "Library", "SeedData"),
@@ -42,6 +44,12 @@ public void RepoOwnedTpsFixtures_DoNotContainDisplayMetricOverrides()
4244
Assert.True(offenders.Length == 0, string.Join(Environment.NewLine, offenders));
4345
}
4446

47+
[Test]
48+
public void RuntimeTpsCueMatrixSeed_MatchesScreenshotFixture()
49+
{
50+
Assert.Equal(File.ReadAllText(TpsCueMatrixFixture), File.ReadAllText(StarterTpsCueMatrixSeed));
51+
}
52+
4553
private static string ResolveRepoRoot() =>
4654
Path.GetFullPath(Path.Combine(AppContext.BaseDirectory, "../../../../../"));
4755
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
using PrompterOne.Shared.Services;
2+
3+
namespace PrompterOne.Web.Tests;
4+
5+
public sealed class RuntimeLibrarySeedCatalogTests
6+
{
7+
private const string PronunciationCue = "[pronunciation:/prəˌnʌnsiˈeɪʃən/]pronunciation[/pronunciation]";
8+
private const string PhoneticCue = "[phonetic:/fəˈnɛtɪk/]phonetic[/phonetic]";
9+
private const string PhraseLegatoCue = "[legato]legato cadence[/legato]";
10+
private const string DeprecatedColorCue = "[red]";
11+
12+
[Test]
13+
public void RuntimeSeedCatalog_IncludesFullTpsCueMatrixStarterScript()
14+
{
15+
var document = Assert.Single(
16+
RuntimeLibrarySeedCatalog.CreateDocuments(),
17+
candidate => string.Equals(candidate.Id, AppTestData.Scripts.RuntimeTpsCueMatrixId, StringComparison.Ordinal));
18+
19+
Assert.Equal(AppTestData.Scripts.TpsCueMatrixTitle, document.Title);
20+
Assert.Equal(AppTestData.Scripts.RuntimeTpsCueMatrixDocumentName, document.DocumentName);
21+
Assert.Equal(AppTestData.Folders.RuntimeInternalId, document.FolderId);
22+
Assert.Contains(PronunciationCue, document.Text, StringComparison.Ordinal);
23+
Assert.Contains(PhoneticCue, document.Text, StringComparison.Ordinal);
24+
Assert.Contains(PhraseLegatoCue, document.Text, StringComparison.Ordinal);
25+
Assert.DoesNotContain(DeprecatedColorCue, document.Text, StringComparison.Ordinal);
26+
}
27+
}

tests/PrompterOne.Web.Tests/Support/AppTestData.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ public static class Scripts
1717
public const string ReaderTimingId = "test-reader-timing-script";
1818
public const string SecurityIncidentId = "test-security-incident-script";
1919
public const string SpeedOffsetsId = "test-tps-speed-offsets-script";
20+
public const string RuntimeTpsCueMatrixDocumentName = "starter-tps-cue-matrix.tps";
21+
public const string RuntimeTpsCueMatrixId = "starter-tps-cue-matrix-script";
2022
public const string DemoTitle = "Product Launch";
2123
public const string TedLeadershipTitle = "TED: Leadership";
2224
public const string GreenArchitectureTitle = "Green Architecture";
@@ -25,6 +27,7 @@ public static class Scripts
2527
public const string ReaderTimingTitle = "Reader Timing Probe";
2628
public const string SecurityIncidentTitle = "Security Incident";
2729
public const string SpeedOffsetsTitle = "TPS Speed Offsets";
30+
public const string TpsCueMatrixTitle = "TPS Cue Matrix";
2831
public const string BroadcastMic = "Broadcast mic";
2932
}
3033

@@ -42,6 +45,7 @@ public static class Folders
4245
public const string InvestorsName = "Investors";
4346
public const string InternalId = "test-internal";
4447
public const string InternalName = "Internal";
48+
public const string RuntimeInternalId = "starter-internal";
4549
public const string RoadshowsId = "roadshows";
4650
public const string Roadshows = "Roadshows";
4751
}

tests/PrompterOne.Web.Tests/Teleprompter/TeleprompterFidelityTests.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ public sealed class TeleprompterFidelityTests : BunitContext
1818
private const string IntroductionWord = "comes";
1919
private const int InspirationCardIndex = 6;
2020
private const double MaximumVisibleFastLetterSpacingEm = -0.001d;
21+
private const double MinimumVisibleOffsetSlowLetterSpacingEm = 0.03d;
2122
private const double MinimumVisibleSlowLetterSpacingEm = 0.09d;
2223
private const string MaximumReaderWidthLabel = "100%";
2324
private const string MaximumReaderWidthValue = "100";
@@ -156,7 +157,7 @@ public void TeleprompterPage_UsesCustomFrontMatterSpeedOffsetsAndNormalReset()
156157
Assert.Equal(SpeedOffsetsSlowWpm, slowWord.GetAttribute(UiDataAttributes.Teleprompter.EffectiveWordsPerMinute));
157158
Assert.Null(slowWord.GetAttribute("title"));
158159
Assert.Contains("--tps-word-letter-spacing:", slowWord.GetAttribute("style"), StringComparison.Ordinal);
159-
Assert.True(GetLetterSpacingEm(slowWord) >= MinimumVisibleSlowLetterSpacingEm);
160+
Assert.True(GetLetterSpacingEm(slowWord) >= MinimumVisibleOffsetSlowLetterSpacingEm);
160161

161162
Assert.Equal("140", normalWord.GetAttribute(UiDataAttributes.Teleprompter.EffectiveWordsPerMinute));
162163
Assert.DoesNotContain(

tests/PrompterOne.Web.UITests.Shell/Library/LibraryScreenFlowTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -204,7 +204,7 @@ await UiInteractionDriver.ClickAndWaitForVisibleAsync(
204204
await Expect(leadershipDropdown).ToBeVisibleAsync();
205205
await Expect(demoDropdown).ToBeHiddenAsync();
206206

207-
await UiInteractionDriver.ClickAndContinueAsync(page.GetByTestId(BrowserTestConstants.Elements.QuantumCard));
207+
await UiInteractionDriver.ClickAndContinueAsync(page.GetByTestId(UiTestIds.Library.FolderAll));
208208
await Expect(leadershipDropdown).ToBeHiddenAsync();
209209
await Assert.That(new Uri(page.Url).AbsolutePath).IsEqualTo(BrowserTestConstants.Routes.Library);
210210
});

0 commit comments

Comments
 (0)