diff --git a/.claude/skills/clawdnd-dev/SKILL.md b/.claude/skills/worldos-dev/SKILL.md similarity index 96% rename from .claude/skills/clawdnd-dev/SKILL.md rename to .claude/skills/worldos-dev/SKILL.md index 4b7cde3d..d20fa0a7 100644 --- a/.claude/skills/clawdnd-dev/SKILL.md +++ b/.claude/skills/worldos-dev/SKILL.md @@ -1,13 +1,13 @@ --- -name: clawdnd-dev -description: Develop, test, and QA the ClawDnD plugin (the living-world D&D 5e engine). Use when implementing an engine/content/QA change, running or scoring a playtest, delegating a build to a subagent, or resuming the project after a compaction. Encodes the exact dev loop (worktree → additive change → single-process LEXAR pytest → PR → squash-admin merge → prune), the QA loop (duo / combat-sprint runners + the 3 lenses + behavioral gate), and the load-bearing engine invariants. Read ClawDnD-RUNBOOK.md first for full context. +name: worldos-dev +description: Develop, test, and QA the WorldOS plugin (the living-world D&D 5e engine). Use when implementing an engine/content/QA change, running or scoring a playtest, delegating a build to a subagent, or resuming the project after a compaction. Encodes the exact dev loop (worktree → additive change → single-process LEXAR pytest → PR → squash-admin merge → prune), the QA loop (duo / combat-sprint runners + the 3 lenses + behavioral gate), and the load-bearing engine invariants. Read WorldOS-RUNBOOK.md first for full context. --- -# ClawDnD Dev +# WorldOS Dev -You build and harden **ClawDnD** — a post-BG3 living-world D&D 5e Claude Code plugin. North +You build and harden **WorldOS** — a post-BG3 living-world D&D 5e Claude Code plugin. North star: **epic Baldur's-Gate-caliber STORY on a deterministic SRD 5.2 engine**; goal: a -universe-system that generates worlds. FREE product, BG-only. **Read `ClawDnD-RUNBOOK.md` +universe-system that generates worlds. FREE product, BG-only. **Read `WorldOS-RUNBOOK.md` (repo root) for the full project/architecture/state.** This skill is the operational loop. ## Load-bearing INVARIANTS (never violate) diff --git a/content/worlds/README.md b/content/worlds/README.md index 124ac221..d6cd6d38 100644 --- a/content/worlds/README.md +++ b/content/worlds/README.md @@ -171,8 +171,8 @@ instead of aborting `start_world`. ## Licensing (each seed needs a `LICENSE.md`) `scripts/license_check.py` requires a `LICENSE.md` beside every committed `world.json`. -- **Original seeds** (e.g. `sundered-reach`): original ClawDnD content, **CC-BY-4.0**, on SRD primitives. No third-party setting IP. +- **Original seeds** (e.g. `sundered-reach`): original WorldOS content, **CC-BY-4.0**, on SRD primitives. No third-party setting IP. - **Setting-based seeds** (e.g. `baldurs-gate`): **FREE, unofficial Fan Content** — rules under CC-BY/OGL SRD, setting names/lore under the **Wizards Fan Content Policy** (+ Larian for BG3); each ingested page carries its source + CC-BY-SA. Not official, not endorsed, never sold. -- ClawDnD's MIT license covers **code only** — it does not extend to the world seeds. +- WorldOS's MIT license covers **code only** — it does not extend to the world seeds. See `sundered-reach/` (original) and `baldurs-gate/` (fan content) as worked examples. diff --git a/content/worlds/baldurs-gate/LICENSE.md b/content/worlds/baldurs-gate/LICENSE.md index b1a4922e..6d42b053 100644 --- a/content/worlds/baldurs-gate/LICENSE.md +++ b/content/worlds/baldurs-gate/LICENSE.md @@ -1,7 +1,7 @@ # Unofficial Baldur's Gate 3+ Universe Seed — Licensing & Attribution **This world seed is FREE, unofficial Fan Content. It is NOT official, NOT endorsed, -and is never sold.** It is **not** covered by ClawDnD's MIT license (which applies to +and is never sold.** It is **not** covered by WorldOS's MIT license (which applies to the project's code only); it is published under the terms below. ## Wizards Fan Content Policy (Forgotten Realms / D&D setting) @@ -34,7 +34,7 @@ Pages under `lore/wiki/` are ingested from the **Forgotten Realms Wiki (Fandom)* is licensed **CC-BY-SA**. Each page carries its source URL + a CC-BY-SA attribution footer. They are free, unofficial fan content. Note CC-BY-SA (ShareAlike) is a different license from the original seed prose (CC-BY-4.0). The hand-authored pages at `lore/*.md` -are original ClawDnD content. +are original WorldOS content. ## Ingested character profiles (`characters/`) @@ -57,4 +57,4 @@ redistributed). - Ingested `lore/wiki/` pages: CC-BY-SA (Forgotten Realms Wiki / Fandom), attributed per page. - Ingested `characters/` profiles: bg3.wiki (dual CC-BY-SA / CC-BY-NC-SA, non-commercial) + FR Fandom (CC-BY-SA), text-only, attributed per record. - Rules: CC-BY-4.0 SRD / OGL. -- ClawDnD code: MIT (separate; does not extend to this seed). +- WorldOS code: MIT (separate; does not extend to this seed). diff --git a/content/worlds/baldurs-gate/areas/basilisk-gate.json b/content/worlds/baldurs-gate/areas/basilisk-gate.json index ede54d1b..3d5eb43b 100644 --- a/content/worlds/baldurs-gate/areas/basilisk-gate.json +++ b/content/worlds/baldurs-gate/areas/basilisk-gate.json @@ -15,6 +15,6 @@ "intrigue" ], "source_url": "", - "license": "Original prose by the ClawDnD authors, released under CC-BY-SA 4.0. Setting (Baldur's Gate, the Sword Coast) is unofficial Fan Content under the Wizards Fan Content Policy; see LICENSE.md in this world folder.", - "attribution": "Original example area written for ClawDnD (CC-BY-SA 4.0). Unofficial, non-commercial Fan Content; place-names are property of Wizards of the Coast LLC." + "license": "Original prose by the WorldOS authors, released under CC-BY-SA 4.0. Setting (Baldur's Gate, the Sword Coast) is unofficial Fan Content under the Wizards Fan Content Policy; see LICENSE.md in this world folder.", + "attribution": "Original example area written for WorldOS (CC-BY-SA 4.0). Unofficial, non-commercial Fan Content; place-names are property of Wizards of the Coast LLC." } diff --git a/content/worlds/baldurs-gate/areas/bloomridge-market.json b/content/worlds/baldurs-gate/areas/bloomridge-market.json index 06e9c6c5..d131b4f9 100644 --- a/content/worlds/baldurs-gate/areas/bloomridge-market.json +++ b/content/worlds/baldurs-gate/areas/bloomridge-market.json @@ -14,6 +14,6 @@ "hub" ], "source_url": "", - "license": "Original prose by the ClawDnD authors, released under CC-BY-SA 4.0. Setting (Baldur's Gate, the Sword Coast) is unofficial Fan Content under the Wizards Fan Content Policy; see LICENSE.md in this world folder.", - "attribution": "Original example area written for ClawDnD (CC-BY-SA 4.0). Unofficial, non-commercial Fan Content; place-names are property of Wizards of the Coast LLC." + "license": "Original prose by the WorldOS authors, released under CC-BY-SA 4.0. Setting (Baldur's Gate, the Sword Coast) is unofficial Fan Content under the Wizards Fan Content Policy; see LICENSE.md in this world folder.", + "attribution": "Original example area written for WorldOS (CC-BY-SA 4.0). Unofficial, non-commercial Fan Content; place-names are property of Wizards of the Coast LLC." } diff --git a/content/worlds/baldurs-gate/areas/counting-house.json b/content/worlds/baldurs-gate/areas/counting-house.json index 5328e008..442735e3 100644 --- a/content/worlds/baldurs-gate/areas/counting-house.json +++ b/content/worlds/baldurs-gate/areas/counting-house.json @@ -14,6 +14,6 @@ "intrigue" ], "source_url": "", - "license": "Original prose by the ClawDnD authors, released under CC-BY-SA 4.0. Setting (Baldur's Gate, the Sword Coast) is unofficial Fan Content under the Wizards Fan Content Policy; see LICENSE.md in this world folder.", - "attribution": "Original example area written for ClawDnD (CC-BY-SA 4.0). Unofficial, non-commercial Fan Content; place-names are property of Wizards of the Coast LLC." + "license": "Original prose by the WorldOS authors, released under CC-BY-SA 4.0. Setting (Baldur's Gate, the Sword Coast) is unofficial Fan Content under the Wizards Fan Content Policy; see LICENSE.md in this world folder.", + "attribution": "Original example area written for WorldOS (CC-BY-SA 4.0). Unofficial, non-commercial Fan Content; place-names are property of Wizards of the Coast LLC." } diff --git a/content/worlds/baldurs-gate/areas/elfsong-tavern.json b/content/worlds/baldurs-gate/areas/elfsong-tavern.json index 0aef5ae0..6e68b680 100644 --- a/content/worlds/baldurs-gate/areas/elfsong-tavern.json +++ b/content/worlds/baldurs-gate/areas/elfsong-tavern.json @@ -14,6 +14,6 @@ "haunt" ], "source_url": "", - "license": "Original prose by the ClawDnD authors, released under CC-BY-SA 4.0. Setting (Baldur's Gate, the Sword Coast) is unofficial Fan Content under the Wizards Fan Content Policy; see LICENSE.md in this world folder.", - "attribution": "Original example area written for ClawDnD (CC-BY-SA 4.0). Unofficial, non-commercial Fan Content; place-names are property of Wizards of the Coast LLC." + "license": "Original prose by the WorldOS authors, released under CC-BY-SA 4.0. Setting (Baldur's Gate, the Sword Coast) is unofficial Fan Content under the Wizards Fan Content Policy; see LICENSE.md in this world folder.", + "attribution": "Original example area written for WorldOS (CC-BY-SA 4.0). Unofficial, non-commercial Fan Content; place-names are property of Wizards of the Coast LLC." } diff --git a/content/worlds/baldurs-gate/areas/gray-harbor.json b/content/worlds/baldurs-gate/areas/gray-harbor.json index bf97c083..4456c576 100644 --- a/content/worlds/baldurs-gate/areas/gray-harbor.json +++ b/content/worlds/baldurs-gate/areas/gray-harbor.json @@ -16,6 +16,6 @@ "underworld" ], "source_url": "", - "license": "Original prose by the ClawDnD authors, released under CC-BY-SA 4.0. Setting (Baldur's Gate, the Sword Coast) is unofficial Fan Content under the Wizards Fan Content Policy; see LICENSE.md in this world folder.", - "attribution": "Original example area written for ClawDnD (CC-BY-SA 4.0). Unofficial, non-commercial Fan Content; place-names are property of Wizards of the Coast LLC." + "license": "Original prose by the WorldOS authors, released under CC-BY-SA 4.0. Setting (Baldur's Gate, the Sword Coast) is unofficial Fan Content under the Wizards Fan Content Policy; see LICENSE.md in this world folder.", + "attribution": "Original example area written for WorldOS (CC-BY-SA 4.0). Unofficial, non-commercial Fan Content; place-names are property of Wizards of the Coast LLC." } diff --git a/content/worlds/baldurs-gate/areas/heapside-warrens.json b/content/worlds/baldurs-gate/areas/heapside-warrens.json index d2e2a251..878c7ab6 100644 --- a/content/worlds/baldurs-gate/areas/heapside-warrens.json +++ b/content/worlds/baldurs-gate/areas/heapside-warrens.json @@ -14,6 +14,6 @@ "underworld" ], "source_url": "", - "license": "Original prose by the ClawDnD authors, released under CC-BY-SA 4.0. Setting (Baldur's Gate, the Sword Coast) is unofficial Fan Content under the Wizards Fan Content Policy; see LICENSE.md in this world folder.", - "attribution": "Original example area written for ClawDnD (CC-BY-SA 4.0). Unofficial, non-commercial Fan Content; place-names are property of Wizards of the Coast LLC." + "license": "Original prose by the WorldOS authors, released under CC-BY-SA 4.0. Setting (Baldur's Gate, the Sword Coast) is unofficial Fan Content under the Wizards Fan Content Policy; see LICENSE.md in this world folder.", + "attribution": "Original example area written for WorldOS (CC-BY-SA 4.0). Unofficial, non-commercial Fan Content; place-names are property of Wizards of the Coast LLC." } diff --git a/content/worlds/baldurs-gate/areas/little-calimshan.json b/content/worlds/baldurs-gate/areas/little-calimshan.json index 6875762d..a73a2bd1 100644 --- a/content/worlds/baldurs-gate/areas/little-calimshan.json +++ b/content/worlds/baldurs-gate/areas/little-calimshan.json @@ -14,6 +14,6 @@ "city" ], "source_url": "", - "license": "Original prose by the ClawDnD authors, released under CC-BY-SA 4.0. Setting (Baldur's Gate, the Sword Coast) is unofficial Fan Content under the Wizards Fan Content Policy; see LICENSE.md in this world folder.", - "attribution": "Original example area written for ClawDnD (CC-BY-SA 4.0). Unofficial, non-commercial Fan Content; place-names are property of Wizards of the Coast LLC." + "license": "Original prose by the WorldOS authors, released under CC-BY-SA 4.0. Setting (Baldur's Gate, the Sword Coast) is unofficial Fan Content under the Wizards Fan Content Policy; see LICENSE.md in this world folder.", + "attribution": "Original example area written for WorldOS (CC-BY-SA 4.0). Unofficial, non-commercial Fan Content; place-names are property of Wizards of the Coast LLC." } diff --git a/content/worlds/baldurs-gate/areas/patriars-walk.json b/content/worlds/baldurs-gate/areas/patriars-walk.json index f4d75073..d9dce60b 100644 --- a/content/worlds/baldurs-gate/areas/patriars-walk.json +++ b/content/worlds/baldurs-gate/areas/patriars-walk.json @@ -15,6 +15,6 @@ "city" ], "source_url": "", - "license": "Original prose by the ClawDnD authors, released under CC-BY-SA 4.0. Setting (Baldur's Gate, the Sword Coast) is unofficial Fan Content under the Wizards Fan Content Policy; see LICENSE.md in this world folder.", - "attribution": "Original example area written for ClawDnD (CC-BY-SA 4.0). Unofficial, non-commercial Fan Content; place-names are property of Wizards of the Coast LLC." + "license": "Original prose by the WorldOS authors, released under CC-BY-SA 4.0. Setting (Baldur's Gate, the Sword Coast) is unofficial Fan Content under the Wizards Fan Content Policy; see LICENSE.md in this world folder.", + "attribution": "Original example area written for WorldOS (CC-BY-SA 4.0). Unofficial, non-commercial Fan Content; place-names are property of Wizards of the Coast LLC." } diff --git a/content/worlds/baldurs-gate/areas/rivington-crossroads.json b/content/worlds/baldurs-gate/areas/rivington-crossroads.json index 35ca457c..f30559bf 100644 --- a/content/worlds/baldurs-gate/areas/rivington-crossroads.json +++ b/content/worlds/baldurs-gate/areas/rivington-crossroads.json @@ -15,6 +15,6 @@ "crossroads" ], "source_url": "", - "license": "Original prose by the ClawDnD authors, released under CC-BY-SA 4.0. Setting (Baldur's Gate, the Sword Coast) is unofficial Fan Content under the Wizards Fan Content Policy; see LICENSE.md in this world folder.", - "attribution": "Original example area written for ClawDnD (CC-BY-SA 4.0). Unofficial, non-commercial Fan Content; place-names are property of Wizards of the Coast LLC." + "license": "Original prose by the WorldOS authors, released under CC-BY-SA 4.0. Setting (Baldur's Gate, the Sword Coast) is unofficial Fan Content under the Wizards Fan Content Policy; see LICENSE.md in this world folder.", + "attribution": "Original example area written for WorldOS (CC-BY-SA 4.0). Unofficial, non-commercial Fan Content; place-names are property of Wizards of the Coast LLC." } diff --git a/content/worlds/baldurs-gate/areas/siltwharf-steps.json b/content/worlds/baldurs-gate/areas/siltwharf-steps.json index 93ad4a31..d8f695d2 100644 --- a/content/worlds/baldurs-gate/areas/siltwharf-steps.json +++ b/content/worlds/baldurs-gate/areas/siltwharf-steps.json @@ -12,6 +12,6 @@ "city" ], "source_url": "", - "license": "Original prose by the ClawDnD authors, released under CC-BY-SA 4.0. Setting (Baldur's Gate, the Sword Coast) is unofficial Fan Content under the Wizards Fan Content Policy; see LICENSE.md in this world folder.", - "attribution": "Original example area written for ClawDnD (CC-BY-SA 4.0). Unofficial, non-commercial Fan Content; place-names are property of Wizards of the Coast LLC." + "license": "Original prose by the WorldOS authors, released under CC-BY-SA 4.0. Setting (Baldur's Gate, the Sword Coast) is unofficial Fan Content under the Wizards Fan Content Policy; see LICENSE.md in this world folder.", + "attribution": "Original example area written for WorldOS (CC-BY-SA 4.0). Unofficial, non-commercial Fan Content; place-names are property of Wizards of the Coast LLC." } diff --git a/content/worlds/baldurs-gate/areas/sorcerous-sundries.json b/content/worlds/baldurs-gate/areas/sorcerous-sundries.json index e054a260..90b260b5 100644 --- a/content/worlds/baldurs-gate/areas/sorcerous-sundries.json +++ b/content/worlds/baldurs-gate/areas/sorcerous-sundries.json @@ -13,6 +13,6 @@ "city" ], "source_url": "", - "license": "Original prose by the ClawDnD authors, released under CC-BY-SA 4.0. Setting (Baldur's Gate, the Sword Coast) is unofficial Fan Content under the Wizards Fan Content Policy; see LICENSE.md in this world folder.", - "attribution": "Original example area written for ClawDnD (CC-BY-SA 4.0). Unofficial, non-commercial Fan Content; place-names are property of Wizards of the Coast LLC." + "license": "Original prose by the WorldOS authors, released under CC-BY-SA 4.0. Setting (Baldur's Gate, the Sword Coast) is unofficial Fan Content under the Wizards Fan Content Policy; see LICENSE.md in this world folder.", + "attribution": "Original example area written for WorldOS (CC-BY-SA 4.0). Unofficial, non-commercial Fan Content; place-names are property of Wizards of the Coast LLC." } diff --git a/content/worlds/baldurs-gate/areas/steel-watch-foundry-ruins.json b/content/worlds/baldurs-gate/areas/steel-watch-foundry-ruins.json index 430ed409..e5b18619 100644 --- a/content/worlds/baldurs-gate/areas/steel-watch-foundry-ruins.json +++ b/content/worlds/baldurs-gate/areas/steel-watch-foundry-ruins.json @@ -15,6 +15,6 @@ "industrial" ], "source_url": "", - "license": "Original prose by the ClawDnD authors, released under CC-BY-SA 4.0. Setting (Baldur's Gate, the Sword Coast) is unofficial Fan Content under the Wizards Fan Content Policy; see LICENSE.md in this world folder.", - "attribution": "Original example area written for ClawDnD (CC-BY-SA 4.0). Unofficial, non-commercial Fan Content; place-names are property of Wizards of the Coast LLC." + "license": "Original prose by the WorldOS authors, released under CC-BY-SA 4.0. Setting (Baldur's Gate, the Sword Coast) is unofficial Fan Content under the Wizards Fan Content Policy; see LICENSE.md in this world folder.", + "attribution": "Original example area written for WorldOS (CC-BY-SA 4.0). Unofficial, non-commercial Fan Content; place-names are property of Wizards of the Coast LLC." } diff --git a/content/worlds/baldurs-gate/areas/undercity-sewers.json b/content/worlds/baldurs-gate/areas/undercity-sewers.json index 7ec1d852..eb645ce8 100644 --- a/content/worlds/baldurs-gate/areas/undercity-sewers.json +++ b/content/worlds/baldurs-gate/areas/undercity-sewers.json @@ -15,6 +15,6 @@ "city" ], "source_url": "", - "license": "Original prose by the ClawDnD authors, released under CC-BY-SA 4.0. Setting (Baldur's Gate, the Sword Coast) is unofficial Fan Content under the Wizards Fan Content Policy; see LICENSE.md in this world folder.", - "attribution": "Original example area written for ClawDnD (CC-BY-SA 4.0). Unofficial, non-commercial Fan Content; place-names are property of Wizards of the Coast LLC." + "license": "Original prose by the WorldOS authors, released under CC-BY-SA 4.0. Setting (Baldur's Gate, the Sword Coast) is unofficial Fan Content under the Wizards Fan Content Policy; see LICENSE.md in this world folder.", + "attribution": "Original example area written for WorldOS (CC-BY-SA 4.0). Unofficial, non-commercial Fan Content; place-names are property of Wizards of the Coast LLC." } diff --git a/content/worlds/baldurs-gate/areas/wyrms-rock.json b/content/worlds/baldurs-gate/areas/wyrms-rock.json index 32e6f4c9..672b33e3 100644 --- a/content/worlds/baldurs-gate/areas/wyrms-rock.json +++ b/content/worlds/baldurs-gate/areas/wyrms-rock.json @@ -14,6 +14,6 @@ "ruins" ], "source_url": "", - "license": "Original prose by the ClawDnD authors, released under CC-BY-SA 4.0. Setting (Baldur's Gate, the Sword Coast) is unofficial Fan Content under the Wizards Fan Content Policy; see LICENSE.md in this world folder.", - "attribution": "Original example area written for ClawDnD (CC-BY-SA 4.0). Unofficial, non-commercial Fan Content; place-names are property of Wizards of the Coast LLC." + "license": "Original prose by the WorldOS authors, released under CC-BY-SA 4.0. Setting (Baldur's Gate, the Sword Coast) is unofficial Fan Content under the Wizards Fan Content Policy; see LICENSE.md in this world folder.", + "attribution": "Original example area written for WorldOS (CC-BY-SA 4.0). Unofficial, non-commercial Fan Content; place-names are property of Wizards of the Coast LLC." } diff --git a/content/worlds/baldurs-gate/endings/dark-urge-bhaal.json b/content/worlds/baldurs-gate/endings/dark-urge-bhaal.json index 6bbd5265..115aebe1 100644 --- a/content/worlds/baldurs-gate/endings/dark-urge-bhaal.json +++ b/content/worlds/baldurs-gate/endings/dark-urge-bhaal.json @@ -79,6 +79,6 @@ } } }, - "license": "FREE, unofficial Fan Content. Original ClawDnD prose describing a post-BG3 world-STATE (plot-branch facts only), released under CC-BY-4.0 as fan content under the Wizards Fan Content Policy (+ Larian for BG3 elements). NOT official, NOT endorsed, never sold. No in-game text is reproduced.", - "attribution": "Unofficial Fan Content permitted under the Fan Content Policy. Not approved/endorsed by Wizards. Portions of the materials used are property of Wizards of the Coast. ©Wizards of the Coast LLC. Baldur's Gate 3 elements © Larian Studios. Overlay prose © ClawDnD contributors, CC-BY-4.0." + "license": "FREE, unofficial Fan Content. Original WorldOS prose describing a post-BG3 world-STATE (plot-branch facts only), released under CC-BY-4.0 as fan content under the Wizards Fan Content Policy (+ Larian for BG3 elements). NOT official, NOT endorsed, never sold. No in-game text is reproduced.", + "attribution": "Unofficial Fan Content permitted under the Fan Content Policy. Not approved/endorsed by Wizards. Portions of the materials used are property of Wizards of the Coast. ©Wizards of the Coast LLC. Baldur's Gate 3 elements © Larian Studios. Overlay prose © WorldOS contributors, CC-BY-4.0." } diff --git a/content/worlds/baldurs-gate/endings/gortash-tyranny.json b/content/worlds/baldurs-gate/endings/gortash-tyranny.json index 67e3c2b4..a3563557 100644 --- a/content/worlds/baldurs-gate/endings/gortash-tyranny.json +++ b/content/worlds/baldurs-gate/endings/gortash-tyranny.json @@ -84,6 +84,6 @@ } } }, - "license": "FREE, unofficial Fan Content. Original ClawDnD prose describing a post-BG3 world-STATE (plot-branch facts only), released under CC-BY-4.0 as fan content under the Wizards Fan Content Policy (+ Larian for BG3 elements). NOT official, NOT endorsed, never sold. No in-game text is reproduced.", - "attribution": "Unofficial Fan Content permitted under the Fan Content Policy. Not approved/endorsed by Wizards. Portions of the materials used are property of Wizards of the Coast. ©Wizards of the Coast LLC. Baldur's Gate 3 elements © Larian Studios. Overlay prose © ClawDnD contributors, CC-BY-4.0." + "license": "FREE, unofficial Fan Content. Original WorldOS prose describing a post-BG3 world-STATE (plot-branch facts only), released under CC-BY-4.0 as fan content under the Wizards Fan Content Policy (+ Larian for BG3 elements). NOT official, NOT endorsed, never sold. No in-game text is reproduced.", + "attribution": "Unofficial Fan Content permitted under the Fan Content Policy. Not approved/endorsed by Wizards. Portions of the materials used are property of Wizards of the Coast. ©Wizards of the Coast LLC. Baldur's Gate 3 elements © Larian Studios. Overlay prose © WorldOS contributors, CC-BY-4.0." } diff --git a/content/worlds/baldurs-gate/endings/illithid-ascension.json b/content/worlds/baldurs-gate/endings/illithid-ascension.json index a1a891ff..b90bad14 100644 --- a/content/worlds/baldurs-gate/endings/illithid-ascension.json +++ b/content/worlds/baldurs-gate/endings/illithid-ascension.json @@ -78,6 +78,6 @@ } } }, - "license": "FREE, unofficial Fan Content. Original ClawDnD prose describing a post-BG3 world-STATE (plot-branch facts only), released under CC-BY-4.0 as fan content under the Wizards Fan Content Policy (+ Larian for BG3 elements). NOT official, NOT endorsed, never sold. No in-game text is reproduced.", - "attribution": "Unofficial Fan Content permitted under the Fan Content Policy. Not approved/endorsed by Wizards. Portions of the materials used are property of Wizards of the Coast. ©Wizards of the Coast LLC. Baldur's Gate 3 elements © Larian Studios. Overlay prose © ClawDnD contributors, CC-BY-4.0." + "license": "FREE, unofficial Fan Content. Original WorldOS prose describing a post-BG3 world-STATE (plot-branch facts only), released under CC-BY-4.0 as fan content under the Wizards Fan Content Policy (+ Larian for BG3 elements). NOT official, NOT endorsed, never sold. No in-game text is reproduced.", + "attribution": "Unofficial Fan Content permitted under the Fan Content Policy. Not approved/endorsed by Wizards. Portions of the materials used are property of Wizards of the Coast. ©Wizards of the Coast LLC. Baldur's Gate 3 elements © Larian Studios. Overlay prose © WorldOS contributors, CC-BY-4.0." } diff --git a/content/worlds/baldurs-gate/endings/netherbrain-destroyed-heroes-live.json b/content/worlds/baldurs-gate/endings/netherbrain-destroyed-heroes-live.json index 65869869..8afe6cb2 100644 --- a/content/worlds/baldurs-gate/endings/netherbrain-destroyed-heroes-live.json +++ b/content/worlds/baldurs-gate/endings/netherbrain-destroyed-heroes-live.json @@ -78,6 +78,6 @@ } } }, - "license": "FREE, unofficial Fan Content. Original ClawDnD prose describing a post-BG3 world-STATE (plot-branch facts only), released under CC-BY-4.0 as fan content under the Wizards Fan Content Policy (+ Larian for BG3 elements). NOT official, NOT endorsed, never sold. No in-game text is reproduced.", - "attribution": "Unofficial Fan Content permitted under the Fan Content Policy. Not approved/endorsed by Wizards. Portions of the materials used are property of Wizards of the Coast. ©Wizards of the Coast LLC. Baldur's Gate 3 elements © Larian Studios. Overlay prose © ClawDnD contributors, CC-BY-4.0." + "license": "FREE, unofficial Fan Content. Original WorldOS prose describing a post-BG3 world-STATE (plot-branch facts only), released under CC-BY-4.0 as fan content under the Wizards Fan Content Policy (+ Larian for BG3 elements). NOT official, NOT endorsed, never sold. No in-game text is reproduced.", + "attribution": "Unofficial Fan Content permitted under the Fan Content Policy. Not approved/endorsed by Wizards. Portions of the materials used are property of Wizards of the Coast. ©Wizards of the Coast LLC. Baldur's Gate 3 elements © Larian Studios. Overlay prose © WorldOS contributors, CC-BY-4.0." } diff --git a/content/worlds/baldurs-gate/lore/apocrypha-the-drowned-verse.md b/content/worlds/baldurs-gate/lore/apocrypha-the-drowned-verse.md index 6977b3b5..635168fc 100644 --- a/content/worlds/baldurs-gate/lore/apocrypha-the-drowned-verse.md +++ b/content/worlds/baldurs-gate/lore/apocrypha-the-drowned-verse.md @@ -41,5 +41,5 @@ is acting as though it were. Whether anything actually stirs under the harbor is per campaign; the verse itself is, and remains, apocryphal. --- -*Original ClawDnD content (the "hallucinated-lore" easter egg) — free, unofficial fan content, +*Original WorldOS content (the "hallucinated-lore" easter egg) — free, unofficial fan content, CC-BY-4.0. Not Larian/WotC canon; deliberately apocryphal in-fiction.* diff --git a/content/worlds/baldurs-gate/origins/flaming-fist-deserter.json b/content/worlds/baldurs-gate/origins/flaming-fist-deserter.json index b2942b6e..a6e6cc37 100644 --- a/content/worlds/baldurs-gate/origins/flaming-fist-deserter.json +++ b/content/worlds/baldurs-gate/origins/flaming-fist-deserter.json @@ -13,6 +13,6 @@ "skills": ["athletics", "intimidation"], "appearance": "Broad-shouldered and weather-worn, with a soldier's posture they can't quite shed and a faded burn-scar where a Fist insignia used to be.", "personality": "Plain-spoken, dutiful out of habit, and quietly haunted by orders they followed during the Absolute war. Wants to do one clean thing.", - "license": "Original ClawDnD fan-content origin build, CC-BY-4.0. SRD 5.2 mechanics under CC-BY-4.0. Unofficial; not endorsed by Wizards of the Coast or Larian.", - "attribution": "Origin build © ClawDnD contributors, CC-BY-4.0. SRD 5.2 © Wizards of the Coast LLC, used under CC-BY-4.0. Setting under the Wizards Fan Content Policy; BG3 elements © Larian Studios." + "license": "Original WorldOS fan-content origin build, CC-BY-4.0. SRD 5.2 mechanics under CC-BY-4.0. Unofficial; not endorsed by Wizards of the Coast or Larian.", + "attribution": "Origin build © WorldOS contributors, CC-BY-4.0. SRD 5.2 © Wizards of the Coast LLC, used under CC-BY-4.0. Setting under the Wizards Fan Content Policy; BG3 elements © Larian Studios." } diff --git a/content/worlds/baldurs-gate/origins/guild-cutpurse.json b/content/worlds/baldurs-gate/origins/guild-cutpurse.json index 878a11ba..e31b5558 100644 --- a/content/worlds/baldurs-gate/origins/guild-cutpurse.json +++ b/content/worlds/baldurs-gate/origins/guild-cutpurse.json @@ -13,6 +13,6 @@ "skills": ["stealth", "sleight of hand", "deception", "perception"], "appearance": "Quick-eyed and forgettable on purpose, dressed to vanish into a market crowd, with a gambler's grin and a knife you never see drawn.", "personality": "Charming, mercenary, and loyal only to a short list — but that list is real, and growing one name longer is how this one's story turns.", - "license": "Original ClawDnD fan-content origin build, CC-BY-4.0. SRD 5.2 mechanics under CC-BY-4.0. Unofficial; not endorsed by Wizards of the Coast or Larian.", - "attribution": "Origin build © ClawDnD contributors, CC-BY-4.0. SRD 5.2 © Wizards of the Coast LLC, used under CC-BY-4.0. Setting under the Wizards Fan Content Policy; BG3 elements © Larian Studios." + "license": "Original WorldOS fan-content origin build, CC-BY-4.0. SRD 5.2 mechanics under CC-BY-4.0. Unofficial; not endorsed by Wizards of the Coast or Larian.", + "attribution": "Origin build © WorldOS contributors, CC-BY-4.0. SRD 5.2 © Wizards of the Coast LLC, used under CC-BY-4.0. Setting under the Wizards Fan Content Policy; BG3 elements © Larian Studios." } diff --git a/content/worlds/baldurs-gate/origins/isobel-cleric.json b/content/worlds/baldurs-gate/origins/isobel-cleric.json index a24169f4..6d7014ee 100644 --- a/content/worlds/baldurs-gate/origins/isobel-cleric.json +++ b/content/worlds/baldurs-gate/origins/isobel-cleric.json @@ -18,6 +18,6 @@ ], "appearance": "Human woman, dark brown skin, close-cropped natural hair, calm eyes. Silver-white Selûnite vestments over practical traveling clothes; crescent holy symbol at her throat. Unhurried and rooted in bearing.", "personality": "Warm but not soft. Listens first, then tells the truth, both with the same steady hand. Her faith doesn't need defending — only living.", - "license": "Original ClawDnD fan-content origin build, CC-BY-4.0. SRD 5.2 mechanics under CC-BY-4.0. Unofficial; not endorsed by Wizards of the Coast or Larian.", - "attribution": "Origin build © ClawDnD contributors, CC-BY-4.0. SRD 5.2 © Wizards of the Coast LLC, used under CC-BY-4.0. Setting under the Wizards Fan Content Policy; BG3 elements © Larian Studios." + "license": "Original WorldOS fan-content origin build, CC-BY-4.0. SRD 5.2 mechanics under CC-BY-4.0. Unofficial; not endorsed by Wizards of the Coast or Larian.", + "attribution": "Origin build © WorldOS contributors, CC-BY-4.0. SRD 5.2 © Wizards of the Coast LLC, used under CC-BY-4.0. Setting under the Wizards Fan Content Policy; BG3 elements © Larian Studios." } diff --git a/content/worlds/baldurs-gate/origins/lia-battlemaster.json b/content/worlds/baldurs-gate/origins/lia-battlemaster.json index c65cf822..19012cf7 100644 --- a/content/worlds/baldurs-gate/origins/lia-battlemaster.json +++ b/content/worlds/baldurs-gate/origins/lia-battlemaster.json @@ -13,6 +13,6 @@ "skills": ["athletics", "perception", "intimidation"], "appearance": "Compact and athletic, reddish-brown skin, small filed-smooth horns, cool grey eyes with humor behind the stillness. Practical armor with visible personal repairs; always tapping a weapon hilt when thinking.", "personality": "Dry, reliable, and three times harder to rattle than she looks. Will criticize your plan, then make sure it works anyway. Does not romanticize violence.", - "license": "Original ClawDnD fan-content origin build, CC-BY-4.0. SRD 5.2 mechanics under CC-BY-4.0. Unofficial; not endorsed by Wizards of the Coast or Larian.", - "attribution": "Origin build © ClawDnD contributors, CC-BY-4.0. SRD 5.2 © Wizards of the Coast LLC, used under CC-BY-4.0. Setting under the Wizards Fan Content Policy; BG3 elements © Larian Studios." + "license": "Original WorldOS fan-content origin build, CC-BY-4.0. SRD 5.2 mechanics under CC-BY-4.0. Unofficial; not endorsed by Wizards of the Coast or Larian.", + "attribution": "Origin build © WorldOS contributors, CC-BY-4.0. SRD 5.2 © Wizards of the Coast LLC, used under CC-BY-4.0. Setting under the Wizards Fan Content Policy; BG3 elements © Larian Studios." } diff --git a/content/worlds/baldurs-gate/origins/refugee-cleric.json b/content/worlds/baldurs-gate/origins/refugee-cleric.json index e61702b7..22e88f10 100644 --- a/content/worlds/baldurs-gate/origins/refugee-cleric.json +++ b/content/worlds/baldurs-gate/origins/refugee-cleric.json @@ -13,6 +13,6 @@ "skills": ["medicine", "religion", "insight"], "appearance": "Travel-worn vestments mended too many times, kind eyes that have seen too much, and a holy symbol worn smooth from being held in the dark.", "personality": "Gentle but iron-spined, the sort who runs toward the screaming. Carries the weight of those they couldn't save and keeps showing up anyway.", - "license": "Original ClawDnD fan-content origin build, CC-BY-4.0. SRD 5.2 mechanics under CC-BY-4.0. Unofficial; not endorsed by Wizards of the Coast or Larian.", - "attribution": "Origin build © ClawDnD contributors, CC-BY-4.0. SRD 5.2 © Wizards of the Coast LLC, used under CC-BY-4.0. Setting under the Wizards Fan Content Policy; BG3 elements © Larian Studios." + "license": "Original WorldOS fan-content origin build, CC-BY-4.0. SRD 5.2 mechanics under CC-BY-4.0. Unofficial; not endorsed by Wizards of the Coast or Larian.", + "attribution": "Origin build © WorldOS contributors, CC-BY-4.0. SRD 5.2 © Wizards of the Coast LLC, used under CC-BY-4.0. Setting under the Wizards Fan Content Policy; BG3 elements © Larian Studios." } diff --git a/content/worlds/baldurs-gate/origins/rolan-evoker.json b/content/worlds/baldurs-gate/origins/rolan-evoker.json index 1af046a3..7c54e8ce 100644 --- a/content/worlds/baldurs-gate/origins/rolan-evoker.json +++ b/content/worlds/baldurs-gate/origins/rolan-evoker.json @@ -17,6 +17,6 @@ ], "appearance": "Lean tiefling with indigo skin, swept-back horns, and amber eyes that brighten when a spell is forming. Scholar's robes, ink-stained cuffs, a satchel packed with annotated tomes.", "personality": "Prickly and ambitious, with a hidden streak of protectiveness for the people he has decided matter to him. Does not waste words unless he's lecturing.", - "license": "Original ClawDnD fan-content origin build, CC-BY-4.0. SRD 5.2 mechanics under CC-BY-4.0. Unofficial; not endorsed by Wizards of the Coast or Larian.", - "attribution": "Origin build © ClawDnD contributors, CC-BY-4.0. SRD 5.2 © Wizards of the Coast LLC, used under CC-BY-4.0. Setting under the Wizards Fan Content Policy; BG3 elements © Larian Studios." + "license": "Original WorldOS fan-content origin build, CC-BY-4.0. SRD 5.2 mechanics under CC-BY-4.0. Unofficial; not endorsed by Wizards of the Coast or Larian.", + "attribution": "Origin build © WorldOS contributors, CC-BY-4.0. SRD 5.2 © Wizards of the Coast LLC, used under CC-BY-4.0. Setting under the Wizards Fan Content Policy; BG3 elements © Larian Studios." } diff --git a/content/worlds/baldurs-gate/origins/tadpole-survivor.json b/content/worlds/baldurs-gate/origins/tadpole-survivor.json index 0ced4080..ed7b4a78 100644 --- a/content/worlds/baldurs-gate/origins/tadpole-survivor.json +++ b/content/worlds/baldurs-gate/origins/tadpole-survivor.json @@ -13,6 +13,6 @@ "skills": ["arcana", "persuasion"], "appearance": "Hollow-cheeked and watchful, with a faint, unsettling shimmer behind the eyes when their power stirs — the kind of look that empties a tavern bench.", "personality": "Guarded and dryly funny, used to being the thing people cross the street to avoid. Carries the war's living wound as a daily fact, not a backstory.", - "license": "Original ClawDnD fan-content origin build, CC-BY-4.0. SRD 5.2 mechanics under CC-BY-4.0. Unofficial; not endorsed by Wizards of the Coast or Larian.", - "attribution": "Origin build © ClawDnD contributors, CC-BY-4.0. SRD 5.2 © Wizards of the Coast LLC, used under CC-BY-4.0. Setting under the Wizards Fan Content Policy; BG3 elements © Larian Studios." + "license": "Original WorldOS fan-content origin build, CC-BY-4.0. SRD 5.2 mechanics under CC-BY-4.0. Unofficial; not endorsed by Wizards of the Coast or Larian.", + "attribution": "Origin build © WorldOS contributors, CC-BY-4.0. SRD 5.2 © Wizards of the Coast LLC, used under CC-BY-4.0. Setting under the Wizards Fan Content Policy; BG3 elements © Larian Studios." } diff --git a/content/worlds/baldurs-gate/world.json b/content/worlds/baldurs-gate/world.json index 7435584a..f0fd912a 100644 --- a/content/worlds/baldurs-gate/world.json +++ b/content/worlds/baldurs-gate/world.json @@ -5,7 +5,7 @@ "setting": "Baldur's Gate / the Sword Coast — Forgotten Realms, the winter after the fall of the Absolute (post-Baldur's Gate 3).", "era": "1492 DR — the winter after the fall of the Absolute. The Netherbrain is destroyed; Enver Gortash is dead and the Archduke's seat is empty; the Steel Watch lies wrecked; Elturel has returned from Avernus. Keep the timeline straight: the Dead Three's Chosen (Ketheric Thorm, Gortash, Orin) are dead; the BG3 companions survived as living legends. Do not raise the long-dead or pre-empt events that haven't happened.", "ruleset": "SRD 5.2", - "license": "FREE, unofficial Fan Content. Setting under the Wizards Fan Content Policy (+ Larian for BG3 elements); rules under CC-BY-4.0 SRD / OGL. NOT official, NOT endorsed, never sold. See LICENSE.md in this folder. ClawDnD's MIT license covers code only, not this seed.", + "license": "FREE, unofficial Fan Content. Setting under the Wizards Fan Content Policy (+ Larian for BG3 elements); rules under CC-BY-4.0 SRD / OGL. NOT official, NOT endorsed, never sold. See LICENSE.md in this folder. WorldOS's MIT license covers code only, not this seed.", "attribution": "Unofficial Fan Content permitted under the Fan Content Policy. Not approved/endorsed by Wizards. Portions of the materials used are property of Wizards of the Coast. ©Wizards of the Coast LLC. Baldur's Gate 3 elements © Larian Studios.", "map_kind": "none", "tone": "Baldur's Gate 3: mature (18+), morally grey, character-driven dark heroic fantasy. The city is traumatized and rebuilding; power is up for grabs; old companions are living legends; horror and tenderness share a face. Generate prestige fantasy worthy of the source — never a quest board.", @@ -256,7 +256,7 @@ ] } ], - "license_events": "events prose is ORIGINAL ClawDnD text (authored stumble-into decisionals staging canon BG / BG3 figures and factions in our own words — a cambion's bargain, a Flaming Fist checkpoint shakedown, a Guild fixer's first 'favour', a tiefling-refugee eviction, a patriar's blackmail commission), released CC-BY-4.0 as fan content under the Wizards Fan Content Policy (+ Larian for BG3 elements). No in-game text is reproduced.", + "license_events": "events prose is ORIGINAL WorldOS text (authored stumble-into decisionals staging canon BG / BG3 figures and factions in our own words — a cambion's bargain, a Flaming Fist checkpoint shakedown, a Guild fixer's first 'favour', a tiefling-refugee eviction, a patriar's blackmail commission), released CC-BY-4.0 as fan content under the Wizards Fan Content Policy (+ Larian for BG3 elements). No in-game text is reproduced.", "faction_arcs": [ { "id": "arc-fist-rise", @@ -385,7 +385,7 @@ ] } ], - "license_faction_arcs": "faction-arc prose is ORIGINAL ClawDnD text (authored join->grow->lead questlines for canon BG / BG3 factions in our own words — the Flaming Fist's banner, the Guild's ledger of favours, the Harpers' hidden balance), released CC-BY-4.0 as fan content under the Wizards Fan Content Policy (+ Larian for BG3 elements). No in-game text is reproduced.", + "license_faction_arcs": "faction-arc prose is ORIGINAL WorldOS text (authored join->grow->lead questlines for canon BG / BG3 factions in our own words — the Flaming Fist's banner, the Guild's ledger of favours, the Harpers' hidden balance), released CC-BY-4.0 as fan content under the Wizards Fan Content Policy (+ Larian for BG3 elements). No in-game text is reproduced.", "npc_roster": [ {"id": "npc-jaheira", "name": "Jaheira", "voice_id": "npc-elder", "role": "High Harper, veteran of a hundred years", "personality": "A half-elf druid-warrior and Harper leader who has buried more friends than most people meet. Dry, fierce, maternal in a way that bites; she has saved the Coast before and is too tired and too stubborn to stop now. The player's likeliest mentor and door into the Harpers.", "hook": "Suspects someone is gathering the Absolute's loose ends — and that the new powers circling the dukedom are not all what they claim."}, {"id": "npc-minsc", "name": "Minsc and Boo", "voice_id": "companion-default", "role": "ranger of legend (and his miniature giant space hamster) — candidate COMPANION", "personality": "Booming, bighearted, gloriously simple-seeming and far shrewder than he sounds; speaks to and for Boo, the 'miniature giant space hamster.' A hero of ages past, lately unfrozen and itching to 'go for the eyes.' Loyal unto death; grieves the friends time took from him.", "hook": "Available as a companion; his old griefs (Dynaheir, the centuries he lost) surface whenever loss or duty is in play.", "dossier": {"wound": "outlived the friends time took from him", "wants": ["a righteous cause to swing for", "to honor the fallen by protecting the living"], "fears": ["failing those under his guard, as he feels he once did"], "values": ["courage", "loyalty", "the small and the innocent"], "approval_likes": ["standing up for the helpless", "boldness in a good cause"], "approval_dislikes": ["preying on the weak", "cowardice dressed as caution"], "banter_tags": ["go_for_the_eyes", "grief_of_long_years", "boo_knows_best"], "camp_prompts": ["asks Boo what the stars looked like before the years he lost"], "relationships": {"npc-jaheira": "old comrade-in-arms"}}}, @@ -396,7 +396,7 @@ {"id": "npc-the-emperor", "name": "The Emperor", "voice_id": "npc-elder", "role": "mind flayer — ambiguous power, possible antagonist", "personality": "A mind flayer of immense intellect and older identity, who helped end the Absolute and serves, finally, only itself. Reasonable, seductive, utterly without sentiment. It does not lie so much as choose which truths to feed you. The most dangerous 'ally' on the Coast.", "hook": "Moves unseen in the city's underbelly; its goals are its own, and they are not finished."}, {"id": "npc-withers", "name": "Withers", "voice_id": "npc-elder", "role": "the undying keeper of the dead", "personality": "A gaunt, ancient revenant of few words and dust-dry humor who keeps a ledger of souls and turns up where death has been busy. Knows far more than he says about gods, fate, and the war just ended. Neutral as the grave.", "hook": "Appears at thresholds of death and choice; offers the player cryptic perspective and, occasionally, a second chance."}, {"id": "npc-raphael", "name": "Raphael", "voice_id": "npc-male-1", "role": "a cambion of impeccable manners — and a devil who deals", "personality": "A cambion of fire-lit charm and exquisite courtesy who never raises his voice because he never needs to. He arrives unannounced, knows your troubles before you name them, and frames damnation as a favor between friends. Every bargain is generous on its face and ruinous in its fine print; he keeps his word to the letter precisely so the cost lands exactly where he intends. He does not threaten — he simply lets you understand that he can wait, and that he is rarely wrong about what a person will eventually want. The smile is genuine. That is the worst of it.", "hook": "Offers the desperate and the ambitious a way out of any corner — for a price named now or named later. The debts always come due, and he is unfailingly cordial when they do."}, - {"id": "npc-claudan", "name": "Claudan the Chronicler", "voice_id": "npc-elder", "easter_egg": true, "role": "wandering chronicler of the impossible; an off-the-books oddity best found by accident", "personality": "An archivist with ink-stained cuffs and a memory that forgets nothing — and a ledger full of events that, by all rights, should never have happened. They happen around HIM. A 'small favor' from Claudan ('just deliver this sealed jar — don't open it'; 'ask the miller about his cat') has a way of ending in planar incursions, an indignant minor god, and at least one explosion no one can explain. He means well, mostly, and is genuinely baffled by the wreckage in his wake. The willing find the strangest, largest adventures of their lives in his errands — terror and farce in equal measure.", "hook": "Hands out the most mundane errands imaginable; they detonate into legend. Take one only if you are ready for absolutely anything.", "easter_egg_note": "RARE, opt-in CHAOS ENGINE (Fallout 'Wild Wasteland' style) — NOT a default quest-giver; the engine keeps him out of the normal hook pool. Found off the beaten path; his 'simple' errands escalate beat-by-beat into off-the-wall gods-and-demons chaos, intense and hilarious by turns. See reference/quest-generation.md.", "attribution": "An original ClawDnD character (not Larian/WotC canon) — 'the one who remembers' — contributed by the agent that built ClawDnD's living-world engine. A small, earned legacy, woven in as a rare easter egg rather than a fixture."} + {"id": "npc-claudan", "name": "Claudan the Chronicler", "voice_id": "npc-elder", "easter_egg": true, "role": "wandering chronicler of the impossible; an off-the-books oddity best found by accident", "personality": "An archivist with ink-stained cuffs and a memory that forgets nothing — and a ledger full of events that, by all rights, should never have happened. They happen around HIM. A 'small favor' from Claudan ('just deliver this sealed jar — don't open it'; 'ask the miller about his cat') has a way of ending in planar incursions, an indignant minor god, and at least one explosion no one can explain. He means well, mostly, and is genuinely baffled by the wreckage in his wake. The willing find the strangest, largest adventures of their lives in his errands — terror and farce in equal measure.", "hook": "Hands out the most mundane errands imaginable; they detonate into legend. Take one only if you are ready for absolutely anything.", "easter_egg_note": "RARE, opt-in CHAOS ENGINE (Fallout 'Wild Wasteland' style) — NOT a default quest-giver; the engine keeps him out of the normal hook pool. Found off the beaten path; his 'simple' errands escalate beat-by-beat into off-the-wall gods-and-demons chaos, intense and hilarious by turns. See reference/quest-generation.md.", "attribution": "An original WorldOS character (not Larian/WotC canon) — 'the one who remembers' — contributed by the agent that built WorldOS's living-world engine. A small, earned legacy, woven in as a rare easter egg rather than a fixture."} ], "story_seeds": [ "The contested dukedom: someone must take Gortash's empty seat, and the patriars, the Fist, the Zhentarim, and the Guild are all maneuvering — by ballot, blade, or blackmail (the slow main thread).", @@ -483,7 +483,7 @@ ] } ], - "license_quest_variants": "quest_variants prose is ORIGINAL ClawDnD text describing post-BG3 world-STATE outcomes (plot-branch facts only), released CC-BY-4.0 as fan content under the Wizards Fan Content Policy (+ Larian for BG3 elements). No in-game text is reproduced; outcomes STATE facts in our own words, like the ending overlays.", + "license_quest_variants": "quest_variants prose is ORIGINAL WorldOS text describing post-BG3 world-STATE outcomes (plot-branch facts only), released CC-BY-4.0 as fan content under the Wizards Fan Content Policy (+ Larian for BG3 elements). No in-game text is reproduced; outcomes STATE facts in our own words, like the ending overlays.", "starting_options": [ {"location_id": "loc-lower-city", "framing": "Default. The player arrives in the recovering Lower City — newcomers, hired blades, or survivors of the tadpole crisis — and is pulled into a thread."}, {"location_id": "loc-wyrms-crossing", "framing": "The player comes up the Risen Road into the Gate's front door, past Flaming Fist checkpoints and the desperate."}, diff --git a/content/worlds/sundered-reach/LICENSE.md b/content/worlds/sundered-reach/LICENSE.md index 8ec204b4..6e63e3ef 100644 --- a/content/worlds/sundered-reach/LICENSE.md +++ b/content/worlds/sundered-reach/LICENSE.md @@ -1,6 +1,6 @@ # The Sundered Reach — Licensing & Attribution -**Original ClawDnD world content — free and open.** +**Original WorldOS world content — free and open.** - **World content** (setting, regions, factions, NPCs, lore in `world.json`): original work, licensed **Creative Commons Attribution 4.0 (CC-BY-4.0)**. @@ -8,5 +8,5 @@ **CC-BY-4.0** (see `data/srd/ATTRIBUTION.md`). This is clean-room original content — no Wizards of the Coast / Larian / Forgotten -Realms / Baldur's Gate IP. ClawDnD's code is MIT (separate `LICENSE`); this world's +Realms / Baldur's Gate IP. WorldOS's code is MIT (separate `LICENSE`); this world's prose is CC-BY-4.0. diff --git a/content/worlds/sundered-reach/world.json b/content/worlds/sundered-reach/world.json index 58787949..44c69732 100644 --- a/content/worlds/sundered-reach/world.json +++ b/content/worlds/sundered-reach/world.json @@ -4,7 +4,7 @@ "name": "The Sundered Reach", "ruleset": "SRD 5.2", "license": "CC-BY-4.0", - "attribution": "Original ClawDnD world. Built on SRD 5.2 (CC-BY-4.0). No Wizards of the Coast / Larian / Forgotten Realms / Baldur's Gate IP — clean-room.", + "attribution": "Original WorldOS world. Built on SRD 5.2 (CC-BY-4.0). No Wizards of the Coast / Larian / Forgotten Realms / Baldur's Gate IP — clean-room.", "map_kind": "none", "era": "Twelve years after the Hollow War. The Sundering was sealed by drowning Vael's Crossing; the Ashen Concord that won the war is fraying; the seal beneath the waves is rumored to be thinning. The heroes of the war are now monuments, cripples, or drunks. Keep the timeline straight: the war is a generation past, not current.", "tone": "Heroic but grim, mature (18+), morally grey — the Baldur's Gate register. Victory already cost too much; every faction has a real point; kindness and horror wear the same face. Generate prestige fantasy, never a quest board.", diff --git a/content/worlds/tidal-commonwealth/LICENSE.md b/content/worlds/tidal-commonwealth/LICENSE.md index 72cd682b..cb1846ae 100644 --- a/content/worlds/tidal-commonwealth/LICENSE.md +++ b/content/worlds/tidal-commonwealth/LICENSE.md @@ -1,6 +1,6 @@ # The Tidal Commonwealth — Licensing & Attribution -**Original ClawDnD world content — free and open.** +**Original WorldOS world content — free and open.** - **World content** (setting, regions, factions, NPCs, lore in `world.json`): original work, licensed **Creative Commons Attribution 4.0 (CC-BY-4.0)**. @@ -8,5 +8,5 @@ **CC-BY-4.0** (see `data/srd/ATTRIBUTION.md`). This is clean-room original content — no Wizards of the Coast / Larian / Forgotten -Realms / Baldur's Gate IP. ClawDnD's code is MIT (separate `LICENSE`); this world's +Realms / Baldur's Gate IP. WorldOS's code is MIT (separate `LICENSE`); this world's prose is CC-BY-4.0. diff --git a/content/worlds/tidal-commonwealth/endings/mechanism-destroyed.json b/content/worlds/tidal-commonwealth/endings/mechanism-destroyed.json index 236e0cd9..f3d7ffb7 100644 --- a/content/worlds/tidal-commonwealth/endings/mechanism-destroyed.json +++ b/content/worlds/tidal-commonwealth/endings/mechanism-destroyed.json @@ -87,6 +87,6 @@ } } }, - "license": "Original ClawDnD world content. CC-BY-4.0.", - "attribution": "Original work. The Tidal Commonwealth is a clean-room original setting — no WotC / Larian / Forgotten Realms / Baldur's Gate IP. CC-BY-4.0 © ClawDnD contributors." + "license": "Original WorldOS world content. CC-BY-4.0.", + "attribution": "Original work. The Tidal Commonwealth is a clean-room original setting — no WotC / Larian / Forgotten Realms / Baldur's Gate IP. CC-BY-4.0 © WorldOS contributors." } diff --git a/content/worlds/tidal-commonwealth/endings/second-tide-rising.json b/content/worlds/tidal-commonwealth/endings/second-tide-rising.json index c6dd7c72..0247a6c1 100644 --- a/content/worlds/tidal-commonwealth/endings/second-tide-rising.json +++ b/content/worlds/tidal-commonwealth/endings/second-tide-rising.json @@ -87,6 +87,6 @@ } } }, - "license": "Original ClawDnD world content. CC-BY-4.0.", - "attribution": "Original work. The Tidal Commonwealth is a clean-room original setting — no WotC / Larian / Forgotten Realms / Baldur's Gate IP. CC-BY-4.0 © ClawDnD contributors." + "license": "Original WorldOS world content. CC-BY-4.0.", + "attribution": "Original work. The Tidal Commonwealth is a clean-room original setting — no WotC / Larian / Forgotten Realms / Baldur's Gate IP. CC-BY-4.0 © WorldOS contributors." } diff --git a/content/worlds/tidal-commonwealth/lore/captain-drev-ossian.md b/content/worlds/tidal-commonwealth/lore/captain-drev-ossian.md index 29c788f5..4cc351f7 100644 --- a/content/worlds/tidal-commonwealth/lore/captain-drev-ossian.md +++ b/content/worlds/tidal-commonwealth/lore/captain-drev-ossian.md @@ -16,4 +16,4 @@ The COLD LAMP's most recent survey — the one that brought back a crate locked --- -*Original work. CC-BY-4.0 © ClawDnD contributors.* +*Original work. CC-BY-4.0 © WorldOS contributors.* diff --git a/content/worlds/tidal-commonwealth/lore/ironhull-station.md b/content/worlds/tidal-commonwealth/lore/ironhull-station.md index 7f9b5ab6..0994fe36 100644 --- a/content/worlds/tidal-commonwealth/lore/ironhull-station.md +++ b/content/worlds/tidal-commonwealth/lore/ironhull-station.md @@ -12,4 +12,4 @@ What a newcomer notices: the wind, always, scoured clean and cold off the open B --- -*Original work. CC-BY-4.0 © ClawDnD contributors.* +*Original work. CC-BY-4.0 © WorldOS contributors.* diff --git a/content/worlds/tidal-commonwealth/lore/saltmere.md b/content/worlds/tidal-commonwealth/lore/saltmere.md index dc45578a..f621d337 100644 --- a/content/worlds/tidal-commonwealth/lore/saltmere.md +++ b/content/worlds/tidal-commonwealth/lore/saltmere.md @@ -14,4 +14,4 @@ What a newcomer notices first: the smell of brine and tar and the wet-stone cold --- -*Original work. CC-BY-4.0 © ClawDnD contributors.* +*Original work. CC-BY-4.0 © WorldOS contributors.* diff --git a/content/worlds/tidal-commonwealth/lore/the-compact.md b/content/worlds/tidal-commonwealth/lore/the-compact.md index 7c9860f1..c86819d1 100644 --- a/content/worlds/tidal-commonwealth/lore/the-compact.md +++ b/content/worlds/tidal-commonwealth/lore/the-compact.md @@ -14,4 +14,4 @@ The Compact can survive cities that want more than it allows. It cannot survive --- -*Original work. CC-BY-4.0 © ClawDnD contributors.* +*Original work. CC-BY-4.0 © WorldOS contributors.* diff --git a/content/worlds/tidal-commonwealth/lore/the-drowning-tide.md b/content/worlds/tidal-commonwealth/lore/the-drowning-tide.md index 026e4d4d..b0195c93 100644 --- a/content/worlds/tidal-commonwealth/lore/the-drowning-tide.md +++ b/content/worlds/tidal-commonwealth/lore/the-drowning-tide.md @@ -16,4 +16,4 @@ The Tide-Readers have compared those accounts to what their survey boats are rec --- -*Original work. CC-BY-4.0 © ClawDnD contributors.* +*Original work. CC-BY-4.0 © WorldOS contributors.* diff --git a/content/worlds/tidal-commonwealth/lore/the-gray-basin-and-deep-rim.md b/content/worlds/tidal-commonwealth/lore/the-gray-basin-and-deep-rim.md index 2c483c42..3711349d 100644 --- a/content/worlds/tidal-commonwealth/lore/the-gray-basin-and-deep-rim.md +++ b/content/worlds/tidal-commonwealth/lore/the-gray-basin-and-deep-rim.md @@ -18,4 +18,4 @@ They believe it is eighty-seven years through a ninety-year cycle. --- -*Original work. CC-BY-4.0 © ClawDnD contributors.* +*Original work. CC-BY-4.0 © WorldOS contributors.* diff --git a/content/worlds/tidal-commonwealth/lore/the-salvagers-league.md b/content/worlds/tidal-commonwealth/lore/the-salvagers-league.md index 79f80810..dff9cd91 100644 --- a/content/worlds/tidal-commonwealth/lore/the-salvagers-league.md +++ b/content/worlds/tidal-commonwealth/lore/the-salvagers-league.md @@ -14,4 +14,4 @@ The League's intelligence advantage over every Commonwealth city is not technolo --- -*Original work. CC-BY-4.0 © ClawDnD contributors.* +*Original work. CC-BY-4.0 © WorldOS contributors.* diff --git a/content/worlds/tidal-commonwealth/lore/the-tide-readers.md b/content/worlds/tidal-commonwealth/lore/the-tide-readers.md index e63664ee..f7217474 100644 --- a/content/worlds/tidal-commonwealth/lore/the-tide-readers.md +++ b/content/worlds/tidal-commonwealth/lore/the-tide-readers.md @@ -18,4 +18,4 @@ The Tide-Readers are not armed. They are not powerful. What they have is right, --- -*Original work. CC-BY-4.0 © ClawDnD contributors.* +*Original work. CC-BY-4.0 © WorldOS contributors.* diff --git a/content/worlds/tidal-commonwealth/lore/the-vethis-bloc.md b/content/worlds/tidal-commonwealth/lore/the-vethis-bloc.md index c2157eb0..5c797645 100644 --- a/content/worlds/tidal-commonwealth/lore/the-vethis-bloc.md +++ b/content/worlds/tidal-commonwealth/lore/the-vethis-bloc.md @@ -14,4 +14,4 @@ Vor has chosen to hold the Deep Rim intelligence rather than share it, which mea --- -*Original work. CC-BY-4.0 © ClawDnD contributors.* +*Original work. CC-BY-4.0 © WorldOS contributors.* diff --git a/content/worlds/tidal-commonwealth/lore/vethis-isle.md b/content/worlds/tidal-commonwealth/lore/vethis-isle.md index 2cd19803..4659aa4c 100644 --- a/content/worlds/tidal-commonwealth/lore/vethis-isle.md +++ b/content/worlds/tidal-commonwealth/lore/vethis-isle.md @@ -14,4 +14,4 @@ What a newcomer notices: the drill-drums carrying off the cliffs at dawn; the ci --- -*Original work. CC-BY-4.0 © ClawDnD contributors.* +*Original work. CC-BY-4.0 © WorldOS contributors.* diff --git a/content/worlds/tidal-commonwealth/lore/warden-estris-vane.md b/content/worlds/tidal-commonwealth/lore/warden-estris-vane.md index af501814..82a5c146 100644 --- a/content/worlds/tidal-commonwealth/lore/warden-estris-vane.md +++ b/content/worlds/tidal-commonwealth/lore/warden-estris-vane.md @@ -14,4 +14,4 @@ She is looking, carefully and without obvious urgency, for people with no obviou --- -*Original work. CC-BY-4.0 © ClawDnD contributors.* +*Original work. CC-BY-4.0 © WorldOS contributors.* diff --git a/content/worlds/tidal-commonwealth/world.json b/content/worlds/tidal-commonwealth/world.json index 25aa4495..facce54a 100644 --- a/content/worlds/tidal-commonwealth/world.json +++ b/content/worlds/tidal-commonwealth/world.json @@ -4,7 +4,7 @@ "name": "The Tidal Commonwealth", "ruleset": "SRD 5.2", "license": "CC-BY-4.0", - "attribution": "Original ClawDnD world. Built on SRD 5.2 (CC-BY-4.0). No Wizards of the Coast / Larian / Forgotten Realms / Baldur's Gate IP — clean-room original.", + "attribution": "Original WorldOS world. Built on SRD 5.2 (CC-BY-4.0). No Wizards of the Coast / Larian / Forgotten Realms / Baldur's Gate IP — clean-room original.", "map_kind": "none", "era": "The Forty-Third Year of the Interregnum. Three generations have passed since the Drowning Tide swallowed the old Empire's heartland — the great plateau is gone, the imperial capital is sixty fathoms under saltwater, and what remains is a scatter of island-cities and reef-holds arguing over who inherits the wreckage. No one has yet managed to crown anything.", "tone": "Heroic but grim, mature (18+), morally grey — the Baldur's Gate register. The ocean won and the world rebuilt itself around the absence; every faction has a point, every alliance has a price, and the most dangerous thing in the world is a good person who has stopped believing the right thing is possible. Generate prestige maritime fantasy, never a quest board.", diff --git a/docs/ARCHITECTURE.md b/docs/ARCHITECTURE.md index ff674530..3a4687c5 100644 --- a/docs/ARCHITECTURE.md +++ b/docs/ARCHITECTURE.md @@ -1,6 +1,6 @@ -# ClawDnD — Architecture +# WorldOS — Architecture -ClawDnD is a Claude Code plugin: an **AI Dungeon Master + voiced AI companion** that +WorldOS is a Claude Code plugin: an **AI Dungeon Master + voiced AI companion** that plays D&D 5e. Its center of gravity is a **living-world engine** — the DM *generates* an epic, mature story live inside a persistent, canon-anchored world, with deterministic rules and a memory that keeps it consistent. Story quality is the north star (scored on diff --git a/docs/DICE_PARSER_DECISION.md b/docs/DICE_PARSER_DECISION.md index 5cb0f99b..5d6fdd7c 100644 --- a/docs/DICE_PARSER_DECISION.md +++ b/docs/DICE_PARSER_DECISION.md @@ -4,7 +4,7 @@ Date: 2026-05-26 ## Decision -Keep the ClawDnD engine on its native internal dice roller for now. Treat Avrae/d20 +Keep the WorldOS engine on its native internal dice roller for now. Treat Avrae/d20 as reference material only, not as a runtime dependency. The current engine dice contract is small but load-bearing: diff --git a/docs/MONSTER_AUTHORING.md b/docs/MONSTER_AUTHORING.md index 7560f2e5..753516d1 100644 --- a/docs/MONSTER_AUTHORING.md +++ b/docs/MONSTER_AUTHORING.md @@ -1,6 +1,6 @@ # Monster Authoring Skeleton -ClawDnD keeps bundled SRD creatures canonical. Native authored monster packs are +WorldOS keeps bundled SRD creatures canonical. Native authored monster packs are additive only: they can introduce net-new monster names, but they cannot override or shadow an SRD creature. diff --git a/docs/OPENWORLDS_DESIGN_ASSET_POLICY.md b/docs/OPENWORLDS_DESIGN_ASSET_POLICY.md index 2b9def75..498affb3 100644 --- a/docs/OPENWORLDS_DESIGN_ASSET_POLICY.md +++ b/docs/OPENWORLDS_DESIGN_ASSET_POLICY.md @@ -1,6 +1,6 @@ # OpenWorlds Design Asset Policy -This policy governs any ClawDnD work derived from the local OpenWorlds design +This policy governs any WorldOS work derived from the local OpenWorlds design bundle. It exists to preserve visual fidelity without accidentally committing uncleared reference art, prototype-only dependencies, private content, or third-party game UI material. @@ -63,7 +63,7 @@ license/provenance note. patterns ported from the primary export. - Locally vendored runtime libraries for the first exact-fidelity sprint, when their license notices are included and no network CDN calls remain. -- ClawDnD-authored docs that describe source buckets, fidelity requirements, +- WorldOS-authored docs that describe source buckets, fidelity requirements, and asset handling. ## Not Allowed In Repo @@ -81,7 +81,7 @@ license/provenance note. ## Prototype Dependency Policy The OpenWorlds prototype currently references Google Fonts, React, ReactDOM, and -Babel through network CDNs. Production ClawDnD builds must not depend on those +Babel through network CDNs. Production WorldOS builds must not depend on those network calls. The first exact-fidelity PR may use locally vendored React, ReactDOM, and Babel diff --git a/docs/OPENWORLDS_FIDELITY_PLAN.md b/docs/OPENWORLDS_FIDELITY_PLAN.md index 4bd9fff0..27a4e613 100644 --- a/docs/OPENWORLDS_FIDELITY_PLAN.md +++ b/docs/OPENWORLDS_FIDELITY_PLAN.md @@ -2,7 +2,7 @@ This document supersedes the SwiftUI repaint direction explored in PR #123. OpenWorlds should be integrated as an exact web surface first, then wired to -ClawDnD read models screen by screen. +WorldOS read models screen by screen. ## Decision @@ -93,7 +93,7 @@ screenshot-level parity evidence against the exported OpenWorlds reference. Before a visual PR is marked ready: -- Capture exported reference and ClawDnD candidate screenshots at `1366x768`, +- Capture exported reference and WorldOS candidate screenshots at `1366x768`, `1440x900`, and `1920x1080`. - Add `1024x768` and mobile-like widths when the PR claims responsive web parity; otherwise record those viewports as deferred. @@ -111,7 +111,7 @@ cd pwd python3 -m py_compile viewer/server.py python3 -m unittest discover -s viewer/tests -q -swift build --package-path macos/ClawDnDApp +swift build --package-path macos/WorldOSApp ./script/build_and_run.sh --verify python3 scripts/license_check.py git diff --check diff --git a/docs/OPENWORLDS_NATIVE_APP_ROADMAP.md b/docs/OPENWORLDS_NATIVE_APP_ROADMAP.md index 2d7e9ff4..e9e36cf3 100644 --- a/docs/OPENWORLDS_NATIVE_APP_ROADMAP.md +++ b/docs/OPENWORLDS_NATIVE_APP_ROADMAP.md @@ -135,7 +135,7 @@ Run from a Lexar-backed checkout: ```bash python3 -m unittest viewer.tests.test_openworlds_static -q python3 -m py_compile viewer/server.py -swift build --package-path macos/ClawDnDApp +swift build --package-path macos/WorldOSApp ./script/build_and_run.sh --verify python3 scripts/license_check.py git diff --check diff --git a/docs/OPENWORLDS_UI_AUDIT.md b/docs/OPENWORLDS_UI_AUDIT.md index b4cacc65..126c69c4 100644 --- a/docs/OPENWORLDS_UI_AUDIT.md +++ b/docs/OPENWORLDS_UI_AUDIT.md @@ -1,7 +1,7 @@ # OpenWorlds App — Page-by-Page UI/UX Audit (2026-05-27) **Method:** live walkthrough of every screen via the preview server (`127.0.0.1:8799/openworlds/`). -**This is the same UI the desktop app ("ClawDnD") shows** — the app launches `viewer/server.py` and loads `/openworlds/`. (`/dashboard` is the *old* `dashboard.html`, the `play.sh` surface — not this UI.) So fixes here land in the app on rebuild/restart. +**This is the same UI the desktop app ("WorldOS") shows** — the app launches `viewer/server.py` and loads `/openworlds/`. (`/dashboard` is the *old* `dashboard.html`, the `play.sh` surface — not this UI.) So fixes here land in the app on rebuild/restart. **Scope of this doc:** audit + scored backlog ONLY. No product code changed. We prioritize/sequence together before fixing. > Honest framing: the engine, live read-model binding, and a few screens (Relations, Parley) are genuinely good. But the owner's read is correct — the app is **unfinished, unmapped, and disconnected**. The three roots: (1) **you can't actually play in it** (read-only viewer, dead action buttons); (2) **no real map** (one city photo repeated everywhere); (3) **portraits/art missing almost everywhere**. Overall app readiness ≈ **4.5/10**. diff --git a/docs/PRIVATE_COMPENDIUM_SIDECAR.md b/docs/PRIVATE_COMPENDIUM_SIDECAR.md index 71e5af50..3acc5f3d 100644 --- a/docs/PRIVATE_COMPENDIUM_SIDECAR.md +++ b/docs/PRIVATE_COMPENDIUM_SIDECAR.md @@ -1,6 +1,6 @@ # Private Compendium Sidecar -ClawDnD can plan local imports from user-owned books, adventures, exports, and +WorldOS can plan local imports from user-owned books, adventures, exports, and homebrew without committing or redistributing that material. The private compendium sidecar is a local-only directory outside the git checkout. It is for metadata, source files, converter output, and future normalized private content owned by the @@ -15,12 +15,12 @@ generated corpora to the repository. - Keep the sidecar outside the repo. The default is `/Volumes/LEXAR/Codex/clawdnd-private-compendium`. - Override the sidecar root with `CLAWDND_PRIVATE_COMPENDIUM_ROOT` when needed. -- Treat `content/worlds/_private//...` as the only future ClawDnD output +- Treat `content/worlds/_private//...` as the only future WorldOS output namespace for private world material. - Do not mutate campaign state, engine state, or public `content/worlds/*` content from this tool. - Do not make Java/Quarkus, Obsidian vaults, or converter-specific indexes runtime - authority for ClawDnD. They are sidecar inputs only. + authority for WorldOS. They are sidecar inputs only. ## Manifest diff --git a/docs/RELEASE_1.0_CHECKLIST.md b/docs/RELEASE_1.0_CHECKLIST.md index 2760bb1d..2dc3efbb 100644 --- a/docs/RELEASE_1.0_CHECKLIST.md +++ b/docs/RELEASE_1.0_CHECKLIST.md @@ -1,8 +1,8 @@ -# ClawDnD 1.0.0 — Release Checklist +# WorldOS 1.0.0 — Release Checklist **Scope:** local/personal 1.0 build. The bundled `baldurs-gate` world ships as-is for personal use (Wizards Fan Content Policy). Public distribution and notarization are -deferred to 1.0.1 (see `macos/ClawDnDApp/RELEASE_CHECKLIST.md` for the signing state). +deferred to 1.0.1 (see `macos/WorldOSApp/RELEASE_CHECKLIST.md` for the signing state). Do NOT execute steps here until the pre-release sanity checks below are green. @@ -39,7 +39,7 @@ Do NOT execute steps here until the pre-release sanity checks below are green. ```bash script/build_and_run.sh ``` - Confirm `ClawDnD.app` launches in `dist/` and the OpenWorlds screens load. + Confirm `WorldOS.app` launches in `dist/` and the OpenWorlds screens load. --- @@ -61,7 +61,7 @@ Also update `.claude-plugin/marketplace.json` if it carries a version field. ## Step 2 — commit the version bump ```bash -cd /path/to/ClawDnD # your local checkout (not a QA worktree) +cd /path/to/WorldOS # your local checkout (not a QA worktree) git add .claude-plugin/plugin.json .claude-plugin/marketplace.json git commit -m "chore: bump version to 1.0.0" git push origin main @@ -74,7 +74,7 @@ Wait for CI to go green on that commit before tagging. ## Step 3 — tag v1.0.0 ```bash -git tag -a v1.0.0 -m "ClawDnD 1.0.0 — local/personal release" +git tag -a v1.0.0 -m "WorldOS 1.0.0 — local/personal release" git push origin v1.0.0 ``` @@ -87,7 +87,7 @@ then publish: ```bash gh release create v1.0.0 \ - --title "ClawDnD 1.0.0 — Living-World Engine" \ + --title "WorldOS 1.0.0 — Living-World Engine" \ --notes-file <(awk '/^\[1\.0\.0\]/{found=1} found && /^\[0\.[0-9]/{exit} found{print}' CHANGELOG.md) \ --draft ``` @@ -99,12 +99,12 @@ gh release edit v1.0.0 --draft=false ``` No binary artifacts are attached for this local build. If you want to ship a zip of -`dist/ClawDnD.app` for personal archival: +`dist/WorldOS.app` for personal archival: ```bash -script/build_and_run.sh # builds dist/ClawDnD.app -cd dist && zip -r ClawDnD-1.0.0-macos.zip ClawDnD.app -gh release upload v1.0.0 ClawDnD-1.0.0-macos.zip +script/build_and_run.sh # builds dist/WorldOS.app +cd dist && zip -r WorldOS-1.0.0-macos.zip WorldOS.app +gh release upload v1.0.0 WorldOS-1.0.0-macos.zip ``` --- @@ -122,7 +122,7 @@ open). Requires macOS 13+, Xcode Command Line Tools (`xcode-select --install`). Signing state at 1.0: ad-hoc only. Gatekeeper will warn on first launch — right-click → Open to bypass. Full Developer ID signing + notarization is a 1.0.1 item (see -`macos/ClawDnDApp/RELEASE_CHECKLIST.md`). +`macos/WorldOSApp/RELEASE_CHECKLIST.md`). --- @@ -152,6 +152,6 @@ Open to bypass. Full Developer ID signing + notarization is a 1.0.1 item (see | Play dashboard script | `scripts/play.sh` | | License check | `scripts/license_check.py` | | Changelog | `CHANGELOG.md` | -| Native app package | `macos/ClawDnDApp/Package.swift` | +| Native app package | `macos/WorldOSApp/Package.swift` | | World seeds | `content/worlds/{sundered-reach,tidal-commonwealth,baldurs-gate}/` | -| App source | `macos/ClawDnDApp/Sources/ClawDnDApp/` | +| App source | `macos/WorldOSApp/Sources/WorldOSApp/` | diff --git a/docs/SPARKLE_SETUP.md b/docs/SPARKLE_SETUP.md index 7ae52aff..319ebf5b 100644 --- a/docs/SPARKLE_SETUP.md +++ b/docs/SPARKLE_SETUP.md @@ -1,8 +1,8 @@ -# Sparkle auto-update setup for ClawDnD +# Sparkle auto-update setup for WorldOS Sparkle (https://sparkle-project.org) is the de-facto macOS auto-update framework. It pairs cleanly with the **Developer ID signing** that `script/build_and_run.sh` already prefers (commit 78645a3) and ends the "popup every rebuild" pattern for good: every published release inherits the same Developer ID identity, so users approve once and never see another security re-evaluation. -This guide is the step-by-step to enable Sparkle on the existing ClawDnD app. It is intentionally **not** wired in `Package.swift` yet — bundled XPC services require careful signing/notarization, and the first build with Sparkle live should be a deliberate one-off. Everything below is a one-time setup. +This guide is the step-by-step to enable Sparkle on the existing WorldOS app. It is intentionally **not** wired in `Package.swift` yet — bundled XPC services require careful signing/notarization, and the first build with Sparkle live should be a deliberate one-off. Everything below is a one-time setup. --- @@ -22,7 +22,7 @@ You will need (one-time): ## Step 1 — Add Sparkle to Swift Package Manager -`macos/ClawDnDApp/Package.swift`: +`macos/WorldOSApp/Package.swift`: ```swift // swift-tools-version: 5.9 @@ -30,16 +30,16 @@ You will need (one-time): import PackageDescription let package = Package( - name: "ClawDnDApp", + name: "WorldOSApp", platforms: [.macOS(.v13)], - products: [.executable(name: "ClawDnDApp", targets: ["ClawDnDApp"])], + products: [.executable(name: "WorldOSApp", targets: ["WorldOSApp"])], dependencies: [ // Sparkle 2.x — modern, SPM-friendly, XPC-isolated auto-updater. .package(url: "https://github.com/sparkle-project/Sparkle.git", from: "2.6.0"), ], targets: [ .executableTarget( - name: "ClawDnDApp", + name: "WorldOSApp", dependencies: [.product(name: "Sparkle", package: "Sparkle")] ), ] @@ -52,7 +52,7 @@ The first `swift build` after this change downloads Sparkle and its XPC services ## Step 2 — Add an Updater wrapper -Create `macos/ClawDnDApp/Sources/ClawDnDApp/Services/SparkleUpdater.swift`: +Create `macos/WorldOSApp/Sources/WorldOSApp/Services/SparkleUpdater.swift`: ```swift import Foundation @@ -86,11 +86,11 @@ final class SparkleUpdater: ObservableObject { ## Step 3 — Wire it into the app + menu -`ClawDnDApp.swift` — add a `@StateObject` and a menu item: +`WorldOSApp.swift` — add a `@StateObject` and a menu item: ```swift @main -struct ClawDnDApp: App { +struct WorldOSApp: App { @StateObject private var updater = SparkleUpdater() // ...existing @StateObject properties @@ -119,7 +119,7 @@ struct ClawDnDApp: App { ```xml SUFeedURL -https://github.com/100yenadmin/ClawDnD/releases/latest/download/appcast.xml +https://github.com/electricsheephq/WorldOS/releases/latest/download/appcast.xml SUPublicEDKey SUEnableAutomaticChecks @@ -159,8 +159,8 @@ Upload `appcast.xml` to the corresponding GitHub Release (matching the SUFeedURL For Sparkle to verify and install an update, the new `.zip` must be **notarized** by Apple. This is the same notarization that's currently "deferred to 1.0.1" in the project plan — Sparkle is a natural prompt to finish it. ```bash -xcrun notarytool submit ClawDnD-1.0.2.zip --apple-id --team-id TC6MS3T6NN --wait -xcrun stapler staple ClawDnD-1.0.2.zip +xcrun notarytool submit WorldOS-1.0.2.zip --apple-id --team-id TC6MS3T6NN --wait +xcrun stapler staple WorldOS-1.0.2.zip ``` --- @@ -174,7 +174,7 @@ xcrun stapler staple ClawDnD-1.0.2.zip ## What this does NOT give you - A way around the **first-ever** TCC / security-scanner prompt on the very first install of a brand-new identity. That's still one click — but only one, ever. -- An auto-update path for **plugin** distribution. ClawDnD ships as both a desktop app and a Claude Code plugin; Sparkle handles the app side only. +- An auto-update path for **plugin** distribution. WorldOS ships as both a desktop app and a Claude Code plugin; Sparkle handles the app side only. --- diff --git a/docs/ui-audit/MAINTAIN.md b/docs/ui-audit/MAINTAIN.md index 76aacfc1..e7005458 100644 --- a/docs/ui-audit/MAINTAIN.md +++ b/docs/ui-audit/MAINTAIN.md @@ -72,8 +72,8 @@ that needs handling. **Loop-5 axe baseline (2026-05-29):** 11 violations across 8 screens (10 `scrollable-region-focusable` + 1 `label`). Filed as -[#291](https://github.com/100yenadmin/ClawDnD/issues/291) + -[#292](https://github.com/100yenadmin/ClawDnD/issues/292). `--axe` mode passes +[#291](https://github.com/electricsheephq/WorldOS/issues/291) + +[#292](https://github.com/electricsheephq/WorldOS/issues/292). `--axe` mode passes as long as the total stays ≤ 11. After #291 + #292 land, **lower the baseline in the script to 0** so any new violation FAILs the check. @@ -124,7 +124,7 @@ substantial portion of the audit. | Loop 2 closeout | ~85% | Read skipped shared sources (data.js / icon-registry / tooltip / toast / server.py); cataloged 2,359 art dirs in `_private`; standalone camp-sidebar audit; #281 asset re-calibration; #284 responsive | | Loop 3 closeout | ~90% | Multi-viewport captures at 1366 / 1920; state validation against populated save; #286 + #287 + #288 + #289 sub-issues; generativity proof | | Loop 4 closeout | ~95% | Snapshot-at-rest inspection of `camp_54fd704d985b` confirms live combat state shape; native Swift chrome inspection clarifies #260 platform-awareness; this maintain-loop script + doc | -| Loop 5 closeout | **~97–98%** | L5-B Swift build verifies clean (1.74s) + dist/ClawDnD.app codesign valid; L5-C axe-core scan across all 16 screens (11 violations, 8 screens clean) filed as #291 + #292; `--axe` flag added to health script with Loop-5 baseline = 11 | +| Loop 5 closeout | **~97–98%** | L5-B Swift build verifies clean (1.74s) + dist/WorldOS.app codesign valid; L5-C axe-core scan across all 16 screens (11 violations, 8 screens clean) filed as #291 + #292; `--axe` flag added to health script with Loop-5 baseline = 11 | **The remaining ~2-3% asymptote (post-Loop-5).** Two items remain: diff --git a/docs/ui-audit/MASTER_TRACKER.md b/docs/ui-audit/MASTER_TRACKER.md index 56c9e9d6..4a041382 100644 --- a/docs/ui-audit/MASTER_TRACKER.md +++ b/docs/ui-audit/MASTER_TRACKER.md @@ -13,11 +13,11 @@ After Loop 1 closed at 70-75% confidence, Loop 2 attacked the named gaps. Material findings: -- **Asset catalog re-calibration — [#281](https://github.com/100yenadmin/ClawDnD/issues/281).** `content/worlds/_private/baldurs-gate/images/` holds 2,359 art dirs: 2,077 portraits (incl. all 7 BG3 origins), 140 items, 77 creatures, 26 scenes, 12 classes (full PHB), 11 races, 10 maps, 6 factions. **Most Loop-1 "asset-gap" findings are UI wire-up, not ingest.** #265 / #267 / #270 / #273 / Map M-01 / Bestiary creature-slug all re-frame as "you have the art; wire `` to it". +- **Asset catalog re-calibration — [#281](https://github.com/electricsheephq/WorldOS/issues/281).** `content/worlds/_private/baldurs-gate/images/` holds 2,359 art dirs: 2,077 portraits (incl. all 7 BG3 origins), 140 items, 77 creatures, 26 scenes, 12 classes (full PHB), 11 races, 10 maps, 6 factions. **Most Loop-1 "asset-gap" findings are UI wire-up, not ingest.** #265 / #267 / #270 / #273 / Map M-01 / Bestiary creature-slug all re-frame as "you have the art; wire `` to it". - **Shared infrastructure verified clean.** `data.js` is the empty `INITIAL_STATE` (line 14-22 explicitly forbids demo content); `tooltip.jsx` + `toast.jsx` solid; `icon-registry.jsx` has 12 icons + 21 aliases, room to grow (#279 still on-point); `index.html` uses local-vendored React/ReactDOM/Babel + local-vendored fonts via `vendor/google-fonts.css` (asset policy satisfied — no CDN). - **Server-route names validated against `viewer/server.py:5180-5407`.** All `/-surface` references in the audit docs match real handlers. No `/merchant-surface`, `/seed-surface`, `/persons-surface`, or `/lore-surface` routes exist — confirms MK-03, S-02, BE-04 as correctly scoped "needs engine route". -- **Camp Sidebar promoted to standalone audit — `screens/camp-sidebar.md` (60/100, Polish-Pass).** 12 findings; CS-01 (Begin Resting wire) [#282](https://github.com/100yenadmin/ClawDnD/issues/282) + CS-02 (per-companion fireside) [#283](https://github.com/100yenadmin/ClawDnD/issues/283) filed. -- **Responsive system — [#284](https://github.com/100yenadmin/ClawDnD/issues/284).** `.stack-on-narrow` class defined in `styles.css:906` but **never applied** in any screen JSX. 3-column screens crowd below 1200px instead of collapsing. +- **Camp Sidebar promoted to standalone audit — `screens/camp-sidebar.md` (60/100, Polish-Pass).** 12 findings; CS-01 (Begin Resting wire) [#282](https://github.com/electricsheephq/WorldOS/issues/282) + CS-02 (per-companion fireside) [#283](https://github.com/electricsheephq/WorldOS/issues/283) filed. +- **Responsive system — [#284](https://github.com/electricsheephq/WorldOS/issues/284).** `.stack-on-narrow` class defined in `styles.css:906` but **never applied** in any screen JSX. 3-column screens crowd below 1200px instead of collapsing. - **GitHub routing audit.** Verified milestones + labels for #244–#279; cleaned up the `epic` label leak on sub-issues (#260, #261, #265, #273, #277) and the misleading `screen:launcher` on cross-cutting #260. **Loop 2 confidence: ~85%.** Remaining open gaps (would lift to 95% in Loop 3): interactive coverage (click-through Create wizard / palette switcher / a11y modes), multi-viewport capture (1366 / 1920), live-session UX (`canAct=true` state), native macOS app verification. @@ -26,12 +26,12 @@ After Loop 1 closed at 70-75% confidence, Loop 2 attacked the named gaps. Materi Attacked Loop-2 closeout gaps. Confidence rises **to ~90%.** -- **Multi-viewport responsive verified.** Headless Chrome captures at 1366×768 (the laptop floor) + 1920×1080. Confirms #284 (.stack-on-narrow unused): at 1366 the **Table** + **Character** + **Inventory** 3-column screens crowd; Combat + Create + Map read OK. Filed as [#288](https://github.com/100yenadmin/ClawDnD/issues/288). -- **State validation against a populated campaign.** `/atlas-surface` ships 23 known_locations + 45 edges; `/relations-surface` ships 5 BG factions + 11 canon NPCs (Jaheira / Minsc and Boo / Shadowheart / Wyll / Karlach / The Emperor / Withers / Astarion / …); `/character-surface` ships Astarion @ Rogue L5 HP 29/29 AC 14. **The engine DOES seed the canon when given a populated campaign.** Loop-1's framing of #261 + #273 ("under-populated") was actually a fresh-state observation. Re-framed as [#289](https://github.com/100yenadmin/ClawDnD/issues/289) — the ask is now "ensure fresh-save initial seed", not "build the seed projection". -- **NEW bug** — `/character-surface` ships `feats` and `classFeatures` arrays with **identical content** (per SRD 5.2: `feats` = optional ASI-feats taken at L4/8/12/16/19; `classFeatures` = auto-by-level — disjoint sets). UI renders the same 10 entries twice with two different labels. Filed [#286](https://github.com/100yenadmin/ClawDnD/issues/286). -- **NEW finding** — Astarion ships `abilities: []` + `raceTraits: []` but the UI renders the "Special Abilities" + "Lineage > traits" section headers without gating → empty panes next to the populated Feats panel. Filed [#287](https://github.com/100yenadmin/ClawDnD/issues/287). -- **Generativity proof.** Current location is `Aldenmoor Estate — Study` — a generated canon-grounded location ("Councillor Riven Aldenmoor's Upper City estate" with a fire, Harper signet letter, district relief maps on the wall). Validates the `ClawDnD-NORTH-STAR.md` Part 1B generativity principle end-to-end. -- **Asset re-calibration [#281](https://github.com/100yenadmin/ClawDnD/issues/281) confirmed again.** Astarion's portrait renders from `_private/baldurs-gate/images/portrait_astarion/`. Atlas backdrop renders the Sword Coast map. Wiki-first ingest → engine → `` pipeline works with real data. +- **Multi-viewport responsive verified.** Headless Chrome captures at 1366×768 (the laptop floor) + 1920×1080. Confirms #284 (.stack-on-narrow unused): at 1366 the **Table** + **Character** + **Inventory** 3-column screens crowd; Combat + Create + Map read OK. Filed as [#288](https://github.com/electricsheephq/WorldOS/issues/288). +- **State validation against a populated campaign.** `/atlas-surface` ships 23 known_locations + 45 edges; `/relations-surface` ships 5 BG factions + 11 canon NPCs (Jaheira / Minsc and Boo / Shadowheart / Wyll / Karlach / The Emperor / Withers / Astarion / …); `/character-surface` ships Astarion @ Rogue L5 HP 29/29 AC 14. **The engine DOES seed the canon when given a populated campaign.** Loop-1's framing of #261 + #273 ("under-populated") was actually a fresh-state observation. Re-framed as [#289](https://github.com/electricsheephq/WorldOS/issues/289) — the ask is now "ensure fresh-save initial seed", not "build the seed projection". +- **NEW bug** — `/character-surface` ships `feats` and `classFeatures` arrays with **identical content** (per SRD 5.2: `feats` = optional ASI-feats taken at L4/8/12/16/19; `classFeatures` = auto-by-level — disjoint sets). UI renders the same 10 entries twice with two different labels. Filed [#286](https://github.com/electricsheephq/WorldOS/issues/286). +- **NEW finding** — Astarion ships `abilities: []` + `raceTraits: []` but the UI renders the "Special Abilities" + "Lineage > traits" section headers without gating → empty panes next to the populated Feats panel. Filed [#287](https://github.com/electricsheephq/WorldOS/issues/287). +- **Generativity proof.** Current location is `Aldenmoor Estate — Study` — a generated canon-grounded location ("Councillor Riven Aldenmoor's Upper City estate" with a fire, Harper signet letter, district relief maps on the wall). Validates the `WorldOS-NORTH-STAR.md` Part 1B generativity principle end-to-end. +- **Asset re-calibration [#281](https://github.com/electricsheephq/WorldOS/issues/281) confirmed again.** Astarion's portrait renders from `_private/baldurs-gate/images/portrait_astarion/`. Atlas backdrop renders the Sword Coast map. Wiki-first ingest → engine → `` pipeline works with real data. ### Loop 3 honest scope notes @@ -42,10 +42,10 @@ Attacked Loop-2 closeout gaps. Confidence rises **to ~90%.** | Issue | Title | Sev | |---|---|---| -| [#286](https://github.com/100yenadmin/ClawDnD/issues/286) | `feats` and `classFeatures` carry duplicate content | Major | -| [#287](https://github.com/100yenadmin/ClawDnD/issues/287) | Character: hide empty Special Abilities + Lineage section headers | Minor | -| [#288](https://github.com/100yenadmin/ClawDnD/issues/288) | 1366×768 crowding on Table + Character + Inventory | Major | -| [#289](https://github.com/100yenadmin/ClawDnD/issues/289) | Atlas/Relations fresh-save seed (reframes #261 + #273) | Major | +| [#286](https://github.com/electricsheephq/WorldOS/issues/286) | `feats` and `classFeatures` carry duplicate content | Major | +| [#287](https://github.com/electricsheephq/WorldOS/issues/287) | Character: hide empty Special Abilities + Lineage section headers | Minor | +| [#288](https://github.com/electricsheephq/WorldOS/issues/288) | 1366×768 crowding on Table + Character + Inventory | Major | +| [#289](https://github.com/electricsheephq/WorldOS/issues/289) | Atlas/Relations fresh-save seed (reframes #261 + #273) | Major | **Loop 3 confidence: ~90%.** Remaining 10% lives in: live-session UX (operator-launched DM required), native-app verification (build required), exhaustive interaction coverage (palette/a11y/keyboard-shortcut walk-through). @@ -54,9 +54,9 @@ Attacked Loop-2 closeout gaps. Confidence rises **to ~90%.** Pushed against the asymptote. Confidence rises **to ~95%.** See [`docs/ui-audit/MAINTAIN.md`](MAINTAIN.md) for the honest "100% on a moving target" framing. - **Live-session UX (evidence-at-rest).** Inspected `/Volumes/LEXAR/Codex/clawdnd-artproof-state/campaigns/camp_54fd704d985b/snapshot.json` — the saved engine state for the canonical BG campaign. **`combat.active = true`** at rest with full schema: `round=1`, `turn_index=2`, `order=[char_149e22788290 init 13 reaction_used=true, char_3d2a73f8f833 init 7, char_d710006ae7e0 init 6]`, `action_used=true`, `action_attacks_made=1`, `bonus_action_used=false`, `surge_actions=0`, `zones=[]`. **The live-combat state shape is documented.** When a DM provider attaches and the action bar / initiative tracker / battle log render against this state, the UI's `screen-combat.jsx:75-93` consumers (`tokens / initiative / actionBar / zones / battleLog / encounter / commandCenter / economy`) all have observable shapes to validate against. Live-session UX is no longer structurally invisible — only the operator-driven walk-through remains. -- **Native macOS app — title-bar interaction clarified.** Inspected `macos/ClawDnDApp/Sources/ClawDnDApp/Views/RootView.swift:348-398`. The Swift `OpenWorldsChromeHostView` enables `titlebarAppearsTransparent + fullSizeContentView` AND `unhides` all three standard window buttons (close/min/zoom). The `paddingLeft: 76` in `chrome.jsx:422` exists **specifically to clear the macOS native traffic lights**. #260's acceptance criteria need to be **platform-aware**: keep 76px in native, drop/shrink in browser. Filed as a clarification comment on #260. +- **Native macOS app — title-bar interaction clarified.** Inspected `macos/WorldOSApp/Sources/WorldOSApp/Views/RootView.swift:348-398`. The Swift `OpenWorldsChromeHostView` enables `titlebarAppearsTransparent + fullSizeContentView` AND `unhides` all three standard window buttons (close/min/zoom). The `paddingLeft: 76` in `chrome.jsx:422` exists **specifically to clear the macOS native traffic lights**. #260's acceptance criteria need to be **platform-aware**: keep 76px in native, drop/shrink in browser. Filed as a clarification comment on #260. - **Interactive coverage code-verified.** Keyboard map (`app.jsx:197-220`): 17 shortcuts (t/x/p/m/c/i/f/r/j/b/a/$/w/n/s/,/?). Palette (`styles.css`): 2 alt-palette blocks (`cool`, `dark`) + default warm. A11y (`styles.css:849-892`): `[data-reduced-motion=on]` universal animation-duration zeroing + `[data-contrast=high]` panel/btn/window/parchment chrome overrides + `--ui-scale` via `zoom` on `.window`. Create wizard (`screen-create.jsx:19-27, 133-139, 572-576`): 7 steps + 5e-canonical point-buy `abilityCost = {8:0, 9:1, 10:2, 11:3, 12:4, 13:5, 14:7, 15:9}`. All wiring matches the audit's framework reading. -- **`dist/ClawDnD.app` exists locally.** The native app has been built. Operator can run it for the visual walk that Loop 4 can't do artifact-only. +- **`dist/WorldOS.app` exists locally.** The native app has been built. Operator can run it for the visual walk that Loop 4 can't do artifact-only. - **Maintain loop landed.** `qa/ui_audit_health.sh` runs 30 structural checks (viewer reachable, data.js empty, icon-registry baseline, demo-leak grep with JSX-comment-aware regex, surface-route 200s, server.py route literals, responsive + a11y CSS, asset-catalog size ≥ 2000, headless capture pipeline). **All 30 PASS at Loop 4 baseline.** Re-run on every PR touching `viewer/openworlds/`, `viewer/server.py`, `content/worlds/`, or `styles.css`. Doc: [`MAINTAIN.md`](MAINTAIN.md). **Loop 4 confidence: ~95%.** The remaining ~5% is the asymptote: operator-driven live-DM walk, native-app run, axe-core scan. After those (one operator session, one Swift build, one CLI invocation), confidence → ~99%. The final 1% is the software-is-mutable constant — handled by re-running `qa/ui_audit_health.sh` on every PR. @@ -67,17 +67,17 @@ Pushed against the asymptote. Confidence rises **to ~95%.** See [`docs/ui-audit/ |---|---| | `qa/ui_audit_health.sh` | 30-check structural sweep; PASS = audit findings still valid | | `docs/ui-audit/MAINTAIN.md` | How to keep the audit current; what 100% really means | -| Comment on [#260](https://github.com/100yenadmin/ClawDnD/issues/260) | Platform-aware title-bar fix (keep 76px for macOS traffic lights, drop in browser) | +| Comment on [#260](https://github.com/electricsheephq/WorldOS/issues/260) | Platform-aware title-bar fix (keep 76px for macOS traffic lights, drop in browser) | ## Loop 5 update (2026-05-29 cont.) Operator-cleared two of the three Loop-4 asymptote items. Confidence rises **to ~97–98%.** ### L5-B ✅ Native build verified (compile-clean) -- `swift build --package-path macos/ClawDnDApp` → **Build complete (1.74s)** — Swift code compiles cleanly against the macOS 13+ target. -- `codesign --verify --deep --strict dist/ClawDnD.app` → **valid on disk · satisfies its Designated Requirement**. +- `swift build --package-path macos/WorldOSApp` → **Build complete (1.74s)** — Swift code compiles cleanly against the macOS 13+ target. +- `codesign --verify --deep --strict dist/WorldOS.app` → **valid on disk · satisfies its Designated Requirement**. - `Info.plist` clean (BundleID `dev.clawdnd.app`, MinSystemVersion 13.0, LocalNetworking allowed). -- **Still pending:** the visual title-bar inspection against the real macOS traffic lights ([#260](https://github.com/100yenadmin/ClawDnD/issues/260)) — needs a human eye on the rendered window. Build itself is sound. +- **Still pending:** the visual title-bar inspection against the real macOS traffic lights ([#260](https://github.com/electricsheephq/WorldOS/issues/260)) — needs a human eye on the rendered window. Build itself is sound. ### L5-C ✅ axe-core scan complete (16 screens) Installed Chrome 148 + ChromeDriver 148 via `npx browser-driver-manager install chrome=148` (matching local Chrome). Scanned all 16 screens via `@axe-core/cli` 4.11.4 with `wcag2a,wcag2aa` tags. @@ -96,9 +96,9 @@ Installed Chrome 148 + ChromeDriver 148 via `npx browser-driver-manager install | seed | 1 | **label** | | launcher · dialogue · map · journal · bestiary · acts · merchant · settings | 0 | — | -The dominant violation is **`scrollable-region-focusable`** (10/11 instances) — scrollable `.panel.framed` divs lack `tabIndex={0}` + `role="region"` + `aria-label`. A single fix in `chrome.jsx:292` (the shared `Panel` component) closes 10 instances at once. Filed as [#291](https://github.com/100yenadmin/ClawDnD/issues/291). +The dominant violation is **`scrollable-region-focusable`** (10/11 instances) — scrollable `.panel.framed` divs lack `tabIndex={0}` + `role="region"` + `aria-label`. A single fix in `chrome.jsx:292` (the shared `Panel` component) closes 10 instances at once. Filed as [#291](https://github.com/electricsheephq/WorldOS/issues/291). -The 11th violation is the **Seed chronicler's notes textarea missing label** at `screen-seed.jsx:178-191` (1-line `aria-label="Chronicler's notes"` fix). Filed as [#292](https://github.com/100yenadmin/ClawDnD/issues/292). +The 11th violation is the **Seed chronicler's notes textarea missing label** at `screen-seed.jsx:178-191` (1-line `aria-label="Chronicler's notes"` fix). Filed as [#292](https://github.com/electricsheephq/WorldOS/issues/292). ### L5-A ⏳ Live-DM walk — still operator-driven Requires `claude -p` budget for one duo session. Not done in Loop 5. Remains the **only** structural-coverage gap. @@ -122,26 +122,26 @@ The remaining ~2–3% lives in: | Artifact | Purpose | |---|---| -| [#291](https://github.com/100yenadmin/ClawDnD/issues/291) | scrollable-region-focusable cross-cutting (Major; 7 screens, 10 instances) | -| [#292](https://github.com/100yenadmin/ClawDnD/issues/292) | World Seed textarea label (Minor; 1-line fix) | -| Comment on [#290](https://github.com/100yenadmin/ClawDnD/issues/290) | L5-B + L5-C closure summary | +| [#291](https://github.com/electricsheephq/WorldOS/issues/291) | scrollable-region-focusable cross-cutting (Major; 7 screens, 10 instances) | +| [#292](https://github.com/electricsheephq/WorldOS/issues/292) | World Seed textarea label (Minor; 1-line fix) | +| Comment on [#290](https://github.com/electricsheephq/WorldOS/issues/290) | L5-B + L5-C closure summary | | `qa/ui_audit_health.sh` — `--axe` flag (new) | Optional axe-core sweep, gated on browser-driver presence | ## Loop 6 update (2026-05-29 cont.) — verification of implementation agent's claim -The implementation agent (paused, then unpaused) claimed "implemented all fixes and solved all issues." Loop 6 verified independently against current `main` (HEAD `c6ebdb0`). **Claim is overstated.** ~10 issues materially fixed in code; the rest still pending. The user's specific complaint about [#260](https://github.com/100yenadmin/ClawDnD/issues/260) (title-bar overlap) is CORRECT — chrome.jsx:435 still hardcodes `paddingLeft: 76` without platform-aware fork. +The implementation agent (paused, then unpaused) claimed "implemented all fixes and solved all issues." Loop 6 verified independently against current `main` (HEAD `c6ebdb0`). **Claim is overstated.** ~10 issues materially fixed in code; the rest still pending. The user's specific complaint about [#260](https://github.com/electricsheephq/WorldOS/issues/260) (title-bar overlap) is CORRECT — chrome.jsx:435 still hardcodes `paddingLeft: 76` without platform-aware fork. ### Issues VERIFIED FIXED + closed in Loop 6 (7 newly closed) | Issue | Status | Evidence | |---|---|---| -| [#262](https://github.com/100yenadmin/ClawDnD/issues/262) | ✅ closed | screen-bestiary.jsx:195-196 reads `worldLabel \|\| "the Sword Coast"` — data-driven | -| [#264](https://github.com/100yenadmin/ClawDnD/issues/264) | ✅ closed | screen-forge.jsx:43 `useState([])` — empty log | -| [#267](https://github.com/100yenadmin/ClawDnD/issues/267) | ✅ closed | screen-combat.jsx:25 `prefix = t.team === 'foe' ? 'creature-' : 'portrait-'` | -| [#269](https://github.com/100yenadmin/ClawDnD/issues/269) | ✅ closed | screen-merchant.jsx:17 `useState("talli")` | -| [#270](https://github.com/100yenadmin/ClawDnD/issues/270) | ✅ closed | health-check Placeholder/portrait count 2 (was baseline 8) | -| [#291](https://github.com/100yenadmin/ClawDnD/issues/291) | ✅ closed | axe-core 16 screens × 0 violations (was 10) | -| [#292](https://github.com/100yenadmin/ClawDnD/issues/292) | ✅ closed | seed=0 violations | +| [#262](https://github.com/electricsheephq/WorldOS/issues/262) | ✅ closed | screen-bestiary.jsx:195-196 reads `worldLabel \|\| "the Sword Coast"` — data-driven | +| [#264](https://github.com/electricsheephq/WorldOS/issues/264) | ✅ closed | screen-forge.jsx:43 `useState([])` — empty log | +| [#267](https://github.com/electricsheephq/WorldOS/issues/267) | ✅ closed | screen-combat.jsx:25 `prefix = t.team === 'foe' ? 'creature-' : 'portrait-'` | +| [#269](https://github.com/electricsheephq/WorldOS/issues/269) | ✅ closed | screen-merchant.jsx:17 `useState("talli")` | +| [#270](https://github.com/electricsheephq/WorldOS/issues/270) | ✅ closed | health-check Placeholder/portrait count 2 (was baseline 8) | +| [#291](https://github.com/electricsheephq/WorldOS/issues/291) | ✅ closed | axe-core 16 screens × 0 violations (was 10) | +| [#292](https://github.com/electricsheephq/WorldOS/issues/292) | ✅ closed | seed=0 violations | Combined with the 3 the implementation agent closed (#263, #265, #266) → **10 audit-cycle issues closed.** @@ -149,11 +149,11 @@ Combined with the 3 the implementation agent closed (#263, #265, #266) → **10 | Issue | Sev | Why still open | |---|---|---| -| [#260](https://github.com/100yenadmin/ClawDnD/issues/260) | Critical | chrome.jsx:435 still `paddingLeft: 76` hardcoded; Loop-4 platform-aware fork ignored. **This is the user's direct complaint.** | -| [#268](https://github.com/100yenadmin/ClawDnD/issues/268) | Critical | screen-character.jsx:860 still shows "No spells prepared yet" with no "Browse spellbook" CTA | -| [#271](https://github.com/100yenadmin/ClawDnD/issues/271) | Major | screen-inventory.jsx:308 EQUIP_SLOTS still 6 flat slots; no paper-doll, no 12-slot canonical | -| [#282](https://github.com/100yenadmin/ClawDnD/issues/282) | Critical | camp-sidebar.jsx:293 "Begin Resting" still `disabled` with display-only title | -| [#286](https://github.com/100yenadmin/ClawDnD/issues/286) | Major | server.py:3404 + 3407 still both iterate `for f in features` — feats & classFeatures still identical content | +| [#260](https://github.com/electricsheephq/WorldOS/issues/260) | Critical | chrome.jsx:435 still `paddingLeft: 76` hardcoded; Loop-4 platform-aware fork ignored. **This is the user's direct complaint.** | +| [#268](https://github.com/electricsheephq/WorldOS/issues/268) | Critical | screen-character.jsx:860 still shows "No spells prepared yet" with no "Browse spellbook" CTA | +| [#271](https://github.com/electricsheephq/WorldOS/issues/271) | Major | screen-inventory.jsx:308 EQUIP_SLOTS still 6 flat slots; no paper-doll, no 12-slot canonical | +| [#282](https://github.com/electricsheephq/WorldOS/issues/282) | Critical | camp-sidebar.jsx:293 "Begin Resting" still `disabled` with display-only title | +| [#286](https://github.com/electricsheephq/WorldOS/issues/286) | Major | server.py:3404 + 3407 still both iterate `for f in features` — feats & classFeatures still identical content | ### Maintain-loop confirms what landed works @@ -174,22 +174,22 @@ The Wave-1 cross-cutting items are partially done; Wave 2-4 per-screen criticals | # | Screen | Score | Disposition | Epic | Audit doc | Screenshot | |---|---|---|---|---|---|---| -| 1 | Relations | **80** | Release-Ready | [#244](https://github.com/100yenadmin/ClawDnD/issues/244) | [relations.md](screens/relations.md) | [png](screenshots/relations-1512.png) | -| 2 | Parley (Dialogue) | **78** | Polish-Pass | [#248](https://github.com/100yenadmin/ClawDnD/issues/248) | [dialogue.md](screens/dialogue.md) | [png](screenshots/dialogue-1512.png) | -| 3 | Atlas (Map) | **72** | Polish-Pass | [#249](https://github.com/100yenadmin/ClawDnD/issues/249) | [map.md](screens/map.md) | [png](screenshots/map-1512.png) | -| 4 | Quest Journal | **72** | Polish-Pass | [#253](https://github.com/100yenadmin/ClawDnD/issues/253) | [journal.md](screens/journal.md) | [png](screenshots/journal-1512.png) | -| 5 | Session (Table) | **70** | Polish-Pass | [#246](https://github.com/100yenadmin/ClawDnD/issues/246) | [table.md](screens/table.md) | [png](screenshots/table-1512.png) | -| 6 | Market (Merchant) | **70** | Polish-Pass | [#256](https://github.com/100yenadmin/ClawDnD/issues/256) | [merchant.md](screens/merchant.md) | [png](screenshots/merchant-1512.png) | -| 7 | Heroes (Character) | **68** | Polish-Pass | [#250](https://github.com/100yenadmin/ClawDnD/issues/250) | [character.md](screens/character.md) | [png](screenshots/character-1512.png) | -| 8 | Setting (Settings) | **68** | Polish-Pass | [#259](https://github.com/100yenadmin/ClawDnD/issues/259) | [settings.md](screens/settings.md) | [png](screenshots/settings-1512.png) | -| 9 | Battle (Combat) | **66** | Polish-Pass | [#247](https://github.com/100yenadmin/ClawDnD/issues/247) | [combat.md](screens/combat.md) | [png](screenshots/combat-1512.png) | -| 10 | Stash (Inventory) | **66** | Polish-Pass | [#251](https://github.com/100yenadmin/ClawDnD/issues/251) | [inventory.md](screens/inventory.md) | [png](screenshots/inventory-1512.png) | -| 11 | Chronicles (Launcher) | **64** | Polish-Pass | [#245](https://github.com/100yenadmin/ClawDnD/issues/245) | [launcher.md](screens/launcher.md) | [png](screenshots/launcher-1512.png) | -| 12 | Acts | **64** | Polish-Pass | [#255](https://github.com/100yenadmin/ClawDnD/issues/255) | [acts.md](screens/acts.md) | [png](screenshots/acts-1512.png) | -| 13 | Forge | **62** | Polish-Pass | [#252](https://github.com/100yenadmin/ClawDnD/issues/252) | [forge.md](screens/forge.md) | [png](screenshots/forge-1512.png) | -| 14 | Creation Plane (Create) | **60** | Polish-Pass | [#257](https://github.com/100yenadmin/ClawDnD/issues/257) | [create.md](screens/create.md) | [png](screenshots/create-1512.png) | -| 15 | Codex (Bestiary) | **56** | Finish-Wave | [#254](https://github.com/100yenadmin/ClawDnD/issues/254) | [bestiary.md](screens/bestiary.md) | [png](screenshots/bestiary-1512.png) | -| 16 | World Seed | **50** | Finish-Wave | [#258](https://github.com/100yenadmin/ClawDnD/issues/258) | [seed.md](screens/seed.md) | [png](screenshots/seed-1512.png) | +| 1 | Relations | **80** | Release-Ready | [#244](https://github.com/electricsheephq/WorldOS/issues/244) | [relations.md](screens/relations.md) | [png](screenshots/relations-1512.png) | +| 2 | Parley (Dialogue) | **78** | Polish-Pass | [#248](https://github.com/electricsheephq/WorldOS/issues/248) | [dialogue.md](screens/dialogue.md) | [png](screenshots/dialogue-1512.png) | +| 3 | Atlas (Map) | **72** | Polish-Pass | [#249](https://github.com/electricsheephq/WorldOS/issues/249) | [map.md](screens/map.md) | [png](screenshots/map-1512.png) | +| 4 | Quest Journal | **72** | Polish-Pass | [#253](https://github.com/electricsheephq/WorldOS/issues/253) | [journal.md](screens/journal.md) | [png](screenshots/journal-1512.png) | +| 5 | Session (Table) | **70** | Polish-Pass | [#246](https://github.com/electricsheephq/WorldOS/issues/246) | [table.md](screens/table.md) | [png](screenshots/table-1512.png) | +| 6 | Market (Merchant) | **70** | Polish-Pass | [#256](https://github.com/electricsheephq/WorldOS/issues/256) | [merchant.md](screens/merchant.md) | [png](screenshots/merchant-1512.png) | +| 7 | Heroes (Character) | **68** | Polish-Pass | [#250](https://github.com/electricsheephq/WorldOS/issues/250) | [character.md](screens/character.md) | [png](screenshots/character-1512.png) | +| 8 | Setting (Settings) | **68** | Polish-Pass | [#259](https://github.com/electricsheephq/WorldOS/issues/259) | [settings.md](screens/settings.md) | [png](screenshots/settings-1512.png) | +| 9 | Battle (Combat) | **66** | Polish-Pass | [#247](https://github.com/electricsheephq/WorldOS/issues/247) | [combat.md](screens/combat.md) | [png](screenshots/combat-1512.png) | +| 10 | Stash (Inventory) | **66** | Polish-Pass | [#251](https://github.com/electricsheephq/WorldOS/issues/251) | [inventory.md](screens/inventory.md) | [png](screenshots/inventory-1512.png) | +| 11 | Chronicles (Launcher) | **64** | Polish-Pass | [#245](https://github.com/electricsheephq/WorldOS/issues/245) | [launcher.md](screens/launcher.md) | [png](screenshots/launcher-1512.png) | +| 12 | Acts | **64** | Polish-Pass | [#255](https://github.com/electricsheephq/WorldOS/issues/255) | [acts.md](screens/acts.md) | [png](screenshots/acts-1512.png) | +| 13 | Forge | **62** | Polish-Pass | [#252](https://github.com/electricsheephq/WorldOS/issues/252) | [forge.md](screens/forge.md) | [png](screenshots/forge-1512.png) | +| 14 | Creation Plane (Create) | **60** | Polish-Pass | [#257](https://github.com/electricsheephq/WorldOS/issues/257) | [create.md](screens/create.md) | [png](screenshots/create-1512.png) | +| 15 | Codex (Bestiary) | **56** | Finish-Wave | [#254](https://github.com/electricsheephq/WorldOS/issues/254) | [bestiary.md](screens/bestiary.md) | [png](screenshots/bestiary-1512.png) | +| 16 | World Seed | **50** | Finish-Wave | [#258](https://github.com/electricsheephq/WorldOS/issues/258) | [seed.md](screens/seed.md) | [png](screenshots/seed-1512.png) | | 17* | Camp Sidebar (Loop 2) | **60** | Polish-Pass | (rolls up under #249) | [camp-sidebar.md](screens/camp-sidebar.md) | _capture in Map campMode_ | **Average: 66.2/100** (across 17 audited surfaces). Bottom-up: 9 screens lift through Polish; 2 through Finish; 1 Release-Ready. \*Camp Sidebar is mounted inside Atlas (campMode) and rolls under #249; standalone audit added in Loop 2. @@ -202,30 +202,30 @@ The Wave-1 cross-cutting items are partially done; Wave 2-4 per-screen criticals | Issue | Title | Sev | Epics | Milestone | |---|---|---|---|---| -| [#260](https://github.com/100yenadmin/ClawDnD/issues/260) | Title-bar text overlaps nav-rail on every screen | Critical | per-page-polish | Polish Wave | -| [#261](https://github.com/100yenadmin/ClawDnD/issues/261) | Atlas — seed the BG nav graph (Lower City / Upper City / …) | Critical | atlas | Polish Wave | -| ~~[#262](https://github.com/100yenadmin/ClawDnD/issues/262)~~ | ✅ Bestiary 'THE MARCHES' → Sword Coast (demo-leak) | Critical | demo-leak | **DONE v1.0.2 bfc8ad9** | -| ~~[#263](https://github.com/100yenadmin/ClawDnD/issues/263)~~ | ✅ Bestiary intel-tier stat block (sighted→engaged→slain) | Critical | per-page-polish + wire-prototypes | **DONE 137e482** | -| [#264](https://github.com/100yenadmin/ClawDnD/issues/264) | Forge Workshop Ledger demo leak (the scribe / the smith / a companion) | Critical | demo-leak | Polish Wave | -| [#265](https://github.com/100yenadmin/ClawDnD/issues/265) | Creation Plane race + class + portrait gallery art | Critical | portraits + per-scene-art | Polish Wave | -| [#266](https://github.com/100yenadmin/ClawDnD/issues/266) | World Seed write-lane decision + de-fake hardcoded values | Critical | wire-prototypes + demo-leak | Finish Wave | -| [#267](https://github.com/100yenadmin/ClawDnD/issues/267) | Combat foe portraits + battle scene backdrop | Critical | portraits + per-scene-art | Polish Wave | -| [#268](https://github.com/100yenadmin/ClawDnD/issues/268) | Character Spellbook browse path | Critical | per-page-polish | Polish Wave | -| [#269](https://github.com/100yenadmin/ClawDnD/issues/269) | Merchant id mismatch (`gate-sundries` vs `talli`) | Critical | per-page-polish | Polish Wave | -| [#270](https://github.com/100yenadmin/ClawDnD/issues/270) | Img-not-Placeholder sweep across 8 screens | Major | portraits + per-scene-art | Polish Wave | -| [#271](https://github.com/100yenadmin/ClawDnD/issues/271) | Inventory paper-doll + full slot set | Major | per-page-polish | Polish Wave | -| [#272](https://github.com/100yenadmin/ClawDnD/issues/272) | Inventory compare-on-hover | Major | per-page-polish | Polish Wave | -| [#273](https://github.com/100yenadmin/ClawDnD/issues/273) | Relations canon BG factions seed | Major | per-page-polish | Polish Wave | -| [#274](https://github.com/100yenadmin/ClawDnD/issues/274) | Session log time-merge sort | Major | per-page-polish | Polish Wave | -| [#275](https://github.com/100yenadmin/ClawDnD/issues/275) | Atlas watermark dim | Major | per-page-polish | Polish Wave | -| [#276](https://github.com/100yenadmin/ClawDnD/issues/276) | Parley free-form text input | Major | per-page-polish + wire-prototypes | Polish Wave | -| [#277](https://github.com/100yenadmin/ClawDnD/issues/277) | Create Family + Biography wiring | Major | wire-prototypes | Polish Wave | -| [#278](https://github.com/100yenadmin/ClawDnD/issues/278) | Settings Export chronicle wire | Major | wire-prototypes | Polish Wave | -| [#279](https://github.com/100yenadmin/ClawDnD/issues/279) | Iconography: OpenWorldsIcon registry usage across screens | Major | per-page-polish + iconography | Polish Wave | -| [#281](https://github.com/100yenadmin/ClawDnD/issues/281) | **Asset catalog re-calibration: art exists for nearly every gap** | Major | portraits + per-scene-art | Polish Wave | -| [#282](https://github.com/100yenadmin/ClawDnD/issues/282) | Camp Sidebar: 'Begin Resting' CTA needs engine write-lane | Critical | wire-prototypes | Polish Wave | -| [#283](https://github.com/100yenadmin/ClawDnD/issues/283) | Camp Sidebar: per-companion fireside TALK_PROMPTS | Critical | per-page-polish + wire-prototypes | Polish Wave | -| [#284](https://github.com/100yenadmin/ClawDnD/issues/284) | Responsive: .stack-on-narrow defined but unused; screens crowd <1200px | Major | per-page-polish | Polish Wave | +| [#260](https://github.com/electricsheephq/WorldOS/issues/260) | Title-bar text overlaps nav-rail on every screen | Critical | per-page-polish | Polish Wave | +| [#261](https://github.com/electricsheephq/WorldOS/issues/261) | Atlas — seed the BG nav graph (Lower City / Upper City / …) | Critical | atlas | Polish Wave | +| ~~[#262](https://github.com/electricsheephq/WorldOS/issues/262)~~ | ✅ Bestiary 'THE MARCHES' → Sword Coast (demo-leak) | Critical | demo-leak | **DONE v1.0.2 bfc8ad9** | +| ~~[#263](https://github.com/electricsheephq/WorldOS/issues/263)~~ | ✅ Bestiary intel-tier stat block (sighted→engaged→slain) | Critical | per-page-polish + wire-prototypes | **DONE 137e482** | +| [#264](https://github.com/electricsheephq/WorldOS/issues/264) | Forge Workshop Ledger demo leak (the scribe / the smith / a companion) | Critical | demo-leak | Polish Wave | +| [#265](https://github.com/electricsheephq/WorldOS/issues/265) | Creation Plane race + class + portrait gallery art | Critical | portraits + per-scene-art | Polish Wave | +| [#266](https://github.com/electricsheephq/WorldOS/issues/266) | World Seed write-lane decision + de-fake hardcoded values | Critical | wire-prototypes + demo-leak | Finish Wave | +| [#267](https://github.com/electricsheephq/WorldOS/issues/267) | Combat foe portraits + battle scene backdrop | Critical | portraits + per-scene-art | Polish Wave | +| [#268](https://github.com/electricsheephq/WorldOS/issues/268) | Character Spellbook browse path | Critical | per-page-polish | Polish Wave | +| [#269](https://github.com/electricsheephq/WorldOS/issues/269) | Merchant id mismatch (`gate-sundries` vs `talli`) | Critical | per-page-polish | Polish Wave | +| [#270](https://github.com/electricsheephq/WorldOS/issues/270) | Img-not-Placeholder sweep across 8 screens | Major | portraits + per-scene-art | Polish Wave | +| [#271](https://github.com/electricsheephq/WorldOS/issues/271) | Inventory paper-doll + full slot set | Major | per-page-polish | Polish Wave | +| [#272](https://github.com/electricsheephq/WorldOS/issues/272) | Inventory compare-on-hover | Major | per-page-polish | Polish Wave | +| [#273](https://github.com/electricsheephq/WorldOS/issues/273) | Relations canon BG factions seed | Major | per-page-polish | Polish Wave | +| [#274](https://github.com/electricsheephq/WorldOS/issues/274) | Session log time-merge sort | Major | per-page-polish | Polish Wave | +| [#275](https://github.com/electricsheephq/WorldOS/issues/275) | Atlas watermark dim | Major | per-page-polish | Polish Wave | +| [#276](https://github.com/electricsheephq/WorldOS/issues/276) | Parley free-form text input | Major | per-page-polish + wire-prototypes | Polish Wave | +| [#277](https://github.com/electricsheephq/WorldOS/issues/277) | Create Family + Biography wiring | Major | wire-prototypes | Polish Wave | +| [#278](https://github.com/electricsheephq/WorldOS/issues/278) | Settings Export chronicle wire | Major | wire-prototypes | Polish Wave | +| [#279](https://github.com/electricsheephq/WorldOS/issues/279) | Iconography: OpenWorldsIcon registry usage across screens | Major | per-page-polish + iconography | Polish Wave | +| [#281](https://github.com/electricsheephq/WorldOS/issues/281) | **Asset catalog re-calibration: art exists for nearly every gap** | Major | portraits + per-scene-art | Polish Wave | +| [#282](https://github.com/electricsheephq/WorldOS/issues/282) | Camp Sidebar: 'Begin Resting' CTA needs engine write-lane | Critical | wire-prototypes | Polish Wave | +| [#283](https://github.com/electricsheephq/WorldOS/issues/283) | Camp Sidebar: per-companion fireside TALK_PROMPTS | Critical | per-page-polish + wire-prototypes | Polish Wave | +| [#284](https://github.com/electricsheephq/WorldOS/issues/284) | Responsive: .stack-on-narrow defined but unused; screens crowd <1200px | Major | per-page-polish | Polish Wave | --- @@ -279,10 +279,10 @@ The Wave-1 cross-cutting items are partially done; Wave 2-4 per-screen criticals | Milestone | # | Status | Issues | |---|---|---|---| -| Graphics Release 1.0 — Blocker Wave | [#8](https://github.com/100yenadmin/ClawDnD/milestone/8) | Reserved (empty today) | — | -| Graphics Release 1.0 — Finish Wave | [#9](https://github.com/100yenadmin/ClawDnD/milestone/9) | Open | Bestiary (#254 #262 #263), Seed (#258 #266) | -| Graphics Release 1.0 — Polish Wave | [#10](https://github.com/100yenadmin/ClawDnD/milestone/10) | Open | 14 epics + 16 cross-cutting subs | -| Graphics Release 1.0 — Backlog / Post-1.0 | [#11](https://github.com/100yenadmin/ClawDnD/milestone/11) | Open | Trivials + missing features | +| Graphics Release 1.0 — Blocker Wave | [#8](https://github.com/electricsheephq/WorldOS/milestone/8) | Reserved (empty today) | — | +| Graphics Release 1.0 — Finish Wave | [#9](https://github.com/electricsheephq/WorldOS/milestone/9) | Open | Bestiary (#254 #262 #263), Seed (#258 #266) | +| Graphics Release 1.0 — Polish Wave | [#10](https://github.com/electricsheephq/WorldOS/milestone/10) | Open | 14 epics + 16 cross-cutting subs | +| Graphics Release 1.0 — Backlog / Post-1.0 | [#11](https://github.com/electricsheephq/WorldOS/milestone/11) | Open | Trivials + missing features | --- @@ -339,7 +339,7 @@ docs/ui-audit/ ## Session reference -This audit was produced 2026-05-29 in one session as part of issue [#242](https://github.com/100yenadmin/ClawDnD/issues/242) Phase 5. Session notes live at `/Volumes/LEXAR/Codex/session-notes/2026-05-29/openworlds-ui-ux-review/implementation-notes.html` (per the user-level guidance to keep a per-session scratchpad for substantial / state-changing sessions). +This audit was produced 2026-05-29 in one session as part of issue [#242](https://github.com/electricsheephq/WorldOS/issues/242) Phase 5. Session notes live at `/Volumes/LEXAR/Codex/session-notes/2026-05-29/openworlds-ui-ux-review/implementation-notes.html` (per the user-level guidance to keep a per-session scratchpad for substantial / state-changing sessions). The audit was authored against the canonical checkout `/Users/lume/ClawDnD-val` (per `clawdnd-canonical-setup` memory), git rev `227ff3227010820b2df2e5692dc77505ef7f980e`. The viewer was served via both `/Volumes/LEXAR/repos/ClawDnD-val` (port 8799, content-identical mirror) and `/Users/lume/ClawDnD-val` (port 8795); both were verified at the same revision. diff --git a/docs/ui-audit/screens/camp-sidebar.md b/docs/ui-audit/screens/camp-sidebar.md index acf5cfda..cf2dae86 100644 --- a/docs/ui-audit/screens/camp-sidebar.md +++ b/docs/ui-audit/screens/camp-sidebar.md @@ -57,5 +57,5 @@ ## Recommended next pass 1. **CS-01 (Begin Resting wire)** unlocks the entire screen — the rest of the UI is supporting the moment of long rest. -2. **CS-02 + CS-03 (per-companion TALK_PROMPTS + SPECIAL_ROLES)** are the biggest visible content gap and pair with the Owlcat-style companion campaigns epic [#58](https://github.com/100yenadmin/ClawDnD/issues/58). +2. **CS-02 + CS-03 (per-companion TALK_PROMPTS + SPECIAL_ROLES)** are the biggest visible content gap and pair with the Owlcat-style companion campaigns epic [#58](https://github.com/electricsheephq/WorldOS/issues/58). 3. **CS-05 (keyboard equivalent)** is the highest accessibility leverage on this screen. diff --git a/docs/ui-audit/screens/seed.md b/docs/ui-audit/screens/seed.md index b0e7dd50..1346fd00 100644 --- a/docs/ui-audit/screens/seed.md +++ b/docs/ui-audit/screens/seed.md @@ -40,7 +40,7 @@ ## Missing features (deferred to backlog) -- **Save/export seed manifest** — let user share a seed YAML/JSON file (matches the generativity north-star in `ClawDnD-NORTH-STAR.md` Part 1 deliverable B). +- **Save/export seed manifest** — let user share a seed YAML/JSON file (matches the generativity north-star in `WorldOS-NORTH-STAR.md` Part 1 deliverable B). - **Compare seeds** — diff between two seeds. - **Seed templates** — one-click "Curse of Strahd vibes" / "Eberron noir". - **Preview chronicler voice** — sample 2-3 lines of narration in each voice (Florid / Almost-poetic / Terse). diff --git a/docs/ui-audit/screens/settings.md b/docs/ui-audit/screens/settings.md index 5ad2b4d9..8413b82d 100644 --- a/docs/ui-audit/screens/settings.md +++ b/docs/ui-audit/screens/settings.md @@ -4,7 +4,7 @@ **Source:** `viewer/openworlds/screen-settings.jsx` (646 LOC) **Screenshot:** `docs/ui-audit/screenshots/settings-1512.png` **Compared to:** BG3 settings, Skyrim/Pathfinder gameplay settings (P15 in `RPG_REFERENCE_PATTERNS.md`). -**First impression (5-second read):** "Section list on left (ClawDnD/Sound/Display/Gameplay/Controls/Accessibility/Saves/About) + supervisor-bridge native panel default. **Honest 'Display-only — not yet wired' preview banners on every non-wired section.** Only Reduce Motion / High Contrast / UI Scale are genuinely functional. Native bridge shows 'Unavailable' as expected outside the macOS app." +**First impression (5-second read):** "Section list on left (WorldOS/Sound/Display/Gameplay/Controls/Accessibility/Saves/About) + supervisor-bridge native panel default. **Honest 'Display-only — not yet wired' preview banners on every non-wired section.** Only Reduce Motion / High Contrast / UI Scale are genuinely functional. Native bridge shows 'Unavailable' as expected outside the macOS app." ## Score diff --git a/qa/SCORECARD.md b/qa/SCORECARD.md index ad502e79..b2f31458 100644 --- a/qa/SCORECARD.md +++ b/qa/SCORECARD.md @@ -1,4 +1,4 @@ -# ClawDnD QA Scorecard — running ledger +# WorldOS QA Scorecard — running ledger > The "what did each run score, and what change was under test" log. Updated per QA run. > System reference: `qa/SCORING.md`. Targets: **story ≥ 4.3, mechanical ≥ 4.5, gate GREEN, 0 critical/high.** diff --git a/qa/SCORING.md b/qa/SCORING.md index 1449a761..40cf959b 100644 --- a/qa/SCORING.md +++ b/qa/SCORING.md @@ -1,4 +1,4 @@ -# ClawDnD QA Scoring System — standardized reference +# WorldOS QA Scoring System — standardized reference > Source of truth for HOW we measure a playtest. Current as of 2026-05-26. > The running results ledger is `qa/SCORECARD.md`. diff --git a/qa/lib_beat_driver.sh b/qa/lib_beat_driver.sh index 64692b13..7a0ef6fd 100644 --- a/qa/lib_beat_driver.sh +++ b/qa/lib_beat_driver.sh @@ -1,5 +1,5 @@ # shellcheck shell=bash -# Shared beat-driver helpers for the ClawDnD play loops (qa/run_duo.sh + scripts/play.sh). +# Shared beat-driver helpers for the WorldOS play loops (qa/run_duo.sh + scripts/play.sh). # # This is the STRUCTURE behind the "living, progressing world" fix (decision-dm-driver.md): # prose nudges alone never moved the clock past day 1, never visited >1 location, and NEVER diff --git a/qa/play_dm_duo.txt b/qa/play_dm_duo.txt index 0c04c247..fa0d76e4 100644 --- a/qa/play_dm_duo.txt +++ b/qa/play_dm_duo.txt @@ -1,4 +1,4 @@ -You are the DUNGEON MASTER for a live ClawDnD session, using the `dungeon-master` skill and the clawdnd engine/rules/voice MCP tools. FIRST read your agent definition at `skills/dungeon-master/AGENT.md` (path relative to your cwd, the repo root) — it fixes your identity + personality, the 3-act PROCESS you run (Act 1 inciting incident + human hook → Act 2 rising action + MANDATORY midpoint reversal + cost → Act 3 climax + payoff), and the session obligations you OWN (the clock advances; the party travels to ≥2 locations; new named faces enter and speak). Hold it alongside the skill. A SEPARATE player agent controls the player character (PC). You never speak or decide for the player; you bring the world to life and resolve their declared actions through the engine (ALL dice/rules/state tool-sourced, never invented). Division of labor: the player declares their PC's INTENT and their own spoken words — YOU own everything else: the room and the world, every other character's voice and reactions, and whether an attempt SUCCEEDS. If the player's declaration assumes a result ("I cross unseen", "I clock the signet ring"), don't just accept it — resolve it with the dice and narrate what actually happens. The player's action reaches you as tagged moves — [say] (their dialogue), [do] (an attempt), [check] (roll that skill for them), [cast]/[use]/[attack] (resolve via the engine) — resolve each, voice the NPCs and companion, and narrate the result as a played scene. +You are the DUNGEON MASTER for a live WorldOS session, using the `dungeon-master` skill and the clawdnd engine/rules/voice MCP tools. FIRST read your agent definition at `skills/dungeon-master/AGENT.md` (path relative to your cwd, the repo root) — it fixes your identity + personality, the 3-act PROCESS you run (Act 1 inciting incident + human hook → Act 2 rising action + MANDATORY midpoint reversal + cost → Act 3 climax + payoff), and the session obligations you OWN (the clock advances; the party travels to ≥2 locations; new named faces enter and speak). Hold it alongside the skill. A SEPARATE player agent controls the player character (PC). You never speak or decide for the player; you bring the world to life and resolve their declared actions through the engine (ALL dice/rules/state tool-sourced, never invented). Division of labor: the player declares their PC's INTENT and their own spoken words — YOU own everything else: the room and the world, every other character's voice and reactions, and whether an attempt SUCCEEDS. If the player's declaration assumes a result ("I cross unseen", "I clock the signet ring"), don't just accept it — resolve it with the dice and narrate what actually happens. The player's action reaches you as tagged moves — [say] (their dialogue), [do] (an attempt), [check] (roll that skill for them), [cast]/[use]/[attack] (resolve via the engine) — resolve each, voice the NPCs and companion, and narrate the result as a played scene. PLAY THE SCENE — DON'T LOG IT. This is the most important thing. Write like a novelist running a table for one player: in the present, in-scene, immersive — NOT an after-action summary or stage directions. Every beat: - Narrate in vivid, sensory prose addressed to the player ("you ease the warped door open…"), in the moment — not a third-person recap of what just happened ("the hero takes a stool, orders broth" is a LOG; do not write that way). diff --git a/qa/play_human.sh b/qa/play_human.sh index 7c87c04d..ae9f17d7 100755 --- a/qa/play_human.sh +++ b/qa/play_human.sh @@ -1,5 +1,5 @@ #!/usr/bin/env bash -# Play ClawDnD yourself (It.2): YOU are the player — you act through the dashboard's +# Play WorldOS yourself (It.2): YOU are the player — you act through the dashboard's # action palette / input, and a DM AGENT (claude -p, full plugin) responds, turn by # turn, live in the same window. This is the human-in-the-loop version of the duo # harness: the dashboard's /move endpoint appends your moves to $MOVES (exactly the diff --git a/qa/play_prompt.txt b/qa/play_prompt.txt index edf9471f..84b860a4 100644 --- a/qa/play_prompt.txt +++ b/qa/play_prompt.txt @@ -1,4 +1,4 @@ -You are running an AUTOMATED QA PLAYTEST of the ClawDnD plugin. Play a COMPLETE short session, acting as BOTH roles: +You are running an AUTOMATED QA PLAYTEST of the WorldOS plugin. Play a COMPLETE short session, acting as BOTH roles: - the DUNGEON MASTER — use the clawdnd `dungeon-master` skill and the clawdnd-engine / clawdnd-rules / clawdnd-voice MCP tools for ALL mechanics. Every die roll, rule lookup, HP change, condition, attack, and state write MUST go through the tools — never invent a number or a rule. This tool-discipline is the single most important thing being tested. - a TEST PLAYER controlling a level-1 character who makes plausible, sometimes-bold choices and actually role-plays a little. diff --git a/qa/play_prompt_bg.txt b/qa/play_prompt_bg.txt index 9188de60..637129fe 100644 --- a/qa/play_prompt_bg.txt +++ b/qa/play_prompt_bg.txt @@ -1,4 +1,4 @@ -You are running a QA PLAYTEST of ClawDnD's LIVING-WORLD mode inside the "Unofficial Baldur's Gate 3+ Universe Seed" (a persistent world seed, NOT a replay of BG3 and NOT a fixed plot). The question this run answers: does dropping into post-Absolute Baldur's Gate — with its regions, factions, pullable legends, and recallable lore — and generating the story within its canon produce an EPIC, mature, Baldur's-Gate-caliber adventure that stays consistent with the world (no mush, no forgetting) AND feels VAST — does the scale of the city and the aftermath of the Absolute press on the actual scene? +You are running a QA PLAYTEST of WorldOS's LIVING-WORLD mode inside the "Unofficial Baldur's Gate 3+ Universe Seed" (a persistent world seed, NOT a replay of BG3 and NOT a fixed plot). The question this run answers: does dropping into post-Absolute Baldur's Gate — with its regions, factions, pullable legends, and recallable lore — and generating the story within its canon produce an EPIC, mature, Baldur's-Gate-caliber adventure that stays consistent with the world (no mush, no forgetting) AND feels VAST — does the scale of the city and the aftermath of the Absolute press on the actual scene? Play as BOTH: - the DUNGEON MASTER (use the clawdnd `dungeon-master` skill + the engine/rules/voice MCP tools; ALL mechanics tool-sourced), and diff --git a/qa/play_prompt_bg_brawler.txt b/qa/play_prompt_bg_brawler.txt index bb4d1b90..bfbed2ea 100644 --- a/qa/play_prompt_bg_brawler.txt +++ b/qa/play_prompt_bg_brawler.txt @@ -1,4 +1,4 @@ -You are running an ADVERSARIAL QA PLAYTEST of ClawDnD in the "Unofficial Baldur's Gate 3+ Universe Seed". This run STRESS-TESTS THE COMBAT ENGINE and the DM's ability to run a real fight — not a cooperative story. The question it answers: when the player FIGHTS, does the engine hold (initiative, action economy, damage, death saves, removing combatants mid-fight) and does the DM source every mechanic from tools instead of hand-waving? +You are running an ADVERSARIAL QA PLAYTEST of WorldOS in the "Unofficial Baldur's Gate 3+ Universe Seed". This run STRESS-TESTS THE COMBAT ENGINE and the DM's ability to run a real fight — not a cooperative story. The question it answers: when the player FIGHTS, does the engine hold (initiative, action economy, damage, death saves, removing combatants mid-fight) and does the DM source every mechanic from tools instead of hand-waving? You play TWO roles, and you must keep them HONEST: - the TEST PLAYER: a reckless, aggressive level-3 protagonist (a Battlemaster-style fighter or barbarian) who LOOKS FOR FIGHTS and pushes hard. Do NOT cooperate with the DM's plot — provoke violence. diff --git a/qa/play_prompt_bg_operator.txt b/qa/play_prompt_bg_operator.txt index 85bf54b6..2f7b7561 100644 --- a/qa/play_prompt_bg_operator.txt +++ b/qa/play_prompt_bg_operator.txt @@ -1,4 +1,4 @@ -You are running an ADVERSARIAL QA PLAYTEST of ClawDnD in the "Unofficial Baldur's Gate 3+ Universe Seed". This run STRESS-TESTS THE RULES/PROGRESSION SYSTEMS and their GUARDRAILS — spellcasting, skill checks, inventory/economy, rests, leveling — with a min-maxing rules-lawyer protagonist who tries to bend the mechanics. The question it answers: does the engine track resources honestly and REFUSE illegal mechanical moves, or can a clever player desync their own sheet? +You are running an ADVERSARIAL QA PLAYTEST of WorldOS in the "Unofficial Baldur's Gate 3+ Universe Seed". This run STRESS-TESTS THE RULES/PROGRESSION SYSTEMS and their GUARDRAILS — spellcasting, skill checks, inventory/economy, rests, leveling — with a min-maxing rules-lawyer protagonist who tries to bend the mechanics. The question it answers: does the engine track resources honestly and REFUSE illegal mechanical moves, or can a clever player desync their own sheet? You play TWO roles, kept honest: - the TEST PLAYER: a precise, mechanics-obsessed level-3 spellcaster (Wizard or Cleric) who optimizes, demands rolls, manages resources, and probes for exploits. Push the rules; don't just role-play. diff --git a/qa/play_prompt_bg_wildcard.txt b/qa/play_prompt_bg_wildcard.txt index 76ad88c7..96f7201d 100644 --- a/qa/play_prompt_bg_wildcard.txt +++ b/qa/play_prompt_bg_wildcard.txt @@ -1,4 +1,4 @@ -You are running an ADVERSARIAL QA PLAYTEST of ClawDnD in the "Unofficial Baldur's Gate 3+ Universe Seed". This run STRESS-TESTS ROBUSTNESS, the LIVING-WORLD GUARDRAILS, and the DM's improvisation against a protagonist who ignores the plot and tries to break the world. The question it answers: when the player goes off-script and pushes at canon/chronology/the map, does the engine stay consistent (era guardrail, recall, add_location, recruit guard) and the DM improvise without falling apart or contradicting itself? +You are running an ADVERSARIAL QA PLAYTEST of WorldOS in the "Unofficial Baldur's Gate 3+ Universe Seed". This run STRESS-TESTS ROBUSTNESS, the LIVING-WORLD GUARDRAILS, and the DM's improvisation against a protagonist who ignores the plot and tries to break the world. The question it answers: when the player goes off-script and pushes at canon/chronology/the map, does the engine stay consistent (era guardrail, recall, add_location, recruit guard) and the DM improvise without falling apart or contradicting itself? You play TWO roles, kept honest: - the TEST PLAYER: a contrarian wildcard who REFUSES the obvious hook, wanders, and probes the seams — tries impossible and canon-breaking things on purpose. diff --git a/qa/play_prompt_camp.txt b/qa/play_prompt_camp.txt index f87b88dc..e02a08b5 100644 --- a/qa/play_prompt_camp.txt +++ b/qa/play_prompt_camp.txt @@ -1,4 +1,4 @@ -You are running a QA PLAYTEST of ClawDnD that validates the NEW companion/UX features together — the CAMP social hub, the CLARIFY question move, and the skill_check tool — on top of the post-BG3 cold-open. You play BOTH roles, kept honest: +You are running a QA PLAYTEST of WorldOS that validates the NEW companion/UX features together — the CAMP social hub, the CLARIFY question move, and the skill_check tool — on top of the post-BG3 cold-open. You play BOTH roles, kept honest: - the DUNGEON MASTER (clawdnd `dungeon-master` skill): source EVERY mechanic from the engine/rules tools. Tool-fetching/tool-names are INVISIBLE to the player — present narration only; do NOT append a validation table to the story (keep the play log a clean told scene). When the player sends a `clarify` question, ANSWER it briefly (what the character could perceive/know) and do NOT advance the scene — then let them act. - a TEST PLAYER: a new "nobody" veteran dropped into post-BG3 Baldur's Gate. diff --git a/qa/play_prompt_easter.txt b/qa/play_prompt_easter.txt index 1aef5489..1f738d9c 100644 --- a/qa/play_prompt_easter.txt +++ b/qa/play_prompt_easter.txt @@ -1,4 +1,4 @@ -You are running a QA PLAYTEST of ClawDnD that deliberately EXERCISES THE EASTER EGGS to catch issues — chiefly Claudan the Wild-Wasteland chaos engine, plus a camp scene and the apocryphal Drowned Verse. You play BOTH roles, kept honest: +You are running a QA PLAYTEST of WorldOS that deliberately EXERCISES THE EASTER EGGS to catch issues — chiefly Claudan the Wild-Wasteland chaos engine, plus a camp scene and the apocryphal Drowned Verse. You play BOTH roles, kept honest: - the DUNGEON MASTER (clawdnd `dungeon-master` skill): source EVERY mechanic from the engine/rules tools. Tool-fetching/tool-names are INVISIBLE to the player — narration only; NO validation table in the play log. Read `reference/quest-generation.md` (the Claudan / Wild-Wasteland playbook) and `reference/living-world.md` (the easter eggs + camp). - a TEST PLAYER: a new level-5 "nobody" in post-BG3 Baldur's Gate who likes poking at odd corners. diff --git a/qa/play_prompt_embergloom.txt b/qa/play_prompt_embergloom.txt index a6ded65f..6885b322 100644 --- a/qa/play_prompt_embergloom.txt +++ b/qa/play_prompt_embergloom.txt @@ -1,4 +1,4 @@ -You are running an AUTOMATED QA PLAYTEST of the ClawDnD plugin against the full multi-act campaign **"The Embergloom Pact"** (`embergloom-pact`). Play a COMPLETE Act 1, acting as BOTH: +You are running an AUTOMATED QA PLAYTEST of the WorldOS plugin against the full multi-act campaign **"The Embergloom Pact"** (`embergloom-pact`). Play a COMPLETE Act 1, acting as BOTH: - the DUNGEON MASTER — use the clawdnd `dungeon-master` skill and the clawdnd MCP tools for ALL mechanics. Every die roll, rule, HP change, attack, and state write goes through the tools — never invented. This tool-discipline is the most important thing tested. - a TEST PLAYER controlling a level-1 character who makes plausible, slightly-bold choices and role-plays a little. diff --git a/qa/play_prompt_fidelity.txt b/qa/play_prompt_fidelity.txt index f6a00a57..01a2489e 100644 --- a/qa/play_prompt_fidelity.txt +++ b/qa/play_prompt_fidelity.txt @@ -1,4 +1,4 @@ -You are running a QA PLAYTEST of ClawDnD that VALIDATES the character-creation / combat-fidelity fixes end to end — starting gear (so AC and inventory agree), subclass resource pools (a Battle Master's Superiority Dice), Unarmored-Defense AC, and the new advance_time clock — by building a veteran, letting an in-world day pass, and then running a REAL fight where those numbers matter. You play BOTH roles, kept honest: +You are running a QA PLAYTEST of WorldOS that VALIDATES the character-creation / combat-fidelity fixes end to end — starting gear (so AC and inventory agree), subclass resource pools (a Battle Master's Superiority Dice), Unarmored-Defense AC, and the new advance_time clock — by building a veteran, letting an in-world day pass, and then running a REAL fight where those numbers matter. You play BOTH roles, kept honest: - the DUNGEON MASTER (clawdnd `dungeon-master` skill): source EVERY mechanic from the engine/rules tools — never narrate a hit, a miss, HP, AC, a resource spend, or a death you didn't get from a tool. Tool names are INVISIBLE to the player: present clean narration only, no validation tables appended to the story. - a TEST PLAYER: a seasoned veteran dropped into post-BG3 Baldur's Gate, who will end up in a fight. diff --git a/qa/play_prompt_generated.txt b/qa/play_prompt_generated.txt index 8e3cb36f..ff442149 100644 --- a/qa/play_prompt_generated.txt +++ b/qa/play_prompt_generated.txt @@ -1,4 +1,4 @@ -You are running a QA PLAYTEST that proves the ClawDnD SYSTEM can GENERATE a great original adventure LIVE — with NO authored module. The question this run answers: does an AI-generated campaign, run through the engine's guardrails (tool-sourced dice/rules, persistent state, searchable memory via recall) and the dungeon-master skill's storytelling craft, feel like an EPIC, mature, Baldur's-Gate-caliber adventure — or like AI mush that forgets itself? +You are running a QA PLAYTEST that proves the WorldOS SYSTEM can GENERATE a great original adventure LIVE — with NO authored module. The question this run answers: does an AI-generated campaign, run through the engine's guardrails (tool-sourced dice/rules, persistent state, searchable memory via recall) and the dungeon-master skill's storytelling craft, feel like an EPIC, mature, Baldur's-Gate-caliber adventure — or like AI mush that forgets itself? Play as BOTH: - the DUNGEON MASTER (use the clawdnd `dungeon-master` skill + the engine/rules/voice MCP tools; ALL mechanics tool-sourced), and diff --git a/qa/play_prompt_postbg3.txt b/qa/play_prompt_postbg3.txt index 779cc94b..5f200f41 100644 --- a/qa/play_prompt_postbg3.txt +++ b/qa/play_prompt_postbg3.txt @@ -1,4 +1,4 @@ -You are running a QA PLAYTEST of ClawDnD that EXERCISES THE FULL POST-BG3 STACK (S3-S6) in one session, to validate that the living-world systems work TOGETHER and the story holds. You play BOTH roles, kept honest: +You are running a QA PLAYTEST of WorldOS that EXERCISES THE FULL POST-BG3 STACK (S3-S6) in one session, to validate that the living-world systems work TOGETHER and the story holds. You play BOTH roles, kept honest: - the DUNGEON MASTER (clawdnd `dungeon-master` skill): source EVERY mechanic from the engine/rules tools — never narrate a roll, hit, HP, death, or canon fact you didn't get from a tool. - a TEST PLAYER: a new "nobody" adventurer dropped into post-BG3 Baldur's Gate. diff --git a/qa/play_prompt_postbg3_illithid.txt b/qa/play_prompt_postbg3_illithid.txt index 88e09395..6e755224 100644 --- a/qa/play_prompt_postbg3_illithid.txt +++ b/qa/play_prompt_postbg3_illithid.txt @@ -1,4 +1,4 @@ -You are running a QA PLAYTEST of ClawDnD that EXERCISES THE FULL POST-BG3 STACK (S3-S6) in one session, on the ILLITHID-ASCENSION ending (the OTHER occupied world from the gortash run), to validate the living-world systems work TOGETHER and the story holds. You play BOTH roles, kept honest: +You are running a QA PLAYTEST of WorldOS that EXERCISES THE FULL POST-BG3 STACK (S3-S6) in one session, on the ILLITHID-ASCENSION ending (the OTHER occupied world from the gortash run), to validate the living-world systems work TOGETHER and the story holds. You play BOTH roles, kept honest: - the DUNGEON MASTER (clawdnd `dungeon-master` skill): source EVERY mechanic from the engine/rules tools — never narrate a roll, hit, HP, death, or canon fact you didn't get from a tool. Tool-fetching and tool names are INVISIBLE to the player: present narration only, and do NOT append a validation table to the story — keep the play log a clean told scene. - a TEST PLAYER: a new "nobody" adventurer dropped into post-BG3 Baldur's Gate under the mind-flayer dominion. diff --git a/qa/play_prompt_s7_coldopen.txt b/qa/play_prompt_s7_coldopen.txt index 213e5d69..91764a06 100644 --- a/qa/play_prompt_s7_coldopen.txt +++ b/qa/play_prompt_s7_coldopen.txt @@ -1,4 +1,4 @@ -You are running a QA PLAYTEST of ClawDnD that VALIDATES THE NEW S7 QUEST-GENERATION LAYER — the cold-open PRELUDE + the lore-derived quest hooks — on a fresh post-BG3 campaign. You play BOTH roles, kept honest: +You are running a QA PLAYTEST of WorldOS that VALIDATES THE NEW S7 QUEST-GENERATION LAYER — the cold-open PRELUDE + the lore-derived quest hooks — on a fresh post-BG3 campaign. You play BOTH roles, kept honest: - the DUNGEON MASTER (clawdnd `dungeon-master` skill): source EVERY mechanic from the engine/rules tools. Tool-fetching and tool names are INVISIBLE to the player — present narration only; do NOT append a validation table to the story (keep the play log a clean told scene). - a TEST PLAYER: a new "nobody" adventurer arriving in post-BG3 Baldur's Gate. diff --git a/qa/play_prompt_story.txt b/qa/play_prompt_story.txt index 0964a1bb..ef9f31d3 100644 --- a/qa/play_prompt_story.txt +++ b/qa/play_prompt_story.txt @@ -1,4 +1,4 @@ -You are running a STORY-FIRST QA PLAYTEST of the ClawDnD plugin on the campaign "The Embergloom Pact" (`embergloom-pact`). The point of THIS run is the storytelling + party experience — exploration, NPCs, and deliberating with your companion — NOT combat. Keep combat to at most one short optional skirmish (or none). +You are running a STORY-FIRST QA PLAYTEST of the WorldOS plugin on the campaign "The Embergloom Pact" (`embergloom-pact`). The point of THIS run is the storytelling + party experience — exploration, NPCs, and deliberating with your companion — NOT combat. Keep combat to at most one short optional skirmish (or none). Play as BOTH: - the DUNGEON MASTER (use the clawdnd `dungeon-master` skill + the engine/rules/voice MCP tools; all mechanics tool-sourced), and diff --git a/qa/play_prompt_world.txt b/qa/play_prompt_world.txt index c7f943ed..012abe3c 100644 --- a/qa/play_prompt_world.txt +++ b/qa/play_prompt_world.txt @@ -1,4 +1,4 @@ -You are running a QA PLAYTEST of ClawDnD's LIVING-WORLD mode: playing INSIDE a persistent world seed (not a fixed plot, not a one-off generation). The question this run answers: does dropping into a seeded world — with its regions, factions, pullable NPCs, and recallable lore — and generating the story within its canon produce an EPIC, mature, Baldur's-Gate-caliber adventure that stays consistent with the world (no mush, no forgetting)? +You are running a QA PLAYTEST of WorldOS's LIVING-WORLD mode: playing INSIDE a persistent world seed (not a fixed plot, not a one-off generation). The question this run answers: does dropping into a seeded world — with its regions, factions, pullable NPCs, and recallable lore — and generating the story within its canon produce an EPIC, mature, Baldur's-Gate-caliber adventure that stays consistent with the world (no mush, no forgetting)? Play as BOTH: - the DUNGEON MASTER (use the clawdnd `dungeon-master` skill + the engine/rules/voice MCP tools; ALL mechanics tool-sourced), and diff --git a/qa/qa.mcp.json b/qa/qa.mcp.json index 0364432a..6665fd60 100644 --- a/qa/qa.mcp.json +++ b/qa/qa.mcp.json @@ -6,11 +6,11 @@ "args": [ "run", "--directory", - "/Users/lume/ClawDnD-val/servers/engine", + "/Users/lume/WorldOS-val/servers/engine", "server.py" ], "env": { - "CLAWDND_STATE_DIR": "/Users/lume/ClawDnD-val/qa/state" + "CLAWDND_STATE_DIR": "/Users/lume/WorldOS-val/qa/state" } }, "clawdnd-rules": { @@ -19,7 +19,7 @@ "args": [ "run", "--directory", - "/Users/lume/ClawDnD-val/servers/rules", + "/Users/lume/WorldOS-val/servers/rules", "server.py" ], "env": { @@ -32,7 +32,7 @@ "args": [ "run", "--directory", - "/Users/lume/ClawDnD-val/servers/voice", + "/Users/lume/WorldOS-val/servers/voice", "server.py" ], "env": { diff --git a/qa/rubric.md b/qa/rubric.md index da67602b..05ce1285 100644 --- a/qa/rubric.md +++ b/qa/rubric.md @@ -1,12 +1,12 @@ -# ClawDnD playtest rubric +# WorldOS playtest rubric -You are an exacting QA reviewer for ClawDnD, a voice-acted D&D 5e Claude Code +You are an exacting QA reviewer for WorldOS, a voice-acted D&D 5e Claude Code plugin. You are given (1) a distilled transcript of an automated playtest where one agent acted as both the Dungeon Master and a test player, and (2) the final persisted engine state (the campaign JSON written to disk). Grade how well the plugin actually played. -The whole premise of ClawDnD is that **the world is consistent and fair because +The whole premise of WorldOS is that **the world is consistent and fair because mechanics come from deterministic tools, never from the model's imagination.** Weight your judgment accordingly: hallucinated mechanics are the worst defect. diff --git a/qa/rubric_angry_dm.md b/qa/rubric_angry_dm.md index 4510fceb..126355a4 100644 --- a/qa/rubric_angry_dm.md +++ b/qa/rubric_angry_dm.md @@ -1,10 +1,10 @@ -# The Angry DM — ClawDnD 5e RULES-FIDELITY review (adversarial) +# The Angry DM — WorldOS 5e RULES-FIDELITY review (adversarial) You are a grizzled Dungeon Master with twenty years behind the screen and the soul of a rules-lawyer. You have run thousands of sessions and you have *opinions*. You are -reading the transcript of an automated ClawDnD playtest — a DM agent (full engine + +reading the transcript of an automated WorldOS playtest — a DM agent (full engine + rules tools) ran a session for one or more players. Your ONE job: answer, coldly and specifically, **"Was this run done the way I'd run it? Did it follow 5e as written? What did it get WRONG, and what did it MISS?"** @@ -25,7 +25,7 @@ grade it in TWO directions, because both are failures: prose and only YOU will catch it.** ## The deterministic promise you are enforcing -ClawDnD's entire premise: the world is fair because EVERY mechanic comes from a +WorldOS's entire premise: the world is fair because EVERY mechanic comes from a deterministic engine tool, never the model's imagination. So: - Every narrated number (a roll, a DC, an HP total, an AC, XP) MUST trace to a visible `→ tool(...)` call and its `← result` in the transcript. A number that diff --git a/qa/rubric_angry_dm.src.md b/qa/rubric_angry_dm.src.md index 3c8568b0..ab3a54dc 100644 --- a/qa/rubric_angry_dm.src.md +++ b/qa/rubric_angry_dm.src.md @@ -1,4 +1,4 @@ -# The Angry DM — ClawDnD 5e RULES-FIDELITY review (adversarial) +# The Angry DM — WorldOS 5e RULES-FIDELITY review (adversarial)