← Cycles
Qnative (provisional) · c9
Trainings
activeopened 2026-11-12 from Mark's words, half an hour before a demo — answers `design:c133` D5 and `design:c137` D8; first slice built the same evening: the four published trainings in the app, launched from the inboxcreated 2026-11-12· last activity 2026-11-13· mode: assemblage (c133's published trainings, c137's training-assignment message, c4's inbox, put together).
design c133's remediation trainings taken in the native app, launched from the inbox's training assignments.
Why
The inbox already carried a training assignment (bones.md's E7, Secrets in prompts) with a Start training button, but the button said "not on this build yet". c133 has four published trainings, voice-checked, served at the design site's /api/trainings. The demo needed the loop closed: a message arrives, the person takes the training in the app, the check, the result.
Key Changes
- The first slice (2026-11-12, before the demo):
- The content (
crates/fixtures/trainings/): the four published trainings, filled for this app byscripts/sync-trainings.pyfrom design's/api/trainings/<id>with the slot values inslots.json(read from the design lab's governance world: a policy's training on its first finding, the topic on its own as User A). Nothing unfilled. Design stays the source: edit the markdown there, run the script. - The types (
crates/types/src/training.rs): design'sTraining, the fields the view draws. - The inbox (
crates/fixtures/messages/training-assignments.json): three more training assignments beside E7, one per training (unapproved MCP servers, personal accounts for work, Observe and Enforce), shaped like E7, inpilotandconnected.examples()stays bones.md's ten; the store's and fixtures' world counts updated (pilot 13, connected 12, threads 12). - The view (
crates/app/src/pages/training.rs): Start training opens the training in the inbox's place: the lesson a step at a time (the illustration as its alt text until the scenes are drawn natively), then the check a question at a time with the right answer and the explanation, then the result. Done marks the message done and says completion is recorded (nothing is sent on this build; the record is c133's, the plane's side c134's). - Rebuilt to the design pages (2026-11-12, minutes later, Mark: "it looks much more like the tour guide, we do want to replicate the training & quizes as constituted in the design pages"): the view now follows the lab mock (
app/pages/pages/phase4/mock/training.vue): the progress (Assignment · Lesson · Check · Result · Record, the assignment done), the lede naming the policy and the machine, the lesson with its scene beside the text, Back and Next, the step pills; the check as one page of numbered questions with radio choices and "Check my answers"; All right with what each answer rests on and the record before it is written, then "Finish and record"; Not yet with "Reread step N" per missed question and "Retake the check" (right answers stay); Recorded. The scenes are framed placeholders carrying their alt text: drawing the sixteen SVG scenes natively is the next port. - The scenes (2026-11-12, Mark: "I think we need to implement the scenes, no?"): each lesson step now shows its scene as the lab draws it. Design's
scripts/export-training-scenes.mjsdrives the lab's training mock (each training on its fixture's finding, the topic from the library) one step at a time, with motion reduced, and screenshots each scene's figure at 2x in light and dark, border and caption off: 32 PNGs (about 1 MB) incrates/fixtures/trainings/scenes/, indexed by the generatedcrates/fixtures/src/training_scenes.rs. The view draws the image on the same sunken surface with the alt text as the caption, asScene.vuedoes, and follows the app's appearance. The lesson's two columns no longer squeeze the text (min_w(0)on both). Still owed: the motion (the flow arrows hold still), and drawing the scenes natively from qguikit's pawns so the text in them can be selected and the files go. - The quiz wording (design, same day): an editorial pass on all sixteen questions, so the app carries the clearer wording (design
6b240395ff). - Checked:
types,fixturesandmessagestests pass; the app builds with--features dev; run onpilot, its guide server reads the inbox with the new assignments. The click-through itself was not driven by an agent (computer use cannot reach a bare debug binary): no story yet.
- The content (
- T-INJECT-1 for design c144's S1 (2026-11-13,
32c9b03): the fifth training, Instructions hidden in content (P-PROMPT-INSPECT, design99865de0b0), is bundled and filled for S1's own finding, Phishing for financial records. Its four scenes are in light and dark. The simulation's replay step and its native scene page (d94716f) read it. Priya's laptop ispriya-x1in T-SECRETS-1 andslots.json, the qdash seed's name (c132 D6).
Outcome
Open.
Next
- The port measured (
/native-port: spec-measure on the lab mock, a story per stage, the wipe); the scenes drawn natively, with their motion, in place of the captures. - The completion as c133's
training.completedrecord, once the plane takes it (c134). - The library reading (a training on its own) and the language choice.
- The four trainings c133 wrote for design c144's wave 1 (design
463237c3a1): T-PROVIDERS-1, T-PROVENANCE-1, T-APPROVAL-1 and T-SPEND-1. Bundle each with its native scenario, as T-INJECT-1 went with S1. c144 closed 2026-11-13 with S2–S6 natively carried forward to design c149.