Remediation Training
A finding is a teaching moment. Short trainings (one to three minutes: an illustration or animation, what to do instead, a check that it landed), assigned by a policy, an operator or HQ, opened from the native app's message on the web app, and recorded in the audit log as proof of correction. Concrete, respectful, with a path to IT. Three pilots on the lab's top policies.
New in this cycle: The assignment written by the training's own file: what happened on mac-a1 under a personal account, and why it matters
Why
When qcontrol blocks or flags something, the person at the keyboard sees a disruption and nothing else. Mark Peterson asked for local feedback with a path to IT. Mark Parson's prompt goes one step further: the finding is a teaching moment, and we are the only party who sees both the violation and the person. A short training, taken at the moment and recorded in the audit log, turns a censure into a proof of correction.
The brand's register applies: name the real hazard plainly, don't dramatize, respect the reader. A safety briefing, not a reprimand.
Sketch: A training is four things, drawn 2026-11-10 in the design system; Mark's own drawings may replace it.
Sketch: The record: one event, three reads, drawn 2026-11-11 for the walk with Tyler; Mark's own drawings may replace it.
Objective
Done means: the brief written and the problem cited; the four-part content model (trigger, lesson, check, record) as data; one training mocked in the lab from a real finding in the lab world; the record shown in the finding's history, the audit log and Reports; the authoring pipeline (a content collection, asset conventions, preview, publish); three pilots (secrets in prompts, personal accounts for work, unapproved MCP servers) reviewed one at a time; the hand-off to c134 (pages, record) and c131 (the notice) recorded here.
Scope
- Design repo:
cycles/c133.remediation-training/, the phase-4 lab (a training page in the web app's frame), a content collection for trainings, illustration and animation assets - Sister projects:
../market-analyst(the brief),../qnativevia c137 (the message), the control-plane repo via c134 (the pages and the record) - Out: video; languages other than English for the pilots; blocking enforcement ("no model access until taken") unless Mark rules it in
Key Changes
- Instructions hidden in content (2026-11-12, night, for c144 S1): T-INJECT-1, written in the c142 session at Mark's word ("Write S1's") for c144's first doomsday scenario. See
review-8-inject.md.- The world: one seed finding, F-H (Jordan's Claude Code read a hidden comment in a GitHub issue through GitHub MCP; P-PROMPT-INSPECT, Observed), and its session S-7, marked c133. c144's theatre check, the tours walk and the metrics check still pass.
- The training: four steps, four questions and a Library section; slots keyed by policy (
POLICY_SLOTS) because the finding names an MCP server as P-MCP's do; three new scenes. Voice: zero violations. Taken end to end and from the library. - The record: twelve captures under the thread "Instructions hidden in content (T-INJECT-1)…" (
scripts/shot-programs/c133-inject.json), and five calls in the review note.
- The four trainings c144's wave 1 wanted (2026-11-13): written in the c142 session at Mark's word ("Yes, write them"). See
review-9-wave1.md.- The trainings:
- Approved model providers (T-PROVIDERS-1) for S5, on F-F and TH-S5-b2-1.
- Skills that update themselves (T-PROVENANCE-1) for S3 and S2.
- Ask before an agent sends or publishes (T-APPROVAL-1) for S4, S1 and S3.
- Unattended agents and their spend (T-SPEND-1) for S6.
- The world: no addition. P-PROVENANCE and P-SPEND are Off in the base world, and P-TOOL-APPROVAL has no finding there, so three of the four are met in the simulation.
- The slots: four policies join
POLICY_SLOTS, and the configuration-only slots becomePOLICY_CONFIG_SLOTS, read by the library. - The scenes: eleven new ones, and the catalogue holds 35.
- Checked:
- Voice: zero violations.
- 13 filled readings with nothing unfilled.
- Each training taken end to end, and all four read in full from the library.
- Fixed on the way:
ownerOfskips theatre'sTheatreactor, so a training in the simulation names IT.- The preview page's two template-only imports are bound in its script.
- The record: fifteen captures (
scripts/shot-programs/c133-wave1.json) and four calls in the review note.
- The trainings:
- Review 8 and review 9 ruled (2026-11-13): Mark walked the nine calls one at a time in the c142 session. They are recorded as D57–D63 (
plan.md), and both notes carry a Ruled section.- D57: F-H stays.
- D58: slots keyed by policy are the pattern.
- D59: the injection training's approval stays general.
- D60: a seed finding where the policy is on and has none.
- D61: the approval training's title.
- D62: advice stays general for now.
- D63: each training is bundled in the native app with the scenario that opens it.
Review 8's calls 4 and 5 were closed as already done: T-INJECT-1 is bundled with the native S1, and a link that carries the simulation opens its finding.- D60 built the same day: F-I, Hana's Claude Code merging pull request #517 through GitHub MCP with approval set to never, Observed, and its session S-8, in
governance-fixture.tsand marked c133.- The findings list holds 25.
- theatre-check 190/0, tours-walk 455/0, c123 metrics 49.
- The approval training was taken end to end on F-I.
- Two captures (
scripts/shot-programs/c133-approval-seed.json).
- Into the native app, and a demo's polish (2026-11-12, evening, from the c143 session on Mark's word):
- The trainings page (
/pages/phase4/trainings): each training's title opens its prototype, and each training's section gains "Open the prototype" (the mock on its policy's first finding; a topic's library reading) and "On its own, from the library" (8e23a69852). - The quiz wording: Mark found some questions hard to follow. All sixteen, and the MCP library's Observe question, were reworded: the situation first, then one question; Observe and Enforce named as modes; parallel answer options. Ids, steps, slots and right answers unchanged; the voice check passes on all four (
6b240395ff). - The native app (qnative c9 Trainings, answering D5): the four published trainings are bundled from
/api/trainingsand filled with the lab's values, three training assignments join E7 in the inbox, and Start training opens the training built to the lab mock: the five stops, the lesson with its scene, the check on one sheet, the result with the record, the retake, Recorded. The scenes are this lab's own, captured per step in light and dark byscripts/export-training-scenes.mjs(519f9d3dd0,614371359b). Owed there: the motion and native drawings of the scenes.
- The trainings page (
- Phase 7 review (2026-11-12): Mark took
review-7.md's five defaults ("I've read and agree with your defaults, go with those"), recorded as D52–D56:- topic ids are named for what they cover (
T-MODES-1); - a topic may cover several concepts where one doesn't stand alone;
- "a record, not a verdict" stays;
- the claim that some policies only record stays, to check with Tyler;
- the operator's send of a topic is c134's.
No code changed.handoff.md§ 7 gained the Tyler check. - topic ids are named for what they cover (
- Phase 6 review and Phase 7 (2026-11-12): Mark walked
review-6.md's five calls in the c142 session and ruled them as D45–D51.- D45–D48: as proposed: the
# Librarysection, v1 kept, the Compliance section only, the world's clock. - D49–D51: a training answers a policy or a topic; the seed topics are all 18 of the guide's concepts; the library, an operator and later the guide offer them.
- Phase 7 built:
- the model and parser for a topic (
policyIdoptional besidetopic, exactly one); - Observe and Enforce (T-MODES-1,
en/observe-and-enforce.md, 2 minutes), voice-checked with zero violations, with four new scenes (policy-modes,mode-observe,mode-enforce,mode-ask); - the library, the record card, the preview page and its gallery, which now has 16 scenes;
- the Compliance count, and the docs (
authoring.md,publish.md,handoff.md§ 7, the/trainingskill).
- the model and parser for a topic (
- The record: five captures under the thread "Phase 7 · …" (
scripts/shot-programs/c133-p7.json), and five calls inreview-7.md.
- D45–D48: as proposed: the
- Phase 6 (2026-11-12): built in the c142 session the same day Mark ruled D38–D44, at his word ("Do this task here"). See
review-6.md.- D38: an optional
# Librarysection in each file, entries in the grammar of the step or question they replace, by id (parse.ts,types.tslibrary,library.ts,voice.ts). Library words were written for the three pilots and voice-checked, zero violations. All three now read 4 of 4 steps and 4 of 4 questions on their own (Phase 5: 3/3, 3/3 and 2/3), and every content hash moved, still v1. - D39: the self-taken record on the person's finding: a line on the training strip, with the assignment left open. The lab knob
?took=seeds one. - D42: "Trainings taken on their own" in the Compliance report beside Enforcement Posture: counts only, read as a strength, not in Corrections.
- The docs:
authoring.md,publish.md,handoff.mdand the/trainingskill updated. - The record: five captures under the thread "Phase 6 · …" (
scripts/shot-programs/c133-p6.json), and five calls inreview-6.md, including the topic-trainings proposal (clarifying question 6).
- D38: an optional
- Phase 5 review (2026-11-12): Mark walked
review-5.md's seven calls in the c142 session and ruled them as D38–D44 (plan.md;review-5.md§ Ruled). Two calls went against the proposal:- call 1: each file gets its own words for the library (D38), changing the parser, the format, the skill and the hash;
- call 5: self-taken completions count in Posture as a strength (D42). The other five went as proposed. On call 3 Mark added that a high self-taken count shows a strong posture, and that we can offer trainings on areas that confuse people, categorized as self. That's clarifying question 6, trainings on a topic rather than a finding. Phase 6 builds D38, D39 and D42 once kicked off.
- the brief, found merged (2026-11-12): asked on c142's second c133 tour how much is ready to merge, the tour checked market-analyst. Phase 0's brief merged on 2026-11-11 at 19:49Z as
briefs/enforcement-without-local-context.md(qpoint-io/market-analysis#15).handoff.md, the story's pickup and its "brief" change still said in flight; all three are corrected. The cycle now waits on Mark's seven Phase 5 calls, Tyler's D22–D27, c134's frame and copy step, c121's policy fields and Peterson. - scene gallery, from c142's first cycle tour (2026-11-12): Mark asked where the illustrations come from, and no page showed them together. The Scenes section of /pages/phase4/trainings is now a gallery instead of a table. All twelve scenes are drawn there, each on the first finding of a training that uses it, with that step's caption as the person reads it and a link to the step in the mock (
?findingId=…&at=lesson&step=n). The gallery showedsanctioned-listoverflowing its figure by 156 px: its three columns switched on at the viewport'smdbreakpoint, not the figure's width. The same overflow hit the lesson itself at viewports from 768 px to about 1,100 px, and at 1440 by about 55 px. It now wraps by the figure's width: the list, then "reviewed" with the server. Checked at 1440 and 375: twelve drawn, none overflowing, no console errors. Recorded in c142. The same day Mark named Rob Genova's blog drawings as the inspiration for the scenes (see Lineage). They're credited inauthoring.md§ Scenes, under the gallery's heading, and in the story. - Phase 5 (2026-11-12): the hand-off and the library, by an execution session, in three commits. First, Phase 4's two small things: Corrections in Reports read "0 in this window" for a record written at the cutoff, because the lab's two clocks differ (the reports' data ends on 29 October, the lab writes the record at the world's clock, 1 November); a window that runs to the reports' last day of data now runs to the cutoff (
app/data/trainings/reports.ts), and the section's source line namestraining.completed.*(D27). Second, D34: T-MCP-1's choices reordered so the right one sits third, first, second, third, no word changed, so v1 stays and the content hash moves toed4d2679c3cd…(D31); voice check zero violations; two captures under the thread "Phase 5 · T-MCP-1's choices reordered" (scripts/shot-programs/c133-p5-reorder.json, new file names, Phase 1's kept). Third, the hand-off:handoff.md, for c134 (the training page from the lab mock, the JSON copied in at release per D29, the record as audit rows perevent-shape.md§8, the history row and the Corrections block per D16, D19, D20, Corrections in Reports per D17, D18, who may read what per D10, the library) and for c131 and qnative c4 (thetraining-assignmentcard withstart-training, the web app opened signed in through the plane connection,training.completed.*ending the message, a table of whose is what; c4 already has the types, and its Start training answers "not on this build yet"). The library, D2's "a library for the person later": /pages/phase4/mock/training-library in the lab's qdash shell lists the three trainings from the collection with their minutes, policy, what each covers and the person's record (Assigned with Start to the training on their finding, Recorded with Take it again, No record with Take it on your own). A training taken on its own is filled from the reader and the policy, never from a finding (app/data/trainings/library.ts;slots.tsrefactored to share the policy-level helpers, the 21 pages it touches rendering identically before and after); the steps and questions that tell a finding are left out and said so (3 of 4 steps for MCP and accounts, 2 of 4 for secrets); the record is the same record with no finding and no assigner, one audit rowtraining.completed.self(types.ts,RecordCard.vue,Progress.vueandAuditLog.vuelearned it). Taken end to end in the browser pane (a wrong answer, the retake keeping two, the pass, Finish, the list reading Recorded on your own); no console errors; every new sentence throughcheck-brand-voice, zero violations. Registered underc133-training, on the phase-4 index. Five captures under the thread "Phase 5 · the training library" (scripts/shot-programs/c133-p5-library.json). The review stop:review-5.md, seven calls (library words; the self-taken record and D24; the event's name; what the record names; self-taken completions in Reports; the contact line on its own; the examples the library reads). - Phases 3–4 review (2026-11-12): Mark walked the ten calls of
review-3.md,review-4-accounts.mdandreview-4-secrets.mdwith the design session and took all ten as proposed (D28–D37): the right answers stay in the published data; the publish step's JSON goes into the plane at release; English with a line when a language has no file; the version moves on meaning; the operator's reason shown as written; the self-report kept and asked of Peterson; T-MCP-1's answers reordered in the file; F-G kept in the base world; the secrets lesson names the check that is off; rotation stays outside the record. An execution session takes the two small things Phase 4 found, D34's reorder, then Phase 5. - stage 1 (2026-11-09): prompt and plan written from c130's split. CYCLE.md written before kick-off at Mark's request (c130 clarifying question 6). The same day: the candidate problem promoted in market-analyst (
problem:enforcement-without-local-context), the gate moved from "the shape's messaging section" to c137's bones, and Mark's note on hard-hat training and Metamythic recorded as a note only. - 2026-11-09, later: Mark confirmed the defaults and ruled D9: a training can in theory block access, by default it does not. Committed the same day.
- kick-off (2026-11-11): Mark ruled Phase 1 starts now. The gate's first half holds (c137's bones, 2026-11-09, and its D9–D13 ruled this day); the second, the brief, is in flight: Phase 0 runs as a cloud session in market-analyst against
problem:enforcement-without-local-contextand lands as a PR there. Phase 1 does not read the brief's text, so it did not wait. - Phase 1 (2026-11-11): the content model as data in
app/data/trainings/types.ts: a training is a lesson (three to five steps, each with an illustration named as a scene), a check (three to five questions with one right choice, the step each verifies and why the right answer is right), a contact (R5) and the record completion writes (R4: training and version, finding, policy, person and endpoint, the final result, the time, who assigned it, the assignment it closes; not how long, not how many tries, not which answers); the pass rule all right with retake (D3) and the six stages. The first pilot (D6),unapproved-mcp-servers.ts, T-MCP-1, written for a real finding in the lab world: F-A, Vanta MCP from Claude Code on mac-a1 under Unsanctioned MCP server in use, Observed; four lesson steps (what happened on this machine, what an MCP server can do, why there is a sanctioned list, what to do instead), four questions on the idea; every sentence voice-checked with the brand MCP, zero violations.index.tscomposes the training with the finding: the slots filled from the world (the date and time, the agent, the device, the team, the server, the session, qcontrol's evidence, the outcome, the policy's sanctioned list from its configuration, the exception that lets GRC use the server quoted as the operator wrote it, the policy's owner from the last change), the assignment built as c137'straining-assignmentin three sentences (D8), the grade, the record and its audit rows; D2'strainingfield on the policy held asPOLICY_TRAININGSuntil c121's model takes it. The mock, in the lab's qdash shell: /pages/phase4/mock/training, reached from S1's new training strip (the policy's assignment, Assigned or Recorded, the one path) or from the assignment card, through the lesson (the scenes drawn from the pawns and the sketch kit, one flow animated, still under reduced motion, D7), the check, the result with the record shown before Finish writes it, the retake that keeps what was right and names the step to reread, and the record: one row in the finding's history (training-completed, a new event kind that leaves the status alone, D9) and an audit log mock withmessage.sent,training.completed,message.done.?at=opens any stage; a policy without a training says so and names the pilots.useTrainingMockkeeps the visit's progress; the strip shows only what the plane would know (R4). Registered under the collapsec133-trainingand a Trainings section on the phase-4 index. Nine captures under the thread "Phase 1 · the content model and one training" (scripts/shot-programs/c133-training.json, subjects per state). The review stop: review-1.md, with the calls on the record's HR and legal sensitivity (question 2), languages (question 3), what the training needs from the finding's data, and five smaller ones. - Phase 1 review (2026-11-11, evening): Mark walked
review-1.mdat the c130 G1 session and ruled the seven calls that were his: D10 the record's audience (the name on the finding and in the audit log, counts only in Reports; the personnel-data question goes to Peterson first), D11 languages (English for the pilots,langper file with Phase 3, operator text never translated), D12 the exception's reason shown as written, D13 nothing learned between assignment and record (confirmed as the product), D14 the Finish step kept, D15 the retake keeps what was right, D16 the history row now and a Corrections block once Tyler agrees the event shape. Call 8, the person's frame, is c134's.shape.mdaccepted at the same session: c133 formally open. Recorded inplan.md(D10–D16, questions 2 and 3 closed) and the story module. - Phase 2 (2026-11-11, night): the record's homes, under D10 and D16.
event-shape.md:training.completedin qevents' pattern (a tagged enum,typeandpayload), the fields the record keeps and the ones R4 forbids, the audit row beside c137'smessage.sentandmessage.done, the four projections (the history row today, the Corrections block once agreed, Reports' count, the operator's inbox), who may read it, and six questions for Tyler (where it lives, whose contract, assignments frommessage.sentor atraining.assigned, idempotency, version or hash, operator and HQ assignment). Reports: c128's Findings report gains a Corrections section between Blocked and observed and Data protection, counts only as of the cutoff (assigned, completed, waiting, per training;app/data/trainings/reports.ts,TrainingReportCorrections), staged with its source named. The finding: a Corrections block (TrainingCorrections: the record as the audit log keeps it, the status unchanged, the three audit rows) behind the slot variant?v.corrections=block; the default keeps the history row as the record's home (D16). Three captures under the thread "Phase 2 · the record" (scripts/shot-programs/c133-record.json). The review stop:review-2.md, with Tyler's six questions and four calls for Mark. - Phase 2 review (2026-11-11, night): Mark took the four calls as proposed: D17 Corrections as a state as of the cutoff, D18 assigned on detection in the count, D19 the block under History before Details, D20 the block as default once Tyler agrees the shape. D21: published trainings served by the design API (
/api/trainings,/api/trainings/<id>), the content collection the source. Phases 3 and 4 handed to an execution session the same night; this session signs off at the review stop. - Tyler's questions, assumed (2026-11-11, night): Mark walked
event-shape.md§6 and set assumptions to validate with Tyler, recorded as D22–D27 and in §8: the audit log as the store; the existing event pattern as the base with the plane's richer record object consuming the small event; assignment and completion both audit rows, a completion associated with the person's earlier findings under the policy to show and drive remediation; every completion a row, one grouped object (his sketch: type, completed, the training's id and name, proof of understanding); version and a content hash; separate completion events per assigner. The hash and the record's fields went to the execution session for the publish step. - Tyler walk page (2026-11-11): the record's event flow drawn as a second sketch, "The record: one event, three reads" at
/cycles/design/sketches/c133-record(app/pages/cycles/design/sketches/c133-record.vue): the flow from the policy's detection to the person and the training page, the one small event in qevents' pattern (training.completed.policy,.operator,.hq, D27) consumed by the plane's record object (D23) and written as audit rows with the audit log as the store (D22, D25), the three reads (the finding's history row today and the Corrections block once agreed, Reports' counts, the operator's inbox), the association with the person's earlier findings under the policy (D24), the notes on what R4 keeps out and on version and hash (D26), and the orange note for what stays Tyler's. Registered inprogram-sketches.tsand the sketches shot program, to be captured asc133-sketch-record.png. The walk itself:tyler-walk.md, ten minutes, one paragraph per assumption D22–D27 with the one question each needs answered, then the four items that are Tyler's alone. The story module gains the outcomerecord-sketch. - Phase 3 (2026-11-11, night): the authoring pipeline (D4, D21), built by the execution session. The collection: one markdown file per training and language,
content/trainings/<lang>/<slug>.md(D11), frontmatter for the training's fields and the body for its words (# Assignmentwith the message's first two sentences,# Lessonas##steps with anid:/scene:/alt:block,# Checkas##questions withid:/step:/explain:and the choices as a task list);content.config.tsgains thetrainingscollection. One parser,app/data/trainings/parse.ts, for both readers: the lab reads the files at build time (index.ts, which now derivesTRAININGSandPOLICY_TRAININGSfrom them) and the API reads the collection's raw text; a file with problems is withheld from both. The first pilot moved intocontent/trainings/en/unapproved-mcp-servers.mdwith no word changed (the parsed object equals Phase 1's field for field; thirteen rendered mock pages compared identical); its assignment sentences moved out of code into the file. Slots moved toslots.ts, keyed by the finding's kind. Scenes stay components, one file each incomponents/training/scenes/, catalogued indata/trainings/scenes.ts(the decision and the asset convention inauthoring.md§Scenes). The preview page /pages/phase4/trainings (registered underc133-training, on the phase-4 index's Trainings section): per training the policy, minutes, steps, questions, lang, version, hash, the brand voice rules run live on the file and on every finding of its policy (voice.ts, mirrored from the MCP), the slots, the scenes, links to open it on each finding. The publish step:server/api/trainings/index.get.tsand[id].get.ts(server/data/trainings.ts), shape inpublish.md. Mark's D25–D27, ruled while it was built: the record names the training's title, version and content hash (one SHA-256 for the API and the lab,hash.ts), and the lab's audit log writestraining.completed.policy. The record page's Reports line now links the Corrections section. The/trainingskill (.claude/skills/training/SKILL.md) carries the loop for a new training. Two captures under the thread "Phase 3 · the authoring pipeline" (scripts/shot-programs/c133-pipeline.json). The review note:review-3.md, with four calls (the right answers in the published data, how the apps reach the API behind Access, a language with no file, when the version moves) and an incident owned: the preview page's first draft broke every route on the shared dev server for about 25 minutes. - Phase 4, pilot 2 (2026-11-11, night): Personal accounts for work, T-ACCT-1, through the
/trainingskill, for F-C (User A's Claude Code session on mac-a1 under usera@gmail.com, under Personal account is in use, Observed; Dana's exception Off for User A until 31 October ended and the finding reopened on 1 November). No world addition.app/data/trainings/en/personal-accounts-for-work.md: four steps (what happened, with the policy that can only record and the exception quoted as written, D12; where the work goes; how to tell which account a session uses; what to do instead), four questions with the right choices in different places.slots.tsgains the kindaccount(account, outcome read from the policy's enforceability, blocked, the person's own exception live or ended). Four scenes (account-session,account-boundary,account-check,account-switch), two redrawn in two rows after the first captures wrapped. Every sentence and scene label throughcheck-brand-voice: zero violations. Taken end to end in the browser pane from F-C's strip (a wrong answer, the retake keeping three, the pass, Finish, the history row; the finding stays open, D9); no console errors on fresh loads. A correction to Phase 3 in the same commit: the training files moved fromcontent/trainings/toapp/data/trainings/<lang>/, because Nuxt Content hidescontent/from Vite's watcher and the lab never saw an edit; the collection reads the new folder through itscwdsource. Eleven captures under the thread "Phase 4 · pilot 2, Personal accounts for work" (scripts/shot-programs/c133-p4-accounts.json). The review note:review-4-accounts.md, three calls (the operator's third-person reason shown to the person, the self-report in step 4, the right answer's position in T-MCP-1). - Phase 4, pilot 3 (2026-11-11, night): Secrets in prompts, T-SECRETS-1, through the
/trainingskill. The lab world had no finding under Credentials must not be sent to a model, sogovernance-fixture.tsgained one, marked c133: F-G, an AWS access key (the policy's first detector) in a prompt from Priya's Cursor on mac-eng-07, from a pasted .env file, critical, Observed (the policy observes organisation-wide), with its session S-6; the governance pages (24 registry routes), the seven report kinds, the findings list (now 23) and the policy checked with no console errors.app/data/trainings/en/secrets-in-prompts.md: four steps (what happened; why a key in a prompt is a key disclosed; what to do about this key, revoke it today and tell IT; what to do instead, a reference not the secret, with the policy's detectors and the one that is off read from its configuration) and four questions.slots.tsgains the kinddataClass(the class with its article, the detectors, the check that is off, outcome-dependent advice). Four scenes (secret-prompt,secret-copies,secret-rotate,secret-reference); the catalogue holds twelve. Every sentence and scene label throughcheck-brand-voice: zero violations. Taken end to end from F-G's strip, checked in dark mode./api/trainingsserves all three; the preview page lists them with nothing withheld; Corrections in Reports counts five findings across the three trainings. Thirteen captures under the thread "Phase 4 · pilot 3, Secrets in prompts" (scripts/shot-programs/c133-p4-secrets.json). The review note:review-4-secrets.md, three calls of its own (keep F-G in the base world, name the check that is off, rotation outside the record), two small things in Phase 2's lines left for later, and all ten open calls of Phases 3 and 4 collected. One knock-on outside c133:integrations-fixture.tshardcodes 22 findings. - sketch and story (2026-11-10): the sketch "A training is four things" at
/cycles/design/sketches/c133-training(app/pages/cycles/design/sketches/c133-training.vue: who assigns, the four parts as a strip, the assignment as a c137 message, the audit log as the record, D9, the three pilots), to be captured asc133-sketch-training.pngfor the hero; the story moduleapp/data/stories/c133.ts(D1–D9 as decisions, the problem, the pickup); the image under Why and §The shape added here. - re-homed by c147 (2026-11-13): c137 App Messaging closed into design c147 (Findings, a Common Tongue), so the assignment no longer travels as a c137
training-assignmentmessage: it is atraining-assignedevent on the finding (from: plane), and completion stays thetraining-completedevent.event-shape.md§1 steps 1 and 3 and §2'smessage_idread againstc147 finding-shape.md§9;message_idbecomesassignment_event_id. Nothing else changes here; for the native V1 the training ships as the event and the record only (c147 Q5). - D9 revised by c147 (2026-11-13): Mark ruled at c147 review stop 3 (6a) that a finished training closes its finding when a policy assigned it: the person's
training-completedrecord still moves nothing, and the policy then resolves the finding ("Resolved: training completed", aresolvefrom the plane with origin system); HQ can reopen it. Trainings an operator or HQ assigned keep D9 as it stands. The lab's model (foldFinding) doesn't close on completion yet; it's inc147 qnative-brief.mdand waits on this cycle's lab for the prototype.
Outcome
Not started.
The shape
Documents: the plan · Mark's prompt · the Phase 1 review stop · the event shape, for Tyler · the Phase 2 review stop · the walk for Tyler · authoring a training · what the apps read · the Phase 3 review note · pilot 2, personal accounts · pilot 3, secrets in prompts, and every open call · the hand-off to c134 and c131 · the Phase 5 review stop · instructions hidden in content, for c144 S1 · the four trainings for c144's wave 1 · the lab: the trainings · the library · personal accounts on F-C · secrets in prompts on F-G · the published JSON · the training on F-A · the finding with its training · the Findings report with Corrections · the phase-4 index
The problem. When qcontrol blocks or flags something, the person at the keyboard sees a disruption and nothing else, and the operator sees a finding with no sign the person understood. Mark Peterson asked for local feedback with a path to IT (problem:enforcement-without-local-context); we are the only party who sees both the violation and the person.
The core idea. The finding is a teaching moment: a short lesson about this hazard, a check that it landed, and completion written to the audit log, so a censure becomes proof of correction. Short, concrete, respectful; a safety briefing, not a reprimand.
The pieces.
- Trigger: a finding, a policy's enforcement, a censure or an assignment; a
training-assignmentmessage with astart-trainingaction (c137, D8), shown in the native app's inbox and linked from the web app. - Lesson: one to three minutes, an illustration or animation, what to do instead; a page on the web app (c134, D1), authored as a content collection on the design site (D4), delivered to the native app as content modules (D5).
- Check: one to three questions that verify the concept; the same page; all right to pass, retake allowed (D3).
- Record: completion, the check's final result and the finding it answers; the audit log, the finding's history and Reports (c128);
training-completedback through c137. - Who assigns: a policy's
trainingfield first, an operator from a finding second, HQ's notices third (D2); a library for the person later. - Three pilots (D6): secrets in prompts, personal accounts for work, unapproved MCP servers; illustrations and short animations, no video (D7).
The pattern we follow. A training is four things: trigger plus protocol. The trigger is a message (c137's one schema, no channel of its own); the lesson, the check and the record are the protocol every training keeps, so a new hazard is content, not a new flow. Composed from what the lab already has (the finding, the policy, the person, the session), then applied per hazard.
What stays open. The brief in market-analyst (in flight); the record's event shape, with Tyler (Phase 2); whether a completed training counts as personnel data in the organisations Peterson knows (the first question for him, D10); where the person's page lives (c134). Settled on 2026-11-11: who sees the record (D10), languages (D11), the operator's words as written (D12), nothing between assignment and record (D13), Finish (D14), the retake (D15), the record's home (D16). Blocking stays off by default (D9).
Visual record
118 captures — heroes, page slices, and full-page renders. Click to view.
F-I, the seed finding for Ask before an agent sends or publishes (Mark's ruling at the review-9 walk)
2026-11-13· 2 captureslatest

The four trainings c144's wave 1 wanted: Approved model providers, Skills that update themselves, Ask before an agent sends or publishes, Unattended agents and their spend
2026-11-13· 16 captures















Instructions hidden in content (T-INJECT-1), c144 S1's training, on F-H (the seed finding added for it), through the /training skill
2026-11-12· 16 captures















Phase 7 · the first training on a topic (D49): Observe and Enforce, in the library, taken on its own, and counted beside Enforcement Posture
2026-11-12· 7 captures






Phase 6 · each training's own words for the library (D38), the self-taken record on the finding (D39), and the count in the Compliance report (D42)
2026-11-12· 5 captures




Sketches — the structures, drawn in the design system
2026-11-10· 4 captures



Phase 5 · the training library: the three trainings with the person's record, and one taken on its own, written with no finding and no assigner
2026-11-12· 9 captures








Phase 5 · T-MCP-1's choices reordered (D34): the right answer third, first, second, third; same words, version 1, a new content hash
2026-11-12· 4 captures



Phase 4 · pilot 3, Secrets in prompts, on F-G (the one seed finding added to the lab world for it), through the /training skill; the collection complete
2026-11-11· 18 captures

















Phase 4 · pilot 2, Personal accounts for work, on F-C (User A's usera@gmail.com), through the /training skill
2026-11-11· 15 captures














Phase 3 · the authoring pipeline: the collection previewed in the lab, published at /api/trainings, the record naming the published hash
2026-11-11· 4 captures



Phase 2 · the record: a count in Reports, a Corrections block on the finding as the proposal, the event shape for Tyler
2026-11-11· 4 captures



Phase 1 · the content model and one training: Unapproved MCP servers on F-A, in the web app's frame, state by state
2026-11-11· 14 captures













Artifacts
- initial-prompt.md
- authoring.md
- event-shape.md
- handoff.md
- initial-prompt.md
- plan.md
- publish.md
- review-1.md
- review-2.md
- review-3.md
- review-4-accounts.md
- review-4-secrets.md
- review-5.md
- review-6.md
- review-7.md
- review-8-inject.md
- review-9-wave1.md
- tyler-walk.md