{"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":77937,"mediaType":"application/zip","path":"api/hive-hub/v1/seeds/downloads/sha256/12/12f9c2805e88c0e7b1e0e512640347694e33d4f2d80e7ccd548533434ceb9df8.zip","ref":"sha256:12f9c2805e88c0e7b1e0e512640347694e33d4f2d80e7ccd548533434ceb9df8","sha256":"12f9c2805e88c0e7b1e0e512640347694e33d4f2d80e7ccd548533434ceb9df8","url":"https://kody-w.github.io/rapp-hive-hub/api/hive-hub/v1/seeds/downloads/sha256/12/12f9c2805e88c0e7b1e0e512640347694e33d4f2d80e7ccd548533434ceb9df8.zip"},"blueprintSha256":"b552b4df1ff24d8c6436b6b9c9f7d6ed10d4911689046d9b15c7b1fa8f8e74f4","case":{"brief":"SYNTHETIC production case: eight authored first-session records suggest confusion about four-beat bridge timing and undo. The starter game already works. Improve onboarding and readability without adding accounts, a backend, new mechanics, or an invented playtest result.","id":"first-shift-onboarding","inputs":["case/production.json","data/playtests.csv","design/rules.md","quality/acceptance.csv"],"success_criteria":["All three original boards are solvable by the deterministic engine and are playable with arrows or WASD, Space, U, and R.","A release candidate opens directly from disk with no fetches, CDN, trackers, storage, server, or dependency install.","Bridge and carrying state are conveyed by text/symbol as well as color; generated audio is off by default.","The synthetic baseline remains five completions out of eight, with five bridge stalls; no real improvement is claimed without new observation.","A producer records pass, rework, or hold against every supplied acceptance case before any separately approved publication."],"title":"Mosslight Courier: make the first bridge legible"},"classification":"public-synthetic","counts":{"packageFiles":34,"starterFiles":13,"tasks":10,"teams":7,"workspaces":8},"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":3409,"content":"# The Independent Game Studio\n\nRun a seven-team independent studio around Mosslight Courier, an original offline route puzzle. Turn synthetic first-session feedback into a bounded onboarding revision with playable source, readable art, opt-in sound, and reproducible regression evidence.\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**Mosslight Courier: make the first bridge legible**\n\nSYNTHETIC production case: eight authored first-session records suggest confusion about four-beat bridge timing and undo. The starter game already works. Improve onboarding and readability without adding accounts, a backend, new mechanics, or an invented playtest result.\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- **Production**: Own the first-shift scope, review gates, and a conditional release decision without claiming a shipped product.\n- **Game Design**: Specify understandable bridge, carrying, delivery, and undo rules within the existing three-board game.\n- **Game Engineering**: Maintain the deterministic engine and keyboard-first offline browser build.\n- **Art and Readability**: Create original high-contrast symbols and a small coherent visual asset system.\n- **Audio**: Specify restrained, opt-in, locally synthesized event cues with a silent fallback.\n- **Quality Assurance**: Check solvability, input handling, no-network behavior, accessibility limits, and regressions.\n- **Player Research**: Separate the synthetic feedback exercise from real observations and design the next consent-based playtest.\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":"579a9a7dadb603d9713dfff4dcfe3ce3f0491df83ae4cf7a337b66773341bab9"},{"bytes":4446,"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\":\"independent-game-studio\",\"world_id\":\"demo-independent-game-studio\"}},\"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/production\",\"id\":\"production\",\"name\":\"Production\",\"purpose\":\"Own the first-shift scope, review gates, and a conditional release decision without claiming a shipped product.\",\"role\":\"producer\",\"scaffold\":{\"kind\":\"workspace\",\"mode\":\"hive\",\"slug\":\"independent-game-studio-production\",\"world_id\":\"demo-independent-game-studio\"},\"template\":\"templates/teams/production\"},{\"directory\":\"workspaces/design\",\"id\":\"design\",\"name\":\"Game Design\",\"purpose\":\"Specify understandable bridge, carrying, delivery, and undo rules within the existing three-board game.\",\"role\":\"game-designer\",\"scaffold\":{\"kind\":\"workspace\",\"mode\":\"hive\",\"slug\":\"independent-game-studio-design\",\"world_id\":\"demo-independent-game-studio\"},\"template\":\"templates/teams/design\"},{\"directory\":\"workspaces/engineering\",\"id\":\"engineering\",\"name\":\"Game Engineering\",\"purpose\":\"Maintain the deterministic engine and keyboard-first offline browser build.\",\"role\":\"game-engineer\",\"scaffold\":{\"kind\":\"workspace\",\"mode\":\"hive\",\"slug\":\"independent-game-studio-engineering\",\"world_id\":\"demo-independent-game-studio\"},\"template\":\"templates/teams/engineering\"},{\"directory\":\"workspaces/art\",\"id\":\"art\",\"name\":\"Art and Readability\",\"purpose\":\"Create original high-contrast symbols and a small coherent visual asset system.\",\"role\":\"game-artist\",\"scaffold\":{\"kind\":\"workspace\",\"mode\":\"hive\",\"slug\":\"independent-game-studio-art\",\"world_id\":\"demo-independent-game-studio\"},\"template\":\"templates/teams/art\"},{\"directory\":\"workspaces/audio\",\"id\":\"audio\",\"name\":\"Audio\",\"purpose\":\"Specify restrained, opt-in, locally synthesized event cues with a silent fallback.\",\"role\":\"sound-designer\",\"scaffold\":{\"kind\":\"workspace\",\"mode\":\"hive\",\"slug\":\"independent-game-studio-audio\",\"world_id\":\"demo-independent-game-studio\"},\"template\":\"templates/teams/audio\"},{\"directory\":\"workspaces/quality\",\"id\":\"quality\",\"name\":\"Quality Assurance\",\"purpose\":\"Check solvability, input handling, no-network behavior, accessibility limits, and regressions.\",\"role\":\"qa-lead\",\"scaffold\":{\"kind\":\"workspace\",\"mode\":\"hive\",\"slug\":\"independent-game-studio-quality\",\"world_id\":\"demo-independent-game-studio\"},\"template\":\"templates/teams/quality\"},{\"directory\":\"workspaces/player-research\",\"id\":\"player-research\",\"name\":\"Player Research\",\"purpose\":\"Separate the synthetic feedback exercise from real observations and design the next consent-based playtest.\",\"role\":\"player-researcher\",\"scaffold\":{\"kind\":\"workspace\",\"mode\":\"hive\",\"slug\":\"independent-game-studio-player-research\",\"world_id\":\"demo-independent-game-studio\"},\"template\":\"templates/teams/player-research\"},{\"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\":\"independent-game-studio-casework\",\"world_id\":\"demo-independent-game-studio\"},\"template\":\"templates/casework\"}]}\n","path":"initialize.json","sha256":"896a41d4d308e06626df5d790c4caaf7a959ca43c7da5ac6e444cd7c3d9532cd"},{"bytes":5828,"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\":3409,\"path\":\"README.md\",\"sha256\":\"579a9a7dadb603d9713dfff4dcfe3ce3f0491df83ae4cf7a337b66773341bab9\"},{\"bytes\":4446,\"path\":\"initialize.json\",\"sha256\":\"896a41d4d308e06626df5d790c4caaf7a959ca43c7da5ac6e444cd7c3d9532cd\"},{\"bytes\":706,\"path\":\"templates/casework/work/ACCEPTANCE.md\",\"sha256\":\"b6b6df43029a9400a9544a55d1d198148159709465e374ead49ea0a8fc73a471\"},{\"bytes\":1183,\"path\":\"templates/casework/work/intake.json\",\"sha256\":\"e986a93654c4a62c47ac1a16f2fa7c31fbb0d7d259e0b7531410a1036e1d32ee\"},{\"bytes\":2509,\"path\":\"templates/casework/work/starter/README.md\",\"sha256\":\"46ee4f248c925a89cfd10a5e40d1b08b83056b78347b55fade1c50f0c6462955\"},{\"bytes\":942,\"path\":\"templates/casework/work/starter/art/courier.svg\",\"sha256\":\"d3ddc732db36f9ac80107d16c01a6144cc8619f58cf7f9f7daafbd497848fcd2\"},{\"bytes\":557,\"path\":\"templates/casework/work/starter/art/palette.json\",\"sha256\":\"fa5918e483d34455c6c28cd7c36506e8a68e6b7af6b1a577181a611dbe750306\"},{\"bytes\":315,\"path\":\"templates/casework/work/starter/audio/cue-sheet.csv\",\"sha256\":\"ece509c51adf268579b41bff043c115a1e56d6560cf8208b37accfc57fdb0106\"},{\"bytes\":954,\"path\":\"templates/casework/work/starter/case/production.json\",\"sha256\":\"c59e5c52e0c4518259a3bba00d94422d048abe131206447835b349d406324306\"},{\"bytes\":842,\"path\":\"templates/casework/work/starter/data/playtests.csv\",\"sha256\":\"bcc97d333c7caa6f943054067953b6f5046b393e4c59619b1d35e57def17fdb8\"},{\"bytes\":2116,\"path\":\"templates/casework/work/starter/design/rules.md\",\"sha256\":\"4480e1d46ecab9dd1e42aaffe8c6581f11d7d714171fb176b469de4989382160\"},{\"bytes\":7947,\"path\":\"templates/casework/work/starter/game/game.js\",\"sha256\":\"cf25b74128b27dc88d6e3e0702f67aca395231d366c9b68774dc907026da5650\"},{\"bytes\":5576,\"path\":\"templates/casework/work/starter/game/index.html\",\"sha256\":\"1470e507e86105ffa7a9768647a8891f4a72a412802226a4c0fa9199ae74421d\"},{\"bytes\":1520,\"path\":\"templates/casework/work/starter/ops/release-checklist.md\",\"sha256\":\"d9d71fbc3a74e102e18edad57bca24dda99bd8a32e2299c09e47ca97b2bda9ad\"},{\"bytes\":1905,\"path\":\"templates/casework/work/starter/quality/acceptance.csv\",\"sha256\":\"664b48a7230ee0cddbd73b4c4a08e883eb45807f0f75e30e095edda9e9820733\"},{\"bytes\":8569,\"path\":\"templates/casework/work/starter/tests/game.test.js\",\"sha256\":\"756830905b12acafaf1e064b222a4468db816e17ac41130ee5d67fad46bd56f1\"},{\"bytes\":2588,\"path\":\"templates/casework/work/starter/tools/feedback_report.py\",\"sha256\":\"397464736d015c71a41a37f15ed10d1efb79a79027c2ab6a66c072844b1af667\"},{\"bytes\":8334,\"path\":\"templates/casework/work/task-board.json\",\"sha256\":\"b75a4c6f4aa307d889816913ee56b4a29fe35d4065072eb51f616f3bb0d6e2e4\"},{\"bytes\":348,\"path\":\"templates/teams/art/work/TEAM.md\",\"sha256\":\"5008ce31d5e2835502c1aa88177e54a75b2290a9c1f5746e1217dd9140fc46d7\"},{\"bytes\":852,\"path\":\"templates/teams/art/work/tasks.json\",\"sha256\":\"1167666198dffaa61509cb1a460c5b8b39600a7045d4adf5ed2f7ef34a5f0238\"},{\"bytes\":340,\"path\":\"templates/teams/audio/work/TEAM.md\",\"sha256\":\"7175778143da20aaabf836f27df477de88089051026a2cfbf8a1bcfbd8012f5d\"},{\"bytes\":780,\"path\":\"templates/teams/audio/work/tasks.json\",\"sha256\":\"eef4cfc0b8100a3529dc24b7cce24ee3dbdc1d610c9a76c59e475dcc025b6c02\"},{\"bytes\":366,\"path\":\"templates/teams/design/work/TEAM.md\",\"sha256\":\"aa7ec59e9a4164cd637f550608814508e3e08fd02d17e099d447ba7ddd714ae2\"},{\"bytes\":857,\"path\":\"templates/teams/design/work/tasks.json\",\"sha256\":\"3a1eccde17dc84996c1931220455178a4e2a34680b7a840345d6800f5058482d\"},{\"bytes\":343,\"path\":\"templates/teams/engineering/work/TEAM.md\",\"sha256\":\"8c863689e602a8b15072e1616668076690d8dd60b2141d8a048f698c7c9abf77\"},{\"bytes\":1142,\"path\":\"templates/teams/engineering/work/tasks.json\",\"sha256\":\"68411f13db9d3d8fd2d99598230e089d24d974a8862002ecd480b814b8b038e7\"},{\"bytes\":378,\"path\":\"templates/teams/player-research/work/TEAM.md\",\"sha256\":\"39f4d5e96db515f1285e107dad5d7b3f9ba9b0e98c1ff0556ce54dc58be94d41\"},{\"bytes\":1757,\"path\":\"templates/teams/player-research/work/tasks.json\",\"sha256\":\"fb2794da4735ffaf31579b6f5a7f97af6f00bf78e712590b716783fcf6c27494\"},{\"bytes\":368,\"path\":\"templates/teams/production/work/TEAM.md\",\"sha256\":\"1cdc728ea2b1c9cf230f15f72f51abcfc3838bbf213aadca67f15f3b3af5329f\"},{\"bytes\":1669,\"path\":\"templates/teams/production/work/tasks.json\",\"sha256\":\"88d492a1df75991a940e0088a5ca75ff68ee6bd3b8195a1dadee116c087750d3\"},{\"bytes\":357,\"path\":\"templates/teams/quality/work/TEAM.md\",\"sha256\":\"7353963ad8414915dcfac4aa5a536f2f64f5456542f74a2076dd452c9d40b4c8\"},{\"bytes\":1779,\"path\":\"templates/teams/quality/work/tasks.json\",\"sha256\":\"98cd7b0910c12c34e6bf0281d3d47c6d45932990d3b156bc8d211374c29059a0\"}],\"license\":\"MIT\",\"name\":\"The Independent Game Studio\",\"protocol\":\"rapp-work/1\",\"related_seeds\":[\"product-launch-company\"],\"schema\":\"hive-hub-organization-seed-manifest/1\",\"slug\":\"independent-game-studio\",\"status\":\"seed-not-activated\",\"workspace_profile\":\"rapp-work-sdk/1\",\"world_id\":\"demo-independent-game-studio\"}\n","path":"seed.json","sha256":"438b49e2b2ba4b40a603daf32533693fadbaef88645b95313673cd4d47eebf5b"},{"bytes":706,"content":"# Case acceptance\n\n- All three original boards are solvable by the deterministic engine and are playable with arrows or WASD, Space, U, and R.\n- A release candidate opens directly from disk with no fetches, CDN, trackers, storage, server, or dependency install.\n- Bridge and carrying state are conveyed by text/symbol as well as color; generated audio is off by default.\n- The synthetic baseline remains five completions out of eight, with five bridge stalls; no real improvement is claimed without new observation.\n- A producer records pass, rework, or hold against every supplied acceptance case before any separately approved publication.\n\nNo reference artifact counts as completed work without review.\n","path":"templates/casework/work/ACCEPTANCE.md","sha256":"b6b6df43029a9400a9544a55d1d198148159709465e374ead49ea0a8fc73a471"},{"bytes":1183,"content":"{\"brief\":\"SYNTHETIC production case: eight authored first-session records suggest confusion about four-beat bridge timing and undo. The starter game already works. Improve onboarding and readability without adding accounts, a backend, new mechanics, or an invented playtest result.\",\"classification\":\"public-synthetic\",\"id\":\"first-shift-onboarding\",\"inputs\":[\"starter/case/production.json\",\"starter/data/playtests.csv\",\"starter/design/rules.md\",\"starter/quality/acceptance.csv\"],\"success_criteria\":[\"All three original boards are solvable by the deterministic engine and are playable with arrows or WASD, Space, U, and R.\",\"A release candidate opens directly from disk with no fetches, CDN, trackers, storage, server, or dependency install.\",\"Bridge and carrying state are conveyed by text/symbol as well as color; generated audio is off by default.\",\"The synthetic baseline remains five completions out of eight, with five bridge stalls; no real improvement is claimed without new observation.\",\"A producer records pass, rework, or hold against every supplied acceptance case before any separately approved publication.\"],\"title\":\"Mosslight Courier: make the first bridge legible\"}\n","path":"templates/casework/work/intake.json","sha256":"e986a93654c4a62c47ac1a16f2fa7c31fbb0d7d259e0b7531410a1036e1d32ee"},{"bytes":2509,"content":"# Mosslight Courier — independent studio seed\n\nAll production/client/research data here is **SYNTHETIC**, authored for this\npublic seed. The original game is real playable source; its fictional studio\nhas not shipped a release or observed any players.\n\n## Play now, offline\n\nOpen `game/index.html` directly in a current browser. No server, install,\naccount, CDN, network, analytics, or saved data is used.\n\n- Focus the board with Tab or the **Focus board** button.\n- Arrows / WASD: one tile per press. Space: wait one beat.\n- U / Backspace: undo a successful action. R: restart this board.\n- Carry one glow cell from D to each unlit beacon ○. Return to D to reload.\n- Bridges admit entry on beats 1–2 of a repeating four-beat cycle. Blocked\n  moves cost nothing. You can leave a bridge even when it closes beneath you.\n- Clear all three beacons to win. The board selector offers three original\n  puzzles. Sound is optional and synthesized locally after opt-in.\n\n## Reproduce the reference\n\nFrom this package's `files/` directory:\n\n```text\nnode tests/game.test.js\npython3 -I -B tools/feedback_report.py --self-test\npython3 -I -B tools/feedback_report.py\n```\n\nTests exercise the same engine and real keyboard/click handlers used by the\nbrowser, including a breadth-first solver for every board and a minimal DOM\ntest double. The runner works under both CommonJS and ES-module host projects\nwithout a package manifest. It does **not** claim a real browser, screen-reader,\nor real-player test. The feedback report reads the eight authored\nrecords: five completions, five bridge stalls, three undo discoveries, and\n54.4 mean actions among completed sessions.\n\n## Start the organization\n\nThe blueprint's seven teams own a two-day bridge-onboarding revision. Start\nwith the production scope and synthetic-feedback baseline, then branch into\ndesign, art, audio, implementation, QA, and a prospective research plan.\nReference files are inputs, not completed task outputs.\n\nCurrent limitations: three fixed boards, no persistence, no touch swipe\ngesture, no localization, a bounded 256-action undo history, and only simple\ntones. Direction buttons also work by touch/click. Screen-reader play needs\nmanual review: the board exposes tile labels and live status, but this is not\na claim of full accessibility conformance. There is no timer, enemy, monetization,\nmultiplayer, external telemetry, or production RAPP runtime. Independent\norganizations are discovery-only candidates; external effects require approval.\n","path":"templates/casework/work/starter/README.md","sha256":"46ee4f248c925a89cfd10a5e40d1b08b83056b78347b55fade1c50f0c6462955"},{"bytes":942,"content":"<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 96 96\" role=\"img\" aria-labelledby=\"title desc\">\n  <title id=\"title\">Mosslight courier</title>\n  <desc id=\"desc\">Original mint diamond courier with two eyes and a gold lantern.</desc>\n  <rect width=\"96\" height=\"96\" rx=\"20\" fill=\"#1c3429\"/>\n  <path d=\"M48 9 81 44 48 83 15 44Z\" fill=\"#b7edac\" stroke=\"#e9f6e4\" stroke-width=\"3\"/>\n  <path d=\"M26 67 19 83M61 70 70 85\" fill=\"none\" stroke=\"#b7edac\" stroke-width=\"6\" stroke-linecap=\"round\"/>\n  <circle cx=\"37\" cy=\"40\" r=\"4\" fill=\"#14251f\"/><circle cx=\"57\" cy=\"40\" r=\"4\" fill=\"#14251f\"/>\n  <path d=\"M40 53q8 7 16 0M67 54l12 5\" fill=\"none\" stroke=\"#14251f\" stroke-width=\"3\" stroke-linecap=\"round\"/>\n  <path d=\"M78 58v-7q0-5 5-5t5 5v7\" fill=\"none\" stroke=\"#f5cf71\" stroke-width=\"3\"/>\n  <rect x=\"75\" y=\"57\" width=\"16\" height=\"22\" rx=\"4\" fill=\"#f5cf71\" stroke=\"#14251f\" stroke-width=\"2\"/>\n  <path d=\"m83 61-4 8h4l-1 6 6-9h-5Z\" fill=\"#14251f\"/>\n</svg>\n","path":"templates/casework/work/starter/art/courier.svg","sha256":"d3ddc732db36f9ac80107d16c01a6144cc8619f58cf7f9f7daafbd497848fcd2"},{"bytes":557,"content":"{\n  \"classification\":\"ORIGINAL-AUTHORED-ASSET\",\n  \"palette\":{\"night\":\"#14251f\",\"panel\":\"#1c3429\",\"ink\":\"#e9f6e4\",\"courier\":\"#b7edac\",\"depot\":\"#e5ba61\",\"bridge_open\":\"#bddee4\",\"bridge_closed\":\"#5a4141\"},\n  \"symbols\":{\"courier\":\"◆\",\"depot\":\"D\",\"beacon_unlit\":\"○\",\"beacon_lit\":\"★\",\"bridge_open\":\"=\",\"bridge_closed\":\"×\"},\n  \"rules\":[\"Never convey bridge availability using hue alone.\",\"Keep visible text for carrying and delivery counts.\",\"No external font or icon dependency.\"],\n  \"review_state\":\"reference-palette-not-an-accessibility-certification\"\n}\n","path":"templates/casework/work/starter/art/palette.json","sha256":"fa5918e483d34455c6c28cd7c36506e8a68e6b7af6b1a577181a611dbe750306"},{"bytes":315,"content":"event,waveform,frequency_hz,duration_ms,peak_gain,text_fallback,classification\nblocked,sine,150,130,0.03,Blocked; no beat spent,SYNTHETIC\nloaded,sine,440,130,0.03,Reloaded at depot,SYNTHETIC\ndelivered,sine,660,130,0.03,Beacon lit; return to D,SYNTHETIC\nwon,sine,880,130,0.03,All three greenhouses are lit,SYNTHETIC\n","path":"templates/casework/work/starter/audio/cue-sheet.csv","sha256":"ece509c51adf268579b41bff043c115a1e56d6560cf8208b37accfc57fdb0106"},{"bytes":954,"content":"{\n  \"classification\": \"SYNTHETIC\",\n  \"case_id\": \"first-shift-onboarding\",\n  \"game\": \"Mosslight Courier\",\n  \"fictional_studio\": \"Small Lantern Cooperative\",\n  \"timebox_working_days\": 2,\n  \"build_state\": \"working-reference-not-a-shipped-release\",\n  \"problem\": \"The authored first-session exercise concentrates confusion around bridge timing and the existence of undo.\",\n  \"in_scope\": [\"first-minute instructions\", \"bridge phase text\", \"carry/reload indicators\", \"original state symbols\", \"optional short tones\", \"regression coverage\"],\n  \"out_of_scope\": [\"new levels\", \"new mechanics\", \"accounts\", \"telemetry\", \"remote assets\", \"monetization\", \"claims of real player validation\"],\n  \"research_policy\": \"All included sessions are synthetic. Recruitment, consent, collection, and publication are separate owner-approved work.\",\n  \"decision_gate\": \"A candidate recommendation requires rule tests plus explicit reporting of manual checks that remain unrun.\"\n}\n","path":"templates/casework/work/starter/case/production.json","sha256":"c59e5c52e0c4518259a3bba00d94422d048abe131206447835b349d406324306"},{"bytes":842,"content":"session_id,board,completed,actions,bridge_stall,discovered_undo,confidence_1_to_5,authored_note,classification\nsynthetic-p-01,Loading Lane,1,54,1,0,3,Expected closed bridge to open after a blocked move,SYNTHETIC\nsynthetic-p-02,Loading Lane,0,36,1,0,2,Did not notice the wait button,SYNTHETIC\nsynthetic-p-03,Loading Lane,1,48,0,1,4,Used undo after an empty return trip,SYNTHETIC\nsynthetic-p-04,Loading Lane,1,62,1,0,3,Understood carrying after second depot visit,SYNTHETIC\nsynthetic-p-05,Loading Lane,0,28,1,0,1,Read bridge color but missed next-action text,SYNTHETIC\nsynthetic-p-06,Loading Lane,1,50,0,1,4,Planned return route using undo,SYNTHETIC\nsynthetic-p-07,Loading Lane,1,58,0,1,4,Finished but asked whether cells were unlimited,SYNTHETIC\nsynthetic-p-08,Loading Lane,0,41,1,0,2,Assumed the bridge would open with elapsed time,SYNTHETIC\n","path":"templates/casework/work/starter/data/playtests.csv","sha256":"bcc97d333c7caa6f943054067953b6f5046b393e4c59619b1d35e57def17fdb8"},{"bytes":2116,"content":"# Mosslight Courier rules and production baseline\n\nOriginal authored game design; all business and playtest context is SYNTHETIC.\n\n## Deterministic contract\n\nThe board is nine columns by seven rows. A courier begins at D with one cell,\nzero successful actions, no lit beacons, and bridge beat 1. Each board has\nexactly one depot and three beacons. Each legal movement or wait advances\nthe action count by one. Bridge availability is evaluated **before** the action:\n`turn % 4 < 2` means open. Walls and entry into a closed bridge block movement\nand consume no action. Leaving or waiting on a bridge is legal when it closes.\n\nEntering an unlit beacon with a cell lights it and empties the carrier.\nEntering D empty reloads automatically. Lit beacons remain traversable.\nThe third delivery wins. Further move/wait actions do nothing after a win;\nundo and restart remain available. Undo restores position, count, carrying,\nand delivered set, including undoing a win. The latest 256 successful actions\nare retained; restart or changing boards clears history.\n\n## Specific first-shift production question\n\nCan a player predict a bridge entry from the next-action text without guessing?\nThe synthetic records suggest five bridge stalls, but do not demonstrate real\nusability. The work is an onboarding/readability pass, not a new-mechanics\nprototype. Preserve the authored layouts and engine semantics.\n\nState-example review pairs:\n\n| Before | Action | After |\n|---|---|---|\n| Adjacent to bridge; turn 1 | Enter bridge | Legal; turn 2; now closed under courier |\n| On bridge; turn 2 | Leave to path | Legal; turn 3 |\n| Adjacent to bridge; turn 2 | Enter bridge | Blocked; still turn 2 |\n| Adjacent to bridge; turn 3 | Wait | Turn 4; next action opens |\n| Empty at a path beside D | Enter D | Carrying one; one action spent |\n| Carrying at last unlit beacon's neighbor | Enter beacon | All lit; win |\n\nThere is no randomness, timer, score leaderboard, combat, copied character,\nexternal content, or hidden information. The only efficiency measure is\nsuccessful action count; undo is intentional, not a competitive exploit.\n","path":"templates/casework/work/starter/design/rules.md","sha256":"4480e1d46ecab9dd1e42aaffe8c6581f11d7d714171fb176b469de4989382160"},{"bytes":7947,"content":"(function (root) {\n  \"use strict\";\n  const levels = [\n    {name: \"Loading Lane\", rows: [\"#########\", \"#D..#..o#\", \"#.#.#.#.#\", \"#...~...#\", \"#.#.#.#.#\", \"#o..#..o#\", \"#########\"]},\n    {name: \"Greenhouse Loop\", rows: [\"#########\", \"#D..#..o#\", \"#.#.~.#.#\", \"#o#.#...#\", \"#.#.~.#.#\", \"#...#..o#\", \"#########\"]},\n    {name: \"Evening Annex\", rows: [\"#########\", \"#o..#..o#\", \"#.#.~.#.#\", \"#...#...#\", \"###.~.###\", \"#D..#..o#\", \"#########\"]}\n  ];\n  const directions = {up: [0, -1], down: [0, 1], left: [-1, 0], right: [1, 0]};\n  const events = {\n    start: \"Your shift begins with one glow cell.\",\n    moved: \"Moved.\",\n    wait: \"Waited one beat.\",\n    blocked: \"Blocked. No beat spent; try another direction or wait.\",\n    loaded: \"Reloaded at the depot.\",\n    delivered: \"Beacon lit! Return to D for another cell.\",\n    won: \"All three greenhouses are lit. Shift complete!\",\n    undo: \"Last successful action undone.\"\n  };\n  function bridgeOpen(state) { return state.turn % 4 < 2; }\n  function keyAction(key) {\n    const keys = {arrowup: \"up\", w: \"up\", arrowdown: \"down\", s: \"down\", arrowleft: \"left\", a: \"left\", arrowright: \"right\", d: \"right\", \" \": \"wait\", u: \"undo\", backspace: \"undo\", r: \"restart\"};\n    return keys[String(key).toLowerCase()] || null;\n  }\n  function createState(levelIndex = 0) {\n    if (!Number.isInteger(levelIndex) || levelIndex < 0 || levelIndex >= levels.length) throw new RangeError(\"Unknown board\");\n    const rows = levels[levelIndex].rows;\n    const y = rows.findIndex(row => row.includes(\"D\"));\n    return {levelIndex, x: rows[y].indexOf(\"D\"), y, turn: 0, carrying: true, delivered: [], won: false, lastEvent: \"start\"};\n  }\n  function advance(state, action) {\n    if (state.won || (!directions[action] && action !== \"wait\")) return state;\n    const rows = levels[state.levelIndex].rows;\n    const [dx, dy] = directions[action] || [0, 0];\n    const x = state.x + dx, y = state.y + dy;\n    const tile = rows[y] && rows[y][x];\n    if (!tile || tile === \"#\" || (action !== \"wait\" && tile === \"~\" && !bridgeOpen(state))) {\n      return {...state, lastEvent: \"blocked\"};\n    }\n    const next = {...state, x, y, turn: state.turn + 1, delivered: [...state.delivered], lastEvent: action === \"wait\" ? \"wait\" : \"moved\"};\n    if (tile === \"D\" && !next.carrying) {\n      next.carrying = true;\n      next.lastEvent = \"loaded\";\n    }\n    const target = `${x},${y}`;\n    if (tile === \"o\" && next.carrying && !next.delivered.includes(target)) {\n      next.delivered.push(target);\n      next.delivered.sort();\n      next.carrying = false;\n      next.lastEvent = \"delivered\";\n    }\n    const targetCount = rows.join(\"\").split(\"o\").length - 1;\n    if (next.delivered.length === targetCount) {\n      next.won = true;\n      next.lastEvent = \"won\";\n    }\n    return next;\n  }\n  function createController(levelIndex = 0) {\n    let state = createState(levelIndex), history = [];\n    return {\n      get state() { return state; },\n      get undoCount() { return history.length; },\n      setLevel(index) { state = createState(index); history = []; return state; },\n      act(action) {\n        if (action === \"restart\") { state = createState(state.levelIndex); history = []; }\n        else if (action === \"undo\") {\n          if (history.length) state = {...history.pop(), lastEvent: \"undo\"};\n        } else {\n          const next = advance(state, action);\n          if (next.turn !== state.turn) {\n            history.push(state);\n            if (history.length > 256) history.shift();\n          }\n          state = next;\n        }\n        return state;\n      }\n    };\n  }\n  function summary(state) {\n    return `${events[state.lastEvent]} Position row ${state.y + 1}, column ${state.x + 1}. ${state.delivered.length}/3 beacons lit. ${state.carrying ? \"Carrying one cell\" : \"Empty; reload at D\"}. ${state.turn} actions. Next action: beat ${state.turn % 4 + 1}/4, bridge ${bridgeOpen(state) ? \"OPEN =\" : \"CLOSED ×\"}.`;\n  }\n  function mount(doc) {\n    const board = doc.getElementById(\"board\");\n    const status = doc.getElementById(\"status\");\n    const selector = doc.getElementById(\"level\");\n    const sound = doc.getElementById(\"sound\");\n    const controller = createController();\n    let audioContext;\n    function tone(event) {\n      if (!sound.checked) return;\n      const Audio = doc.defaultView.AudioContext || doc.defaultView.webkitAudioContext;\n      if (!Audio) return;\n      try {\n        audioContext = audioContext || new Audio();\n        if (audioContext.state === \"suspended\") audioContext.resume().catch(() => {});\n        const frequencies = {blocked: 150, loaded: 440, delivered: 660, won: 880};\n        if (!frequencies[event]) return;\n        const oscillator = audioContext.createOscillator(), gain = audioContext.createGain();\n        oscillator.frequency.value = frequencies[event];\n        gain.gain.setValueAtTime(0.03, audioContext.currentTime);\n        gain.gain.exponentialRampToValueAtTime(0.001, audioContext.currentTime + 0.12);\n        oscillator.connect(gain); gain.connect(audioContext.destination);\n        oscillator.start(); oscillator.stop(audioContext.currentTime + 0.13);\n      } catch (_) { /* Audio is optional; gameplay and text remain available. */ }\n    }\n    function render() {\n      const state = controller.state, fragment = doc.createDocumentFragment();\n      levels[state.levelIndex].rows.forEach((row, y) => Array.from(row).forEach((tile, x) => {\n        const cell = doc.createElement(\"span\");\n        const delivered = state.delivered.includes(`${x},${y}`);\n        const names = {\"#\": \"wall\", \".\": \"path\", D: \"depot\", o: delivered ? \"lit beacon\" : \"unlit beacon\", \"~\": bridgeOpen(state) ? \"open bridge\" : \"closed bridge\"};\n        cell.className = \"tile\";\n        if (tile === \"#\") cell.classList.add(\"wall\");\n        if (tile === \"D\") cell.classList.add(\"depot\");\n        if (tile === \"o\") cell.classList.add(delivered ? \"delivered\" : \"target\");\n        if (tile === \"~\") {\n          cell.classList.add(\"bridge\");\n          if (!bridgeOpen(state)) cell.classList.add(\"closed\");\n        }\n        const player = state.x === x && state.y === y;\n        if (player) cell.classList.add(\"player\");\n        cell.textContent = {\"#\": \"·\", \".\": \"\", D: \"D\", o: delivered ? \"★\" : \"○\", \"~\": bridgeOpen(state) ? \"=\" : \"×\"}[tile];\n        cell.setAttribute(\"aria-label\", `Row ${y + 1}, column ${x + 1}: ${names[tile]}${player ? \", courier here\" : \"\"}`);\n        fragment.appendChild(cell);\n      }));\n      board.replaceChildren(fragment);\n      status.textContent = summary(state);\n    }\n    function act(action) {\n      const before = controller.state;\n      controller.act(action);\n      if (controller.state !== before) tone(controller.state.lastEvent);\n      render();\n    }\n    levels.forEach((level, index) => {\n      const option = doc.createElement(\"option\");\n      option.value = String(index); option.textContent = `${index + 1}. ${level.name}`;\n      selector.appendChild(option);\n    });\n    selector.addEventListener(\"change\", () => { controller.setLevel(Number(selector.value)); render(); board.focus(); });\n    doc.getElementById(\"focus\").addEventListener(\"click\", () => board.focus());\n    board.addEventListener(\"keydown\", event => {\n      const action = keyAction(event.key);\n      if (!action || event.altKey || event.ctrlKey || event.metaKey) return;\n      event.preventDefault();\n      if (!event.repeat) act(action);\n    });\n    doc.querySelectorAll(\"[data-action]\").forEach(button => button.addEventListener(\"click\", () => { act(button.dataset.action); board.focus(); }));\n    render();\n    return controller;\n  }\n  const api = {levels, bridgeOpen, keyAction, createState, advance, createController, summary, mount};\n  if (typeof module === \"object\" && module.exports) module.exports = api;\n  else root.MosslightCourier = api;\n  if (root.document) root.addEventListener(\"DOMContentLoaded\", () => mount(root.document));\n}(typeof globalThis === \"object\" ? globalThis : this));\n","path":"templates/casework/work/starter/game/game.js","sha256":"cf25b74128b27dc88d6e3e0702f67aca395231d366c9b68774dc907026da5650"},{"bytes":5576,"content":"<!doctype html>\n<html lang=\"en\">\n<head>\n  <meta charset=\"utf-8\">\n  <meta name=\"viewport\" content=\"width=device-width,initial-scale=1\">\n  <meta http-equiv=\"Content-Security-Policy\" content=\"default-src 'none'; script-src 'self'; style-src 'unsafe-inline'; img-src 'self' data:; connect-src 'none'; font-src 'none'; media-src 'none'; object-src 'none'; base-uri 'none'; form-action 'none'\">\n  <title>Mosslight Courier · an offline route puzzle</title>\n  <style>\n    :root{color-scheme:dark;--ink:#e9f6e4;--night:#14251f;--moss:#264c39;--mint:#b7edac;--gold:#f5cf71}\n    *{box-sizing:border-box}body{margin:0;background:var(--night);color:var(--ink);font:16px/1.5 system-ui,sans-serif}\n    main{max-width:980px;margin:auto;padding:24px}header{display:flex;gap:18px;align-items:center}header img{width:76px;height:76px}\n    h1{margin:0;font-size:clamp(1.7rem,5vw,2.8rem);line-height:1.2}p{margin:.65rem 0}.eyebrow{color:var(--gold);letter-spacing:.1em;text-transform:uppercase;font-size:.8rem}\n    .layout{display:grid;grid-template-columns:minmax(240px,1.5fr) minmax(220px,1fr);gap:24px;margin-top:20px}\n    .panel{background:#1c3429;padding:18px;border:1px solid #63846d;border-radius:16px}\n    label{display:block;margin:10px 0}button,select{font:inherit;color:var(--ink);background:#294835;border:1px solid #b7edac;border-radius:7px;padding:8px 12px;cursor:pointer}\n    button:focus-visible,select:focus-visible,#board:focus-visible{outline:3px solid var(--gold);outline-offset:4px}\n    #board{display:grid;grid-template-columns:repeat(9,1fr);gap:3px;aspect-ratio:9/7;margin:16px 0;border-radius:8px}\n    .tile{display:flex;align-items:center;justify-content:center;font-weight:800;font-size:clamp(14px,3.5vw,26px);background:#345c41;border:1px solid #648470;border-radius:4px;position:relative}\n    .wall{background:#0c1814;color:#54715d;border-color:#223c2e}.depot{background:#e5ba61;color:#241d0d}.target{color:#fff5c9;border:2px solid #f5cf71}\n    .delivered{background:#8fd798;color:#13291d}.bridge{background:#bddee4;color:#122d36;border-style:dashed}.closed{background:#5a4141;color:#ffe8e8}\n    .player::after{content:\"◆\";position:absolute;inset:0;display:flex;align-items:center;justify-content:center;color:#102920;background:#d2ffbd;border:3px solid #fff;border-radius:50%;margin:3px}\n    .controls{display:flex;flex-wrap:wrap;gap:8px;margin:12px 0}#status{min-height:5.4em;padding:12px;background:#10271d;border-left:4px solid var(--gold)}\n    kbd{font:inherit;font-size:.88em;padding:1px 5px;border:1px solid #9bb69e;border-radius:4px;white-space:nowrap}\n    ul{padding-left:20px}small,.muted{color:#bed0bc}footer{margin-top:22px;border-top:1px solid #587760;padding-top:12px}\n    @media(max-width:700px){.layout{grid-template-columns:1fr}main{padding:14px}.tile{font-size:clamp(17px,5vw,29px)}}\n    @media(prefers-reduced-motion:reduce){*{scroll-behavior:auto}}\n  </style>\n  <script defer src=\"game.js\"></script>\n</head>\n<body>\n<main>\n  <header><img src=\"../art/courier.svg\" alt=\"An original diamond-shaped moss courier carrying a lantern\"><div><div class=\"eyebrow\">A small, original offline puzzle</div><h1>Mosslight Courier</h1><p>One glow cell. Three quiet greenhouses. Find your route.</p></div></header>\n  <div class=\"layout\">\n    <section class=\"panel\" aria-label=\"Game\">\n      <label for=\"level\">Board <select id=\"level\"></select></label>\n      <button id=\"focus\" type=\"button\">Focus board</button>\n      <div id=\"board\" tabindex=\"0\" role=\"group\" aria-label=\"Nine-column, seven-row puzzle board\" aria-describedby=\"keys status\"></div>\n      <p id=\"status\" role=\"status\" aria-live=\"polite\" aria-atomic=\"true\">Loading local game…</p>\n      <div class=\"controls\" aria-label=\"Move controls\">\n        <button type=\"button\" data-action=\"up\" aria-label=\"Move up\">↑</button><button type=\"button\" data-action=\"left\" aria-label=\"Move left\">←</button><button type=\"button\" data-action=\"down\" aria-label=\"Move down\">↓</button><button type=\"button\" data-action=\"right\" aria-label=\"Move right\">→</button>\n        <button type=\"button\" data-action=\"wait\">Wait</button><button type=\"button\" data-action=\"undo\">Undo</button><button type=\"button\" data-action=\"restart\">Restart</button>\n      </div>\n      <label><input id=\"sound\" type=\"checkbox\"> Optional locally generated sound</label>\n    </section>\n    <aside class=\"panel\">\n      <h2>Your first shift</h2>\n      <p>Deliver a glow cell to every <strong>○ beacon</strong>. You carry only one. Return to the <strong>D depot</strong> to reload automatically.</p>\n      <p>The <strong>= bridge</strong> opens for beats 1–2, then closes for beats 3–4. Enter only while open. You can always leave a bridge beneath your feet. Watch the <strong>next-action</strong> phase in the status.</p>\n      <p id=\"keys\"><kbd>Arrows</kbd> / <kbd>WASD</kbd> move. <kbd>Space</kbd> waits one beat. <kbd>U</kbd> / <kbd>Backspace</kbd> undo. <kbd>R</kbd> restarts. These keys work while the board is focused.</p>\n      <ul><li>A blocked move does not spend a beat.</li><li>A filled <strong>★ beacon</strong> needs no more cells.</li><li><strong>◆</strong> is you. No time limit. Undo is welcome.</li><li>Win each board independently; switch boards with the selector.</li></ul>\n      <p class=\"muted\">No network. No accounts. No saved state. Sound starts off.</p>\n    </aside>\n  </div>\n  <footer><small>Original seed reference build. Fictional studio and production research are SYNTHETIC. Three boards; keyboard/click controls; no claim of complete assistive-technology support.</small></footer>\n</main>\n</body>\n</html>\n","path":"templates/casework/work/starter/game/index.html","sha256":"1470e507e86105ffa7a9768647a8891f4a72a412802226a4c0fa9199ae74421d"},{"bytes":1520,"content":"# Conditional first-shift release gate\n\nSYNTHETIC production exercise. This is a checklist, not completed QA evidence.\n\n1. Preserve an untouched reference copy; record the exact candidate file list.\n2. Run the engine and feedback tests. Record command, result, and date.\n3. Open the candidate from disk. Focus the board. Exercise every documented key,\n   wait on a closed bridge, win, undo a win, restart, and change levels.\n4. Disable networking. Confirm that gameplay still works and no remote asset or\n   transport is requested. Static source inspection alone is not this test.\n5. Verify that loading is silent, opt-in sound is short, and unsupported audio\n   leaves text and gameplay intact.\n6. Review at 320px width and with keyboard only. Use a screen reader if available;\n   otherwise record that check as unrun, not passed.\n7. Verify that no feedback collection, personal data, analytics, persistence,\n   remote code, copyrighted borrowed assets, or publication was added.\n8. Compare the implementation to the frozen scope and every acceptance CSV row.\n   A failing or unrun material check produces rework or a documented hold.\n9. Prepare a prospective research plan. Never manufacture completion percentages\n   from the authored sample or describe it as observed market validation.\n10. Present a conditional candidate recommendation to the owner. Publishing,\n    recruiting participants, spending, or crossing an organization boundary\n    requires a separate approval; this seed performs none of those actions.\n","path":"templates/casework/work/starter/ops/release-checklist.md","sha256":"d9d71fbc3a74e102e18edad57bca24dda99bd8a32e2299c09e47ca97b2bda9ad"},{"bytes":1905,"content":"case_id,mode,setup,action,expected,classification\nqa-start,automated,Create each of the three boards,Inspect state,One cell at D; turn zero; three unlit beacons,SYNTHETIC\nqa-wall,automated,Start Loading Lane,Move left into wall,Position and turn unchanged,SYNTHETIC\nqa-bridge-phase,automated,Place state adjacent to bridge at turn two,Enter bridge,Blocked with no beat consumed,SYNTHETIC\nqa-bridge-exit,automated,Place state on bridge at turn two,Leave to adjacent path,Legal even though bridge is closed,SYNTHETIC\nqa-wait,automated,Any playable state,Wait four times,Same location and bridge phase; four actions spent,SYNTHETIC\nqa-reload,automated,Empty courier beside depot,Enter depot,Exactly one cell loaded,SYNTHETIC\nqa-win,automated,Solve each board using breadth-first search,Replay solution,Three distinct delivered beacons; won true,SYNTHETIC\nqa-undo,automated,Deliver the last cell then win,Undo,Winning delivery and action count restored to pre-win state,SYNTHETIC\nqa-restart,automated,Make several successful moves,Restart,Initial state and empty undo history,SYNTHETIC\nqa-keyboard,manual,Open local HTML and focus board,Use arrows WASD Space U Backspace R,All supported actions work without page scrolling; key repeat does not skip turns,SYNTHETIC\nqa-offline,manual,Open local HTML with networking disabled,Complete a board,No unavailable remote assets or requests; game remains playable,SYNTHETIC\nqa-sound,manual,Load fresh page with default checkbox,Move then opt in to sound,Initially silent; only opt-in events may tone; text always explains events,SYNTHETIC\nqa-accessibility,manual,Use keyboard and a screen reader if available,Navigate controls and read status,Focus is visible and meaningful state is exposed; record untested limitations,SYNTHETIC\nqa-narrow,manual,Use a 320-pixel-wide viewport,Read rules and use direction buttons,No inaccessible controls or board overflow,SYNTHETIC\n","path":"templates/casework/work/starter/quality/acceptance.csv","sha256":"664b48a7230ee0cddbd73b4c4a08e883eb45807f0f75e30e095edda9e9820733"},{"bytes":8569,"content":"\"use strict\";\n(async function main() {\nconst assert = (await import(\"node:assert/strict\")).default;\nconst fs = await import(\"node:fs\");\nconst path = await import(\"node:path\");\nconst vm = await import(\"node:vm\");\nconst testDirectory = path.dirname(path.resolve(process.argv[1]));\nconst source = fs.readFileSync(path.join(testDirectory, \"../game/game.js\"), \"utf8\");\nconst authoredModule = {exports: {}};\nvm.compileFunction(source, [\"module\"])(authoredModule);\nconst game = authoredModule.exports;\nlet checks = 0;\nfunction test(name, fn) { fn(); checks += 1; console.log(`PASS ${name}`); }\nfunction solve(levelIndex) {\n  const start = game.createState(levelIndex), queue = [{state: start, path: []}];\n  const key = s => [s.x, s.y, s.turn % 4, Number(s.carrying), s.delivered.join(\";\")].join(\"|\");\n  const seen = new Set([key(start)]);\n  for (let head = 0; head < queue.length; head += 1) {\n    const current = queue[head];\n    if (current.state.won) return current.path;\n    for (const action of [\"up\", \"down\", \"left\", \"right\", \"wait\"]) {\n      const state = game.advance(current.state, action), id = key(state);\n      if (seen.has(id)) continue;\n      seen.add(id); queue.push({state, path: current.path.concat(action)});\n    }\n  }\n  throw new Error(`Unsolvable board ${levelIndex}`);\n}\ntest(\"fixed maps have one depot, three targets, and valid dimensions\", () => {\n  game.levels.forEach(level => {\n    assert.equal(level.rows.length, 7);\n    level.rows.forEach(row => { assert.equal(row.length, 9); assert.match(row, /^[#.Do~]+$/); });\n    assert.equal(level.rows.join(\"\").split(\"D\").length - 1, 1);\n    assert.equal(level.rows.join(\"\").split(\"o\").length - 1, 3);\n  });\n});\ntest(\"wall collisions and unknown actions do not spend a beat\", () => {\n  const start = game.createState();\n  assert.equal(game.advance(start, \"left\").turn, 0);\n  assert.equal(game.advance(start, \"left\").x, start.x);\n  assert.equal(game.advance(start, \"not-an-action\"), start);\n});\ntest(\"bridge gate checks the pre-action phase\", () => {\n  const state = {...game.createState(), x: 3, y: 3, turn: 2};\n  assert.equal(game.advance(state, \"right\").x, 3);\n  const entered = game.advance({...state, turn: 1}, \"right\");\n  assert.equal(entered.x, 4); assert.equal(entered.turn, 2);\n  assert.equal(game.bridgeOpen(entered), false);\n  assert.equal(game.advance(entered, \"right\").x, 5);\n});\ntest(\"waiting cycles the phase and keeps position\", () => {\n  let state = game.createState();\n  for (let i = 0; i < 4; i += 1) state = game.advance(state, \"wait\");\n  assert.equal(state.x, 1); assert.equal(state.y, 1);\n  assert.equal(state.turn, 4); assert.equal(game.bridgeOpen(state), true);\n});\ntest(\"depot reload and delivery are single-capacity and immutable\", () => {\n  const empty = {...game.createState(), x: 2, carrying: false};\n  assert.equal(game.advance(empty, \"left\").carrying, true);\n  assert.equal(empty.carrying, false);\n  const near = {...game.createState(), x: 1, y: 4};\n  const delivered = game.advance(near, \"down\");\n  assert.deepEqual(delivered.delivered, [\"1,5\"]); assert.equal(delivered.carrying, false);\n  assert.deepEqual(near.delivered, []);\n  assert.deepEqual(game.advance(delivered, \"wait\").delivered, [\"1,5\"]);\n});\ntest(\"keyboard map includes arrows WASD space undo and restart\", () => {\n  for (const [key, action] of Object.entries({ArrowUp: \"up\", W: \"up\", ArrowDown: \"down\", s: \"down\", ArrowLeft: \"left\", a: \"left\", ArrowRight: \"right\", d: \"right\", \" \": \"wait\", U: \"undo\", Backspace: \"undo\", R: \"restart\"})) {\n    assert.equal(game.keyAction(key), action);\n  }\n  assert.equal(game.keyAction(\"Tab\"), null);\n});\ntest(\"controller resets, bounds history, and does not record blocked moves\", () => {\n  const controller = game.createController();\n  controller.act(\"left\"); assert.equal(controller.undoCount, 0);\n  for (let i = 0; i < 270; i += 1) controller.act(\"wait\");\n  assert.equal(controller.undoCount, 256);\n  controller.act(\"undo\"); assert.equal(controller.state.turn, 269);\n  controller.act(\"restart\"); assert.equal(controller.state.turn, 0); assert.equal(controller.undoCount, 0);\n  controller.setLevel(2); assert.equal(controller.state.levelIndex, 2);\n  assert.throws(() => game.createState(3), RangeError);\n});\ngame.levels.forEach((level, index) => test(`solver, win lock, and undo-win: ${level.name}`, () => {\n  const route = solve(index), controller = game.createController(index);\n  route.forEach(action => controller.act(action));\n  assert.equal(controller.state.won, true);\n  assert.equal(controller.state.delivered.length, 3);\n  const count = controller.state.turn;\n  controller.act(\"wait\"); assert.equal(controller.state.turn, count);\n  controller.act(\"undo\"); assert.equal(controller.state.won, false);\n  assert.equal(controller.state.delivered.length, 2);\n  assert.match(game.summary(controller.state), /Next action: beat/);\n  console.log(`  shortest route: ${route.length} actions`);\n}));\ntest(\"mounted keyboard/click handlers can play all boards using a DOM test double\", () => {\n  let doc;\n  class Element {\n    constructor() {\n      this.children = []; this.listeners = {}; this.attributes = {};\n      this.dataset = {}; this.checked = false; this.value = \"\";\n      this.classList = {add: () => {}};\n    }\n    appendChild(child) { this.children.push(child); return child; }\n    replaceChildren(fragment) { this.children = [...fragment.children]; }\n    setAttribute(name, value) { this.attributes[name] = value; }\n    addEventListener(type, listener) { this.listeners[type] = listener; }\n    focus() { doc.activeElement = this; }\n    fire(type, event = {}) { this.listeners[type](event); }\n  }\n  const ids = Object.fromEntries([\"board\", \"status\", \"level\", \"sound\", \"focus\"].map(id => [id, new Element()]));\n  const buttons = [\"up\", \"down\", \"left\", \"right\", \"wait\", \"undo\", \"restart\"].map(action => {\n    const element = new Element(); element.dataset.action = action; return element;\n  });\n  doc = {\n    defaultView: {}, activeElement: null,\n    getElementById: id => ids[id],\n    createElement: () => new Element(),\n    createDocumentFragment: () => new Element(),\n    querySelectorAll: selector => { assert.equal(selector, \"[data-action]\"); return buttons; }\n  };\n  const controller = game.mount(doc);\n  assert.equal(ids.board.children.length, 63);\n  assert.equal(ids.level.children.length, 3);\n  ids.focus.fire(\"click\"); assert.equal(doc.activeElement, ids.board);\n  function key(keyName, extras = {}) {\n    let prevented = false;\n    ids.board.fire(\"keydown\", {key: keyName, repeat: false, altKey: false, ctrlKey: false, metaKey: false, preventDefault: () => { prevented = true; }, ...extras});\n    return prevented;\n  }\n  assert.equal(key(\"ArrowRight\"), true); assert.equal(controller.state.x, 2);\n  key(\"ArrowRight\", {repeat: true}); assert.equal(controller.state.turn, 1);\n  assert.equal(key(\"Tab\"), false);\n  assert.equal(key(\"r\", {ctrlKey: true}), false); assert.equal(controller.state.turn, 1);\n  buttons.find(button => button.dataset.action === \"left\").fire(\"click\");\n  assert.equal(controller.state.x, 1); assert.equal(controller.state.turn, 2);\n  key(\"Backspace\"); assert.equal(controller.state.x, 2); assert.equal(controller.state.turn, 1);\n  const actionKeys = {up: \"w\", down: \"s\", left: \"a\", right: \"d\", wait: \" \"};\n  game.levels.forEach((_, index) => {\n    ids.level.value = String(index); ids.level.fire(\"change\");\n    assert.equal(controller.state.levelIndex, index); assert.equal(controller.undoCount, 0);\n    solve(index).forEach(action => key(actionKeys[action]));\n    assert.equal(controller.state.won, true);\n    assert.match(ids.status.textContent, /Shift complete/);\n    key(\"u\"); assert.equal(controller.state.won, false);\n    key(\"r\"); assert.equal(controller.state.turn, 0); assert.equal(controller.state.delivered.length, 0);\n  });\n});\ntest(\"browser shell binds the real engine and only local assets\", () => {\n  const html = fs.readFileSync(path.join(testDirectory, \"../game/index.html\"), \"utf8\");\n  assert.match(html, /script defer src=\"game\\.js\"/);\n  assert.match(html, /id=\"board\" tabindex=\"0\"/);\n  assert.match(html, /connect-src 'none'/);\n  for (const match of html.matchAll(/(?:src|href)=\"([^\"]+)\"/g)) {\n    assert.equal(/^(?:https?:)?\\/\\//.test(match[1]), false);\n    assert.equal(fs.existsSync(path.resolve(testDirectory, \"../game\", match[1])), true);\n  }\n  assert.equal(/\\b(?:fetch|XMLHttpRequest|WebSocket|localStorage|sessionStorage)\\b/.test(source), false);\n});\nconsole.log(`${checks} game checks passed. Manual browser and player tests are not implied.`);\n}()).catch(error => { console.error(error); process.exitCode = 1; });\n","path":"templates/casework/work/starter/tests/game.test.js","sha256":"756830905b12acafaf1e064b222a4468db816e17ac41130ee5d67fad46bd56f1"},{"bytes":2588,"content":"\"\"\"Summarize original synthetic playtest records without writing or networking.\"\"\"\nimport argparse\nimport csv\nimport json\nfrom pathlib import Path\nfrom statistics import mean\n\nROOT = Path(__file__).resolve().parents[1]\n\n\ndef summarize(rows):\n    if not rows:\n        raise ValueError(\"At least one synthetic session is required\")\n    ids = set()\n    for row in rows:\n        if row[\"classification\"] != \"SYNTHETIC\" or row[\"session_id\"] in ids:\n            raise ValueError(\"Expected uniquely identified SYNTHETIC records\")\n        ids.add(row[\"session_id\"])\n        for field in (\"completed\", \"bridge_stall\", \"discovered_undo\"):\n            if row[field] not in (\"0\", \"1\"):\n                raise ValueError(\"Invalid binary observation\")\n        if int(row[\"actions\"]) < 0 or not 1 <= int(row[\"confidence_1_to_5\"]) <= 5:\n            raise ValueError(\"Observation is outside its valid range\")\n    completed = [row for row in rows if row[\"completed\"] == \"1\"]\n    return {\n        \"classification\": \"SYNTHETIC\",\n        \"records\": len(rows),\n        \"completions\": len(completed),\n        \"completion_fraction\": len(completed) / len(rows),\n        \"bridge_stalls\": sum(int(row[\"bridge_stall\"]) for row in rows),\n        \"undo_discoveries\": sum(int(row[\"discovered_undo\"]) for row in rows),\n        \"mean_completed_actions\": mean(int(row[\"actions\"]) for row in completed) if completed else None,\n        \"mean_confidence\": mean(int(row[\"confidence_1_to_5\"]) for row in rows),\n        \"evidence_limit\": \"Authored exercise only; not observed research or market validation.\"\n    }\n\n\ndef main():\n    parser = argparse.ArgumentParser(description=__doc__)\n    parser.add_argument(\"--self-test\", action=\"store_true\")\n    args = parser.parse_args()\n    with (ROOT / \"data/playtests.csv\").open(encoding=\"utf-8\", newline=\"\") as handle:\n        rows = list(csv.DictReader(handle))\n    report = summarize(rows)\n    if args.self_test:\n        assert (report[\"records\"], report[\"completions\"], report[\"bridge_stalls\"], report[\"undo_discoveries\"]) == (8, 5, 5, 3)\n        assert report[\"mean_completed_actions\"] == 54.4\n        for bad in ([], [rows[0], rows[0]], [{**rows[0], \"classification\": \"OBSERVED\"}], [{**rows[0], \"completed\": \"2\"}]):\n            try:\n                summarize(bad)\n            except ValueError:\n                continue\n            raise AssertionError(\"Invalid data was accepted\")\n        print(\"PASS: synthetic baseline plus four invalid-input cases\")\n    else:\n        print(json.dumps(report, indent=2, sort_keys=True, allow_nan=False))\n\n\nif __name__ == \"__main__\":\n    main()\n","path":"templates/casework/work/starter/tools/feedback_report.py","sha256":"397464736d015c71a41a37f15ed10d1efb79a79027c2ab6a66c072844b1af667"},{"bytes":8334,"content":"{\"authority\":\"inert-starter-data\",\"case_id\":\"first-shift-onboarding\",\"organization_seed\":\"independent-game-studio\",\"schema\":\"hive-hub-seed-task-board/1\",\"tasks\":[{\"acceptance\":[\"Names the two-day cap, all seven team owners, and the no-network/no-new-mechanics constraints.\",\"Lists publication and real participant recruitment as separate owner-approved effects.\"],\"assignee\":null,\"completed_evidence\":[],\"depends_on\":[],\"id\":\"lock-first-shift\",\"inputs\":[\"starter/case/production.json\",\"starter/ops/release-checklist.md\"],\"instructions\":\"Turn the production brief into an in/out scope and review sequence. Preserve the playable reference and treat the synthetic records as a rehearsal, not validation.\",\"outputs\":[\"deliverables/first-shift-scope.md\"],\"state\":\"ready\",\"team\":\"production\",\"title\":\"Freeze a two-day first-shift revision\"},{\"acceptance\":[\"Reports eight records, five completions, five bridge stalls, and three undo discoveries.\",\"Explains that the sample cannot establish market demand or an actual usability improvement.\"],\"assignee\":null,\"completed_evidence\":[],\"depends_on\":[\"lock-first-shift\"],\"id\":\"read-synthetic-feedback\",\"inputs\":[\"starter/data/playtests.csv\",\"starter/tools/feedback_report.py\",\"deliverables/first-shift-scope.md\"],\"instructions\":\"Run the local feedback utility and inspect every record. Attach counts and a coding note distinguishing author-generated feedback from observed research.\",\"outputs\":[\"deliverables/feedback-baseline.json\",\"deliverables/feedback-coding.md\"],\"state\":\"blocked\",\"team\":\"player-research\",\"title\":\"Reproduce the authored feedback baseline\"},{\"acceptance\":[\"A player can determine whether the next bridge entry is legal from visible text.\",\"Each rule has an example action/state pair and does not change the three level layouts.\"],\"assignee\":null,\"completed_evidence\":[],\"depends_on\":[\"read-synthetic-feedback\"],\"id\":\"revise-bridge-onboarding\",\"inputs\":[\"starter/design/rules.md\",\"starter/case/production.json\",\"deliverables/feedback-baseline.json\",\"deliverables/feedback-coding.md\"],\"instructions\":\"Write an exact first-minute interaction specification using the current four-beat bridge rule. Include blocked movement, standing on a closing bridge, depot reload, and undo.\",\"outputs\":[\"deliverables/onboarding-spec.md\"],\"state\":\"blocked\",\"team\":\"design\",\"title\":\"Specify bridge and carrying onboarding\"},{\"acceptance\":[\"Contains distinct depot, courier, undelivered beacon, delivered beacon, open bridge, and closed bridge symbols.\",\"Every state remains distinguishable in monochrome and all SVG content is local.\"],\"assignee\":null,\"completed_evidence\":[],\"depends_on\":[\"revise-bridge-onboarding\"],\"id\":\"prepare-readable-art\",\"inputs\":[\"starter/art/courier.svg\",\"starter/art/palette.json\",\"deliverables/onboarding-spec.md\"],\"instructions\":\"Revise the original courier SVG and palette into a compact, self-authored atlas or symbol sheet for the specified states. Avoid external fonts and borrowed game IP.\",\"outputs\":[\"deliverables/courier-atlas.svg\",\"deliverables/readability-notes.md\"],\"state\":\"blocked\",\"team\":\"art\",\"title\":\"Produce a symbol-complete mini atlas\"},{\"acceptance\":[\"Includes blocked, loaded, delivered, and won events with durations no greater than 180 ms.\",\"Requires a user opt-in and keeps every critical cue available in text.\"],\"assignee\":null,\"completed_evidence\":[],\"depends_on\":[\"revise-bridge-onboarding\"],\"id\":\"specify-local-cues\",\"inputs\":[\"starter/audio/cue-sheet.csv\",\"starter/game/game.js\",\"deliverables/onboarding-spec.md\"],\"instructions\":\"Review the existing Web Audio cue sheet against the onboarding specification. Specify short tones, volume bounds, and a no-audio fallback rather than importing audio.\",\"outputs\":[\"deliverables/audio-map.json\"],\"state\":\"blocked\",\"team\":\"audio\",\"title\":\"Map optional synthesized cues\"},{\"acceptance\":[\"The supplied engine tests still pass, including solver coverage for all three boards.\",\"The revised HTML references only local files and supports keyboard restart, undo, wait, and level selection.\",\"Records tests actually run separately from any unrun browser/device checks.\"],\"assignee\":null,\"completed_evidence\":[],\"depends_on\":[\"prepare-readable-art\",\"specify-local-cues\"],\"id\":\"implement-onboarding\",\"inputs\":[\"starter/game/index.html\",\"starter/game/game.js\",\"starter/tests/game.test.js\",\"deliverables/onboarding-spec.md\",\"deliverables/courier-atlas.svg\",\"deliverables/readability-notes.md\",\"deliverables/audio-map.json\"],\"instructions\":\"Produce a revised engine/UI source pair from the working reference, incorporating the reviewed specification, symbol work, and optional cues. Preserve offline file opening and deterministic rules.\",\"outputs\":[\"deliverables/game.js\",\"deliverables/index.html\",\"deliverables/engineering-checks.json\"],\"state\":\"blocked\",\"team\":\"engineering\",\"title\":\"Build the bounded onboarding revision\"},{\"acceptance\":[\"Every acceptance row has an actual result or explicit not-run status and reproduction steps.\",\"No wall collision consumes a beat and each board can reach its win state.\"],\"assignee\":null,\"completed_evidence\":[],\"depends_on\":[\"implement-onboarding\"],\"id\":\"verify-game-regressions\",\"inputs\":[\"starter/quality/acceptance.csv\",\"starter/tests/game.test.js\",\"deliverables/game.js\",\"deliverables/index.html\",\"deliverables/engineering-checks.json\"],\"instructions\":\"Use the regression table on the reference and revised build. Record state traces for bridge closure, illegal movement, delivery, winning, reset, and undo; do not mark manual browser checks passed without observation.\",\"outputs\":[\"deliverables/regression-results.csv\"],\"state\":\"blocked\",\"team\":\"quality\",\"title\":\"Execute rule and input acceptance cases\"},{\"acceptance\":[\"Reports no network-capable gameplay code or remote assets.\",\"Explicitly records whether keyboard-only, sound-disabled, narrow-screen, and screen-reader checks were performed.\"],\"assignee\":null,\"completed_evidence\":[],\"depends_on\":[\"verify-game-regressions\"],\"id\":\"audit-offline-release\",\"inputs\":[\"starter/ops/release-checklist.md\",\"deliverables/index.html\",\"deliverables/game.js\",\"deliverables/courier-atlas.svg\",\"deliverables/regression-results.csv\"],\"instructions\":\"Inspect the candidate for network references, storage, external assets, focus behavior, optional sound, and non-color state cues. Use the checklist to separate automated evidence from browser and assistive-technology limits.\",\"outputs\":[\"deliverables/offline-accessibility-review.md\"],\"state\":\"blocked\",\"team\":\"quality\",\"title\":\"Audit file-only release and accessibility\"},{\"acceptance\":[\"Contains five observable tasks with neutral facilitator wording and completion/error fields.\",\"Identifies all new observations as pending and requires approval before recruitment or data collection.\"],\"assignee\":null,\"completed_evidence\":[],\"depends_on\":[\"verify-game-regressions\",\"revise-bridge-onboarding\"],\"id\":\"plan-observed-playtest\",\"inputs\":[\"deliverables/feedback-coding.md\",\"deliverables/onboarding-spec.md\",\"deliverables/regression-results.csv\",\"starter/case/production.json\"],\"instructions\":\"Write a small prospective test plan, not fabricated results. Ask participants to load, cross a bridge, deliver, undo, and restart; define consent and the minimum evidence needed to compare against the synthetic exercise.\",\"outputs\":[\"deliverables/prospective-playtest.csv\"],\"state\":\"blocked\",\"team\":\"player-research\",\"title\":\"Prepare the next real first-session test\"},{\"acceptance\":[\"Lists unresolved risks and every failed or unrun case.\",\"Any publication recommendation remains conditional on explicit owner approval and does not mislabel the seed as a shipped commercial game.\"],\"assignee\":null,\"completed_evidence\":[],\"depends_on\":[\"audit-offline-release\",\"plan-observed-playtest\"],\"id\":\"make-release-decision\",\"inputs\":[\"deliverables/first-shift-scope.md\",\"deliverables/regression-results.csv\",\"deliverables/offline-accessibility-review.md\",\"deliverables/prospective-playtest.csv\",\"starter/ops/release-checklist.md\"],\"instructions\":\"Review the implementation, QA evidence, offline/accessibility review, and prospective test plan. Choose hold or a bounded candidate recommendation; do not publish or claim real player outcomes.\",\"outputs\":[\"deliverables/release-decision.md\"],\"state\":\"blocked\",\"team\":\"production\",\"title\":\"Record a conditional release decision\"}]}\n","path":"templates/casework/work/task-board.json","sha256":"b75a4c6f4aa307d889816913ee56b4a29fe35d4065072eb51f616f3bb0d6e2e4"},{"bytes":348,"content":"# Art and Readability\n\nRole: game-artist\n\nCreate original high-contrast symbols and a small coherent visual asset system.\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/art/work/TEAM.md","sha256":"5008ce31d5e2835502c1aa88177e54a75b2290a9c1f5746e1217dd9140fc46d7"},{"bytes":852,"content":"{\"case_workspace\":\"casework\",\"schema\":\"hive-hub-seed-team-work/1\",\"tasks\":[{\"acceptance\":[\"Contains distinct depot, courier, undelivered beacon, delivered beacon, open bridge, and closed bridge symbols.\",\"Every state remains distinguishable in monochrome and all SVG content is local.\"],\"assignee\":null,\"completed_evidence\":[],\"depends_on\":[\"revise-bridge-onboarding\"],\"id\":\"prepare-readable-art\",\"inputs\":[\"starter/art/courier.svg\",\"starter/art/palette.json\",\"deliverables/onboarding-spec.md\"],\"instructions\":\"Revise the original courier SVG and palette into a compact, self-authored atlas or symbol sheet for the specified states. Avoid external fonts and borrowed game IP.\",\"outputs\":[\"deliverables/courier-atlas.svg\",\"deliverables/readability-notes.md\"],\"state\":\"blocked\",\"team\":\"art\",\"title\":\"Produce a symbol-complete mini atlas\"}],\"team\":\"art\"}\n","path":"templates/teams/art/work/tasks.json","sha256":"1167666198dffaa61509cb1a460c5b8b39600a7045d4adf5ed2f7ef34a5f0238"},{"bytes":340,"content":"# Audio\n\nRole: sound-designer\n\nSpecify restrained, opt-in, locally synthesized event cues with a silent fallback.\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/audio/work/TEAM.md","sha256":"7175778143da20aaabf836f27df477de88089051026a2cfbf8a1bcfbd8012f5d"},{"bytes":780,"content":"{\"case_workspace\":\"casework\",\"schema\":\"hive-hub-seed-team-work/1\",\"tasks\":[{\"acceptance\":[\"Includes blocked, loaded, delivered, and won events with durations no greater than 180 ms.\",\"Requires a user opt-in and keeps every critical cue available in text.\"],\"assignee\":null,\"completed_evidence\":[],\"depends_on\":[\"revise-bridge-onboarding\"],\"id\":\"specify-local-cues\",\"inputs\":[\"starter/audio/cue-sheet.csv\",\"starter/game/game.js\",\"deliverables/onboarding-spec.md\"],\"instructions\":\"Review the existing Web Audio cue sheet against the onboarding specification. Specify short tones, volume bounds, and a no-audio fallback rather than importing audio.\",\"outputs\":[\"deliverables/audio-map.json\"],\"state\":\"blocked\",\"team\":\"audio\",\"title\":\"Map optional synthesized cues\"}],\"team\":\"audio\"}\n","path":"templates/teams/audio/work/tasks.json","sha256":"eef4cfc0b8100a3529dc24b7cce24ee3dbdc1d610c9a76c59e475dcc025b6c02"},{"bytes":366,"content":"# Game Design\n\nRole: game-designer\n\nSpecify understandable bridge, carrying, delivery, and undo rules within the existing three-board game.\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/design/work/TEAM.md","sha256":"aa7ec59e9a4164cd637f550608814508e3e08fd02d17e099d447ba7ddd714ae2"},{"bytes":857,"content":"{\"case_workspace\":\"casework\",\"schema\":\"hive-hub-seed-team-work/1\",\"tasks\":[{\"acceptance\":[\"A player can determine whether the next bridge entry is legal from visible text.\",\"Each rule has an example action/state pair and does not change the three level layouts.\"],\"assignee\":null,\"completed_evidence\":[],\"depends_on\":[\"read-synthetic-feedback\"],\"id\":\"revise-bridge-onboarding\",\"inputs\":[\"starter/design/rules.md\",\"starter/case/production.json\",\"deliverables/feedback-baseline.json\",\"deliverables/feedback-coding.md\"],\"instructions\":\"Write an exact first-minute interaction specification using the current four-beat bridge rule. Include blocked movement, standing on a closing bridge, depot reload, and undo.\",\"outputs\":[\"deliverables/onboarding-spec.md\"],\"state\":\"blocked\",\"team\":\"design\",\"title\":\"Specify bridge and carrying onboarding\"}],\"team\":\"design\"}\n","path":"templates/teams/design/work/tasks.json","sha256":"3a1eccde17dc84996c1931220455178a4e2a34680b7a840345d6800f5058482d"},{"bytes":343,"content":"# Game Engineering\n\nRole: game-engineer\n\nMaintain the deterministic engine and keyboard-first offline browser build.\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":"8c863689e602a8b15072e1616668076690d8dd60b2141d8a048f698c7c9abf77"},{"bytes":1142,"content":"{\"case_workspace\":\"casework\",\"schema\":\"hive-hub-seed-team-work/1\",\"tasks\":[{\"acceptance\":[\"The supplied engine tests still pass, including solver coverage for all three boards.\",\"The revised HTML references only local files and supports keyboard restart, undo, wait, and level selection.\",\"Records tests actually run separately from any unrun browser/device checks.\"],\"assignee\":null,\"completed_evidence\":[],\"depends_on\":[\"prepare-readable-art\",\"specify-local-cues\"],\"id\":\"implement-onboarding\",\"inputs\":[\"starter/game/index.html\",\"starter/game/game.js\",\"starter/tests/game.test.js\",\"deliverables/onboarding-spec.md\",\"deliverables/courier-atlas.svg\",\"deliverables/readability-notes.md\",\"deliverables/audio-map.json\"],\"instructions\":\"Produce a revised engine/UI source pair from the working reference, incorporating the reviewed specification, symbol work, and optional cues. Preserve offline file opening and deterministic rules.\",\"outputs\":[\"deliverables/game.js\",\"deliverables/index.html\",\"deliverables/engineering-checks.json\"],\"state\":\"blocked\",\"team\":\"engineering\",\"title\":\"Build the bounded onboarding revision\"}],\"team\":\"engineering\"}\n","path":"templates/teams/engineering/work/tasks.json","sha256":"68411f13db9d3d8fd2d99598230e089d24d974a8862002ecd480b814b8b038e7"},{"bytes":378,"content":"# Player Research\n\nRole: player-researcher\n\nSeparate the synthetic feedback exercise from real observations and design the next consent-based playtest.\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/player-research/work/TEAM.md","sha256":"39f4d5e96db515f1285e107dad5d7b3f9ba9b0e98c1ff0556ce54dc58be94d41"},{"bytes":1757,"content":"{\"case_workspace\":\"casework\",\"schema\":\"hive-hub-seed-team-work/1\",\"tasks\":[{\"acceptance\":[\"Reports eight records, five completions, five bridge stalls, and three undo discoveries.\",\"Explains that the sample cannot establish market demand or an actual usability improvement.\"],\"assignee\":null,\"completed_evidence\":[],\"depends_on\":[\"lock-first-shift\"],\"id\":\"read-synthetic-feedback\",\"inputs\":[\"starter/data/playtests.csv\",\"starter/tools/feedback_report.py\",\"deliverables/first-shift-scope.md\"],\"instructions\":\"Run the local feedback utility and inspect every record. Attach counts and a coding note distinguishing author-generated feedback from observed research.\",\"outputs\":[\"deliverables/feedback-baseline.json\",\"deliverables/feedback-coding.md\"],\"state\":\"blocked\",\"team\":\"player-research\",\"title\":\"Reproduce the authored feedback baseline\"},{\"acceptance\":[\"Contains five observable tasks with neutral facilitator wording and completion/error fields.\",\"Identifies all new observations as pending and requires approval before recruitment or data collection.\"],\"assignee\":null,\"completed_evidence\":[],\"depends_on\":[\"verify-game-regressions\",\"revise-bridge-onboarding\"],\"id\":\"plan-observed-playtest\",\"inputs\":[\"deliverables/feedback-coding.md\",\"deliverables/onboarding-spec.md\",\"deliverables/regression-results.csv\",\"starter/case/production.json\"],\"instructions\":\"Write a small prospective test plan, not fabricated results. Ask participants to load, cross a bridge, deliver, undo, and restart; define consent and the minimum evidence needed to compare against the synthetic exercise.\",\"outputs\":[\"deliverables/prospective-playtest.csv\"],\"state\":\"blocked\",\"team\":\"player-research\",\"title\":\"Prepare the next real first-session test\"}],\"team\":\"player-research\"}\n","path":"templates/teams/player-research/work/tasks.json","sha256":"fb2794da4735ffaf31579b6f5a7f97af6f00bf78e712590b716783fcf6c27494"},{"bytes":368,"content":"# Production\n\nRole: producer\n\nOwn the first-shift scope, review gates, and a conditional release decision without claiming a shipped product.\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/production/work/TEAM.md","sha256":"1cdc728ea2b1c9cf230f15f72f51abcfc3838bbf213aadca67f15f3b3af5329f"},{"bytes":1669,"content":"{\"case_workspace\":\"casework\",\"schema\":\"hive-hub-seed-team-work/1\",\"tasks\":[{\"acceptance\":[\"Names the two-day cap, all seven team owners, and the no-network/no-new-mechanics constraints.\",\"Lists publication and real participant recruitment as separate owner-approved effects.\"],\"assignee\":null,\"completed_evidence\":[],\"depends_on\":[],\"id\":\"lock-first-shift\",\"inputs\":[\"starter/case/production.json\",\"starter/ops/release-checklist.md\"],\"instructions\":\"Turn the production brief into an in/out scope and review sequence. Preserve the playable reference and treat the synthetic records as a rehearsal, not validation.\",\"outputs\":[\"deliverables/first-shift-scope.md\"],\"state\":\"ready\",\"team\":\"production\",\"title\":\"Freeze a two-day first-shift revision\"},{\"acceptance\":[\"Lists unresolved risks and every failed or unrun case.\",\"Any publication recommendation remains conditional on explicit owner approval and does not mislabel the seed as a shipped commercial game.\"],\"assignee\":null,\"completed_evidence\":[],\"depends_on\":[\"audit-offline-release\",\"plan-observed-playtest\"],\"id\":\"make-release-decision\",\"inputs\":[\"deliverables/first-shift-scope.md\",\"deliverables/regression-results.csv\",\"deliverables/offline-accessibility-review.md\",\"deliverables/prospective-playtest.csv\",\"starter/ops/release-checklist.md\"],\"instructions\":\"Review the implementation, QA evidence, offline/accessibility review, and prospective test plan. Choose hold or a bounded candidate recommendation; do not publish or claim real player outcomes.\",\"outputs\":[\"deliverables/release-decision.md\"],\"state\":\"blocked\",\"team\":\"production\",\"title\":\"Record a conditional release decision\"}],\"team\":\"production\"}\n","path":"templates/teams/production/work/tasks.json","sha256":"88d492a1df75991a940e0088a5ca75ff68ee6bd3b8195a1dadee116c087750d3"},{"bytes":357,"content":"# Quality Assurance\n\nRole: qa-lead\n\nCheck solvability, input handling, no-network behavior, accessibility limits, and regressions.\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/quality/work/TEAM.md","sha256":"7353963ad8414915dcfac4aa5a536f2f64f5456542f74a2076dd452c9d40b4c8"},{"bytes":1779,"content":"{\"case_workspace\":\"casework\",\"schema\":\"hive-hub-seed-team-work/1\",\"tasks\":[{\"acceptance\":[\"Every acceptance row has an actual result or explicit not-run status and reproduction steps.\",\"No wall collision consumes a beat and each board can reach its win state.\"],\"assignee\":null,\"completed_evidence\":[],\"depends_on\":[\"implement-onboarding\"],\"id\":\"verify-game-regressions\",\"inputs\":[\"starter/quality/acceptance.csv\",\"starter/tests/game.test.js\",\"deliverables/game.js\",\"deliverables/index.html\",\"deliverables/engineering-checks.json\"],\"instructions\":\"Use the regression table on the reference and revised build. Record state traces for bridge closure, illegal movement, delivery, winning, reset, and undo; do not mark manual browser checks passed without observation.\",\"outputs\":[\"deliverables/regression-results.csv\"],\"state\":\"blocked\",\"team\":\"quality\",\"title\":\"Execute rule and input acceptance cases\"},{\"acceptance\":[\"Reports no network-capable gameplay code or remote assets.\",\"Explicitly records whether keyboard-only, sound-disabled, narrow-screen, and screen-reader checks were performed.\"],\"assignee\":null,\"completed_evidence\":[],\"depends_on\":[\"verify-game-regressions\"],\"id\":\"audit-offline-release\",\"inputs\":[\"starter/ops/release-checklist.md\",\"deliverables/index.html\",\"deliverables/game.js\",\"deliverables/courier-atlas.svg\",\"deliverables/regression-results.csv\"],\"instructions\":\"Inspect the candidate for network references, storage, external assets, focus behavior, optional sound, and non-color state cues. Use the checklist to separate automated evidence from browser and assistive-technology limits.\",\"outputs\":[\"deliverables/offline-accessibility-review.md\"],\"state\":\"blocked\",\"team\":\"quality\",\"title\":\"Audit file-only release and accessibility\"}],\"team\":\"quality\"}\n","path":"templates/teams/quality/work/tasks.json","sha256":"98cd7b0910c12c34e6bf0281d3d47c6d45932990d3b156bc8d211374c29059a0"}],"kind":"organization-seed","mission":"Run a seven-team independent studio around Mosslight Courier, an original offline route puzzle. Turn synthetic first-session feedback into a bounded onboarding revision with playable source, readable art, opt-in sound, and reproducible regression evidence.","name":"The Independent Game Studio","organization":{"directory":"organization","scaffold":{"kind":"organization","mode":"hive","slug":"independent-game-studio","world_id":"demo-independent-game-studio"}},"protocol":"rapp-work/1","relatedSeeds":["product-launch-company"],"schema":"hive-hub-organization-seed/1","slug":"independent-game-studio","status":"seed-not-activated","tagline":"Ship a small original game, with a real production discipline.","tasks":[{"acceptance":["Names the two-day cap, all seven team owners, and the no-network/no-new-mechanics constraints.","Lists publication and real participant recruitment as separate owner-approved effects."],"assignee":null,"completed_evidence":[],"depends_on":[],"id":"lock-first-shift","inputs":["starter/case/production.json","starter/ops/release-checklist.md"],"instructions":"Turn the production brief into an in/out scope and review sequence. Preserve the playable reference and treat the synthetic records as a rehearsal, not validation.","outputs":["deliverables/first-shift-scope.md"],"state":"ready","team":"production","title":"Freeze a two-day first-shift revision"},{"acceptance":["Reports eight records, five completions, five bridge stalls, and three undo discoveries.","Explains that the sample cannot establish market demand or an actual usability improvement."],"assignee":null,"completed_evidence":[],"depends_on":["lock-first-shift"],"id":"read-synthetic-feedback","inputs":["starter/data/playtests.csv","starter/tools/feedback_report.py","deliverables/first-shift-scope.md"],"instructions":"Run the local feedback utility and inspect every record. Attach counts and a coding note distinguishing author-generated feedback from observed research.","outputs":["deliverables/feedback-baseline.json","deliverables/feedback-coding.md"],"state":"blocked","team":"player-research","title":"Reproduce the authored feedback baseline"},{"acceptance":["A player can determine whether the next bridge entry is legal from visible text.","Each rule has an example action/state pair and does not change the three level layouts."],"assignee":null,"completed_evidence":[],"depends_on":["read-synthetic-feedback"],"id":"revise-bridge-onboarding","inputs":["starter/design/rules.md","starter/case/production.json","deliverables/feedback-baseline.json","deliverables/feedback-coding.md"],"instructions":"Write an exact first-minute interaction specification using the current four-beat bridge rule. Include blocked movement, standing on a closing bridge, depot reload, and undo.","outputs":["deliverables/onboarding-spec.md"],"state":"blocked","team":"design","title":"Specify bridge and carrying onboarding"},{"acceptance":["Contains distinct depot, courier, undelivered beacon, delivered beacon, open bridge, and closed bridge symbols.","Every state remains distinguishable in monochrome and all SVG content is local."],"assignee":null,"completed_evidence":[],"depends_on":["revise-bridge-onboarding"],"id":"prepare-readable-art","inputs":["starter/art/courier.svg","starter/art/palette.json","deliverables/onboarding-spec.md"],"instructions":"Revise the original courier SVG and palette into a compact, self-authored atlas or symbol sheet for the specified states. Avoid external fonts and borrowed game IP.","outputs":["deliverables/courier-atlas.svg","deliverables/readability-notes.md"],"state":"blocked","team":"art","title":"Produce a symbol-complete mini atlas"},{"acceptance":["Includes blocked, loaded, delivered, and won events with durations no greater than 180 ms.","Requires a user opt-in and keeps every critical cue available in text."],"assignee":null,"completed_evidence":[],"depends_on":["revise-bridge-onboarding"],"id":"specify-local-cues","inputs":["starter/audio/cue-sheet.csv","starter/game/game.js","deliverables/onboarding-spec.md"],"instructions":"Review the existing Web Audio cue sheet against the onboarding specification. Specify short tones, volume bounds, and a no-audio fallback rather than importing audio.","outputs":["deliverables/audio-map.json"],"state":"blocked","team":"audio","title":"Map optional synthesized cues"},{"acceptance":["The supplied engine tests still pass, including solver coverage for all three boards.","The revised HTML references only local files and supports keyboard restart, undo, wait, and level selection.","Records tests actually run separately from any unrun browser/device checks."],"assignee":null,"completed_evidence":[],"depends_on":["prepare-readable-art","specify-local-cues"],"id":"implement-onboarding","inputs":["starter/game/index.html","starter/game/game.js","starter/tests/game.test.js","deliverables/onboarding-spec.md","deliverables/courier-atlas.svg","deliverables/readability-notes.md","deliverables/audio-map.json"],"instructions":"Produce a revised engine/UI source pair from the working reference, incorporating the reviewed specification, symbol work, and optional cues. Preserve offline file opening and deterministic rules.","outputs":["deliverables/game.js","deliverables/index.html","deliverables/engineering-checks.json"],"state":"blocked","team":"engineering","title":"Build the bounded onboarding revision"},{"acceptance":["Every acceptance row has an actual result or explicit not-run status and reproduction steps.","No wall collision consumes a beat and each board can reach its win state."],"assignee":null,"completed_evidence":[],"depends_on":["implement-onboarding"],"id":"verify-game-regressions","inputs":["starter/quality/acceptance.csv","starter/tests/game.test.js","deliverables/game.js","deliverables/index.html","deliverables/engineering-checks.json"],"instructions":"Use the regression table on the reference and revised build. Record state traces for bridge closure, illegal movement, delivery, winning, reset, and undo; do not mark manual browser checks passed without observation.","outputs":["deliverables/regression-results.csv"],"state":"blocked","team":"quality","title":"Execute rule and input acceptance cases"},{"acceptance":["Reports no network-capable gameplay code or remote assets.","Explicitly records whether keyboard-only, sound-disabled, narrow-screen, and screen-reader checks were performed."],"assignee":null,"completed_evidence":[],"depends_on":["verify-game-regressions"],"id":"audit-offline-release","inputs":["starter/ops/release-checklist.md","deliverables/index.html","deliverables/game.js","deliverables/courier-atlas.svg","deliverables/regression-results.csv"],"instructions":"Inspect the candidate for network references, storage, external assets, focus behavior, optional sound, and non-color state cues. Use the checklist to separate automated evidence from browser and assistive-technology limits.","outputs":["deliverables/offline-accessibility-review.md"],"state":"blocked","team":"quality","title":"Audit file-only release and accessibility"},{"acceptance":["Contains five observable tasks with neutral facilitator wording and completion/error fields.","Identifies all new observations as pending and requires approval before recruitment or data collection."],"assignee":null,"completed_evidence":[],"depends_on":["verify-game-regressions","revise-bridge-onboarding"],"id":"plan-observed-playtest","inputs":["deliverables/feedback-coding.md","deliverables/onboarding-spec.md","deliverables/regression-results.csv","starter/case/production.json"],"instructions":"Write a small prospective test plan, not fabricated results. Ask participants to load, cross a bridge, deliver, undo, and restart; define consent and the minimum evidence needed to compare against the synthetic exercise.","outputs":["deliverables/prospective-playtest.csv"],"state":"blocked","team":"player-research","title":"Prepare the next real first-session test"},{"acceptance":["Lists unresolved risks and every failed or unrun case.","Any publication recommendation remains conditional on explicit owner approval and does not mislabel the seed as a shipped commercial game."],"assignee":null,"completed_evidence":[],"depends_on":["audit-offline-release","plan-observed-playtest"],"id":"make-release-decision","inputs":["deliverables/first-shift-scope.md","deliverables/regression-results.csv","deliverables/offline-accessibility-review.md","deliverables/prospective-playtest.csv","starter/ops/release-checklist.md"],"instructions":"Review the implementation, QA evidence, offline/accessibility review, and prospective test plan. Choose hold or a bounded candidate recommendation; do not publish or claim real player outcomes.","outputs":["deliverables/release-decision.md"],"state":"blocked","team":"production","title":"Record a conditional release decision"}],"workspaceProfile":"rapp-work-sdk/1","workspaces":[{"directory":"workspaces/production","id":"production","name":"Production","purpose":"Own the first-shift scope, review gates, and a conditional release decision without claiming a shipped product.","role":"producer","scaffold":{"kind":"workspace","mode":"hive","slug":"independent-game-studio-production","world_id":"demo-independent-game-studio"},"template":"templates/teams/production"},{"directory":"workspaces/design","id":"design","name":"Game Design","purpose":"Specify understandable bridge, carrying, delivery, and undo rules within the existing three-board game.","role":"game-designer","scaffold":{"kind":"workspace","mode":"hive","slug":"independent-game-studio-design","world_id":"demo-independent-game-studio"},"template":"templates/teams/design"},{"directory":"workspaces/engineering","id":"engineering","name":"Game Engineering","purpose":"Maintain the deterministic engine and keyboard-first offline browser build.","role":"game-engineer","scaffold":{"kind":"workspace","mode":"hive","slug":"independent-game-studio-engineering","world_id":"demo-independent-game-studio"},"template":"templates/teams/engineering"},{"directory":"workspaces/art","id":"art","name":"Art and Readability","purpose":"Create original high-contrast symbols and a small coherent visual asset system.","role":"game-artist","scaffold":{"kind":"workspace","mode":"hive","slug":"independent-game-studio-art","world_id":"demo-independent-game-studio"},"template":"templates/teams/art"},{"directory":"workspaces/audio","id":"audio","name":"Audio","purpose":"Specify restrained, opt-in, locally synthesized event cues with a silent fallback.","role":"sound-designer","scaffold":{"kind":"workspace","mode":"hive","slug":"independent-game-studio-audio","world_id":"demo-independent-game-studio"},"template":"templates/teams/audio"},{"directory":"workspaces/quality","id":"quality","name":"Quality Assurance","purpose":"Check solvability, input handling, no-network behavior, accessibility limits, and regressions.","role":"qa-lead","scaffold":{"kind":"workspace","mode":"hive","slug":"independent-game-studio-quality","world_id":"demo-independent-game-studio"},"template":"templates/teams/quality"},{"directory":"workspaces/player-research","id":"player-research","name":"Player Research","purpose":"Separate the synthetic feedback exercise from real observations and design the next consent-based playtest.","role":"player-researcher","scaffold":{"kind":"workspace","mode":"hive","slug":"independent-game-studio-player-research","world_id":"demo-independent-game-studio"},"template":"templates/teams/player-research"},{"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":"independent-game-studio-casework","world_id":"demo-independent-game-studio"},"template":"templates/casework"}]}
