[{"data":1,"prerenderedAt":2563},["ShallowReactive",2],{"page-\u002Fdethereal\u002Fguided-workflow":3,"navigation":2247},{"id":4,"title":5,"body":6,"description":2233,"extension":2234,"meta":2235,"navigation":1712,"path":2243,"seo":2244,"stem":2245,"__hash__":2246},"docs\u002F03.dethereal\u002F02.guided-workflow.md","The 11-Step Guided Workflow",{"type":7,"value":8,"toc":2189},"minimark",[9,13,22,25,30,35,47,51,54,64,72,76,276,279,281,285,289,295,298,302,308,311,317,324,330,336,368,371,375,385,391,393,397,400,405,522,527,533,540,546,548,552,559,592,595,601,604,610,617,623,626,631,633,637,640,646,653,658,660,664,667,673,676,687,692,703,709,737,743,812,838,841,899,902,959,966,976,982,985,990,992,996,999,1030,1033,1037,1048,1054,1065,1071,1076,1078,1081,1084,1089,1095,1100,1106,1111,1117,1123,1126,1129,1131,1135,1138,1146,1149,1155,1161,1163,1167,1170,1176,1179,1205,1208,1212,1218,1224,1235,1240,1242,1246,1253,1273,1306,1311,1337,1348,1351,1358,1376,1383,1387,1389,1393,1399,1405,1409,1416,1422,1451,1457,1463,1469,1475,1480,1482,1486,1489,1493,1496,1500,1503,1509,1512,1516,1526,1532,1543,1547,1561,1567,1626,1633,1635,1639,1642,1647,1653,1658,1664,1667,1678,1680,1684,1691,1909,1912,1914,1918,1924,1927,1933,1935,1938,1941,1947,1950,1956,1959,1964,1994,1997,1999,2003,2019,2022,2045,2054,2058,2061,2113,2132,2134,2138,2175,2177,2185],[10,11,5],"h1",{"id":12},"the-11-step-guided-workflow",[14,15,16,17,21],"p",{},"The ",[18,19,20],"code",{},"\u002Fdethereal:threat-model"," command walks you through building a complete threat model from scope definition to platform sync. You can stop at any point and resume later — your progress is saved automatically.",[23,24],"hr",{},[26,27,29],"h2",{"id":28},"overview","Overview",[31,32,34],"h3",{"id":33},"when-to-use-the-guided-workflow","When to Use the Guided Workflow",[14,36,37,38,40,41,46],{},"Use ",[18,39,20],{}," when you want the full modeling experience. It chains together discovery, classification, enrichment, validation, and sync in a logical order, with checkpoints between phases. For quick tasks (adding a single component, re-classifying one element), use individual commands instead — see the ",[42,43,45],"a",{"href":44},"\u002Fdethereal\u002Fcommand-reference","Command Reference",".",[31,48,50],{"id":49},"the-state-machine","The State Machine",[14,52,53],{},"Models progress through 6 states:",[55,56,61],"pre",{"className":57,"code":59,"language":60},[58],"language-text","INITIALIZED → SCOPE_DEFINED → DISCOVERED → STRUCTURE_COMPLETE → ENRICHING → REVIEWED\n","text",[18,62,59],{"__ignoreMap":63},"",[14,65,66,67,71],{},"Each state represents a maturity level. The guided workflow advances through these states as you complete steps. If you add or remove components during enrichment, the state automatically reverts to STRUCTURE_COMPLETE to ensure consistency (see ",[42,68,70],{"href":69},"#backward-transitions","Backward Transitions",").",[31,73,75],{"id":74},"the-11-steps-at-a-glance","The 11 Steps at a Glance",[77,78,84],"div",{"className":79,"tabIndex":81,"role":82,"ariaLabel":83},[80],"table-frame",0,"region","Table: The 11 Steps at a Glance",[85,86,87,106],"table",{},[88,89,90],"thead",{},[91,92,93,97,100,103],"tr",{},[94,95,96],"th",{},"Step",[94,98,99],{},"Name",[94,101,102],{},"What Happens",[94,104,105],{},"State After",[107,108,109,124,138,151,165,179,197,210,223,236,250,263],"tbody",{},[91,110,111,115,118,121],{},[112,113,114],"td",{},"1",[112,116,117],{},"Scope Definition",[112,119,120],{},"Define system, crown jewels, compliance",[112,122,123],{},"SCOPE_DEFINED",[91,125,126,129,132,135],{},[112,127,128],{},"2",[112,130,131],{},"Discovery",[112,133,134],{},"Scan codebase for infrastructure",[112,136,137],{},"DISCOVERED",[91,139,140,143,146,149],{},[112,141,142],{},"3",[112,144,145],{},"Model Review",[112,147,148],{},"Confirm components, initial classification",[112,150,137],{},[91,152,153,156,159,162],{},[112,154,155],{},"4",[112,157,158],{},"Boundary Refinement",[112,160,161],{},"Adjust trust boundaries and enforcement; ratify the trust skeleton (zones, planes)",[112,163,164],{},"STRUCTURE_COMPLETE",[91,166,167,170,173,176],{},[112,168,169],{},"5",[112,171,172],{},"Data Flow Mapping",[112,174,175],{},"Connect components, add operational flows; ratify risk-bearing crossings as approved channels",[112,177,178],{},"ENRICHING",[91,180,181,184,190,195],{},[112,182,183],{},"—",[112,185,186],{},[187,188,189],"em",{},"Session Break",[112,191,192],{},[187,193,194],{},"Checkpoint — resume later or continue",[112,196,183],{},[91,198,199,202,205,208],{},[112,200,201],{},"6",[112,203,204],{},"Classification",[112,206,207],{},"Classify remaining elements, tag crown jewels",[112,209,178],{},[91,211,212,215,218,221],{},[112,213,214],{},"7",[112,216,217],{},"Data Item Classification",[112,219,220],{},"Classify sensitive data on flows; promote qualifying boundaries to Restricted",[112,222,178],{},[91,224,225,228,231,234],{},[112,226,227],{},"8",[112,229,230],{},"Enrichment",[112,232,233],{},"Class-template attributes, security floor, credentials",[112,235,178],{},[91,237,238,241,244,247],{},[112,239,240],{},"9",[112,242,243],{},"Validation",[112,245,246],{},"Quality score, gate checks, readiness; advisory zoning-coherence findings",[112,248,249],{},"REVIEWED",[91,251,252,255,258,261],{},[112,253,254],{},"10",[112,256,257],{},"Sync",[112,259,260],{},"Push to platform",[112,262,249],{},[91,264,265,268,271,274],{},[112,266,267],{},"11",[112,269,270],{},"Post-Sync Linking",[112,272,273],{},"Link countermeasures to exposures",[112,275,249],{},[14,277,278],{},"Steps 5 through 8 all operate within the ENRICHING state. Sub-progress is tracked by the quality score (0-100), not by discrete state transitions.",[23,280],{},[26,282,284],{"id":283},"starting-the-workflow","Starting the Workflow",[31,286,288],{"id":287},"from-a-system-description-new-model","From a System Description (New Model)",[55,290,293],{"className":291,"code":292,"language":60},[58],"> \u002Fdethereal:threat-model a payment processing API with PostgreSQL and Redis\n",[18,294,292],{"__ignoreMap":63},[14,296,297],{},"The plugin starts from Step 1, asking you to define the scope before creating any files.",[31,299,301],{"id":300},"resuming-an-existing-model","Resuming an Existing Model",[55,303,306],{"className":304,"code":305,"language":60},[58],"> \u002Fdethereal:threat-model .\u002Fthreat-models\u002Fpayment-api\n",[18,307,305],{"__ignoreMap":63},[14,309,310],{},"Or if you only have one model:",[55,312,315],{"className":313,"code":314,"language":60},[58],"> \u002Fdethereal:threat-model\n",[18,316,314],{"__ignoreMap":63},[14,318,319,320,323],{},"The plugin reads ",[18,321,322],{},"state.json"," and shows a progress table:",[55,325,328],{"className":326,"code":327,"language":60},[58],"Progress: \"Payment API\" (Quality: 56\u002F100)\n  [done]        1. Scope Definition\n  [done]        2. Discovery\n  [done]        3. Model Review\n  [auto-skip]   4. Boundary Refinement (hierarchy already well-structured)\n  [>>>>]        5. Data Flow Mapping  — current step\n  [    ]        6. Classification\n  [    ]        7. Data Item Classification\n  [    ]        8. Enrichment\n  [    ]        9. Validation\n  [    ]       10. Sync\n  [    ]       11. Post-Sync Linking\n",[18,329,327],{"__ignoreMap":63},[14,331,332],{},[333,334,335],"strong",{},"Progress markers:",[337,338,339,350,356,362],"ul",{},[340,341,342,345,346,349],"li",{},[18,343,344],{},"[done]"," — step complete (state in ",[18,347,348],{},"completedStates",")",[340,351,352,355],{},[18,353,354],{},"[auto-skip]"," — step skipped because its conditions are already met",[340,357,358,361],{},[18,359,360],{},"[>>>>]"," — current step",[340,363,364,367],{},[18,365,366],{},"[    ]"," — not yet reached",[14,369,370],{},"You can jump to any step by typing its number, or type \"continue\" to proceed from the current position.",[31,372,374],{"id":373},"when-the-workflow-is-complete","When the Workflow Is Complete",[14,376,377,378,381,382,384],{},"If ",[18,379,380],{},"currentState"," is ",[18,383,249],{},":",[55,386,389],{"className":387,"code":388,"language":60},[58],"Workflow complete. Model is reviewed and ready for analysis.\nRun \u002Fdethereal:sync push to publish, or \u002Fdethereal:surface to review attack surface.\n",[18,390,388],{"__ignoreMap":63},[23,392],{},[26,394,396],{"id":395},"step-1-scope-definition","Step 1: Scope Definition",[14,398,399],{},"The plugin asks about your system through conversation — no forms to fill out.",[14,401,402],{},[333,403,404],{},"What it collects:",[77,406,409],{"className":407,"tabIndex":81,"role":82,"ariaLabel":408},[80],"Table: Step 1: Scope Definition",[85,410,411,424],{},[88,412,413],{},[91,414,415,418,421],{},[94,416,417],{},"Field",[94,419,420],{},"Required",[94,422,423],{},"Example",[107,425,426,437,447,458,469,480,491,502,512],{},[91,427,428,431,434],{},[112,429,430],{},"System name",[112,432,433],{},"Yes",[112,435,436],{},"\"Payment Processing API\"",[91,438,439,442,444],{},[112,440,441],{},"Description",[112,443,433],{},[112,445,446],{},"\"REST API handling card transactions with PostgreSQL and Redis cache\"",[91,448,449,452,455],{},[112,450,451],{},"Crown jewels",[112,453,454],{},"Yes (at least 1)",[112,456,457],{},"\"Cardholder data\", \"API keys\"",[91,459,460,463,466],{},[112,461,462],{},"Compliance drivers",[112,464,465],{},"Optional",[112,467,468],{},"SOC2, PCI-DSS, GDPR",[91,470,471,474,477],{},[112,472,473],{},"Modeling depth",[112,475,476],{},"Optional (default: architecture)",[112,478,479],{},"architecture, design, or implementation",[91,481,482,485,488],{},[112,483,484],{},"Modeling intent",[112,486,487],{},"Optional (default: initial)",[112,489,490],{},"initial, security_review, compliance, incident_response",[91,492,493,496,499],{},[112,494,495],{},"Adversary classes",[112,497,498],{},"Optional (prompted for security_review\u002Fincident_response)",[112,500,501],{},"external, insider, supply_chain",[91,503,504,507,509],{},[112,505,506],{},"Exclusions",[112,508,465],{},[112,510,511],{},"\"Mobile app (separate model)\"",[91,513,514,517,519],{},[112,515,516],{},"Trust assumptions",[112,518,465],{},[112,520,521],{},"\"AWS infrastructure is trusted\"",[14,523,524],{},[333,525,526],{},"Example conversation:",[55,528,531],{"className":529,"code":530,"language":60},[58],"What are the most valuable assets in this system?\n> Cardholder data in the database and API authentication tokens\n\nAny compliance requirements?\n> PCI-DSS\n\nWhat do you explicitly trust?\n> AWS control plane and VPC networking\n",[18,532,530],{"__ignoreMap":63},[14,534,535,536,539],{},"The scope is saved to ",[18,537,538],{},".dethereal\u002Fscope.json"," and referenced throughout the workflow — crown jewel names are matched to components during classification, compliance drivers trigger framework-specific enrichment prompts, and adversary class selection (when present) guides discovery and enrichment prompts (e.g., \"insider\" triggers admin path and credential flow prompts; \"supply_chain\" triggers CI\u002FCD and dependency chain prompts).",[14,541,542,545],{},[333,543,544],{},"State after:"," SCOPE_DEFINED",[23,547],{},[26,549,551],{"id":550},"step-2-discovery","Step 2: Discovery",[14,553,554,555,558],{},"The plugin delegates to the ",[333,556,557],{},"infrastructure-scout"," agent to scan your codebase for infrastructure components. The scout checks 10 source categories:",[560,561,562,565,568,571,574,577,580,583,586,589],"ol",{},[340,563,564],{},"Code structure (package.json, go.mod, etc.)",[340,566,567],{},"Infrastructure-as-Code (Terraform, CloudFormation, Pulumi)",[340,569,570],{},"Container definitions (Dockerfiles, docker-compose)",[340,572,573],{},"Kubernetes manifests (Deployments, Services, NetworkPolicy)",[340,575,576],{},"API definitions (OpenAPI, gRPC .proto, GraphQL schemas)",[340,578,579],{},"Network configuration (Nginx, HAProxy, Envoy)",[340,581,582],{},"CI\u002FCD pipelines (GitHub Actions, GitLab CI)",[340,584,585],{},"Database schemas (SQL migrations, ORM models)",[340,587,588],{},"Environment files (variable names only — never secret values)",[340,590,591],{},"Documentation and diagrams",[14,593,594],{},"You'll see a sources-checked summary:",[55,596,599],{"className":597,"code":598,"language":60},[58],"Sources checked: IaC\u002FTerraform (12), Containers (3), K8s (—), CI\u002FCD (2), Code (5), API defs (1)\n",[18,600,598],{"__ignoreMap":63},[14,602,603],{},"Then a batch confirmation table with all discovered elements:",[55,605,608],{"className":606,"code":607,"language":60},[58],"| # | Name | Type | Boundary | Confidence |\n|---|------|------|----------|------------|\n| 1 | payment-api | PROCESS | Internal | high (Terraform) |\n| 2 | postgres-db | STORE | Data Tier | high (Terraform) |\n| 3 | redis-cache | STORE | Data Tier | high (Docker) |\n| 4 | nginx-proxy | PROCESS | DMZ | medium (config) |\n| 5 | stripe-api | EXTERNAL_ENTITY | External | medium (code ref) |\n\nConfirm, adjust, or add missing components?\n",[18,609,607],{"__ignoreMap":63},[14,611,612,613,616],{},"After confirmation, the plugin runs a ",[333,614,615],{},"blind-spots interview"," — a consolidated prompt for commonly missed elements:",[618,619,620],"blockquote",{},[14,621,622],{},"Discovery found your main components. Common elements NOT found in code: admin access paths, monitoring\u002Flogging flows, backup processes, shared infrastructure (IdP, DNS, CA), deployment pipeline. Are any of these relevant?",[14,624,625],{},"This is a single question, not a sequence of individual prompts.",[14,627,628,630],{},[333,629,544],{}," DISCOVERED",[23,632],{},[26,634,636],{"id":635},"step-3-model-review","Step 3: Model Review",[14,638,639],{},"Deterministic classification runs first — the plugin queries the platform's class library and matches components by name and type. High-confidence matches (e.g., \"PostgreSQL\" matches the \"Database\" class) are pre-filled.",[55,641,644],{"className":642,"code":643,"language":60},[58],"| # | Element | Type | Proposed Class | Confidence |\n|---|---------|------|----------------|------------|\n| 1 | PostgreSQL | STORE | Database | high (deterministic) |\n| 2 | Redis | STORE | Key-Value Store | high (deterministic) |\n| 3 | Payment API | PROCESS | Web Application | medium (LLM) |\n| 4 | Nginx | PROCESS | Reverse Proxy | high (deterministic) |\n\nConfirm classifications? (yes \u002F modify \u002F skip)\n",[18,645,643],{"__ignoreMap":63},[14,647,648,649,652],{},"After classification, the plugin checks ",[333,650,651],{},"decomposition thresholds",". If your model has 21+ components, 9+ trust boundaries, 36+ data flows, or 19+ cross-boundary flows, it recommends either narrowing scope (model the highest-risk subsystem first) or creating a decomposition plan for multiple models. This is advisory — you can proceed with a large model if you choose.",[14,654,655,657],{},[333,656,544],{}," DISCOVERED (no state transition — stays at DISCOVERED until boundaries are refined)",[23,659],{},[26,661,663],{"id":662},"step-4-boundary-refinement","Step 4: Boundary Refinement",[14,665,666],{},"Review the trust boundary hierarchy:",[55,668,671],{"className":669,"code":670,"language":60},[58],"Trust Boundary Hierarchy:\n├── defaultBoundary\n│   ├── External\n│   │   └── [EXTERNAL_ENTITY] Stripe API\n│   ├── DMZ\n│   │   └── [PROCESS] Nginx Proxy\n│   ├── Internal Network\n│   │   └── [PROCESS] Payment API\n│   └── Data Tier\n│       ├── [STORE] PostgreSQL\n│       └── [STORE] Redis\n",[18,672,670],{"__ignoreMap":63},[14,674,675],{},"The plugin checks for structural issues:",[337,677,678,681,684],{},[340,679,680],{},"Single-component boundaries (might need merging)",[340,682,683],{},"Flat hierarchy (no nesting — consider sub-boundaries)",[340,685,686],{},"External entities inside internal boundaries",[688,689,691],"h4",{"id":690},"one-gate-two-tables","One gate, two tables",[14,693,694,695,698,699,702],{},"Both decisions — the ",[333,696,697],{},"trust skeleton"," (zone + plane) and the ",[333,700,701],{},"enforcement posture"," — are settled in a single batched accept-all \u002F adjust gate. There is no per-boundary interrogation. The plugin computes the proposal; it never silently sets it:",[55,704,707],{"className":705,"code":706,"language":60},[58],"## Boundary Refinement\n\nTrust classification (proposed from discovery + scope)\n| Boundary    | Zone            | Role (plane) | Resolved              |\n|-------------|-----------------|--------------|-----------------------|\n| Edge \u002F DMZ  | DMZ       [hi]  | Workload     | declared              |\n| App Tier    | Internal        | Workload     | declared              |\n| payment-db  | Internal        | Workload     | declared              |\n| Logging     | —               | Undecided    | inherited · App Tier  |\n\nEnforcement posture\n| Boundary    | Implicit deny   | Any inbound  | Egress                |\n| …           | …               | …            | …                     |\n\nProposed from discovery + scope. Accept all, or adjust specific rows?\n",[18,708,706],{"__ignoreMap":63},[14,710,711,714,715,718,719,718,722,718,725,728,729,732,733,46],{},[333,712,713],{},"Zones are shown by display name, never by their stored value."," The table says \"Open internet\", \"DMZ\", \"Internal\", \"Restricted\" — ",[18,716,717],{},"UNTRUSTED",", ",[18,720,721],{},"EXPOSED",[18,723,724],{},"INTERNAL",[18,726,727],{},"RESTRICTED"," are what lands in ",[18,730,731],{},"structure.json",", and you will only see them if you open the file. The mapping is in the ",[42,734,736],{"href":735},"\u002Fdethereal\u002Fglossary#trust-zoning-and-conduits","Glossary",[14,738,739,742],{},[333,740,741],{},"Scan the Resolved column."," It is the one column worth reading row by row, and it is a glyph rather than prose:",[77,744,747],{"className":745,"tabIndex":81,"role":82,"ariaLabel":746},[80],"Table: One gate, two tables",[85,748,749,759],{},[88,750,751],{},[91,752,753,756],{},[94,754,755],{},"Resolved",[94,757,758],{},"Meaning",[107,760,761,775,783,793,802],{},[91,762,763,768],{},[112,764,765],{},[18,766,767],{},"⬆",[112,769,770,771,774],{},"Declared ",[333,772,773],{},"and stricter than its parent"," — the case to catch",[91,776,777,780],{},[112,778,779],{},"A plain zone name",[112,781,782],{},"Declared on this boundary",[91,784,785,790],{},[112,786,787],{},[18,788,789],{},"· inherited · \u003Cancestor>",[112,791,792],{},"Resolves from a named ancestor, not declared here",[91,794,795,799],{},[112,796,797],{},[18,798,183],{},[112,800,801],{},"Unclassified; counted in the Step 9 review",[91,803,804,809],{},[112,805,806],{},[18,807,808],{},"— structural",[112,810,811],{},"A container that nests other boundaries; it abstains and is not counted",[14,813,814,815,818,819,822,823,381,826,829,830,833,834,837],{},"The other columns: ",[333,816,817],{},"Zone"," carries an inline ",[18,820,821],{},"[hi\u002Fmed\u002Flo]"," confidence from discovery when there was a topology signal to go on. ",[333,824,825],{},"Role (plane)",[18,827,828],{},"Workload"," or ",[18,831,832],{},"Management",", defaulting to ",[333,835,836],{},"Undecided"," — which is not the same as Workload. A boundary that is both carries an inline ⚠.",[14,839,840],{},"The enforcement posture table carries three attributes:",[77,842,844],{"className":843,"tabIndex":81,"role":82,"ariaLabel":746},[80],[85,845,846,859],{},[88,847,848],{},[91,849,850,853,856],{},[94,851,852],{},"Attribute",[94,854,855],{},"Options",[94,857,858],{},"What It Means",[107,860,861,874,886],{},[91,862,863,868,871],{},[112,864,865],{},[18,866,867],{},"implicit_deny_enabled",[112,869,870],{},"true \u002F false",[112,872,873],{},"Boundary blocks traffic by default",[91,875,876,881,883],{},[112,877,878],{},[18,879,880],{},"allow_any_inbound",[112,882,870],{},[112,884,885],{},"Boundary allows unrestricted inbound",[91,887,888,893,896],{},[112,889,890],{},[18,891,892],{},"egress_filtering",[112,894,895],{},"deny_all \u002F allow_list \u002F allow_all \u002F unknown",[112,897,898],{},"Outbound traffic policy",[14,900,901],{},"Notes on how zones behave here:",[337,903,904,911,920,931,937,944],{},[340,905,906,907,910],{},"A boundary you leave unset ",[333,908,909],{},"inherits"," its nearest declaring ancestor's zone, falling back to Internal.",[340,912,913,916,917,919],{},[333,914,915],{},"Structural containers abstain."," A boundary that only nests other boundaries renders ",[18,918,808],{}," and is not nagged — zone the leaves inside it, not the wrapper.",[340,921,922,923,926,927,930],{},"This is the ",[333,924,925],{},"skeleton"," phase: it sets the external, exposed, and internal tiers but ",[333,928,929],{},"defers Restricted",", which needs asset classification (promoted at Step 7).",[340,932,933,936],{},[333,934,935],{},"Proposed is not set."," Only rows you accept are written. An unconfirmed boundary keeps no zone and shows up in the Step 9 unclassified count.",[340,938,939,940,943],{},"A row already marked ",[18,941,942],{},"declared"," was ratified by you earlier and is never re-proposed, including on resume.",[340,945,946,947,950,951,954,955,958],{},"Identity, compute-node, location, and business grouping are steered to ",[18,948,949],{},"domains"," \u002F ",[18,952,953],{},"planes"," ",[333,956,957],{},"tags",", not zone-bearing boundaries.",[14,960,961,962,46],{},"For the concepts and the GUI equivalent, see ",[42,963,965],{"href":964},"\u002Fplatform\u002Fboundary-trust-zones","Boundary Trust Zones",[14,967,968,971,972,975],{},[333,969,970],{},"Auto-skip:"," This step skips only when the hierarchy is already well-structured (depth >= 2, no single-child boundaries, no external entities in internal boundaries) ",[333,973,974],{},"and"," there are no zone proposals left to ratify:",[55,977,980],{"className":978,"code":979,"language":60},[58],"Boundary hierarchy is well-structured (quality factor: 1.0), no zone proposals pending. Skipping refinement.\n",[18,981,979],{"__ignoreMap":63},[14,983,984],{},"On a freshly discovered model, discovery almost always produces zone proposals — so expect a well-structured model to still stop here for the trust table. That is the trust skeleton doing its job, not the workflow ignoring your structure. You can also jump to Step 4 explicitly at any time.",[14,986,987,989],{},[333,988,544],{}," STRUCTURE_COMPLETE",[23,991],{},[26,993,995],{"id":994},"step-5-data-flow-mapping","Step 5: Data Flow Mapping",[14,997,998],{},"Connect components with data flows to complete the structural model. The plugin:",[560,1000,1001,1004,1007],{},[340,1002,1003],{},"Reviews existing flows from discovery",[340,1005,1006],{},"Identifies orphaned components (no inbound or outbound flows) and prompts you to connect them",[340,1008,1009,1010],{},"Prompts for commonly missing operational flows:\n",[337,1011,1012,1018,1024],{},[340,1013,1014,1017],{},[333,1015,1016],{},"Administrative access"," — SSH, RDP, management consoles",[340,1019,1020,1023],{},[333,1021,1022],{},"Monitoring\u002Flogging"," — components to log aggregators or SIEM",[340,1025,1026,1029],{},[333,1027,1028],{},"Backup\u002Frecovery"," — databases to backup destinations",[14,1031,1032],{},"For each new flow, you specify the source, target, protocol, and description.",[688,1034,1036],{"id":1035},"ratify-approved-channels-conduits","Ratify approved channels (conduits)",[14,1038,1039,1040,1043,1044,1047],{},"Once flows exist, the plugin surfaces the ",[333,1041,1042],{},"risk-bearing crossings"," — flows where an external-tier boundary reaches a trusted one. You ratify the few that are legitimate as ",[333,1045,1046],{},"approved channels"," (conduits), each with a short justification:",[55,1049,1052],{"className":1050,"code":1051,"language":60},[58],"Risk-bearing crossings — ratify as approved channels?\n| Crossing                          | Ratify? | Why                              |\n|-----------------------------------|---------|----------------------------------|\n| External → DMZ (Nginx)            | Y       | public entry point               |\n| DMZ → Internal (Payment API)      | Y       | front-end forwards requests      |\n\nRatify selected as approved channels?\n",[18,1053,1051],{"__ignoreMap":63},[14,1055,1056,1057,1060,1061,1064],{},"Ratified crossings are recorded as directional conduits on the source boundary. A crossing you ",[333,1058,1059],{},"don't"," ratify stays a plain flow and re-surfaces as an advisory ",[18,1062,1063],{},"external-ingress"," finding at Step 9 — that divergence between declared intent and modeled reality is the review working as designed. Conduits are declared intent only; the platform records them but does not verify or enforce them.",[55,1066,1069],{"className":1067,"code":1068,"language":60},[58],"[done] Data flow mapping complete. Quality: 45\u002F100.\n",[18,1070,1068],{"__ignoreMap":63},[14,1072,1073,1075],{},[333,1074,544],{}," ENRICHING",[23,1077],{},[26,1079,189],{"id":1080},"session-break",[14,1082,1083],{},"After Step 5, the plugin inserts a checkpoint. Your model structure is complete and saved — everything from here forward reads model files from disk.",[14,1085,1086],{},[333,1087,1088],{},"For small models (\u003C 15 components):",[55,1090,1093],{"className":1091,"code":1092,"language":60},[58],"Your model structure is complete and saved. You can continue enrichment\nnow or resume later — your progress is saved.\n\nConsider committing your model before enrichment (clean revert point).\n\nContinue now? (yes \u002F later)\n",[18,1094,1092],{"__ignoreMap":63},[14,1096,1097],{},[333,1098,1099],{},"For large models (>= 15 components):",[55,1101,1104],{"className":1102,"code":1103,"language":60},[58],"Your model structure is complete and saved. For models this size,\nstarting enrichment in a fresh session produces better results — the\nenrichment phase reads model files from disk and doesn't need the\ndiscovery context.\n\nConsider committing your model before enrichment (clean revert point).\n\nContinue now? (yes \u002F later)\n",[18,1105,1103],{"__ignoreMap":63},[14,1107,1108],{},[333,1109,1110],{},"If you choose \"later\":",[55,1112,1115],{"className":1113,"code":1114,"language":60},[58],"To resume: \u002Fdethereal:threat-model .\u002Fthreat-models\u002Fpayment-api\nYour progress is saved at ENRICHING. Resume from Step 6 (Classification).\n",[18,1116,1114],{"__ignoreMap":63},[14,1118,1119,1122],{},[333,1120,1121],{},"Why the break?"," The enrichment phase (Steps 6-8) works independently from the discovery context accumulated in Steps 1-5. For large models, starting fresh significantly reduces token costs and produces better results because the AI has more context budget for security analysis.",[14,1124,1125],{},"The recommendation is informational — if you continue, the plugin proceeds without asking again.",[14,1127,1128],{},"This is also a good point to commit your model to git, creating a clean revert point if you want to redo enrichment later.",[23,1130],{},[26,1132,1134],{"id":1133},"step-6-classification-pass-2","Step 6: Classification (Pass 2)",[14,1136,1137],{},"LLM-assisted classification for elements that weren't matched in the deterministic pass at Step 3. The plugin uses boundary context and peer components to propose classes:",[337,1139,1140,1143],{},[340,1141,1142],{},"Components in the \"Data Tier\" boundary alongside a classified Database are likely also data stores",[340,1144,1145],{},"Components receiving HTTPS traffic are likely web-facing processes",[14,1147,1148],{},"Crown jewel tagging also happens here — free-text crown jewel names from your scope definition are fuzzy-matched to components and tagged.",[14,1150,1151,1154],{},[333,1152,1153],{},"Quality gate:"," 100% of STORE components must be classified (stores hold data — classification is critical for analysis). 80% overall classification is the target.",[14,1156,1157,1160],{},[333,1158,1159],{},"State:"," No transition — already at ENRICHING from Step 5.",[23,1162],{},[26,1164,1166],{"id":1165},"step-7-data-item-classification","Step 7: Data Item Classification",[14,1168,1169],{},"For cross-boundary data flows that carry sensitive data, the plugin proposes data items:",[55,1171,1174],{"className":1172,"code":1173,"language":60},[58],"Data items for sensitive flows:\n| Flow | Data Item | Sensitivity | Compliance | Confirm? |\n|------|-----------|-------------|------------|----------|\n| User → API | User credentials | Restricted | PCI-DSS | Y |\n| API → DB | Cardholder data | Restricted | PCI-DSS | Y |\n| API → Redis | Session tokens | Confidential | SOC2 | Y |\n",[18,1175,1173],{"__ignoreMap":63},[14,1177,1178],{},"Sensitivity levels:",[337,1180,1181,1187,1193,1199],{},[340,1182,1183,1186],{},[333,1184,1185],{},"Restricted"," — regulated PII, credentials, cardholder data, health records",[340,1188,1189,1192],{},[333,1190,1191],{},"Confidential"," — internal business data, session tokens, API keys",[340,1194,1195,1198],{},[333,1196,1197],{},"Internal"," — operational data, metrics, internal logs",[340,1200,1201,1204],{},[333,1202,1203],{},"Public"," — public content, documentation",[14,1206,1207],{},"Compliance drivers from your scope definition inform the regulatory mapping.",[688,1209,1211],{"id":1210},"restricted-promotion","Restricted promotion",[14,1213,1214,1215,1217],{},"Now that assets and sensitive data are classified, the plugin re-runs the trust determination it deferred at Step 4 and proposes promoting qualifying boundaries to ",[333,1216,1185],{}," — the strictest tier, for boundaries that hold high-value assets and take ingress only from other trusted tiers. Promotions are folded into a batched confirm:",[55,1219,1222],{"className":1220,"code":1221,"language":60},[58],"## Restricted promotion — completing the trust skeleton\n\nThe promotion we deferred at Step 4: now that data sensitivity and the flow graph exist, these\nInternal boundaries qualify for Restricted. This is a safe-direction change (Internal → Restricted)\n— tightening only; declared zones are never loosened or overwritten.\n\n| Boundary   | Now      | → Proposed | Why                                               |\n|------------|----------|------------|---------------------------------------------------|\n| payment-db | Internal | Restricted | holds Card data (PCI), ingress only from App Tier |\n\nPromote all, or adjust?\n",[18,1223,1221],{"__ignoreMap":63},[14,1225,1226,1227,1230,1231,1234],{},"This only ever tightens. A boundary you declared Internet-facing, DMZ, Open internet, or Trusted external is never offered here — exposure outranks asset pull. A boundary you declared Internal ",[187,1228,1229],{},"is"," offered, but only ever proposed: nothing is written unless you confirm it this turn. If a boundary holds an asset but cannot qualify — it is reachable from a DMZ, or vendor-touched — it stays Internal and surfaces as an ",[18,1232,1233],{},"under-protected"," finding at Step 9.",[14,1236,1237,1239],{},[333,1238,1159],{}," No transition — already at ENRICHING.",[23,1241],{},[26,1243,1245],{"id":1244},"step-8-enrichment","Step 8: Enrichment",[14,1247,1248,1249,1252],{},"The most intensive step, and the one hardest to size in advance. The plugin delegates to the ",[333,1250,1251],{},"security-enricher"," agent.",[14,1254,1255,1258,1259,1262,1263,718,1266,718,1269,1272],{},[333,1256,1257],{},"Class templates set the workload."," The bulk of the pass walks every field of each element's class template — the stubs written during classification, each field seeded to ",[18,1260,1261],{},"null"," — and resolves all of them. That means the questions differ per element (a Database is asked about ",[18,1264,1265],{},"ssl_enabled",[18,1267,1268],{},"password_encryption",[18,1270,1271],{},"log_connections","; other classes ask about other things), and the volume scales with your class templates, not with a fixed list. Values the enricher can find in your code, IaC, or config it fills in itself and shows you for confirmation; it asks only about the rest.",[14,1274,1275,1278,1279,718,1282,718,1285,718,1288,1290,1291,1294,1295,1297,1298,1300,1301,1305],{},[333,1276,1277],{},"Then a six-attribute floor"," is applied to every in-scope component, whatever its class template covered: ",[18,1280,1281],{},"authentication_type",[18,1283,1284],{},"encryption_in_transit",[18,1286,1287],{},"encryption_at_rest",[18,1289,867],{},", and ",[18,1292,1293],{},"monitoring_tools"," (logging is captured by the class template and has no floor key). Two of these are not free-text choices — ",[18,1296,867],{}," is a boolean and ",[18,1299,1293],{}," is a list — and the key names are read literally by the quality score and the surface report. See ",[42,1302,1304],{"href":1303},"\u002Fdethereal\u002Fdiscovery-and-enrichment#the-six-attribute-floor","The Six-Attribute Floor"," for the exact spellings and accepted values.",[14,1307,1308],{},[333,1309,1310],{},"Additional enrichment:",[337,1312,1313,1319,1325,1331],{},[340,1314,1315,1318],{},[333,1316,1317],{},"Credential topology"," — captured flow by flow: which credential authenticates each cross-boundary flow, and what else that credential reaches",[340,1320,1321,1324],{},[333,1322,1323],{},"Monitoring tools"," — SIEM, EDR, NDR coverage per component",[340,1326,1327,1330],{},[333,1328,1329],{},"Auth failure modes"," — what happens when authentication fails (deny, fallback, fail_open)",[340,1332,1333,1336],{},[333,1334,1335],{},"Boundary enforcement"," — implicit deny, egress filtering per boundary",[14,1338,1339,1340,1343,1344,46],{},"MITRE ATT&CK techniques are ",[333,1341,1342],{},"not"," written during this step. Technique coverage is derived on the platform from analysis exposures — see ",[42,1345,1347],{"href":1346},"\u002Fdethereal\u002Fdiscovery-and-enrichment#part-3-mitre-framework-integration","Discovery and Enrichment Part 3",[14,1349,1350],{},"If stale elements exist (from a backward transition), they're enriched first.",[14,1352,1353,1354,1357],{},"The enricher runs without being able to ask you directly, so it returns its work for one batched review: the values it set, plus an explicit ",[333,1355,1356],{},"\"Operator confirmations needed\""," list of everything it took on a defensive default or could not find in code. Accept all or adjust specific rows — nothing is silently accepted on your behalf.",[14,1359,1360,1363,1364,1367,1368,1371,1372,46],{},[333,1361,1362],{},"Control assignment is a separate pass."," The default Step 8 enrichment covers template attributes, the six-attribute floor, credentials, and monitoring. Assigning reusable security Controls (e.g., \"Database Encryption Package\") to elements is a follow-up pass invoked as ",[18,1365,1366],{},"\u002Fdethereal:enrich --focus controls"," — its own 40-turn budget, auto-pulls referenced Controls, and queues ",[18,1369,1370],{},"pendingEdit"," blocks for the next push. See ",[42,1373,1375],{"href":1374},"\u002Fdethereal\u002Fdiscovery-and-enrichment#part-4-control-enrichment","Discovery and Enrichment Part 4",[14,1377,1378,1379,46],{},"For details on the enrichment process, see ",[42,1380,1382],{"href":1381},"\u002Fdethereal\u002Fdiscovery-and-enrichment","Discovery and Enrichment",[14,1384,1385,1239],{},[333,1386,1159],{},[23,1388],{},[26,1390,1392],{"id":1391},"step-9-validation","Step 9: Validation",[14,1394,554,1395,1398],{},[333,1396,1397],{},"model-reviewer"," agent for a quality assessment:",[55,1400,1403],{"className":1401,"code":1402,"language":60},[58],"Quality: 78\u002F100 (Good)\n\nFactor Breakdown:\n| Factor | Score | Weight | Contribution |\n|--------|-------|--------|-------------|\n| Component classification | 100% | 25 | 25.0 |\n| Attribute completion | 80% | 20 | 16.0 |\n| Boundary hierarchy | 100% | 15 | 15.0 |\n| Data flow coverage | 90% | 15 | 13.5 |\n| Data classification | 60% | 10 | 6.0 |\n| Control coverage | 20% | 10 | 2.0 |\n| Credential coverage | 10% | 5 | 0.5 |\n\nQuality Gates:\n  Gate 1 (Creation):  PASS\n  Gate 2 (Sync):      PASS\n  Gate 3 (Analysis):  PASS — quality >= 70, all criteria met\n",[18,1404,1402],{"__ignoreMap":63},[688,1406,1408],{"id":1407},"zoning-coherence-advisory","Zoning coherence (advisory)",[14,1410,1411,1412,1415],{},"The review also rolls up your ",[333,1413,1414],{},"zoning coherence"," as an advisory block — up to six findings that check whether your declared segmentation hangs together:",[55,1417,1420],{"className":1418,"code":1419,"language":60},[58],"Zoning coherence (advisory — never blocks sync):\n  [info] external-ingress: DMZ reaches Data Tier with no approved channel\n  [info] unclassified: \"Legacy Gateway\" has no zone (defaults to INTERNAL)\n",[18,1421,1419],{"__ignoreMap":63},[14,1423,1424,1425,718,1428,718,1430,718,1433,718,1435,1290,1438,1441,1442,1445,1446,1450],{},"The six findings are ",[18,1426,1427],{},"unclassified",[18,1429,1233],{},[18,1431,1432],{},"mgmt-plane",[18,1434,1063],{},[18,1436,1437],{},"flow-channel",[18,1439,1440],{},"cross-tier-domain",". They are always ",[333,1443,1444],{},"advisory"," — they inform you and never block a sync. See ",[42,1447,1449],{"href":1448},"\u002Fdethereal\u002Freview-and-analysis#zoning-coherence-advisory","Review and Analysis"," for what each finding means.",[14,1452,1453,1456],{},[333,1454,1455],{},"If Gate 3 passes"," (quality >= 70 and all criteria met): the state advances to REVIEWED and the workflow proceeds to sync.",[14,1458,1459,1462],{},[333,1460,1461],{},"If Gate 3 fails:"," the plugin shows specific gaps and offers to loop back to Step 8 to fill them:",[55,1464,1467],{"className":1465,"code":1466,"language":60},[58],"Gate 3 requires: 100% classification (currently 80%), >=80% attributes (currently 60%)\n\nLoop back to Step 8 to fill gaps? (yes \u002F skip to sync anyway)\n",[18,1468,1466],{"__ignoreMap":63},[14,1470,1471,1472,46],{},"For details on quality scoring and gates, see ",[42,1473,1449],{"href":1474},"\u002Fdethereal\u002Freview-and-analysis",[14,1476,1477,1479],{},[333,1478,544],{}," REVIEWED (if Gate 3 passes)",[23,1481],{},[26,1483,1485],{"id":1484},"step-10-sync","Step 10: Sync",[14,1487,1488],{},"Pushes your model to the platform for analysis.",[31,1490,1492],{"id":1491},"pre-flight-check","Pre-Flight Check",[14,1494,1495],{},"Before pushing, the plugin verifies Gate 2 (sync-blocking) criteria: manifest completeness, structure validity, reference integrity. If Gate 2 fails, push is blocked.",[31,1497,1499],{"id":1498},"authentication-check","Authentication Check",[14,1501,1502],{},"The plugin asks its MCP server whether you are signed in, refreshing an expired session if it can. If you are not signed in:",[55,1504,1507],{"className":1505,"code":1506,"language":60},[58],"Not authenticated. Run \u002Fdethereal:login first, or skip sync for now.\n",[18,1508,1506],{"__ignoreMap":63},[14,1510,1511],{},"If you skip, the workflow jumps to README generation and finishes without sync.",[31,1513,1515],{"id":1514},"push-consent","Push Consent",[14,1517,1518,1519,1521,1522,1525],{},"Authentication is ",[333,1520,1342],{}," the last decision point. Passing the auth check — including on a platform running with auth disabled, which counts as authenticated — is permission to ",[187,1523,1524],{},"reach"," the platform, not permission to publish this model. Before anything is pushed, the plugin asks:",[55,1527,1530],{"className":1528,"code":1529,"language":60},[58],"Model passed Gate 2 and is ready to publish to \u003Cplatform URL>.\nPush to platform now? (push \u002F skip — resume later with \u002Fdethereal:sync push)\n",[18,1531,1529],{"__ignoreMap":63},[14,1533,1534,1535,1538,1539,1542],{},"Answer ",[333,1536,1537],{},"skip"," to finish the workflow locally and publish later with ",[18,1540,1541],{},"\u002Fdethereal:sync push",". This is the way to hold a sensitive model back — you do not have to stay logged out, and it works the same on a no-auth platform. The workflow never pushes on your behalf just because authentication succeeded.",[31,1544,1546],{"id":1545},"the-push","The Push",[337,1548,1549,1555],{},[340,1550,1551,1554],{},[333,1552,1553],{},"First push"," (no platform model ID): creates a new model on the platform",[340,1556,1557,1560],{},[333,1558,1559],{},"Update"," (has model ID): updates the existing platform model, with conflict detection if the platform version has changed",[55,1562,1565],{"className":1563,"code":1564,"language":60},[58],"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",[18,1566,1564],{"__ignoreMap":63},[14,1568,1569,1572,1573,1575,1576,1579,1580,718,1583,1586,1587,1590,1591,1594,1595,1598,1599,1601,1602,1604,1605,1607,1608,1610,1611,1614,1615,1618,1619,1622,1623,46],{},[333,1570,1571],{},"Control-library prompts."," If you ran the control pass (",[18,1574,1366],{},") and have edits to brownfield Controls assigned to multiple Models, the push pauses on the ",[333,1577,1578],{},"shared-ownership prompt"," — you confirm ",[18,1581,1582],{},"cancel",[18,1584,1585],{},"push-anyway",", or ",[18,1588,1589],{},"push-unverified"," per Control. (",[18,1592,1593],{},"clone-and-swap"," is not yet available; choosing it returns ",[18,1596,1597],{},"CLONE_AND_SWAP_NOT_IMPLEMENTED",". The equivalent today is ",[18,1600,1582],{},", then create a separate Control with ",[18,1603,1366],{},". ",[18,1606,1585],{}," and ",[18,1609,1589],{}," both ",[333,1612,1613],{},"overwrite the shared Control on every model that references it"," — the opposite of what you wanted if you reached for clone-and-swap.) Decisions land in ",[18,1616,1617],{},".dethereal\u002Fcontrol-audit.log",". If someone else changed a Control on the platform between your pull and push, the push aborts with ",[18,1620,1621],{},"EXTERNAL_EDIT_DETECTED","; recover with ",[18,1624,1625],{},"\u002Fdethereal:sync promote-external-edit \u003CcontrolId> \u003CclassId>",[14,1627,1628,1629,46],{},"For details on sync, conflicts, and version control, see ",[42,1630,1632],{"href":1631},"\u002Fdethereal\u002Fsync-and-version-control","Sync and Version Control",[23,1634],{},[26,1636,1638],{"id":1637},"step-11-post-sync-linking","Step 11: Post-Sync Linking",[14,1640,1641],{},"After sync, the platform's analysis engine computes exposures (potential vulnerabilities). If your model has countermeasures (security controls linked to components), this step links them to exposures so the platform's defense coverage analysis credits your existing defenses.",[14,1643,1644],{},[333,1645,1646],{},"If no countermeasures exist:",[55,1648,1651],{"className":1649,"code":1650,"language":60},[58],"No countermeasures defined. After analysis completes, run \u002Fdethereal:surface\nto see control gaps and exposure distribution.\n",[18,1652,1650],{"__ignoreMap":63},[14,1654,1655],{},[333,1656,1657],{},"If countermeasures exist and analysis has run:",[55,1659,1662],{"className":1660,"code":1661,"language":60},[58],"Exposure-to-Countermeasure Linking\n\n| Exposure | Component | Candidate Countermeasure | Link? |\n|----------|-----------|------------------------|-------|\n| SQL Injection | payment-db | Input validation control | Y |\n| Auth Bypass | api-gateway | OAuth2 enforcement | Y |\n\nLink all? (yes \u002F modify \u002F defer)\n",[18,1663,1661],{"__ignoreMap":63},[14,1665,1666],{},"If you defer linking: \"Analysis will undercount your defenses — defense coverage analysis will not credit existing controls until exposures are linked to countermeasures.\"",[14,1668,1669,1670,1673,1674,71],{},"The plugin can change only countermeasures you authored. A countermeasure the platform derived from the control's class is refused. In the platform, open the control and click ",[333,1671,1672],{},"Customize as an editable copy"," on that countermeasure, then link the copy (see ",[42,1675,1677],{"href":1676},"\u002Fplatform\u002Fmanaging-findings#customizing-a-finding-editable-copy","Customizing a finding",[23,1679],{},[26,1681,1683],{"id":1682},"readme-generation","README Generation",[14,1685,1686,1687,1690],{},"After Step 10 (or at workflow end if sync was skipped), the plugin generates a ",[18,1688,1689],{},"README.md"," in the model directory:",[55,1692,1696],{"className":1693,"code":1694,"language":1695,"meta":63,"style":63},"language-markdown shiki shiki-themes github-light github-dark-dimmed","# Payment API\n\n> Auto-generated by Dethereal. Do not edit.\n\n## Model Structure\n\n├── External\n│   └── [EXTERNAL_ENTITY] Stripe API\n├── DMZ\n│   └── [PROCESS] Nginx Proxy\n├── Internal Network\n│   └── [PROCESS] Payment API\n└── Data Tier\n    ├── [STORE] PostgreSQL\n    └── [STORE] Redis\n\n## Data Flows\n\n- End Users → Nginx Proxy: HTTPS requests\n- Nginx Proxy → Payment API: Internal API (HTTP)\n- Payment API → PostgreSQL: SQL queries (TLS)\n- Payment API → Redis: Cache operations\n\n## Status\n\nQuality: 78\u002F100 (Good)\nState: REVIEWED\nLast synced: 2026-03-27T15:30:00Z\nGenerated: 2026-03-27T15:30:05Z\n","markdown",[18,1697,1698,1707,1714,1721,1726,1732,1737,1744,1757,1763,1774,1780,1790,1796,1808,1819,1824,1830,1835,1845,1853,1861,1869,1874,1880,1885,1891,1897,1903],{"__ignoreMap":63},[1699,1700,1703],"span",{"class":1701,"line":1702},"line",1,[1699,1704,1706],{"class":1705},"sEXtn","# Payment API\n",[1699,1708,1710],{"class":1701,"line":1709},2,[1699,1711,1713],{"emptyLinePlaceholder":1712},true,"\n",[1699,1715,1717],{"class":1701,"line":1716},3,[1699,1718,1720],{"class":1719},"sIAta","> Auto-generated by Dethereal. Do not edit.\n",[1699,1722,1724],{"class":1701,"line":1723},4,[1699,1725,1713],{"emptyLinePlaceholder":1712},[1699,1727,1729],{"class":1701,"line":1728},5,[1699,1730,1731],{"class":1705},"## Model Structure\n",[1699,1733,1735],{"class":1701,"line":1734},6,[1699,1736,1713],{"emptyLinePlaceholder":1712},[1699,1738,1740],{"class":1701,"line":1739},7,[1699,1741,1743],{"class":1742},"sYgZi","├── External\n",[1699,1745,1747,1750,1754],{"class":1701,"line":1746},8,[1699,1748,1749],{"class":1742},"│   └── [",[1699,1751,1753],{"class":1752},"sTb_B","EXTERNAL_ENTITY",[1699,1755,1756],{"class":1742},"] Stripe API\n",[1699,1758,1760],{"class":1701,"line":1759},9,[1699,1761,1762],{"class":1742},"├── DMZ\n",[1699,1764,1766,1768,1771],{"class":1701,"line":1765},10,[1699,1767,1749],{"class":1742},[1699,1769,1770],{"class":1752},"PROCESS",[1699,1772,1773],{"class":1742},"] Nginx Proxy\n",[1699,1775,1777],{"class":1701,"line":1776},11,[1699,1778,1779],{"class":1742},"├── Internal Network\n",[1699,1781,1783,1785,1787],{"class":1701,"line":1782},12,[1699,1784,1749],{"class":1742},[1699,1786,1770],{"class":1752},[1699,1788,1789],{"class":1742},"] Payment API\n",[1699,1791,1793],{"class":1701,"line":1792},13,[1699,1794,1795],{"class":1742},"└── Data Tier\n",[1699,1797,1799,1802,1805],{"class":1701,"line":1798},14,[1699,1800,1801],{"class":1742},"    ├── [",[1699,1803,1804],{"class":1752},"STORE",[1699,1806,1807],{"class":1742},"] PostgreSQL\n",[1699,1809,1811,1814,1816],{"class":1701,"line":1810},15,[1699,1812,1813],{"class":1742},"    └── [",[1699,1815,1804],{"class":1752},[1699,1817,1818],{"class":1742},"] Redis\n",[1699,1820,1822],{"class":1701,"line":1821},16,[1699,1823,1713],{"emptyLinePlaceholder":1712},[1699,1825,1827],{"class":1701,"line":1826},17,[1699,1828,1829],{"class":1705},"## Data Flows\n",[1699,1831,1833],{"class":1701,"line":1832},18,[1699,1834,1713],{"emptyLinePlaceholder":1712},[1699,1836,1838,1842],{"class":1701,"line":1837},19,[1699,1839,1841],{"class":1840},"stnAF","-",[1699,1843,1844],{"class":1742}," End Users → Nginx Proxy: HTTPS requests\n",[1699,1846,1848,1850],{"class":1701,"line":1847},20,[1699,1849,1841],{"class":1840},[1699,1851,1852],{"class":1742}," Nginx Proxy → Payment API: Internal API (HTTP)\n",[1699,1854,1856,1858],{"class":1701,"line":1855},21,[1699,1857,1841],{"class":1840},[1699,1859,1860],{"class":1742}," Payment API → PostgreSQL: SQL queries (TLS)\n",[1699,1862,1864,1866],{"class":1701,"line":1863},22,[1699,1865,1841],{"class":1840},[1699,1867,1868],{"class":1742}," Payment API → Redis: Cache operations\n",[1699,1870,1872],{"class":1701,"line":1871},23,[1699,1873,1713],{"emptyLinePlaceholder":1712},[1699,1875,1877],{"class":1701,"line":1876},24,[1699,1878,1879],{"class":1705},"## Status\n",[1699,1881,1883],{"class":1701,"line":1882},25,[1699,1884,1713],{"emptyLinePlaceholder":1712},[1699,1886,1888],{"class":1701,"line":1887},26,[1699,1889,1890],{"class":1742},"Quality: 78\u002F100 (Good)\n",[1699,1892,1894],{"class":1701,"line":1893},27,[1699,1895,1896],{"class":1742},"State: REVIEWED\n",[1699,1898,1900],{"class":1701,"line":1899},28,[1699,1901,1902],{"class":1742},"Last synced: 2026-03-27T15:30:00Z\n",[1699,1904,1906],{"class":1701,"line":1905},29,[1699,1907,1908],{"class":1742},"Generated: 2026-03-27T15:30:05Z\n",[14,1910,1911],{},"This README exists for human browsability in git — it is not imported to the platform.",[23,1913],{},[26,1915,1917],{"id":1916},"workflow-completion","Workflow Completion",[55,1919,1922],{"className":1920,"code":1921,"language":60},[58],"[done] Threat model \"Payment API\" complete. Quality: 78\u002F100 (Good). State: REVIEWED.\n[next] Run analysis on the platform, then \u002Fdethereal:surface (review attack surface)\n",[18,1923,1921],{"__ignoreMap":63},[14,1925,1926],{},"If sync was skipped:",[55,1928,1931],{"className":1929,"code":1930,"language":60},[58],"[done] Threat model \"Payment API\" complete. Quality: 78\u002F100 (Good). State: ENRICHING.\n[next] \u002Fdethereal:sync push (publish to platform for analysis)\n",[18,1932,1930],{"__ignoreMap":63},[23,1934],{},[26,1936,70],{"id":1937},"backward-transitions",[14,1939,1940],{},"If you add or remove elements during Steps 6-9 (while at ENRICHING or REVIEWED), the state automatically reverts to STRUCTURE_COMPLETE:",[55,1942,1945],{"className":1943,"code":1944,"language":60},[58],"Adding elements reverted state from ENRICHING to STRUCTURE_COMPLETE.\nEnrichment on existing elements is preserved. New elements are tracked\nas stale and will be enriched next.\n",[18,1946,1944],{"__ignoreMap":63},[14,1948,1949],{},"The progress table updates to show re-opened steps:",[55,1951,1954],{"className":1952,"code":1953,"language":60},[58],"  [done]        1. Scope Definition\n  [done]        2. Discovery\n  [done]        3. Model Review\n  [>>>>]        4. Boundary Refinement (re-opened — structural change)\n  [    ]        5. Data Flow Mapping\n  [    ]        6. Classification\n  ...\n",[18,1955,1953],{"__ignoreMap":63},[14,1957,1958],{},"If boundaries are unaffected (e.g., you added a component to an existing boundary), Step 4 auto-skips to Step 5.",[14,1960,1961],{},[333,1962,1963],{},"What happens during a backward transition:",[337,1965,1966,1973,1979,1988],{},[340,1967,1968,1970,1971],{},[18,1969,380],{}," reverts to ",[18,1972,164],{},[340,1974,1975,1978],{},[18,1976,1977],{},"quality.json"," is deleted (forces recomputation)",[340,1980,1981,1982,1985,1986],{},"New element IDs are added to ",[18,1983,1984],{},"staleElements[]"," in ",[18,1987,322],{},[340,1989,1990,1993],{},[18,1991,1992],{},"model_signed_off"," is cleared if set",[14,1995,1996],{},"Enrichment data on existing elements is preserved — only the new elements need enrichment. The enrichment step (Step 8) prioritizes stale elements first.",[23,1998],{},[26,2000,2002],{"id":2001},"drift-detection-on-resume","Drift detection on resume",[14,2004,2005,2006,2008,2009,718,2012,1586,2015,2018],{},"When you re-run ",[18,2007,20],{}," on a model that already has a baseline, the skill detects drift between your last reconcile point and the current git working tree. If in-scope source files have changed since the baseline commit, the resume path sorts each change into one of four kinds — an element removed, an element added, an element whose technology changed (it now matches a different class), or an element whose attributes alone changed — and routes each item through the existing ",[18,2010,2011],{},"\u002Fdethereal:add",[18,2013,2014],{},"\u002Fdethereal:remove",[18,2016,2017],{},"\u002Fdethereal:enrich"," flows. You review drift via the same UX you used to author the model.",[14,2020,2021],{},"Two operator-facing details:",[337,2023,2024,2036],{},[340,2025,2026,2031,2032,2035],{},[333,2027,2028],{},[18,2029,2030],{},"\u002Fdethereal:threat-model --full-scan"," bypasses drift detection entirely and re-runs ",[18,2033,2034],{},"\u002Fdethereal:discover"," end-to-end. Use this when history was rewritten past the baseline (e.g., a force-push or a branch-switch that orphaned the prior reconcile commit), or when you want to re-baseline against the current source tree.",[340,2037,2038,2041,2042,2044],{},[333,2039,2040],{},"Crown-jewel removal triggers an elevated confirm."," When the drift detector proposes removing an element tagged as a crown jewel, ",[18,2043,2014],{}," shows an explicit \"this element is tagged as a CROWN JEWEL\" prompt before applying. Untagged removals fall through to the standard confirmation.",[14,2046,2047,2048,46],{},"For how drift detection works under the hood, see ",[42,2049,2053],{"href":2050,"rel":2051},"https:\u002F\u002Fgithub.com\u002Fdether-net\u002Fdethernety-oss\u002Fblob\u002Fmain\u002Fdocs\u002Farchitecture\u002Fdethereal\u002FDRIFT_DETECTION.md",[2052],"nofollow","Drift Detection architecture",[31,2055,2057],{"id":2056},"where-crown-jewel-status-lives","Where crown-jewel status lives",[14,2059,2060],{},"That elevated confirm reads two different fields, because the tag itself has two homes:",[77,2062,2065],{"className":2063,"tabIndex":81,"role":82,"ariaLabel":2064},[80],"Table: Where crown-jewel status lives",[85,2066,2067,2077],{},[88,2068,2069],{},[91,2070,2071,2074],{},[94,2072,2073],{},"Element",[94,2075,2076],{},"Field checked",[107,2078,2079,2096],{},[91,2080,2081,2084],{},[112,2082,2083],{},"Component",[112,2085,2086,2089,2090,2092,2093],{},[18,2087,2088],{},"crownJewel: true"," on the component in ",[18,2091,731],{}," — the single source of truth, written by ",[18,2094,2095],{},"\u002Fdethereal:classify",[91,2097,2098,2101],{},[112,2099,2100],{},"Data flow, data item, boundary",[112,2102,2103,2106,2107,2110,2111],{},[18,2104,2105],{},"crown_jewel: true"," in that element's attribute file (",[18,2108,2109],{},"attributes\u002F\u003Ckind>\u002F\u003Cid>.json",") — a local-only mark, since these have no first-class field in ",[18,2112,731],{},[14,2114,2115,2116,2119,2120,2123,2124,2126,2127,1985,2130,46],{},"The two spellings are not interchangeable. The snake_case ",[18,2117,2118],{},"crown_jewel"," that can appear in a ",[187,2121,2122],{},"component's"," attribute file is only a derived copy: tagging a component there and nowhere else leaves ",[18,2125,731],{}," untouched, so the tier-1 enrichment sweep and the surface report both count zero crown jewels. On a component, always set ",[18,2128,2129],{},"crownJewel",[18,2131,731],{},[23,2133],{},[26,2135,2137],{"id":2136},"tips","Tips",[337,2139,2140,2146,2152,2163],{},[340,2141,2142,2145],{},[333,2143,2144],{},"Commit at the session break"," — Step 5 is a natural checkpoint. Committing here gives you a clean revert point if enrichment needs to be redone.",[340,2147,2148,2151],{},[333,2149,2150],{},"Jump by step number"," — you can type any step number to jump directly to it, without needing to go through intermediate steps.",[340,2153,2154,2157,2158,829,2160,2162],{},[333,2155,2156],{},"Individual commands work too"," — you don't need to use the guided workflow for everything. Run ",[18,2159,2095],{},[18,2161,2017],{}," independently whenever you want.",[340,2164,2165,2168,2169,2171,2172,2174],{},[333,2166,2167],{},"Resume from any session"," — your progress is saved in ",[18,2170,322],{},". Start a new Claude Code session and run ",[18,2173,20],{}," to pick up where you left off.",[23,2176],{},[14,2178,2179,954,2182,2184],{},[333,2180,2181],{},"Next:",[42,2183,45],{"href":44}," — all 14 commands with syntax and examples",[2186,2187,2188],"style",{},"html pre.shiki code .sEXtn, html code.shiki .sEXtn{--shiki-default:#005CC5;--shiki-default-font-weight:bold;--shiki-dark:#6CB6FF;--shiki-dark-font-weight:bold}html pre.shiki code .sIAta, html code.shiki .sIAta{--shiki-default:#22863A;--shiki-dark:#8DDB8C}html pre.shiki code .sYgZi, html code.shiki .sYgZi{--shiki-default:#24292E;--shiki-dark:#ADBAC7}html pre.shiki code .sTb_B, html code.shiki .sTb_B{--shiki-default:#032F62;--shiki-default-text-decoration:underline;--shiki-dark:#96D0FF;--shiki-dark-text-decoration:inherit}html pre.shiki code .stnAF, html code.shiki .stnAF{--shiki-default:#E36209;--shiki-dark:#F69D50}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);}",{"title":63,"searchDepth":1716,"depth":1716,"links":2190},[2191,2196,2201,2202,2203,2204,2207,2210,2211,2212,2215,2216,2219,2225,2226,2227,2228,2229,2232],{"id":28,"depth":1709,"text":29,"children":2192},[2193,2194,2195],{"id":33,"depth":1716,"text":34},{"id":49,"depth":1716,"text":50},{"id":74,"depth":1716,"text":75},{"id":283,"depth":1709,"text":284,"children":2197},[2198,2199,2200],{"id":287,"depth":1716,"text":288},{"id":300,"depth":1716,"text":301},{"id":373,"depth":1716,"text":374},{"id":395,"depth":1709,"text":396},{"id":550,"depth":1709,"text":551},{"id":635,"depth":1709,"text":636},{"id":662,"depth":1709,"text":663,"children":2205},[2206],{"id":690,"depth":1723,"text":691},{"id":994,"depth":1709,"text":995,"children":2208},[2209],{"id":1035,"depth":1723,"text":1036},{"id":1080,"depth":1709,"text":189},{"id":1133,"depth":1709,"text":1134},{"id":1165,"depth":1709,"text":1166,"children":2213},[2214],{"id":1210,"depth":1723,"text":1211},{"id":1244,"depth":1709,"text":1245},{"id":1391,"depth":1709,"text":1392,"children":2217},[2218],{"id":1407,"depth":1723,"text":1408},{"id":1484,"depth":1709,"text":1485,"children":2220},[2221,2222,2223,2224],{"id":1491,"depth":1716,"text":1492},{"id":1498,"depth":1716,"text":1499},{"id":1514,"depth":1716,"text":1515},{"id":1545,"depth":1716,"text":1546},{"id":1637,"depth":1709,"text":1638},{"id":1682,"depth":1709,"text":1683},{"id":1916,"depth":1709,"text":1917},{"id":1937,"depth":1709,"text":70},{"id":2001,"depth":1709,"text":2002,"children":2230},[2231],{"id":2056,"depth":1716,"text":2057},{"id":2136,"depth":1709,"text":2137},"Complete walkthrough of the \u002Fdethereal:threat-model guided process","md",{"category":2236,"position":1716,"tags":2237},"documentation",[2238,2239,2240,2241,2242],"dethereal","workflow","threat-model","guided","process","\u002Fdethereal\u002Fguided-workflow",{"title":5,"description":2233},"03.dethereal\u002F02.guided-workflow","GDfAPI_oG9Vej0YIu7s6PWc5RCLhy-gdwjU1X4WWaiI",[2248,2301,2336,2380,2414,2458,2473,2543],{"title":2249,"description":2250,"path":2251,"stem":2252,"children":2253,"page":-1},"Platform","Modelling, analysis, findings and controls in the Dethernety platform.","\u002Fplatform","01.platform",[2254,2258,2263,2268,2273,2278,2283,2288,2291,2296],{"title":2255,"path":2251,"stem":2256,"description":2257},"Dethernety User Documentation","01.platform\u002Findex","User guide for the Dethernety threat modeling platform",{"title":2259,"path":2260,"stem":2261,"description":2262},"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":2264,"path":2265,"stem":2266,"description":2267},"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":2269,"path":2270,"stem":2271,"description":2272},"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":2274,"path":2275,"stem":2276,"description":2277},"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":2279,"path":2280,"stem":2281,"description":2282},"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":2284,"path":2285,"stem":2286,"description":2287},"Issue Management Guide","\u002Fplatform\u002Fissue-management-guide","01.platform\u002F06.issue-management-guide","Issue tracking, filtering, and management in Dethernety.",{"title":965,"path":964,"stem":2289,"description":2290},"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":2292,"path":2293,"stem":2294,"description":2295},"Understanding Modules","\u002Fplatform\u002Funderstanding-modules","01.platform\u002F08.understanding-modules","How Dethernety's module system extends your threat modeling capabilities.",{"title":2297,"path":2298,"stem":2299,"description":2300},"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":2302,"description":2303,"path":2304,"stem":2305,"children":2306,"page":-1},"BYODt cloud","Deploying the platform yourself and connecting it to the BYODt cloud.","\u002Fbyodt-cloud","02.byodt-cloud",[2307,2311,2316,2321,2326,2331],{"title":2308,"path":2304,"stem":2309,"description":2310},"BYODt Deployment","02.byodt-cloud\u002Findex","Run Dethernety on your own machine: install, configure, operate, and recover",{"title":2312,"path":2313,"stem":2314,"description":2315},"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":2317,"path":2318,"stem":2319,"description":2320},"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":2322,"path":2323,"stem":2324,"description":2325},"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":2327,"path":2328,"stem":2329,"description":2330},"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":2332,"path":2333,"stem":2334,"description":2335},"Troubleshooting the BYODt Deployment","\u002Fbyodt-cloud\u002Ftroubleshooting","02.byodt-cloud\u002F05.troubleshooting","Symptom, cause, and fix for the failures this deployment reports",{"title":2337,"description":2338,"path":2339,"stem":2340,"children":2341,"page":-1},"Dethereal","The Claude Code plugin: build a threat model in conversation and publish it to the platform.","\u002Fdethereal","03.dethereal",[2342,2346,2351,2352,2355,2360,2363,2366,2370,2375],{"title":2343,"path":2339,"stem":2344,"description":2345},"Dethereal — Claude Code Plugin for Threat Modeling","03.dethereal\u002Findex","Comprehensive documentation for the Dethereal threat modeling plugin",{"title":2347,"path":2348,"stem":2349,"description":2350},"Getting Started with Dethereal","\u002Fdethereal\u002Fgetting-started","03.dethereal\u002F01.getting-started","Install the plugin, authenticate, and create your first threat model",{"title":5,"path":2243,"stem":2245,"description":2233},{"title":45,"path":44,"stem":2353,"description":2354},"03.dethereal\u002F03.command-reference","Complete reference for all 14 Dethereal slash commands",{"title":2356,"path":2357,"stem":2358,"description":2359},"Threat Model Concepts","\u002Fdethereal\u002Fmodel-concepts","03.dethereal\u002F04.model-concepts","Components, boundaries, data flows, classes, attributes, and quality scoring",{"title":1382,"path":1381,"stem":2361,"description":2362},"03.dethereal\u002F05.discovery-and-enrichment","Infrastructure scanning, security attributes, MITRE ATT&CK, credentials, and compliance",{"title":1632,"path":1631,"stem":2364,"description":2365},"03.dethereal\u002F06.sync-and-version-control","Push\u002Fpull workflow, conflict handling, git integration, and multi-model projects",{"title":2367,"path":1474,"stem":2368,"description":2369},"Review and Attack Surface Analysis","03.dethereal\u002F07.review-and-analysis","Quality review, attack surface summary, and platform analysis integration",{"title":2371,"path":2372,"stem":2373,"description":2374},"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":2376,"path":2377,"stem":2378,"description":2379},"Dethereal Glossary","\u002Fdethereal\u002Fglossary","03.dethereal\u002F09.glossary","Definitions for Dethereal-specific terminology",{"title":2381,"description":2382,"path":2383,"stem":2384,"children":2385,"page":-1},"Threat Report","The residual-risk report over a threat model: reading it, filtering it and exporting it.","\u002Fthreat-report","04.threat-report",[2386,2389,2394,2399,2404,2409],{"title":2381,"path":2383,"stem":2387,"description":2388},"04.threat-report\u002Findex","Read, filter, drill into, and export a residual-risk report over a threat model",{"title":2390,"path":2391,"stem":2392,"description":2393},"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":2395,"path":2396,"stem":2397,"description":2398},"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":2400,"path":2401,"stem":2402,"description":2403},"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":2405,"path":2406,"stem":2407,"description":2408},"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":2410,"path":2411,"stem":2412,"description":2413},"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":2415,"description":2416,"path":2417,"stem":2418,"children":2419,"page":-1},"Risk assessment","The risk assessment module: the register, the reports and the method behind them.","\u002Frisk-assessment","05.risk-assessment",[2420,2424,2429,2434,2439,2444,2448,2453],{"title":2421,"path":2417,"stem":2422,"description":2423},"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":2425,"path":2426,"stem":2427,"description":2428},"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":2430,"path":2431,"stem":2432,"description":2433},"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":2435,"path":2436,"stem":2437,"description":2438},"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":2440,"path":2441,"stem":2442,"description":2443},"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":2395,"path":2445,"stem":2446,"description":2447},"\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":2449,"path":2450,"stem":2451,"description":2452},"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":2454,"path":2455,"stem":2456,"description":2457},"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":2459,"description":2460,"path":2461,"stem":2462,"children":2463,"page":-1},"Threat Patterns","The Threat Patterns module and its modelling checklist.","\u002Fthreat-patterns","06.threat-patterns",[2464,2468],{"title":2465,"path":2461,"stem":2466,"description":2467},"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":2469,"path":2470,"stem":2471,"description":2472},"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":2474,"description":2475,"path":2476,"stem":2477,"children":2478,"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",[2479,2483,2488,2493,2498,2503,2508,2513,2518,2523,2528,2533,2538],{"title":2480,"path":2476,"stem":2481,"description":2482},"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":2484,"path":2485,"stem":2486,"description":2487},"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":2489,"path":2490,"stem":2491,"description":2492},"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":2494,"path":2495,"stem":2496,"description":2497},"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":2499,"path":2500,"stem":2501,"description":2502},"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":2504,"path":2505,"stem":2506,"description":2507},"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":2509,"path":2510,"stem":2511,"description":2512},"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":2514,"path":2515,"stem":2516,"description":2517},"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":2519,"path":2520,"stem":2521,"description":2522},"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":2524,"path":2525,"stem":2526,"description":2527},"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":2529,"path":2530,"stem":2531,"description":2532},"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":2534,"path":2535,"stem":2536,"description":2537},"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":2539,"path":2540,"stem":2541,"description":2542},"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":2544,"description":2545,"path":2546,"stem":2547,"children":2548,"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",[2549,2553,2558],{"title":2550,"path":2546,"stem":2551,"description":2552},"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":2554,"path":2555,"stem":2556,"description":2557},"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":2559,"path":2560,"stem":2561,"description":2562},"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",1793748184840]