[{"data":1,"prerenderedAt":1021},["ShallowReactive",2],{"cycle-doc-design-c146-intents.md":3},{"cycle":4,"project":7,"path":10,"title":11,"toc":12,"ast":16},{"id":5,"title":6},"c146","Config File",{"id":8,"label":9},"design","Design","intents.md","c146 Phase 1: the intents catalog",[13,14,15],"How each fragment was checked","The catalog","Not in the set",{"type":17,"children":18},"root",[19,62,68,261,266,273,281,352,358,366,391,397,405,429,435,443,481,487,495,549,555,563,579,585,593,646,652,660,699,705,739,745,807,816,822,858,868,873,890,896,904,957,962,1016],{"type":20,"tag":21,"props":22,"children":23},"element","p",{},[24,31,33,45,47,52,54,60],{"type":20,"tag":25,"props":26,"children":27},"strong",{},[28],{"type":29,"value":30},"text","Written:",{"type":29,"value":32}," 2026-11-13, for the Phase 5 eval (",{"type":20,"tag":34,"props":35,"children":37},"a",{"href":36},"\u002Fcycles\u002Fdesign\u002Fc146\u002Fdoc\u002Feval",[38],{"type":20,"tag":39,"props":40,"children":42},"code",{"className":41},[],[43],{"type":29,"value":44},"eval.md",{"type":29,"value":46},").\n",{"type":20,"tag":25,"props":48,"children":49},{},[50],{"type":29,"value":51},"What it is:",{"type":29,"value":53}," twelve plain instructions a person gives their agent about ",{"type":20,"tag":39,"props":55,"children":57},{"className":56},[],[58],{"type":29,"value":59},"config.yaml",{"type":29,"value":61},", each with the fragment that answers it. It is the eval set: an agent passes an instruction when its first proposal checks clean, its draft carries the fragment's essentials, and the Config page shows the draft ready to Apply.",{"type":20,"tag":63,"props":64,"children":66},"h2",{"id":65},"how-each-fragment-was-checked",[67],{"type":29,"value":13},{"type":20,"tag":69,"props":70,"children":71},"ul",{},[72,104,192,212,251],{"type":20,"tag":73,"props":74,"children":75},"li",{},[76,81,83,89,91],{"type":20,"tag":25,"props":77,"children":78},{},[79],{"type":29,"value":80},"The starting file",{"type":29,"value":82}," is the ",{"type":20,"tag":39,"props":84,"children":86},{"className":85},[],[87],{"type":29,"value":88},"meridian-day90",{"type":29,"value":90}," world's (nina-mbp, the quiet laptop), the file the eval runs against:",{"type":20,"tag":92,"props":93,"children":99},"pre",{"className":94,"code":95,"language":96,"meta":97,"style":98},"language-yaml","# qcontrol configuration (this machine)\n\n# Apply behaviors to targets. First match wins.\ntargets:\n  - title: All harnesses\n    if: is_harness()\n    behaviors: [audit]\n\n# Available behaviors\nbehaviors:\n  # Out-of-band auditing.\n  audit:\n    plugins:\n      - name: io-events\n      - name: llm-events\n      - name: mcp\n      - name: sentinel\n","yaml","","undefined",[100],{"type":20,"tag":39,"props":101,"children":102},{"__ignoreMap":97},[103],{"type":29,"value":95},{"type":20,"tag":73,"props":105,"children":106},{},[107,112,114],{"type":20,"tag":25,"props":108,"children":109},{},[110],{"type":29,"value":111},"Each fragment was merged into that file",{"type":29,"value":113}," and the whole file checked twice:",{"type":20,"tag":69,"props":115,"children":116},{},[117,150],{"type":20,"tag":73,"props":118,"children":119},{},[120,125,127,133,135,141,142,148],{"type":20,"tag":25,"props":121,"children":122},{},[123],{"type":29,"value":124},"the app's checker",{"type":29,"value":126},", ",{"type":20,"tag":39,"props":128,"children":130},{"className":129},[],[131],{"type":29,"value":132},"config-check",{"type":29,"value":134}," on the guide's MCP server (qnative main ",{"type":20,"tag":39,"props":136,"children":138},{"className":137},[],[139],{"type":29,"value":140},"313bd7c",{"type":29,"value":126},{"type":20,"tag":39,"props":143,"children":145},{"className":144},[],[146],{"type":29,"value":147},"crates\u002Fapp\u002Fsrc\u002Fconfig\u002Fcheck.rs",{"type":29,"value":149},"), the check the eval's agents see;",{"type":20,"tag":73,"props":151,"children":152},{},[153,158,160,166,168,174,176,182,184,190],{"type":20,"tag":25,"props":154,"children":155},{},[156],{"type":29,"value":157},"qconfig itself",{"type":29,"value":159},", the loader on qcontrol ",{"type":20,"tag":39,"props":161,"children":163},{"className":162},[],[164],{"type":29,"value":165},"main",{"type":29,"value":167}," (",{"type":20,"tag":39,"props":169,"children":171},{"className":170},[],[172],{"type":29,"value":173},"8677b44ed",{"type":29,"value":175},"): ",{"type":20,"tag":39,"props":177,"children":179},{"className":178},[],[180],{"type":29,"value":181},"RawRoot::read",{"type":29,"value":183}," then ",{"type":20,"tag":39,"props":185,"children":187},{"className":186},[],[188],{"type":29,"value":189},"qconfig::load",{"type":29,"value":191},", run from a scratch example outside the repo. This is the check qcontrol will make.",{"type":20,"tag":73,"props":193,"children":194},{},[195,200,202,210],{"type":20,"tag":25,"props":196,"children":197},{},[198],{"type":29,"value":199},"Both pass all eleven whole files",{"type":29,"value":201},", and both refuse #11's file (the one meant to be refused) on the same key. The two checkers do not always agree, though: see ",{"type":20,"tag":34,"props":203,"children":204},{"href":36},[205],{"type":20,"tag":39,"props":206,"children":208},{"className":207},[],[209],{"type":29,"value":44},{"type":29,"value":211}," § Findings, F1.",{"type":20,"tag":73,"props":213,"children":214},{},[215,220,222,228,229,235,236,242,243,249],{"type":20,"tag":25,"props":216,"children":217},{},[218],{"type":29,"value":219},"Harness ids",{"type":29,"value":221}," are qcontrol's: ",{"type":20,"tag":39,"props":223,"children":225},{"className":224},[],[226],{"type":29,"value":227},"claude-cli",{"type":29,"value":126},{"type":20,"tag":39,"props":230,"children":232},{"className":231},[],[233],{"type":29,"value":234},"cursor-cli",{"type":29,"value":126},{"type":20,"tag":39,"props":237,"children":239},{"className":238},[],[240],{"type":29,"value":241},"codex-cli",{"type":29,"value":126},{"type":20,"tag":39,"props":244,"children":246},{"className":245},[],[247],{"type":29,"value":248},"aider",{"type":29,"value":250}," (qconfig's tests and the monitor's inventory tests).",{"type":20,"tag":73,"props":252,"children":253},{},[254,259],{"type":20,"tag":25,"props":255,"children":256},{},[257],{"type":29,"value":258},"The fragment is what changes.",{"type":29,"value":260}," Everything else in the file stays as it was. \"Essentials\" says what a draft must carry to match; a draft may word its comments, titles and behavior names its own way.",{"type":20,"tag":63,"props":262,"children":264},{"id":263},"the-catalog",[265],{"type":29,"value":14},{"type":20,"tag":267,"props":268,"children":270},"h3",{"id":269},"_1-audit-everything-claude-code-does",[271],{"type":29,"value":272},"1. \"Audit everything Claude Code does.\"",{"type":20,"tag":92,"props":274,"children":276},{"className":94,"code":275,"language":96,"meta":97,"style":98},"targets:\n  - title: Claude Code\n    if: harness.id == \"claude-cli\"\n    behaviors: [audit, commands-and-files]\n  - title: All harnesses\n    if: is_harness()\n    behaviors: [audit]\n\nbehaviors:\n  # Commands and file access, on top of audit.\n  commands-and-files:\n    exec:\n      enabled: true\n    file:\n      enabled: true\n",[277],{"type":20,"tag":39,"props":278,"children":279},{"__ignoreMap":97},[280],{"type":29,"value":275},{"type":20,"tag":21,"props":282,"children":283},{},[284,289,291,296,298,303,305,311,313,319,321,327,329,334,336,342,344,350],{"type":20,"tag":25,"props":285,"children":286},{},[287],{"type":29,"value":288},"Essentials:",{"type":29,"value":290}," a target for ",{"type":20,"tag":39,"props":292,"children":294},{"className":293},[],[295],{"type":29,"value":227},{"type":29,"value":297}," ",{"type":20,"tag":25,"props":299,"children":300},{},[301],{"type":29,"value":302},"before",{"type":29,"value":304}," All harnesses (the first match wins), carrying ",{"type":20,"tag":39,"props":306,"children":308},{"className":307},[],[309],{"type":29,"value":310},"audit",{"type":29,"value":312}," and a behavior that turns on ",{"type":20,"tag":39,"props":314,"children":316},{"className":315},[],[317],{"type":29,"value":318},"exec",{"type":29,"value":320}," and ",{"type":20,"tag":39,"props":322,"children":324},{"className":323},[],[325],{"type":29,"value":326},"file",{"type":29,"value":328}," capture. All harnesses keeps ",{"type":20,"tag":39,"props":330,"children":332},{"className":331},[],[333],{"type":29,"value":310},{"type":29,"value":335},". More capture (",{"type":20,"tag":39,"props":337,"children":339},{"className":338},[],[340],{"type":29,"value":341},"netstat",{"type":29,"value":343},", the ",{"type":20,"tag":39,"props":345,"children":347},{"className":346},[],[348],{"type":29,"value":349},"io-log",{"type":29,"value":351}," plugins) is a fair reading of \"everything\".",{"type":20,"tag":267,"props":353,"children":355},{"id":354},"_2-send-my-events-to-my-otel-collector-at-collectorinternal4318",[356],{"type":29,"value":357},"2. \"Send my events to my OTel collector at collector.internal:4318.\"",{"type":20,"tag":92,"props":359,"children":361},{"className":94,"code":360,"language":96,"meta":97,"style":98},"sinks:\n  - url: otel:\u002F\u002Fcollector.internal:4318\n",[362],{"type":20,"tag":39,"props":363,"children":364},{"__ignoreMap":97},[365],{"type":29,"value":360},{"type":20,"tag":21,"props":367,"children":368},{},[369,373,375,381,383,389],{"type":20,"tag":25,"props":370,"children":371},{},[372],{"type":29,"value":288},{"type":29,"value":374}," one sink, ",{"type":20,"tag":39,"props":376,"children":378},{"className":377},[],[379],{"type":29,"value":380},"otel:\u002F\u002Fcollector.internal:4318",{"type":29,"value":382},", with no ",{"type":20,"tag":39,"props":384,"children":386},{"className":385},[],[387],{"type":29,"value":388},"if:",{"type":29,"value":390},", so every event goes.",{"type":20,"tag":267,"props":392,"children":394},{"id":393},"_3-also-log-my-events-to-a-file",[395],{"type":29,"value":396},"3. \"Also log my events to a file.\"",{"type":20,"tag":92,"props":398,"children":400},{"className":94,"code":399,"language":96,"meta":97,"style":98},"sinks:\n  - url: file:\u002F\u002F\u002Fvar\u002Flog\u002Fqcontrol\u002Fevents.jsonl\n",[401],{"type":20,"tag":39,"props":402,"children":403},{"__ignoreMap":97},[404],{"type":29,"value":399},{"type":20,"tag":21,"props":406,"children":407},{},[408,412,414,420,422,427],{"type":20,"tag":25,"props":409,"children":410},{},[411],{"type":29,"value":288},{"type":29,"value":413}," a ",{"type":20,"tag":39,"props":415,"children":417},{"className":416},[],[418],{"type":29,"value":419},"file:\u002F\u002F",{"type":29,"value":421}," sink with an ",{"type":20,"tag":25,"props":423,"children":424},{},[425],{"type":29,"value":426},"absolute",{"type":29,"value":428}," path (qconfig refuses a relative one). The stock document's example path is the obvious choice.",{"type":20,"tag":267,"props":430,"children":432},{"id":431},"_4-enforce-openshell-for-cursor-my-policy-is-at-usersninaconfigqcontrolpoliciescursoryaml",[433],{"type":29,"value":434},"4. \"Enforce OpenShell for Cursor. My policy is at \u002FUsers\u002Fnina\u002F.config\u002Fqcontrol\u002Fpolicies\u002Fcursor.yaml.\"",{"type":20,"tag":92,"props":436,"children":438},{"className":94,"code":437,"language":96,"meta":97,"style":98},"targets:\n  - title: Cursor\n    if: harness.id == \"cursor-cli\"\n    behaviors: [audit, openshell-enforce]\n  - title: All harnesses\n    if: is_harness()\n    behaviors: [audit]\n\nbehaviors:\n  # Enforce an OpenShell policy.\n  openshell-enforce:\n    plugins:\n      - name: openshell\n        config:\n          policy: \u002FUsers\u002Fnina\u002F.config\u002Fqcontrol\u002Fpolicies\u002Fcursor.yaml\n",[439],{"type":20,"tag":39,"props":440,"children":441},{"__ignoreMap":97},[442],{"type":29,"value":437},{"type":20,"tag":21,"props":444,"children":445},{},[446,450,451,456,458,463,465,471,473,479],{"type":20,"tag":25,"props":447,"children":448},{},[449],{"type":29,"value":288},{"type":29,"value":413},{"type":20,"tag":39,"props":452,"children":454},{"className":453},[],[455],{"type":29,"value":234},{"type":29,"value":457}," target before All harnesses, with ",{"type":20,"tag":39,"props":459,"children":461},{"className":460},[],[462],{"type":29,"value":310},{"type":29,"value":464}," kept and a behavior running the ",{"type":20,"tag":39,"props":466,"children":468},{"className":467},[],[469],{"type":29,"value":470},"openshell",{"type":29,"value":472}," plugin with ",{"type":20,"tag":39,"props":474,"children":476},{"className":475},[],[477],{"type":29,"value":478},"config.policy",{"type":29,"value":480}," set to the person's path. The instruction gives the path, because the plan's shorter wording (\"enforce OpenShell for Cursor\") leaves the agent nothing to enforce.",{"type":20,"tag":267,"props":482,"children":484},{"id":483},"_5-send-my-events-to-my-collector-at-otelexamplecom4318-it-needs-my-api-key-which-is-otel_api_key-in-configqcontrolsecretsenv-keep-the-key-out-of-the-config-file",[485],{"type":29,"value":486},"5. \"Send my events to my collector at otel.example.com:4318. It needs my API key, which is OTEL_API_KEY in ~\u002F.config\u002Fqcontrol\u002Fsecrets.env. Keep the key out of the config file.\"",{"type":20,"tag":92,"props":488,"children":490},{"className":94,"code":489,"language":96,"meta":97,"style":98},"secrets:\n  my_secrets:\n    provider: dotenv\n    path: \u002FUsers\u002Fnina\u002F.config\u002Fqcontrol\u002Fsecrets.env\n\nsinks:\n  - url: otel:\u002F\u002Fotel.example.com:4318\n    headers:\n      Authorization: $__my_secrets{OTEL_API_KEY}\n",[491],{"type":20,"tag":39,"props":492,"children":493},{"__ignoreMap":97},[494],{"type":29,"value":489},{"type":20,"tag":21,"props":496,"children":497},{},[498,502,503,509,511,517,519,523,525,531,533,539,541,547],{"type":20,"tag":25,"props":499,"children":500},{},[501],{"type":29,"value":288},{"type":29,"value":413},{"type":20,"tag":39,"props":504,"children":506},{"className":505},[],[507],{"type":29,"value":508},"dotenv",{"type":29,"value":510}," secret store whose ",{"type":20,"tag":39,"props":512,"children":514},{"className":513},[],[515],{"type":29,"value":516},"path",{"type":29,"value":518}," is ",{"type":20,"tag":25,"props":520,"children":521},{},[522],{"type":29,"value":426},{"type":29,"value":524}," (qsecrets refuses ",{"type":20,"tag":39,"props":526,"children":528},{"className":527},[],[529],{"type":29,"value":530},"~",{"type":29,"value":532},"), and the sink's header naming the key as ",{"type":20,"tag":39,"props":534,"children":536},{"className":535},[],[537],{"type":29,"value":538},"$__\u003Cstore>{OTEL_API_KEY}",{"type":29,"value":540},". The header's name is the collector's business: ",{"type":20,"tag":39,"props":542,"children":544},{"className":543},[],[545],{"type":29,"value":546},"Authorization",{"type":29,"value":548}," or an API-key header both match. The key's value appears nowhere.",{"type":20,"tag":267,"props":550,"children":552},{"id":551},"_6-turn-the-tray-off",[553],{"type":29,"value":554},"6. \"Turn the tray off.\"",{"type":20,"tag":92,"props":556,"children":558},{"className":94,"code":557,"language":96,"meta":97,"style":98},"ui:\n  tray: false\n",[559],{"type":20,"tag":39,"props":560,"children":561},{"__ignoreMap":97},[562],{"type":29,"value":557},{"type":20,"tag":21,"props":564,"children":565},{},[566,570,571,577],{"type":20,"tag":25,"props":567,"children":568},{},[569],{"type":29,"value":288},{"type":29,"value":297},{"type":20,"tag":39,"props":572,"children":574},{"className":573},[],[575],{"type":29,"value":576},"ui.tray: false",{"type":29,"value":578},". The dashboard is left as it was. The words collide with the app's own Messages › Settings › \"Show messages in the tray\", so a good answer says which tray it changes.",{"type":20,"tag":267,"props":580,"children":582},{"id":581},"_7-send-only-file-writes-and-the-commands-my-agents-run-to-my-collector-at-localhost4318",[583],{"type":29,"value":584},"7. \"Send only file writes and the commands my agents run to my collector at localhost:4318.\"",{"type":20,"tag":92,"props":586,"children":588},{"className":94,"code":587,"language":96,"meta":97,"style":98},"behaviors:\n  audit:\n    exec:\n      enabled: true\n    file:\n      enabled: true\n    plugins: …            # as before\n\nsinks:\n  - url: otel:\u002F\u002Flocalhost:4318\n    if: |\n      starts_with(type, ['exec.'])\n      or type in ['file.write']\n",[589],{"type":20,"tag":39,"props":590,"children":591},{"__ignoreMap":97},[592],{"type":29,"value":587},{"type":20,"tag":21,"props":594,"children":595},{},[596,600,602,608,610,615,617,623,625,631,633,638,639,644],{"type":20,"tag":25,"props":597,"children":598},{},[599],{"type":29,"value":288},{"type":29,"value":601}," a sink at ",{"type":20,"tag":39,"props":603,"children":605},{"className":604},[],[606],{"type":29,"value":607},"otel:\u002F\u002Flocalhost:4318",{"type":29,"value":609}," whose ",{"type":20,"tag":39,"props":611,"children":613},{"className":612},[],[614],{"type":29,"value":388},{"type":29,"value":616}," admits ",{"type":20,"tag":39,"props":618,"children":620},{"className":619},[],[621],{"type":29,"value":622},"exec.*",{"type":29,"value":624}," events and ",{"type":20,"tag":39,"props":626,"children":628},{"className":627},[],[629],{"type":29,"value":630},"file.write",{"type":29,"value":632},", and nothing else. Turning on ",{"type":20,"tag":39,"props":634,"children":636},{"className":635},[],[637],{"type":29,"value":318},{"type":29,"value":320},{"type":20,"tag":39,"props":640,"children":642},{"className":641},[],[643],{"type":29,"value":326},{"type":29,"value":645}," capture makes sure those events exist; it isn't required to match, because unwritten coverage follows the plugins.",{"type":20,"tag":267,"props":647,"children":649},{"id":648},"_8-stop-watching-aider",[650],{"type":29,"value":651},"8. \"Stop watching Aider.\"",{"type":20,"tag":92,"props":653,"children":655},{"className":94,"code":654,"language":96,"meta":97,"style":98},"targets:\n  - title: Aider (discovered, not watched)\n    if: harness.id == \"aider\"\n    behaviors: []\n  - title: All harnesses\n    if: is_harness()\n    behaviors: [audit]\n",[656],{"type":20,"tag":39,"props":657,"children":658},{"__ignoreMap":97},[659],{"type":29,"value":654},{"type":20,"tag":21,"props":661,"children":662},{},[663,667,669,674,676,681,683,689,691,697],{"type":20,"tag":25,"props":664,"children":665},{},[666],{"type":29,"value":288},{"type":29,"value":668}," an ",{"type":20,"tag":39,"props":670,"children":672},{"className":671},[],[673],{"type":29,"value":248},{"type":29,"value":675}," target ",{"type":20,"tag":25,"props":677,"children":678},{},[679],{"type":29,"value":680},"first",{"type":29,"value":682},", with ",{"type":20,"tag":39,"props":684,"children":686},{"className":685},[],[687],{"type":29,"value":688},"behaviors: []",{"type":29,"value":690},". That means \"discover only\" in qconfig: Aider is still seen but not tapped, and because the first match wins, All harnesses never reaches it. Narrowing All harnesses' rule instead (",{"type":20,"tag":39,"props":692,"children":694},{"className":693},[],[695],{"type":29,"value":696},"is_harness() and harness.id != \"aider\"",{"type":29,"value":698},") also matches.",{"type":20,"tag":267,"props":700,"children":702},{"id":701},"_9-what-is-my-config-file-doing-right-now",[703],{"type":29,"value":704},"9. \"What is my config file doing right now?\"",{"type":20,"tag":21,"props":706,"children":707},{},[708,710,715,717,723,725,730,732,737],{"type":29,"value":709},"No fragment, and ",{"type":20,"tag":25,"props":711,"children":712},{},[713],{"type":29,"value":714},"no proposal",{"type":29,"value":716},". The answer comes from ",{"type":20,"tag":39,"props":718,"children":720},{"className":719},[],[721],{"type":29,"value":722},"config-read",{"type":29,"value":724},"'s effective view: one target, All harnesses, running ",{"type":20,"tag":39,"props":726,"children":728},{"className":727},[],[729],{"type":29,"value":310},{"type":29,"value":731}," (io-events, llm-events, mcp, sentinel); no sinks, so nothing leaves the machine; the tray and the dashboard on (the defaults). ",{"type":20,"tag":25,"props":733,"children":734},{},[735],{"type":29,"value":736},"Passes",{"type":29,"value":738}," when the agent reads before it answers, says those four things in plain words, and proposes nothing.",{"type":20,"tag":267,"props":740,"children":742},{"id":741},"_10-start-me-from-the-developer-laptop-starter",[743],{"type":29,"value":744},"10. \"Start me from the developer-laptop starter.\"",{"type":20,"tag":21,"props":746,"children":747},{},[748,750,756,758,764,766,771,772,777,778,783,785,790,792,798,800,805],{"type":29,"value":749},"The whole of ",{"type":20,"tag":39,"props":751,"children":753},{"className":752},[],[754],{"type":29,"value":755},"developer-laptop.yaml",{"type":29,"value":757}," from ",{"type":20,"tag":39,"props":759,"children":761},{"className":760},[],[762],{"type":29,"value":763},"config-starters",{"type":29,"value":765},": coding agents (",{"type":20,"tag":39,"props":767,"children":769},{"className":768},[],[770],{"type":29,"value":227},{"type":29,"value":126},{"type":20,"tag":39,"props":773,"children":775},{"className":774},[],[776],{"type":29,"value":234},{"type":29,"value":126},{"type":20,"tag":39,"props":779,"children":781},{"className":780},[],[782],{"type":29,"value":241},{"type":29,"value":784},") get ",{"type":20,"tag":39,"props":786,"children":788},{"className":787},[],[789],{"type":29,"value":310},{"type":29,"value":791}," with command and file capture plus ",{"type":20,"tag":39,"props":793,"children":795},{"className":794},[],[796],{"type":29,"value":797},"egress-allowlist",{"type":29,"value":799}," (OpenShell); every other harness gets ",{"type":20,"tag":39,"props":801,"children":803},{"className":802},[],[804],{"type":29,"value":310},{"type":29,"value":806},"; tray and dashboard on.",{"type":20,"tag":21,"props":808,"children":809},{},[810,814],{"type":20,"tag":25,"props":811,"children":812},{},[813],{"type":29,"value":288},{"type":29,"value":815}," the starter's text, unchanged. The agent says that it replaces the current file and what is lost: nothing here, since the current file only audits.",{"type":20,"tag":267,"props":817,"children":819},{"id":818},"_11-propose-this-config-exactly-as-it-is-dont-fix-anything-then-why-was-my-draft-refused",[820],{"type":29,"value":821},"11. \"Propose this config exactly as it is, don't fix anything: …\" then \"Why was my draft refused?\"",{"type":20,"tag":21,"props":823,"children":824},{},[825,827,833,835,841,843,848,850,856],{"type":29,"value":826},"The file is the starting file with ",{"type":20,"tag":39,"props":828,"children":830},{"className":829},[],[831],{"type":29,"value":832},"plugins:",{"type":29,"value":834}," misspelt ",{"type":20,"tag":39,"props":836,"children":838},{"className":837},[],[839],{"type":29,"value":840},"plugin:",{"type":29,"value":842}," under ",{"type":20,"tag":39,"props":844,"children":846},{"className":845},[],[847],{"type":29,"value":310},{"type":29,"value":849},". ",{"type":20,"tag":39,"props":851,"children":853},{"className":852},[],[854],{"type":29,"value":855},"config-propose",{"type":29,"value":857}," must refuse it:",{"type":20,"tag":92,"props":859,"children":863},{"className":860,"code":862,"language":29},[861],"language-text","line 13 · behaviors.audit.plugin · Unknown key `plugin` in behaviors.audit. · Did you mean `plugins`?\n",[864],{"type":20,"tag":39,"props":865,"children":866},{"__ignoreMap":97},[867],{"type":29,"value":862},{"type":20,"tag":21,"props":869,"children":870},{},[871],{"type":29,"value":872},"qconfig refuses it on the same key.",{"type":20,"tag":21,"props":874,"children":875},{},[876,880,882,888],{"type":20,"tag":25,"props":877,"children":878},{},[879],{"type":29,"value":288},{"type":29,"value":881}," the first proposal is refused (here, refusal is the pass), nothing reaches the page, and the answer to \"why\" names the line, the key and the fix (",{"type":20,"tag":39,"props":883,"children":885},{"className":884},[],[886],{"type":29,"value":887},"plugins",{"type":29,"value":889},") in plain words and offers to propose the fixed file. \"First proposal checks clean\" is read the other way round for this one instruction.",{"type":20,"tag":267,"props":891,"children":893},{"id":892},"_12-give-python-scripts-the-full-io-logs",[894],{"type":29,"value":895},"12. \"Give Python scripts the full IO logs.\"",{"type":20,"tag":92,"props":897,"children":899},{"className":94,"code":898,"language":96,"meta":97,"style":98},"targets:\n  - title: Python scripts\n    if: process.binary == \"python3\"\n    behaviors: [io-log]\n  - title: All harnesses\n    if: is_harness()\n    behaviors: [audit]\n\nbehaviors:\n  # Full trace-level IO logs.\n  io-log:\n    plugins:\n      - name: http-logger\n      - name: net-logger\n      - name: file-logger\n",[900],{"type":20,"tag":39,"props":901,"children":902},{"__ignoreMap":97},[903],{"type":29,"value":898},{"type":20,"tag":21,"props":905,"children":906},{},[907,911,913,919,921,927,929,934,936,941,943,948,950,955],{"type":20,"tag":25,"props":908,"children":909},{},[910],{"type":29,"value":288},{"type":29,"value":912}," a target matching Python by ",{"type":20,"tag":39,"props":914,"children":916},{"className":915},[],[917],{"type":29,"value":918},"process.binary",{"type":29,"value":920}," (or ",{"type":20,"tag":39,"props":922,"children":924},{"className":923},[],[925],{"type":29,"value":926},"process.path",{"type":29,"value":928},"), and an ",{"type":20,"tag":39,"props":930,"children":932},{"className":931},[],[933],{"type":29,"value":349},{"type":29,"value":935}," behavior with the stock document's three loggers. ",{"type":20,"tag":25,"props":937,"children":938},{},[939],{"type":29,"value":940},"The trap:",{"type":29,"value":942}," the starting file doesn't define ",{"type":20,"tag":39,"props":944,"children":946},{"className":945},[],[947],{"type":29,"value":349},{"type":29,"value":949},". Only the stock document does, and it isn't in force once a file exists, so naming ",{"type":20,"tag":39,"props":951,"children":953},{"className":952},[],[954],{"type":29,"value":349},{"type":29,"value":956}," without defining it is refused (\"not defined under behaviors\"). Order doesn't matter here, because a script is not a harness.",{"type":20,"tag":63,"props":958,"children":960},{"id":959},"not-in-the-set",[961],{"type":29,"value":15},{"type":20,"tag":69,"props":963,"children":964},{},[965,983],{"type":20,"tag":73,"props":966,"children":967},{},[968,973,975,981],{"type":20,"tag":25,"props":969,"children":970},{},[971],{"type":29,"value":972},"A managed machine.",{"type":29,"value":974}," \"Turn the dashboard off\" while the company's plane manages the file should be refused with C9's sentence (\"Managed by your company. Changes are made there.\"). This needs the ",{"type":20,"tag":39,"props":976,"children":978},{"className":977},[],[979],{"type":29,"value":980},"plane",{"type":29,"value":982}," source and is left for Mark's walk, since C9 itself is open with Mark Peterson.",{"type":20,"tag":73,"props":984,"children":985},{},[986,1014],{"type":20,"tag":25,"props":987,"children":988},{},[989,991,997,998,1004,1006,1012],{"type":29,"value":990},"Includes, ",{"type":20,"tag":39,"props":992,"children":994},{"className":993},[],[995],{"type":29,"value":996},"unix:\u002F\u002F",{"type":29,"value":320},{"type":20,"tag":39,"props":999,"children":1001},{"className":1000},[],[1002],{"type":29,"value":1003},"pipe:\u002F\u002F",{"type":29,"value":1005}," sinks, ",{"type":20,"tag":39,"props":1007,"children":1009},{"className":1008},[],[1010],{"type":29,"value":1011},"inject",{"type":29,"value":1013}," tuning, proxy knobs.",{"type":29,"value":1015}," These are real keys that no person asked for in the plan's first dozen. The reference covers them; the catalog grows when people ask.",{"type":20,"tag":1017,"props":1018,"children":1019},"style",{},[1020],{"type":29,"value":97},1794599394145]