Ledger Tech-Talk Refresh
Turn adjudicated routing decisions into complete, validated tech-talk updates. The ledger selects work; linked first-party sources establish facts; the existing refresh skills control content and deck quality.
Inputs
- Required ledger:
.github/content-routing/ledger.json - Target: one talk slug, a user-provided set of slugs, or
all - Mode:
plan-only: create proposed refresh plans and stop for approvalapply: create and apply plans through README, recipe, slides, validation, and ledger closure
- Optional user emphasis or priority
When the user names a talk without a mode, default to plan-only. A direct request to implement, apply, complete, or refresh the queue counts as approval for apply mode.
An explicit all apply invocation approves every generated talk plan in that serial queue. Do not pause between talks unless verification materially changes scope, evidence is unresolved, or a required validation fails.
Composition
Invoke existing repository workflows rather than reproducing them:
content-refreshfor evidence verification andcontent.refresh.ymldeck-recipe-refreshonly whenrecipeReview.requiredis true- Existing-deck patch for
slideImpact: patch; Tech Talk Slide Generator only forregenerateorreplace-demo build-slidev-decksfor single-deck validation when slides changedworkbenchfor relevant cross-talk context and end-of-session learning
Queue Selection
Read the ledger and select only decisions where:
decision.statusisproposal-createddecision.materialityisreference,content, orstructuraldecision.talkmatches the requested target
Group selected decisions by talk. Every talk gets one refresh plan containing all of its selected events; never create one plan per event.
For all, process talks serially. Prioritize:
- Deprecations, retirements, deadlines, broken setup, or incorrect claims
- Product behavior, controls, security boundaries, and setup changes
- Supporting evidence, metrics, examples, and references
Within the same priority, prefer the talk that explains the feature before talks that apply, govern, depend on, or reference it. Do not edit the same ledger or generated index concurrently.
If no matching proposals remain:
- Named talk: do not stop. Hand off to
content-refreshwith cutoff = READMEupdated, runnpm run content:route -- --since <cutoff>, and check first-party product sources. An empty ledger means "no adjudicated inbox item," not "the talk is current." allwith no named talk: report that the inbox is empty and stop.
Pre-Flight Per Talk
Before generating a plan:
- Confirm
tech-talks/<talk>/README.mdexists. - Read frontmatter and stop if
status: archived. - Read major README sections and
deck.recipe.ymlwhen present. - Read every selected ledger event, materiality, reason, and source from the latest routing report.
- Read relevant Workbench topic maps for cross-cutting subjects.
- Check for an existing
content.refresh.yml:- Merge still-relevant uncompleted evidence.
- Preserve validated work already represented in the README.
- Overwrite stale or superseded planning data using the current template.
The local hypothesis must be explicit: identify which current claim, workflow, setup step, decision rule, status, demo, or boundary is changed by the ledger evidence. The cheapest check is comparison against the owning README section and the first-party source.
Verify Evidence
The Microsoft Developer Changelog and routing report are discovery inputs, not factual authority.
For each selected event:
- Open the linked first-party announcement and documentation.
- Verify exact behavior, status, availability, dates, settings, commands, limitations, billing, and migration requirements relevant to the talk.
- Compare those facts with the current README and recipe.
- Downgrade or reject the proposal if it does not change the talk's thesis, workflow, decision guidance, demo, setup, status, evidence, or product boundary.
- Record rejected candidates under
ignoredwith a reason; do not silently delete the ledger decision.
Treat future-dated, duplicate, malformed, inaccessible, or contradictory entries as anomalies. Do not promote them into content without confirmation.
Create The Refresh Plan
Invoke content-refresh and create or overwrite tech-talks/<talk>/content.refresh.yml from its template.
The plan must:
- List every selected ledger event as accepted, ignored, removed, or anomalous.
- Include the ledger event ID in each accepted or ignored item when the schema permits an additional field.
- Map accepted evidence to a current or proposed README section.
- Prefer replacing stale or lower-value material over appending a changelog section.
- State recipe and slide impact.
- Use the highest required update level across accepted items.
- End with
refresh.status: proposedinplan-onlymode.
Present one concise summary per talk: accepted changes, rejected changes, update level, affected sections, and expected deck impact.
Approval Gate
In plan-only mode, stop after all requested plans are written and summarized.
In apply mode:
- Treat the user's direct implementation request as plan approval.
- For
all apply, carry that approval across the complete serial queue. - Set
refresh.status: approvedand record the approval date before editing each README. - If verification materially changes the requested scope, pause for approval instead of applying a surprising plan.
Apply One Talk
Complete one talk end to end before starting the next:
- Patch the README as a coherent technical article.
- Update frontmatter
updatedand verified first-party references. - Preserve unrelated content and working artifacts.
- Remove or replace stale claims called out by the plan.
- Validate that the README still answers one clear central question.
- Set
refresh.validation.readmePatched: trueonly after focused content validation.
Branch by the cheap-path table in content-refresh:
referenceorslideImpact: none: validate README links; leave recipe and deck unless a visible slide claim is now false.contentwithrecipeImpact: none|confirmandslideImpact: none|patch: no cross-model review. Patch the existing deck if needed. Single-deck build only.contentwithrecipeImpact: reviseorslideImpact: regenerate: compact recipe refresh, then targeted slide work. Do not wipe the deck unless the recipe skeleton changed.structural,headline,recipeImpact: restructure, orslideImpact: replace-demo: fulldeck-recipe-refreshwith the Rubber Duck gate, then Tech Talk Slide Generator, then single-deck build.
Never invoke cross-model recipe review to confirm a recipe you already intend to keep.
When slides change:
- Follow repository Slidev instructions.
- Invoke
build-slidev-decksfor the single deck. - Run
node slides/scripts/sync-index-dates.mjsfrom the repository root. - Update all applicable
content.refresh.ymlvalidation flags. SetslidesRegenerated: trueonly after a full regen; for a patch, leave it false and rely ondeckBuildPassed.
Do not mark ledger work complete when any required validation is false or unavailable.
Close Ledger Decisions
After a talk passes every required gate, update only its selected decisions in .github/content-routing/ledger.json:
- Implemented change:
status: accepted - Verified no content obligation:
status: rejected - Keep
materialityas adjudicated unless verification proves it wrong. - Replace
reasonwith a concise outcome that names the updated section or explains rejection. - Never leave an implemented item in
proposal-createdor otherwise active status when the content has already been merged.
Leave the parent event status: adjudicated. Do not modify unrelated decisions.
This is the cleanup step that prevents the feed report from turning into stale backlog. The report is regenerated; the ledger is the durable state that ensures old work is closed instead of lingering as repeat work.
Then:
- Update the ledger's top-level
updateddate. - Run
npm run test:content-routing. - Run
npm run content:routeto regeneratelatest-report.jsonandlatest-report.md. - Confirm completed decisions no longer appear as
proposal-created. - Run diagnostics and
git diff --check.
If a validation fails, leave the affected decision as proposal-created, report the blocker, and continue only when later talks do not depend on the failed work.
Quality Gate
A talk is complete only when:
- Every selected ledger proposal has an explicit accepted or rejected outcome.
- Every accepted factual claim has a first-party source.
- Preview, experimental, GA, deprecated, and retired states are explicit.
- The README remains reader-first rather than becoming a release-note dump.
content.refresh.ymlaccurately records approval and validation.- Required cross-model recipe review is complete.
- Required slides are regenerated and the single-deck build passes.
- Index dates are synchronized after slide changes.
- Ledger and generated reports agree.
- Unrelated dirty-worktree changes remain untouched.
Final Report
Report:
- Talks completed, rejected, skipped, or blocked
- Material README and recipe changes
- Deck build results
- Ledger decisions closed and proposals remaining
- Any anomalies, unresolved facts, or follow-up work