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
24 changes: 24 additions & 0 deletions learn/output/Create-And-Manage-Groups-And-Policies/BRIEF.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# Create and Manage Groups and Policies

- **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\6-create-manage-groups-policies.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.
185 changes: 185 additions & 0 deletions learn/output/Create-And-Manage-Groups-And-Policies/anchors.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,185 @@
// 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 = {
"cta_admin_unit": 256.31,
"cta_admin_unitEnd": 258.22,
"cta_handles": 252.33,
"cta_handlesEnd": 254.52,
"cta_learn": 262.35,
"cta_learnEnd": 264.72,
"cta_next": 255.57,
"cta_nextEnd": 256.31,
"cta_slice": 259.87,
"cta_sliceEnd": 262.04,
"expire_covered": 225.67,
"expire_coveredEnd": 227.57,
"expire_covers": 219.24,
"expire_coversEnd": 222.16,
"expire_deleted": 208.59,
"expire_deletedEnd": 209.96,
"expire_license": 224.25,
"expire_licenseEnd": 225.67,
"expire_lifetime": 197.68,
"expire_lifetimeEnd": 199.6,
"expire_nears": 199.72,
"expire_nearsEnd": 201.05,
"expire_one": 216.59,
"expire_oneEnd": 219.12,
"expire_outliving": 184.21,
"expire_outlivingEnd": 186.17,
"expire_ownergone": 191.14,
"expire_ownergoneEnd": 193.72,
"expire_owners_renew": 201.67,
"expire_owners_renewEnd": 203.44,
"expire_policy": 194.14,
"expire_policyEnd": 195.96,
"expire_renew": 205.0,
"expire_renewEnd": 207.36,
"expire_restore": 210.87,
"expire_restoreEnd": 213.28,
"expire_sametier": 228.97,
"expire_sametierEnd": 231.31,
"expire_scope": 222.29,
"expire_scopeEnd": 224.0,
"expire_sixmonth": 186.17,
"expire_sixmonthEnd": 187.6,
"expire_tenant": 215.6,
"expire_tenantEnd": 216.59,
"expire_three": 213.41,
"expire_threeEnd": 214.86,
"expire_tidy": 181.11,
"expire_tidyEnd": 182.6,
"expire_twoyears": 188.13,
"expire_twoyearsEnd": 190.24,
"hook_two_options": 23.09,
"hook_two_optionsEnd": 24.76,
"member_assigned": 74.76,
"member_assignedEnd": 77.08,
"member_auto": 86.81,
"member_autoEnd": 88.72,
"member_dynamic": 83.06,
"member_dynamicEnd": 85.0,
"member_dynamic_label": 80.85,
"member_dynamic_labelEnd": 82.36,
"member_hiring": 90.85,
"member_hiringEnd": 92.68,
"member_manual": 77.71,
"member_manualEnd": 79.83,
"member_verdict": 94.36,
"member_verdictEnd": 95.56,
"naming_blocks": 173.56,
"naming_blocksEnd": 175.59,
"naming_chaos": 164.17,
"naming_chaosEnd": 166.0,
"naming_everynew": 171.6,
"naming_everynewEnd": 173.32,
"naming_nesting": 154.28,
"naming_nestingEnd": 156.48,
"naming_p1": 177.3,
"naming_p1End": 181.04,
"naming_policy": 166.0,
"naming_policyEnd": 168.92,
"naming_prefix": 169.67,
"naming_prefixEnd": 171.6,
"naming_selfservice": 160.53,
"naming_selfserviceEnd": 162.1,
"naming_structure": 156.74,
"naming_structureEnd": 158.43,
"nest_child_member": 122.4,
"nest_child_memberEnd": 124.08,
"nest_direct": 127.99,
"nest_directEnd": 129.64,
"nest_dont": 120.13,
"nest_dontEnd": 121.12,
"nest_flows": 117.69,
"nest_flowsEnd": 120.0,
"nest_folders": 115.06,
"nest_foldersEnd": 116.16,
"nest_free": 104.38,
"nest_freeEnd": 105.96,
"nest_inherits": 102.09,
"nest_inheritsEnd": 103.91,
"nest_license": 125.25,
"nest_licenseEnd": 126.03,
"nest_pickup": 111.53,
"nest_pickupEnd": 113.36,
"nest_predict": 107.56,
"nest_predictEnd": 109.28,
"nest_removed": 131.6,
"nest_removedEnd": 132.64,
"nest_structure": 99.85,
"nest_structureEnd": 101.96,
"nest_tidy": 97.33,
"nest_tidyEnd": 98.68,
"nest_whiteboard": 95.69,
"nest_whiteboardEnd": 97.2,
"obj_choices": 34.72,
"obj_choicesEnd": 36.56,
"obj_clutter": 41.84,
"obj_clutterEnd": 43.48,
"obj_gain": 32.0,
"obj_gainEnd": 34.12,
"obj_lose": 30.18,
"obj_loseEnd": 31.84,
"obj_members": 37.29,
"obj_membersEnd": 39.04,
"obj_policies": 39.24,
"obj_policiesEnd": 40.16,
"obj_wrong": 27.85,
"obj_wrongEnd": 29.24,
"recap_cascade": 245.13,
"recap_cascadeEnd": 246.42,
"recap_clean": 248.79,
"recap_cleanEnd": 250.24,
"recap_collab": 236.76,
"recap_collabEnd": 238.98,
"recap_dynamic": 239.11,
"recap_dynamicEnd": 240.68,
"recap_naming": 246.64,
"recap_namingEnd": 248.66,
"recap_nesting": 242.69,
"recap_nestingEnd": 244.19,
"recap_start": 232.84,
"recap_startEnd": 235.0,
"rule_assigned": 144.79,
"rule_assignedEnd": 146.16,
"rule_buried": 139.95,
"rule_buriedEnd": 141.49,
"rule_invisible": 141.88,
"rule_invisibleEnd": 143.51,
"rule_licensing": 136.65,
"rule_licensingEnd": 139.95,
"rule_population": 151.15,
"rule_populationEnd": 152.4,
"rule_question": 147.96,
"rule_questionEnd": 150.72,
"rule_quirk": 134.92,
"rule_quirkEnd": 136.52,
"title_admin": 10.76,
"title_adminEnd": 11.96,
"title_hook": 13.85,
"title_hookEnd": 15.65,
"title_licenses": 17.5,
"title_licensesEnd": 19.75,
"title_team": 20.65,
"title_teamEnd": 22.85,
"types_apps": 51.76,
"types_appsEnd": 55.32,
"types_collab": 63.0,
"types_collabEnd": 65.52,
"types_hold": 55.87,
"types_holdEnd": 59.2,
"types_m365": 59.2,
"types_m365End": 62.29,
"types_only_users": 65.87,
"types_only_usersEnd": 68.12,
"types_security": 49.24,
"types_securityEnd": 51.76,
"types_start": 43.65,
"types_startEnd": 45.4,
"types_twokinds": 45.53,
"types_twokindsEnd": 46.84,
"types_verdict": 70.45,
"types_verdictEnd": 72.84
};
95 changes: 95 additions & 0 deletions learn/output/Create-And-Manage-Groups-And-Policies/anchors.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,95 @@
{
"_about": "Cue name -> exact spoken phrase from narration. Resolved to real audio times by tools/word_anchors.py against transcript.json with --lead-in 3.0 (the silent bumper). Phrases are contiguous, unambiguous runs of TRANSCRIPT tokens (punctuation- and case-insensitive) — ASR spellings, not script spellings.",
"_note_asr": "Whisper renders 'Entra' as 'Enter', 'Relecloud' as 'Relek Cloud', and 'thirty days' as '30 days'. Anchor phrases below use the ASR spelling so they resolve; the narration itself is unchanged.",
"_note_p1p2": "naming_p1 / expire_license resolved cleanly: ASR kept 'P1' and 'P2' as single tokens.",
"title_admin": "An admin at Relek Cloud",
"title_hook": "planning access for a new office",
"title_licenses": "the same policy and the same licenses",
"title_team": "engineering team already has",
"hook_two_options": "Two options go up on the board",
"obj_wrong": "Get that choice wrong",
"obj_lose": "either lose access they need",
"obj_gain": "gain access they shouldn't",
"obj_choices": "pick the right group type",
"obj_members": "people become members",
"obj_policies": "set the policies",
"obj_clutter": "sliding into clutter",
"types_start": "Start with the type",
"types_twokinds": "Two kinds of group",
"types_security": "A security group manages access",
"types_apps": "apps, files, conditional access, licenses",
"types_hold": "hold users, devices, even service principles",
"types_m365": "A Microsoft 365 group is for collaboration",
"types_collab": "a shared mailbox calendar and site",
"types_only_users": "it holds only users",
"types_verdict": "so a security group it is",
"member_assigned": "With assigned membership",
"member_manual": "adds and removes each person",
"member_dynamic_label": "With dynamic membership",
"member_dynamic": "reads user attributes",
"member_auto": "updates the group automatically",
"member_hiring": "For an office that's still hiring",
"member_verdict": "the next starter",
"nest_whiteboard": "Back to that whiteboard",
"nest_tidy": "The tidy option is a small",
"nest_structure": "nested inside all engineering",
"nest_inherits": "it inherits the parents licenses",
"nest_free": "access for free",
"nest_predict": "take a guess",
"nest_pickup": "actually pick those up",
"nest_folders": "work like folders",
"nest_flows": "flows down to whatever's inside",
"nest_dont": "Groups don't behave",
"nest_child_member": "makes the child group a member",
"nest_license": "but a license or",
"nest_direct": "the parent's direct members",
"nest_removed": "two steps removed",
"rule_quirk": "isn't a one-off quirk",
"rule_licensing": "Group-based licensing resolves direct members only",
"rule_buried": "A user buried a level",
"rule_invisible": "is invisible to it",
"rule_assigned": "is assigned to a group",
"rule_question": "who are this group's direct members",
"rule_population": "the only population",
"naming_nesting": "So nesting won't rescue this plan",
"naming_structure": "structure still matters",
"naming_selfservice": "Once people create their own",
"naming_chaos": "names drift into chaos",
"naming_policy": "A group naming policy fixes that",
"naming_prefix": "a required prefix or suffix",
"naming_everynew": "on every new name",
"naming_blocks": "it blocks words you don't want",
"naming_p1": "needs Microsoft Enter ID P1",
"expire_tidy": "Naming keeps names tidy",
"expire_outliving": "outliving their purpose",
"expire_sixmonth": "A six-month project group",
"expire_twoyears": "still around two years later",
"expire_ownergone": "members unsure why they're there",
"expire_policy": "expiration policy gives each",
"expire_lifetime": "a lifetime in days",
"expire_nears": "As it nears the end",
"expire_owners_renew": "asks the owners to renew",
"expire_renew": "renews itself automatically",
"expire_deleted": "renews gets deleted",
"expire_restore": "restorable for 30 days",
"expire_three": "Three details worth keeping",
"expire_tenant": "A tenant gets",
"expire_one": "exactly one expiration policy",
"expire_covers": "it covers all your Microsoft 365 groups",
"expire_scope": "or a selected subset",
"expire_license": "it needs P1 or P2",
"expire_covered": "for the members it covers",
"expire_sametier": "the naming policy relies on",
"recap_start": "security groups for access",
"recap_collab": "groups for collaboration",
"recap_dynamic": "dynamic membership to keep",
"recap_nesting": "Nesting that reaches direct",
"recap_cascade": "never a cascade",
"recap_naming": "naming and expiration policies",
"recap_clean": "keeping the estate clean",
"cta_handles": "That handles the groups themselves",
"cta_next": "Next, see how",
"cta_admin_unit": "an administrative unit scopes",
"cta_slice": "one slice of the directory",
"cta_learn": "the full unit on Microsoft Learn"
}
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