PageSourceSearch

https://pcongrp.com/assets/secret.pmplaybook-D7gMnEDO.js

js pcongrp.com collected 2026-10-06 11:22:32 UTC 19,185 bytes, 1 lines download raw bytes

1import{a3 as n,Q as e}from"./index-WtD9izgg.js";function o(){const d=n.useRef(null),r=n.useRef(null);return n.useEffect(()=>{const t=d.current,a=r.current;if(!t)return;const h=t.querySelectorAll(".reveal"),l=new IntersectionObserver(s=>{s.forEach(i=>{i.isIntersecting&&(i.target.classList.add("in"),l.unobserve(i.target))})},{threshold:.12});h.forEach(s=>l.observe(s));let c;return a&&(c=new IntersectionObserver(s=>{s.forEach(i=>{i.isIntersecting&&(a.classList.add("on"),c?.unobserve(a))})},{threshold:.35}),c.observe(a)),()=>{l.disconnect(),c?.disconnect()}},[]),e.jsxs("div",{className:"dw",ref:d,children:[e.jsx("nav",{className:"nav",children:e.jsxs("div",{className:"nav-inner",children:[e.jsxs("span",{className:"nav-brand",children:[e.jsx("b",{children:"Delivery Workflow"})," · internal"]}),e.jsxs("div",{className:"nav-links",children:[e.jsx("a",{href:"#pipeline",children:"Pipeline"}),e.jsx("a",{href:"#schema",children:"The Item"}),e.jsx("a",{href:"#roles",children:"Roles"}),e.jsx("a",{href:"#dod",children:"Done"}),e.jsx("a",{href:"#safety",children:"Safety Net"}),e.jsx("a",{href:"#rules",children:"Rules"}),e.jsx("a",{href:"#cadence",children:"Cadence"})]})]})}),e.jsxs("header",{className:"hero wrap",children:[e.jsx("p",{className:"eyebrow",children:"How Product, Engineering & QA ship together"}),e.jsx("h1",{children:"Capture once. Decide fast. Build small. Test on the item. Ship often."}),e.jsx("p",{className:"lede",children:"One shared record per request carries the requirement, the acceptance criteria, the build, and the QA sign‑off — from the first client call to production. No separate specs. No separate test plans. No waiting on each other."})]}),e.jsxs("section",{className:"pipeline-section wrap",id:"pipeline",children:[e.jsxs("div",{className:"section-head reveal",children:[e.jsx("p",{className:"section-tag",children:"01 · The Pipeline"}),e.jsx("h2",{children:"Five stages. One item moving through all of them."}),e.jsx("p",{className:"section-sub",children:"Everyone works off the same record — nobody hands off to a black box."})]}),e.jsxs("div",{className:"pipeline-rail",id:"rail",ref:r,children:[e.jsx("div",{className:"pipeline-progress"}),e.jsxs("div",{className:"node lit",children:[e.jsx("div",{className:"node-dot",children:"1"}),e.jsx("div",{className:"node-label",children:"Capture"}),e.jsx("div",{className:"node-owner",children:"Product"}),e.jsx("div",{className:"node-detail",children:"One item per request. Plain-language title, the problem, urgency, and evidence — recording, transcript, screenshot, or example."})]}),e.jsxs("div",{className:"node lit",children:[e.jsx("div",{className:"node-dot",children:"2"}),e.jsx("div",{className:"node-label",children:"Acceptance + Doc"}),e.jsx("div",{className:"node-owner",children:"Product"}),e.jsx("div",{className:"node-detail",children:"Product writes detailed user stories and acceptance criteria — every flow, edge case, and pass/fail outcome — right on the item. Detailed enough that no other documentation exists."})]}),e.jsxs("div",{className:"node lit",children:[e.jsx("div",{className:"node-dot",children:"3"}),e.jsx("div",{className:"node-label",children:"Build"}),e.jsx("div",{className:"node-owner",children:"Engineering"}),e.jsx("div",{className:"node-detail",children:"Engineering builds the smallest useful version against the acceptance criteria. One primary item per developer."})]}),e.jsxs("div",{className:"node lit",children:[e.jsx("div",{className:"node-dot",children:"4"}),e.jsx("div",{className:"node-label",children:"QA Test"}),e.jsx("div",{className:"node-owner",children:"QA"}),e.jsx("div",{className:"node-detail",children:"QA writes short test cases from the acceptance criteria. Unclear? Ask Product on the item and move to the next one — never wait idle."})]}),e.jsxs("div",{className:"node lit",children:[e.jsx("div",{className:"node-dot",children:"5"}),e.jsx("div",{className:"node-label",children:"Deliver"}),e.jsx("div",{className:"node-owner",children:"Everyone"}),e.jsx("div",{className:"node-detail",children:"All checks pass, no blocker bugs open — ship it. Flagged if risky, direct if small and safe."})]})]})]}),e.jsxs("section",{className:"wrap",id:"killed",children:[e.jsxs("div",{className:"section-head reveal",children:[e.jsx("p",{className:"section-tag",children:"02 · The Trade"}),e.jsx("h2",{children:"What we're not doing"}),e.jsx("p",{className:"section-sub",children:"Every line on the left is a real habit from a heavier process. Every line on the right is what replaces it here."})]}),e.jsxs("div",{className:"diff reveal",children:[e.jsxs("div",{className:"diff-row",children:[e.jsx("div",{className:"diff-cell diff-old",children:"Long PRDs and repeated documentation"}),e.jsx("div",{className:"diff-cell diff-new",children:"One shared item carries the problem, scope, checks, and evidence"})]}),e.jsxs("div",{className:"diff-row",children:[e.jsx("div",{className:"diff-cell diff-old",children:"Sprint rituals and story-point debates"}),e.jsx("div",{className:"diff-cell diff-new",children:"A continuous queue — pull the next most valuable item"})]}),e.jsxs("div",{className:"diff-row",children:[e.jsx("div",{className:"diff-cell diff-old",children:"Product hands to Dev, Dev hands to QA"}),e.jsx("div",{className:"diff-cell diff-new",children:"Product, Engineering, and QA are on the same item from day one"})]}),e.jsxs("div",{className:"diff-row",children:[e.jsx("div",{className:"diff-cell diff-old",children:"QA waits for a full spec doc before it will test anything"}),e.jsx("div",{className:"diff-cell diff-new",children:"QA tests strictly against Product's detailed acceptance criteria — nothing more, nothing less"})]}),e.jsxs("div",{className:"diff-row",children:[e.jsx("div",{className:"diff-cell diff-old",children:"Large releases after long cycles"}),e.jsx("div",{className:"diff-cell diff-new",children:"Small, demoable releases as soon as they're useful"})]}),e.jsxs("div",{className:"diff-row",children:[e.jsx("div",{className:"diff-cell diff-old",children:"A meeting for every decision"}),e.jsx("div",{className:"diff-cell diff-new",children:"Async by default — meet only for ambiguity, risk, or a decision"})]})]})]}),e.jsxs("section",{className:"wrap",id:"schema",children:[e.jsxs("div",{className:"section-head reveal",children:[e.jsx("p",{className:"section-tag",children:"03 · The Only Document"}),e.jsx("h2",{children:"One item. Seven fields."}),e.jsx("p",{className:"section-sub",children:"This record is the requirement, the spec, and the test log. The acceptance criteria carries the full weight of documentation — written in enough detail that nothing else needs to exist."})]}),e.jsxs("div",{className:"schema reveal",children:[e.jsxs("div",{className:"schema-head",children:[e.jsx("span",{children:"item.schema"}),e.jsx("span",{children:"v1"})]}),e.jsxs("div",{className:"schema-grid",children:[e.jsxs("div",{className:"schema-field",children:[e.jsx("div",{className:"schema-key",children:"problem"}),e.jsx("div",{className:"schema-val",children:"What's happening, and why it matters."})]}),e.jsxs("div",{className:"schema-field",children:[e.jsx("div",{className:"schema-key",children:"outcome"}),e.jsx("div",{className:"schema-val",children:"What the user should be able to do."})]}),e.jsxs("div",{className:"schema-field",children:[e.jsx("div",{className:"schema-key",children:"scope"}),e.jsx("div",{className:"schema-val",children:"What we are building now."})]}),e.jsxs("div",{className:"schema-field",children:[e.jsx("div",{className:"schema-key",children:"out_of_scope"}),e.jsx("div",{className:"schema-val",children:"What we're deliberately not building."})]}),e.jsxs("div",{className:"schema-field",children:[e.jsx("div",{className:"schema-key",children:"acceptance_checks"}),e.jsx("div",{className:"schema-val",children:"Detailed, observable pass/fail outcomes — every flow and edge case QA should verify. Written by Product. This is the documentation."})]}),e.jsxs("div",{className:"schema-field",children:[e.jsx("div",{className:"schema-key",children:"test_log"}),e.jsx("div",{className:"schema-val",children:"QA's pass/fail against each check, with evidence. Written by QA, same item."})]}),e.jsxs("div",{className:"schema-field wide",children:[e.jsx("div",{className:"schema-key",children:"evidence"}),e.jsx("div",{className:"schema-val",children:"Call timestamp, transcript, screenshot, sample data, or link."})]})]})]}),e.jsxs("div",{className:"checklist mt reveal",children:[e.jsxs("div",{className:"check-item",children:[e.jsx("div",{className:"check-box indigo",children:"✓"}),e.jsxs("div",{className:"check-text",children:["Every flow it must support",e.jsx("span",{children:"The happy path, spelled out — not assumed"})]})]}),e.jsxs("div",{className:"check-item",children:[e.jsx("div",{className:"check-box indigo",children:"✓"}),e.jsxs("div",{className:"check-text",children:["Every edge case and error state",e.jsx("span",{children:"Empty, invalid, expired, unauthorized — whatever applies"})]})]}),e.jsxs("div",{className:"check-item",children:[e.jsx("div",{className:"check-box indigo",children:"✓"}),e.jsxs("div",{className:"check-text",children:["An exact pass/fail per item",e.jsx("span",{children:"Observable and testable — not a feeling"})]})]}),e.jsxs("div",{className:"check-item",children:[e.jsx("div",{className:"check-box indigo",children:"✓"}),e.jsxs("div",{className:"check-text",children:["Nothing implied",e.
1jsx("span",{children:"If it isn't written, QA won't test for it"})]})]})]})]}),e.jsxs("section",{className:"wrap",id:"roles",children:[e.jsxs("div",{className:"section-head reveal",children:[e.jsx("p",{className:"section-tag",children:"04 · Ownership"}),e.jsx("h2",{children:"Who owns what"}),e.jsx("p",{className:"section-sub",children:"Clear lanes, not layers of approval."})]}),e.jsxs("div",{className:"roles reveal",children:[e.jsxs("div",{className:"role-card product",children:[e.jsx("div",{className:"role-title",children:"Product"}),e.jsxs("ul",{children:[e.jsx("li",{children:"Owns problem, outcome, scope, priority, and the acceptance criteria"}),e.jsx("li",{children:"Writes the spec once, on the item — not a documentation team"}),e.jsx("li",{children:"Answers QA's questions on the item, without calling a meeting"})]})]}),e.jsxs("div",{className:"role-card eng",children:[e.jsx("div",{className:"role-title",children:"Engineering"}),e.jsxs("ul",{children:[e.jsx("li",{children:"Owns implementation, tradeoffs, dependencies, and a working build"}),e.jsx("li",{children:"Builds the smallest useful version against the acceptance criteria"}),e.jsx("li",{children:"One primary item at a time — finish before starting the next"})]})]}),e.jsxs("div",{className:"role-card qa",children:[e.jsx("div",{className:"role-title",children:"QA"}),e.jsxs("ul",{children:[e.jsx("li",{children:"Tests against acceptance criteria that already exist — writes short test cases, not test plans"}),e.jsx("li",{children:"Asks Product directly on the item, then moves to the next item — never waits idle"}),e.jsx("li",{children:"Logs pass/fail with evidence, on the same item"})]})]})]})]}),e.jsxs("section",{className:"wrap",id:"dod",children:[e.jsxs("div",{className:"section-head reveal",children:[e.jsx("p",{className:"section-tag",children:"05 · Definition of Done"}),e.jsx("h2",{children:"The only checklist"}),e.jsx("p",{className:"section-sub",children:"Baked into the item. No separate DoD document."})]}),e.jsxs("div",{className:"checklist reveal",children:[e.jsxs("div",{className:"check-item",children:[e.jsx("div",{className:"check-box",children:"✓"}),e.jsx("div",{className:"check-text",children:"All acceptance checks pass"})]}),e.jsxs("div",{className:"check-item",children:[e.jsx("div",{className:"check-box",children:"✓"}),e.jsxs("div",{className:"check-text",children:["Zero open Blocker or Critical bugs",e.jsx("span",{children:"Minor and cosmetic issues don't hold up delivery"})]})]}),e.jsxs("div",{className:"check-item",children:[e.jsx("div",{className:"check-box",children:"✓"}),e.jsxs("div",{className:"check-text",children:["Shipped",e.jsx("span",{children:"Behind a flag if it's risky, direct if it's small and safe"})]})]}),e.jsxs("div",{className:"check-item",children:[e.jsx("div",{className:"check-box",children:"✓"}),e.jsx("div",{className:"check-text",children:"QA has logged pass/fail with evidence, on the item"})]}),e.jsxs("div",{className:"check-item",children:[e.jsx("div",{className:"check-box",children:"✓"}),e.jsxs("div",{className:"check-text",children:["Validated",e.jsx("span",{children:"By Product internally, by the client on consulting work"})]})]})]})]}),e.jsxs("section",{className:"wrap",id:"bugs",children:[e.jsxs("div",{className:"section-head reveal",children:[e.jsx("p",{className:"section-tag",children:"06 · When QA Finds a Bug"}),e.jsx("h2",{children:"The bug never stops the queue"}),e.jsx("p",{className:"section-sub",children:"QA logs it and keeps testing. The item, not the person, carries the wait."})]}),e.jsxs("div",{className:"lifecycle reveal",children:[e.jsxs("div",{className:"life-step",children:[e.jsx("div",{className:"life-title",children:"QA logs the bug on the item, with evidence"}),e.jsx("div",{className:"life-text",children:"Same record, same thread — no new ticket, no separate bug tracker."})]}),e.jsxs("div",{className:"life-step go",children:[e.jsxs("div",{className:"life-title",children:["QA moves to the next item immediately",e.jsx("span",{className:"life-tag go",children:"no wait"})]}),e.jsx("div",{className:"life-text",children:"Testing keeps moving. QA never sits blocked on one item."})]}),e.jsxs("div",{className:"life-step stop",children:[e.jsxs("div",{className:"life-title",children:["Blocker or 
1Critical",e.jsx("span",{className:"life-tag stop",children:"stops release"})]}),e.jsx("div",{className:"life-text",children:"This item doesn't ship until it's fixed and re-verified."})]}),e.jsxs("div",{className:"life-step go",children:[e.jsxs("div",{className:"life-title",children:["Minor or Cosmetic",e.jsx("span",{className:"life-tag go",children:"ships anyway"})]}),e.jsx("div",{className:"life-text",children:"Spun into a new fast-follow item. The current item still ships."})]}),e.jsxs("div",{className:"life-step",children:[e.jsx("div",{className:"life-title",children:"Dev fixes it, updates the same item, tags QA"}),e.jsx("div",{className:"life-text",children:"QA re-checks and closes it out. Done."})]})]})]}),e.jsxs("section",{className:"wrap",id:"safety",children:[e.jsxs("div",{className:"section-head reveal",children:[e.jsx("p",{className:"section-tag",children:"07 · The Safety Net"}),e.jsx("h2",{children:"Lean QA isn't zero QA"}),e.jsx("p",{className:"section-sub",children:"Short test cases catch most things. These five levers catch what slips through — fast, and only once."})]}),e.jsxs("div",{className:"cadence reveal",children:[e.jsxs("div",{className:"cad-card",children:[e.jsx("div",{className:"cad-when",children:"Risk-tiered depth"}),e.jsx("div",{className:"cad-what",children:"Payments, auth, and client-facing critical flows get a deep QA pass. Internal tools and cosmetic changes stay quick."})]}),e.jsxs("div",{className:"cad-card",children:[e.jsx("div",{className:"cad-when",children:"Staged rollout"}),e.jsx("div",{className:"cad-what",children:"Ship behind a flag to a small slice first. A miss hits a handful of people for minutes, not everyone in prod."})]}),e.jsxs("div",{className:"cad-card",children:[e.jsx("div",{className:"cad-when",children:"Fast detection"}),e.jsx("div",{className:"cad-what",children:"Error monitoring surfaces a break within minutes — from a dashboard, not from a client's email."})]}),e.jsxs("div",{className:"cad-card",children:[e.jsx("div",{className:"cad-when",children:"Fast rollback"}),e.jsx("div",{className:"cad-what",children:"Flip the flag off or revert the deploy in seconds. The undo is faster than the mistake."})]}),e.jsxs("div",{className:"cad-card highlight",children:[e.jsx("div",{className:"cad-when",children:"Every prod bug earns a test"}),e.jsx("div",{className:"cad-what",children:"What slips through becomes a permanent regression check. Lean QA compounds smarter — it doesn't stay static."})]})]})]}),e.jsxs("section",{className:"wrap",id:"rules",children:[e.jsxs("div",{className:"section-head reveal",children:[e.jsx("p",{className:"section-tag",children:"08 · Operating Rules"}),e.jsx("h2",{children:"Six rules, not a handbook"})]}),e.jsxs("div",{className:"rules reveal",children:[e.jsxs("div",{className:"rule",children:[e.jsx("b",{children:"Async by default."})," A meeting exists only to resolve ambiguity, risk, or a decision."]}),e.jsxs("div",{className:"rule",children:[e.jsx("b",{children:"No story points."})," Use Small / Medium / Large only when sizing helps planning."]}),e.jsxs("div",{className:"rule",children:[e.jsx("b",{children:"One primary item per developer."})," Finish before starting more."]}),e.jsxs("div",{className:"rule",children:[e.jsx("b",{children:"QA asks and moves on."})," Questions go on the item — QA never blocks waiting for an answer."]}),e.jsxs("div",{className:"rule",children:[e.jsx("b",{children:"New requests become new items,"})," unless they clarify the one already in progress."]}),e.jsxs("div",{className:"rule",children:[e.jsx("b",{children:"The acceptance criteria is the spec."})," Nothing else gets written unless support, security, or ops need it."]}),e.jsxs("div",{className:"rule",children:[e.jsx("b",{children:"Detailed beats short."})," Product writes every flow and edge case into the acceptance criteria — that detail is what replaces documentation, not a separate doc."]})]})]}),e.jsxs("section",{className:"wrap",id:"cadence",children:[e.jsxs("div",{className:"section-head reveal",children:[e.jsx("p",{className:"section-tag",children:"09 · Minimal Cadence"}),e.jsx("h2",{children:"How often we check in"})]}),e.jsxs("div",{className:"cadence reveal",children:[e.jsxs("div",{className:"cad-card",children:[e.jsx("div",{className:"cad-when",children:"Daily"}),e.jsx("div",{className:"cad-what",children:"Async update on the item: done, next, blocked. No standup meeting required."})]}),e.jsxs("div",{className:"cad-card",children:[e.jsx("div",{className:"cad-when",children:"Weekly — 30 min"}),e.jsx("div",{className:"cad-what",children:"Product, Engineering, QA, and leadership review priorities, blockers, and release decisions. Not every ticket."})]}),e.jsxs("div",{className:"cad-card",children:[e.jsx("div",{className:"cad-when",children:"Whenever ready"}),e.jsx("div",{className:"cad-what",children:"Demo and release useful increments. Don't wait for the end of a sprint."})]})]})]}),e.jsxs("footer",{className:"wrap",children:[e.jsxs("p",{className:"closing reveal",children:["Speed isn't the absence of rigor. It's fewer handoffs, ",e.jsx("em",{children:"one shared item"}),", and quality built into the build — not bolted on after."]}),e.jsx("p",{className:"footer-meta",children:"Same workflow for product and consulting work — only who signs off at Deliver changes."})]})]})}function x(){return e.jsx(o,{})}export{x as component};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.