[{"data":1,"prerenderedAt":1604},["ShallowReactive",2],{"docs-sections":3,"docs-page-\u002Fdocs\u002Fcapabilities":124},[4,9,13,17,21,25,30,34,38,42,46,50,54,58,62,66,71,75,79,83,88,92,96,100,104,108,112,116,120],{"path":5,"title":6,"description":7,"group":8},"\u002Fdocs","Introduction","pdd-kit brings Product-Driven Development to coding agents through a Git-tracked Product Model and an automatic verification loop.","Get started",{"path":10,"title":11,"description":12,"group":8},"\u002Fdocs\u002Finstallation","Installation","Install the pdd-kit skills into your coding agent at project or global scope.",{"path":14,"title":15,"description":16,"group":8},"\u002Fdocs\u002Ffrom-your-repo","From your repo","Map what an existing repository already does into a Product Model, review it, then check the code against it.",{"path":18,"title":19,"description":20,"group":8},"\u002Fdocs\u002Ffrom-an-idea","From an idea","Decide what a new product does, approve its Product Model, then ask your agent to implement it while verify checks each part.",{"path":22,"title":23,"description":24,"group":8},"\u002Fdocs\u002Ffrom-a-blueprint","From a Blueprint","Pull a reviewed Product Model for a common kind of product instead of starting blank, adapt it if needed, then ask your agent to implement it.",{"path":26,"title":27,"description":28,"group":29},"\u002Fdocs\u002Fproduct-model","Model overview","The Product Model in five minutes (what the product-model\u002F folder holds, what each resource type is for, and how to tell them apart).","Product Model",{"path":31,"title":32,"description":33,"group":29},"\u002Fdocs\u002Fproduct","Product","The one product a Product Model describes (its name, its promise, the languages it is delivered in, its known boundaries, and what it needs to be published as a Blueprint).",{"path":35,"title":36,"description":37,"group":29},"\u002Fdocs\u002Fentities","Entities","The things your product keeps or reasons about (orders, products, settings) and the people and systems that act on it, with what it knows about each and the States it moves through.",{"path":39,"title":40,"description":41,"group":29},"\u002Fdocs\u002Finterfaces","Interfaces","The web apps, mobile apps, CLIs, APIs and webhooks through which people and systems reach your product, the parts inside them, and the places where facts and abilities are met.",{"path":43,"title":44,"description":45,"group":29},"\u002Fdocs\u002Fdomains","Domains","Optional subject areas, such as ordering or billing, that follow the Product's own sections and group its Capabilities and Entities without owning them.",{"path":47,"title":48,"description":49,"group":29},"\u002Fdocs\u002Fcapabilities","Capabilities","The things your product lets someone do, where each is offered, and the Capability Scenarios that show each one working.",{"path":51,"title":52,"description":53,"group":29},"\u002Fdocs\u002Fjourneys","Journeys","Goals where your product carries a person from one Capability into the next, and the Journey Scenarios that walk each path.",{"path":55,"title":56,"description":57,"group":29},"\u002Fdocs\u002Fbusiness-rules","Business Rules","What must always hold in your product, and who may do what (constraints, derivations and permissions), each stated once with everything it applies to.",{"path":59,"title":60,"description":61,"group":29},"\u002Fdocs\u002Fvariations","Variations","Feature flags, settings, plan tiers, A\u002FB tests and API versions, when your product works in more than one supported way and something decides which way applies.",{"path":63,"title":64,"description":65,"group":29},"\u002Fdocs\u002Freferences","References","Point any resource at material kept outside the model (code, a PRD, a design, research), saying what it is and why it is attached.",{"path":67,"title":68,"description":69,"group":70},"\u002Fdocs\u002Fskills","Skills overview","Three self-contained skills cover adoption, intended product change, and automatic verification-to-resolution.","Skills",{"path":72,"title":73,"description":74,"group":70},"\u002Fdocs\u002Fskill-pdd-map","map","Create or expand a Product Model from the code you already have, without running it.",{"path":76,"title":77,"description":78,"group":70},"\u002Fdocs\u002Fskill-pdd-ideate","ideate","Explore or define intended behavior, then write only the exact Product Model change you approve.",{"path":80,"title":81,"description":82,"group":70},"\u002Fdocs\u002Fskill-pdd-verify","verify","Implement the Product Model in code, in phases, or check that the model and the code agree, and resolve every gap you approve until they do or something blocks.",{"path":84,"title":85,"description":86,"group":87},"\u002Fdocs\u002Fcli","CLI overview","Install skills, lint and view a Product Model locally, and move Blueprints between repositories with the pdd-kit CLI.","CLI",{"path":89,"title":90,"description":91,"group":87},"\u002Fdocs\u002Fcli-install","install","Install the bundled pdd-kit agent skills safely for selected AI harnesses and scopes.",{"path":93,"title":94,"description":95,"group":87},"\u002Fdocs\u002Fcli-update","update","Refresh only pdd-kit-managed skill installations in project or global scope.",{"path":97,"title":98,"description":99,"group":87},"\u002Fdocs\u002Fcli-lint","lint","Check that a Product Model is structurally sound (files, relationships, Steps, Rules and References) without claiming it matches the code.",{"path":101,"title":102,"description":103,"group":87},"\u002Fdocs\u002Fcli-view","view","Open a Product Model as a private local report, from your checkout or from a GitHub repository.",{"path":105,"title":106,"description":107,"group":87},"\u002Fdocs\u002Fcli-export","blueprint export","Compile a Product Model into a portable Product Report that can move safely between repositories.",{"path":109,"title":110,"description":111,"group":87},"\u002Fdocs\u002Fcli-open","blueprint open","Expand a local Product Report into a canonical Product Model.",{"path":113,"title":114,"description":115,"group":87},"\u002Fdocs\u002Fcli-list","blueprint list","List the published Blueprints you can pull.",{"path":117,"title":118,"description":119,"group":87},"\u002Fdocs\u002Fcli-pull","blueprint pull","Pull a published Blueprint into the current directory.",{"path":121,"title":122,"description":123,"group":87},"\u002Fdocs\u002Fcli-contribute","blueprint contribute","Open a pull request proposing your Product Model as a Blueprint.",{"id":125,"title":48,"body":126,"description":49,"extension":421,"group":29,"meta":1565,"navigation":493,"order":729,"path":47,"seo":1601,"stem":1602,"__hash__":1603},"docs\u002Fdocs\u002Fcapabilities.md",{"type":127,"value":128,"toc":1548},"minimark",[129,133,141,150,155,221,229,233,236,241,260,398,401,405,415,518,569,576,579,582,598,608,611,621,624,628,634,1021,1122,1126,1150,1190,1336,1348,1355,1358,1362,1372,1376,1383,1387,1397,1401,1411,1415,1418,1512,1515,1544],[130,131,48],"h1",{"id":132},"capabilities",[134,135,136,140],"p",{},[137,138,139],"strong",{},"A Capability is something your product lets someone do, and keeps letting them\ndo."," It completes the sentence \"the Product can …\", and it outlives any one\nroute, button or code module.",[134,142,143,144,149],{},"Each Capability is shown working by its ",[145,146,148],"a",{"href":147},"#capability-scenarios","Capability Scenarios",":\nconcrete acceptance cases, each with a start, Steps and an outcome.",[151,152,154],"h2",{"id":153},"in-practice","In practice",[156,157,158,171],"table",{},[159,160,161],"thead",{},[162,163,164,168],"tr",{},[165,166,167],"th",{},"In the shop",[165,169,170],{},"The Capability",[172,173,174,188,199,210],"tbody",{},[162,175,176,180],{},[177,178,179],"td",{},"A shopper looks through products and reads one",[177,181,182,183,187],{},"Catalog browsing (",[184,185,186],"code",{},"browse-catalog",")",[162,189,190,193],{},[177,191,192],{},"A shopper turns a cart into an order",[177,194,195,196,187],{},"Checkout (",[184,197,198],{},"place-order",[162,200,201,204],{},[177,202,203],{},"A shopper or the store withdraws an order before it ships",[177,205,206,207,187],{},"Order cancellation (",[184,208,209],{},"cancel-order",[162,211,212,215],{},[177,213,214],{},"The payment gateway reports what has been paid",[177,216,217,218,187],{},"Payment settlement (",[184,219,220],{},"settle-payment",[134,222,223,224,228],{},"The title reads naturally; the id is verb-noun. A Capability needs no\n",[145,225,227],{"href":226},".\u002Fjourneys","Journey",".",[151,230,232],{"id":231},"when-you-create-one","When you create one",[134,234,235],{},"Create one for each durable thing the Product lets someone do, not for a\nfunction, an endpoint, a button label or one step of a flow.",[237,238,240],"h3",{"id":239},"split-by-verb-permission-and-place","Split by verb, permission and place",[134,242,243,244,247,248,251,252,255,256,228],{},"Make separate Capabilities when the ",[137,245,246],{},"verb"," differs, when ",[137,249,250],{},"who may"," do it\ndiffers (a permission of its own), or when ",[137,253,254],{},"where it is offered"," differs.\nEverything else stays one Capability with several Scenarios: the same verb done\ndifferent ways, from different starting states, or chosen by a setting. See\n",[145,257,259],{"href":258},".\u002Fvariations#what-selects-decides-it","What selects decides it",[156,261,262,271],{},[159,263,264],{},[162,265,266,269],{},[165,267,268],{},"What you see",[165,270,48],{},[172,272,273,281,289,297,305,313,321,331,339,347,355,363,371,382,390],{},[162,274,275,278],{},[177,276,277],{},"Create, configure, archive and delete repositories",[177,279,280],{},"Four: different verbs",[162,282,283,286],{},[177,284,285],{},"Switching an item's format needs a permission editing does not",[177,287,288],{},"Two: a permission of its own",[162,290,291,294],{},[177,292,293],{},"Restoring from the archive or from the trash",[177,295,296],{},"One: the starting state doesn't split it",[162,298,299,302],{},[177,300,301],{},"Notification settings on one settings page",[177,303,304],{},"One, however the page saves them",[162,306,307,310],{},[177,308,309],{},"Adding, changing and removing members of a group",[177,311,312],{},"Three: each list entry is a thing of its own",[162,314,315,318],{},[177,316,317],{},"Requesting a password reset, then choosing the new password from the emailed link",[177,319,320],{},"One: the request has no outcome without the link, so it is one run",[162,322,323,326],{},[177,324,325],{},"Signing up, then confirming the email from a link",[177,327,328,329],{},"Two: the account exists without the link, so confirming is its own Capability, joined by a ",[145,330,227],{"href":226},[162,332,333,336],{},[177,334,335],{},"Entering a second factor after any sign-in method",[177,337,338],{},"Its own Capability",[162,340,341,344],{},[177,342,343],{},"Searching, filtering or sorting the catalog",[177,345,346],{},"Part of browsing",[162,348,349,352],{},[177,350,351],{},"A shopper and an operator both cancel orders",[177,353,354],{},"One: a different Actor is not a permission of its own",[162,356,357,360],{},[177,358,359],{},"Publishing and unpublishing a collection",[177,361,362],{},"Two: opposite verbs, even behind one toggle button",[162,364,365,368],{},[177,366,367],{},"Republishing a collection that was unpublished",[177,369,370],{},"Part of publishing: the same verb from another state",[162,372,373,376],{},[177,374,375],{},"Setting a snippet to private, unlisted or public with one control",[177,377,378,379],{},"One: ",[184,380,381],{},"change-snippet-visibility",[162,383,384,387],{},[177,385,386],{},"Changing your vote before the poll closes",[177,388,389],{},"Part of voting: the same control changes your own submission",[162,391,392,395],{},[177,393,394],{},"Tagging a note and taking a tag off, both in the note's edit form",[177,396,397],{},"Two: each tag is an entry of its own",[134,399,400],{},"The same verb reached from somewhere else (changing your password when sign-in\ndemands it) is the same Capability, offered there too.",[151,402,404],{"id":403},"the-file","The file",[134,406,407,410,411,414],{},[184,408,409],{},"capabilities\u002F\u003Cid>.md",", or ",[184,412,413],{},"capabilities\u002F\u003Cid>\u002Fcapability.md"," once it owns\nScenarios. The H1 names it; the lead says what it lets someone do.",[416,417,423],"pre",{"className":418,"code":419,"filename":420,"language":421,"meta":422,"style":422},"language-md shiki shiki-themes pdd-kit-brand-warm pdd-kit-brand-warm material-theme-palenight","---\ndomain: ordering\navailability:\n  - place: customer-web::storefront\n  - place: customer-mobile::storefront\n---\n\n# Checkout\n\nTurns a valid cart into an order awaiting settlement.\n","capabilities\u002Fplace-order\u002Fcapability.md","md","",[184,424,425,434,448,457,471,483,488,495,506,511],{"__ignoreMap":422},[426,427,430],"span",{"class":428,"line":429},"line",1,[426,431,433],{"class":432},"sjkiA","---\n",[426,435,437,441,444],{"class":428,"line":436},2,[426,438,440],{"class":439},"sg1QC","domain",[426,442,443],{"class":432},":",[426,445,447],{"class":446},"s9fN-"," ordering\n",[426,449,451,454],{"class":428,"line":450},3,[426,452,453],{"class":439},"availability",[426,455,456],{"class":432},":\n",[426,458,460,463,466,468],{"class":428,"line":459},4,[426,461,462],{"class":432},"  -",[426,464,465],{"class":439}," place",[426,467,443],{"class":432},[426,469,470],{"class":446}," customer-web::storefront\n",[426,472,474,476,478,480],{"class":428,"line":473},5,[426,475,462],{"class":432},[426,477,465],{"class":439},[426,479,443],{"class":432},[426,481,482],{"class":446}," customer-mobile::storefront\n",[426,484,486],{"class":428,"line":485},6,[426,487,433],{"class":432},[426,489,491],{"class":428,"line":490},7,[426,492,494],{"emptyLinePlaceholder":493},true,"\n",[426,496,498,502],{"class":428,"line":497},8,[426,499,501],{"class":500},"sKwZ8","#",[426,503,505],{"class":504},"sBbkF"," Checkout\n",[426,507,509],{"class":428,"line":508},9,[426,510,494],{"emptyLinePlaceholder":493},[426,512,514],{"class":428,"line":513},10,[426,515,517],{"class":516},"szETn","Turns a valid cart into an order awaiting settlement.\n",[156,519,520,530],{},[159,521,522],{},[162,523,524,527],{},[165,525,526],{},"Field",[165,528,529],{},"Says",[172,531,532,542,556],{},[162,533,534,539],{},[177,535,536,538],{},[184,537,453],{}," (required)",[177,540,541],{},"Where it is offered, at least one place",[162,543,544,548],{},[177,545,546],{},[184,547,440],{},[177,549,550,551,555],{},"The one ",[145,552,554],{"href":553},".\u002Fdomains","Domain"," it belongs to, if any",[162,557,558,563],{},[177,559,560],{},[184,561,562],{},"references",[177,564,565,566],{},"Code or docs behind it, as ",[145,567,64],{"href":568},".\u002Freferences",[134,570,571,572,575],{},"An optional ",[184,573,574],{},"## Intent"," section says why the Product offers it.",[134,577,578],{},"A Capability lists no Actors, Entities, Rules or Scenarios. Its Scenarios sit in\nits folder, and what it changes is what their Steps say.",[151,580,581],{"id":453},"Availability",[134,583,584,585,588,589,593,594,597],{},"Each ",[184,586,587],{},"place"," is an Interface without Experiences, or one\n",[145,590,592],{"href":591},".\u002Finterfaces#experiences","Experience"," as ",[184,595,596],{},"interface::experience",", never a\nScreen. List every place where someone uses the Capability: if guests browse in\na public Experience and shoppers in a signed-in one, name both.",[134,599,600,601,607],{},"Every place listed needs a Capability Scenario that happens there. Availability\nis what the Product intends;\n",[145,602,604],{"href":603},".\u002Fskill-pdd-verify",[184,605,606],{},"pdd-verify"," checks the code against it.",[151,609,148],{"id":610},"capability-scenarios",[134,612,613,616,617,228],{},[137,614,615],{},"A Capability Scenario is one acceptance case for one Capability:"," what starts\nit, the Steps, and the outcome. It belongs to the Capability whose folder holds\nit; one owned by a Journey is a ",[145,618,620],{"href":619},".\u002Fjourneys#journey-scenarios","Journey Scenario",[134,622,623],{},"Write one for each outcome worth checking: the usual success, a refused\npermission, a failed validation, an external failure. For example, checkout\nrejected because stock ran out, not checkout succeeding on a Tuesday.",[237,625,627],{"id":626},"the-capability-scenario-file","The Capability Scenario file",[134,629,630,633],{},[184,631,632],{},"capabilities\u002F\u003Ccapability-id>\u002Fscenarios\u002F\u003Cid>.md",". The ids are unique across the\nwhole model.",[416,635,638],{"className":418,"code":636,"filename":637,"language":421,"meta":422,"style":422},"---\nkind: primary\nroutes:\n  web: Web\n  mobile: Mobile\nsteps:\n  - text: The shopper cancels an order that has not been paid\n    kind: actor\n    actor: shopper\n    entities:\n      - { entity: order, effect: reads, facts: [Items ordered, Total charged] }\n    contexts:\n      web:\n        place: customer-web::storefront::order-status\n      mobile:\n        place: customer-mobile::storefront::order-status\n  - text: The Product cancels the order and releases its stock\n    kind: product\n    actor: shopper\n    entities:\n      - { entity: order, effect: changes, from: Pending, to: Cancelled, facts: [] }\n    contexts:\n      web:\n        place: customer-web::storefront::order-status\n      mobile:\n        place: customer-mobile::storefront::order-status\n---\n\n# Cancel your own unpaid order\n\n## Trigger\n\nA shopper changes their mind before payment has settled.\n\n## Outcome\n\nThe order is cancelled and nothing is charged.\n","capabilities\u002Fcancel-order\u002Fscenarios\u002Fcancel-your-own-unpaid-order.md",[184,639,640,644,654,661,671,681,688,700,710,720,727,779,787,795,806,814,824,836,846,855,862,915,922,929,938,945,954,959,964,972,977,986,991,997,1002,1010,1015],{"__ignoreMap":422},[426,641,642],{"class":428,"line":429},[426,643,433],{"class":432},[426,645,646,649,651],{"class":428,"line":436},[426,647,648],{"class":439},"kind",[426,650,443],{"class":432},[426,652,653],{"class":446}," primary\n",[426,655,656,659],{"class":428,"line":450},[426,657,658],{"class":439},"routes",[426,660,456],{"class":432},[426,662,663,666,668],{"class":428,"line":459},[426,664,665],{"class":439},"  web",[426,667,443],{"class":432},[426,669,670],{"class":446}," Web\n",[426,672,673,676,678],{"class":428,"line":473},[426,674,675],{"class":439},"  mobile",[426,677,443],{"class":432},[426,679,680],{"class":446}," Mobile\n",[426,682,683,686],{"class":428,"line":485},[426,684,685],{"class":439},"steps",[426,687,456],{"class":432},[426,689,690,692,695,697],{"class":428,"line":490},[426,691,462],{"class":432},[426,693,694],{"class":439}," text",[426,696,443],{"class":432},[426,698,699],{"class":446}," The shopper cancels an order that has not been paid\n",[426,701,702,705,707],{"class":428,"line":497},[426,703,704],{"class":439},"    kind",[426,706,443],{"class":432},[426,708,709],{"class":446}," actor\n",[426,711,712,715,717],{"class":428,"line":508},[426,713,714],{"class":439},"    actor",[426,716,443],{"class":432},[426,718,719],{"class":446}," shopper\n",[426,721,722,725],{"class":428,"line":513},[426,723,724],{"class":439},"    entities",[426,726,456],{"class":432},[426,728,730,733,736,739,741,744,747,750,752,755,757,760,762,765,768,770,773,776],{"class":428,"line":729},11,[426,731,732],{"class":432},"      -",[426,734,735],{"class":432}," {",[426,737,738],{"class":439}," entity",[426,740,443],{"class":432},[426,742,743],{"class":446}," order",[426,745,746],{"class":432},",",[426,748,749],{"class":439}," effect",[426,751,443],{"class":432},[426,753,754],{"class":446}," reads",[426,756,746],{"class":432},[426,758,759],{"class":439}," facts",[426,761,443],{"class":432},[426,763,764],{"class":432}," [",[426,766,767],{"class":446},"Items ordered",[426,769,746],{"class":432},[426,771,772],{"class":446}," Total charged",[426,774,775],{"class":432},"]",[426,777,778],{"class":432}," }\n",[426,780,782,785],{"class":428,"line":781},12,[426,783,784],{"class":439},"    contexts",[426,786,456],{"class":432},[426,788,790,793],{"class":428,"line":789},13,[426,791,792],{"class":439},"      web",[426,794,456],{"class":432},[426,796,798,801,803],{"class":428,"line":797},14,[426,799,800],{"class":439},"        place",[426,802,443],{"class":432},[426,804,805],{"class":446}," customer-web::storefront::order-status\n",[426,807,809,812],{"class":428,"line":808},15,[426,810,811],{"class":439},"      mobile",[426,813,456],{"class":432},[426,815,817,819,821],{"class":428,"line":816},16,[426,818,800],{"class":439},[426,820,443],{"class":432},[426,822,823],{"class":446}," customer-mobile::storefront::order-status\n",[426,825,827,829,831,833],{"class":428,"line":826},17,[426,828,462],{"class":432},[426,830,694],{"class":439},[426,832,443],{"class":432},[426,834,835],{"class":446}," The Product cancels the order and releases its stock\n",[426,837,839,841,843],{"class":428,"line":838},18,[426,840,704],{"class":439},[426,842,443],{"class":432},[426,844,845],{"class":446}," product\n",[426,847,849,851,853],{"class":428,"line":848},19,[426,850,714],{"class":439},[426,852,443],{"class":432},[426,854,719],{"class":446},[426,856,858,860],{"class":428,"line":857},20,[426,859,724],{"class":439},[426,861,456],{"class":432},[426,863,865,867,869,871,873,875,877,879,881,884,886,889,891,894,896,899,901,904,906,908,910,913],{"class":428,"line":864},21,[426,866,732],{"class":432},[426,868,735],{"class":432},[426,870,738],{"class":439},[426,872,443],{"class":432},[426,874,743],{"class":446},[426,876,746],{"class":432},[426,878,749],{"class":439},[426,880,443],{"class":432},[426,882,883],{"class":446}," changes",[426,885,746],{"class":432},[426,887,888],{"class":439}," from",[426,890,443],{"class":432},[426,892,893],{"class":446}," Pending",[426,895,746],{"class":432},[426,897,898],{"class":439}," to",[426,900,443],{"class":432},[426,902,903],{"class":446}," Cancelled",[426,905,746],{"class":432},[426,907,759],{"class":439},[426,909,443],{"class":432},[426,911,912],{"class":432}," []",[426,914,778],{"class":432},[426,916,918,920],{"class":428,"line":917},22,[426,919,784],{"class":439},[426,921,456],{"class":432},[426,923,925,927],{"class":428,"line":924},23,[426,926,792],{"class":439},[426,928,456],{"class":432},[426,930,932,934,936],{"class":428,"line":931},24,[426,933,800],{"class":439},[426,935,443],{"class":432},[426,937,805],{"class":446},[426,939,941,943],{"class":428,"line":940},25,[426,942,811],{"class":439},[426,944,456],{"class":432},[426,946,948,950,952],{"class":428,"line":947},26,[426,949,800],{"class":439},[426,951,443],{"class":432},[426,953,823],{"class":446},[426,955,957],{"class":428,"line":956},27,[426,958,433],{"class":432},[426,960,962],{"class":428,"line":961},28,[426,963,494],{"emptyLinePlaceholder":493},[426,965,967,969],{"class":428,"line":966},29,[426,968,501],{"class":500},[426,970,971],{"class":504}," Cancel your own unpaid order\n",[426,973,975],{"class":428,"line":974},30,[426,976,494],{"emptyLinePlaceholder":493},[426,978,980,983],{"class":428,"line":979},31,[426,981,982],{"class":500},"##",[426,984,985],{"class":504}," Trigger\n",[426,987,989],{"class":428,"line":988},32,[426,990,494],{"emptyLinePlaceholder":493},[426,992,994],{"class":428,"line":993},33,[426,995,996],{"class":516},"A shopper changes their mind before payment has settled.\n",[426,998,1000],{"class":428,"line":999},34,[426,1001,494],{"emptyLinePlaceholder":493},[426,1003,1005,1007],{"class":428,"line":1004},35,[426,1006,982],{"class":500},[426,1008,1009],{"class":504}," Outcome\n",[426,1011,1013],{"class":428,"line":1012},36,[426,1014,494],{"emptyLinePlaceholder":493},[426,1016,1018],{"class":428,"line":1017},37,[426,1019,1020],{"class":516},"The order is cancelled and nothing is charged.\n",[156,1022,1023,1032],{},[159,1024,1025],{},[162,1026,1027,1030],{},[165,1028,1029],{},"Field or section",[165,1031,529],{},[172,1033,1034,1054,1063,1082,1092,1102,1112],{},[162,1035,1036,1040],{},[177,1037,1038,538],{},[184,1039,648],{},[177,1041,1042,1043,1046,1047,1050,1051],{},"The Scenario kind, such as ",[184,1044,1045],{},"primary"," or ",[184,1048,1049],{},"edge",", from ",[184,1052,1053],{},"taxonomies.yaml",[162,1055,1056,1060],{},[177,1057,1058,538],{},[184,1059,658],{},[177,1061,1062],{},"Each route's id and name",[162,1064,1065,1069],{},[177,1066,1067,538],{},[184,1068,685],{},[177,1070,1071,1072,1075,1076,1078,1079],{},"The ordered Steps, each with ",[184,1073,1074],{},"text",", ",[184,1077,648],{}," and ",[184,1080,1081],{},"entities",[162,1083,1084,1089],{},[177,1085,1086,538],{},[184,1087,1088],{},"## Trigger",[177,1090,1091],{},"What starts it",[162,1093,1094,1099],{},[177,1095,1096,538],{},[184,1097,1098],{},"## Outcome",[177,1100,1101],{},"What is true at the end",[162,1103,1104,1109],{},[177,1105,1106],{},[184,1107,1108],{},"## Decision points",[177,1110,1111],{},"Questions whose branches reach the same outcome",[162,1113,1114,1119],{},[177,1115,1116],{},[184,1117,1118],{},"## Edge cases",[177,1120,1121],{},"One-line bullets: a condition and its consequence",[237,1123,1125],{"id":1124},"what-a-step-does-to-the-products-things","What a Step does to the Product's things",[134,1127,1128,1129,1131,1132,1135,1136,1139,1140,1143,1144,1146,1147,1149],{},"A Step's ",[184,1130,648],{}," is ",[184,1133,1134],{},"actor"," (an Actor does it), ",[184,1137,1138],{},"product"," (the Product does it)\nor ",[184,1141,1142],{},"condition"," (something holds). An ",[184,1145,1134],{}," Step names its ",[184,1148,1134],{},"; a Product\nor condition Step may name the Actor it is done for.",[134,1151,1152,1153,1156,1157,1159,1160,1163,1164,1167,1168,1171,1172,1075,1175,1046,1178,1181,1182,1185,1186,1189],{},"Every Step lists what it does to the Product's ",[145,1154,36],{"href":1155},".\u002Fentities"," in\n",[184,1158,1081],{},", or writes ",[184,1161,1162],{},"entities: []",". Each entry has an ",[184,1165,1166],{},"effect"," (",[184,1169,1170],{},"creates",",\n",[184,1173,1174],{},"changes",[184,1176,1177],{},"removes",[184,1179,1180],{},"reads","), the States it moves between, where the\nEntity has States, and the ",[184,1183,1184],{},"facts"," it reads, changes or fills in. The facts list\nis exhaustive: ",[184,1187,1188],{},"[]"," means none, never \"unspecified\".",[416,1191,1195],{"className":1192,"code":1193,"language":1194,"meta":422,"style":422},"language-yaml shiki shiki-themes pdd-kit-brand-warm pdd-kit-brand-warm material-theme-palenight","- text: The Product stores the order as pending and empties the cart\n  kind: product\n  actor: shopper\n  entities:\n    - { entity: order, effect: creates, to: Pending, facts: [Items ordered, Delivery details, Subtotal, Tax, Discount, Total charged, Margin, When placed] }\n    - { entity: cart, effect: removes }\n","yaml",[184,1196,1197,1209,1218,1227,1234,1312],{"__ignoreMap":422},[426,1198,1199,1202,1204,1206],{"class":428,"line":429},[426,1200,1201],{"class":432},"-",[426,1203,694],{"class":439},[426,1205,443],{"class":432},[426,1207,1208],{"class":446}," The Product stores the order as pending and empties the cart\n",[426,1210,1211,1214,1216],{"class":428,"line":436},[426,1212,1213],{"class":439},"  kind",[426,1215,443],{"class":432},[426,1217,845],{"class":446},[426,1219,1220,1223,1225],{"class":428,"line":450},[426,1221,1222],{"class":439},"  actor",[426,1224,443],{"class":432},[426,1226,719],{"class":446},[426,1228,1229,1232],{"class":428,"line":459},[426,1230,1231],{"class":439},"  entities",[426,1233,456],{"class":432},[426,1235,1236,1239,1241,1243,1245,1247,1249,1251,1253,1256,1258,1260,1262,1264,1266,1268,1270,1272,1274,1276,1279,1281,1284,1286,1289,1291,1294,1296,1298,1300,1303,1305,1308,1310],{"class":428,"line":473},[426,1237,1238],{"class":432},"    -",[426,1240,735],{"class":432},[426,1242,738],{"class":439},[426,1244,443],{"class":432},[426,1246,743],{"class":446},[426,1248,746],{"class":432},[426,1250,749],{"class":439},[426,1252,443],{"class":432},[426,1254,1255],{"class":446}," creates",[426,1257,746],{"class":432},[426,1259,898],{"class":439},[426,1261,443],{"class":432},[426,1263,893],{"class":446},[426,1265,746],{"class":432},[426,1267,759],{"class":439},[426,1269,443],{"class":432},[426,1271,764],{"class":432},[426,1273,767],{"class":446},[426,1275,746],{"class":432},[426,1277,1278],{"class":446}," Delivery details",[426,1280,746],{"class":432},[426,1282,1283],{"class":446}," Subtotal",[426,1285,746],{"class":432},[426,1287,1288],{"class":446}," Tax",[426,1290,746],{"class":432},[426,1292,1293],{"class":446}," Discount",[426,1295,746],{"class":432},[426,1297,772],{"class":446},[426,1299,746],{"class":432},[426,1301,1302],{"class":446}," Margin",[426,1304,746],{"class":432},[426,1306,1307],{"class":446}," When placed",[426,1309,775],{"class":432},[426,1311,778],{"class":432},[426,1313,1314,1316,1318,1320,1322,1325,1327,1329,1331,1334],{"class":428,"line":485},[426,1315,1238],{"class":432},[426,1317,735],{"class":432},[426,1319,738],{"class":439},[426,1321,443],{"class":432},[426,1323,1324],{"class":446}," cart",[426,1326,746],{"class":432},[426,1328,749],{"class":439},[426,1330,443],{"class":432},[426,1332,1333],{"class":446}," removes",[426,1335,778],{"class":432},[134,1337,1338,1339,1342,1343,1347],{},"When removing one thing removes others with it — a card's comments go with\nthe card — each of those entries says ",[184,1340,1341],{},"with: card",". Only the removal it goes\nwith needs permission, so ",[1344,1345,1346],"em",{},"only its author deletes a comment"," still holds.",[134,1349,1350,1351,1354],{},"A Scenario's ",[137,1352,1353],{},"Ends with"," is where each thing it touched is left. Across the\nwhole model, Step entries make up each Entity's lifecycle.",[134,1356,1357],{},"A Step at a public place names the person who isn't signed in, even if about to.",[237,1359,1361],{"id":1360},"behavior-nobody-triggers","Behavior nobody triggers",[134,1363,1364,1365,1367,1368,1371],{},"A schedule, expiry or retry the Product runs alone starts with a ",[184,1366,1142],{},"\nStep carrying ",[184,1369,1370],{},"unattended: true"," and no Actor; its Capability is available where\nsomeone sees the result.",[237,1373,1375],{"id":1374},"routes-steps-and-context-places","Routes, Steps, and Context places",[134,1377,1378,1379,1382],{},"Each Step's ",[184,1380,1381],{},"contexts"," says where it happens, per route: the Screen, Experience\nor Interface. A route is the same Steps in different places (web and mobile\nabove); different Steps are another Scenario.",[237,1384,1386],{"id":1385},"capability-scenario-decision-points","Capability Scenario decision points",[134,1388,1389,1390,1392,1393,1396],{},"A decision point is an H3 under ",[184,1391,1108],{}," with one question and at\nleast two ",[184,1394,1395],{},"condition → outcome"," branches, all reaching the Scenario's outcome. A\nbranch with a different outcome is another Scenario.",[151,1398,1400],{"id":1399},"how-it-connects","How it connects",[134,1402,1403,1404,1407,1408,1410],{},"Entities change only through Steps, so each Entity's lifecycle comes from the\nScenarios. Screens offer the Capabilities whose Steps happen on them.\n",[145,1405,56],{"href":1406},".\u002Fbusiness-rules"," saying who may are checked against the\nSteps that act, and ",[145,1409,52],{"href":226}," name the Capability, never one of\nits Scenarios.",[151,1412,1414],{"id":1413},"what-lint-checks","What lint checks",[134,1416,1417],{},"Errors:",[1419,1420,1421,1430,1433,1457,1472,1498,1501,1506],"ul",{},[1422,1423,1424,1425,1427,1428,228],"li",{},"A Capability needs an H1, a lead, and ",[184,1426,453],{}," places that exist, each\nwith a Scenario happening there. It never carries ",[184,1429,1081],{},[1422,1431,1432],{},"An availability place never names a Screen, nor a divided Interface instead\nof one of its Experiences.",[1422,1434,1435,1436,1075,1438,1075,1440,1075,1442,1078,1444,1446,1447,1075,1449,1078,1451,1453,1454,1456],{},"A Scenario needs ",[184,1437,648],{},[184,1439,658],{},[184,1441,685],{},[184,1443,1088],{},[184,1445,1098],{},", and\nits id is used once; every Step has ",[184,1448,1074],{},[184,1450,648],{},[184,1452,1081],{},", and an\n",[184,1455,1134],{}," Step names its actor.",[1422,1458,584,1459,1461,1462,1464,1465,1467,1468,1471],{},[184,1460,1081],{}," entry names a real Entity and its real States and facts;\n",[184,1463,1184],{}," is required, except on ",[184,1466,1177],{},", which has none; a ",[184,1469,1470],{},"from"," matches\nwhere an earlier Step left the thing.",[1422,1473,1474,1477,1478,1046,1480,1482,1483,1046,1486,1489,1490,1493,1494,1497],{},[184,1475,1476],{},"with"," sits only on a ",[184,1479,1170],{},[184,1481,1177],{}," entry, names another entry of the\nsame Step and effect whose Entity holds this one (it declares a ",[184,1484,1485],{},"one-to-many",[184,1487,1488],{},"one-to-one","\nrelation to it), and never loops back; no two entries of a Step share an\n",[184,1491,1492],{},"as","-or-",[184,1495,1496],{},"entity"," reference.",[1422,1499,1500],{},"Step text that names an Entity's title must list that Entity.",[1422,1502,1503,1505],{},[184,1504,1381],{}," maps every route, stays inside the Capability's availability, and\nsupports the Step's Actor; no two routes visit the same places.",[1422,1507,1508,1509,1511],{},"A Scenario has an ",[184,1510,1134],{}," Step or an unattended first Step.",[134,1513,1514],{},"Warnings:",[1419,1516,1517,1520,1526,1537],{},[1422,1518,1519],{},"A Capability or Scenario id that reads as a noun phrase instead of starting\nwith a verb, or that shortens the name of an Entity the model declares.",[1422,1521,1522,1523,1525],{},"A Step that creates or removes a thing and what it holds with no ",[184,1524,1476],{}," on\neither.",[1422,1527,1528,1529,1532,1533,1536],{},"A Capability Scenario that opens with the opposite of its Capability's verb,\nsuch as ",[184,1530,1531],{},"enable-a-disabled-link"," under ",[184,1534,1535],{},"disable-link",": opposite verbs are\nseparate Capabilities.",[1422,1538,1539,1540,1543],{},"A Capability named with an umbrella verb, such as ",[184,1541,1542],{},"manage-orders",": name each\nverb its controls show.",[1545,1546,1547],"style",{},"html pre.shiki code .sjkiA, html code.shiki .sjkiA{--shiki-light:#362B1D;--shiki-default:#362B1D;--shiki-dark:#89DDFF}html pre.shiki code .sg1QC, html code.shiki .sg1QC{--shiki-light:#00585F;--shiki-default:#00585F;--shiki-dark:#F07178}html pre.shiki code .s9fN-, html code.shiki .s9fN-{--shiki-light:#6E3500;--shiki-default:#6E3500;--shiki-dark:#C3E88D}html pre.shiki code .sKwZ8, html code.shiki .sKwZ8{--shiki-light:#362B1D;--shiki-light-font-weight:bold;--shiki-default:#362B1D;--shiki-default-font-weight:bold;--shiki-dark:#89DDFF;--shiki-dark-font-weight:inherit}html pre.shiki code .sBbkF, html code.shiki .sBbkF{--shiki-light:#00585F;--shiki-light-font-weight:bold;--shiki-default:#00585F;--shiki-default-font-weight:bold;--shiki-dark:#FFCB6B;--shiki-dark-font-weight:inherit}html pre.shiki code .szETn, html code.shiki .szETn{--shiki-light:#362B1D;--shiki-default:#362B1D;--shiki-dark:#BABED8}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}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":422,"searchDepth":436,"depth":436,"links":1549},[1550,1551,1554,1555,1556,1563,1564],{"id":153,"depth":436,"text":154},{"id":231,"depth":436,"text":232,"children":1552},[1553],{"id":239,"depth":450,"text":240},{"id":403,"depth":436,"text":404},{"id":453,"depth":436,"text":581},{"id":610,"depth":436,"text":148,"children":1557},[1558,1559,1560,1561,1562],{"id":626,"depth":450,"text":627},{"id":1124,"depth":450,"text":1125},{"id":1360,"depth":450,"text":1361},{"id":1374,"depth":450,"text":1375},{"id":1385,"depth":450,"text":1386},{"id":1399,"depth":436,"text":1400},{"id":1413,"depth":436,"text":1414},{"section":1566,"terms":1567},"open-source",[1568,1571,1574,1577,1580,1582,1585,1589,1592,1595,1598],{"term":1569,"definition":1570},"Capability","A durable thing the Product lets someone do, such as checkout or order cancellation, independent of any one route, command or module.",{"term":1572,"anchor":610,"definition":1573},"Capability Scenario","One acceptance case for a Capability: what starts it, its Steps, and the outcome.",{"term":1575,"anchor":453,"definition":1576},"Context","A place where behavior is offered or happens: one Interface, Experience or Screen.",{"term":1578,"anchor":1124,"definition":1579},"Step","One action or condition in a Scenario, by an Actor or the Product, saying what it does to the Product's Entities.",{"term":1353,"anchor":1124,"definition":1581},"Where each Entity a Scenario touches is left: its last creation, change or removal, with the resulting State when there is one.",{"term":1583,"anchor":626,"definition":1584},"Scenario kind","A category for a Scenario, such as primary or edge, defined in the model's taxonomies.yaml.",{"term":1586,"on":1587,"anchor":626,"definition":1588},"Trigger","capability-scenario","What starts the Scenario.",{"term":1590,"on":1587,"anchor":626,"definition":1591},"Outcome","What is true once the Scenario has run.",{"term":1593,"on":1587,"anchor":1374,"definition":1594},"Route","One named way the same Steps play out in different places, such as web and mobile. Different Steps mean a different Scenario.",{"term":1596,"on":1587,"anchor":1385,"definition":1597},"Decision point","A question inside a Scenario whose branches all reach the same outcome. A different outcome is another Scenario.",{"term":1599,"on":1587,"anchor":626,"definition":1600},"Edge case","A condition and its consequence noted within a Scenario, without changing its path.",{"title":48,"description":49},"docs\u002Fcapabilities","rbS9eV5DBDvfuy8hkLHxyyaVwReWdAuZQ8UG2t6d8xc",1791840531137]