[{"data":1,"prerenderedAt":1724},["ShallowReactive",2],{"page-\u002Fdethereal\u002Fsync-and-version-control":3,"navigation":1400},{"id":4,"title":5,"body":6,"description":1385,"extension":1386,"meta":1387,"navigation":849,"path":1396,"seo":1397,"stem":1398,"__hash__":1399},"docs\u002F03.dethereal\u002F06.sync-and-version-control.md","Sync and Version Control",{"type":7,"value":8,"toc":1350},"minimark",[9,13,17,20,25,28,88,94,124,126,130,140,145,152,168,174,178,185,189,192,195,209,212,218,221,231,237,241,244,258,261,265,268,273,279,282,286,293,296,302,324,346,360,364,371,377,384,388,391,453,455,459,465,469,472,478,482,485,491,516,520,527,577,583,593,597,611,615,626,628,632,638,642,645,647,651,654,659,716,721,760,798,810,817,823,931,935,938,966,973,978,1003,1007,1013,1027,1030,1034,1037,1039,1043,1047,1050,1100,1103,1107,1113,1122,1299,1303,1309,1324,1328,1334,1336,1346],[10,11,5],"h1",{"id":12},"sync-and-version-control",[14,15,16],"p",{},"Dethereal models live as JSON files on your filesystem. You work on them locally, commit them to git, and publish them to the Dethernety platform when ready for analysis.",[18,19],"hr",{},[21,22,24],"h2",{"id":23},"the-dual-authority-model","The Dual-Authority Model",[14,26,27],{},"Local files and the platform each own different things:",[29,30,36],"div",{"className":31,"tabIndex":33,"role":34,"ariaLabel":35},[32],"table-frame",0,"region","Table: The Dual-Authority Model",[37,38,39,55],"table",{},[40,41,42],"thead",{},[43,44,45,49,52],"tr",{},[46,47,48],"th",{},"Concern",[46,50,51],{},"Authority",[46,53,54],{},"Why",[56,57,58,74],"tbody",{},[43,59,60,68,71],{},[61,62,63,67],"td",{},[64,65,66],"strong",{},"Model structure"," — components, boundaries, flows, attributes, data items, classifications",[61,69,70],{},"Local filesystem (git-versioned)",[61,72,73],{},"Developer-centric, offline-capable, auditable, rollback via git",[43,75,76,82,85],{},[61,77,78,81],{},[64,79,80],{},"Computed artifacts"," — exposures, analysis results, countermeasure-exposure links",[61,83,84],{},"Platform (graph database)",[61,86,87],{},"Requires graph traversal, analysis engine, multi-model composition",[14,89,90,93],{},[64,91,92],{},"Push is a publish operation, not a sync."," Your local files are the manuscript; the platform is the published version. When you push, the local model replaces the platform model entirely.",[14,95,96,97,101,102,105,106,109,110,113,114,116,117,120,121,123],{},"One exception: a data item's controls. A data item in ",[98,99,100],"code",{},"data-items.json"," with a ",[98,103,104],{},"controls"," list (including ",[98,107,108],{},"[]",") gets exactly that list on the platform, but a data item ",[64,111,112],{},"without"," a ",[98,115,104],{}," key keeps the controls it already has there. To remove a control from a data item, write the list without it; to remove them all, write ",[98,118,119],{},"\"controls\": []",". Never delete the key — that leaves the platform's controls in place. (For components, boundaries, and flows, an absent ",[98,122,104],{}," key does clear them.)",[18,125],{},[21,127,129],{"id":128},"pushing-to-the-platform","Pushing to the Platform",[131,132,137],"pre",{"className":133,"code":135,"language":136},[134],"language-text","> \u002Fdethereal:sync push\n","text",[98,138,135],{"__ignoreMap":139},"",[141,142,144],"h3",{"id":143},"first-push","First Push",[14,146,147,148,151],{},"When a model has never been pushed (no ",[98,149,150],{},"model.id"," in manifest.json), the plugin creates a new model on the platform. After import:",[153,154,155,159,165],"ul",{},[156,157,158],"li",{},"Server-generated IDs are written back to your local files (replacing temporary reference IDs)",[156,160,161,162],{},"Sync metadata is created at ",[98,163,164],{},".dethereal\u002Fsync.json",[156,166,167],{},"The plugin recommends committing these changes to git",[131,169,172],{"className":170,"code":171,"language":136},[134],"Pushed \"Payment API\" to platform.\n  4 boundaries, 6 components, 8 flows, 5 data items.\n  Platform model ID: abc-123-def\n\nServer IDs written to local files.\nCommit these changes to preserve sync state.\n",[98,173,171],{"__ignoreMap":139},[141,175,177],{"id":176},"subsequent-pushes","Subsequent Pushes",[14,179,180,181,184],{},"When updating an existing platform model, the plugin runs conflict detection first (see below), then pushes with ",[98,182,183],{},"delete_orphaned: true"," — elements you removed locally are also removed on the platform.",[141,186,188],{"id":187},"classes-the-platform-does-not-have","Classes the Platform Does Not Have",[14,190,191],{},"Each element's class is looked up on the platform you push to: first by its ID, then by its module and class name. A class that has a different ID on that platform — for example, because the model came from another Dethernety instance — is still found.",[14,193,194],{},"If a class in your model is not available on the platform you push to (for example, its module is not installed there), the push keeps going:",[153,196,197,203],{},[156,198,199,202],{},[64,200,201],{},"First push:"," the element is created without a class, and its answers are not written.",[156,204,205,208],{},[64,206,207],{},"Later pushes:"," the element keeps its current class and answers on the platform.",[14,210,211],{},"Either way, the push reports a warning that names the class. On later pushes the warning also names the element:",[131,213,216],{"className":214,"code":215,"language":136},[134],"Component \"Orders DB\": Could not resolve component class (id=…, name=Database, module=example-module); it keeps its current class binding and answers.\n",[98,217,215],{"__ignoreMap":139},[14,219,220],{},"Your files keep the class you chose for that element, and its answers. Each push reminds you with the warning above until the class is available on the platform (for example, once its module is installed there) or you choose another class for the element.",[14,222,223,226,227,230],{},[64,224,225],{},"If the platform refuses a change."," When the platform refuses a change, such as binding an element to a class, the push fails with an error that names the element and gives the platform's reason — for example, ",[98,228,229],{},"Could not bind \"API\" to class \u003Cid> (\u003Ccode>): \u003Creason>",". The rest of the push is still written. Fix the cause and push again.",[14,232,233,236],{},[64,234,235],{},"If a push, pull, or control assignment fails with \"Platform too old for this Dethereal version\"."," The platform you are connected to predates controls on data items, which this version of Dethereal reads and writes. The plugin checks for this before it pushes, pulls, or assigns controls, and stops with this error instead of a failure that does not say why; the message names the platform's address. Update the platform, or use a Dethereal version released before controls on data items.",[141,238,240],{"id":239},"gate-2-pre-flight","Gate 2 Pre-Flight",[14,242,243],{},"Before any push, the plugin validates Gate 2 (sync-blocking) criteria:",[153,245,246,249,252,255],{},[156,247,248],{},"Manifest has name and description",[156,250,251],{},"At least 1 boundary, 1 component, and 1 data flow",[156,253,254],{},"All data flow source\u002Ftarget IDs exist in structure.json",[156,256,257],{},"No orphaned attribute files",[14,259,260],{},"If Gate 2 fails, the push is blocked. Fix the reported issues first.",[141,262,264],{"id":263},"conflict-detection-structural","Conflict Detection — Structural",[14,266,267],{},"When pushing an update, the plugin checks whether the platform version has elements that your local version doesn't. This can happen when someone edits the model through the platform GUI after your last push.",[14,269,270],{},[64,271,272],{},"If structural conflicts are found:",[131,274,277],{"className":275,"code":276,"language":136},[134],"WARNING — Platform has elements not in your local model.\nThese elements will be DELETED if you push:\n\n  Components: \"New Service\" (added via GUI)\n  Data flows: \"New Service → Database\" (added via GUI)\n\nOptions:\n  push   — Push anyway (deletes these elements)\n  pull   — Pull platform version first, then push\n  cancel — Cancel push\n",[98,278,276],{"__ignoreMap":139},[14,280,281],{},"The plugin shows you exactly what will be lost and lets you choose.",[141,283,285],{"id":284},"shared-ownership-prompts","Shared-Ownership Prompts",[14,287,288,289,292],{},"If your model contains brownfield Controls (Controls pulled from the platform that other Models also reference), the push pauses ",[64,290,291],{},"per Control"," to confirm the impact of your edits. Editing a shared Control mutates state in models you may not even have open — the plugin refuses to do this silently.",[14,294,295],{},"The prompt looks like this:",[131,297,300],{"className":298,"code":299,"language":136},[134],"Brownfield Control \"Database Encryption Package\" (assigned to 4 Models):\n  - This model: \"Payment API\"\n  - Co-owners:  \"User Service\", \"Reporting\", \"Admin Console\"\n\nYour changes (pendingEdit on class \"Encryption at Rest\"):\n  algorithm: AES-128 → AES-256\n  keyRotationDays: 90 → 30\n\nOptions (per row):\n  cancel        — Skip this Control. Push everything else.\n  push-anyway   — Apply your changes to all 4 Models. Audit-log entry: force-shared.\n  push-unverified — Apply when the ownership query failed. Audit-log entry: force-unverified.\n  clone-and-swap — Fork into a new Control just for this Model. (not yet available)\n",[98,301,299],{"__ignoreMap":139},[14,303,304,305,308,309,312,313,316,317,308,320,323],{},"Choosing ",[98,306,307],{},"push-anyway"," writes a ",[98,310,311],{},"force-shared"," entry to ",[98,314,315],{},".dethereal\u002Fcontrol-audit.log"," so PR review can see who decided to mutate the shared state. Choosing ",[98,318,319],{},"push-unverified",[98,321,322],{},"force-unverified"," entry with the reason the ownership query failed (timeout, forbidden, no-data).",[14,325,326,329,330,333,334,337,338,341,342,345],{},[64,327,328],{},"Per-key resolution."," If only some attribute keys conflict, you can resolve them individually with ",[98,331,332],{},"keep \u003Cn>.\u003Ckey>"," (keep yours), ",[98,335,336],{},"accept-theirs \u003Cn>.\u003Ckey>",", ",[98,339,340],{},"merge \u003Cn>.\u003Ckey>",", or ",[98,343,344],{},"drop \u003Cn>.\u003Ckey>"," instead of an all-or-nothing per-Control verb.",[14,347,348,351,352,355,356,359],{},[64,349,350],{},"Large payloads."," For lengthy JSON values, stage edits via ",[98,353,354],{},"merge-from-file \u003Cn>.\u003Ckey> = \u003Cpath>"," instead of pasting inline. The file lives under ",[98,357,358],{},".dethereal\u002Fmerge-staging\u002F"," (auto-created).",[141,361,363],{"id":362},"external-edit-guard","External-Edit Guard",[14,365,366,367,370],{},"If someone else changed a brownfield Control on the platform between your pull and your push, the push aborts with ",[98,368,369],{},"EXTERNAL_EDIT_DETECTED"," rather than silently overwriting their edit. To proceed:",[131,372,375],{"className":373,"code":374,"language":136},[134],"> \u002Fdethereal:sync promote-external-edit \u003CcontrolId> \u003CclassId>\n",[98,376,374],{"__ignoreMap":139},[14,378,379,380,383],{},"This promotes the platform's current state into your local ",[98,381,382],{},"pendingEdit",", treating the external edit as legitimate operator intent. The next push runs the shared-ownership check against your effective state.",[141,385,387],{"id":386},"recovery-verbs","Recovery Verbs",[14,389,390],{},"Three operator recovery paths exist for the control-library workflow:",[29,392,395],{"className":393,"tabIndex":33,"role":34,"ariaLabel":394},[32],"Table: Recovery Verbs",[37,396,397,407],{},[40,398,399],{},[43,400,401,404],{},[46,402,403],{},"Verb",[46,405,406],{},"When to use",[56,408,409,427,443],{},[43,410,411,416],{},[61,412,413],{},[98,414,415],{},"\u002Fdethereal:sync repair-wal",[61,417,418,419,422,423,426],{},"Any push\u002Fpull\u002Fstatus returned ",[98,420,421],{},"WAL_REPLAY_FAILED",". Surfaces the stranded ",[98,424,425],{},".dethereal\u002Fpending-id-rewrite.json"," journal and walks through delete-journal \u002F retry-replay \u002F manual-rename.",[43,428,429,434],{},[61,430,431],{},[98,432,433],{},"\u002Fdethereal:sync promote-external-edit \u003CcontrolId> \u003CclassId>",[61,435,436,437,439,440,442],{},"Push aborted with ",[98,438,369],{},". Promotes the platform's state into your local ",[98,441,382],{},". Purely local — no platform mutation.",[43,444,445,450],{},[61,446,447],{},[98,448,449],{},"\u002Fdethereal:sync tombstone \u003CcontrolId>",[61,451,452],{},"Retiring a Control locally without waiting for it to be deleted on the platform and for a later pull to notice. Future pulls won't resurrect it.",[18,454],{},[21,456,458],{"id":457},"pulling-from-the-platform","Pulling From the Platform",[131,460,463],{"className":461,"code":462,"language":136},[134],"> \u002Fdethereal:sync pull\n",[98,464,462],{"__ignoreMap":139},[141,466,468],{"id":467},"model-selection","Model Selection",[14,470,471],{},"If you don't specify a model ID, the plugin lists available platform models:",[131,473,476],{"className":474,"code":475,"language":136},[134],"Platform models:\n  1. Production Stack (ID: abc-123)\n  2. Staging Environment (ID: def-456)\n  3. API Gateway (ID: ghi-789)\n\nSelect a model (number or ID):\n",[98,477,475],{"__ignoreMap":139},[141,479,481],{"id":480},"handling-existing-local-models","Handling Existing Local Models",[14,483,484],{},"If a local model already exists at the target path:",[131,486,489],{"className":487,"code":488,"language":136},[134],"Local model \"Production Stack\" already exists at .\u002Fthreat-models\u002Fprod\u002F\n\nOptions:\n  push     — Push your local changes first, then pull\n  backup   — Save current local to \u003Cdir>.backup-\u003Ctimestamp>\u002F, then pull\n  overwrite — Replace local with platform version\n  cancel   — Cancel pull\n",[98,490,488],{"__ignoreMap":139},[14,492,493,494,497,498,501,502,505,506,509,510,515],{},"The backup is a full copy of the model tree written ",[64,495,496],{},"beside"," the model directory — ",[98,499,500],{},".\u002Fthreat-models\u002Fprod.backup-2026-08-25T09-14-02-771Z\u002F",", not a ",[98,503,504],{},".backup\u002F"," subdirectory. Push takes one too, by default, before it updates the platform. Backups are never garbage-collected, so prune stale ",[98,507,508],{},"*.backup-*"," siblings periodically and keep them out of git (see ",[511,512,514],"a",{"href":513},"#what-to-commit","What to Commit",").",[141,517,519],{"id":518},"state-inference","State Inference",[14,521,522,523,526],{},"Platform models don't have ",[98,524,525],{},".dethereal\u002Fstate.json",". After pull, the plugin infers the workflow state from model content:",[29,528,531],{"className":529,"tabIndex":33,"role":34,"ariaLabel":530},[32],"Table: State Inference",[37,532,533,543],{},[40,534,535],{},[43,536,537,540],{},[46,538,539],{},"Content",[46,541,542],{},"Inferred State",[56,544,545,553,561,569],{},[43,546,547,550],{},[61,548,549],{},"0 components",[61,551,552],{},"INITIALIZED",[43,554,555,558],{},[61,556,557],{},"No data flows",[61,559,560],{},"SCOPE_DEFINED",[43,562,563,566],{},[61,564,565],{},"No classifications or attributes",[61,567,568],{},"STRUCTURE_COMPLETE",[43,570,571,574],{},[61,572,573],{},"Has classifications or attributes",[61,575,576],{},"ENRICHING",[14,578,579,582],{},[64,580,581],{},"REVIEWED is never inferred"," — it requires explicit validation through the workflow.",[14,584,585,588,589,592],{},[64,586,587],{},"DISCOVERED is skipped"," — discovery is a plugin-side concept. Platform models don't track discovery provenance. If you resume the guided workflow (",[98,590,591],{},"\u002Fdethereal:threat-model",") on a pulled model inferred as STRUCTURE_COMPLETE, it starts from Step 5 (Data Flow Mapping), skipping discovery and model review.",[141,594,596],{"id":595},"missing-scope-metadata","Missing Scope Metadata",[14,598,599,600,603,604,607,608,610],{},"Pull materialises ",[98,601,602],{},".dethereal\u002Fscope.json"," from the platform model's scope fields (depth, modeling intent, compliance drivers, exclusions, trust assumptions), keeping any local-only workflow settings already in the file; push reads it back. A legacy model created without scope simply yields a ",[98,605,606],{},"scope.json"," with no synced keys — you can fill it in via ",[98,609,591],{},", but you no longer need to hand-create the file.",[141,612,614],{"id":613},"referenced-models","Referenced Models",[14,616,617,618,621,622,625],{},"If the pulled model references other models (via ",[98,619,620],{},"representedModel"," links), those references are displayed but ",[64,623,624],{},"not auto-pulled"," — pulling referenced models could trigger unbounded recursive imports.",[18,627],{},[21,629,631],{"id":630},"sync-status","Sync Status",[131,633,636],{"className":634,"code":635,"language":136},[134],"> \u002Fdethereal:sync status\n\nSync Status: .\u002Fthreat-models\u002Fprod\u002F\n\n  Model: \"Production Stack\"\n  Quality: 56\u002F100\n  State: ENRICHING\n\n  Platform:\n    Model ID: abc-123-def\n    URL: https:\u002F\u002Fdethernety.example.com\n    Auth: user@example.com (45 min remaining)\n\n  Sync:\n    Last push: 2 hours ago\n    Last pull: never\n    Local: Changes not pushed (3 files modified)\n\n  Referenced Models: API Service (not available locally)\n",[98,637,635],{"__ignoreMap":139},[141,639,641],{"id":640},"content-hashing","Content Hashing",[14,643,644],{},"The plugin uses content hashes to determine if local changes exist. Diagram layout (position, dimensions) and export timestamps are excluded — moving components around doesn't count as a model change — but edits to structure (including component crown-jewel marks), data items (including data sensitivity and regulatory flags), element security attributes, and model scope all do, so local enrichment is detected before a pull would overwrite it.",[18,646],{},[21,648,650],{"id":649},"version-control-with-git","Version Control with Git",[141,652,514],{"id":653},"what-to-commit",[14,655,656],{},[64,657,658],{},"Always commit:",[153,660,661,675,681,688,694,704,710],{},[156,662,663,664,337,667,337,670,337,673],{},"Model files: ",[98,665,666],{},"manifest.json",[98,668,669],{},"structure.json",[98,671,672],{},"dataflows.json",[98,674,100],{},[156,676,677,678],{},"Attribute files: ",[98,679,680],{},"attributes\u002F**\u002F*.json",[156,682,683,684,687],{},"Control files: ",[98,685,686],{},"controls\u002F\u003Cid>.json"," (one per Control referenced by the model)",[156,689,690,691,693],{},"Control audit log: ",[98,692,315],{}," — append-only JSONL ledger of shared-ownership decisions (force-shared, force-unverified). Committed so PR review can see who decided what; grep\u002Fjq friendly.",[156,695,696,697,337,699,337,702],{},"Workflow metadata: ",[98,698,525],{},[98,700,701],{},".dethereal\u002Fquality.json",[98,703,602],{},[156,705,706,707],{},"Auto-generated README: ",[98,708,709],{},"README.md",[156,711,712,713],{},"Model registry: ",[98,714,715],{},".dethernety\u002Fmodels.json",[14,717,718],{},[64,719,720],{},"Always gitignore:",[153,722,723,728,734,739,748,754],{},[156,724,725,727],{},[98,726,164],{}," — per-user sync state (different per developer)",[156,729,730,733],{},[98,731,732],{},".dethereal\u002Fdiscovery.json"," — discovery provenance (may contain infrastructure paths and resource identifiers)",[156,735,736,738],{},[98,737,425],{}," — WAL journal (transient; replayed automatically on next skill entry)",[156,740,741,743,744,747],{},[98,742,358],{}," — staging directory for ",[98,745,746],{},"merge-from-file"," payloads",[156,749,750,753],{},[98,751,752],{},".dethernety\u002Fdiscovery-cache.json"," — transient cache",[156,755,756,759],{},[98,757,758],{},"*.backup-*\u002F"," — timestamped model-tree snapshots dropped beside the model directory by push and by backup-mode pull",[14,761,762,769,770,773,774,776,777,780,781,784,785,788,789,792,793,795,796,768],{},[64,763,764,765,768],{},"If the plugin tells you to ignore all of ",[98,766,767],{},".dethereal\u002F","."," ",[98,771,772],{},"\u002Fdethereal:discover"," recommends adding the entire ",[98,775,767],{}," directory to ",[98,778,779],{},".gitignore",", because it holds source paths and workflow state. Use the per-file rules above instead. Ignoring the directory wholesale also drops ",[98,782,783],{},"control-audit.log"," — the record of who approved each shared-Control push, which is the whole reason it is reviewable in a PR — and ",[98,786,787],{},"state.json",", whose ",[98,790,791],{},"lastReconcileCommit"," is the baseline that drift detection compares against. (Read the audit-log note below before committing that file — it records prior attribute payloads verbatim.) Without that baseline, the next ",[98,794,591],{}," resume skips drift detection until you re-run ",[98,797,772],{},[14,799,800,769,803,805,806,809],{},[64,801,802],{},"Note on the audit log.",[98,804,315],{}," records per-Control decisions verbatim, including the prior ",[98,807,808],{},"platformAttributes"," payload. If your Controls store secret-shaped values (raw API keys, tokens), redact before commit. The log is human-readable, line-oriented JSON.",[14,811,812,813,816],{},"Token storage (",[98,814,815],{},"~\u002F.dethernety\u002F",") is in your home directory, outside the repository — no gitignore entry needed.",[14,818,819,820,822],{},"Add to your ",[98,821,779],{},":",[131,824,828],{"className":825,"code":826,"language":827,"meta":139,"style":139},"language-gitignore shiki shiki-themes github-light github-dark-dimmed","# Dethereal per-user state\n**\u002F.dethereal\u002Fsync.json\n\n# Discovery provenance (may contain infrastructure details)\n**\u002F.dethereal\u002Fdiscovery.json\n\n# WAL journal (transient — replayed automatically)\n**\u002F.dethereal\u002Fpending-id-rewrite.json\n\n# Merge-staging payloads (per-prompt working files)\n**\u002F.dethereal\u002Fmerge-staging\u002F\n\n# Discovery cache (transient)\n.dethernety\u002Fdiscovery-cache.json\n\n# Timestamped model backups (push, and backup-mode pull)\n*.backup-*\u002F\n","gitignore",[98,829,830,838,844,851,857,863,868,874,880,885,891,897,902,908,914,919,925],{"__ignoreMap":139},[831,832,835],"span",{"class":833,"line":834},"line",1,[831,836,837],{},"# Dethereal per-user state\n",[831,839,841],{"class":833,"line":840},2,[831,842,843],{},"**\u002F.dethereal\u002Fsync.json\n",[831,845,847],{"class":833,"line":846},3,[831,848,850],{"emptyLinePlaceholder":849},true,"\n",[831,852,854],{"class":833,"line":853},4,[831,855,856],{},"# Discovery provenance (may contain infrastructure details)\n",[831,858,860],{"class":833,"line":859},5,[831,861,862],{},"**\u002F.dethereal\u002Fdiscovery.json\n",[831,864,866],{"class":833,"line":865},6,[831,867,850],{"emptyLinePlaceholder":849},[831,869,871],{"class":833,"line":870},7,[831,872,873],{},"# WAL journal (transient — replayed automatically)\n",[831,875,877],{"class":833,"line":876},8,[831,878,879],{},"**\u002F.dethereal\u002Fpending-id-rewrite.json\n",[831,881,883],{"class":833,"line":882},9,[831,884,850],{"emptyLinePlaceholder":849},[831,886,888],{"class":833,"line":887},10,[831,889,890],{},"# Merge-staging payloads (per-prompt working files)\n",[831,892,894],{"class":833,"line":893},11,[831,895,896],{},"**\u002F.dethereal\u002Fmerge-staging\u002F\n",[831,898,900],{"class":833,"line":899},12,[831,901,850],{"emptyLinePlaceholder":849},[831,903,905],{"class":833,"line":904},13,[831,906,907],{},"# Discovery cache (transient)\n",[831,909,911],{"class":833,"line":910},14,[831,912,913],{},".dethernety\u002Fdiscovery-cache.json\n",[831,915,917],{"class":833,"line":916},15,[831,918,850],{"emptyLinePlaceholder":849},[831,920,922],{"class":833,"line":921},16,[831,923,924],{},"# Timestamped model backups (push, and backup-mode pull)\n",[831,926,928],{"class":833,"line":927},17,[831,929,930],{},"*.backup-*\u002F\n",[141,932,934],{"id":933},"git-as-the-undo-mechanism","Git as the Undo Mechanism",[14,936,937],{},"Dethereal has no custom undo tool — git is the undo mechanism. When you want to revert changes:",[153,939,940,957],{},[156,941,942,769,945,948,949,952,953,956],{},[64,943,944],{},"Uncommitted changes:",[98,946,947],{},"git diff"," to see what changed, ",[98,950,951],{},"git checkout -- \u003Cfile>"," to revert specific files, or ",[98,954,955],{},"git stash"," to save changes for later",[156,958,959,769,962,965],{},[64,960,961],{},"Committed changes:",[98,963,964],{},"git revert \u003Ccommit>"," to undo a specific commit",[14,967,968,969,972],{},"The plugin assists with git commands when you ask to undo, but it ",[64,970,971],{},"never auto-executes destructive git commands"," — it shows you the command, explains what will happen, and lets you confirm.",[14,974,975],{},[64,976,977],{},"Recommended commit points:",[153,979,980,987,990,996],{},[156,981,982,983,986],{},"After model creation (",[98,984,985],{},"\u002Fdethereal:create",")",[156,988,989],{},"After the session break (Step 5 — structure complete, before enrichment)",[156,991,992,993,986],{},"After enrichment (",[98,994,995],{},"\u002Fdethereal:enrich",[156,997,998,999,1002],{},"After pushing to the platform (",[98,1000,1001],{},"\u002Fdethereal:sync push"," — server IDs updated)",[141,1004,1006],{"id":1005},"branching-and-model-identity","Branching and Model Identity",[14,1008,1009,1010,1012],{},"Models carry a platform model ID in ",[98,1011,666],{},". When you branch:",[153,1014,1015,1021,1024],{},[156,1016,1017,1018],{},"Both branches reference the ",[64,1019,1020],{},"same platform model",[156,1022,1023],{},"Pushing from either branch updates the same platform model",[156,1025,1026],{},"Merging model file changes works like any JSON merge (git handles it)",[14,1028,1029],{},"Be aware that if two branches diverge significantly, pushing from one may overwrite the other's changes on the platform. The conflict detection mechanism helps, but it compares local-vs-platform, not branch-vs-branch.",[141,1031,1033],{"id":1032},"reviewing-model-changes-in-prs","Reviewing Model Changes in PRs",[14,1035,1036],{},"Since models are plain JSON, model updates go through the same code review process as code changes. Reviewers can see exactly which components, flows, or attributes changed in the diff.",[18,1038],{},[21,1040,1042],{"id":1041},"multi-model-projects","Multi-Model Projects",[141,1044,1046],{"id":1045},"when-to-decompose","When to Decompose",[14,1048,1049],{},"The plugin recommends decomposition when a model exceeds complexity thresholds:",[29,1051,1054],{"className":1052,"tabIndex":33,"role":34,"ariaLabel":1053},[32],"Table: When to Decompose",[37,1055,1056,1066],{},[40,1057,1058],{},[43,1059,1060,1063],{},[46,1061,1062],{},"Dimension",[46,1064,1065],{},"Threshold",[56,1067,1068,1076,1084,1092],{},[43,1069,1070,1073],{},[61,1071,1072],{},"Components",[61,1074,1075],{},"21+",[43,1077,1078,1081],{},[61,1079,1080],{},"Trust boundaries",[61,1082,1083],{},"9+",[43,1085,1086,1089],{},[61,1087,1088],{},"Data flows",[61,1090,1091],{},"36+",[43,1093,1094,1097],{},[61,1095,1096],{},"Cross-boundary flows",[61,1098,1099],{},"19+",[14,1101,1102],{},"This check runs after Step 3 (Model Review) in the guided workflow. The recommendation is advisory — you can proceed with a large model.",[141,1104,1106],{"id":1105},"scope-narrowing-vs-decomposition-plan","Scope Narrowing vs. Decomposition Plan",[14,1108,1109,1112],{},[64,1110,1111],{},"Default recommendation: scope narrowing."," Start with the highest-risk subsystem (containing crown jewels). This produces one complete, analysis-ready model first and gets to value faster.",[14,1114,1115,1118,1119,822],{},[64,1116,1117],{},"If you described multiple systems:"," the plugin offers a decomposition plan. This tracks multiple models upfront in ",[98,1120,1121],{},".dethernety\u002Fdecomposition-plan.json",[131,1123,1127],{"className":1124,"code":1125,"language":1126,"meta":139,"style":139},"language-json shiki shiki-themes github-light github-dark-dimmed","{\n  \"models\": [\n    { \"name\": \"API Layer\", \"path\": \".\u002Fthreat-models\u002Fapi-layer\", \"status\": \"complete\" },\n    { \"name\": \"Data Platform\", \"path\": \".\u002Fthreat-models\u002Fdata-platform\", \"status\": \"in_progress\" },\n    { \"name\": \"Auth Infrastructure\", \"path\": \".\u002Fthreat-models\u002Fauth\", \"status\": \"planned\" }\n  ],\n  \"cross_model_links\": [\n    { \"from_model\": \"API Layer\", \"to_model\": \"Data Platform\", \"description\": \"Database queries\" }\n  ]\n}\n","json",[98,1128,1129,1135,1144,1182,1213,1245,1250,1257,1289,1294],{"__ignoreMap":139},[831,1130,1131],{"class":833,"line":834},[831,1132,1134],{"class":1133},"sYgZi","{\n",[831,1136,1137,1141],{"class":833,"line":840},[831,1138,1140],{"class":1139},"snmFh","  \"models\"",[831,1142,1143],{"class":1133},": [\n",[831,1145,1146,1149,1152,1155,1159,1161,1164,1166,1169,1171,1174,1176,1179],{"class":833,"line":846},[831,1147,1148],{"class":1133},"    { ",[831,1150,1151],{"class":1139},"\"name\"",[831,1153,1154],{"class":1133},": ",[831,1156,1158],{"class":1157},"s-HuK","\"API Layer\"",[831,1160,337],{"class":1133},[831,1162,1163],{"class":1139},"\"path\"",[831,1165,1154],{"class":1133},[831,1167,1168],{"class":1157},"\".\u002Fthreat-models\u002Fapi-layer\"",[831,1170,337],{"class":1133},[831,1172,1173],{"class":1139},"\"status\"",[831,1175,1154],{"class":1133},[831,1177,1178],{"class":1157},"\"complete\"",[831,1180,1181],{"class":1133}," },\n",[831,1183,1184,1186,1188,1190,1193,1195,1197,1199,1202,1204,1206,1208,1211],{"class":833,"line":853},[831,1185,1148],{"class":1133},[831,1187,1151],{"class":1139},[831,1189,1154],{"class":1133},[831,1191,1192],{"class":1157},"\"Data Platform\"",[831,1194,337],{"class":1133},[831,1196,1163],{"class":1139},[831,1198,1154],{"class":1133},[831,1200,1201],{"class":1157},"\".\u002Fthreat-models\u002Fdata-platform\"",[831,1203,337],{"class":1133},[831,1205,1173],{"class":1139},[831,1207,1154],{"class":1133},[831,1209,1210],{"class":1157},"\"in_progress\"",[831,1212,1181],{"class":1133},[831,1214,1215,1217,1219,1221,1224,1226,1228,1230,1233,1235,1237,1239,1242],{"class":833,"line":859},[831,1216,1148],{"class":1133},[831,1218,1151],{"class":1139},[831,1220,1154],{"class":1133},[831,1222,1223],{"class":1157},"\"Auth Infrastructure\"",[831,1225,337],{"class":1133},[831,1227,1163],{"class":1139},[831,1229,1154],{"class":1133},[831,1231,1232],{"class":1157},"\".\u002Fthreat-models\u002Fauth\"",[831,1234,337],{"class":1133},[831,1236,1173],{"class":1139},[831,1238,1154],{"class":1133},[831,1240,1241],{"class":1157},"\"planned\"",[831,1243,1244],{"class":1133}," }\n",[831,1246,1247],{"class":833,"line":865},[831,1248,1249],{"class":1133},"  ],\n",[831,1251,1252,1255],{"class":833,"line":870},[831,1253,1254],{"class":1139},"  \"cross_model_links\"",[831,1256,1143],{"class":1133},[831,1258,1259,1261,1264,1266,1268,1270,1273,1275,1277,1279,1282,1284,1287],{"class":833,"line":876},[831,1260,1148],{"class":1133},[831,1262,1263],{"class":1139},"\"from_model\"",[831,1265,1154],{"class":1133},[831,1267,1158],{"class":1157},[831,1269,337],{"class":1133},[831,1271,1272],{"class":1139},"\"to_model\"",[831,1274,1154],{"class":1133},[831,1276,1192],{"class":1157},[831,1278,337],{"class":1133},[831,1280,1281],{"class":1139},"\"description\"",[831,1283,1154],{"class":1133},[831,1285,1286],{"class":1157},"\"Database queries\"",[831,1288,1244],{"class":1133},[831,1290,1291],{"class":833,"line":882},[831,1292,1293],{"class":1133},"  ]\n",[831,1295,1296],{"class":833,"line":887},[831,1297,1298],{"class":1133},"}\n",[141,1300,1302],{"id":1301},"cross-model-references","Cross-Model References",[14,1304,1305,1306,1308],{},"When one model references components from another model, it uses ",[98,1307,620],{}," links. These are stub components that point to the detailed model:",[153,1310,1311,1314,1321],{},[156,1312,1313],{},"The stub is visible in the local model but marked as representing an external model",[156,1315,1316,1317,1320],{},"Attack paths through these stubs are ",[64,1318,1319],{},"not included"," in the local model's analysis",[156,1322,1323],{},"If the same credential appears in multiple local models, the attack surface analysis warns about cross-model credential reuse",[141,1325,1327],{"id":1326},"discovery-cache-sharing","Discovery Cache Sharing",[14,1329,1330,1331,1333],{},"The discovery cache (",[98,1332,752],{},") is shared across models in a project. When creating a second model in a decomposition plan, the plugin filters the cache to exclude components already assigned to the first model's scope.",[18,1335],{},[14,1337,1338,769,1341,1345],{},[64,1339,1340],{},"Next:",[511,1342,1344],{"href":1343},"\u002Fdethereal\u002Freview-and-analysis","Review and Analysis"," — quality review, attack surface analysis",[1347,1348,1349],"style",{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sYgZi, html code.shiki .sYgZi{--shiki-default:#24292E;--shiki-dark:#ADBAC7}html pre.shiki code .snmFh, html code.shiki .snmFh{--shiki-default:#005CC5;--shiki-dark:#8DDB8C}html pre.shiki code .s-HuK, html code.shiki .s-HuK{--shiki-default:#032F62;--shiki-dark:#96D0FF}",{"title":139,"searchDepth":846,"depth":846,"links":1351},[1352,1353,1363,1370,1373,1379],{"id":23,"depth":840,"text":24},{"id":128,"depth":840,"text":129,"children":1354},[1355,1356,1357,1358,1359,1360,1361,1362],{"id":143,"depth":846,"text":144},{"id":176,"depth":846,"text":177},{"id":187,"depth":846,"text":188},{"id":239,"depth":846,"text":240},{"id":263,"depth":846,"text":264},{"id":284,"depth":846,"text":285},{"id":362,"depth":846,"text":363},{"id":386,"depth":846,"text":387},{"id":457,"depth":840,"text":458,"children":1364},[1365,1366,1367,1368,1369],{"id":467,"depth":846,"text":468},{"id":480,"depth":846,"text":481},{"id":518,"depth":846,"text":519},{"id":595,"depth":846,"text":596},{"id":613,"depth":846,"text":614},{"id":630,"depth":840,"text":631,"children":1371},[1372],{"id":640,"depth":846,"text":641},{"id":649,"depth":840,"text":650,"children":1374},[1375,1376,1377,1378],{"id":653,"depth":846,"text":514},{"id":933,"depth":846,"text":934},{"id":1005,"depth":846,"text":1006},{"id":1032,"depth":846,"text":1033},{"id":1041,"depth":840,"text":1042,"children":1380},[1381,1382,1383,1384],{"id":1045,"depth":846,"text":1046},{"id":1105,"depth":846,"text":1106},{"id":1301,"depth":846,"text":1302},{"id":1326,"depth":846,"text":1327},"Push\u002Fpull workflow, conflict handling, git integration, and multi-model projects","md",{"category":1388,"position":870,"tags":1389},"documentation",[1390,1391,1392,1393,1394,1395],"dethereal","sync","git","version-control","push","pull","\u002Fdethereal\u002Fsync-and-version-control",{"title":5,"description":1385},"03.dethereal\u002F06.sync-and-version-control","my0rfXF_bE-M56j9KKBtmkBcAtwjIjt2Iz_K_otmMd0",[1401,1456,1491,1541,1575,1619,1634,1704],{"title":1402,"description":1403,"path":1404,"stem":1405,"children":1406,"page":-1},"Platform","Modelling, analysis, findings and controls in the Dethernety platform.","\u002Fplatform","01.platform",[1407,1411,1416,1421,1426,1431,1436,1441,1446,1451],{"title":1408,"path":1404,"stem":1409,"description":1410},"Dethernety User Documentation","01.platform\u002Findex","User guide for the Dethernety threat modeling platform",{"title":1412,"path":1413,"stem":1414,"description":1415},"Quick Start","\u002Fplatform\u002Fquick-start","01.platform\u002F01.quick-start","Install Dethernety on your own machine, draw a four-element model and read its first threat finding.",{"title":1417,"path":1418,"stem":1419,"description":1420},"Building Your First Model","\u002Fplatform\u002Fbuilding-your-first-model","01.platform\u002F02.building-your-first-model","Build a threat model of an online store in about 30 minutes, run a Threat Report on it, and raise an issue from a finding.",{"title":1422,"path":1423,"stem":1424,"description":1425},"Security Analysis Workflow","\u002Fplatform\u002Fsecurity-analysis-workflow","01.platform\u002F03.security-analysis-workflow","How to run security analysis and interpret results to improve your threat models.",{"title":1427,"path":1428,"stem":1429,"description":1430},"Managing Findings","\u002Fplatform\u002Fmanaging-findings","01.platform\u002F04.managing-findings","Record decisions on system-generated exposures and countermeasures — affirm them as confirmed live risk, or mute them as not applicable, false positive, waived, or superseded — instead of deleting them.",{"title":1432,"path":1433,"stem":1434,"description":1435},"Working with Security Controls","\u002Fplatform\u002Fworking-with-security-controls","01.platform\u002F05.working-with-security-controls","Learn how to create, manage, and assign reusable security controls in Dethernety to protect your threat models.",{"title":1437,"path":1438,"stem":1439,"description":1440},"Issue Management Guide","\u002Fplatform\u002Fissue-management-guide","01.platform\u002F06.issue-management-guide","Issue tracking, filtering, and management in Dethernety.",{"title":1442,"path":1443,"stem":1444,"description":1445},"Boundary Trust Zones","\u002Fplatform\u002Fboundary-trust-zones","01.platform\u002F07.boundary-trust-zones","Record each security boundary's trust zone, business domains, operational role, and approved channels to document how your system is meant to be segmented.",{"title":1447,"path":1448,"stem":1449,"description":1450},"Understanding Modules","\u002Fplatform\u002Funderstanding-modules","01.platform\u002F08.understanding-modules","How Dethernety's module system extends your threat modeling capabilities.",{"title":1452,"path":1453,"stem":1454,"description":1455},"Component Configuration Guide","\u002Fplatform\u002Fcomponent-configuration-guide","01.platform\u002F09.component-configuration-guide","Detailed guide on configuring different types of components and their security implications.",{"title":1457,"description":1458,"path":1459,"stem":1460,"children":1461,"page":-1},"BYODt cloud","Deploying the platform yourself and connecting it to the BYODt cloud.","\u002Fbyodt-cloud","02.byodt-cloud",[1462,1466,1471,1476,1481,1486],{"title":1463,"path":1459,"stem":1464,"description":1465},"BYODt Deployment","02.byodt-cloud\u002Findex","Run Dethernety on your own machine: install, configure, operate, and recover",{"title":1467,"path":1468,"stem":1469,"description":1470},"Installing the BYODt Deployment","\u002Fbyodt-cloud\u002Finstallation","02.byodt-cloud\u002F01.installation","Install Dethernety on your own machine: check the requirements, download and verify the signed bundle, start it, and confirm the deployment is healthy",{"title":1472,"path":1473,"stem":1474,"description":1475},"Configuring the BYODt Deployment","\u002Fbyodt-cloud\u002Fconfiguration","02.byodt-cloud\u002F02.configuration","The .env settings reference, the generated secret file, database storage, and how to apply a change",{"title":1477,"path":1478,"stem":1479,"description":1480},"Operating the BYODt Deployment","\u002Fbyodt-cloud\u002Foperations","02.byodt-cloud\u002F03.operations","The byodt command reference and the day-to-day tasks: start, stop, inspect, back up, restore, TLS, upgrade, remove",{"title":1482,"path":1483,"stem":1484,"description":1485},"Connecting the BYODt Deployment to the Cloud","\u002Fbyodt-cloud\u002Fcloud","02.byodt-cloud\u002F04.cloud","Add cloud sign-in and content packages from the operator console, and disconnect again",{"title":1487,"path":1488,"stem":1489,"description":1490},"Troubleshooting the BYODt Deployment","\u002Fbyodt-cloud\u002Ftroubleshooting","02.byodt-cloud\u002F05.troubleshooting","Symptom, cause, and fix for the failures this deployment reports",{"title":1492,"description":1493,"path":1494,"stem":1495,"children":1496,"page":-1},"Dethereal","The Claude Code plugin: build a threat model in conversation and publish it to the platform.","\u002Fdethereal","03.dethereal",[1497,1501,1506,1511,1516,1521,1526,1527,1531,1536],{"title":1498,"path":1494,"stem":1499,"description":1500},"Dethereal — Claude Code Plugin for Threat Modeling","03.dethereal\u002Findex","Comprehensive documentation for the Dethereal threat modeling plugin",{"title":1502,"path":1503,"stem":1504,"description":1505},"Getting Started with Dethereal","\u002Fdethereal\u002Fgetting-started","03.dethereal\u002F01.getting-started","Install the plugin, authenticate, and create your first threat model",{"title":1507,"path":1508,"stem":1509,"description":1510},"The 11-Step Guided Workflow","\u002Fdethereal\u002Fguided-workflow","03.dethereal\u002F02.guided-workflow","Complete walkthrough of the \u002Fdethereal:threat-model guided process",{"title":1512,"path":1513,"stem":1514,"description":1515},"Command Reference","\u002Fdethereal\u002Fcommand-reference","03.dethereal\u002F03.command-reference","Complete reference for all 14 Dethereal slash commands",{"title":1517,"path":1518,"stem":1519,"description":1520},"Threat Model Concepts","\u002Fdethereal\u002Fmodel-concepts","03.dethereal\u002F04.model-concepts","Components, boundaries, data flows, classes, attributes, and quality scoring",{"title":1522,"path":1523,"stem":1524,"description":1525},"Discovery and Enrichment","\u002Fdethereal\u002Fdiscovery-and-enrichment","03.dethereal\u002F05.discovery-and-enrichment","Infrastructure scanning, security attributes, MITRE ATT&CK, credentials, and compliance",{"title":5,"path":1396,"stem":1398,"description":1385},{"title":1528,"path":1343,"stem":1529,"description":1530},"Review and Attack Surface Analysis","03.dethereal\u002F07.review-and-analysis","Quality review, attack surface summary, and platform analysis integration",{"title":1532,"path":1533,"stem":1534,"description":1535},"Agents, Tools, and Hooks","\u002Fdethereal\u002Fagents-and-architecture","03.dethereal\u002F08.agents-and-architecture","How the 5 AI agents, 22 MCP tools, and 3 lifecycle hooks work together",{"title":1537,"path":1538,"stem":1539,"description":1540},"Dethereal Glossary","\u002Fdethereal\u002Fglossary","03.dethereal\u002F09.glossary","Definitions for Dethereal-specific terminology",{"title":1542,"description":1543,"path":1544,"stem":1545,"children":1546,"page":-1},"Threat Report","The residual-risk report over a threat model: reading it, filtering it and exporting it.","\u002Fthreat-report","04.threat-report",[1547,1550,1555,1560,1565,1570],{"title":1542,"path":1544,"stem":1548,"description":1549},"04.threat-report\u002Findex","Read, filter, drill into, and export a residual-risk report over a threat model",{"title":1551,"path":1552,"stem":1553,"description":1554},"Getting Started with the Threat Report","\u002Fthreat-report\u002Fgetting-started","04.threat-report\u002F01.getting-started","Generate, open, refresh, and export a threat report over a model",{"title":1556,"path":1557,"stem":1558,"description":1559},"Reading the Report","\u002Fthreat-report\u002Freading-the-report","04.threat-report\u002F02.reading-the-report","Navigating the report, the shared visual language, and the Posture and Boundary Crossings views",{"title":1561,"path":1562,"stem":1563,"description":1564},"Understanding Coverage and Gaps","\u002Fthreat-report\u002Funderstanding-coverage","04.threat-report\u002F03.understanding-coverage","Reading the MITRE ATT&CK coverage matrix: tiers, prevent vs detect, off-grid notes, and what coverage does and does not mean",{"title":1566,"path":1567,"stem":1568,"description":1569},"Reachability and Flow Routes","\u002Fthreat-report\u002Freachability","04.threat-report\u002F04.reachability","Exploring flow routes to crown-jewel assets and between any two elements — and what the analysis does and does not model",{"title":1571,"path":1572,"stem":1573,"description":1574},"Working with Findings","\u002Fthreat-report\u002Fworking-with-findings","04.threat-report\u002F05.working-with-findings","The Residual Risk ledger, triaging findings, filtering, and the per-element Component Profile",{"title":1576,"description":1577,"path":1578,"stem":1579,"children":1580,"page":-1},"Risk assessment","The risk assessment module: the register, the reports and the method behind them.","\u002Frisk-assessment","05.risk-assessment",[1581,1585,1590,1595,1600,1605,1609,1614],{"title":1582,"path":1578,"stem":1583,"description":1584},"Dethernety Risk Assessment User Guide","05.risk-assessment\u002Findex","Dethernety Risk Assessment turns a threat model you have built on the Dethernety platform into a grounded, board-ready draft risk report. From one point-in-time assessment of your model you get a prioritized worklist, a likelihood × impact risk matrix, a security-coverage posture, ten kinds of finding, a management risk register your team authors and maintains, and audience-tiered stakeholder reports — Board, Risk Committee, and Technical — plus machine-readable data exports.",{"title":1586,"path":1587,"stem":1588,"description":1589},"FAQ and Troubleshooting","\u002Frisk-assessment\u002Ffaq","05.risk-assessment\u002F01.faq","Short answers to the questions analysts, risk managers, and compliance officers ask most often about the Risk Assessment. Each answer links to the guide that covers it in full.",{"title":1591,"path":1592,"stem":1593,"description":1594},"Findings","\u002Frisk-assessment\u002Ffindings","05.risk-assessment\u002F02.findings","A finding is a specific observation the Risk Assessment makes about your threat model. Every finding is grounded in something concrete you have declared — an element, a data flow, a trust zone, a crown jewel — and it points you at a place worth a closer look. This guide is the reference to open when you see a finding and want to know what it means and what to do about it.",{"title":1596,"path":1597,"stem":1598,"description":1599},"Getting Started","\u002Frisk-assessment\u002Fgetting-started","05.risk-assessment\u002F03.getting-started","Risk Assessment turns a threat model you have built on the Dethernety platform into a grounded, board-ready draft risk report — a prioritized worklist, a likelihood × impact matrix, a security-coverage posture, ten kinds of finding, a risk register your team authors, and audience-tiered stakeholder reports and exports.",{"title":1601,"path":1602,"stem":1603,"description":1604},"Methodology and Trust","\u002Frisk-assessment\u002Fmethodology-and-trust","05.risk-assessment\u002F04.methodology-and-trust","Every number in a Risk Assessment is meant to survive scrutiny. This chapter explains why you can trust the report and — just as importantly — what it deliberately declines to claim, so you can put it in front of your board, a regulator, or an external auditor and defend every line.",{"title":1556,"path":1606,"stem":1607,"description":1608},"\u002Frisk-assessment\u002Freading-the-report","05.risk-assessment\u002F05.reading-the-report","The Risk Assessment turns your threat model into a single, scannable draft risk report: an executive summary at the top and a set of analytical tabs below it. This guide explains how to read what you see — what a matrix cell means, how coverage is stated, what a severity band is (and is not), and how to interpret each tab.",{"title":1610,"path":1611,"stem":1612,"description":1613},"Stakeholder Reports and Exports","\u002Frisk-assessment\u002Fstakeholder-reports","05.risk-assessment\u002F06.stakeholder-reports","One assessment produces reporting for every audience you answer to. From a single generated Risk Assessment you can hand your board a one-page brief, give your risk committee the full reconciliation, keep the complete technical detail for your own team, and export the underlying data into your GRC tool — without ever re-running anything or reconciling one document against another.",{"title":1615,"path":1616,"stem":1617,"description":1618},"The Risk Register","\u002Frisk-assessment\u002Fthe-risk-register","05.risk-assessment\u002F07.the-risk-register","The Risk Register is where your team records and manages the real risks your organisation is carrying — on top of, but separate from, what the analysis computed for you. Each entry is written by a person: a plain-language risk statement, your own assessment of how likely it is and how much it would hurt, the findings and elements from the analysis that back it up, a treatment decision, an owner, a review date, and a reference handle you can quote in a ticket or a board pack.",{"title":1620,"description":1621,"path":1622,"stem":1623,"children":1624,"page":-1},"Threat Patterns","The Threat Patterns module and its modelling checklist.","\u002Fthreat-patterns","06.threat-patterns",[1625,1629],{"title":1626,"path":1622,"stem":1627,"description":1628},"Threat Patterns User Guide","06.threat-patterns\u002Findex","Threat Patterns finds threats in your model that no single element shows on its own. Each one appears only when several elements line up. For example, an agent may read content anyone can write, hold private data, and be able to send data where an outsider reads it. Each element can look acceptable alone, but together they form a path an attacker can use.",{"title":1630,"path":1631,"stem":1632,"description":1633},"Modelling Checklist","\u002Fthreat-patterns\u002Fmodelling-checklist","06.threat-patterns\u002F01.modelling-checklist","Threat Patterns decides a leg only from what your model states. An unanswered attribute or field is undetermined, never read as \"no\". This checklist lists the facts and drawings the analysis asks for most often. For each one it says where to set it and which leg it settles. Attribute names are shown as they appear on the class, in code.",{"title":1635,"description":1636,"path":1637,"stem":1638,"children":1639,"page":-1},"Agentic modelling","A hands-on training: model one agentic system step by step, with Threat Patterns after each step.","\u002Fagentic-modelling","07.agentic-modelling",[1640,1644,1649,1654,1659,1664,1669,1674,1679,1684,1689,1694,1699],{"title":1641,"path":1637,"stem":1642,"description":1643},"Model an Agentic Architecture","07.agentic-modelling\u002Findex","A hands-on training in modelling systems that run AI agents, so that Threat Patterns can analyse them. You build one system, a fictional customer-support copilot, in eleven short lessons. Each lesson adds one thing to the model, and you run Threat Patterns after each one to see what the change did.",{"title":1645,"path":1646,"stem":1647,"description":1648},"Lesson 1: Draw the Agent and What It Talks To","\u002Fagentic-modelling\u002F01-draw-the-agent","07.agentic-modelling\u002F01.01-draw-the-agent","Training overview · Lesson 1 of 11 · Next: Say what data moves",{"title":1650,"path":1651,"stem":1652,"description":1653},"Lesson 2: Say What Data Moves","\u002Fagentic-modelling\u002F02-say-what-data-moves","07.agentic-modelling\u002F02.02-say-what-data-moves","Training overview · Lesson 2 of 11 · Previous: Draw the agent · Next: Mark who is outside",{"title":1655,"path":1656,"stem":1657,"description":1658},"Lesson 3: Mark Who Is Outside","\u002Fagentic-modelling\u002F03-mark-who-is-outside","07.agentic-modelling\u002F03.03-mark-who-is-outside","Training overview · Lesson 3 of 11 · Previous: Say what data moves · Next: Draw a tool that reaches any host",{"title":1660,"path":1661,"stem":1662,"description":1663},"Lesson 4: Draw a Tool That Reaches Any Host","\u002Fagentic-modelling\u002F04-draw-a-tool-that-reaches-any-host","07.agentic-modelling\u002F04.04-draw-a-tool-that-reaches-any-host","Training overview · Lesson 4 of 11 · Previous: Mark who is outside · Next: State what the agent can do",{"title":1665,"path":1666,"stem":1667,"description":1668},"Lesson 5: State What the Agent Can Do","\u002Fagentic-modelling\u002F05-state-what-the-agent-can-do","07.agentic-modelling\u002F05.05-state-what-the-agent-can-do","Training overview · Lesson 5 of 11 · Previous: Draw a tool that reaches any host · Next: Fix a finding with a fact",{"title":1670,"path":1671,"stem":1672,"description":1673},"Lesson 6: Fix a Finding With a Fact","\u002Fagentic-modelling\u002F06-fix-a-finding-with-a-fact","07.agentic-modelling\u002F06.06-fix-a-finding-with-a-fact","Training overview · Lesson 6 of 11 · Previous: State what the agent can do · Next: Record a compensating control",{"title":1675,"path":1676,"stem":1677,"description":1678},"Lesson 7: Record a Compensating Control","\u002Fagentic-modelling\u002F07-record-a-compensating-control","07.agentic-modelling\u002F07.07-record-a-compensating-control","Training overview · Lesson 7 of 11 · Previous: Fix a finding with a fact · Next: Leave what you don't know open",{"title":1680,"path":1681,"stem":1682,"description":1683},"Lesson 8: Leave What You Don't Know Open","\u002Fagentic-modelling\u002F08-leave-unknowns-open","07.agentic-modelling\u002F08.08-leave-unknowns-open","Training overview · Lesson 8 of 11 · Previous: Record a compensating control · Next: Follow a credential",{"title":1685,"path":1686,"stem":1687,"description":1688},"Lesson 9: Follow a Credential","\u002Fagentic-modelling\u002F09-follow-a-credential","07.agentic-modelling\u002F09.09-follow-a-credential","Training overview · Lesson 9 of 11 · Previous: Leave what you don't know open · Next: Watch what gets into knowledge and memory",{"title":1690,"path":1691,"stem":1692,"description":1693},"Lesson 10: Watch What Gets Into Knowledge and Memory","\u002Fagentic-modelling\u002F10-what-gets-in","07.agentic-modelling\u002F10.10-what-gets-in","Training overview · Lesson 10 of 11 · Previous: Follow a credential · Next: Draw tools from others and hand-offs",{"title":1695,"path":1696,"stem":1697,"description":1698},"Lesson 11: Draw Tools From Others and Hand-offs","\u002Fagentic-modelling\u002F11-tools-and-handoffs","07.agentic-modelling\u002F11.11-tools-and-handoffs","Training overview · Lesson 11 of 11 · Previous: Watch what gets into knowledge and memory",{"title":1700,"path":1701,"stem":1702,"description":1703},"The recipe at a glance","\u002Fagentic-modelling\u002Frecipe-at-a-glance","07.agentic-modelling\u002F12.recipe-at-a-glance","The ten steps of the training on one page. Each lesson teaches one or two of them.",{"title":1705,"description":1706,"path":1707,"stem":1708,"children":1709,"page":-1},"BYODt subscription","Subscribing on the BYODt Portal, and moving a deployment you already run to a new team.","\u002Fbyodt-subscription","08.byodt-subscription",[1710,1714,1719],{"title":1711,"path":1707,"stem":1712,"description":1713},"BYODt Subscription","08.byodt-subscription\u002Findex","Buy content for the deployment you run yourself, and decide where that deployment goes when you buy a team edition",{"title":1715,"path":1716,"stem":1717,"description":1718},"Your Subscription","\u002Fbyodt-subscription\u002Fyour-subscription","08.byodt-subscription\u002F01.your-subscription","Create an account, subscribe by card, and find the values your deployment needs on the portal",{"title":1720,"path":1721,"stem":1722,"description":1723},"Moving a Deployment to a New Team","\u002Fbyodt-subscription\u002Fmoving-a-deployment-to-a-new-team","08.byodt-subscription\u002F02.moving-a-deployment-to-a-new-team","What to do with the deployment you already run once you buy a team edition: three ways forward, best first",1793748185217]