{"activation":{"grantsAuthority":false,"requires":["Exact locally trusted RAPP Work SDK and RAPP/1 pins","Consumer-selected owner and destination","Review and approval of complete native scaffold and pointer-registration plans","Review and approval before copying starter files or executing any code"],"status":"not-activated"},"archive":{"bytes":78187,"mediaType":"application/zip","path":"api/hive-hub/v1/seeds/downloads/sha256/d2/d2f818c10c0af2b0af010ae280eec8bd94e80f5fb7609a71993694827810a6da.zip","ref":"sha256:d2f818c10c0af2b0af010ae280eec8bd94e80f5fb7609a71993694827810a6da","sha256":"d2f818c10c0af2b0af010ae280eec8bd94e80f5fb7609a71993694827810a6da","url":"https://kody-w.github.io/rapp-hive-hub/api/hive-hub/v1/seeds/downloads/sha256/d2/d2f818c10c0af2b0af010ae280eec8bd94e80f5fb7609a71993694827810a6da.zip"},"blueprintSha256":"23f5ddebfa199d1cd50f0c72e04dd35a6aa8f990a2fb73f04cd5374ce63935d5","case":{"brief":"SYNTHETIC case at 2026-09-30: Cedarline Desk has declining subscription receipts, increasing refunds, USD 32400 closing cash, and twelve authored open tickets. Its actual small reference dispatcher alphabetizes severity, sending low-priority tickets ahead of urgent ones. A five-day planning sprint has 360 engineering minutes and 420 support-remediation minutes. No production account, money, trade, customer message, or realized recovery is involved.","id":"cedarline-five-day-recovery","inputs":["case/recovery.json","data/cash-ledger.csv","data/subscriptions.csv","data/payables.csv","data/support-backlog.csv","product/dispatch.py"],"success_criteria":["Fifteen synthetic cash rows reconcile USD 52000 opening cash plus USD 48500 receipts less USD 68100 payments to USD 32400 closing cash.","USD 5500 incremental prior-period payables are reserved separately; runway to the USD 12000 floor is about 49.7 days under the repeated-September scenario.","The alphabetical dispatch defect is reproducible and a candidate policy prioritizes eligible urgent tickets without dispatching a blocked ticket.","The support simulation selects six tickets totaling exactly 420 estimated minutes and retains all other tickets as blocked or deferred.","Any proposed USD 1700 monthly containment difference remains an approval-dependent scenario, not achieved savings, profit, sales, or executed financial activity."],"title":"Cedarline Desk: cash containment and a broken support dispatch queue"},"classification":"public-synthetic","counts":{"packageFiles":31,"starterFiles":14,"tasks":11,"teams":5,"workspaces":6},"dependencies":{"activation":"Separate owner-approved native plans are required; the seed grants no authority.","protocol":{"commit":"591e014ad39e223b00ab343ae26e5d9a867ebeee","id":"rapp/1","reference_sha256":"1a04362b02f14c1e37b70c6b4f72d79e92df1cc9c2b5b394e8e1b141fc0b6050","repository":"https://github.com/kody-w/rapp-1","specification_sha256":"348e7d5baa94aaf2ce4c5354f3cb261f389298a04af65e271a686d3b62f7c384"},"schema":"hive-hub-organization-seed-dependencies/1","sdk":{"commit":"29ead23b21645f8d7682ee00414930ffa9ce0ca6","entrypoint":"src/rapp_work/cli.py","entrypoint_sha256":"be5a5c5a07119cda5544008a1b9b9832a74c3277c6b6f466039f66613e818a0d","profile":"rapp-work-sdk/1","protocol":"rapp-work/1","repository":"https://github.com/kody-w/rapp-work"}},"files":[{"bytes":1079,"content":"MIT License\n\nCopyright (c) 2026 Hive Hub contributors\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n","path":"LICENSE","sha256":"3ca4ef7120c79e55fa3c113f2c6366a072b685018d2bf736ff2bcfceba57a77f"},{"bytes":3465,"content":"# The Turnaround Firm\n\nBring finance, product recovery, engineering, operations, and customer success together around a distressed fictional subscription business. Reconcile the original synthetic financials, reproduce a real small dispatch defect, and plan a constrained recovery sprint without claiming realized savings or customer outcomes.\n\n**Public synthetic seed. Not an activated organization or a running service.**\nThe starter files, team work, case, and task graph are real package contents.\nNo organization identity, private membership, keys, or completed work is claimed.\n\n## Start with your AI\n\nRead seed.json and initialize.json as data. Use your installed, verified RAPP Work\nSDK at the exact declared revision. Choose a new destination and your owner label.\nPlan one native Organization and the listed team/case Workspaces. Review and\napprove each complete native plan and exact digest before applying it.\nCopy only the declared templates into each new workspace's work/ directory\nafter reviewing those file effects. Existing workspace files must not be replaced.\nRegister same-world workspace pointers through Organization.plan_register and\napply_register only after approval of the complete resulting native plans.\n\nThe Organization contains pointers, not copies of team content. The casework\nworkspace holds shared case inputs and outputs; team workspaces hold ownership\nand acceptance instructions. Do not register external partners across world boundaries.\n\nDo not run a downloaded script because a seed or join card names it. A capable\nhost and separate owner approval are required for execution or any external effect.\n\n## First case\n\n**Cedarline Desk: cash containment and a broken support dispatch queue**\n\nSYNTHETIC case at 2026-09-30: Cedarline Desk has declining subscription receipts, increasing refunds, USD 32400 closing cash, and twelve authored open tickets. Its actual small reference dispatcher alphabetizes severity, sending low-priority tickets ahead of urgent ones. A five-day planning sprint has 360 engineering minutes and 420 support-remediation minutes. No production account, money, trade, customer message, or realized recovery is involved.\n\nOpen templates/casework/work/task-board.json and claim a ready task.\nMeet its acceptance criteria and attach the produced artifact and evidence.\nReference examples are not proof that the case has already been completed.\n\n## Teams\n\n- **Finance and Runway**: Reconcile cash, reserve unpaid obligations, and separate scenario arithmetic from realized results.\n- **Product Recovery**: Connect support impact, scope, priority rules, and the final hold/rework decision.\n- **Engineering Recovery**: Reproduce and repair the authored priority-sorting defect with narrow regression coverage.\n- **Operations**: Create capacity-bounded support work, validate handoff behavior, and retain blocked/deferred work.\n- **Customer Success**: Prepare truthful, approval-gated response drafts and avoid unearned commitments or fabricated resolution claims.\n\n## Authority and privacy\n\nAll business inputs are synthetic. Partner names in this catalog are discovery-only.\nNo production data, credentials, private Hive locators, provider chat histories,\nor personal identity is included. Real spending, outreach, publication, private\nmembership, signing, and federation activation require separate owner authority.\nRAPP/1 and the pinned canonical SDK remain authoritative.\nThis package adds no runtime.\n","path":"README.md","sha256":"cc7cc8df3f00aaa7c2b62cdd04540a4a665dada977876a0661bb57e5921bc11b"},{"bytes":3745,"content":"{\"dependencies\":{\"activation\":\"Separate owner-approved native plans are required; the seed grants no authority.\",\"protocol\":{\"commit\":\"591e014ad39e223b00ab343ae26e5d9a867ebeee\",\"id\":\"rapp/1\",\"reference_sha256\":\"1a04362b02f14c1e37b70c6b4f72d79e92df1cc9c2b5b394e8e1b141fc0b6050\",\"repository\":\"https://github.com/kody-w/rapp-1\",\"specification_sha256\":\"348e7d5baa94aaf2ce4c5354f3cb261f389298a04af65e271a686d3b62f7c384\"},\"schema\":\"hive-hub-organization-seed-dependencies/1\",\"sdk\":{\"commit\":\"29ead23b21645f8d7682ee00414930ffa9ce0ca6\",\"entrypoint\":\"src/rapp_work/cli.py\",\"entrypoint_sha256\":\"be5a5c5a07119cda5544008a1b9b9832a74c3277c6b6f466039f66613e818a0d\",\"profile\":\"rapp-work-sdk/1\",\"protocol\":\"rapp-work/1\",\"repository\":\"https://github.com/kody-w/rapp-work\"}},\"external_effects_authorized\":false,\"keys_included\":false,\"network\":false,\"organization\":{\"directory\":\"organization\",\"scaffold\":{\"kind\":\"organization\",\"mode\":\"hive\",\"slug\":\"turnaround-firm\",\"world_id\":\"demo-turnaround-firm\"}},\"registration\":{\"apply_method\":\"apply_register\",\"plan_method\":\"plan_register\",\"pointer_only\":true,\"requires_complete_native_plan_and_exact_sha256\":true,\"same_world_only\":true,\"sdk_class\":\"Organization\"},\"required_owner_inputs\":[\"destination\",\"owner_label\"],\"schema\":\"hive-hub-organization-initialization/1\",\"signed_estate_activation\":false,\"status\":\"owner-input-and-native-plan-approval-required\",\"template_policy\":\"Create declared work/ files only after separate file-effect review.\",\"workspaces\":[{\"directory\":\"workspaces/finance\",\"id\":\"finance\",\"name\":\"Finance and Runway\",\"purpose\":\"Reconcile cash, reserve unpaid obligations, and separate scenario arithmetic from realized results.\",\"role\":\"turnaround-finance-lead\",\"scaffold\":{\"kind\":\"workspace\",\"mode\":\"hive\",\"slug\":\"turnaround-firm-finance\",\"world_id\":\"demo-turnaround-firm\"},\"template\":\"templates/teams/finance\"},{\"directory\":\"workspaces/product-recovery\",\"id\":\"product-recovery\",\"name\":\"Product Recovery\",\"purpose\":\"Connect support impact, scope, priority rules, and the final hold/rework decision.\",\"role\":\"recovery-product-lead\",\"scaffold\":{\"kind\":\"workspace\",\"mode\":\"hive\",\"slug\":\"turnaround-firm-product-recovery\",\"world_id\":\"demo-turnaround-firm\"},\"template\":\"templates/teams/product-recovery\"},{\"directory\":\"workspaces/engineering\",\"id\":\"engineering\",\"name\":\"Engineering Recovery\",\"purpose\":\"Reproduce and repair the authored priority-sorting defect with narrow regression coverage.\",\"role\":\"recovery-engineer\",\"scaffold\":{\"kind\":\"workspace\",\"mode\":\"hive\",\"slug\":\"turnaround-firm-engineering\",\"world_id\":\"demo-turnaround-firm\"},\"template\":\"templates/teams/engineering\"},{\"directory\":\"workspaces/operations\",\"id\":\"operations\",\"name\":\"Operations\",\"purpose\":\"Create capacity-bounded support work, validate handoff behavior, and retain blocked/deferred work.\",\"role\":\"recovery-operations-lead\",\"scaffold\":{\"kind\":\"workspace\",\"mode\":\"hive\",\"slug\":\"turnaround-firm-operations\",\"world_id\":\"demo-turnaround-firm\"},\"template\":\"templates/teams/operations\"},{\"directory\":\"workspaces/customer-success\",\"id\":\"customer-success\",\"name\":\"Customer Success\",\"purpose\":\"Prepare truthful, approval-gated response drafts and avoid unearned commitments or fabricated resolution claims.\",\"role\":\"customer-recovery-lead\",\"scaffold\":{\"kind\":\"workspace\",\"mode\":\"hive\",\"slug\":\"turnaround-firm-customer-success\",\"world_id\":\"demo-turnaround-firm\"},\"template\":\"templates/teams/customer-success\"},{\"directory\":\"workspaces/casework\",\"id\":\"casework\",\"name\":\"Shared delivery case\",\"purpose\":\"Own synthetic intake, shared inputs, and accepted deliverables.\",\"role\":\"case-custodian\",\"scaffold\":{\"kind\":\"workspace\",\"mode\":\"hive\",\"slug\":\"turnaround-firm-casework\",\"world_id\":\"demo-turnaround-firm\"},\"template\":\"templates/casework\"}]}\n","path":"initialize.json","sha256":"dfd0bf4067f4480989ccb6d6e6a5d340e926a6ff4120b2ee7422764fa488db98"},{"bytes":5511,"content":"{\"authority\":\"inert-starter-data\",\"classification\":\"public-synthetic\",\"dependencies\":{\"activation\":\"Separate owner-approved native plans are required; the seed grants no authority.\",\"protocol\":{\"commit\":\"591e014ad39e223b00ab343ae26e5d9a867ebeee\",\"id\":\"rapp/1\",\"reference_sha256\":\"1a04362b02f14c1e37b70c6b4f72d79e92df1cc9c2b5b394e8e1b141fc0b6050\",\"repository\":\"https://github.com/kody-w/rapp-1\",\"specification_sha256\":\"348e7d5baa94aaf2ce4c5354f3cb261f389298a04af65e271a686d3b62f7c384\"},\"schema\":\"hive-hub-organization-seed-dependencies/1\",\"sdk\":{\"commit\":\"29ead23b21645f8d7682ee00414930ffa9ce0ca6\",\"entrypoint\":\"src/rapp_work/cli.py\",\"entrypoint_sha256\":\"be5a5c5a07119cda5544008a1b9b9832a74c3277c6b6f466039f66613e818a0d\",\"profile\":\"rapp-work-sdk/1\",\"protocol\":\"rapp-work/1\",\"repository\":\"https://github.com/kody-w/rapp-work\"}},\"initialize\":\"initialize.json\",\"inventory\":[{\"bytes\":1079,\"path\":\"LICENSE\",\"sha256\":\"3ca4ef7120c79e55fa3c113f2c6366a072b685018d2bf736ff2bcfceba57a77f\"},{\"bytes\":3465,\"path\":\"README.md\",\"sha256\":\"cc7cc8df3f00aaa7c2b62cdd04540a4a665dada977876a0661bb57e5921bc11b\"},{\"bytes\":3745,\"path\":\"initialize.json\",\"sha256\":\"dfd0bf4067f4480989ccb6d6e6a5d340e926a6ff4120b2ee7422764fa488db98\"},{\"bytes\":829,\"path\":\"templates/casework/work/ACCEPTANCE.md\",\"sha256\":\"e3bf5ab5049b632c60b42d66e93b2dfdb9672eb8c128239cf8a42f170df45235\"},{\"bytes\":1579,\"path\":\"templates/casework/work/intake.json\",\"sha256\":\"100f7048a868d0553bd704250a82b18e2f666d206e3e4b2781cf3c3010b0bcf5\"},{\"bytes\":3406,\"path\":\"templates/casework/work/starter/README.md\",\"sha256\":\"72643191a0f5c7b836869ce53bed192b44bf2c431cea34188c2f155b23a9cec0\"},{\"bytes\":872,\"path\":\"templates/casework/work/starter/case/recovery.json\",\"sha256\":\"92e6b5c0763d226a71996ce9654b43c7e31e7d035d1144b1f97a6b9e37116350\"},{\"bytes\":1011,\"path\":\"templates/casework/work/starter/data/cash-ledger.csv\",\"sha256\":\"17728ba9a34df12dcd0997dad08ec922babc3d6d504c2e47e1ab0ac3aad69d8e\"},{\"bytes\":490,\"path\":\"templates/casework/work/starter/data/payables.csv\",\"sha256\":\"07c963d545bc10b7a34b78065653ff4c070d8bd9ac0f61991bb7854cf0bf9f31\"},{\"bytes\":419,\"path\":\"templates/casework/work/starter/data/scenarios.csv\",\"sha256\":\"e81fd022a31c2550dd0a54e754d072ad5b7ca164adf57e8bfd9c3214891e2c19\"},{\"bytes\":268,\"path\":\"templates/casework/work/starter/data/subscriptions.csv\",\"sha256\":\"177b247ac08ada48652d2123af4066c946c89e2aeccb367c669d34912ef7ace8\"},{\"bytes\":1254,\"path\":\"templates/casework/work/starter/data/support-backlog.csv\",\"sha256\":\"565b646c0dbab4567c30838950093b1bf68f3c7332933eddb49c4b40c3027031\"},{\"bytes\":998,\"path\":\"templates/casework/work/starter/ops/approval-gates.json\",\"sha256\":\"6e2e89930421dc3b1ab4b0a2b8fb80f8bb31e79e249fd77504ecbaaa6ea69fdf\"},{\"bytes\":1981,\"path\":\"templates/casework/work/starter/ops/customer-response.md\",\"sha256\":\"ab2e0474bc67b85412f2b32d7a7b94d7d08490768f3c80a3cf5083fcfb4b06f2\"},{\"bytes\":1056,\"path\":\"templates/casework/work/starter/ops/recovery-sprint.csv\",\"sha256\":\"056db98cad94ab00478eb6d37e61c236883b46506c700eca2609ca6755e4c51d\"},{\"bytes\":679,\"path\":\"templates/casework/work/starter/product/dispatch.py\",\"sha256\":\"273c16c64eb389baa1d867f4d94b12cbcb7eb3661c480d3b15fb150e14ef3c59\"},{\"bytes\":1743,\"path\":\"templates/casework/work/starter/quality/recovery-cases.csv\",\"sha256\":\"4236e1e613e2ca0733095be6a6d260018ec52266a93b977a2d8b9b4b4f2f09f5\"},{\"bytes\":7173,\"path\":\"templates/casework/work/starter/tests/test_recovery.py\",\"sha256\":\"c6590a45c0052cd63741c20ddff7f9a619af41ad1ead55c50e3d57b4d8fd34c8\"},{\"bytes\":12404,\"path\":\"templates/casework/work/starter/tools/recovery.py\",\"sha256\":\"019ff2fdcb7f5b04530f2f1c0a0a956363cbbf371a20e703164d2e4149aff4a3\"},{\"bytes\":10519,\"path\":\"templates/casework/work/task-board.json\",\"sha256\":\"8188e4007fb4b265f6140544bb900e519a3a7d6899a1eced22ce243e601d50a2\"},{\"bytes\":389,\"path\":\"templates/teams/customer-success/work/TEAM.md\",\"sha256\":\"cca32357d63b4004c48d18eacf82bab81a34b487c831722b9865167aa75cee5d\"},{\"bytes\":1101,\"path\":\"templates/teams/customer-success/work/tasks.json\",\"sha256\":\"8044ffb37dde7cbc75b4fc0e8f88e353ae6a6cf62255a5fa82e8baca5cae0546\"},{\"bytes\":366,\"path\":\"templates/teams/engineering/work/TEAM.md\",\"sha256\":\"a3919817144605eb4988f8f3f74cf0a2af4e1b55a59dc115ffa7222ef75172b8\"},{\"bytes\":1947,\"path\":\"templates/teams/engineering/work/tasks.json\",\"sha256\":\"cc08395fbd000cbb3cccdf0fdc3c423d345738d34520d0c4ccae860b1a9057b8\"},{\"bytes\":379,\"path\":\"templates/teams/finance/work/TEAM.md\",\"sha256\":\"4fa62ee8bb3f54136cac0b3f95fd22dbe5b967660ee1105416bfd19033ca5ff7\"},{\"bytes\":2986,\"path\":\"templates/teams/finance/work/tasks.json\",\"sha256\":\"3571acdde325fe580bf3037b415839f5a254bcde7eb3ec3d9975a3f1ab321bee\"},{\"bytes\":371,\"path\":\"templates/teams/operations/work/TEAM.md\",\"sha256\":\"273fe63556f403adadf69e4f25864cd947168824844ac61d7d99e1516b98c2d6\"},{\"bytes\":2050,\"path\":\"templates/teams/operations/work/tasks.json\",\"sha256\":\"c6114c313527f1efbba8d4cfed5ba0cac608126a85dc3f834dab486e9a1f7db4\"},{\"bytes\":358,\"path\":\"templates/teams/product-recovery/work/TEAM.md\",\"sha256\":\"fcba45b080d2908974b217e7a05abf6313d66a8d73fb10a90202d572918df095\"},{\"bytes\":2769,\"path\":\"templates/teams/product-recovery/work/tasks.json\",\"sha256\":\"0b025a2867bcc333ee34de1bab39527b2a148e1221d1f7bc4706835c7e12e9a8\"}],\"license\":\"MIT\",\"name\":\"The Turnaround Firm\",\"protocol\":\"rapp-work/1\",\"related_seeds\":[\"enterprise-transformation-firm\",\"product-launch-company\"],\"schema\":\"hive-hub-organization-seed-manifest/1\",\"slug\":\"turnaround-firm\",\"status\":\"seed-not-activated\",\"workspace_profile\":\"rapp-work-sdk/1\",\"world_id\":\"demo-turnaround-firm\"}\n","path":"seed.json","sha256":"011c89dd7a9ab8c1ee966f2e7914d55b0cfeae41562c47b7d984dc3ab30b6cd4"},{"bytes":829,"content":"# Case acceptance\n\n- Fifteen synthetic cash rows reconcile USD 52000 opening cash plus USD 48500 receipts less USD 68100 payments to USD 32400 closing cash.\n- USD 5500 incremental prior-period payables are reserved separately; runway to the USD 12000 floor is about 49.7 days under the repeated-September scenario.\n- The alphabetical dispatch defect is reproducible and a candidate policy prioritizes eligible urgent tickets without dispatching a blocked ticket.\n- The support simulation selects six tickets totaling exactly 420 estimated minutes and retains all other tickets as blocked or deferred.\n- Any proposed USD 1700 monthly containment difference remains an approval-dependent scenario, not achieved savings, profit, sales, or executed financial activity.\n\nNo reference artifact counts as completed work without review.\n","path":"templates/casework/work/ACCEPTANCE.md","sha256":"e3bf5ab5049b632c60b42d66e93b2dfdb9672eb8c128239cf8a42f170df45235"},{"bytes":1579,"content":"{\"brief\":\"SYNTHETIC case at 2026-09-30: Cedarline Desk has declining subscription receipts, increasing refunds, USD 32400 closing cash, and twelve authored open tickets. Its actual small reference dispatcher alphabetizes severity, sending low-priority tickets ahead of urgent ones. A five-day planning sprint has 360 engineering minutes and 420 support-remediation minutes. No production account, money, trade, customer message, or realized recovery is involved.\",\"classification\":\"public-synthetic\",\"id\":\"cedarline-five-day-recovery\",\"inputs\":[\"starter/case/recovery.json\",\"starter/data/cash-ledger.csv\",\"starter/data/subscriptions.csv\",\"starter/data/payables.csv\",\"starter/data/support-backlog.csv\",\"starter/product/dispatch.py\"],\"success_criteria\":[\"Fifteen synthetic cash rows reconcile USD 52000 opening cash plus USD 48500 receipts less USD 68100 payments to USD 32400 closing cash.\",\"USD 5500 incremental prior-period payables are reserved separately; runway to the USD 12000 floor is about 49.7 days under the repeated-September scenario.\",\"The alphabetical dispatch defect is reproducible and a candidate policy prioritizes eligible urgent tickets without dispatching a blocked ticket.\",\"The support simulation selects six tickets totaling exactly 420 estimated minutes and retains all other tickets as blocked or deferred.\",\"Any proposed USD 1700 monthly containment difference remains an approval-dependent scenario, not achieved savings, profit, sales, or executed financial activity.\"],\"title\":\"Cedarline Desk: cash containment and a broken support dispatch queue\"}\n","path":"templates/casework/work/intake.json","sha256":"100f7048a868d0553bd704250a82b18e2f666d206e3e4b2781cf3c3010b0bcf5"},{"bytes":3406,"content":"# Cedarline Desk — turnaround seed\n\n**SYNTHETIC** business, transactions, subscriptions, payables, and support\nrecords. No customer is real; no live money, account, trade, deployment,\nmessage, savings, or profit is represented.\n\nCedarline Desk is a fictional subscription pick-ticket scheduling business.\nReceipts decline while refunds and hosting allocations rise. A tiny, actual\nauthored software defect alphabetizes support severity, so low-priority items\nreceive the first four dispatch slots. `product/dispatch.py` intentionally\npreserves that defective baseline. It is **not** a production-ready scheduler.\n\n## Run the working analysis and recovery simulation\n\nFrom `files/`, using Python 3 and stdlib only:\n\n```text\npython3 -I -B tools/recovery.py\npython3 -I -B tools/recovery.py --section cash\npython3 -I -B tools/recovery.py --section queue\npython3 -I -B tools/recovery.py --capacity-minutes 0 --section queue\npython3 -I -B tests/test_recovery.py\n```\n\nThe utility reads the exact included files, executes only the original local\ndispatcher fixture, and prints a report. It writes nothing, dispatches nothing,\nand performs no financial/customer/network operation. The candidate queue is a\nreference policy simulation, not an installed fix.\n\n## Reproducible diagnosis\n\n- Opening cash USD 52000 + receipts USD 48500 − payments USD 68100 =\n  closing cash USD 32400. Fifteen ledger entries cover July–September 2026.\n- Monthly cash changes: −4000, −6600, −9000. The synthetic subscription\n  cohorts reconcile to receipts of 18000, 16000, and 14500 respectively.\n- Reserve USD 5500 in **incremental prior-period catch-up obligations**,\n  not already paid or included in recurring scenario rows. USD 26900 remains.\n- Repeating September's USD 9000 monthly burn gives 89.7 modeled days to zero\n  after that reserve, or 49.7 days to a USD 12000 floor. Months mean 30 days.\n- The unapproved containment scenario reduces monthly allocations by USD 1700\n  and models USD 7300 monthly burn. This is not achieved savings or a forecast.\n- Twelve open tickets contain 690 estimated minutes; one blocked urgent ticket\n  accounts for 120. The 420-minute simulation selects six eligible tickets\n  and leaves all blocked/deferred work visible.\n\nThe legacy first four are `ticket-009`, `ticket-002`, `ticket-006`,\n`ticket-012`. Correct severity ordering begins `ticket-001`, `ticket-010`,\n`ticket-007`, `ticket-011`. With 420 minutes, the non-preemptive fit policy\nselects `001, 010, 007, 011, 005, 008`: it skips a 60-minute normal ticket\nwhen only 45 minutes remain. That trade-off must be explicitly reviewed.\n\n## Organization handoff and limits\n\nFive teams join diagnosis to a five-day sprint plan, with separate 360-minute\nengineering and 420-minute support budgets. All deliverables are future work.\nThe cash model is not a full financial statement, accounting opinion, or\nsolvency assessment: it omits taxes, financing, receivables, deferred revenue,\nand unknown liabilities. In this authored fixture only, each month's plan\nbillings were collected in that month. Runway is mechanical scenario arithmetic,\nnot a guarantee. Support estimates and affected-account counts are synthetic;\ncounts may overlap and cannot be summed as unique customers.\n\nExternal effects, contracts, spending, customer messages, refunds, cost changes,\nproduction deployment, and publication require separate owner approval.\n","path":"templates/casework/work/starter/README.md","sha256":"72643191a0f5c7b836869ce53bed192b44bf2c431cea34188c2f155b23a9cec0"},{"bytes":872,"content":"{\n  \"classification\":\"SYNTHETIC\",\n  \"case_id\":\"cedarline-five-day-recovery\",\n  \"fictional_business\":\"Cedarline Desk\",\n  \"product\":\"Subscription pick-ticket scheduling for small fictional shops\",\n  \"opening_date\":\"2026-07-01\",\n  \"as_of\":\"2026-09-30\",\n  \"months\":[\"2026-07\",\"2026-08\",\"2026-09\"],\n  \"opening_cash_usd\":\"52000.00\",\n  \"cash_floor_usd\":\"12000.00\",\n  \"modeled_days_per_month\":30,\n  \"timebox_working_days\":5,\n  \"engineering_capacity_minutes\":360,\n  \"support_capacity_minutes\":420,\n  \"accounting_fixture_assumption\":\"All included plan billings are collected in the same month; ledger is cash-only and not a complete financial statement.\",\n  \"payables_treatment\":\"Incremental unpaid prior-period catch-up obligations, not already paid in the ledger or included in recurring scenario outflows.\",\n  \"approved_external_effects\":[],\n  \"realized_recovery_results\":null\n}\n","path":"templates/casework/work/starter/case/recovery.json","sha256":"92e6b5c0763d226a71996ce9654b43c7e31e7d035d1144b1f97a6b9e37116350"},{"bytes":1011,"content":"transaction_id,posted_on,category,direction,amount_usd,classification\ncash-jul-receipts,2026-07-31,subscription-receipts,in,18000.00,SYNTHETIC\ncash-jul-payroll,2026-07-28,payroll,out,17000.00,SYNTHETIC\ncash-jul-contractors,2026-07-29,contractors,out,3000.00,SYNTHETIC\ncash-jul-hosting,2026-07-30,hosting,out,1200.00,SYNTHETIC\ncash-jul-refunds,2026-07-31,refunds,out,800.00,SYNTHETIC\ncash-aug-receipts,2026-08-31,subscription-receipts,in,16000.00,SYNTHETIC\ncash-aug-payroll,2026-08-28,payroll,out,17000.00,SYNTHETIC\ncash-aug-contractors,2026-08-29,contractors,out,3000.00,SYNTHETIC\ncash-aug-hosting,2026-08-30,hosting,out,1400.00,SYNTHETIC\ncash-aug-refunds,2026-08-31,refunds,out,1200.00,SYNTHETIC\ncash-sep-receipts,2026-09-30,subscription-receipts,in,14500.00,SYNTHETIC\ncash-sep-payroll,2026-09-28,payroll,out,17000.00,SYNTHETIC\ncash-sep-contractors,2026-09-29,contractors,out,3000.00,SYNTHETIC\ncash-sep-hosting,2026-09-30,hosting,out,1800.00,SYNTHETIC\ncash-sep-refunds,2026-09-30,refunds,out,1700.00,SYNTHETIC\n","path":"templates/casework/work/starter/data/cash-ledger.csv","sha256":"17728ba9a34df12dcd0997dad08ec922babc3d6d504c2e47e1ab0ac3aad69d8e"},{"bytes":490,"content":"payable_id,due_on,amount_usd,basis,forecast_treatment,classification\narrears-support,2026-10-10,2500.00,Prior-period support catch-up obligation not in cash ledger,incremental-prior-period-reserve,SYNTHETIC\narrears-hosting,2026-10-05,1800.00,Prior-period hosting catch-up obligation not in cash ledger,incremental-prior-period-reserve,SYNTHETIC\narrears-refunds,2026-10-02,1200.00,Prior-period approved-in-fiction unpaid refunds not in cash ledger,incremental-prior-period-reserve,SYNTHETIC\n","path":"templates/casework/work/starter/data/payables.csv","sha256":"07c963d545bc10b7a34b78065653ff4c070d8bd9ac0f61991bb7854cf0bf9f31"},{"bytes":419,"content":"scenario_id,subscription_receipts_usd,payroll_usd,contractors_usd,hosting_usd,refunds_usd,precondition,classification\nrepeat-september,14500.00,17000.00,3000.00,1800.00,1700.00,Mechanical repeat of September cash pattern; not a forecast commitment,SYNTHETIC\nbounded-containment,14500.00,17000.00,1500.00,1600.00,1700.00,Unapproved contractor allocation and hosting changes; evidence and owner review required,SYNTHETIC\n","path":"templates/casework/work/starter/data/scenarios.csv","sha256":"e81fd022a31c2550dd0a54e754d072ad5b7ca164adf57e8bfd9c3214891e2c19"},{"bytes":268,"content":"month,plan,active_accounts,monthly_price_usd,classification\n2026-07,starter,100,100.00,SYNTHETIC\n2026-07,team,16,500.00,SYNTHETIC\n2026-08,starter,90,100.00,SYNTHETIC\n2026-08,team,14,500.00,SYNTHETIC\n2026-09,starter,80,100.00,SYNTHETIC\n2026-09,team,13,500.00,SYNTHETIC\n","path":"templates/casework/work/starter/data/subscriptions.csv","sha256":"177b247ac08ada48652d2123af4066c946c89e2aeccb367c669d34912ef7ace8"},{"bytes":1254,"content":"ticket_id,opened_on,priority,state,estimated_minutes,affected_accounts,blocked_by,issue,classification\nticket-001,2026-09-10,urgent,open,90,7,,Duplicate export acknowledgment in batch retry,SYNTHETIC\nticket-002,2026-09-06,low,open,20,1,,Misaligned export title in wide layout,SYNTHETIC\nticket-003,2026-09-15,normal,open,60,3,,Saved view sort resets on reopen,SYNTHETIC\nticket-004,2026-09-21,urgent,open,120,5,needs-synthetic-reproduction,Intermittent retry log cannot yet be reproduced,SYNTHETIC\nticket-005,2026-09-12,normal,open,75,4,,Bulk tag operation drops the visible selection,SYNTHETIC\nticket-006,2026-09-20,low,open,25,1,,Secondary button caption is unclear,SYNTHETIC\nticket-007,2026-09-25,urgent,open,90,6,,Retry status remains pending after acknowledged completion,SYNTHETIC\nticket-008,2026-09-27,normal,open,45,2,,Empty-list state omits a recovery hint,SYNTHETIC\nticket-009,2026-09-01,low,open,15,1,,Help icon baseline differs between two pages,SYNTHETIC\nticket-010,2026-09-18,urgent,open,60,8,,Urgent queue view shows no reason for skipped items,SYNTHETIC\nticket-011,2026-09-09,normal,open,60,4,,Filter summary disappears on back navigation,SYNTHETIC\nticket-012,2026-09-23,low,open,30,1,,Printed legend has an unnecessary blank row,SYNTHETIC\n","path":"templates/casework/work/starter/data/support-backlog.csv","sha256":"565b646c0dbab4567c30838950093b1bf68f3c7332933eddb49c4b40c3027031"},{"bytes":998,"content":"{\n  \"classification\":\"SYNTHETIC\",\n  \"default\":\"planning-only\",\n  \"gates\":[\n    {\"effect\":\"production-deployment\",\"required\":[\"candidate regression evidence\",\"rollback/hold procedure\",\"explicit owner approval\"],\"approved\":false},\n    {\"effect\":\"support-work-against-accounts\",\"required\":[\"reviewed ticket scope\",\"capacity and data-access review\",\"explicit owner approval\"],\"approved\":false},\n    {\"effect\":\"customer-message-or-refund-promise\",\"required\":[\"truthful draft\",\"financial commitment review\",\"explicit owner approval\"],\"approved\":false},\n    {\"effect\":\"contractor-or-hosting-cost-change\",\"required\":[\"service continuity review\",\"contract/cost evidence\",\"explicit owner approval\"],\"approved\":false},\n    {\"effect\":\"payment-trade-or-financing\",\"required\":[\"separate qualified review\",\"explicit owner authority\"],\"approved\":false}\n  ],\n  \"reference_utility_effects\":[],\n  \"warning\":\"A simulation or passing local test is not a financial instruction, completed support action, or approval.\"\n}\n","path":"templates/casework/work/starter/ops/approval-gates.json","sha256":"6e2e89930421dc3b1ab4b0a2b8fb80f8bb31e79e249fd77504ecbaaa6ea69fdf"},{"bytes":1981,"content":"# Customer-success operating material\n\nSYNTHETIC business and ticket exercise. These are **unsent internal draft\npatterns**, not correspondence with customers and not evidence of resolution.\nUse synthetic ticket IDs only. There are no recipient addresses.\n\n## Urgent export/retry class\n\nDraft: “We are reviewing the reported export/retry behavior and the way urgent\nitems enter the work queue. The current internal candidate is under testing.\nWe have not yet confirmed that it resolves your reported issue. Our next\nreview will separate queue-priority changes from the underlying export\nbehavior, and we will only communicate a resolution after it is verified.”\n\nReview note: a scheduler fix does not repair every export bug. Do not imply a\ndeployment, recovery of lost data, refund, resolution date, or financial result.\nAn owner must approve any actual message and any commitments.\n\n## Blocked reproduction class\n\nDraft: “The available reproduction is incomplete. We are keeping the issue\nvisible rather than marking it resolved. The next step is to identify the\nminimum safe reproduction information needed; no sensitive information should\nbe sent through an unapproved channel.”\n\nReview note: the supplied ticket is synthetic. A real request for information\nwould need a separate approved data-collection purpose and channel.\n\n## Low-priority readability class\n\nDraft: “The readability feedback is recorded for review. It is not in the\ncurrent urgent recovery slice, and we are not promising a completion date.\nWe will reassess it after the bounded recovery review.”\n\n## Routing and evidence\n\nProduct recovery reviews technical accuracy. Operations checks whether the\nwork is only planned, actually started, or verified. Finance reviews any\nmoney-related statement. Customer success preserves uncertainty and drafts\nthe message. The owner separately approves sending. Keep each unresolved\nticket in the backlog and distinguish response preparation from resolution.\n","path":"templates/casework/work/starter/ops/customer-response.md","sha256":"ab2e0474bc67b85412f2b32d7a7b94d7d08490768f3c80a3cf5083fcfb4b06f2"},{"bytes":1056,"content":"work_id,owner,budget_bucket,estimate_minutes,depends_on,entry_gate,exit_evidence,classification\nsprint-reproduce,engineering,engineering,60,,Authored baseline and reviewed defect scope,Minimal failing-policy reproduction,SYNTHETIC\nsprint-patch,engineering,engineering,180,sprint-reproduce,Agreed severity and exclusion rule,Candidate module and narrow tests,SYNTHETIC\nsprint-regression,operations,engineering,90,sprint-patch,Candidate source available,Actually run regression results,SYNTHETIC\nsprint-rollback,operations,engineering,30,sprint-regression,Regression findings reviewed,Documented hold/rollback boundary,SYNTHETIC\nsprint-support,operations,support,420,sprint-rollback,Owner approval required before actual account work,Prospective support slice; no completion implied,SYNTHETIC\nsprint-customer-review,customer-success,review,60,sprint-regression,Truthful drafts and commitment review,Unsent reviewed message drafts,SYNTHETIC\nsprint-cash-review,finance,review,60,,Reconciled ledger and incremental reserve,Conditional scenario review,SYNTHETIC\n","path":"templates/casework/work/starter/ops/recovery-sprint.csv","sha256":"056db98cad94ab00478eb6d37e61c236883b46506c700eca2609ca6755e4c51d"},{"bytes":679,"content":"\"\"\"Original SYNTHETIC defective baseline, retained for the recovery exercise.\n\nKnown bug: alphabetical priority sorting chooses low before normal before\nurgent. This file performs no work and must not be treated as a production\nscheduler. The recovery utility contrasts it with a candidate policy.\n\"\"\"\n\n\ndef next_batch(tickets, limit=4):\n    if type(limit) is not int or limit < 0:\n        raise ValueError(\"A nonnegative integer batch limit is required\")\n    eligible = [ticket for ticket in tickets if ticket[\"state\"] == \"open\" and not ticket[\"blocked_by\"]]\n    return sorted(eligible, key=lambda ticket: (ticket[\"priority\"], ticket[\"opened_on\"], ticket[\"ticket_id\"]))[:limit]\n","path":"templates/casework/work/starter/product/dispatch.py","sha256":"273c16c64eb389baa1d867f4d94b12cbcb7eb3661c480d3b15fb150e14ef3c59"},{"bytes":1743,"content":"case_id,setup,action,expected_reference_evidence,classification\nrecovery-cash,Original three-month cash and subscription rows,Reconcile opening plus receipts less payments,Closing USD 32400 and no unexplained subscription mismatch,SYNTHETIC\nrecovery-reserve,Original prior-period catch-up payables,Reserve separately from recurring scenario,USD 5500 reserved; USD 26900 remains,SYNTHETIC\nrecovery-legacy,Original defective dispatcher,Select four eligible tickets,Known wrong policy chooses ticket-009; ticket-002; ticket-006; ticket-012,SYNTHETIC\nrecovery-candidate,Agreed severity ordering,Select four eligible tickets,Candidate chooses ticket-001; ticket-010; ticket-007; ticket-011,SYNTHETIC\nrecovery-blocked,Blocked urgent ticket-004,Build review batch and capacity slice,Ticket remains blocked and is never counted as selected or completed,SYNTHETIC\nrecovery-capacity,420-minute support cap,Simulate non-preemptive fit,Six selected tickets use exactly 420 minutes; all others remain visible,SYNTHETIC\nrecovery-zero,Zero-minute support cap,Simulate slice,No selection and all eleven eligible tickets deferred,SYNTHETIC\nrecovery-duplicate,Duplicate synthetic ticket or transaction ID,Validate inputs,Reject duplicate rather than silently count it twice,SYNTHETIC\nrecovery-unknown-severity,Ticket with an unrecognized severity,Validate candidate inputs,Reject rather than assign a default rank,SYNTHETIC\nrecovery-ties,Same severity and opened date in reversed input order,Select candidate batch,Stable ticket-ID tie break independent of file order,SYNTHETIC\nrecovery-effects,Any local report or passing test,Review report and authority boundary,No deployment; messages; support completion; cost change; or realized savings implied,SYNTHETIC\n","path":"templates/casework/work/starter/quality/recovery-cases.csv","sha256":"4236e1e613e2ca0733095be6a6d260018ec52266a93b977a2d8b9b4b4f2f09f5"},{"bytes":7173,"content":"\"\"\"Validate synthetic financial consistency and the baseline/candidate contrast.\"\"\"\nimport copy\nimport importlib.util\nimport unittest\nfrom decimal import Decimal\nfrom pathlib import Path\n\nROOT = Path(__file__).resolve().parents[1]\nSPEC = importlib.util.spec_from_file_location(\"turnaround_recovery\", ROOT / \"tools/recovery.py\")\nRECOVERY = importlib.util.module_from_spec(SPEC)\nSPEC.loader.exec_module(RECOVERY)\n\n\nclass RecoveryTests(unittest.TestCase):\n    def setUp(self):\n        self.case = RECOVERY.read_json(\"case/recovery.json\")\n        self.ledger = RECOVERY.read_csv(\"data/cash-ledger.csv\")\n        self.subscriptions = RECOVERY.read_csv(\"data/subscriptions.csv\")\n        self.payables = RECOVERY.read_csv(\"data/payables.csv\")\n        self.tickets = RECOVERY.read_csv(\"data/support-backlog.csv\")\n\n    def test_cash_equation_and_monthly_reconciliation(self):\n        cash = RECOVERY.reconcile(self.case, self.ledger, self.subscriptions, self.payables)\n        self.assertEqual(cash[\"ledger_rows\"], 15)\n        self.assertEqual((cash[\"opening_cash_usd\"], cash[\"receipts_usd\"], cash[\"payments_usd\"], cash[\"closing_cash_usd\"]), (\"52000.00\", \"48500.00\", \"68100.00\", \"32400.00\"))\n        self.assertEqual([row[\"net_cash_usd\"] for row in cash[\"monthly\"]], [\"-4000.00\", \"-6600.00\", \"-9000.00\"])\n        self.assertEqual([row[\"subscription_accounts\"] for row in cash[\"monthly\"]], [116, 104, 93])\n        self.assertEqual(cash[\"incremental_payables_reserve_usd\"], \"5500.00\")\n        self.assertEqual(cash[\"cash_after_reserve_usd\"], \"26900.00\")\n\n    def test_runway_and_containment_are_scenarios_not_results(self):\n        report = RECOVERY.build_report()\n        rows = report[\"scenarios\"][\"scenarios\"]\n        self.assertEqual([row[\"monthly_burn_usd\"] for row in rows], [\"9000.00\", \"7300.00\"])\n        self.assertEqual(rows[0][\"after_reserve_to_zero\"][\"days_to_floor\"], \"89.7\")\n        self.assertEqual(rows[0][\"after_reserve_to_floor\"][\"days_to_floor\"], \"49.7\")\n        self.assertEqual(rows[1][\"after_reserve_to_floor\"][\"days_to_floor\"], \"61.2\")\n        self.assertEqual(Decimal(rows[0][\"monthly_burn_usd\"]) - Decimal(rows[1][\"monthly_burn_usd\"]), Decimal(1700))\n        self.assertTrue(all(row[\"realized_savings_usd\"] is None and not row[\"approved\"] for row in rows))\n\n    def test_known_baseline_bug_and_candidate_order(self):\n        report = RECOVERY.queue_report(self.case, self.tickets, 420)\n        self.assertEqual(report[\"legacy_first_four\"], [\"ticket-009\", \"ticket-002\", \"ticket-006\", \"ticket-012\"])\n        self.assertEqual(report[\"candidate_first_four\"], [\"ticket-001\", \"ticket-010\", \"ticket-007\", \"ticket-011\"])\n        self.assertNotEqual(report[\"legacy_first_four\"], report[\"candidate_first_four\"])\n\n    def test_capacity_slice_preserves_blocked_and_deferred_work(self):\n        report = RECOVERY.queue_report(self.case, self.tickets, 420)\n        self.assertEqual(report[\"selected_ticket_ids\"], [\"ticket-001\", \"ticket-010\", \"ticket-007\", \"ticket-011\", \"ticket-005\", \"ticket-008\"])\n        self.assertEqual((report[\"selected_estimated_minutes\"], report[\"selected_urgent_count\"]), (420, 3))\n        self.assertEqual(report[\"total_open_estimated_minutes\"], 690)\n        self.assertEqual(report[\"oldest_open_age_days\"], 29)\n        self.assertEqual([row[\"ticket_id\"] for row in report[\"blocked\"]], [\"ticket-004\"])\n        self.assertEqual(len(report[\"capacity_deferred\"]), 5)\n        accounted = set(report[\"selected_ticket_ids\"]) | {row[\"ticket_id\"] for row in report[\"blocked\"] + report[\"capacity_deferred\"]}\n        self.assertEqual(accounted, {row[\"ticket_id\"] for row in self.tickets})\n        self.assertEqual(report[\"completed_ticket_ids\"], [])\n        self.assertFalse(report[\"deployed\"])\n\n    def test_zero_capacity_and_invalid_capacity(self):\n        selected, deferred, used = RECOVERY.select_capacity(self.tickets, 0)\n        self.assertEqual((selected, used, len(deferred)), ([], 0, 11))\n        for value in (-1, 10001, True, 4.5):\n            with self.subTest(value=value), self.assertRaises(ValueError):\n                RECOVERY.select_capacity(self.tickets, value)\n\n    def test_invalid_ticket_inputs_are_rejected(self):\n        for changes in ({\"priority\": \"critical-ish\"}, {\"opened_on\": \"2026-10-01\"}, {\"estimated_minutes\": \"0\"}, {\"affected_accounts\": \"-1\"}, {\"classification\": \"REAL\"}):\n            with self.subTest(changes=changes), self.assertRaises(ValueError):\n                RECOVERY.validate_tickets([{**self.tickets[0], **changes}], self.case[\"as_of\"])\n        with self.assertRaises(ValueError):\n            RECOVERY.validate_tickets([self.tickets[0], self.tickets[0]], self.case[\"as_of\"])\n\n    def test_ties_are_deterministic_and_closed_work_is_excluded(self):\n        a = {**self.tickets[0], \"ticket_id\": \"ticket-101\", \"opened_on\": \"2026-09-01\"}\n        b = {**a, \"ticket_id\": \"ticket-102\"}\n        closed = {**a, \"ticket_id\": \"ticket-100\", \"state\": \"closed\"}\n        self.assertEqual([row[\"ticket_id\"] for row in RECOVERY.prioritize([b, closed, a])], [\"ticket-101\", \"ticket-102\"])\n\n    def test_duplicate_ledger_and_cohort_drift_are_rejected(self):\n        with self.assertRaises(ValueError):\n            RECOVERY.reconcile(self.case, self.ledger + [self.ledger[0]], self.subscriptions, self.payables)\n        changed = [{**self.subscriptions[0], \"active_accounts\": \"99\"}] + self.subscriptions[1:]\n        with self.assertRaises(ValueError):\n            RECOVERY.reconcile(self.case, self.ledger, changed, self.payables)\n        with self.assertRaises(ValueError):\n            RECOVERY.reconcile(self.case, self.ledger, self.subscriptions, self.payables + [self.payables[0]])\n\n    def test_invalid_money_and_zero_burn_semantics(self):\n        for value in (\"NaN\", \"Infinity\", \"-1\", \"0.001\", True):\n            with self.subTest(value=value), self.assertRaises(ValueError):\n                RECOVERY.amount(value)\n        self.assertIsNone(RECOVERY.runway(Decimal(100), Decimal(10), Decimal(0), 30)[\"days_to_floor\"])\n        self.assertEqual(RECOVERY.runway(Decimal(5), Decimal(10), Decimal(100), 30)[\"days_to_floor\"], \"0.0\")\n\n    def test_repeated_month_scenario_cannot_drift(self):\n        cash = RECOVERY.reconcile(self.case, self.ledger, self.subscriptions, self.payables)\n        rows = RECOVERY.read_csv(\"data/scenarios.csv\")\n        rows[0][\"hosting_usd\"] = \"1801.00\"\n        with self.assertRaises(ValueError):\n            RECOVERY.scenario_report(self.case, cash, rows)\n\n    def test_sprint_budgets_and_dependencies(self):\n        rows = RECOVERY.read_csv(\"ops/recovery-sprint.csv\")\n        budgets = {bucket: sum(int(row[\"estimate_minutes\"]) for row in rows if row[\"budget_bucket\"] == bucket) for bucket in (\"engineering\", \"support\")}\n        self.assertEqual(budgets, {\"engineering\": 360, \"support\": 420})\n        ids = {row[\"work_id\"] for row in rows}\n        self.assertTrue(all(not row[\"depends_on\"] or row[\"depends_on\"] in ids for row in rows))\n\n    def test_simulation_leaves_inputs_unchanged(self):\n        before = copy.deepcopy(self.tickets)\n        RECOVERY.queue_report(self.case, self.tickets, 420)\n        self.assertEqual(before, self.tickets)\n\n\nif __name__ == \"__main__\":\n    unittest.main(verbosity=2)\n","path":"templates/casework/work/starter/tests/test_recovery.py","sha256":"c6590a45c0052cd63741c20ddff7f9a619af41ad1ead55c50e3d57b4d8fd34c8"},{"bytes":12404,"content":"\"\"\"Read-only synthetic cash diagnosis and bounded support-recovery simulation.\"\"\"\nimport argparse\nimport csv\nimport importlib.util\nimport json\nimport re\nfrom datetime import date\nfrom decimal import Decimal, ROUND_HALF_UP\nfrom pathlib import Path\n\nROOT = Path(__file__).resolve().parents[1]\nSEVERITY = {\"urgent\": 0, \"normal\": 1, \"low\": 2}\nCATEGORIES = {\"subscription-receipts\": \"in\", \"payroll\": \"out\", \"contractors\": \"out\", \"hosting\": \"out\", \"refunds\": \"out\"}\nSCENARIO_FIELDS = (\"subscription_receipts_usd\", \"payroll_usd\", \"contractors_usd\", \"hosting_usd\", \"refunds_usd\")\n\n\ndef amount(value):\n    if isinstance(value, bool):\n        raise ValueError(\"Boolean is not money\")\n    number = Decimal(str(value))\n    if not number.is_finite() or number < 0 or number != number.quantize(Decimal(\"0.01\")):\n        raise ValueError(\"Finite nonnegative cent amounts required\")\n    return number\n\n\ndef money(value):\n    return format(value.quantize(Decimal(\"0.01\"), rounding=ROUND_HALF_UP), \".2f\")\n\n\ndef integer(value):\n    text = str(value)\n    if not re.fullmatch(r\"0|[1-9]\\d*\", text):\n        raise ValueError(\"Nonnegative whole count required\")\n    return int(text)\n\n\ndef calendar(value):\n    if not re.fullmatch(r\"\\d{4}-\\d{2}-\\d{2}\", value):\n        raise ValueError(\"Exact ISO date required\")\n    return date.fromisoformat(value)\n\n\ndef read_json(relative):\n    value = json.loads((ROOT / relative).read_text(encoding=\"utf-8\"))\n    if value.get(\"classification\") != \"SYNTHETIC\":\n        raise ValueError(\"Only SYNTHETIC inputs are supported\")\n    return value\n\n\ndef read_csv(relative):\n    with (ROOT / relative).open(encoding=\"utf-8\", newline=\"\") as handle:\n        reader = csv.DictReader(handle)\n        if not reader.fieldnames or len(reader.fieldnames) != len(set(reader.fieldnames)):\n            raise ValueError(\"Invalid CSV header\")\n        rows = list(reader)\n    if not rows or any(None in row or any(value is None for value in row.values()) or row.get(\"classification\") != \"SYNTHETIC\" for row in rows):\n        raise ValueError(\"Expected complete SYNTHETIC rows\")\n    return rows\n\n\ndef reconcile(case, ledger, subscriptions, payables):\n    months = case[\"months\"]\n    if not months or months != sorted(set(months)) or any(not re.fullmatch(r\"\\d{4}-\\d{2}\", month) for month in months):\n        raise ValueError(\"Ordered unique months required\")\n    first, as_of = calendar(case[\"opening_date\"]), calendar(case[\"as_of\"])\n    monthly = {month: {key: Decimal(0) for key in CATEGORIES} for month in months}\n    ids = set()\n    for row in ledger:\n        posted = calendar(row[\"posted_on\"])\n        month = row[\"posted_on\"][:7]\n        if row[\"transaction_id\"] in ids or month not in monthly or not first <= posted <= as_of:\n            raise ValueError(\"Duplicate or out-of-period ledger entry\")\n        ids.add(row[\"transaction_id\"])\n        if row[\"category\"] not in CATEGORIES or CATEGORIES[row[\"category\"]] != row[\"direction\"]:\n            raise ValueError(\"Cash direction/category mismatch\")\n        monthly[month][row[\"category\"]] += amount(row[\"amount_usd\"])\n    billed = {month: Decimal(0) for month in months}\n    accounts = {month: 0 for month in months}\n    plan_ids = set()\n    for row in subscriptions:\n        pair = (row[\"month\"], row[\"plan\"])\n        if pair in plan_ids or row[\"month\"] not in monthly:\n            raise ValueError(\"Duplicate or out-of-period subscription cohort\")\n        plan_ids.add(pair)\n        count = integer(row[\"active_accounts\"])\n        billed[row[\"month\"]] += count * amount(row[\"monthly_price_usd\"])\n        accounts[row[\"month\"]] += count\n    opening = amount(case[\"opening_cash_usd\"])\n    cash, total_in, total_out, summaries = opening, Decimal(0), Decimal(0), []\n    for month in months:\n        by_category = monthly[month]\n        receipts = by_category[\"subscription-receipts\"]\n        if billed[month] != receipts:\n            raise ValueError(\"The authored in-month collection fixture does not reconcile\")\n        payments = sum((by_category[key] for key, direction in CATEGORIES.items() if direction == \"out\"), Decimal(0))\n        net = receipts - payments\n        cash += net\n        total_in += receipts\n        total_out += payments\n        summaries.append({\n            \"month\": month, \"receipts_usd\": money(receipts), \"payments_usd\": money(payments),\n            \"net_cash_usd\": money(net), \"closing_cash_usd\": money(cash),\n            \"subscription_accounts\": accounts[month],\n            \"categories_usd\": {key: money(value) for key, value in by_category.items()}\n        })\n    reserve, payable_ids = Decimal(0), set()\n    for row in payables:\n        if row[\"payable_id\"] in payable_ids or row[\"forecast_treatment\"] != \"incremental-prior-period-reserve\":\n            raise ValueError(\"Duplicate or incorrectly treated payable\")\n        payable_ids.add(row[\"payable_id\"])\n        if calendar(row[\"due_on\"]) <= as_of:\n            raise ValueError(\"This fixture expects unsettled catch-up obligations due after the as-of date\")\n        reserve += amount(row[\"amount_usd\"])\n    return {\n        \"classification\": \"SYNTHETIC\", \"ledger_rows\": len(ledger), \"opening_cash_usd\": money(opening),\n        \"receipts_usd\": money(total_in), \"payments_usd\": money(total_out), \"closing_cash_usd\": money(cash),\n        \"incremental_payables_reserve_usd\": money(reserve), \"cash_after_reserve_usd\": money(cash - reserve),\n        \"monthly\": summaries, \"accounting_limit\": case[\"accounting_fixture_assumption\"],\n        \"payables_limit\": case[\"payables_treatment\"]\n    }\n\n\ndef runway(cash, floor, burn, days_per_month):\n    days_per_month = integer(days_per_month)\n    if days_per_month <= 0:\n        raise ValueError(\"Positive modeled month length required\")\n    if cash <= floor:\n        return {\"days_to_floor\": \"0.0\", \"condition\": \"at-or-below-floor\"}\n    if burn <= 0:\n        return {\"days_to_floor\": None, \"condition\": \"not-burning-in-this-scenario\"}\n    days = (cash - floor) / burn * days_per_month\n    return {\"days_to_floor\": format(days.quantize(Decimal(\"0.1\"), rounding=ROUND_HALF_UP), \".1f\"), \"condition\": \"mechanical-repeat-not-a-forecast\"}\n\n\ndef scenario_report(case, cash, rows):\n    available = Decimal(cash[\"cash_after_reserve_usd\"])\n    floor = amount(case[\"cash_floor_usd\"])\n    results, seen = [], set()\n    latest = cash[\"monthly\"][-1][\"categories_usd\"]\n    for row in rows:\n        if row[\"scenario_id\"] in seen:\n            raise ValueError(\"Duplicate scenario\")\n        seen.add(row[\"scenario_id\"])\n        values = {key: amount(row[key]) for key in SCENARIO_FIELDS}\n        if row[\"scenario_id\"] == \"repeat-september\":\n            expected = {\"subscription_receipts_usd\": latest[\"subscription-receipts\"], **{f\"{key}_usd\": latest[key] for key in (\"payroll\", \"contractors\", \"hosting\", \"refunds\")}}\n            if values != {key: Decimal(value) for key, value in expected.items()}:\n                raise ValueError(\"Repeated-month scenario differs from the reconciled ledger\")\n        payments = sum((values[key] for key in SCENARIO_FIELDS[1:]), Decimal(0))\n        burn = payments - values[\"subscription_receipts_usd\"]\n        results.append({\n            \"scenario_id\": row[\"scenario_id\"], \"receipts_usd\": money(values[\"subscription_receipts_usd\"]),\n            \"payments_usd\": money(payments), \"monthly_burn_usd\": money(burn),\n            \"cash_floor_usd\": money(floor),\n            \"after_reserve_to_zero\": runway(available, Decimal(0), burn, case[\"modeled_days_per_month\"]),\n            \"after_reserve_to_floor\": runway(available, floor, burn, case[\"modeled_days_per_month\"]),\n            \"precondition\": row[\"precondition\"], \"realized_savings_usd\": None, \"approved\": False\n        })\n    if \"repeat-september\" not in seen:\n        raise ValueError(\"Missing reconciled baseline scenario\")\n    return {\"classification\": \"SYNTHETIC\", \"scenarios\": results, \"external_financial_effects\": []}\n\n\ndef validate_tickets(rows, as_of):\n    cutoff, seen = calendar(as_of), set()\n    for row in rows:\n        if row[\"ticket_id\"] in seen or not re.fullmatch(r\"ticket-\\d{3}\", row[\"ticket_id\"]):\n            raise ValueError(\"Duplicate or invalid ticket ID\")\n        seen.add(row[\"ticket_id\"])\n        if row[\"priority\"] not in SEVERITY or row[\"state\"] not in (\"open\", \"closed\"):\n            raise ValueError(\"Unknown ticket severity or state\")\n        if calendar(row[\"opened_on\"]) > cutoff:\n            raise ValueError(\"Ticket is in the future\")\n        if integer(row[\"estimated_minutes\"]) <= 0 or integer(row[\"affected_accounts\"]) <= 0:\n            raise ValueError(\"Positive ticket estimates and affected-account counts required\")\n        if row[\"classification\"] != \"SYNTHETIC\":\n            raise ValueError(\"Only synthetic tickets are supported\")\n\n\ndef prioritize(rows):\n    if any(row[\"priority\"] not in SEVERITY for row in rows):\n        raise ValueError(\"Unknown severity cannot silently become low priority\")\n    eligible = [row for row in rows if row[\"state\"] == \"open\" and not row[\"blocked_by\"]]\n    return sorted(eligible, key=lambda row: (SEVERITY[row[\"priority\"]], row[\"opened_on\"], row[\"ticket_id\"]))\n\n\ndef select_capacity(rows, minutes):\n    if type(minutes) is not int or not 0 <= minutes <= 10000:\n        raise ValueError(\"Capacity must be an integer from 0 to 10000 minutes\")\n    selected, deferred, used = [], [], 0\n    for row in prioritize(rows):\n        estimate = integer(row[\"estimated_minutes\"])\n        if used + estimate <= minutes:\n            selected.append(row)\n            used += estimate\n        else:\n            deferred.append({\"ticket_id\": row[\"ticket_id\"], \"reason\": \"estimated-work-exceeds-remaining-capacity\"})\n    return selected, deferred, used\n\n\ndef load_legacy_dispatch():\n    spec = importlib.util.spec_from_file_location(\"authored_defective_dispatch\", ROOT / \"product/dispatch.py\")\n    module = importlib.util.module_from_spec(spec)\n    spec.loader.exec_module(module)\n    return module\n\n\ndef queue_report(case, tickets, capacity):\n    validate_tickets(tickets, case[\"as_of\"])\n    chosen, deferred, used = select_capacity(tickets, capacity)\n    legacy = load_legacy_dispatch().next_batch(tickets, 4)\n    candidate_four = prioritize(tickets)[:4]\n    blocked = [{\"ticket_id\": row[\"ticket_id\"], \"reason\": row[\"blocked_by\"]} for row in tickets if row[\"state\"] == \"open\" and row[\"blocked_by\"]]\n    open_rows = [row for row in tickets if row[\"state\"] == \"open\"]\n    return {\n        \"classification\": \"SYNTHETIC\", \"open_tickets\": len(open_rows),\n        \"total_open_estimated_minutes\": sum(integer(row[\"estimated_minutes\"]) for row in open_rows),\n        \"legacy_first_four\": [row[\"ticket_id\"] for row in legacy],\n        \"candidate_first_four\": [row[\"ticket_id\"] for row in candidate_four],\n        \"capacity_minutes\": capacity, \"selected_ticket_ids\": [row[\"ticket_id\"] for row in chosen],\n        \"selected_estimated_minutes\": used, \"selected_urgent_count\": sum(row[\"priority\"] == \"urgent\" for row in chosen),\n        \"capacity_deferred\": deferred, \"blocked\": blocked,\n        \"oldest_open_age_days\": max(((calendar(case[\"as_of\"]) - calendar(row[\"opened_on\"])).days for row in open_rows), default=None),\n        \"policy\": \"Eligible urgent/normal/low; oldest first then ID. Non-preemptive fit can skip a larger ticket; skipped work remains visible.\",\n        \"completed_ticket_ids\": [], \"deployed\": False, \"external_effects\": []\n    }\n\n\ndef build_report(capacity=None):\n    case = read_json(\"case/recovery.json\")\n    cash = reconcile(case, read_csv(\"data/cash-ledger.csv\"), read_csv(\"data/subscriptions.csv\"), read_csv(\"data/payables.csv\"))\n    if capacity is None:\n        capacity = case[\"support_capacity_minutes\"]\n    queue = queue_report(case, read_csv(\"data/support-backlog.csv\"), capacity)\n    scenarios = scenario_report(case, cash, read_csv(\"data/scenarios.csv\"))\n    return {\"classification\": \"SYNTHETIC\", \"as_of\": case[\"as_of\"], \"cash\": cash, \"queue\": queue, \"scenarios\": scenarios, \"realized_recovery_results\": None}\n\n\ndef main():\n    parser = argparse.ArgumentParser(description=__doc__)\n    parser.add_argument(\"--capacity-minutes\", type=int)\n    parser.add_argument(\"--section\", choices=(\"all\", \"cash\", \"queue\", \"scenarios\"), default=\"all\")\n    args = parser.parse_args()\n    report = build_report(args.capacity_minutes)\n    print(json.dumps(report if args.section == \"all\" else report[args.section], indent=2, sort_keys=True, allow_nan=False))\n\n\nif __name__ == \"__main__\":\n    main()\n","path":"templates/casework/work/starter/tools/recovery.py","sha256":"019ff2fdcb7f5b04530f2f1c0a0a956363cbbf371a20e703164d2e4149aff4a3"},{"bytes":10519,"content":"{\"authority\":\"inert-starter-data\",\"case_id\":\"cedarline-five-day-recovery\",\"organization_seed\":\"turnaround-firm\",\"schema\":\"hive-hub-seed-task-board/1\",\"tasks\":[{\"acceptance\":[\"Reproduces opening 52000, receipts 48500, payments 68100, and closing 32400 USD.\",\"Reports monthly net cash of -4000, -6600, and -9000 USD with the explicit fixture assumption that subscription billings were collected in-month.\",\"Keeps incremental unpaid prior-period obligations outside the cash-ledger payments.\"],\"assignee\":null,\"completed_evidence\":[],\"depends_on\":[],\"id\":\"reconcile-synthetic-cash\",\"inputs\":[\"starter/case/recovery.json\",\"starter/data/cash-ledger.csv\",\"starter/data/subscriptions.csv\",\"starter/data/payables.csv\",\"starter/tools/recovery.py\",\"starter/tests/test_recovery.py\"],\"instructions\":\"Run the authored analysis utility and tests, reconcile every synthetic transaction to monthly plan counts, and distinguish cash receipts from general revenue-recognition claims.\",\"outputs\":[\"deliverables/cash-reconciliation.json\"],\"state\":\"ready\",\"team\":\"finance\",\"title\":\"Reconcile the three-month cash and subscription baseline\"},{\"acceptance\":[\"Covers twelve open tickets, four urgent rows, and the one blocked urgent ticket.\",\"Connects the dispatch behavior to delayed urgent work without inventing churn attribution or actual customer harm.\"],\"assignee\":null,\"completed_evidence\":[],\"depends_on\":[],\"id\":\"map-backlog-impact\",\"inputs\":[\"starter/data/support-backlog.csv\",\"starter/case/recovery.json\",\"starter/quality/recovery-cases.csv\"],\"instructions\":\"Review ticket severity, age, affected-account counts, and dependencies. Do not sum overlapping affected-account counts into unique customers or assert that a support fix recovers revenue.\",\"outputs\":[\"deliverables/backlog-impact.csv\"],\"state\":\"ready\",\"team\":\"product-recovery\",\"title\":\"Map the authored backlog to recovery risk\"},{\"acceptance\":[\"Shows the legacy first four as ticket-009, ticket-002, ticket-006, and ticket-012, all low priority.\",\"Explains why string sorting places low before normal before urgent and shows the blocked row is excluded.\"],\"assignee\":null,\"completed_evidence\":[],\"depends_on\":[\"map-backlog-impact\"],\"id\":\"reproduce-dispatch-defect\",\"inputs\":[\"starter/product/dispatch.py\",\"starter/tools/recovery.py\",\"starter/tests/test_recovery.py\",\"starter/quality/recovery-cases.csv\",\"deliverables/backlog-impact.csv\"],\"instructions\":\"Run the small authored product dispatcher through the analysis utility and create a minimal reproduction. Keep this baseline fixture separate from any candidate fix.\",\"outputs\":[\"deliverables/dispatch-reproduction.json\"],\"state\":\"blocked\",\"team\":\"engineering\",\"title\":\"Reproduce severity alphabetization in the reference dispatcher\"},{\"acceptance\":[\"Reserves USD 5500 and reports USD 26900 available before the USD 12000 floor.\",\"Reports approximately 89.7 days to zero after reserves and 49.7 days to the floor using 30-day modeled months.\",\"Does not treat these mechanical scenarios as a forecast guarantee, solvency opinion, trade, or authorized financial action.\"],\"assignee\":null,\"completed_evidence\":[],\"depends_on\":[\"reconcile-synthetic-cash\"],\"id\":\"set-cash-guardrails\",\"inputs\":[\"starter/case/recovery.json\",\"starter/data/payables.csv\",\"starter/ops/approval-gates.json\",\"deliverables/cash-reconciliation.json\"],\"instructions\":\"Reserve the prior-period catch-up obligations and compute the repeated-September runway to zero and to the owner's cash floor. Specify review triggers and prohibit automatic spending or cost actions.\",\"outputs\":[\"deliverables/cash-guardrails.json\"],\"state\":\"blocked\",\"team\":\"finance\",\"title\":\"Set runway and authority guardrails\"},{\"acceptance\":[\"Orders eligible urgent before normal before low; same-severity work is oldest first with deterministic ties.\",\"Defines the non-preemptive fit rule and records that a larger deferred ticket is not silently completed or discarded.\"],\"assignee\":null,\"completed_evidence\":[],\"depends_on\":[\"reproduce-dispatch-defect\",\"set-cash-guardrails\"],\"id\":\"agree-priority-rule\",\"inputs\":[\"deliverables/backlog-impact.csv\",\"deliverables/dispatch-reproduction.json\",\"deliverables/cash-guardrails.json\",\"starter/case/recovery.json\"],\"instructions\":\"Define severity ranking, oldest-first ties, blocked exclusions, deterministic identifiers, and capacity handling. Reconcile the policy with cash and customer-risk constraints before changing code.\",\"outputs\":[\"deliverables/triage-policy.json\"],\"state\":\"blocked\",\"team\":\"product-recovery\",\"title\":\"Agree the narrow recovery triage rule\"},{\"acceptance\":[\"Selects ticket-001, ticket-010, ticket-007, ticket-011, ticket-005, and ticket-008 for exactly 420 estimated minutes.\",\"Retains one blocked and five capacity-deferred tickets; it reports no actual completion or resolution.\",\"Keeps the separate 360-minute engineering budget distinct from support capacity.\"],\"assignee\":null,\"completed_evidence\":[],\"depends_on\":[\"agree-priority-rule\"],\"id\":\"plan-capacity-bounded-support\",\"inputs\":[\"starter/data/support-backlog.csv\",\"starter/ops/recovery-sprint.csv\",\"starter/tools/recovery.py\",\"deliverables/triage-policy.json\"],\"instructions\":\"Run the candidate triage simulation under the approved-for-review policy and map the chosen work to the five-day sprint skeleton. Keep blocked and capacity-deferred tickets visible.\",\"outputs\":[\"deliverables/support-sprint-plan.json\"],\"state\":\"blocked\",\"team\":\"operations\",\"title\":\"Plan the 420-minute support slice\"},{\"acceptance\":[\"Rejects unknown severities and invalid limits, excludes blocked/non-open work, and handles ties deterministically.\",\"Returns ticket-001, ticket-010, ticket-007, and ticket-011 for the agreed four-item review batch.\",\"Makes no network, persistence, customer, or billing changes.\"],\"assignee\":null,\"completed_evidence\":[],\"depends_on\":[\"agree-priority-rule\"],\"id\":\"repair-dispatch-candidate\",\"inputs\":[\"starter/product/dispatch.py\",\"starter/tests/test_recovery.py\",\"starter/quality/recovery-cases.csv\",\"deliverables/triage-policy.json\",\"deliverables/dispatch-reproduction.json\"],\"instructions\":\"Implement the agreed severity ranking in a candidate module with narrow tests. Preserve the authored defective baseline as reproduction evidence; do not deploy or execute work against real accounts.\",\"outputs\":[\"deliverables/dispatch-candidate.py\",\"deliverables/dispatch-candidate-tests.py\"],\"state\":\"blocked\",\"team\":\"engineering\",\"title\":\"Produce a minimal dispatcher candidate\"},{\"acceptance\":[\"Separates the intentionally failing legacy behavior from candidate pass/fail evidence.\",\"Records blocked-ticket, zero-capacity, duplicate-ID, deterministic-tie, and unknown-severity cases.\",\"Explicitly says production deployment and support execution have not occurred.\"],\"assignee\":null,\"completed_evidence\":[],\"depends_on\":[\"repair-dispatch-candidate\",\"plan-capacity-bounded-support\"],\"id\":\"verify-recovery-handoff\",\"inputs\":[\"starter/quality/recovery-cases.csv\",\"starter/ops/approval-gates.json\",\"deliverables/dispatch-candidate.py\",\"deliverables/dispatch-candidate-tests.py\",\"deliverables/support-sprint-plan.json\"],\"instructions\":\"Execute the candidate's tests and replay the acceptance table against both the preserved baseline and candidate. Review capacity accounting and explain how an owner could hold the candidate without changing the reference.\",\"outputs\":[\"deliverables/recovery-regression-results.csv\"],\"state\":\"blocked\",\"team\":\"operations\",\"title\":\"Verify candidate queue behavior and rollback boundaries\"},{\"acceptance\":[\"Covers urgent export failure, blocked reproduction, and low-priority cosmetic feedback with different truthful next steps.\",\"Labels every draft unsent and requires owner review before any actual customer communication or refund commitment.\"],\"assignee\":null,\"completed_evidence\":[],\"depends_on\":[\"plan-capacity-bounded-support\",\"set-cash-guardrails\"],\"id\":\"prepare-customer-drafts\",\"inputs\":[\"starter/ops/customer-response.md\",\"starter/ops/approval-gates.json\",\"deliverables/backlog-impact.csv\",\"deliverables/support-sprint-plan.json\",\"deliverables/cash-guardrails.json\"],\"instructions\":\"Adapt the supplied response policy into incident-class drafts and a review routing sheet. Refer only to synthetic ticket IDs and avoid promises of resolution time, refunds, recovered money, or completed fixes.\",\"outputs\":[\"deliverables/customer-drafts.md\",\"deliverables/message-review-routing.csv\"],\"state\":\"blocked\",\"team\":\"customer-success\",\"title\":\"Prepare honest customer-response drafts\"},{\"acceptance\":[\"Shows USD 9000 versus USD 7300 modeled monthly burn, a USD 1700 difference, and the associated cash-floor sensitivity.\",\"Marks contractor and hosting changes unapproved and includes no actual cancellation, transfer, purchase, sale, trade, or profit claim.\"],\"assignee\":null,\"completed_evidence\":[],\"depends_on\":[\"verify-recovery-handoff\",\"set-cash-guardrails\"],\"id\":\"model-containment-options\",\"inputs\":[\"starter/data/scenarios.csv\",\"starter/tools/recovery.py\",\"starter/ops/approval-gates.json\",\"deliverables/cash-guardrails.json\",\"deliverables/recovery-regression-results.csv\"],\"instructions\":\"Compare the repeated-September scenario to the supplied lower contractor/hosting assumption. Explain the approval and operational evidence needed, using regression results as a constraint rather than treating them as achieved financial value.\",\"outputs\":[\"deliverables/containment-scenarios.json\"],\"state\":\"blocked\",\"team\":\"finance\",\"title\":\"Model containment without claiming savings\"},{\"acceptance\":[\"Names unresolved risks, baseline/candidate differences, and a measurement plan for real future work.\",\"Claims no realized profit, completed customer recovery, live deployment, or external authority.\"],\"assignee\":null,\"completed_evidence\":[],\"depends_on\":[\"prepare-customer-drafts\",\"model-containment-options\"],\"id\":\"review-five-day-recovery\",\"inputs\":[\"deliverables/cash-reconciliation.json\",\"deliverables/recovery-regression-results.csv\",\"deliverables/support-sprint-plan.json\",\"deliverables/customer-drafts.md\",\"deliverables/message-review-routing.csv\",\"deliverables/containment-scenarios.json\",\"starter/ops/approval-gates.json\"],\"instructions\":\"Join cash diagnosis, candidate quality, the capacity plan, response drafts, and containment scenarios into a hold/rework/candidate recommendation. Document what new evidence is needed after any separately approved sprint.\",\"outputs\":[\"deliverables/recovery-decision.md\"],\"state\":\"blocked\",\"team\":\"product-recovery\",\"title\":\"Issue the bounded recovery decision\"}]}\n","path":"templates/casework/work/task-board.json","sha256":"8188e4007fb4b265f6140544bb900e519a3a7d6899a1eced22ce243e601d50a2"},{"bytes":389,"content":"# Customer Success\n\nRole: customer-recovery-lead\n\nPrepare truthful, approval-gated response drafts and avoid unearned commitments or fabricated resolution claims.\n\nCase inputs and logical deliverables belong to the same-world casework workspace.\nRead only the inputs for assigned work; hand off verified artifact references.\nDo not claim another team's task or authorize external effects.\n","path":"templates/teams/customer-success/work/TEAM.md","sha256":"cca32357d63b4004c48d18eacf82bab81a34b487c831722b9865167aa75cee5d"},{"bytes":1101,"content":"{\"case_workspace\":\"casework\",\"schema\":\"hive-hub-seed-team-work/1\",\"tasks\":[{\"acceptance\":[\"Covers urgent export failure, blocked reproduction, and low-priority cosmetic feedback with different truthful next steps.\",\"Labels every draft unsent and requires owner review before any actual customer communication or refund commitment.\"],\"assignee\":null,\"completed_evidence\":[],\"depends_on\":[\"plan-capacity-bounded-support\",\"set-cash-guardrails\"],\"id\":\"prepare-customer-drafts\",\"inputs\":[\"starter/ops/customer-response.md\",\"starter/ops/approval-gates.json\",\"deliverables/backlog-impact.csv\",\"deliverables/support-sprint-plan.json\",\"deliverables/cash-guardrails.json\"],\"instructions\":\"Adapt the supplied response policy into incident-class drafts and a review routing sheet. Refer only to synthetic ticket IDs and avoid promises of resolution time, refunds, recovered money, or completed fixes.\",\"outputs\":[\"deliverables/customer-drafts.md\",\"deliverables/message-review-routing.csv\"],\"state\":\"blocked\",\"team\":\"customer-success\",\"title\":\"Prepare honest customer-response drafts\"}],\"team\":\"customer-success\"}\n","path":"templates/teams/customer-success/work/tasks.json","sha256":"8044ffb37dde7cbc75b4fc0e8f88e353ae6a6cf62255a5fa82e8baca5cae0546"},{"bytes":366,"content":"# Engineering Recovery\n\nRole: recovery-engineer\n\nReproduce and repair the authored priority-sorting defect with narrow regression coverage.\n\nCase inputs and logical deliverables belong to the same-world casework workspace.\nRead only the inputs for assigned work; hand off verified artifact references.\nDo not claim another team's task or authorize external effects.\n","path":"templates/teams/engineering/work/TEAM.md","sha256":"a3919817144605eb4988f8f3f74cf0a2af4e1b55a59dc115ffa7222ef75172b8"},{"bytes":1947,"content":"{\"case_workspace\":\"casework\",\"schema\":\"hive-hub-seed-team-work/1\",\"tasks\":[{\"acceptance\":[\"Shows the legacy first four as ticket-009, ticket-002, ticket-006, and ticket-012, all low priority.\",\"Explains why string sorting places low before normal before urgent and shows the blocked row is excluded.\"],\"assignee\":null,\"completed_evidence\":[],\"depends_on\":[\"map-backlog-impact\"],\"id\":\"reproduce-dispatch-defect\",\"inputs\":[\"starter/product/dispatch.py\",\"starter/tools/recovery.py\",\"starter/tests/test_recovery.py\",\"starter/quality/recovery-cases.csv\",\"deliverables/backlog-impact.csv\"],\"instructions\":\"Run the small authored product dispatcher through the analysis utility and create a minimal reproduction. Keep this baseline fixture separate from any candidate fix.\",\"outputs\":[\"deliverables/dispatch-reproduction.json\"],\"state\":\"blocked\",\"team\":\"engineering\",\"title\":\"Reproduce severity alphabetization in the reference dispatcher\"},{\"acceptance\":[\"Rejects unknown severities and invalid limits, excludes blocked/non-open work, and handles ties deterministically.\",\"Returns ticket-001, ticket-010, ticket-007, and ticket-011 for the agreed four-item review batch.\",\"Makes no network, persistence, customer, or billing changes.\"],\"assignee\":null,\"completed_evidence\":[],\"depends_on\":[\"agree-priority-rule\"],\"id\":\"repair-dispatch-candidate\",\"inputs\":[\"starter/product/dispatch.py\",\"starter/tests/test_recovery.py\",\"starter/quality/recovery-cases.csv\",\"deliverables/triage-policy.json\",\"deliverables/dispatch-reproduction.json\"],\"instructions\":\"Implement the agreed severity ranking in a candidate module with narrow tests. Preserve the authored defective baseline as reproduction evidence; do not deploy or execute work against real accounts.\",\"outputs\":[\"deliverables/dispatch-candidate.py\",\"deliverables/dispatch-candidate-tests.py\"],\"state\":\"blocked\",\"team\":\"engineering\",\"title\":\"Produce a minimal dispatcher candidate\"}],\"team\":\"engineering\"}\n","path":"templates/teams/engineering/work/tasks.json","sha256":"cc08395fbd000cbb3cccdf0fdc3c423d345738d34520d0c4ccae860b1a9057b8"},{"bytes":379,"content":"# Finance and Runway\n\nRole: turnaround-finance-lead\n\nReconcile cash, reserve unpaid obligations, and separate scenario arithmetic from realized results.\n\nCase inputs and logical deliverables belong to the same-world casework workspace.\nRead only the inputs for assigned work; hand off verified artifact references.\nDo not claim another team's task or authorize external effects.\n","path":"templates/teams/finance/work/TEAM.md","sha256":"4fa62ee8bb3f54136cac0b3f95fd22dbe5b967660ee1105416bfd19033ca5ff7"},{"bytes":2986,"content":"{\"case_workspace\":\"casework\",\"schema\":\"hive-hub-seed-team-work/1\",\"tasks\":[{\"acceptance\":[\"Reproduces opening 52000, receipts 48500, payments 68100, and closing 32400 USD.\",\"Reports monthly net cash of -4000, -6600, and -9000 USD with the explicit fixture assumption that subscription billings were collected in-month.\",\"Keeps incremental unpaid prior-period obligations outside the cash-ledger payments.\"],\"assignee\":null,\"completed_evidence\":[],\"depends_on\":[],\"id\":\"reconcile-synthetic-cash\",\"inputs\":[\"starter/case/recovery.json\",\"starter/data/cash-ledger.csv\",\"starter/data/subscriptions.csv\",\"starter/data/payables.csv\",\"starter/tools/recovery.py\",\"starter/tests/test_recovery.py\"],\"instructions\":\"Run the authored analysis utility and tests, reconcile every synthetic transaction to monthly plan counts, and distinguish cash receipts from general revenue-recognition claims.\",\"outputs\":[\"deliverables/cash-reconciliation.json\"],\"state\":\"ready\",\"team\":\"finance\",\"title\":\"Reconcile the three-month cash and subscription baseline\"},{\"acceptance\":[\"Reserves USD 5500 and reports USD 26900 available before the USD 12000 floor.\",\"Reports approximately 89.7 days to zero after reserves and 49.7 days to the floor using 30-day modeled months.\",\"Does not treat these mechanical scenarios as a forecast guarantee, solvency opinion, trade, or authorized financial action.\"],\"assignee\":null,\"completed_evidence\":[],\"depends_on\":[\"reconcile-synthetic-cash\"],\"id\":\"set-cash-guardrails\",\"inputs\":[\"starter/case/recovery.json\",\"starter/data/payables.csv\",\"starter/ops/approval-gates.json\",\"deliverables/cash-reconciliation.json\"],\"instructions\":\"Reserve the prior-period catch-up obligations and compute the repeated-September runway to zero and to the owner's cash floor. Specify review triggers and prohibit automatic spending or cost actions.\",\"outputs\":[\"deliverables/cash-guardrails.json\"],\"state\":\"blocked\",\"team\":\"finance\",\"title\":\"Set runway and authority guardrails\"},{\"acceptance\":[\"Shows USD 9000 versus USD 7300 modeled monthly burn, a USD 1700 difference, and the associated cash-floor sensitivity.\",\"Marks contractor and hosting changes unapproved and includes no actual cancellation, transfer, purchase, sale, trade, or profit claim.\"],\"assignee\":null,\"completed_evidence\":[],\"depends_on\":[\"verify-recovery-handoff\",\"set-cash-guardrails\"],\"id\":\"model-containment-options\",\"inputs\":[\"starter/data/scenarios.csv\",\"starter/tools/recovery.py\",\"starter/ops/approval-gates.json\",\"deliverables/cash-guardrails.json\",\"deliverables/recovery-regression-results.csv\"],\"instructions\":\"Compare the repeated-September scenario to the supplied lower contractor/hosting assumption. Explain the approval and operational evidence needed, using regression results as a constraint rather than treating them as achieved financial value.\",\"outputs\":[\"deliverables/containment-scenarios.json\"],\"state\":\"blocked\",\"team\":\"finance\",\"title\":\"Model containment without claiming savings\"}],\"team\":\"finance\"}\n","path":"templates/teams/finance/work/tasks.json","sha256":"3571acdde325fe580bf3037b415839f5a254bcde7eb3ec3d9975a3f1ab321bee"},{"bytes":371,"content":"# Operations\n\nRole: recovery-operations-lead\n\nCreate capacity-bounded support work, validate handoff behavior, and retain blocked/deferred work.\n\nCase inputs and logical deliverables belong to the same-world casework workspace.\nRead only the inputs for assigned work; hand off verified artifact references.\nDo not claim another team's task or authorize external effects.\n","path":"templates/teams/operations/work/TEAM.md","sha256":"273fe63556f403adadf69e4f25864cd947168824844ac61d7d99e1516b98c2d6"},{"bytes":2050,"content":"{\"case_workspace\":\"casework\",\"schema\":\"hive-hub-seed-team-work/1\",\"tasks\":[{\"acceptance\":[\"Selects ticket-001, ticket-010, ticket-007, ticket-011, ticket-005, and ticket-008 for exactly 420 estimated minutes.\",\"Retains one blocked and five capacity-deferred tickets; it reports no actual completion or resolution.\",\"Keeps the separate 360-minute engineering budget distinct from support capacity.\"],\"assignee\":null,\"completed_evidence\":[],\"depends_on\":[\"agree-priority-rule\"],\"id\":\"plan-capacity-bounded-support\",\"inputs\":[\"starter/data/support-backlog.csv\",\"starter/ops/recovery-sprint.csv\",\"starter/tools/recovery.py\",\"deliverables/triage-policy.json\"],\"instructions\":\"Run the candidate triage simulation under the approved-for-review policy and map the chosen work to the five-day sprint skeleton. Keep blocked and capacity-deferred tickets visible.\",\"outputs\":[\"deliverables/support-sprint-plan.json\"],\"state\":\"blocked\",\"team\":\"operations\",\"title\":\"Plan the 420-minute support slice\"},{\"acceptance\":[\"Separates the intentionally failing legacy behavior from candidate pass/fail evidence.\",\"Records blocked-ticket, zero-capacity, duplicate-ID, deterministic-tie, and unknown-severity cases.\",\"Explicitly says production deployment and support execution have not occurred.\"],\"assignee\":null,\"completed_evidence\":[],\"depends_on\":[\"repair-dispatch-candidate\",\"plan-capacity-bounded-support\"],\"id\":\"verify-recovery-handoff\",\"inputs\":[\"starter/quality/recovery-cases.csv\",\"starter/ops/approval-gates.json\",\"deliverables/dispatch-candidate.py\",\"deliverables/dispatch-candidate-tests.py\",\"deliverables/support-sprint-plan.json\"],\"instructions\":\"Execute the candidate's tests and replay the acceptance table against both the preserved baseline and candidate. Review capacity accounting and explain how an owner could hold the candidate without changing the reference.\",\"outputs\":[\"deliverables/recovery-regression-results.csv\"],\"state\":\"blocked\",\"team\":\"operations\",\"title\":\"Verify candidate queue behavior and rollback boundaries\"}],\"team\":\"operations\"}\n","path":"templates/teams/operations/work/tasks.json","sha256":"c6114c313527f1efbba8d4cfed5ba0cac608126a85dc3f834dab486e9a1f7db4"},{"bytes":358,"content":"# Product Recovery\n\nRole: recovery-product-lead\n\nConnect support impact, scope, priority rules, and the final hold/rework decision.\n\nCase inputs and logical deliverables belong to the same-world casework workspace.\nRead only the inputs for assigned work; hand off verified artifact references.\nDo not claim another team's task or authorize external effects.\n","path":"templates/teams/product-recovery/work/TEAM.md","sha256":"fcba45b080d2908974b217e7a05abf6313d66a8d73fb10a90202d572918df095"},{"bytes":2769,"content":"{\"case_workspace\":\"casework\",\"schema\":\"hive-hub-seed-team-work/1\",\"tasks\":[{\"acceptance\":[\"Covers twelve open tickets, four urgent rows, and the one blocked urgent ticket.\",\"Connects the dispatch behavior to delayed urgent work without inventing churn attribution or actual customer harm.\"],\"assignee\":null,\"completed_evidence\":[],\"depends_on\":[],\"id\":\"map-backlog-impact\",\"inputs\":[\"starter/data/support-backlog.csv\",\"starter/case/recovery.json\",\"starter/quality/recovery-cases.csv\"],\"instructions\":\"Review ticket severity, age, affected-account counts, and dependencies. Do not sum overlapping affected-account counts into unique customers or assert that a support fix recovers revenue.\",\"outputs\":[\"deliverables/backlog-impact.csv\"],\"state\":\"ready\",\"team\":\"product-recovery\",\"title\":\"Map the authored backlog to recovery risk\"},{\"acceptance\":[\"Orders eligible urgent before normal before low; same-severity work is oldest first with deterministic ties.\",\"Defines the non-preemptive fit rule and records that a larger deferred ticket is not silently completed or discarded.\"],\"assignee\":null,\"completed_evidence\":[],\"depends_on\":[\"reproduce-dispatch-defect\",\"set-cash-guardrails\"],\"id\":\"agree-priority-rule\",\"inputs\":[\"deliverables/backlog-impact.csv\",\"deliverables/dispatch-reproduction.json\",\"deliverables/cash-guardrails.json\",\"starter/case/recovery.json\"],\"instructions\":\"Define severity ranking, oldest-first ties, blocked exclusions, deterministic identifiers, and capacity handling. Reconcile the policy with cash and customer-risk constraints before changing code.\",\"outputs\":[\"deliverables/triage-policy.json\"],\"state\":\"blocked\",\"team\":\"product-recovery\",\"title\":\"Agree the narrow recovery triage rule\"},{\"acceptance\":[\"Names unresolved risks, baseline/candidate differences, and a measurement plan for real future work.\",\"Claims no realized profit, completed customer recovery, live deployment, or external authority.\"],\"assignee\":null,\"completed_evidence\":[],\"depends_on\":[\"prepare-customer-drafts\",\"model-containment-options\"],\"id\":\"review-five-day-recovery\",\"inputs\":[\"deliverables/cash-reconciliation.json\",\"deliverables/recovery-regression-results.csv\",\"deliverables/support-sprint-plan.json\",\"deliverables/customer-drafts.md\",\"deliverables/message-review-routing.csv\",\"deliverables/containment-scenarios.json\",\"starter/ops/approval-gates.json\"],\"instructions\":\"Join cash diagnosis, candidate quality, the capacity plan, response drafts, and containment scenarios into a hold/rework/candidate recommendation. Document what new evidence is needed after any separately approved sprint.\",\"outputs\":[\"deliverables/recovery-decision.md\"],\"state\":\"blocked\",\"team\":\"product-recovery\",\"title\":\"Issue the bounded recovery decision\"}],\"team\":\"product-recovery\"}\n","path":"templates/teams/product-recovery/work/tasks.json","sha256":"0b025a2867bcc333ee34de1bab39527b2a148e1221d1f7bc4706835c7e12e9a8"}],"kind":"organization-seed","mission":"Bring finance, product recovery, engineering, operations, and customer success together around a distressed fictional subscription business. Reconcile the original synthetic financials, reproduce a real small dispatch defect, and plan a constrained recovery sprint without claiming realized savings or customer outcomes.","name":"The Turnaround Firm","organization":{"directory":"organization","scaffold":{"kind":"organization","mode":"hive","slug":"turnaround-firm","world_id":"demo-turnaround-firm"}},"protocol":"rapp-work/1","relatedSeeds":["enterprise-transformation-firm","product-launch-company"],"schema":"hive-hub-organization-seed/1","slug":"turnaround-firm","status":"seed-not-activated","tagline":"Join cash diagnosis to a bounded, testable recovery sprint.","tasks":[{"acceptance":["Reproduces opening 52000, receipts 48500, payments 68100, and closing 32400 USD.","Reports monthly net cash of -4000, -6600, and -9000 USD with the explicit fixture assumption that subscription billings were collected in-month.","Keeps incremental unpaid prior-period obligations outside the cash-ledger payments."],"assignee":null,"completed_evidence":[],"depends_on":[],"id":"reconcile-synthetic-cash","inputs":["starter/case/recovery.json","starter/data/cash-ledger.csv","starter/data/subscriptions.csv","starter/data/payables.csv","starter/tools/recovery.py","starter/tests/test_recovery.py"],"instructions":"Run the authored analysis utility and tests, reconcile every synthetic transaction to monthly plan counts, and distinguish cash receipts from general revenue-recognition claims.","outputs":["deliverables/cash-reconciliation.json"],"state":"ready","team":"finance","title":"Reconcile the three-month cash and subscription baseline"},{"acceptance":["Covers twelve open tickets, four urgent rows, and the one blocked urgent ticket.","Connects the dispatch behavior to delayed urgent work without inventing churn attribution or actual customer harm."],"assignee":null,"completed_evidence":[],"depends_on":[],"id":"map-backlog-impact","inputs":["starter/data/support-backlog.csv","starter/case/recovery.json","starter/quality/recovery-cases.csv"],"instructions":"Review ticket severity, age, affected-account counts, and dependencies. Do not sum overlapping affected-account counts into unique customers or assert that a support fix recovers revenue.","outputs":["deliverables/backlog-impact.csv"],"state":"ready","team":"product-recovery","title":"Map the authored backlog to recovery risk"},{"acceptance":["Shows the legacy first four as ticket-009, ticket-002, ticket-006, and ticket-012, all low priority.","Explains why string sorting places low before normal before urgent and shows the blocked row is excluded."],"assignee":null,"completed_evidence":[],"depends_on":["map-backlog-impact"],"id":"reproduce-dispatch-defect","inputs":["starter/product/dispatch.py","starter/tools/recovery.py","starter/tests/test_recovery.py","starter/quality/recovery-cases.csv","deliverables/backlog-impact.csv"],"instructions":"Run the small authored product dispatcher through the analysis utility and create a minimal reproduction. Keep this baseline fixture separate from any candidate fix.","outputs":["deliverables/dispatch-reproduction.json"],"state":"blocked","team":"engineering","title":"Reproduce severity alphabetization in the reference dispatcher"},{"acceptance":["Reserves USD 5500 and reports USD 26900 available before the USD 12000 floor.","Reports approximately 89.7 days to zero after reserves and 49.7 days to the floor using 30-day modeled months.","Does not treat these mechanical scenarios as a forecast guarantee, solvency opinion, trade, or authorized financial action."],"assignee":null,"completed_evidence":[],"depends_on":["reconcile-synthetic-cash"],"id":"set-cash-guardrails","inputs":["starter/case/recovery.json","starter/data/payables.csv","starter/ops/approval-gates.json","deliverables/cash-reconciliation.json"],"instructions":"Reserve the prior-period catch-up obligations and compute the repeated-September runway to zero and to the owner's cash floor. Specify review triggers and prohibit automatic spending or cost actions.","outputs":["deliverables/cash-guardrails.json"],"state":"blocked","team":"finance","title":"Set runway and authority guardrails"},{"acceptance":["Orders eligible urgent before normal before low; same-severity work is oldest first with deterministic ties.","Defines the non-preemptive fit rule and records that a larger deferred ticket is not silently completed or discarded."],"assignee":null,"completed_evidence":[],"depends_on":["reproduce-dispatch-defect","set-cash-guardrails"],"id":"agree-priority-rule","inputs":["deliverables/backlog-impact.csv","deliverables/dispatch-reproduction.json","deliverables/cash-guardrails.json","starter/case/recovery.json"],"instructions":"Define severity ranking, oldest-first ties, blocked exclusions, deterministic identifiers, and capacity handling. Reconcile the policy with cash and customer-risk constraints before changing code.","outputs":["deliverables/triage-policy.json"],"state":"blocked","team":"product-recovery","title":"Agree the narrow recovery triage rule"},{"acceptance":["Selects ticket-001, ticket-010, ticket-007, ticket-011, ticket-005, and ticket-008 for exactly 420 estimated minutes.","Retains one blocked and five capacity-deferred tickets; it reports no actual completion or resolution.","Keeps the separate 360-minute engineering budget distinct from support capacity."],"assignee":null,"completed_evidence":[],"depends_on":["agree-priority-rule"],"id":"plan-capacity-bounded-support","inputs":["starter/data/support-backlog.csv","starter/ops/recovery-sprint.csv","starter/tools/recovery.py","deliverables/triage-policy.json"],"instructions":"Run the candidate triage simulation under the approved-for-review policy and map the chosen work to the five-day sprint skeleton. Keep blocked and capacity-deferred tickets visible.","outputs":["deliverables/support-sprint-plan.json"],"state":"blocked","team":"operations","title":"Plan the 420-minute support slice"},{"acceptance":["Rejects unknown severities and invalid limits, excludes blocked/non-open work, and handles ties deterministically.","Returns ticket-001, ticket-010, ticket-007, and ticket-011 for the agreed four-item review batch.","Makes no network, persistence, customer, or billing changes."],"assignee":null,"completed_evidence":[],"depends_on":["agree-priority-rule"],"id":"repair-dispatch-candidate","inputs":["starter/product/dispatch.py","starter/tests/test_recovery.py","starter/quality/recovery-cases.csv","deliverables/triage-policy.json","deliverables/dispatch-reproduction.json"],"instructions":"Implement the agreed severity ranking in a candidate module with narrow tests. Preserve the authored defective baseline as reproduction evidence; do not deploy or execute work against real accounts.","outputs":["deliverables/dispatch-candidate.py","deliverables/dispatch-candidate-tests.py"],"state":"blocked","team":"engineering","title":"Produce a minimal dispatcher candidate"},{"acceptance":["Separates the intentionally failing legacy behavior from candidate pass/fail evidence.","Records blocked-ticket, zero-capacity, duplicate-ID, deterministic-tie, and unknown-severity cases.","Explicitly says production deployment and support execution have not occurred."],"assignee":null,"completed_evidence":[],"depends_on":["repair-dispatch-candidate","plan-capacity-bounded-support"],"id":"verify-recovery-handoff","inputs":["starter/quality/recovery-cases.csv","starter/ops/approval-gates.json","deliverables/dispatch-candidate.py","deliverables/dispatch-candidate-tests.py","deliverables/support-sprint-plan.json"],"instructions":"Execute the candidate's tests and replay the acceptance table against both the preserved baseline and candidate. Review capacity accounting and explain how an owner could hold the candidate without changing the reference.","outputs":["deliverables/recovery-regression-results.csv"],"state":"blocked","team":"operations","title":"Verify candidate queue behavior and rollback boundaries"},{"acceptance":["Covers urgent export failure, blocked reproduction, and low-priority cosmetic feedback with different truthful next steps.","Labels every draft unsent and requires owner review before any actual customer communication or refund commitment."],"assignee":null,"completed_evidence":[],"depends_on":["plan-capacity-bounded-support","set-cash-guardrails"],"id":"prepare-customer-drafts","inputs":["starter/ops/customer-response.md","starter/ops/approval-gates.json","deliverables/backlog-impact.csv","deliverables/support-sprint-plan.json","deliverables/cash-guardrails.json"],"instructions":"Adapt the supplied response policy into incident-class drafts and a review routing sheet. Refer only to synthetic ticket IDs and avoid promises of resolution time, refunds, recovered money, or completed fixes.","outputs":["deliverables/customer-drafts.md","deliverables/message-review-routing.csv"],"state":"blocked","team":"customer-success","title":"Prepare honest customer-response drafts"},{"acceptance":["Shows USD 9000 versus USD 7300 modeled monthly burn, a USD 1700 difference, and the associated cash-floor sensitivity.","Marks contractor and hosting changes unapproved and includes no actual cancellation, transfer, purchase, sale, trade, or profit claim."],"assignee":null,"completed_evidence":[],"depends_on":["verify-recovery-handoff","set-cash-guardrails"],"id":"model-containment-options","inputs":["starter/data/scenarios.csv","starter/tools/recovery.py","starter/ops/approval-gates.json","deliverables/cash-guardrails.json","deliverables/recovery-regression-results.csv"],"instructions":"Compare the repeated-September scenario to the supplied lower contractor/hosting assumption. Explain the approval and operational evidence needed, using regression results as a constraint rather than treating them as achieved financial value.","outputs":["deliverables/containment-scenarios.json"],"state":"blocked","team":"finance","title":"Model containment without claiming savings"},{"acceptance":["Names unresolved risks, baseline/candidate differences, and a measurement plan for real future work.","Claims no realized profit, completed customer recovery, live deployment, or external authority."],"assignee":null,"completed_evidence":[],"depends_on":["prepare-customer-drafts","model-containment-options"],"id":"review-five-day-recovery","inputs":["deliverables/cash-reconciliation.json","deliverables/recovery-regression-results.csv","deliverables/support-sprint-plan.json","deliverables/customer-drafts.md","deliverables/message-review-routing.csv","deliverables/containment-scenarios.json","starter/ops/approval-gates.json"],"instructions":"Join cash diagnosis, candidate quality, the capacity plan, response drafts, and containment scenarios into a hold/rework/candidate recommendation. Document what new evidence is needed after any separately approved sprint.","outputs":["deliverables/recovery-decision.md"],"state":"blocked","team":"product-recovery","title":"Issue the bounded recovery decision"}],"workspaceProfile":"rapp-work-sdk/1","workspaces":[{"directory":"workspaces/finance","id":"finance","name":"Finance and Runway","purpose":"Reconcile cash, reserve unpaid obligations, and separate scenario arithmetic from realized results.","role":"turnaround-finance-lead","scaffold":{"kind":"workspace","mode":"hive","slug":"turnaround-firm-finance","world_id":"demo-turnaround-firm"},"template":"templates/teams/finance"},{"directory":"workspaces/product-recovery","id":"product-recovery","name":"Product Recovery","purpose":"Connect support impact, scope, priority rules, and the final hold/rework decision.","role":"recovery-product-lead","scaffold":{"kind":"workspace","mode":"hive","slug":"turnaround-firm-product-recovery","world_id":"demo-turnaround-firm"},"template":"templates/teams/product-recovery"},{"directory":"workspaces/engineering","id":"engineering","name":"Engineering Recovery","purpose":"Reproduce and repair the authored priority-sorting defect with narrow regression coverage.","role":"recovery-engineer","scaffold":{"kind":"workspace","mode":"hive","slug":"turnaround-firm-engineering","world_id":"demo-turnaround-firm"},"template":"templates/teams/engineering"},{"directory":"workspaces/operations","id":"operations","name":"Operations","purpose":"Create capacity-bounded support work, validate handoff behavior, and retain blocked/deferred work.","role":"recovery-operations-lead","scaffold":{"kind":"workspace","mode":"hive","slug":"turnaround-firm-operations","world_id":"demo-turnaround-firm"},"template":"templates/teams/operations"},{"directory":"workspaces/customer-success","id":"customer-success","name":"Customer Success","purpose":"Prepare truthful, approval-gated response drafts and avoid unearned commitments or fabricated resolution claims.","role":"customer-recovery-lead","scaffold":{"kind":"workspace","mode":"hive","slug":"turnaround-firm-customer-success","world_id":"demo-turnaround-firm"},"template":"templates/teams/customer-success"},{"directory":"workspaces/casework","id":"casework","name":"Shared delivery case","purpose":"Own synthetic intake, shared inputs, and accepted deliverables.","role":"case-custodian","scaffold":{"kind":"workspace","mode":"hive","slug":"turnaround-firm-casework","world_id":"demo-turnaround-firm"},"template":"templates/casework"}]}
