@jokerized/decksmith 0.3.0 → 0.3.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -242,6 +242,70 @@ export declare function scanUnusedFigures(storyboard: Storyboard, source: Source
242
242
  * decision cannot be made by accident.
243
243
  */
244
244
  export declare function scanBeatCount(storyboard: Storyboard, prefs: Prefs): Finding[];
245
+ /**
246
+ * Where a paper-shaped deck missed the shape it was asked for.
247
+ *
248
+ * SILENT UNLESS THE ARC WAS DECLARED. `prefs.genre` defaults to `general`, so
249
+ * every deck built before this existed, and every deck whose author did not say
250
+ * `--genre paper`, gets exactly nothing from this scan. That is not timidity: a
251
+ * ten-role heading lexicon over all 351 markdown files in this repository found
252
+ * 345 with zero hits, so there is no honest way to infer the genre, and a scan
253
+ * that guessed would mislabel the Korean fixture and every hypepaper analysis
254
+ * the tool actually ingests.
255
+ *
256
+ * REPORTED, NEVER REPAIRED, and a WARNING. It joins the four scans that already
257
+ * take that shape, and `scanBeatCount`'s header settles the class: `build`
258
+ * prints every content loss and fails on none of them, because the alternative
259
+ * is re-asking, and the only possible second instruction — "return more" — is a
260
+ * padding request with extra steps. Promoting this one is a decision about all
261
+ * of them.
262
+ *
263
+ * WHAT IT CANNOT DO. It cannot tell whether a beat labelled `limitations` really
264
+ * discusses one; `role` is the plan's own declaration, and a declaration can be
265
+ * false. What it checks instead is the part that is mechanical and that no
266
+ * committed plan has ever got right on its own: that the roles exist, that they
267
+ * are unique, that the ending is in the right ORDER, and that the closing pair
268
+ * does not collapse into two of the same picture. A rule about wording would be
269
+ * met cosmetically, exactly as `scanHeadlines` records a sharpened rule being
270
+ * answered by swapping one verb.
271
+ */
272
+ export declare function scanPaperArc(storyboard: Storyboard, prefs: Prefs): Finding[];
273
+ /**
274
+ * Narration that belongs to a different version of this storyboard.
275
+ *
276
+ * `narration.json` is keyed by BEAT ID and carries nothing that ties it to the
277
+ * plan it was made for, so an id that still exists is an id `build` will happily
278
+ * speak — even when the beat behind it has been replaced. Renumbering is the way
279
+ * in: inserting one beat and shifting the ids after it leaves every later id
280
+ * pointing at its neighbour's voice.
281
+ *
282
+ * FOUND IN THE SHIPPED DEMO, and it is the seventh green-gate case this project
283
+ * has recorded. A thirteenth beat was inserted at position six and the rest
284
+ * renumbered; the audio on disk predated it, so beats six through twelve each
285
+ * spoke the slide after them and the thirteenth spoke nothing. `build` reported
286
+ * `PASS — 0 error(s), 0 warning(s)`, because every id it looked for was present
287
+ * and nothing compared what was SAID against what the beat says it says.
288
+ *
289
+ * AN ERROR, NOT A WARNING, and it is the one member of this family that earns
290
+ * it. The other storyboard scans are editorial judgements only an author can
291
+ * settle; this is a string comparison between two authored fields that must
292
+ * agree, and the artifact it lets through is a video whose voice describes the
293
+ * wrong pictures. Missing narration audio is already an error here, and audio
294
+ * that is present and wrong is not the better failure.
295
+ *
296
+ * NARROW ON PURPOSE. It compares only beats that have BOTH a narration text and
297
+ * segments, so a deck narrated at a lower density — where some beats are
298
+ * deliberately silent — says nothing, and the existing missing-audio error keeps
299
+ * its own case. Whitespace is normalised because the splitter re-joins sentences
300
+ * at stop boundaries; on the demo's thirteen beats the concatenation reproduces
301
+ * the authored text exactly, which is what makes the comparison safe to make
302
+ * fatal.
303
+ */
304
+ export declare function scanNarrationDrift(storyboard: Storyboard, narration: {
305
+ beats: Record<string, {
306
+ text: string;
307
+ }[]>;
308
+ }): Finding[];
245
309
  /**
246
310
  * How far a name may precede the thing it names before a viewer notices.
247
311
  *
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jokerized/decksmith",
3
- "version": "0.3.0",
3
+ "version": "0.3.2",
4
4
  "description": "Turn a source document into an animated explanation deck.",
5
5
  "type": "module",
6
6
  "license": "MIT",