[{"data":1,"prerenderedAt":793},["ShallowReactive",2],{"navigation:en":3,"\u002Fdocs\u002Ffireskills\u002Fgetting-started\u002Fstep-tdd-bdd:en":311},[4],{"title":5,"path":6,"stem":7,"children":8,"icon":10},"Nuxfire Docs","\u002Fdocs","docs\u002F0.index",[9,11,152],{"title":5,"path":6,"stem":7,"icon":10},"i-lucide-layout-grid",{"title":12,"path":13,"stem":14,"children":15,"icon":151},"SaaS Starter Kit","\u002Fdocs\u002Fsaas-starter-kit","docs\u002F1.saas-starter-kit\u002F0.index",[16,19,63,129],{"title":17,"path":13,"stem":14,"icon":18},"What is the SaaS Starter Kit?","i-lucide-info",{"title":20,"icon":21,"hide":22,"path":23,"stem":24,"children":25,"page":62},"Getting Started","i-lucide-play",true,"\u002Fdocs\u002Fsaas-starter-kit\u002Fgetting-started","docs\u002F1.saas-starter-kit\u002F1.getting-started",[26,30,34,38,42,46,50,54,58],{"title":27,"path":28,"stem":29},"Quick Start","\u002Fdocs\u002Fsaas-starter-kit\u002Fgetting-started\u002Fquick-start","docs\u002F1.saas-starter-kit\u002F1.getting-started\u002F0.quick-start",{"title":31,"path":32,"stem":33},"Installation","\u002Fdocs\u002Fsaas-starter-kit\u002Fgetting-started\u002Finstallation","docs\u002F1.saas-starter-kit\u002F1.getting-started\u002F1.installation",{"title":35,"path":36,"stem":37},"Cloudflare Access","\u002Fdocs\u002Fsaas-starter-kit\u002Fgetting-started\u002Fcloudflare-access","docs\u002F1.saas-starter-kit\u002F1.getting-started\u002F2.cloudflare-access",{"title":39,"path":40,"stem":41},"Configuration","\u002Fdocs\u002Fsaas-starter-kit\u002Fgetting-started\u002Fconfiguration","docs\u002F1.saas-starter-kit\u002F1.getting-started\u002F3.configuration",{"title":43,"path":44,"stem":45},"Secrets","\u002Fdocs\u002Fsaas-starter-kit\u002Fgetting-started\u002Fsecrets","docs\u002F1.saas-starter-kit\u002F1.getting-started\u002F4.secrets",{"title":47,"path":48,"stem":49},"Environment Variables","\u002Fdocs\u002Fsaas-starter-kit\u002Fgetting-started\u002Fenvironment-variables","docs\u002F1.saas-starter-kit\u002F1.getting-started\u002F5.environment-variables",{"title":51,"path":52,"stem":53},"Deploy","\u002Fdocs\u002Fsaas-starter-kit\u002Fgetting-started\u002Fdeploy","docs\u002F1.saas-starter-kit\u002F1.getting-started\u002F6.deploy",{"title":55,"path":56,"stem":57},"Local Development","\u002Fdocs\u002Fsaas-starter-kit\u002Fgetting-started\u002Flocal-development","docs\u002F1.saas-starter-kit\u002F1.getting-started\u002F7.local-development",{"title":59,"path":60,"stem":61},"Project Structure","\u002Fdocs\u002Fsaas-starter-kit\u002Fgetting-started\u002Fproject-structure","docs\u002F1.saas-starter-kit\u002F1.getting-started\u002F8.project-structure",false,{"title":64,"icon":65,"hide":22,"path":66,"stem":67,"children":68,"page":62},"Features","i-lucide-box","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures","docs\u002F1.saas-starter-kit\u002F2.features",[69,73,77,81,85,89,93,97,101,105,109,113,117,121,125],{"title":70,"path":71,"stem":72},"Authentication","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Fauth","docs\u002F1.saas-starter-kit\u002F2.features\u002F1.auth",{"title":74,"path":75,"stem":76},"Rate Limiting","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Frate-limiting","docs\u002F1.saas-starter-kit\u002F2.features\u002F10.rate-limiting",{"title":78,"path":79,"stem":80},"WebSockets","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Fwebsockets","docs\u002F1.saas-starter-kit\u002F2.features\u002F11.websockets",{"title":82,"path":83,"stem":84},"Blog","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Fblog","docs\u002F1.saas-starter-kit\u002F2.features\u002F14.blog",{"title":86,"path":87,"stem":88},"Documentation","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Fdocumentation","docs\u002F1.saas-starter-kit\u002F2.features\u002F15.documentation",{"title":90,"path":91,"stem":92},"Analytics","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Fanalytics","docs\u002F1.saas-starter-kit\u002F2.features\u002F16.analytics",{"title":94,"path":95,"stem":96},"Platform Admin Console","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Fplatform-admin","docs\u002F1.saas-starter-kit\u002F2.features\u002F17.platform-admin",{"title":98,"path":99,"stem":100},"Database","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Fdatabase","docs\u002F1.saas-starter-kit\u002F2.features\u002F2.database",{"title":102,"path":103,"stem":104},"Payments & Billing","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Fpayments","docs\u002F1.saas-starter-kit\u002F2.features\u002F3.payments",{"title":106,"path":107,"stem":108},"Emails","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Femails","docs\u002F1.saas-starter-kit\u002F2.features\u002F4.emails",{"title":110,"path":111,"stem":112},"Notifications","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Fnotifications","docs\u002F1.saas-starter-kit\u002F2.features\u002F5.notifications",{"title":114,"path":115,"stem":116},"Role-Based Access Control","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Frbac","docs\u002F1.saas-starter-kit\u002F2.features\u002F6.rbac",{"title":118,"path":119,"stem":120},"Async Jobs","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Fasync-jobs","docs\u002F1.saas-starter-kit\u002F2.features\u002F7.async-jobs",{"title":122,"path":123,"stem":124},"Storage","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Fstorage","docs\u002F1.saas-starter-kit\u002F2.features\u002F8.storage",{"title":126,"path":127,"stem":128},"Internationalization","\u002Fdocs\u002Fsaas-starter-kit\u002Ffeatures\u002Finternationalization","docs\u002F1.saas-starter-kit\u002F2.features\u002F9.internationalization",{"title":130,"icon":131,"path":132,"stem":133,"children":134,"page":62},"Concepts","i-lucide-graduation-cap","\u002Fdocs\u002Fsaas-starter-kit\u002Fconcepts","docs\u002F1.saas-starter-kit\u002F3.concepts",[135,139,143,147],{"title":136,"path":137,"stem":138},"Technology Stack","\u002Fdocs\u002Fsaas-starter-kit\u002Fconcepts\u002Ftech-stack","docs\u002F1.saas-starter-kit\u002F3.concepts\u002F0.tech-stack",{"title":140,"path":141,"stem":142},"SST.dev","\u002Fdocs\u002Fsaas-starter-kit\u002Fconcepts\u002Fsst","docs\u002F1.saas-starter-kit\u002F3.concepts\u002F1.sst",{"title":144,"path":145,"stem":146},"NuxtHub","\u002Fdocs\u002Fsaas-starter-kit\u002Fconcepts\u002Fnuxt-hub","docs\u002F1.saas-starter-kit\u002F3.concepts\u002F2.nuxt-hub",{"title":148,"path":149,"stem":150},"Design System & Branding","\u002Fdocs\u002Fsaas-starter-kit\u002Fconcepts\u002Fdesign-system","docs\u002F1.saas-starter-kit\u002F3.concepts\u002F3.design-system","i-lucide-zap",{"title":153,"path":154,"stem":155,"children":156,"icon":159},"Fireskills","\u002Fdocs\u002Ffireskills","docs\u002F2.fireskills\u002F0.index",[157,160,219,249,275,293],{"title":158,"path":154,"stem":155,"icon":159},"What is Fireskills?","i-lucide-flame",{"title":20,"icon":21,"hide":22,"path":161,"stem":162,"children":163,"page":62},"\u002Fdocs\u002Ffireskills\u002Fgetting-started","docs\u002F2.fireskills\u002F1.getting-started",[164,167,171,175,179,183,187,191,195,199,203,207,211,215],{"title":27,"path":165,"stem":166},"\u002Fdocs\u002Ffireskills\u002Fgetting-started\u002Fquick-start","docs\u002F2.fireskills\u002F1.getting-started\u002F00.quick-start",{"title":168,"path":169,"stem":170},"Workflow & Governance","\u002Fdocs\u002Ffireskills\u002Fgetting-started\u002Fworkflow","docs\u002F2.fireskills\u002F1.getting-started\u002F01.workflow",{"title":172,"path":173,"stem":174},"Project Context","\u002Fdocs\u002Ffireskills\u002Fgetting-started\u002Fproject-context","docs\u002F2.fireskills\u002F1.getting-started\u002F02.project-context",{"title":176,"path":177,"stem":178},"Step 0: Setup","\u002Fdocs\u002Ffireskills\u002Fgetting-started\u002Fstep-setup","docs\u002F2.fireskills\u002F1.getting-started\u002F03.step-setup",{"title":180,"path":181,"stem":182},"Step 1: Inbox","\u002Fdocs\u002Ffireskills\u002Fgetting-started\u002Fstep-inbox","docs\u002F2.fireskills\u002F1.getting-started\u002F04.step-inbox",{"title":184,"path":185,"stem":186},"Step 2: Backlog","\u002Fdocs\u002Ffireskills\u002Fgetting-started\u002Fstep-backlog","docs\u002F2.fireskills\u002F1.getting-started\u002F05.step-backlog",{"title":188,"path":189,"stem":190},"Step 3: Specify","\u002Fdocs\u002Ffireskills\u002Fgetting-started\u002Fstep-specify","docs\u002F2.fireskills\u002F1.getting-started\u002F06.step-specify",{"title":192,"path":193,"stem":194},"Step 4: Validate","\u002Fdocs\u002Ffireskills\u002Fgetting-started\u002Fstep-validate","docs\u002F2.fireskills\u002F1.getting-started\u002F07.step-validate",{"title":196,"path":197,"stem":198},"Step 5: Tasks","\u002Fdocs\u002Ffireskills\u002Fgetting-started\u002Fstep-tasks","docs\u002F2.fireskills\u002F1.getting-started\u002F08.step-tasks",{"title":200,"path":201,"stem":202},"Step 6: TDD\u002FBDD","\u002Fdocs\u002Ffireskills\u002Fgetting-started\u002Fstep-tdd-bdd","docs\u002F2.fireskills\u002F1.getting-started\u002F09.step-tdd-bdd",{"title":204,"path":205,"stem":206},"Step 7: Implement","\u002Fdocs\u002Ffireskills\u002Fgetting-started\u002Fstep-implement","docs\u002F2.fireskills\u002F1.getting-started\u002F10.step-implement",{"title":208,"path":209,"stem":210},"Step 8: Documentator","\u002Fdocs\u002Ffireskills\u002Fgetting-started\u002Fstep-documentator","docs\u002F2.fireskills\u002F1.getting-started\u002F11.step-documentator",{"title":212,"path":213,"stem":214},"Late Changes","\u002Fdocs\u002Ffireskills\u002Fgetting-started\u002Flate-changes","docs\u002F2.fireskills\u002F1.getting-started\u002F12.late-changes",{"title":216,"path":217,"stem":218},"Other Entry Points","\u002Fdocs\u002Ffireskills\u002Fgetting-started\u002Fother-entry-points","docs\u002F2.fireskills\u002F1.getting-started\u002F13.other-entry-points",{"title":220,"icon":221,"hide":22,"path":222,"stem":223,"children":224,"page":62},"Methodology","i-lucide-git-branch","\u002Fdocs\u002Ffireskills\u002Fmethodology","docs\u002F2.fireskills\u002F2.methodology",[225,229,233,237,241,245],{"title":226,"path":227,"stem":228},"The Three Acts","\u002Fdocs\u002Ffireskills\u002Fmethodology\u002Fthree-acts","docs\u002F2.fireskills\u002F2.methodology\u002F0.three-acts",{"title":230,"path":231,"stem":232},"The Three Gates","\u002Fdocs\u002Ffireskills\u002Fmethodology\u002Fthree-gates","docs\u002F2.fireskills\u002F2.methodology\u002F1.three-gates",{"title":234,"path":235,"stem":236},"The Canonical Spec","\u002Fdocs\u002Ffireskills\u002Fmethodology\u002Fcanonical-spec","docs\u002F2.fireskills\u002F2.methodology\u002F2.canonical-spec",{"title":238,"path":239,"stem":240},"Lifecycle States","\u002Fdocs\u002Ffireskills\u002Fmethodology\u002Flifecycle-states","docs\u002F2.fireskills\u002F2.methodology\u002F3.lifecycle-states",{"title":242,"path":243,"stem":244},"Effort Scale","\u002Fdocs\u002Ffireskills\u002Fmethodology\u002Feffort-scale","docs\u002F2.fireskills\u002F2.methodology\u002F4.effort-scale",{"title":246,"path":247,"stem":248},"Milestones & Governance","\u002Fdocs\u002Ffireskills\u002Fmethodology\u002Fgovernance-and-milestones","docs\u002F2.fireskills\u002F2.methodology\u002F5.governance-and-milestones",{"title":250,"icon":251,"hide":22,"path":252,"stem":253,"children":254,"page":62},"Skills","i-lucide-layers","\u002Fdocs\u002Ffireskills\u002Fskills","docs\u002F2.fireskills\u002F3.skills",[255,259,263,267,271],{"title":256,"path":257,"stem":258},"Catalog","\u002Fdocs\u002Ffireskills\u002Fskills\u002Fcatalog","docs\u002F2.fireskills\u002F3.skills\u002F0.catalog",{"title":260,"path":261,"stem":262},"Act I: Define","\u002Fdocs\u002Ffireskills\u002Fskills\u002Fact-1-define","docs\u002F2.fireskills\u002F3.skills\u002F1.act-1-define",{"title":264,"path":265,"stem":266},"Act II: Design & Prove","\u002Fdocs\u002Ffireskills\u002Fskills\u002Fact-2-design-prove","docs\u002F2.fireskills\u002F3.skills\u002F2.act-2-design-prove",{"title":268,"path":269,"stem":270},"Act III: Deliver","\u002Fdocs\u002Ffireskills\u002Fskills\u002Fact-3-deliver","docs\u002F2.fireskills\u002F3.skills\u002F3.act-3-deliver",{"title":272,"path":273,"stem":274},"Governance & Decisions","\u002Fdocs\u002Ffireskills\u002Fskills\u002Fgovernance-and-decisions","docs\u002F2.fireskills\u002F3.skills\u002F4.governance-and-decisions",{"title":276,"icon":277,"hide":22,"path":278,"stem":279,"children":280,"page":62},"Specialists","i-lucide-sparkles","\u002Fdocs\u002Ffireskills\u002Fspecialists","docs\u002F2.fireskills\u002F4.specialists",[281,285,289],{"title":282,"path":283,"stem":284},"Overview","\u002Fdocs\u002Ffireskills\u002Fspecialists\u002Foverview","docs\u002F2.fireskills\u002F4.specialists\u002F0.overview",{"title":286,"path":287,"stem":288},"Nuxfire Stack","\u002Fdocs\u002Ffireskills\u002Fspecialists\u002Fnuxfire-stack","docs\u002F2.fireskills\u002F4.specialists\u002F1.nuxfire-stack",{"title":290,"path":291,"stem":292},"Engineering Specialists","\u002Fdocs\u002Ffireskills\u002Fspecialists\u002Fengineering-specialists","docs\u002F2.fireskills\u002F4.specialists\u002F2.engineering-specialists",{"title":294,"icon":295,"hide":22,"path":296,"stem":297,"children":298,"page":62},"CLI & Tooling","i-lucide-terminal","\u002Fdocs\u002Ffireskills\u002Fcli","docs\u002F2.fireskills\u002F5.cli",[299,303,307],{"title":300,"path":301,"stem":302},"CLI Overview","\u002Fdocs\u002Ffireskills\u002Fcli\u002Foverview","docs\u002F2.fireskills\u002F5.cli\u002F0.overview",{"title":304,"path":305,"stem":306},"Commands","\u002Fdocs\u002Ffireskills\u002Fcli\u002Fcommands","docs\u002F2.fireskills\u002F5.cli\u002F1.commands",{"title":308,"path":309,"stem":310},"Safety Scripts","\u002Fdocs\u002Ffireskills\u002Fcli\u002Fgovernance-scripts","docs\u002F2.fireskills\u002F5.cli\u002F2.governance-scripts",{"id":312,"title":200,"body":313,"description":787,"extension":788,"meta":789,"navigation":790,"path":201,"seo":791,"stem":202,"__hash__":792},"docs\u002Fdocs\u002F2.fireskills\u002F1.getting-started\u002F09.step-tdd-bdd.md",{"type":314,"value":315,"toc":777},"minimark",[316,340,345,360,364,374,387,391,473,482,486,622,626,665,672,676,687,691,753,757,773],[317,318,319,323,324,328,329,332,333,336,337],"p",{},[320,321,322],"strong",{},"Skill:"," ",[325,326,327],"code",{},"fireskill-06-tdd-bdd"," · ",[320,330,331],{},"Asks questions:"," no · ",[320,334,335],{},"Creates:"," Vitest test files next to the code; updates the evidence table of ",[325,338,339],{},"spec.md",[341,342,344],"h2",{"id":343},"when-to-use-it","When to use it",[317,346,347,348,351,352,355,356,359],{},"Normally you do not call it: ",[325,349,350],{},"$fireskill-05-tasks"," calls it in ",[325,353,354],{},"prepare"," mode. Call it yourself when you want one more failing test, a ",[325,357,358],{},"cycle",", or an audit.",[341,361,363],{"id":362},"what-to-type","What to type",[365,366,372],"pre",{"className":367,"code":369,"language":370,"meta":371},[368],"language-text","Use $fireskill-06-tdd-bdd para ler o Gherkin de referência em specs\u002F\u003Cestado>\u002F\u003CNNNN>-\u003Cslug>\u002Fspec.md, criar testes TDD rastreáveis e executar RED-GREEN-REFACTOR sem executar .feature. Orquestre transições automáticas com anúncio, execução e retomada na mesma conversa.\n","text","",[325,373,369],{"__ignoreMap":371},[317,375,376,377,379,380,382,383,386],{},"You can name the mode in the same message: ",[325,378,354],{},", ",[325,381,358],{}," or ",[325,384,385],{},"verify",".",[341,388,390],{"id":389},"the-three-modes","The three modes",[392,393,394,410],"table",{},[395,396,397],"thead",{},[398,399,400,404,407],"tr",{},[401,402,403],"th",{},"Mode",[401,405,406],{},"When",[401,408,409],{},"What it does",[411,412,413,443,461],"tbody",{},[398,414,415,420,430],{},[416,417,418],"td",{},[325,419,354],{},[416,421,422,423,379,426,429],{},"before implementation (spec ",[325,424,425],{},"Defined",[325,427,428],{},"Plan Gate: Pending",")",[416,431,432,433,436,437,440,441],{},"writes the next test and proves RED, ",[320,434,435],{},"without"," production code; marks only that ",[325,438,439],{},"[TEST]"," task done; returns to ",[325,442,350],{},[398,444,445,449,458],{},[416,446,447],{},[325,448,358],{},[416,450,451,452,382,455,429],{},"during implementation (spec ",[325,453,454],{},"Planned",[325,456,457],{},"Implementing",[416,459,460],{},"RED → GREEN → REFACTOR for one chosen slice",[398,462,463,467,470],{},[416,464,465],{},[325,466,385],{},[416,468,469],{},"any time",[416,471,472],{},"runs the suites and audits traceability, creating no new behavior",[317,474,475,476,478,479,481],{},"If you do not say, it uses ",[325,477,354],{}," when the task list is not being executed yet and ",[325,480,358],{}," when a task is active.",[341,483,485],{"id":484},"how-a-test-is-written","How a test is written",[487,488,489,507,523,598,616],"ul",{},[490,491,492,493,496,497,499,500],"li",{},"The Gherkin block of the ",[325,494,495],{},"AC"," in ",[325,498,339],{}," is the reference. ",[320,501,502,503,506],{},"No ",[325,504,505],{},".feature"," file is created or run.",[490,508,509,510,382,513,516,517,379,520,386],{},"Tests are Vitest, next to the code in its layer (",[325,511,512],{},"shared\u002F**\u002F*.test.ts",[325,514,515],{},"server\u002F**\u002F*.test.ts","), at the lowest level that proves the behavior. Real examples: ",[325,518,519],{},"layers\u002Fteams\u002Fshared\u002Futils\u002Fabilities.test.ts",[325,521,522],{},"layers\u002Fteams\u002Fserver\u002Futils\u002Fteam-seats.test.ts",[490,524,525,526],{},"Each executable case carries its own marker, right beside its definition:",[365,527,531],{"className":528,"code":529,"language":530,"meta":371,"style":371},"language-ts shiki shiki-themes material-theme-lighter github-light github-dark monokai","\u002F\u002F SPECSFY: US-001 FR-001 AC-001\nit(\"rejeita convite de quem não é administrador\", async () => {\n  \u002F\u002F …\n});\n","ts",[325,532,533,542,581,587],{"__ignoreMap":371},[534,535,538],"span",{"class":536,"line":537},"line",1,[534,539,541],{"class":540},"ss7Ak","\u002F\u002F SPECSFY: US-001 FR-001 AC-001\n",[534,543,545,549,553,557,561,563,567,571,574,578],{"class":536,"line":544},2,[534,546,548],{"class":547},"sD0ED","it",[534,550,552],{"class":551},"ss--_","(",[534,554,556],{"class":555},"siCPE","\"",[534,558,560],{"class":559},"sLACW","rejeita convite de quem não é administrador",[534,562,556],{"class":555},[534,564,566],{"class":565},"swvn1",",",[534,568,570],{"class":569},"sTNss"," async",[534,572,573],{"class":565}," ()",[534,575,577],{"class":576},"srJo8"," =>",[534,579,580],{"class":565}," {\n",[534,582,584],{"class":536,"line":583},3,[534,585,586],{"class":540},"  \u002F\u002F …\n",[534,588,590,593,595],{"class":536,"line":589},4,[534,591,592],{"class":565},"}",[534,594,429],{"class":551},[534,596,597],{"class":565},";\n",[490,599,600,601,604,605,379,608,611,612,615],{},"At least ",[320,602,603],{},"three distinct cases"," for the whole feature and for each ",[325,606,607],{},"US",[325,609,610],{},"FR"," and ",[325,613,614],{},"NFR",": happy path, critical rule or variation, failure or material limit. One marker shared by a whole file counts as one case.",[490,617,618,619,621],{},"Every ",[325,620,495],{}," is covered by at least one case.",[341,623,625],{"id":624},"red-green-refactor","RED, GREEN, REFACTOR",[627,628,629,650,659],"ol",{},[490,630,631,634,635,637,638,641,642,645,646,649],{},[320,632,633],{},"RED",": write the smallest test that proves the ",[325,636,495],{},", run it (",[325,639,640],{},"bun run test",", or ",[325,643,644],{},"bunx vitest run \u003Cfile>",") and confirm it fails ",[320,647,648],{},"because the behavior is missing",". A failure from syntax, import, fixture or environment does not count. A test that passes before the change proves nothing and must be refined.",[490,651,652,655,656,658],{},[320,653,654],{},"GREEN"," (in ",[325,657,358],{},"): the minimum production code, focal test first, then the related suite.",[490,660,661,664],{},[320,662,663],{},"REFACTOR",": clean up with the tests green.",[317,666,667,668,671],{},"Each step is recorded in the ",[325,669,670],{},"Evidência RED-GREEN-REFACTOR"," table of the spec.",[341,673,675],{"id":674},"database-protection","Database protection",[317,677,678,679,682,683,686],{},"Before any test runs, ",[325,680,681],{},"check_database_safety.mjs"," classifies the command. If it is not ",[325,684,685],{},"SAFE",", no test runs and the step stays pending. Tests that reach PostgreSQL need a dedicated test database; use a rolled-back transaction or fixtures limited to the case.",[341,688,690],{"id":689},"check-traceability-yourself","Check traceability yourself",[365,692,696],{"className":693,"code":694,"language":695,"meta":371,"style":371},"language-bash shiki shiki-themes material-theme-lighter github-light github-dark monokai","node fireskills\u002Fskills\u002Ffireskill-06-tdd-bdd\u002Fscripts\u002Fcheck_traceability.mjs specs\u002Fplanned\u002F\u003CNNNN>-\u003Cslug>\u002Fspec.md .\nbun run test\n","bash",[325,697,698,742],{"__ignoreMap":371},[534,699,700,704,707,710,714,717,720,723,726,728,731,734,736,739],{"class":536,"line":537},[534,701,703],{"class":702},"sR7ES","node",[534,705,706],{"class":559}," fireskills\u002Fskills\u002Ffireskill-06-tdd-bdd\u002Fscripts\u002Fcheck_traceability.mjs",[534,708,709],{"class":559}," specs\u002Fplanned\u002F",[534,711,713],{"class":712},"sGXK2","\u003C",[534,715,716],{"class":559},"NNN",[534,718,719],{"class":551},"N",[534,721,722],{"class":712},">",[534,724,725],{"class":559},"-",[534,727,713],{"class":712},[534,729,730],{"class":559},"slu",[534,732,733],{"class":551},"g",[534,735,722],{"class":712},[534,737,738],{"class":559},"\u002Fspec.md",[534,740,741],{"class":559}," .\n",[534,743,744,747,750],{"class":536,"line":544},[534,745,746],{"class":702},"bun",[534,748,749],{"class":559}," run",[534,751,752],{"class":559}," test\n",[341,754,756],{"id":755},"next","Next",[317,758,759,761,762,766,767,770,771,386],{},[325,760,354],{}," returns to ",[763,764,765],"a",{"href":197},"Step 5",", which promotes the spec to ",[325,768,769],{},"planned",". Then ",[763,772,204],{"href":205},[774,775,776],"style",{},"html pre.shiki code .ss7Ak, html code.shiki .ss7Ak{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit;--shiki-sepia:#88846F;--shiki-sepia-font-style:inherit}html pre.shiki code .sD0ED, html code.shiki .sD0ED{--shiki-light:#6182B8;--shiki-default:#6F42C1;--shiki-dark:#B392F0;--shiki-sepia:#A6E22E}html pre.shiki code .ss--_, html code.shiki .ss--_{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8;--shiki-sepia:#F8F8F2}html pre.shiki code .siCPE, html code.shiki .siCPE{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF;--shiki-sepia:#E6DB74}html pre.shiki code .sLACW, html code.shiki .sLACW{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF;--shiki-sepia:#E6DB74}html pre.shiki code .swvn1, html code.shiki .swvn1{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8;--shiki-sepia:#F8F8F2}html pre.shiki code .sTNss, html code.shiki .sTNss{--shiki-light:#9C3EDA;--shiki-default:#D73A49;--shiki-dark:#F97583;--shiki-sepia:#F92672}html pre.shiki code .srJo8, html code.shiki .srJo8{--shiki-light:#9C3EDA;--shiki-light-font-style:inherit;--shiki-default:#D73A49;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit;--shiki-sepia:#66D9EF;--shiki-sepia-font-style:italic}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);}html .sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html.sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html pre.shiki code .sR7ES, html code.shiki .sR7ES{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0;--shiki-sepia:#A6E22E}html pre.shiki code .sGXK2, html code.shiki .sGXK2{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583;--shiki-sepia:#F92672}",{"title":371,"searchDepth":544,"depth":544,"links":778},[779,780,781,782,783,784,785,786],{"id":343,"depth":544,"text":344},{"id":362,"depth":544,"text":363},{"id":389,"depth":544,"text":390},{"id":484,"depth":544,"text":485},{"id":624,"depth":544,"text":625},{"id":674,"depth":544,"text":675},{"id":689,"depth":544,"text":690},{"id":755,"depth":544,"text":756},"Turn the Gherkin scenarios of the spec into failing Vitest tests, then make them pass.","md",{},{"title":200},{"title":200,"description":787},"NxUkW4uhIXreRTxLhoTREweHU_ZIviEXZCeFziDx5yY",1790707494430]