Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# Scope Administration with Administrative Units

- **Profile:** `unit-video` — Unit video (~4 min)
- **Target:** ~240s content (180–300s), word budget 435–726 (target 580) @ 2.42 w/s
- **Scenes:** aim ~10 (chrome 5 stamped + ~5-16 body)
- **Max static hold:** 5.0s · **Voice:** en-US-Ava:DragonHDLatestNeural
- **Source:** C:\learn-pr\learn-m365-pr\learn-m365-pr\wwl\provision-govern-identities-entra\includes\7-scope-administrative-units.md

## Fill the placeholders

Every `__FILL__` below must be replaced before render (guarded by `tools/check_placeholders.py`).

- `opening.bumper` → [scenes/01-bumper.html](scenes/01-bumper.html)
- `opening.title` → [scenes/02-title.html](scenes/02-title.html)
- `opening.objectives` → [scenes/03-objectives.html](scenes/03-objectives.html)
- `closing.recap` → [scenes/90-recap.html](scenes/90-recap.html)
- `closing.cta` → [scenes/91-cta.html](scenes/91-cta.html)

## Next steps

1. Write the script + beat plan (script-writer) and fill the chrome placeholders above.
2. Author the teaching-body scenes into `scenes/` and insert them into `scenes.json` between the opening and closing chrome (see `scenes.json` → `body_slot`).
3. Run the gated pipeline (voice → fact-check QA → build → snapshot QA → render).
4. Guard: `py tools/check_placeholders.py --project .` must be clean before render.
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
// GENERATED by tools/word_anchors.py - do not hand-edit.
// Every value is a REAL spoken-word time from transcript.json,
// with a 3.0s lead-in applied. Regenerate after any re-record.
window.__anchors = {
"au_holds_types": 65.02,
"au_holds_typesEnd": 67.88,
"au_scoped_objects": 72.76,
"au_scoped_objectsEnd": 75.64,
"beat10_start": 163.52,
"beat10_startEnd": 164.9,
"beat11_start": 184.54,
"beat11_startEnd": 187.32,
"beat12_start": 205.03,
"beat12_startEnd": 208.27,
"beat13_start": 222.13,
"beat13_startEnd": 224.17,
"beat4_start": 41.06,
"beat4_startEnd": 42.96,
"beat5_start": 58.65,
"beat5_startEnd": 60.87,
"beat6_start": 83.85,
"beat6_startEnd": 86.08,
"beat7_start": 103.88,
"beat7_startEnd": 106.76,
"beat8_start": 122.64,
"beat8_startEnd": 124.7,
"beat9_start": 146.33,
"beat9_startEnd": 148.82,
"constraint_no_group": 179.63,
"constraint_no_groupEnd": 181.61,
"constraint_object_type": 167.31,
"constraint_object_typeEnd": 169.51,
"cta_exercise": 224.57,
"cta_exerciseEnd": 226.8,
"fix_add_directly": 156.96,
"fix_add_directlyEnd": 159.59,
"hook_one_slice": 21.02,
"hook_one_sliceEnd": 22.83,
"licensing_covers": 191.82,
"licensing_coversEnd": 194.45,
"licensing_free": 196.37,
"licensing_freeEnd": 198.11,
"objectives_boundary": 28.7,
"objectives_boundaryEnd": 29.96,
"overprivilege_hq": 55.85,
"overprivilege_hqEnd": 58.6,
"populate_dynamic": 95.25,
"populate_dynamicEnd": 97.38,
"predict_question": 120.41,
"predict_questionEnd": 122.6,
"recap_scoped": 206.87,
"recap_scopedEnd": 208.27,
"reveal_group_scope": 126.16,
"reveal_group_scopeEnd": 128.09,
"reveal_two_steps": 140.12,
"reveal_two_stepsEnd": 141.8,
"rule_direct_membership": 151.89,
"rule_direct_membershipEnd": 153.3,
"shortcut_group": 108.73,
"shortcut_groupEnd": 110.12
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
{
"_note": "Cue name -> the exact spoken phrase the cue must land on. The builder resolves these to real audio times with tools/word_anchors.py against transcript.json (word-level). Phrases are matched punctuation- and case-insensitive as a contiguous token run; each is unique in narration.txt. Keys starting with '_' are ignored.",
"_scene_02_title": "opening title card",
"hook_one_slice": "one slice of the directory",
"_scene_03_objectives": "objectives chips",
"objectives_boundary": "draws that boundary",
"_beat_over_privilege": "tenant-scoped role reaches everyone",
"overprivilege_hq": "the executives back at headquarters",
"_beat_boundary_spine": "administrative unit boundary + scoped role",
"au_holds_types": "holds users, groups, or devices",
"au_scoped_objects": "only to the objects that unit contains",
"_beat_populate": "assigned vs dynamic membership",
"populate_dynamic": "populate it automatically",
"_beat_shortcut_predict": "the group shortcut question",
"shortcut_group": "New Office, All Staff",
"predict_question": "for the people in the group",
"_beat_reveal_spine": "group in scope, members two steps removed",
"reveal_group_scope": "the group object into scope",
"reveal_two_steps": "two steps removed",
"_beat_rule_fix": "direct membership only + the fix",
"rule_direct_membership": "direct membership only",
"fix_add_directly": "add the users to the unit directly",
"_beat_dynamic_constraint": "one object type, no groups",
"constraint_object_type": "exactly one object type",
"constraint_no_group": "can't hold a group at all",
"_beat_licensing": "P1 per member vs Free",
"licensing_covers": "every user or device the rule covers",
"licensing_free": "a Free license covers members",
"_scene_90_recap": "recap payoff",
"recap_scoped": "scoped correctly now",
"_scene_91_cta": "call to action",
"cta_exercise": "build one of these units yourself",
"beat4_start": "Start with what goes wrong",
"beat5_start": "An administrative unit is the boundary",
"beat6_start": "So how do you fill the unit",
"beat7_start": "But first, a shortcut that looks easier",
"beat8_start": "The answer is no",
"beat9_start": "It's the same rule nested groups follow",
"beat10_start": "Dynamic membership has a catch",
"beat11_start": "One last factor: cost",
"beat12_start": "So the regional admin's reach is scoped correctly now",
"beat13_start": "A hands-on exercise right after this"
}
Binary file not shown.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

Large diffs are not rendered by default.

Loading
Loading