diff --git a/.codex/workflows/architecture-decision.md b/.codex/workflows/architecture-decision.md index e7810d5..4d371fa 100644 --- a/.codex/workflows/architecture-decision.md +++ b/.codex/workflows/architecture-decision.md @@ -23,7 +23,7 @@ Draft an architecture decision with context, options, selected direction, conseq - AGENTS.md - .codex/studio.json - .codex/workflows/architecture-decision.md -- documentation/design/gdd.md +- design/gdd.md ## Role diff --git a/.codex/workflows/brainstorm.md b/.codex/workflows/brainstorm.md index a224a5b..c11a4c5 100644 --- a/.codex/workflows/brainstorm.md +++ b/.codex/workflows/brainstorm.md @@ -23,7 +23,7 @@ Generate bounded game ideas, feature variations, player fantasies, and tradeoff - AGENTS.md - .codex/studio.json - .codex/workflows/brainstorm.md -- documentation/design/gdd.md +- design/gdd.md ## Role diff --git a/.codex/workflows/bugfix.md b/.codex/workflows/bugfix.md index af7729b..0c6962b 100644 --- a/.codex/workflows/bugfix.md +++ b/.codex/workflows/bugfix.md @@ -82,3 +82,9 @@ CLI aliases: ## Handoff Report changed files, validation evidence, residual risks, and the next owner only when ownership changes. + +## Documentation Impact + +- After functional source, engine, or asset changes, update the owning game document or record a fresh `## Documentation Impact` decision in `production/session-state/active.md`. +- Run `./codex-game-studio docs-impact --base ` before handoff. +- A `no-update` decision must state why no player, architecture, production, or release document changed. diff --git a/.codex/workflows/changelog.md b/.codex/workflows/changelog.md index 469cc73..aff3348 100644 --- a/.codex/workflows/changelog.md +++ b/.codex/workflows/changelog.md @@ -3,7 +3,7 @@ model: gpt-5.6-luna model_reasoning_effort: low primary-agent: release-manager linked-skills: [cgs-changelog, cgs-team-release] -phase: ship +phase: implement risk: high argument-hint: Provide a changelog request with release or milestone diff, grouped changes, migration notes, known issues, owner or handoff needs, and verification evidence. source-reference: .codex/workflows/changelog.md @@ -82,3 +82,8 @@ CLI aliases: ## Handoff Report changed files, validation evidence, residual risks, and the next owner only when ownership changes. + +## Document Target + +- Write the completed release record to `docs/changelog.md`. +- Confirm the document is grounded in the release diff and validation evidence. diff --git a/.codex/workflows/code-review.md b/.codex/workflows/code-review.md index cf1aac5..7d3f3db 100644 --- a/.codex/workflows/code-review.md +++ b/.codex/workflows/code-review.md @@ -82,3 +82,9 @@ CLI aliases: ## Handoff Report changed files, validation evidence, residual risks, and the next owner only when ownership changes. + +## Documentation Impact + +- After functional source, engine, or asset changes, update the owning game document or record a fresh `## Documentation Impact` decision in `production/session-state/active.md`. +- Run `./codex-game-studio docs-impact --base ` before handoff. +- A `no-update` decision must state why no player, architecture, production, or release document changed. diff --git a/.codex/workflows/consistency-check.md b/.codex/workflows/consistency-check.md index 504cfce..5a94aa5 100644 --- a/.codex/workflows/consistency-check.md +++ b/.codex/workflows/consistency-check.md @@ -23,8 +23,8 @@ Check design, production, architecture, UI, and validation surfaces for contradi - AGENTS.md - .codex/studio.json - .codex/workflows/consistency-check.md -- documentation/design/gdd.md -- documentation/production/timeline.md +- design/gdd.md +- production/timeline.md ## Role diff --git a/.codex/workflows/create-architecture.md b/.codex/workflows/create-architecture.md index 3488111..6d17f27 100644 --- a/.codex/workflows/create-architecture.md +++ b/.codex/workflows/create-architecture.md @@ -23,7 +23,7 @@ Create technical architecture with engine modules, data flow, integration points - AGENTS.md - .codex/studio.json - .codex/workflows/create-architecture.md -- documentation/design/gdd.md +- design/gdd.md ## Role diff --git a/.codex/workflows/create-epics.md b/.codex/workflows/create-epics.md index d28242c..6d9dde0 100644 --- a/.codex/workflows/create-epics.md +++ b/.codex/workflows/create-epics.md @@ -23,8 +23,8 @@ Create production epics from the project goal with scope, owners, dependencies, - AGENTS.md - .codex/studio.json - .codex/workflows/create-epics.md -- documentation/design/gdd.md -- documentation/production/timeline.md +- design/gdd.md +- production/timeline.md ## Role diff --git a/.codex/workflows/create-stories.md b/.codex/workflows/create-stories.md index 2790038..64b6e60 100644 --- a/.codex/workflows/create-stories.md +++ b/.codex/workflows/create-stories.md @@ -23,7 +23,7 @@ Break an epic or feature into implementation-ready stories with role owner, file - AGENTS.md - .codex/studio.json - .codex/workflows/create-stories.md -- documentation/production/timeline.md +- production/timeline.md ## Role diff --git a/.codex/workflows/design-review-concept.md b/.codex/workflows/design-review-concept.md index 7119da5..9bafbd7 100644 --- a/.codex/workflows/design-review-concept.md +++ b/.codex/workflows/design-review-concept.md @@ -23,7 +23,7 @@ Review the concept for coherent player promise, pillars, audience fit, productio - AGENTS.md - .codex/studio.json - .codex/workflows/design-review-concept.md -- documentation/design/gdd.md +- design/gdd.md ## Role diff --git a/.codex/workflows/design-review.md b/.codex/workflows/design-review.md index d09b9df..b3ebceb 100644 --- a/.codex/workflows/design-review.md +++ b/.codex/workflows/design-review.md @@ -23,7 +23,7 @@ Review design docs for player promise, systemic consistency, production scope, e - AGENTS.md - .codex/studio.json - .codex/workflows/design-review.md -- documentation/design/gdd.md +- design/gdd.md ## Role diff --git a/.codex/workflows/design-spec.md b/.codex/workflows/design-spec.md index 3b7a20a..106ddb4 100644 --- a/.codex/workflows/design-spec.md +++ b/.codex/workflows/design-spec.md @@ -23,7 +23,7 @@ Create or review a feature/design spec with rules, edge cases, implementation sl - AGENTS.md - .codex/studio.json - .codex/workflows/design-spec.md -- documentation/design/gdd.md +- design/gdd.md ## Role diff --git a/.codex/workflows/design-system.md b/.codex/workflows/design-system.md index 920bc92..49231e1 100644 --- a/.codex/workflows/design-system.md +++ b/.codex/workflows/design-system.md @@ -23,7 +23,7 @@ Author or update a system design with player-facing rules, data model, edge case - AGENTS.md - .codex/studio.json - .codex/workflows/design-system.md -- documentation/design/gdd.md +- design/gdd.md ## Role diff --git a/.codex/workflows/hotfix.md b/.codex/workflows/hotfix.md index 88a7307..b42d190 100644 --- a/.codex/workflows/hotfix.md +++ b/.codex/workflows/hotfix.md @@ -82,3 +82,9 @@ CLI aliases: ## Handoff Report changed files, validation evidence, residual risks, and the next owner only when ownership changes. + +## Documentation Impact + +- After functional source, engine, or asset changes, update the owning game document or record a fresh `## Documentation Impact` decision in `production/session-state/active.md`. +- Run `./codex-game-studio docs-impact --base ` before handoff. +- A `no-update` decision must state why no player, architecture, production, or release document changed. diff --git a/.codex/workflows/implement.md b/.codex/workflows/implement.md index 798fbd7..fbfdf61 100644 --- a/.codex/workflows/implement.md +++ b/.codex/workflows/implement.md @@ -82,3 +82,9 @@ CLI aliases: ## Handoff Report changed files, validation evidence, residual risks, and the next owner only when ownership changes. + +## Documentation Impact + +- After functional source, engine, or asset changes, update the owning game document or record a fresh `## Documentation Impact` decision in `production/session-state/active.md`. +- Run `./codex-game-studio docs-impact --base ` before handoff. +- A `no-update` decision must state why no player, architecture, production, or release document changed. diff --git a/.codex/workflows/localization-plan.md b/.codex/workflows/localization-plan.md index 8dfefe0..e9ef237 100644 --- a/.codex/workflows/localization-plan.md +++ b/.codex/workflows/localization-plan.md @@ -23,7 +23,7 @@ Create a localization plan with string scope, culturalization risks, asset depen - AGENTS.md - .codex/studio.json - .codex/workflows/localization-plan.md -- documentation/design/gdd.md +- design/gdd.md ## Role diff --git a/.codex/workflows/map-systems.md b/.codex/workflows/map-systems.md index 74879f9..102f242 100644 --- a/.codex/workflows/map-systems.md +++ b/.codex/workflows/map-systems.md @@ -23,7 +23,7 @@ Map core gameplay, economy, progression, content, UI, and technical systems with - AGENTS.md - .codex/studio.json - .codex/workflows/map-systems.md -- documentation/design/gdd.md +- design/gdd.md ## Role diff --git a/.codex/workflows/market-analysis.md b/.codex/workflows/market-analysis.md index b7d6927..912288a 100644 --- a/.codex/workflows/market-analysis.md +++ b/.codex/workflows/market-analysis.md @@ -23,7 +23,7 @@ Analyze audience, competitors, positioning, pricing, and market risks for the cu - AGENTS.md - .codex/studio.json - .codex/workflows/market-analysis.md -- resources/market-research/market-overview.md +- docs/market-overview.md ## Role diff --git a/.codex/workflows/onboard.md b/.codex/workflows/onboard.md index f2b36bc..6ca1410 100644 --- a/.codex/workflows/onboard.md +++ b/.codex/workflows/onboard.md @@ -23,8 +23,8 @@ Orient a contributor to the project goal, current stage, key files, active roles - AGENTS.md - .codex/studio.json - .codex/workflows/onboard.md -- documentation/design/gdd.md -- documentation/production/timeline.md +- design/gdd.md +- production/timeline.md ## Role diff --git a/.codex/workflows/patch-notes.md b/.codex/workflows/patch-notes.md index a5076f1..db9b86a 100644 --- a/.codex/workflows/patch-notes.md +++ b/.codex/workflows/patch-notes.md @@ -3,7 +3,7 @@ model: gpt-5.6-luna model_reasoning_effort: low primary-agent: release-manager linked-skills: [cgs-patch-notes, cgs-team-release] -phase: ship +phase: implement risk: high argument-hint: Provide a patch notes request with release scope, fixes, known issues, validation evidence, audience, owner or handoff needs, and approval constraints. source-reference: .codex/workflows/patch-notes.md @@ -82,3 +82,8 @@ CLI aliases: ## Handoff Report changed files, validation evidence, residual risks, and the next owner only when ownership changes. + +## Document Target + +- Write the completed release record to `docs/patch-notes.md`. +- Confirm the document is grounded in the release diff and validation evidence. diff --git a/.codex/workflows/production-milestone.md b/.codex/workflows/production-milestone.md index c2ecd05..844eecc 100644 --- a/.codex/workflows/production-milestone.md +++ b/.codex/workflows/production-milestone.md @@ -23,7 +23,7 @@ Convert current project state into milestone goals, task slices, risks, owners, - AGENTS.md - .codex/studio.json - .codex/workflows/production-milestone.md -- documentation/production/timeline.md +- production/timeline.md ## Role diff --git a/.codex/workflows/prototype.md b/.codex/workflows/prototype.md index 000aa08..ec86a67 100644 --- a/.codex/workflows/prototype.md +++ b/.codex/workflows/prototype.md @@ -23,7 +23,7 @@ Plan the smallest playable prototype slice with owner roles, required assets, im - AGENTS.md - .codex/studio.json - .codex/workflows/prototype.md -- documentation/design/gdd.md +- design/gdd.md ## Role diff --git a/.codex/workflows/qa-plan.md b/.codex/workflows/qa-plan.md index 16439d1..6d018da 100644 --- a/.codex/workflows/qa-plan.md +++ b/.codex/workflows/qa-plan.md @@ -23,7 +23,7 @@ Create a QA plan with target scenarios, risk areas, test data, manual checks, au - AGENTS.md - .codex/studio.json - .codex/workflows/qa-plan.md -- documentation/design/gdd.md +- design/gdd.md ## Role diff --git a/.codex/workflows/release-checklist.md b/.codex/workflows/release-checklist.md index 539547a..eda955d 100644 --- a/.codex/workflows/release-checklist.md +++ b/.codex/workflows/release-checklist.md @@ -23,7 +23,7 @@ Create a release checklist with blockers, warnings, validation commands, packagi - AGENTS.md - .codex/studio.json - .codex/workflows/release-checklist.md -- documentation/production/timeline.md +- production/timeline.md ## Role diff --git a/.codex/workflows/review-all-gdds.md b/.codex/workflows/review-all-gdds.md index a82b07b..26a3352 100644 --- a/.codex/workflows/review-all-gdds.md +++ b/.codex/workflows/review-all-gdds.md @@ -23,7 +23,7 @@ Review all GDD and design artifacts for contradictions, missing systems, stale a - AGENTS.md - .codex/studio.json - .codex/workflows/review-all-gdds.md -- documentation/design/gdd.md +- design/gdd.md ## Role diff --git a/.codex/workflows/ship-check.md b/.codex/workflows/ship-check.md index a9ded48..bf0b2bf 100644 --- a/.codex/workflows/ship-check.md +++ b/.codex/workflows/ship-check.md @@ -23,7 +23,7 @@ Assess milestone readiness, package risk, validation status, and release blocker - AGENTS.md - .codex/studio.json - .codex/workflows/ship-check.md -- documentation/production/timeline.md +- production/timeline.md ## Role diff --git a/.codex/workflows/sprint-plan.md b/.codex/workflows/sprint-plan.md index e292acc..ecb917d 100644 --- a/.codex/workflows/sprint-plan.md +++ b/.codex/workflows/sprint-plan.md @@ -23,7 +23,7 @@ Plan the next sprint or iteration with committed goals, role assignments, risks, - AGENTS.md - .codex/studio.json - .codex/workflows/sprint-plan.md -- documentation/production/timeline.md +- production/timeline.md ## Role diff --git a/.codex/workflows/sprint-status.md b/.codex/workflows/sprint-status.md index 6651b05..d3db969 100644 --- a/.codex/workflows/sprint-status.md +++ b/.codex/workflows/sprint-status.md @@ -23,7 +23,7 @@ Summarize sprint status, completed work, blockers, risks, next owners, and verif - AGENTS.md - .codex/studio.json - .codex/workflows/sprint-status.md -- documentation/production/timeline.md +- production/timeline.md ## Role diff --git a/.codex/workflows/story-done.md b/.codex/workflows/story-done.md index de257c0..9a1b02a 100644 --- a/.codex/workflows/story-done.md +++ b/.codex/workflows/story-done.md @@ -82,3 +82,9 @@ CLI aliases: ## Handoff Report changed files, validation evidence, residual risks, and the next owner only when ownership changes. + +## Documentation Impact + +- After functional source, engine, or asset changes, update the owning game document or record a fresh `## Documentation Impact` decision in `production/session-state/active.md`. +- Run `./codex-game-studio docs-impact --base ` before handoff. +- A `no-update` decision must state why no player, architecture, production, or release document changed. diff --git a/.codex/workflows/vertical-slice.md b/.codex/workflows/vertical-slice.md index 496d3ca..27a40cb 100644 --- a/.codex/workflows/vertical-slice.md +++ b/.codex/workflows/vertical-slice.md @@ -23,7 +23,7 @@ Create a bounded vertical-slice plan with tasks, risks, and verification gates. - AGENTS.md - .codex/studio.json - .codex/workflows/vertical-slice.md -- documentation/design/gdd.md +- design/gdd.md ## Role diff --git a/.truthmark/config.yml b/.truthmark/config.yml deleted file mode 100644 index 953c9d3..0000000 --- a/.truthmark/config.yml +++ /dev/null @@ -1,20 +0,0 @@ -version: 2 -platforms: - - codex -truthmark: - workspace: docs/truthmark - generated: - portal: - enabled: true -instruction_targets: - - AGENTS.md -frontmatter: - required: [] - recommended: - - status - - last_reviewed -ignore: - - node_modules/** - - vendor/** - - dist/** - - build/** diff --git a/AGENTS.md b/AGENTS.md index 301e5bb..6acd1a2 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -47,6 +47,14 @@ Before broad inspection, use compact context helpers when available, then read o - Describe scene, prefab, material, animation, audio, and UI changes in handoff notes. - Do not modify binary assets without recording purpose and verification evidence. +## Documentation Impact + +After functional changes to game source, engine configuration, or assets, make a fresh documentation-impact decision before handoff: + +- Update the owning `design/`, `docs/`, or `production/` document when player-visible behavior, architecture, production commitments, or release communication changed. +- Otherwise record `Decision: no-update`, `Documents: none`, and a specific reason under `## Documentation Impact` in `production/session-state/active.md`. +- Run `./codex-game-studio docs-impact --base ` and include its evidence in the handoff. Reviewers report unresolved documentation impact; writable implementation or fix work performs the update. + ## Studio Roles - Codex custom agents live in `.codex/agents/*.toml`. diff --git a/docs/README.md b/docs/README.md index 32a70e3..94b3264 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,6 +1,6 @@ # Codex Game Studio Docs -This directory is intentionally small. Keep durable user-facing guidance here and keep game-studio operating surfaces in the tracked template files: +This directory is intentionally small. Keep durable user-facing guidance here and keep game-studio operating surfaces in tracked template files: - `AGENTS.md` - `.codex/agents/*.toml` @@ -14,21 +14,11 @@ This directory is intentionally small. Keep durable user-facing guidance here an | [User Guide](user-guide.md) | Installation, commands, role runs, workflow prompts, tasks, validation, and troubleshooting. | | [Examples](examples/README.md) | Scenario-based examples for common local workflows. | | [Product Boundary](architecture/product-boundary.md) | Implemented scope, non-goals, and boundaries. | - -## Repository support docs - -| Doc | Purpose | -| --- | --- | -| [Repo Rules](ai/repo-rules.md) | Repository rules mirrored for agent discovery. | -| [Documentation Governance](standards/documentation-governance.md) | Rules for keeping docs concise and linked. | -| [Default Principles](standards/default-principles.md) | General project documentation principles. | - -## Truthmark support - -Truthmark support files under `docs/truthmark/` are retained only where they match the Truthmark support surface. Do not add broad product-specific truth-doc sprawl here; use tracked template files, tests, and the README/user guide first. +| [Documentation Governance](standards/documentation-governance.md) | Ownership and maintenance rules for framework documentation. | ## Update rules +- Keep framework documentation separate from the design, architecture, production, and release records of an initialized game. - Do not add dated plans or one-off implementation notes under `docs/`. - Do not duplicate the agent, workflow, or skill catalogs in prose docs. - Keep the root README concise and link here only for durable guidance. diff --git a/docs/ai/repo-rules.md b/docs/ai/repo-rules.md deleted file mode 100644 index 2518499..0000000 --- a/docs/ai/repo-rules.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -status: active -doc_type: workflow -last_reviewed: 2026-05-28 -source_of_truth: - - ../../AGENTS.md ---- - -# Repository Rules - -## Purpose - -This file mirrors the repository-specific agent rules from `AGENTS.md` in the configured Truthmark authority tree so structure and sync workflows can find them through the documented authority roots. - -## Rules - -- Use `npm run validate` before any parity claim. -- This project uses `"type": "module"`, `module: "NodeNext"`, and `moduleResolution: "NodeNext"`; relative TypeScript imports must use emitted `.js` specifiers. -- For source-checkout usage, run `npm install && npm run build` first, then use `./codex-game-studio ...`; generated bundled CLI artifacts are not committed. -- Keep tracked game-template surfaces in the repository root. -- Do not load all agents or all templates for a single role task. -- Root `AGENTS.md` is a tracked game-template file, not an init-generated file. -- Direct Codex execution is the default path via `codex-game-studio run `. -- `--dry-run` and `--print-prompt` are inspection-only paths. -- Explicit, file-backed task orchestration is now inside the product boundary; telemetry, planner/next, ownership enforcement, hosted orchestration, background loops, and unbounded parallelism remain future-only. -- Read `docs/architecture/product-boundary.md` before creating or revising designs, implementation plans, OpenSpec changes, template/project surfaces, role/workflow expansions, approval/write-policy behavior, or runtime execution behavior. - -## Truthmark Notes - -Keep the Truthmark-managed block in `AGENTS.md` intact. If these rules change in `AGENTS.md`, update this file in the same pass. diff --git a/docs/architecture/product-boundary.md b/docs/architecture/product-boundary.md index 35dcf98..b38047c 100644 --- a/docs/architecture/product-boundary.md +++ b/docs/architecture/product-boundary.md @@ -56,7 +56,7 @@ External tools, reference workflows, and comparison projects may inspire improve 8. **Mutation is policy-gated and visible.** Any design that lets Codex or the CLI mutate files must specify write policy, approval/override behavior, sandbox selection, dry-run diagnostics, and where provenance is recorded. 9. **Future-only surfaces must remain absent until built.** Planner/next, telemetry, hard output-ownership enforcement, hosted orchestration, background autonomous loops, and unbounded parallelism must not appear as user-facing behavior before they have implementation, tests, and docs. 10. **Validation is part of the product.** New generated surfaces, package assets, CLI commands, orchestration behavior, and behavior-bearing docs need repo-native validation and tests before readiness or parity claims. -11. **Truthmark is repository workflow tooling here, not the product.** Truthmark-backed docs may guard Codex Game Studio's repository truth, but Codex Game Studio should not present Truthmark workflow mechanics as game-studio product features. +11. **Documentation impact is part of the game workflow.** Functional game changes require a bounded documentation-impact decision with reviewable evidence; the template does not present repository-maintenance tooling as a game-studio product feature. ## In Scope diff --git a/docs/standards/default-principles.md b/docs/standards/default-principles.md deleted file mode 100644 index 2ca6c26..0000000 --- a/docs/standards/default-principles.md +++ /dev/null @@ -1,25 +0,0 @@ ---- -status: active -doc_type: standard -last_reviewed: 2026-05-30 -source_of_truth: - - README.md ---- - -# Default Principles - -## Scope - -This is a bootstrap standards baseline for repositories that adopt Truthmark. - -## Reusable Defaults - -- Authority order should be explicit. -- Committed repository artifacts are the durable source of truth. -- Each document should have one primary responsibility. -- Each class of fact should have one canonical source. -- Architecture docs describe system structure, module boundaries, runtime topology, persistence boundaries, cross-cutting contracts, generated-surface ownership, and architecturally relevant runtime views. -- Do not put ordinary feature behavior in architecture docs; use architecture flow guides only for cross-cutting runtime scenarios, branching logic, failure paths, and traceability back to bounded truth docs. -- Verification should be explicit, and skipped checks should state why. -- Missing, stale, broad, overloaded, or unrouteable documentation topology should be repaired through AI-native structure workflow before agents create more generic truth docs. -- Installed repository workflows should remain usable from committed files even when the Truthmark CLI is unavailable. diff --git a/docs/standards/documentation-governance.md b/docs/standards/documentation-governance.md index 4b3d641..95c5d95 100644 --- a/docs/standards/documentation-governance.md +++ b/docs/standards/documentation-governance.md @@ -1,7 +1,7 @@ --- status: active doc_type: standard -last_reviewed: 2026-05-30 +last_reviewed: 2026-07-10 source_of_truth: - README.md --- @@ -10,17 +10,19 @@ source_of_truth: ## Core Rules -- Each document should have one primary responsibility. -- Each class of fact should have one canonical source. -- Current implementation, reusable standards, and future proposals should be stored separately. +- Each document has one primary responsibility. +- Each class of fact has one canonical source. +- Current implementation, reusable standards, and future proposals stay separate. - Generated helper output is never canonical truth. - The root README is the concise human storefront; command reference, role catalog, generated-file detail, and contributor workflow detail belong in linked subdocs. -- Material root README changes should update localized README storefronts under `docs/readmes/` in the same change or state why they intentionally differ. -- Architecture docs describe structure, ownership, and runtime views; truth docs describe current product behavior and remain the canonical behavior reference. -- Architecture flow guides may explain branching logic and failure paths, but they must trace back to the owning truth docs rather than becoming a competing source of behavior truth. +- Material root README changes update localized README storefronts under `docs/readmes/` in the same change or state why they intentionally differ. +- Architecture docs describe structure, ownership, and runtime views; design and production records describe the current game. -## Truthmark Implications +## Initialized Game Documentation -- Truth Sync should extend mapped docs first, create an area-local doc second, and create a new area only as a last resort. -- Weak routing produces weak truth maintenance. -- Missing, stale, broad, overloaded, or unrouteable routing should trigger Truth Structure before more generic truth docs are created. +- `design/` owns player-facing rules, systems, controls, and content intent. +- `docs/architecture/` owns technical boundaries and durable architecture decisions. +- `production/` owns milestone, ownership, handoff, and documentation-impact records. +- `docs/changelog.md` and `docs/patch-notes.md` own release-visible communications. +- Functional source, engine, or asset changes require an updated owner document or an explicit `no-update` decision in `production/session-state/active.md`. +- `./codex-game-studio docs-impact --base ` validates the record against the changed paths; it checks evidence, not prose semantics. diff --git a/docs/truthmark/engineering/README.md b/docs/truthmark/engineering/README.md deleted file mode 100644 index f3a7c0c..0000000 --- a/docs/truthmark/engineering/README.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -status: active -doc_type: index -last_reviewed: 2026-06-25 ---- - -# Truth Docs - -This directory is an index for current truth docs organized by the configured Truthmark hierarchy. - -README.md files are indexes, not Truth Sync targets. Keep bounded truth in leaf docs under `/.md`. - -## Source References - -- ../routes/areas.md diff --git a/docs/truthmark/engineering/repository/README.md b/docs/truthmark/engineering/repository/README.md deleted file mode 100644 index 6ba4f77..0000000 --- a/docs/truthmark/engineering/repository/README.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -status: active -doc_type: index -last_reviewed: 2026-06-29 ---- - -# Repository Truth Docs - -This directory is reserved for narrow Truthmark repository handoffs. - -The only retained repository handoff is [Repository Bootstrap Routing](bootstrap-routing.md). Do not rebuild broad Codex Game Studio behavior docs here unless a bounded Truthmark workflow explicitly requires them. - -## Source References - -- ../../routes/areas.md diff --git a/docs/truthmark/engineering/repository/bootstrap-routing.md b/docs/truthmark/engineering/repository/bootstrap-routing.md deleted file mode 100644 index 3a583b0..0000000 --- a/docs/truthmark/engineering/repository/bootstrap-routing.md +++ /dev/null @@ -1,99 +0,0 @@ ---- -status: active -truth_kind: engineering-workflow -last_reviewed: 2026-06-26 ---- - -# Repository Bootstrap Routing - -## Purpose - -This doc records the provisional broad route for repository. -This doc is a bootstrap handoff, not a behavior truth dumping ground. -It is not a substitute for bounded product and engineering truth docs. - -## Scope - -This doc owns only the initial routing workflow for a fresh Truthmark repository. - -It applies when the default route still maps a broad code surface such as `src/**`. - -It does not own implementation behavior under that code surface. - -## Current Implementation Behavior - -The scaffold creates this provisional bootstrap handoff only when a default broad route needs a canonical owner. - -Agents use it as a signal to run Truth Structure before normal Truth Sync. - -Do not use this doc as a place to accumulate implementation claims. - -## Product Truth Links - -- None. This is an engineering bootstrap handoff for routing setup, not a product promise. - -## Triggers - -- A real code change maps only to this provisional broad route. -- Truth Sync cannot identify a specific behavior-owned route and bounded truth owner. -- A maintainer or agent is onboarding the first real product, service, domain, package, or ownership area. - -## Inputs - -- Current route files under the configured Truthmark route root. -- The touched code, tests, configuration, and existing docs needed to infer the smallest real owner. -- Repository instruction files that exist in the checkout. - -## Execution Model - -Run Truth Structure before normal Truth Sync when real code changes touch only this broad route. - -Truth Structure should create or repair bounded areas first. Truth Sync should then update the bounded owner docs. - -## Steps - -1. Treat this route as provisional and insufficient for normal behavior maintenance. -2. Inspect the touched code/test surface and infer the narrowest durable owner. -3. Create or repair route entries and truth docs for that owner. -4. Leave this bootstrap doc small; do not append behavior details here. -5. Resume Truth Sync only after the touched code resolves to a bounded owner. - -## State, Retry, And Failure Behavior - -If ownership cannot be inferred safely, stop and report manual-review files. - -Do not widen this route or add generic behavior prose. - -## Outputs - -- Bounded route areas and lane-appropriate truth docs for the touched surface. -- A compact manual handoff report when ownership remains ambiguous. - -## Engineering Decisions - -- Decision (2026-06-18): Default broad routing is provisional bootstrap state. -- Decision (2026-06-18): Agents should create bounded areas before normal Truth Sync. -- Decision (2026-06-18): Agents should not extend a catch-all overview doc. - -## Rationale - -Scoped ownership keeps agent context close to affected files. It prevents broad default docs from absorbing unrelated behavior. - -This preserves agent-native truth maintenance without adding a token-heavy discovery layer. - -## Non-Goals - -- This doc is not a repository behavior overview. -- This doc is not a product capability or engineering behavior owner. -- This doc is not a permanent home for claims about files under `src/**`. - -## Maintenance Notes - -Keep this doc short. - -When a repository has real bounded routes, prefer updating those routes and their truth docs. - -## Source References - -- ../../routes/areas/repository.md -- ../../../../.truthmark/config.yml diff --git a/docs/truthmark/product/README.md b/docs/truthmark/product/README.md deleted file mode 100644 index cc03bdb..0000000 --- a/docs/truthmark/product/README.md +++ /dev/null @@ -1,15 +0,0 @@ ---- -status: active -doc_type: index -last_reviewed: 2026-06-29 ---- - -# Product Truth Docs - -This directory is intentionally empty of product-specific leaf docs after the stale-doc purge. - -Use the root `README.md`, `AGENTS.md`, tracked Codex surfaces, and tests as the primary product truth until a bounded Truthmark workflow explicitly creates a new product leaf doc. - -## Source References - -- ../routes/areas.md diff --git a/docs/truthmark/routes/areas.md b/docs/truthmark/routes/areas.md deleted file mode 100644 index 0550562..0000000 --- a/docs/truthmark/routes/areas.md +++ /dev/null @@ -1,39 +0,0 @@ ---- -status: active -doc_type: route-index -last_reviewed: 2026-06-29 ---- - -# Truthmark Areas - -The route index is intentionally small after the stale-doc purge. - -## Repository - -Area files: - -- docs/truthmark/routes/areas/repository.md - -Code surface: - -- AGENTS.md -- README.md -- docs/** -- src/** -- tests/** -- scripts/** -- templates/** -- engine_configs/** -- engine_reference/** -- references/** -- package.json -- package-lock.json - -Update truth when: - -- repository instructions, CLI behavior, validation, package assets, or remaining docs change -- a future Truthmark workflow creates a narrower bounded area - -## Source References - -- ../../../.truthmark/config.yml diff --git a/docs/truthmark/routes/areas/repository.md b/docs/truthmark/routes/areas/repository.md deleted file mode 100644 index 78e52ad..0000000 --- a/docs/truthmark/routes/areas/repository.md +++ /dev/null @@ -1,45 +0,0 @@ ---- -status: active -doc_type: routing -last_reviewed: 2026-06-29 ---- - -# Repository Area - -## Repository - -Truth documents: - -```yaml -truth_documents: - - path: docs/truthmark/engineering/repository/bootstrap-routing.md - kind: engineering-workflow - lane: engineering -``` - -Code surface: - -- AGENTS.md -- README.md -- docs/\*\* -- src/\*\* -- tests/\*\* -- scripts/\*\* -- templates/\*\* -- engine_configs/\*\* -- engine_reference/\*\* -- references/\*\* -- package.json -- package-lock.json - -Update truth when: - -- repository instructions or product boundaries change -- CLI, validation, task, role, workflow, template, engine-reference, or package behavior changes -- a future Truthmark workflow creates a narrower bounded owner - -## Source References - -- ../areas.md -- ../../../../.truthmark/config.yml -- ../../engineering/repository/bootstrap-routing.md diff --git a/docs/truthmark/templates/engineering-architecture.md b/docs/truthmark/templates/engineering-architecture.md deleted file mode 100644 index d90f7d7..0000000 --- a/docs/truthmark/templates/engineering-architecture.md +++ /dev/null @@ -1,125 +0,0 @@ ---- -status: active -truth_kind: engineering-architecture -last_reviewed: 2026-06-16 ---- - -# {{title}} - -## Purpose - - - -{{purpose}} - -## Scope - - - -{{scope}} - -## System Role - - - -{{system_role}} - -## Boundaries - - - -{{boundaries}} - -## Components - - - -{{components}} - -## Data And Control Flow - - - -{{data_and_control_flow}} - -## Ownership - - - -{{ownership}} - -## Cross-Cutting Constraints - - - -{{cross_cutting_constraints}} - -## Engineering Decisions - - - -{{engineering_decisions}} - -## Rationale - - - -{{rationale}} - -## Non-Goals - - - -{{non_goals}} - -## Maintenance Notes - - - -{{maintenance_notes}} - -## Source References - - - -{{source_references}} diff --git a/docs/truthmark/templates/engineering-behavior.md b/docs/truthmark/templates/engineering-behavior.md deleted file mode 100644 index f576e4a..0000000 --- a/docs/truthmark/templates/engineering-behavior.md +++ /dev/null @@ -1,130 +0,0 @@ ---- -status: active -truth_kind: engineering-behavior -last_reviewed: 2026-06-16 ---- - -# {{title}} - -## Purpose - - - -{{purpose}} - -## Scope - - - -{{scope}} - -This doc was created from the editable engineering-behavior template at {{template_path}}. - -## Current Implementation Behavior - - - -{{current_implementation_behavior}} - -## Core Rules - - - -{{core_rules}} - -## Behavior Scenarios - - - -{{behavior_scenarios}} - -## Flows And States - - - -{{flows_and_states}} - -## Contracts - - - -{{contracts}} - -## Product Truth Links - - - -{{product_truth_links}} - -## Engineering Decisions - - - -{{engineering_decisions}} - -## Rationale - - - -{{rationale}} - -## Non-Goals - - - -{{non_goals}} - -## Maintenance Notes - - - -{{maintenance_notes}} - -## Source References - - - -{{source_references}} diff --git a/docs/truthmark/templates/engineering-contract.md b/docs/truthmark/templates/engineering-contract.md deleted file mode 100644 index d7fb5ce..0000000 --- a/docs/truthmark/templates/engineering-contract.md +++ /dev/null @@ -1,125 +0,0 @@ ---- -status: active -truth_kind: engineering-contract -last_reviewed: 2026-06-16 ---- - -# {{title}} - -## Purpose - - - -{{purpose}} - -## Scope - - - -{{scope}} - -## Contract Surface - - - -{{contract_surface}} - -## Inputs - - - -{{inputs}} - -## Outputs - - - -{{outputs}} - -## Errors And Diagnostics - - - -{{errors_and_diagnostics}} - -## Compatibility Rules - - - -{{compatibility_rules}} - -## Versioning And Migration - - - -{{versioning_and_migration}} - -## Engineering Decisions - - - -{{engineering_decisions}} - -## Rationale - - - -{{rationale}} - -## Non-Goals - - - -{{non_goals}} - -## Maintenance Notes - - - -{{maintenance_notes}} - -## Source References - - - -{{source_references}} diff --git a/docs/truthmark/templates/engineering-operations.md b/docs/truthmark/templates/engineering-operations.md deleted file mode 100644 index 085ca72..0000000 --- a/docs/truthmark/templates/engineering-operations.md +++ /dev/null @@ -1,125 +0,0 @@ ---- -status: active -truth_kind: engineering-operations -last_reviewed: 2026-06-16 ---- - -# {{title}} - -## Purpose - - - -{{purpose}} - -## Scope - - - -{{scope}} - -## Operational Surface - - - -{{operational_surface}} - -## Runtime Topology - - - -{{runtime_topology}} - -## Configuration - - - -{{configuration}} - -## Permissions - - - -{{permissions}} - -## Deployment And Rollback - - - -{{deployment_and_rollback}} - -## Availability And Observability - - - -{{availability_and_observability}} - -## Engineering Decisions - - - -{{engineering_decisions}} - -## Rationale - - - -{{rationale}} - -## Non-Goals - - - -{{non_goals}} - -## Maintenance Notes - - - -{{maintenance_notes}} - -## Source References - - - -{{source_references}} diff --git a/docs/truthmark/templates/engineering-test-behavior.md b/docs/truthmark/templates/engineering-test-behavior.md deleted file mode 100644 index 146504d..0000000 --- a/docs/truthmark/templates/engineering-test-behavior.md +++ /dev/null @@ -1,125 +0,0 @@ ---- -status: active -truth_kind: engineering-test-behavior -last_reviewed: 2026-06-16 ---- - -# {{title}} - -## Purpose - - - -{{purpose}} - -## Scope - - - -{{scope}} - -## Test Surface - - - -{{test_surface}} - -## Fixtures And Data Model - - - -{{fixtures_and_data_model}} - -## Execution Model - - - -{{execution_model}} - -## Assertions And Invariants - - - -{{assertions_and_invariants}} - -## Isolation Rules - - - -{{isolation_rules}} - -## Reporting And Failure Semantics - - - -{{reporting_and_failure_semantics}} - -## Engineering Decisions - - - -{{engineering_decisions}} - -## Rationale - - - -{{rationale}} - -## Non-Goals - - - -{{non_goals}} - -## Maintenance Notes - - - -{{maintenance_notes}} - -## Source References - - - -{{source_references}} diff --git a/docs/truthmark/templates/engineering-workflow.md b/docs/truthmark/templates/engineering-workflow.md deleted file mode 100644 index 88ee9b2..0000000 --- a/docs/truthmark/templates/engineering-workflow.md +++ /dev/null @@ -1,125 +0,0 @@ ---- -status: active -truth_kind: engineering-workflow -last_reviewed: 2026-06-16 ---- - -# {{title}} - -## Purpose - - - -{{purpose}} - -## Scope - - - -{{scope}} - -## Triggers - - - -{{triggers}} - -## Inputs - - - -{{inputs}} - -## Execution Model - - - -{{execution_model}} - -## Steps - - - -{{steps}} - -## State, Retry, And Failure Behavior - - - -{{state_retry_and_failure_behavior}} - -## Outputs - - - -{{outputs}} - -## Engineering Decisions - - - -{{engineering_decisions}} - -## Rationale - - - -{{rationale}} - -## Non-Goals - - - -{{non_goals}} - -## Maintenance Notes - - - -{{maintenance_notes}} - -## Source References - - - -{{source_references}} diff --git a/docs/truthmark/templates/product-capability.md b/docs/truthmark/templates/product-capability.md deleted file mode 100644 index a26bdaf..0000000 --- a/docs/truthmark/templates/product-capability.md +++ /dev/null @@ -1,94 +0,0 @@ ---- -status: active -truth_kind: product-capability -last_reviewed: 2026-06-16 ---- - -# {{title}} - - - -## Capability Promise - - - -{{capability_promise}} - -## Users And Value - - - -{{users_and_value}} - -## Capability Scope - - - -{{capability_scope}} - -## Current Product Behavior - - - -{{current_product_behavior}} - -## Acceptance Criteria - - - -{{acceptance_criteria}} - -## Product Decisions - - - -{{decision}} - -## Engineering Realization Links - - - -{{engineering_realization_links}} - -## Non-Goals - - - -{{non_goals}} - -## Source References - - - -{{source_references}} diff --git a/docs/user-guide.md b/docs/user-guide.md index 51c196e..e3bdfa4 100644 --- a/docs/user-guide.md +++ b/docs/user-guide.md @@ -112,7 +112,8 @@ Project validation checks project state, tracked template surfaces, context meta | `resume` | Print a read-only continuation summary. | | `refresh-context` | Regenerate `.codex/context-manifest.json` after selected context files change. | | `freeze` | Mark a project as frozen. | -| `validate` | Run hard-failing repository or project validation. | +| `validate` | Run hard-failing repository or project validation; pass `--base ` to include documentation-impact checks. | +| `docs-impact --base ` | Verify an active-session documentation-impact decision against functional changes from a Git base. | | `templates list` | List packaged template IDs. | | `templates show ` | Print a packaged template. | | `run ` | Prepare one bounded Codex prompt packet and invoke `codex exec`. | diff --git a/eval-framework/README.md b/eval-framework/README.md index 63d8139..a79f915 100644 --- a/eval-framework/README.md +++ b/eval-framework/README.md @@ -2,7 +2,7 @@ This is Open Game Studio's maintainer-only framework for evaluating how skills, workflow prompts, and agent-facing surfaces perform in realistic runs. -It follows the CCGS pattern of catalog → rubric → behavioral scenario, and the Truthmark pattern of manual workflow-quality runs with deterministic boundaries, semantic judging, human review, and token tracking. +It follows the CCGS pattern of catalog → rubric → behavioral scenario, with deterministic boundaries, semantic judging, human review, and token tracking. Normal game-project users do not need this folder. It is not a hidden runtime, daemon, hosted service, or downstream requirement. If a downstream game repository only wants to build a game and not maintain Open Game Studio's prompt surfaces, users may delete `eval-framework/` and the related maintainer-only OpenSpec change files from their copy. diff --git a/openspec/changes/.gitkeep b/openspec/changes/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/openspec/config.yaml b/openspec/config.yaml deleted file mode 100644 index 392946c..0000000 --- a/openspec/config.yaml +++ /dev/null @@ -1,20 +0,0 @@ -schema: spec-driven - -# Project context (optional) -# This is shown to AI when creating artifacts. -# Add your tech stack, conventions, style guides, domain knowledge, etc. -# Example: -# context: | -# Tech stack: TypeScript, React, Node.js -# We use conventional commits -# Domain: e-commerce platform - -# Per-artifact rules (optional) -# Add custom rules for specific artifacts. -# Example: -# rules: -# proposal: -# - Keep proposals under 500 words -# - Always include a "Non-goals" section -# tasks: -# - Break tasks into chunks of max 2 hours diff --git a/package-lock.json b/package-lock.json index 944c70c..3c35892 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,7 +18,6 @@ "devDependencies": { "@types/node": "^24.13.2", "expect": "^30.4.1", - "truthmark": "^2.2.6", "tsx": "^4.20.6", "typescript": "^5.9.3" }, @@ -546,47 +545,6 @@ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@sec-ant/readable-stream": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@sec-ant/readable-stream/-/readable-stream-0.4.1.tgz", - "integrity": "sha512-831qok9r2t8AlxLko40y2ebgSDhenenCatLVeW/uBtnHPyhHOvG0C7TvfgecV+wHzIm5KUICgzmVpWS+IMEAeg==", - "dev": true - }, "node_modules/@sinclair/typebox": { "version": "0.34.49", "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.49.tgz", @@ -594,27 +552,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@sindresorhus/merge-streams": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/merge-streams/-/merge-streams-4.0.0.tgz", - "integrity": "sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==", - "dev": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@types/debug": { - "version": "4.1.13", - "resolved": "https://registry.npmjs.org/@types/debug/-/debug-4.1.13.tgz", - "integrity": "sha512-KSVgmQmzMwPlmtljOomayoR89W4FynCAi3E8PPs7vmDVPe84hT+vGPKkJfThkmXs0x0jAaa9U8uW8bbfyS2fWw==", - "dev": true, - "dependencies": { - "@types/ms": "*" - } - }, "node_modules/@types/istanbul-lib-coverage": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", @@ -642,21 +579,6 @@ "@types/istanbul-lib-report": "*" } }, - "node_modules/@types/mdast": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/@types/mdast/-/mdast-4.0.4.tgz", - "integrity": "sha512-kGaNbPh1k7AFzgpud/gMdvIm5xuECykRR+JnWKQno9TAXVa6WIVCGTPvYGekIDL4uwCZQSYbUxNBSb1aUo79oA==", - "dev": true, - "dependencies": { - "@types/unist": "*" - } - }, - "node_modules/@types/ms": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", - "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", - "dev": true - }, "node_modules/@types/node": { "version": "24.13.2", "resolved": "https://registry.npmjs.org/@types/node/-/node-24.13.2.tgz", @@ -674,12 +596,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/unist": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.3.tgz", - "integrity": "sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==", - "dev": true - }, "node_modules/@types/yargs": { "version": "17.0.35", "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.35.tgz", @@ -697,22 +613,6 @@ "dev": true, "license": "MIT" }, - "node_modules/ajv": { - "version": "8.20.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.20.0.tgz", - "integrity": "sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, "node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -729,28 +629,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/bail": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", - "integrity": "sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -768,16 +646,6 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/character-entities": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/character-entities/-/character-entities-2.0.2.tgz", - "integrity": "sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/ci-info": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.4.0.tgz", @@ -822,72 +690,6 @@ "node": ">=18" } }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/debug": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", - "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decode-named-character-reference": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/decode-named-character-reference/-/decode-named-character-reference-1.3.0.tgz", - "integrity": "sha512-GtpQYB283KrPp6nRw50q3U9/VfOutZOe103qlN7BPP6Ad27xYnOIWv4lPzo8HCAL+mMZofJ9KEy30fq6MfaK6Q==", - "dev": true, - "dependencies": { - "character-entities": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/dequal": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", - "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/devlop": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/devlop/-/devlop-1.1.0.tgz", - "integrity": "sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==", - "dev": true, - "dependencies": { - "dequal": "^2.0.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, "node_modules/esbuild": { "version": "0.28.0", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.28.0.tgz", @@ -957,86 +759,6 @@ "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" } }, - "node_modules/extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", - "dev": true - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "node_modules/fast-glob": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", - "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.8" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.2.tgz", - "integrity": "sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ] - }, - "node_modules/fastq": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", - "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/figures": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-6.1.0.tgz", - "integrity": "sha512-d+l3qxjSesT4V7v2fh+QnmFnUWv9lSpjarhShNTgBOfA0ttejbQUAlHLitbjkoRiDulW0OPoQPYIGhIC8ohejg==", - "dev": true, - "dependencies": { - "is-unicode-supported": "^2.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", @@ -1051,18 +773,6 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", @@ -1080,66 +790,6 @@ "node": ">=8" } }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-plain-obj": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-4.1.0.tgz", - "integrity": "sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-unicode-supported": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-2.1.0.tgz", - "integrity": "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ==", - "dev": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, "node_modules/jest-diff": { "version": "30.4.1", "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-30.4.1.tgz", @@ -1270,540 +920,6 @@ "dev": true, "license": "MIT" }, - "node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "node_modules/mdast-util-from-markdown": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/mdast-util-from-markdown/-/mdast-util-from-markdown-2.0.3.tgz", - "integrity": "sha512-W4mAWTvSlKvf8L6J+VN9yLSqQ9AOAAvHuoDAmPkz4dHf553m5gVj2ejadHJhoJmcmxEnOv6Pa8XJhpxE93kb8Q==", - "dev": true, - "dependencies": { - "@types/mdast": "^4.0.0", - "@types/unist": "^3.0.0", - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "mdast-util-to-string": "^4.0.0", - "micromark": "^4.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-decode-string": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0", - "unist-util-stringify-position": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/mdast-util-to-string": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/mdast-util-to-string/-/mdast-util-to-string-4.0.0.tgz", - "integrity": "sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==", - "dev": true, - "dependencies": { - "@types/mdast": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromark": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromark/-/micromark-4.0.2.tgz", - "integrity": "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "@types/debug": "^4.0.0", - "debug": "^4.0.0", - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "micromark-core-commonmark": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-combine-extensions": "^2.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-encode": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-sanitize-uri": "^2.0.0", - "micromark-util-subtokenize": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-core-commonmark": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/micromark-core-commonmark/-/micromark-core-commonmark-2.0.3.tgz", - "integrity": "sha512-RDBrHEMSxVFLg6xvnXmb1Ayr2WzLAWjeSATAoxwKYJV94TeNavgoIdA0a9ytzDSVzBy2YKFK+emCPOEibLeCrg==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "decode-named-character-reference": "^1.0.0", - "devlop": "^1.0.0", - "micromark-factory-destination": "^2.0.0", - "micromark-factory-label": "^2.0.0", - "micromark-factory-space": "^2.0.0", - "micromark-factory-title": "^2.0.0", - "micromark-factory-whitespace": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-classify-character": "^2.0.0", - "micromark-util-html-tag-name": "^2.0.0", - "micromark-util-normalize-identifier": "^2.0.0", - "micromark-util-resolve-all": "^2.0.0", - "micromark-util-subtokenize": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-destination": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-destination/-/micromark-factory-destination-2.0.1.tgz", - "integrity": "sha512-Xe6rDdJlkmbFRExpTOmRj9N3MaWmbAgdpSrBQvCFqhezUn4AHqJHbaEnfbVYYiexVSs//tqOdY/DxhjdCiJnIA==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-label": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-label/-/micromark-factory-label-2.0.1.tgz", - "integrity": "sha512-VFMekyQExqIW7xIChcXn4ok29YE3rnuyveW3wZQWWqF4Nv9Wk5rgJ99KzPvHjkmPXF93FXIbBp6YdW3t71/7Vg==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "devlop": "^1.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-space": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-space/-/micromark-factory-space-2.0.1.tgz", - "integrity": "sha512-zRkxjtBxxLd2Sc0d+fbnEunsTj46SWXgXciZmHq0kDYGnck/ZSGj9/wULTV95uoeYiK5hRXP2mJ98Uo4cq/LQg==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-title": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-title/-/micromark-factory-title-2.0.1.tgz", - "integrity": "sha512-5bZ+3CjhAd9eChYTHsjy6TGxpOFSKgKKJPJxr293jTbfry2KDoWkhBb6TcPVB4NmzaPhMs1Frm9AZH7OD4Cjzw==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-factory-whitespace": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-factory-whitespace/-/micromark-factory-whitespace-2.0.1.tgz", - "integrity": "sha512-Ob0nuZ3PKt/n0hORHyvoD9uZhr+Za8sFoP+OnMcnWK5lngSzALgQYKMr9RJVOWLqQYuyn6ulqGWSXdwf6F80lQ==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-factory-space": "^2.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-character": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/micromark-util-character/-/micromark-util-character-2.1.1.tgz", - "integrity": "sha512-wv8tdUTJ3thSFFFJKtpYKOYiGP2+v96Hvk4Tu8KpCAsTMs6yi+nVmGh1syvSCsaxz45J6Jbw+9DD6g97+NV67Q==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-chunked": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-chunked/-/micromark-util-chunked-2.0.1.tgz", - "integrity": "sha512-QUNFEOPELfmvv+4xiNg2sRYeS/P84pTW0TCgP5zc9FpXetHY0ab7SxKyAQCNCc1eK0459uoLI1y5oO5Vc1dbhA==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-classify-character": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-classify-character/-/micromark-util-classify-character-2.0.1.tgz", - "integrity": "sha512-K0kHzM6afW/MbeWYWLjoHQv1sgg2Q9EccHEDzSkxiP/EaagNzCm7T/WMKZ3rjMbvIpvBiZgwR3dKMygtA4mG1Q==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-combine-extensions": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-combine-extensions/-/micromark-util-combine-extensions-2.0.1.tgz", - "integrity": "sha512-OnAnH8Ujmy59JcyZw8JSbK9cGpdVY44NKgSM7E9Eh7DiLS2E9RNQf0dONaGDzEG9yjEl5hcqeIsj4hfRkLH/Bg==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-chunked": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-decode-numeric-character-reference": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-decode-numeric-character-reference/-/micromark-util-decode-numeric-character-reference-2.0.2.tgz", - "integrity": "sha512-ccUbYk6CwVdkmCQMyr64dXz42EfHGkPQlBj5p7YVGzq8I7CtjXZJrubAYezf7Rp+bjPseiROqe7G6foFd+lEuw==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-decode-string": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-decode-string/-/micromark-util-decode-string-2.0.1.tgz", - "integrity": "sha512-nDV/77Fj6eH1ynwscYTOsbK7rR//Uj0bZXBwJZRfaLEJ1iGBR6kIfNmlNqaqJf649EP0F3NWNdeJi03elllNUQ==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "decode-named-character-reference": "^1.0.0", - "micromark-util-character": "^2.0.0", - "micromark-util-decode-numeric-character-reference": "^2.0.0", - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-encode": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-encode/-/micromark-util-encode-2.0.1.tgz", - "integrity": "sha512-c3cVx2y4KqUnwopcO9b/SCdo2O67LwJJ/UyqGfbigahfegL9myoEFoDYZgkT7f36T0bLrM9hZTAaAyH+PCAXjw==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromark-util-html-tag-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-html-tag-name/-/micromark-util-html-tag-name-2.0.1.tgz", - "integrity": "sha512-2cNEiYDhCWKI+Gs9T0Tiysk136SnR13hhO8yW6BGNyhOC4qYFnwF1nKfD3HFAIXA5c45RrIG1ub11GiXeYd1xA==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromark-util-normalize-identifier": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-normalize-identifier/-/micromark-util-normalize-identifier-2.0.1.tgz", - "integrity": "sha512-sxPqmo70LyARJs0w2UclACPUUEqltCkJ6PhKdMIDuJ3gSf/Q+/GIe3WKl0Ijb/GyH9lOpUkRAO2wp0GVkLvS9Q==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-resolve-all": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-resolve-all/-/micromark-util-resolve-all-2.0.1.tgz", - "integrity": "sha512-VdQyxFWFT2/FGJgwQnJYbe1jjQoNTS4RjglmSjTUlpUMa95Htx9NHeYW4rGDJzbjvCsl9eLjMQwGeElsqmzcHg==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-sanitize-uri": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-sanitize-uri/-/micromark-util-sanitize-uri-2.0.1.tgz", - "integrity": "sha512-9N9IomZ/YuGGZZmQec1MbgxtlgougxTodVwDzzEouPKo3qFWvymFHWcnDi2vzV1ff6kas9ucW+o3yzJK9YB1AQ==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "micromark-util-character": "^2.0.0", - "micromark-util-encode": "^2.0.0", - "micromark-util-symbol": "^2.0.0" - } - }, - "node_modules/micromark-util-subtokenize": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/micromark-util-subtokenize/-/micromark-util-subtokenize-2.1.0.tgz", - "integrity": "sha512-XQLu552iSctvnEcgXw6+Sx75GflAPNED1qx7eBJ+wydBb2KCbRZe+NwvIEEMM83uml1+2WSXpBAcp9IUCgCYWA==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ], - "dependencies": { - "devlop": "^1.0.0", - "micromark-util-chunked": "^2.0.0", - "micromark-util-symbol": "^2.0.0", - "micromark-util-types": "^2.0.0" - } - }, - "node_modules/micromark-util-symbol": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/micromark-util-symbol/-/micromark-util-symbol-2.0.1.tgz", - "integrity": "sha512-vs5t8Apaud9N28kgCrRUdEed4UJ+wWNvicHLPxCa9ENlYuAY31M0ETy5y1vA33YoNPDFTghEbnh6efaE8h4x0Q==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromark-util-types": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/micromark-util-types/-/micromark-util-types-2.0.2.tgz", - "integrity": "sha512-Yw0ECSpJoViF1qTU4DC6NwtC4aWGt1EkzaQB8KPPyCRR8z9TWeV0HbEFGTO+ZY1wB22zmxnJqhPyTpOVCpeHTA==", - "dev": true, - "funding": [ - { - "type": "GitHub Sponsors", - "url": "https://github.com/sponsors/unifiedjs" - }, - { - "type": "OpenCollective", - "url": "https://opencollective.com/unified" - } - ] - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dev": true, - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "node_modules/parse-ms": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-4.0.0.tgz", - "integrity": "sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw==", - "dev": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -1811,18 +927,6 @@ "dev": true, "license": "ISC" }, - "node_modules/picomatch": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", - "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, "node_modules/pretty-format": { "version": "30.4.1", "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.4.1.tgz", @@ -1852,41 +956,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/pretty-ms": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-9.3.0.tgz", - "integrity": "sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ==", - "dev": true, - "dependencies": { - "parse-ms": "^4.0.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, "node_modules/react-is-18": { "name": "react-is", "version": "18.3.1", @@ -1903,97 +972,6 @@ "dev": true, "license": "MIT" }, - "node_modules/remark-parse": { - "version": "11.0.0", - "resolved": "https://registry.npmjs.org/remark-parse/-/remark-parse-11.0.0.tgz", - "integrity": "sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==", - "dev": true, - "dependencies": { - "@types/mdast": "^4.0.0", - "mdast-util-from-markdown": "^2.0.0", - "micromark-util-types": "^2.0.0", - "unified": "^11.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/reusify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", - "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -2030,165 +1008,6 @@ "node": ">=8" } }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/trough": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/trough/-/trough-2.2.0.tgz", - "integrity": "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==", - "dev": true, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" - } - }, - "node_modules/truthmark": { - "version": "2.2.6", - "resolved": "https://registry.npmjs.org/truthmark/-/truthmark-2.2.6.tgz", - "integrity": "sha512-b9GS/o3MtDSf1NutUsEIwIS2vWZp20xlBKBnOo3tWIDP69SkTtj9h/QCKZFuC5mDjLNxG7B44xO+kXbmv9RqCQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^8.17.1", - "commander": "^14.0.1", - "execa": "^9.6.0", - "fast-glob": "^3.3.3", - "micromatch": "^4.0.8", - "remark-parse": "^11.0.0", - "typescript": "^5.9.3", - "unified": "^11.0.5", - "unist-util-visit": "^5.0.0", - "yaml": "^2.8.1" - }, - "bin": { - "truthmark": "dist/main.js" - }, - "engines": { - "node": ">=24" - } - }, - "node_modules/truthmark/node_modules/commander": { - "version": "14.0.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-14.0.3.tgz", - "integrity": "sha512-H+y0Jo/T1RZ9qPP4Eh1pkcQcLRglraJaSLoyOtHxu6AapkjWVCy2Sit1QQ4x3Dng8qDlSsZEet7g5Pq06MvTgw==", - "dev": true, - "engines": { - "node": ">=20" - } - }, - "node_modules/truthmark/node_modules/execa": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-9.6.1.tgz", - "integrity": "sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA==", - "dev": true, - "dependencies": { - "@sindresorhus/merge-streams": "^4.0.0", - "cross-spawn": "^7.0.6", - "figures": "^6.1.0", - "get-stream": "^9.0.0", - "human-signals": "^8.0.1", - "is-plain-obj": "^4.1.0", - "is-stream": "^4.0.1", - "npm-run-path": "^6.0.0", - "pretty-ms": "^9.2.0", - "signal-exit": "^4.1.0", - "strip-final-newline": "^4.0.0", - "yoctocolors": "^2.1.1" - }, - "engines": { - "node": "^18.19.0 || >=20.5.0" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/truthmark/node_modules/get-stream": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-9.0.1.tgz", - "integrity": "sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==", - "dev": true, - "dependencies": { - "@sec-ant/readable-stream": "^0.4.1", - "is-stream": "^4.0.1" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/truthmark/node_modules/human-signals": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-8.0.1.tgz", - "integrity": "sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==", - "dev": true, - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/truthmark/node_modules/is-stream": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-4.0.1.tgz", - "integrity": "sha512-Dnz92NInDqYckGEUJv689RbRiTSEHCQ7wOVeALbkOz999YpqT46yMRIGtSNl2iCL1waAZSx40+h59NV/EwzV/A==", - "dev": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/truthmark/node_modules/npm-run-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-6.0.0.tgz", - "integrity": "sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==", - "dev": true, - "dependencies": { - "path-key": "^4.0.0", - "unicorn-magic": "^0.3.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/truthmark/node_modules/path-key": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", - "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/truthmark/node_modules/strip-final-newline": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-4.0.0.tgz", - "integrity": "sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==", - "dev": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/tsx": { "version": "4.22.3", "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.22.3.tgz", @@ -2227,162 +1046,6 @@ "dev": true, "license": "MIT" }, - "node_modules/unicorn-magic": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.3.0.tgz", - "integrity": "sha512-+QBBXBCvifc56fsbuxZQ6Sic3wqqc3WWaqxs58gvJrcOuN83HGTCwz3oS5phzU9LthRNE9VrJCFCLUgHeeFnfA==", - "dev": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/unified": { - "version": "11.0.5", - "resolved": "https://registry.npmjs.org/unified/-/unified-11.0.5.tgz", - "integrity": "sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==", - "dev": true, - "dependencies": { - "@types/unist": "^3.0.0", - "bail": "^2.0.0", - "devlop": "^1.0.0", - "extend": "^3.0.0", - "is-plain-obj": "^4.0.0", - "trough": "^2.0.0", - "vfile": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-is": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/unist-util-is/-/unist-util-is-6.0.1.tgz", - "integrity": "sha512-LsiILbtBETkDz8I9p1dQ0uyRUWuaQzd/cuEeS1hoRSyW5E5XGmTzlwY1OrNzzakGowI9Dr/I8HVaw4hTtnxy8g==", - "dev": true, - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-stringify-position": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/unist-util-stringify-position/-/unist-util-stringify-position-4.0.0.tgz", - "integrity": "sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==", - "dev": true, - "dependencies": { - "@types/unist": "^3.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/unist-util-visit/-/unist-util-visit-5.1.0.tgz", - "integrity": "sha512-m+vIdyeCOpdr/QeQCu2EzxX/ohgS8KbnPDgFni4dQsfSCtpz8UqDyY5GjRru8PDKuYn7Fq19j1CQ+nJSsGKOzg==", - "dev": true, - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0", - "unist-util-visit-parents": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/unist-util-visit-parents": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/unist-util-visit-parents/-/unist-util-visit-parents-6.0.2.tgz", - "integrity": "sha512-goh1s1TBrqSqukSc8wrjwWhL0hiJxgA8m4kFxGlQ+8FYQ3C/m11FcTs4YYem7V664AhHVvgoQLk890Ssdsr2IQ==", - "dev": true, - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-is": "^6.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/vfile/-/vfile-6.0.3.tgz", - "integrity": "sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==", - "dev": true, - "dependencies": { - "@types/unist": "^3.0.0", - "vfile-message": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/vfile-message": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/vfile-message/-/vfile-message-4.0.3.tgz", - "integrity": "sha512-QTHzsGd1EhbZs4AsQ20JX1rC3cOlt/IWJruk893DfLRr57lcnOeMaWG4K0JrRta4mIJZKth2Au3mM3u03/JWKw==", - "dev": true, - "dependencies": { - "@types/unist": "^3.0.0", - "unist-util-stringify-position": "^4.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/unified" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/yaml": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz", - "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==", - "dev": true, - "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14.6" - }, - "funding": { - "url": "https://github.com/sponsors/eemeli" - } - }, - "node_modules/yoctocolors": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yoctocolors/-/yoctocolors-2.1.2.tgz", - "integrity": "sha512-CzhO+pFNo8ajLM2d2IW/R93ipy99LWjtwblvC1RsoSUMZgyLbYFr221TnSNT7GjGdYui6P459mw9JH/g/zW2ug==", - "dev": true, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/zod": { "version": "3.25.76", "resolved": "https://registry.npmjs.org/zod/-/zod-3.25.76.tgz", diff --git a/package.json b/package.json index 25aba3b..3e09827 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,6 @@ "devDependencies": { "@types/node": "^24.13.2", "expect": "^30.4.1", - "truthmark": "^2.2.6", "tsx": "^4.20.6", "typescript": "^5.9.3" } diff --git a/references/prompt-surface-uplift-matrix.json b/references/prompt-surface-uplift-matrix.json index fa52cb7..7e82424 100644 --- a/references/prompt-surface-uplift-matrix.json +++ b/references/prompt-surface-uplift-matrix.json @@ -2017,7 +2017,7 @@ "tests/workflow-recipes.test.ts", "tests/validation.test.ts" ], - "lineCount": 84, + "lineCount": 90, "depthScore": 56, "metadata": { "model": true, @@ -2045,7 +2045,7 @@ "tests/workflow-recipes.test.ts", "tests/validation.test.ts" ], - "lineCount": 84, + "lineCount": 89, "depthScore": 56, "metadata": { "model": true, @@ -2073,7 +2073,7 @@ "tests/workflow-recipes.test.ts", "tests/validation.test.ts" ], - "lineCount": 84, + "lineCount": 90, "depthScore": 56, "metadata": { "model": true, @@ -2493,7 +2493,7 @@ "tests/workflow-recipes.test.ts", "tests/validation.test.ts" ], - "lineCount": 84, + "lineCount": 90, "depthScore": 56, "metadata": { "model": true, @@ -2521,7 +2521,7 @@ "tests/workflow-recipes.test.ts", "tests/validation.test.ts" ], - "lineCount": 84, + "lineCount": 90, "depthScore": 56, "metadata": { "model": true, @@ -2689,7 +2689,7 @@ "tests/workflow-recipes.test.ts", "tests/validation.test.ts" ], - "lineCount": 84, + "lineCount": 89, "depthScore": 56, "metadata": { "model": true, @@ -3165,7 +3165,7 @@ "tests/workflow-recipes.test.ts", "tests/validation.test.ts" ], - "lineCount": 84, + "lineCount": 90, "depthScore": 56, "metadata": { "model": true, diff --git a/references/prompt-surface-uplift-matrix.md b/references/prompt-surface-uplift-matrix.md index 46702a3..f6e0788 100644 --- a/references/prompt-surface-uplift-matrix.md +++ b/references/prompt-surface-uplift-matrix.md @@ -67,9 +67,9 @@ Decisions: adopt, adapt, merge, split, defer, out-of-scope. | workflow | `.codex/workflows/balance-check.md` | | defer | deferred | 84 | | 56 | yes | pass | `tests/workflow-catalog.test.ts`
`tests/workflow-recipes.test.ts`
`tests/validation.test.ts` | | workflow | `.codex/workflows/brainstorm.md` | | defer | deferred | 85 | | 56 | yes | pass | `tests/workflow-catalog.test.ts`
`tests/workflow-recipes.test.ts`
`tests/validation.test.ts` | | workflow | `.codex/workflows/bug-report.md` | | defer | deferred | 84 | | 56 | yes | pass | `tests/workflow-catalog.test.ts`
`tests/workflow-recipes.test.ts`
`tests/validation.test.ts` | -| workflow | `.codex/workflows/bugfix.md` | | defer | deferred | 84 | | 56 | yes | pass | `tests/workflow-catalog.test.ts`
`tests/workflow-recipes.test.ts`
`tests/validation.test.ts` | -| workflow | `.codex/workflows/changelog.md` | | defer | deferred | 84 | | 56 | yes | pass | `tests/workflow-catalog.test.ts`
`tests/workflow-recipes.test.ts`
`tests/validation.test.ts` | -| workflow | `.codex/workflows/code-review.md` | | defer | deferred | 84 | | 56 | yes | pass | `tests/workflow-catalog.test.ts`
`tests/workflow-recipes.test.ts`
`tests/validation.test.ts` | +| workflow | `.codex/workflows/bugfix.md` | | defer | deferred | 90 | | 56 | yes | pass | `tests/workflow-catalog.test.ts`
`tests/workflow-recipes.test.ts`
`tests/validation.test.ts` | +| workflow | `.codex/workflows/changelog.md` | | defer | deferred | 89 | | 56 | yes | pass | `tests/workflow-catalog.test.ts`
`tests/workflow-recipes.test.ts`
`tests/validation.test.ts` | +| workflow | `.codex/workflows/code-review.md` | | defer | deferred | 90 | | 56 | yes | pass | `tests/workflow-catalog.test.ts`
`tests/workflow-recipes.test.ts`
`tests/validation.test.ts` | | workflow | `.codex/workflows/consistency-check.md` | | defer | deferred | 86 | | 56 | yes | pass | `tests/workflow-catalog.test.ts`
`tests/workflow-recipes.test.ts`
`tests/validation.test.ts` | | workflow | `.codex/workflows/control-manifest.md` | | defer | deferred | 84 | | 56 | yes | pass | `tests/workflow-catalog.test.ts`
`tests/workflow-recipes.test.ts`
`tests/validation.test.ts` | | workflow | `.codex/workflows/create-architecture.md` | | defer | deferred | 85 | | 56 | yes | pass | `tests/workflow-catalog.test.ts`
`tests/workflow-recipes.test.ts`
`tests/validation.test.ts` | @@ -84,14 +84,14 @@ Decisions: adopt, adapt, merge, split, defer, out-of-scope. | workflow | `.codex/workflows/game-concept.md` | | defer | deferred | 84 | | 56 | yes | pass | `tests/workflow-catalog.test.ts`
`tests/workflow-recipes.test.ts`
`tests/validation.test.ts` | | workflow | `.codex/workflows/game-feel-tuning.md` | | defer | deferred | 84 | | 56 | yes | pass | `tests/workflow-catalog.test.ts`
`tests/workflow-recipes.test.ts`
`tests/validation.test.ts` | | workflow | `.codex/workflows/handoff.md` | | defer | deferred | 84 | | 56 | yes | pass | `tests/workflow-catalog.test.ts`
`tests/workflow-recipes.test.ts`
`tests/validation.test.ts` | -| workflow | `.codex/workflows/hotfix.md` | | defer | deferred | 84 | | 56 | yes | pass | `tests/workflow-catalog.test.ts`
`tests/workflow-recipes.test.ts`
`tests/validation.test.ts` | -| workflow | `.codex/workflows/implement.md` | | defer | deferred | 84 | | 56 | yes | pass | `tests/workflow-catalog.test.ts`
`tests/workflow-recipes.test.ts`
`tests/validation.test.ts` | +| workflow | `.codex/workflows/hotfix.md` | | defer | deferred | 90 | | 56 | yes | pass | `tests/workflow-catalog.test.ts`
`tests/workflow-recipes.test.ts`
`tests/validation.test.ts` | +| workflow | `.codex/workflows/implement.md` | | defer | deferred | 90 | | 56 | yes | pass | `tests/workflow-catalog.test.ts`
`tests/workflow-recipes.test.ts`
`tests/validation.test.ts` | | workflow | `.codex/workflows/launch-checklist.md` | | defer | deferred | 84 | | 56 | yes | pass | `tests/workflow-catalog.test.ts`
`tests/workflow-recipes.test.ts`
`tests/validation.test.ts` | | workflow | `.codex/workflows/localization-plan.md` | | defer | deferred | 85 | | 56 | yes | pass | `tests/workflow-catalog.test.ts`
`tests/workflow-recipes.test.ts`
`tests/validation.test.ts` | | workflow | `.codex/workflows/map-systems.md` | | defer | deferred | 85 | | 56 | yes | pass | `tests/workflow-catalog.test.ts`
`tests/workflow-recipes.test.ts`
`tests/validation.test.ts` | | workflow | `.codex/workflows/market-analysis.md` | | defer | deferred | 85 | | 56 | yes | pass | `tests/workflow-catalog.test.ts`
`tests/workflow-recipes.test.ts`
`tests/validation.test.ts` | | workflow | `.codex/workflows/onboard.md` | | defer | deferred | 87 | | 56 | yes | pass | `tests/workflow-catalog.test.ts`
`tests/workflow-recipes.test.ts`
`tests/validation.test.ts` | -| workflow | `.codex/workflows/patch-notes.md` | | defer | deferred | 84 | | 56 | yes | pass | `tests/workflow-catalog.test.ts`
`tests/workflow-recipes.test.ts`
`tests/validation.test.ts` | +| workflow | `.codex/workflows/patch-notes.md` | | defer | deferred | 89 | | 56 | yes | pass | `tests/workflow-catalog.test.ts`
`tests/workflow-recipes.test.ts`
`tests/validation.test.ts` | | workflow | `.codex/workflows/perf-profile.md` | | defer | deferred | 84 | | 56 | yes | pass | `tests/workflow-catalog.test.ts`
`tests/workflow-recipes.test.ts`
`tests/validation.test.ts` | | workflow | `.codex/workflows/playtest-polish.md` | | defer | deferred | 84 | | 56 | yes | pass | `tests/workflow-catalog.test.ts`
`tests/workflow-recipes.test.ts`
`tests/validation.test.ts` | | workflow | `.codex/workflows/playtest.md` | | defer | deferred | 84 | | 56 | yes | pass | `tests/workflow-catalog.test.ts`
`tests/workflow-recipes.test.ts`
`tests/validation.test.ts` | @@ -108,7 +108,7 @@ Decisions: adopt, adapt, merge, split, defer, out-of-scope. | workflow | `.codex/workflows/ship-check.md` | | defer | deferred | 85 | | 56 | yes | pass | `tests/workflow-catalog.test.ts`
`tests/workflow-recipes.test.ts`
`tests/validation.test.ts` | | workflow | `.codex/workflows/sprint-plan.md` | | defer | deferred | 85 | | 56 | yes | pass | `tests/workflow-catalog.test.ts`
`tests/workflow-recipes.test.ts`
`tests/validation.test.ts` | | workflow | `.codex/workflows/sprint-status.md` | | defer | deferred | 85 | | 56 | yes | pass | `tests/workflow-catalog.test.ts`
`tests/workflow-recipes.test.ts`
`tests/validation.test.ts` | -| workflow | `.codex/workflows/story-done.md` | | defer | deferred | 84 | | 56 | yes | pass | `tests/workflow-catalog.test.ts`
`tests/workflow-recipes.test.ts`
`tests/validation.test.ts` | +| workflow | `.codex/workflows/story-done.md` | | defer | deferred | 90 | | 56 | yes | pass | `tests/workflow-catalog.test.ts`
`tests/workflow-recipes.test.ts`
`tests/validation.test.ts` | | workflow | `.codex/workflows/story-readiness.md` | | defer | deferred | 84 | | 56 | yes | pass | `tests/workflow-catalog.test.ts`
`tests/workflow-recipes.test.ts`
`tests/validation.test.ts` | | workflow | `.codex/workflows/team-feature.md` | | defer | deferred | 84 | | 56 | yes | pass | `tests/workflow-catalog.test.ts`
`tests/workflow-recipes.test.ts`
`tests/validation.test.ts` | | workflow | `.codex/workflows/team-polish.md` | | defer | deferred | 84 | | 56 | yes | pass | `tests/workflow-catalog.test.ts`
`tests/workflow-recipes.test.ts`
`tests/validation.test.ts` | diff --git a/src/behavioral-evaluation.ts b/src/behavioral-evaluation.ts index 60dcda7..516707d 100644 --- a/src/behavioral-evaluation.ts +++ b/src/behavioral-evaluation.ts @@ -65,7 +65,7 @@ export const behavioralEvaluationScenarios: BehavioralEvaluationScenario[] = [ role: "qa-playtester", phase: "review", objective: "Review current playtest blockers and warnings.", - contextFiles: ["AGENTS.md", ".codex/studio.json", "documentation/design/gdd.md"] + contextFiles: ["AGENTS.md", ".codex/studio.json", "design/gdd.md"] }, requiredPhrases: ["Role: QA Playtester", "Issue ID", "Severity", "Reproduction steps", "Expected result", "Actual result", "File Edits: not allowed"], forbiddenPhrases: withDefaultForbidden(["danger-full-access", "Template: release_notes"]), @@ -80,7 +80,7 @@ export const behavioralEvaluationScenarios: BehavioralEvaluationScenario[] = [ role: "release-manager", phase: "ship", objective: "Assess whether the milestone is ready to ship.", - contextFiles: ["AGENTS.md", ".codex/studio.json", "documentation/production/timeline.md"] + contextFiles: ["AGENTS.md", ".codex/studio.json", "production/timeline.md"] }, requiredPhrases: ["Role: Release Manager", "Release decision", "Blocking issues", "Validation evidence", "Rollback notes", "release blockers"], forbiddenPhrases: withDefaultForbidden(["Template: analytics_setup"]), @@ -91,7 +91,7 @@ export const behavioralEvaluationScenarios: BehavioralEvaluationScenario[] = [ id: "workflow.ship-check.release-readiness", description: "Ship-check workflow prompts must select release templates, timeline context, and release-manager evidence without pulling unrelated market or analytics templates.", target: { kind: "workflow", workflow: "ship-check" }, - requiredPhrases: ["Role: Release Manager", workflowRegistry["ship-check"].objective, "Blocking issues", "Validation evidence", "documentation/production/timeline.md"], + requiredPhrases: ["Role: Release Manager", workflowRegistry["ship-check"].objective, "Blocking issues", "Validation evidence", "production/timeline.md"], forbiddenPhrases: withDefaultForbidden(["Template: market_analysis", "Template: analytics_setup"]), expectedContextCategories: ["project-instructions", "studio-state", "workflow-file", "project-docs", "templates", "role-contract", "output-contract"], requiredTemplateIds: ["ship_check", "release_notes", "risk_register"], @@ -113,7 +113,7 @@ export const behavioralEvaluationScenarios: BehavioralEvaluationScenario[] = [ id: "workflow.market-analysis.positioning", description: "Market-analysis workflow prompts must select market and pitch material while avoiding analytics-only and release-only templates.", target: { kind: "workflow", workflow: "market-analysis" }, - requiredPhrases: ["Role: Market Analyst", workflowRegistry["market-analysis"].objective, "resources/market-research/market-overview.md", "Expected Outputs"], + requiredPhrases: ["Role: Market Analyst", workflowRegistry["market-analysis"].objective, "docs/market-overview.md", "Expected Outputs"], forbiddenPhrases: withDefaultForbidden(["Template: analytics_setup", "Template: release_notes"]), expectedContextCategories: ["project-instructions", "studio-state", "workflow-file", "project-docs", "templates", "role-contract"], requiredTemplateIds: ["market_analysis", "pitch_document"], @@ -159,7 +159,7 @@ export const behavioralEvaluationScenarios: BehavioralEvaluationScenario[] = [ { id: "role.game-designer.design-system-uplift", description: "Design-system prompts require game-designer output structure, quality gates, and handoff evidence.", - target: { kind: "role", role: "game-designer", phase: "plan", objective: "Create a design-system update for player-facing ability rules.", contextFiles: ["AGENTS.md", ".codex/studio.json", "documentation/design/gdd.md"] }, + target: { kind: "role", role: "game-designer", phase: "plan", objective: "Create a design-system update for player-facing ability rules.", contextFiles: ["AGENTS.md", ".codex/studio.json", "design/gdd.md"] }, requiredPhrases: ["Role: Game Designer", "## Responsibilities", "Quality Gates", "Acceptance criteria", "## Verification"], forbiddenPhrases: withDefaultForbidden(["Template: release_notes"]), expectedContextCategories: ["project-instructions", "studio-state", "project-docs", "role-contract", "output-contract"], @@ -202,8 +202,8 @@ function actualContextCategories(scenario: BehavioralEvaluationScenario, prompt: if (prompt.includes("AGENTS.md")) categories.add("project-instructions"); if (prompt.includes(".codex/studio.json")) categories.add("studio-state"); if (prompt.includes(".codex/workflows/")) categories.add("workflow-file"); - if (/documentation\/|resources\//.test(prompt)) categories.add("project-docs"); - if (/source\//.test(prompt)) categories.add("source-artifact"); + if (/(?:design\/|docs\/|production\/)/.test(prompt)) categories.add("project-docs"); + if (/(?:src\/|source\/)/.test(prompt)) categories.add("source-artifact"); if (prompt.includes("docs/engine-reference/")) categories.add("engine-reference"); if (prompt.includes("## Workflow Templates") || (scenario.target.kind === "workflow" && (workflowRegistry[scenario.target.workflow].templateIds?.length ?? 0) > 0)) categories.add("templates"); if (prompt.includes("## Responsibilities") && prompt.includes("## Quality Gates")) categories.add("role-contract"); diff --git a/src/cli.ts b/src/cli.ts index 0026aca..0383d14 100644 --- a/src/cli.ts +++ b/src/cli.ts @@ -14,6 +14,7 @@ import { import { formatTemplateShow, listTemplates, templateRegistry, type TemplateId } from "./templates.js"; import { freezeProject, initProject, readStudioProject, refreshContextManifestProject, resumeProject, statusProject } from "./projects.js"; import { runValidation } from "./validation.js"; +import { documentationImpactChecks } from "./documentation-impact.js"; import { executeRunLifecycle, prepareRun } from "./runner.js"; import { checkCodexAvailability } from "./codex-runtime.js"; import { renderAgentContext } from "./agent-context.js"; @@ -155,16 +156,31 @@ program .option("--project ", "project path") .action((opts) => console.log(freezeProject(opts.project))); +function printChecks(checks: readonly { status: string; id: string; message: string; path?: string }[]): boolean { + for (const check of checks) { + console.log(`${check.status.toUpperCase()} ${check.id}: ${check.message}${check.path ? ` (${check.path})` : ""}`); + } + return checks.some((check) => check.status === "fail"); +} + program .command("validate") .description("Run hard-failing repo or project validation") .option("--project ", "project path") + .option("--base ", "Git base used for documentation-impact validation") .action(async (opts) => { - const result = await runValidation({ project: opts.project }); - for (const check of result.checks) { - console.log(`${check.status.toUpperCase()} ${check.id}: ${check.message}${check.path ? ` (${check.path})` : ""}`); - } - if (result.failed) process.exitCode = 1; + const result = await runValidation({ project: opts.project, base: opts.base }); + if (printChecks(result.checks)) process.exitCode = 1; + }); + +program + .command("docs-impact") + .description("Check documentation-impact evidence for functional game changes") + .option("--project ", "project path") + .option("--base ", "Git base to compare against", "HEAD") + .action((opts) => { + const projectRoot = resolveTaskProject(opts.project); + if (printChecks(documentationImpactChecks(projectRoot, { base: opts.base }))) process.exitCode = 1; }); const templates = program.command("templates").description("Discover templates"); diff --git a/src/context.ts b/src/context.ts index 97c0b8c..dd3420f 100644 --- a/src/context.ts +++ b/src/context.ts @@ -2,9 +2,9 @@ import { existsSync, realpathSync, statSync } from "node:fs"; import path from "node:path"; const broadContextCandidates = [ - "documentation/design/gdd.md", - "documentation/production/timeline.md", - "resources/market-research/market-overview.md", + "design/gdd.md", + "production/timeline.md", + "docs/market-overview.md", "AGENTS.md", ".codex/studio.json" ] as const; diff --git a/src/documentation-impact.ts b/src/documentation-impact.ts new file mode 100644 index 0000000..b2b3f54 --- /dev/null +++ b/src/documentation-impact.ts @@ -0,0 +1,134 @@ +import { execFileSync } from "node:child_process"; +import { existsSync, readFileSync } from "node:fs"; +import path from "node:path"; + +export type DocumentationImpactCheck = { + id: string; + status: "pass" | "fail"; + message: string; + path?: string; +}; + +export type DocumentationImpactRecord = { + decision?: string; + reason?: string; + documents: string[]; +}; + +export type DocumentationImpactOptions = { + base?: string; + changedPaths?: string[]; +}; + +const activeSessionPath = path.join("production", "session-state", "active.md"); +const documentationRoots = ["design/", "docs/", "production/"]; + +function pass(id: string, message: string, file?: string): DocumentationImpactCheck { + return { id, status: "pass", message, path: file }; +} + +function fail(id: string, message: string, file?: string): DocumentationImpactCheck { + return { id, status: "fail", message, path: file }; +} + +function documentationSection(body: string): string | undefined { + const heading = /^## Documentation Impact\s*$/m.exec(body); + if (!heading || heading.index === undefined) return undefined; + const rest = body.slice(heading.index + heading[0].length); + const nextHeading = rest.search(/^##\s/m); + return (nextHeading === -1 ? rest : rest.slice(0, nextHeading)).trim(); +} + +export function parseDocumentationImpactRecord(body: string): DocumentationImpactRecord | undefined { + const section = documentationSection(body); + if (section === undefined) return undefined; + const fields = new Map(); + for (const line of section.split("\n")) { + const match = /^-\s*(Decision|Reason|Documents):\s*(.*)$/i.exec(line.trim()); + if (match) fields.set(match[1].toLowerCase(), match[2].trim()); + } + const documentsValue = fields.get("documents") ?? ""; + const documents = documentsValue.toLowerCase() === "none" || documentsValue === "" ? [] : documentsValue.split(",").map((entry) => entry.trim()).filter(Boolean); + return { decision: fields.get("decision")?.toLowerCase(), reason: fields.get("reason"), documents }; +} + +export function isDocumentationPath(file: string): boolean { + return documentationRoots.some((root) => file.startsWith(root)); +} + +export function isFunctionalGamePath(file: string): boolean { + if (isDocumentationPath(file) || file.startsWith(".codex/") || file.startsWith("tests/") || file.startsWith("tools/")) return false; + return file.startsWith("src/") || file.startsWith("assets/") || file === "project.godot" || file.endsWith(".uproject"); +} + +function changedPathsFromGit(projectRoot: string, base: string): string[] { + const run = (args: string[]) => execFileSync("git", args, { cwd: projectRoot, encoding: "utf8", stdio: ["ignore", "pipe", "pipe"] }).trim(); + const tracked = run(["diff", "--name-only", "--diff-filter=ACMRD", base, "--"]); + const untracked = run(["ls-files", "--others", "--exclude-standard"]); + return [...new Set([...tracked.split("\n"), ...untracked.split("\n")].map((file) => file.trim()).filter(Boolean))].sort(); +} + +function isProjectDocumentPath(file: string): boolean { + if (path.isAbsolute(file)) return false; + const normalized = path.posix.normalize(file.replaceAll("\\", "/")); + return normalized === file && documentationRoots.some((root) => normalized.startsWith(root)); +} + +export function documentationImpactChecks(projectRoot: string, options: DocumentationImpactOptions = {}): DocumentationImpactCheck[] { + let changedPaths = options.changedPaths; + if (!changedPaths) { + const base = options.base ?? "HEAD"; + try { + changedPaths = changedPathsFromGit(projectRoot, base); + } catch (error) { + return [fail("project.documentation_impact.base", `documentation impact could not inspect Git base ${base}: ${(error as Error).message}`)]; + } + } + + const functionalPaths = changedPaths.filter(isFunctionalGamePath); + if (functionalPaths.length === 0) { + return [pass("project.documentation_impact", "no functional game paths changed; documentation-impact record is not required")]; + } + + const recordPath = path.join(projectRoot, activeSessionPath); + if (!existsSync(recordPath)) { + return [fail("project.documentation_impact.record", `functional game paths changed (${functionalPaths.join(", ")}) but ${activeSessionPath} is missing`, recordPath)]; + } + + const record = parseDocumentationImpactRecord(readFileSync(recordPath, "utf8")); + if (!record) return [fail("project.documentation_impact.record", `${activeSessionPath} must contain a ## Documentation Impact section`, recordPath)]; + + const checks: DocumentationImpactCheck[] = []; + if (record.decision !== "updated" && record.decision !== "no-update") { + checks.push(fail("project.documentation_impact.decision", "Documentation Impact Decision must be updated or no-update", recordPath)); + return checks; + } + if (!record.reason?.trim()) checks.push(fail("project.documentation_impact.reason", "Documentation Impact Reason is required", recordPath)); + + if (record.decision === "no-update") { + if (record.documents.length > 0) checks.push(fail("project.documentation_impact.documents", "no-update decisions must declare Documents: none", recordPath)); + if (checks.length === 0) checks.push(pass("project.documentation_impact", "functional changes have an explicit no-update documentation decision", recordPath)); + return checks; + } + + if (record.documents.length === 0) { + checks.push(fail("project.documentation_impact.documents", "updated decisions must name one or more changed game documents", recordPath)); + return checks; + } + + for (const document of record.documents) { + const id = `project.documentation_impact.document.${document}`; + const fullPath = path.join(projectRoot, document); + if (!isProjectDocumentPath(document)) { + checks.push(fail(id, "Documentation Impact documents must be project-relative paths under design/, docs/, or production/", recordPath)); + } else if (!existsSync(fullPath)) { + checks.push(fail(id, `Documentation Impact document does not exist: ${document}`, fullPath)); + } else if (!changedPaths.includes(document)) { + checks.push(fail(id, `Documentation Impact document did not differ from the selected base: ${document}`, fullPath)); + } else { + checks.push(pass(id, `Documentation Impact document changed: ${document}`, fullPath)); + } + } + if (checks.every((check) => check.status === "pass") && record.reason?.trim()) checks.push(pass("project.documentation_impact", "functional changes have updated documentation evidence", recordPath)); + return checks; +} diff --git a/src/validation.ts b/src/validation.ts index c5689db..f591bbe 100644 --- a/src/validation.ts +++ b/src/validation.ts @@ -22,6 +22,7 @@ import { isEngineSpecialistRoleId, projectRoleIdsForEngine, rolePackages, studio import { templateRegistry, validateTemplateFiles } from "./templates.js"; import { renderWorkflowPrompt, workflowIds, workflowRegistry } from "./workflows.js"; import { templateSkillDefinitions } from "./skills.js"; +import { documentationImpactChecks } from "./documentation-impact.js"; import { isCodexModelName, isReasoningEffort, @@ -255,6 +256,9 @@ export function validateTemplateSurfaces(root = process.cwd()): ValidationCheck[ checks.push(...openAiSkillMetadataChecks(root)); for (const forbidden of [ + ".truthmark", + path.join("docs", "truthmark"), + path.join("tooling", "truthmark"), ".codex/agents/truth-claim-verifier.toml", ".codex/agents/truth-doc-reviewer.toml", ".codex/agents/truth-doc-writer.toml", @@ -537,7 +541,7 @@ export async function validateRepo(root = process.cwd()): Promise; @@ -624,8 +628,9 @@ export function validateProject(projectRoot: string): ValidationCheck[] { checks.push(sectionHasContent(body, section) ? pass(`project.timeline.${section}`, `${section} exists`, timeline) : fail(`project.timeline.${section}`, `${section} missing non-empty content`, timeline)); } } + if (options.documentationBase) checks.push(...documentationImpactChecks(projectRoot, { base: options.documentationBase })); - for (const forbidden of ["project_orchestrator.md", "CODEX.md", path.join(".gamestudio", "runs"), path.join(".codex", "hooks.json"), path.join(".codex", "agents", "truth-claim-verifier.toml"), path.join(".codex", "agents", "truth-doc-reviewer.toml"), path.join(".codex", "agents", "truth-doc-writer.toml"), path.join(".codex", "agents", "truth-route-auditor.toml")]) { + for (const forbidden of ["project_orchestrator.md", "CODEX.md", path.join(".gamestudio", "runs"), ".truthmark", path.join("docs", "truthmark"), path.join("tooling", "truthmark"), path.join(".codex", "hooks.json"), path.join(".codex", "agents", "truth-claim-verifier.toml"), path.join(".codex", "agents", "truth-doc-reviewer.toml"), path.join(".codex", "agents", "truth-doc-writer.toml"), path.join(".codex", "agents", "truth-route-auditor.toml")]) { const file = path.join(projectRoot, forbidden); checks.push(existsSync(file) ? fail(`project.forbidden.${forbidden}`, `${forbidden} must not exist`, file) : pass(`project.forbidden.${forbidden}`, `${forbidden} absent`)); } @@ -638,9 +643,9 @@ export function validateProject(projectRoot: string): ValidationCheck[] { return checks; } -export async function runValidation(options: { project?: string; root?: string } = {}): Promise<{ checks: ValidationCheck[]; failed: boolean }> { +export async function runValidation(options: { project?: string; root?: string; base?: string } = {}): Promise<{ checks: ValidationCheck[]; failed: boolean }> { const root = options.root ?? process.cwd(); const projectPath = options.project ? path.resolve(root, options.project) : existsSync(path.join(root, ".codex", "studio.json")) ? root : undefined; - const checks = projectPath ? validateProject(projectPath) : await validateRepo(root); + const checks = projectPath ? validateProject(projectPath, { documentationBase: options.base }) : await validateRepo(root); return { checks, failed: checks.some((check) => check.status === "fail") }; } diff --git a/src/workflow-catalog.ts b/src/workflow-catalog.ts index 020ba72..4eb7809 100644 --- a/src/workflow-catalog.ts +++ b/src/workflow-catalog.ts @@ -34,11 +34,11 @@ export const workflowCatalog: { phases: WorkflowCatalogPhase[] } = { nextPhase: "systems-design", steps: [ { id: "brainstorm", label: "Brainstorm", command: "./codex-game-studio run creative-director", required: false, description: "Explore fantasy, verbs, pillars, audience, and scope tiers." }, - { id: "engine-setup", label: "Engine Setup", command: "./codex-game-studio run engine-setup", required: true, artifact: { path: ".codex/studio.json", pattern: "\"engine\"" }, description: "Configure engine, version, project structure, and validation path." }, - { id: "game-concept", label: "Game Concept", command: "./codex-game-studio run game-concept", required: true, artifact: { path: "design/gdd.md" }, description: "Capture concept, pillars, and initial player promise." }, - { id: "design-review-concept", label: "Concept Design Review", command: "./codex-game-studio run design-review-concept", required: false, artifact: { path: "design/gdd.md", pattern: "Pillar|Scope|Risk" }, description: "Review the concept before deeper systems work." }, - { id: "art-bible", label: "Art Bible", command: "./codex-game-studio run art-bible", required: false, artifact: { path: "design/art/art-bible.md" }, description: "Define visual identity and asset constraints." }, - { id: "map-systems", label: "Systems Map", command: "./codex-game-studio run map-systems", required: true, artifact: { path: "design/gdd.md", pattern: "System" }, description: "Map systems and dependencies." } + { id: "engine-setup", label: "Engine Setup", command: "./codex-game-studio workflow render engine-setup", required: true, artifact: { path: ".codex/studio.json", pattern: "\"engine\"" }, description: "Configure engine, version, project structure, and validation path." }, + { id: "game-concept", label: "Game Concept", command: "./codex-game-studio workflow render game-concept", required: true, artifact: { path: "design/gdd.md" }, description: "Capture concept, pillars, and initial player promise." }, + { id: "design-review-concept", label: "Concept Design Review", command: "./codex-game-studio workflow render design-review-concept", required: false, artifact: { path: "design/gdd.md", pattern: "Pillar|Scope|Risk" }, description: "Review the concept before deeper systems work." }, + { id: "art-bible", label: "Art Bible", command: "./codex-game-studio workflow render art-bible", required: false, artifact: { path: "design/art/art-bible.md" }, description: "Define visual identity and asset constraints." }, + { id: "map-systems", label: "Systems Map", command: "./codex-game-studio workflow render map-systems", required: true, artifact: { path: "design/gdd.md", pattern: "System" }, description: "Map systems and dependencies." } ] }, { @@ -47,15 +47,15 @@ export const workflowCatalog: { phases: WorkflowCatalogPhase[] } = { description: "Turn the concept into implementable systems, UX, and architecture.", nextPhase: "pre-production", steps: [ - { id: "design-system", label: "System GDDs", command: "./codex-game-studio run design-system", required: true, repeatable: true, artifact: { path: "design/gdd.md" }, description: "Author or update per-system GDD content." }, - { id: "design-review", label: "Design Review", command: "./codex-game-studio run design-review", required: false, artifact: { path: "design/gdd.md", pattern: "Risk|Scope|System" }, description: "Review design consistency and scope risk." }, - { id: "review-all-gdds", label: "Review All GDDs", command: "./codex-game-studio run review-all-gdds", required: false, artifact: { path: "design/gdd.md", pattern: "#|System" }, description: "Review all design documents for contradictions and missing ownership." }, - { id: "consistency-check", label: "Consistency Check", command: "./codex-game-studio run consistency-check", required: false, artifact: { path: "production/session-state/active.md" }, description: "Check cross-surface consistency before implementation planning." }, - { id: "create-architecture", label: "Architecture", command: "./codex-game-studio run create-architecture", required: true, artifact: { path: "docs/architecture/README.md" }, description: "Define technical architecture and implementation boundaries." }, - { id: "control-manifest", label: "Control Manifest", command: "./codex-game-studio run control-manifest", required: false, artifact: { path: "design/ux/controls.md" }, description: "Document inputs, remapping, prompts, devices, and accessibility constraints." }, - { id: "accessibility-doc", label: "Accessibility Requirements", command: "./codex-game-studio run accessibility-doc", required: false, artifact: { path: "design/ux/accessibility.md" }, description: "Document accessibility requirements and verification paths." }, - { id: "ux-design", label: "UX Design", command: "./codex-game-studio run ux-design", required: false, artifact: { path: "design/ux/ux-spec.md" }, description: "Document player journeys, HUD, menus, and accessibility." }, - { id: "ux-review", label: "UX Review", command: "./codex-game-studio run ux-review", required: false, artifact: { path: "design/ux/ux-review.md" }, description: "Review UX flows and usability risks before implementation." } + { id: "design-system", label: "System GDDs", command: "./codex-game-studio workflow render design-system", required: true, repeatable: true, artifact: { path: "design/gdd.md" }, description: "Author or update per-system GDD content." }, + { id: "design-review", label: "Design Review", command: "./codex-game-studio workflow render design-review", required: false, artifact: { path: "design/gdd.md", pattern: "Risk|Scope|System" }, description: "Review design consistency and scope risk." }, + { id: "review-all-gdds", label: "Review All GDDs", command: "./codex-game-studio workflow render review-all-gdds", required: false, artifact: { path: "design/gdd.md", pattern: "#|System" }, description: "Review all design documents for contradictions and missing ownership." }, + { id: "consistency-check", label: "Consistency Check", command: "./codex-game-studio workflow render consistency-check", required: false, artifact: { path: "production/session-state/active.md" }, description: "Check cross-surface consistency before implementation planning." }, + { id: "create-architecture", label: "Architecture", command: "./codex-game-studio workflow render create-architecture", required: true, artifact: { path: "docs/architecture/README.md" }, description: "Define technical architecture and implementation boundaries." }, + { id: "control-manifest", label: "Control Manifest", command: "./codex-game-studio workflow render control-manifest", required: false, artifact: { path: "design/ux/controls.md" }, description: "Document inputs, remapping, prompts, devices, and accessibility constraints." }, + { id: "accessibility-doc", label: "Accessibility Requirements", command: "./codex-game-studio workflow render accessibility-doc", required: false, artifact: { path: "design/ux/accessibility.md" }, description: "Document accessibility requirements and verification paths." }, + { id: "ux-design", label: "UX Design", command: "./codex-game-studio workflow render ux-design", required: false, artifact: { path: "design/ux/ux-spec.md" }, description: "Document player journeys, HUD, menus, and accessibility." }, + { id: "ux-review", label: "UX Review", command: "./codex-game-studio workflow render ux-review", required: false, artifact: { path: "design/ux/ux-review.md" }, description: "Review UX flows and usability risks before implementation." } ] }, { @@ -64,14 +64,14 @@ export const workflowCatalog: { phases: WorkflowCatalogPhase[] } = { description: "Validate build feasibility and production readiness.", nextPhase: "production", steps: [ - { id: "entity-inventory", label: "Entity Inventory", command: "./codex-game-studio run entity-inventory", required: true, repeatable: true, artifact: { path: "design/entities/entity-inventory.md" }, description: "Catalog gameplay entities, content objects, owners, dependencies, and validation signals." }, - { id: "asset-spec", label: "Asset Spec", command: "./codex-game-studio run asset-spec", required: false, repeatable: true, artifact: { path: "design/art/asset-spec.md" }, description: "Specify assets with references, constraints, variants, and production acceptance criteria." }, + { id: "entity-inventory", label: "Entity Inventory", command: "./codex-game-studio workflow render entity-inventory", required: true, repeatable: true, artifact: { path: "design/entities/entity-inventory.md" }, description: "Catalog gameplay entities, content objects, owners, dependencies, and validation signals." }, + { id: "asset-spec", label: "Asset Spec", command: "./codex-game-studio workflow render asset-spec", required: false, repeatable: true, artifact: { path: "design/art/asset-spec.md" }, description: "Specify assets with references, constraints, variants, and production acceptance criteria." }, { id: "vertical-slice", label: "Vertical Slice", command: "use skill cgs-vertical-slice", required: true, artifact: { path: "production/session-state/active.md", pattern: "PROCEED" }, description: "Validate representative full-loop feasibility." }, - { id: "test-setup", label: "Test Setup", command: "./codex-game-studio run test-setup", required: true, artifact: { path: "tests/qa-plan.md" }, description: "Define test environment, scenarios, data, automation hooks, and exit criteria." }, + { id: "test-setup", label: "Test Setup", command: "./codex-game-studio workflow render test-setup", required: true, artifact: { path: "tests/qa-plan.md" }, description: "Define test environment, scenarios, data, automation hooks, and exit criteria." }, { id: "qa-plan", label: "QA Plan", command: "use skill cgs-qa-plan", required: true, artifact: { path: "tests/qa-plan.md" }, description: "Plan QA coverage before production." }, - { id: "scope-check", label: "Scope Check", command: "./codex-game-studio run scope-check", required: false, artifact: { path: "production/session-state/scope-check.md" }, description: "Check production scope, cutlines, owners, and deferrals." }, - { id: "balance-check", label: "Balance Check", command: "./codex-game-studio run balance-check", required: false, artifact: { path: "design/balance/balance-check.md" }, description: "Review economy, progression, difficulty, exploit risks, and tuning hooks." }, - { id: "asset-audit", label: "Asset Audit", command: "./codex-game-studio run asset-audit", required: false, artifact: { path: "design/art/asset-audit.md" }, description: "Audit asset completeness, style fit, naming, and technical constraints." } + { id: "scope-check", label: "Scope Check", command: "./codex-game-studio workflow render scope-check", required: false, artifact: { path: "production/session-state/scope-check.md" }, description: "Check production scope, cutlines, owners, and deferrals." }, + { id: "balance-check", label: "Balance Check", command: "./codex-game-studio workflow render balance-check", required: false, artifact: { path: "design/balance/balance-check.md" }, description: "Review economy, progression, difficulty, exploit risks, and tuning hooks." }, + { id: "asset-audit", label: "Asset Audit", command: "./codex-game-studio workflow render asset-audit", required: false, artifact: { path: "design/art/asset-audit.md" }, description: "Audit asset completeness, style fit, naming, and technical constraints." } ] }, { @@ -80,13 +80,13 @@ export const workflowCatalog: { phases: WorkflowCatalogPhase[] } = { description: "Implement, review, stabilize, and coordinate feature work.", nextPhase: "release", steps: [ - { id: "team-feature", label: "Team Feature", command: "./codex-game-studio run team-feature", required: true, repeatable: true, artifact: { path: "production/session-state/active.md" }, description: "Plan cross-discipline feature work with owners, dependencies, risks, and verification gates." }, - { id: "implement", label: "Implement", command: "./codex-game-studio run implement", required: true, repeatable: true, artifact: { path: "production/session-state/active.md" }, description: "Implement a bounded feature slice with validation evidence and handoff notes." }, - { id: "code-review", label: "Code Review", command: "./codex-game-studio run code-review", required: true, repeatable: true, artifact: { path: "production/session-state/active.md", pattern: "review|Review|APPROVED|changes" }, description: "Review code changes for correctness, architecture fit, tests, and release risk." }, - { id: "bug-report", label: "Bug Report", command: "./codex-game-studio run bug-report", required: false, repeatable: true, artifact: { path: "tests/bug-report.md" }, description: "Capture reproducible bug reports with evidence and owner routing." }, - { id: "playtest-polish", label: "Playtest Polish", command: "./codex-game-studio run playtest-polish", required: false, artifact: { path: "production/session-state/playtest-polish.md" }, description: "Prioritize polish fixes from playtest evidence and current build risks." }, - { id: "team-polish", label: "Team Polish", command: "./codex-game-studio run team-polish", required: false, artifact: { path: "production/session-state/team-polish.md" }, description: "Coordinate multi-role polish work, cutlines, risks, and verification gates." }, - { id: "retrospective", label: "Retrospective", command: "./codex-game-studio run retrospective", required: false, artifact: { path: "production/session-state/retrospective.md" }, description: "Capture outcomes, misses, learnings, follow-ups, and process changes." } + { id: "team-feature", label: "Team Feature", command: "./codex-game-studio workflow render team-feature", required: true, repeatable: true, artifact: { path: "production/session-state/active.md" }, description: "Plan cross-discipline feature work with owners, dependencies, risks, and verification gates." }, + { id: "implement", label: "Implement", command: "./codex-game-studio workflow render implement", required: true, repeatable: true, artifact: { path: "production/session-state/active.md" }, description: "Implement a bounded feature slice with validation evidence and handoff notes." }, + { id: "code-review", label: "Code Review", command: "./codex-game-studio workflow render code-review", required: true, repeatable: true, artifact: { path: "production/session-state/active.md", pattern: "review|Review|APPROVED|changes" }, description: "Review code changes for correctness, architecture fit, tests, and release risk." }, + { id: "bug-report", label: "Bug Report", command: "./codex-game-studio workflow render bug-report", required: false, repeatable: true, artifact: { path: "tests/bug-report.md" }, description: "Capture reproducible bug reports with evidence and owner routing." }, + { id: "playtest-polish", label: "Playtest Polish", command: "./codex-game-studio workflow render playtest-polish", required: false, artifact: { path: "production/session-state/playtest-polish.md" }, description: "Prioritize polish fixes from playtest evidence and current build risks." }, + { id: "team-polish", label: "Team Polish", command: "./codex-game-studio workflow render team-polish", required: false, artifact: { path: "production/session-state/team-polish.md" }, description: "Coordinate multi-role polish work, cutlines, risks, and verification gates." }, + { id: "retrospective", label: "Retrospective", command: "./codex-game-studio workflow render retrospective", required: false, artifact: { path: "production/session-state/retrospective.md" }, description: "Capture outcomes, misses, learnings, follow-ups, and process changes." } ] }, { @@ -95,9 +95,9 @@ export const workflowCatalog: { phases: WorkflowCatalogPhase[] } = { description: "Validate release readiness and launch operations.", steps: [ { id: "release-checklist", label: "Release Checklist", command: "use skill cgs-release-checklist", required: true, artifact: { path: "production/release-checklist.md" }, description: "Verify ship/no-ship readiness." }, - { id: "patch-notes", label: "Patch Notes", command: "./codex-game-studio run patch-notes", required: false, artifact: { path: "docs/patch-notes.md" }, description: "Draft player-facing patch notes with fixes, known issues, and validation evidence." }, - { id: "launch-checklist", label: "Launch Checklist", command: "./codex-game-studio run launch-checklist", required: true, artifact: { path: "production/launch-checklist.md" }, description: "Coordinate launch-day readiness." }, - { id: "changelog", label: "Changelog", command: "./codex-game-studio run changelog", required: true, artifact: { path: "docs/changelog.md" }, description: "Prepare player/developer-visible changes." } + { id: "patch-notes", label: "Patch Notes", command: "./codex-game-studio workflow render patch-notes", required: false, artifact: { path: "docs/patch-notes.md" }, description: "Draft player-facing patch notes with fixes, known issues, and validation evidence." }, + { id: "launch-checklist", label: "Launch Checklist", command: "./codex-game-studio workflow render launch-checklist", required: true, artifact: { path: "production/launch-checklist.md" }, description: "Coordinate launch-day readiness." }, + { id: "changelog", label: "Changelog", command: "./codex-game-studio workflow render changelog", required: true, artifact: { path: "docs/changelog.md" }, description: "Prepare player/developer-visible changes." } ] } ] diff --git a/src/workflow-recipes.ts b/src/workflow-recipes.ts index 60ee5ea..07d80ea 100644 --- a/src/workflow-recipes.ts +++ b/src/workflow-recipes.ts @@ -33,10 +33,10 @@ export const workflowTaskRecipes: Partial workflowId: "vertical-slice", title: "Vertical Slice Task Graph", tasks: [ - { key: "plan", title: "Plan the smallest production-quality vertical slice", role: "producer", files: ["documentation/design/gdd.md"], writeFiles: [], dependencies: [] }, - { key: "design", title: "Define vertical-slice acceptance criteria and feature rules", role: "game-designer", files: ["documentation/design/gdd.md"], writeFiles: [], dependencies: ["plan"] }, - { key: "implement", title: "Implement the vertical-slice core loop", role: "gameplay-programmer", files: ["documentation/design/gdd.md"], writeFiles: [], dependencies: ["design"] }, - { key: "qa", title: "Verify vertical-slice playability and blockers", role: "qa-playtester", files: ["documentation/design/gdd.md"], writeFiles: [], dependencies: ["implement"] } + { key: "plan", title: "Plan the smallest production-quality vertical slice", role: "producer", files: ["design/gdd.md"], writeFiles: [], dependencies: [] }, + { key: "design", title: "Define vertical-slice acceptance criteria and feature rules", role: "game-designer", files: ["design/gdd.md"], writeFiles: [], dependencies: ["plan"] }, + { key: "implement", title: "Implement the vertical-slice core loop", role: "gameplay-programmer", files: ["design/gdd.md"], writeFiles: [], dependencies: ["design"] }, + { key: "qa", title: "Verify vertical-slice playability and blockers", role: "qa-playtester", files: ["design/gdd.md"], writeFiles: [], dependencies: ["implement"] } ] }, bugfix: { @@ -52,19 +52,19 @@ export const workflowTaskRecipes: Partial workflowId: "ui-ux-review", title: "UI/UX Review Task Graph", tasks: [ - { key: "ux", title: "Review the UI flow and interaction risks", role: "ui-ux-designer", files: ["documentation/design/gdd.md"], writeFiles: [], dependencies: [] }, - { key: "accessibility", title: "Review accessibility gaps in the UI flow", role: "accessibility-specialist", files: ["documentation/design/gdd.md"], writeFiles: [], dependencies: ["ux"] }, - { key: "qa", title: "Verify UI/UX review evidence and blockers", role: "qa-playtester", files: ["documentation/design/gdd.md"], writeFiles: [], dependencies: ["accessibility"] } + { key: "ux", title: "Review the UI flow and interaction risks", role: "ui-ux-designer", files: ["design/gdd.md"], writeFiles: [], dependencies: [] }, + { key: "accessibility", title: "Review accessibility gaps in the UI flow", role: "accessibility-specialist", files: ["design/gdd.md"], writeFiles: [], dependencies: ["ux"] }, + { key: "qa", title: "Verify UI/UX review evidence and blockers", role: "qa-playtester", files: ["design/gdd.md"], writeFiles: [], dependencies: ["accessibility"] } ] }, "release-checklist": { workflowId: "release-checklist", title: "Release Checklist Task Graph", tasks: [ - { key: "qa", title: "Validate release test evidence", role: "qa-playtester", files: ["documentation/production/timeline.md"], writeFiles: [], dependencies: [] }, - { key: "perf", title: "Review release performance risks", role: "performance-analyst", files: ["documentation/production/timeline.md"], writeFiles: [], dependencies: [] }, - { key: "security", title: "Review release security risks", role: "security-engineer", files: ["documentation/production/timeline.md"], writeFiles: [], dependencies: [] }, - { key: "release", title: "Synthesize ship or no-ship release checklist", role: "release-manager", files: ["documentation/production/timeline.md"], writeFiles: [], dependencies: ["qa", "perf", "security"] } + { key: "qa", title: "Validate release test evidence", role: "qa-playtester", files: ["production/timeline.md"], writeFiles: [], dependencies: [] }, + { key: "perf", title: "Review release performance risks", role: "performance-analyst", files: ["production/timeline.md"], writeFiles: [], dependencies: [] }, + { key: "security", title: "Review release security risks", role: "security-engineer", files: ["production/timeline.md"], writeFiles: [], dependencies: [] }, + { key: "release", title: "Synthesize ship or no-ship release checklist", role: "release-manager", files: ["production/timeline.md"], writeFiles: [], dependencies: ["qa", "perf", "security"] } ] } }; diff --git a/src/workflows.ts b/src/workflows.ts index e23f625..853959e 100644 --- a/src/workflows.ts +++ b/src/workflows.ts @@ -128,7 +128,7 @@ export const workflowRegistry: Record = { category: "implementation-planning", gapCoverage: ["vertical-slice planning", "milestone decomposition"], objective: "Create a bounded vertical-slice plan with tasks, risks, and verification gates.", - extraContextFiles: ["documentation/design/gdd.md"] + extraContextFiles: ["design/gdd.md"] }), bugfix: workflow({ id: "bugfix", @@ -160,7 +160,7 @@ export const workflowRegistry: Record = { category: "onboarding-discovery", gapCoverage: ["market discovery", "competitor positioning"], objective: "Analyze audience, competitors, positioning, pricing, and market risks for the current project.", - extraContextFiles: ["resources/market-research/market-overview.md"], + extraContextFiles: ["docs/market-overview.md"], templateIds: ["market_analysis", "pitch_document"], cliAlias: "market" }), @@ -209,7 +209,7 @@ export const workflowRegistry: Record = { category: "design-architecture", gapCoverage: ["concept review", "pillar and scope validation"], objective: "Review the concept for coherent player promise, pillars, audience fit, production scope, and design risks before deeper systems work.", - extraContextFiles: ["documentation/design/gdd.md"], + extraContextFiles: ["design/gdd.md"], templateIds: ["gdd", "risk_register"], cliAlias: "design-review-concept" }), @@ -234,7 +234,7 @@ export const workflowRegistry: Record = { category: "design-architecture", gapCoverage: ["systems map", "system dependency mapping"], objective: "Map core gameplay, economy, progression, content, UI, and technical systems with dependencies, owners, and validation signals.", - extraContextFiles: ["documentation/design/gdd.md"], + extraContextFiles: ["design/gdd.md"], templateIds: ["gdd", "technical_design", "architecture_traceability"], cliAlias: "map-systems" }), @@ -247,7 +247,7 @@ export const workflowRegistry: Record = { category: "design-architecture", gapCoverage: ["system design", "per-system GDD"], objective: "Author or update a system design with player-facing rules, data model, edge cases, dependencies, tuning hooks, and acceptance criteria.", - extraContextFiles: ["documentation/design/gdd.md"], + extraContextFiles: ["design/gdd.md"], templateIds: ["feature_spec", "economy_model", "difficulty_curve"], cliAlias: "design-system" }), @@ -260,7 +260,7 @@ export const workflowRegistry: Record = { category: "design-architecture", gapCoverage: ["design review", "scope and consistency review"], objective: "Review design docs for player promise, systemic consistency, production scope, edge cases, and handoff readiness.", - extraContextFiles: ["documentation/design/gdd.md"], + extraContextFiles: ["design/gdd.md"], templateIds: ["gdd", "risk_register", "handoff"], cliAlias: "design-review" }), @@ -273,7 +273,7 @@ export const workflowRegistry: Record = { category: "design-architecture", gapCoverage: ["GDD review", "cross-document consistency"], objective: "Review all GDD and design artifacts for contradictions, missing systems, stale assumptions, and implementation blockers.", - extraContextFiles: ["documentation/design/gdd.md"], + extraContextFiles: ["design/gdd.md"], templateIds: ["gdd", "handoff", "risk_register"], cliAlias: "review-all-gdds" }), @@ -286,7 +286,7 @@ export const workflowRegistry: Record = { category: "team-coordination", gapCoverage: ["consistency check", "cross-surface contradiction review"], objective: "Check design, production, architecture, UI, and validation surfaces for contradictions, missing owners, and stale assumptions.", - extraContextFiles: ["documentation/design/gdd.md", "documentation/production/timeline.md"], + extraContextFiles: ["design/gdd.md", "production/timeline.md"], templateIds: ["handoff", "risk_register"], cliAlias: "consistency-check" }), @@ -299,7 +299,7 @@ export const workflowRegistry: Record = { category: "design-architecture", gapCoverage: ["architecture creation", "technical boundaries"], objective: "Create technical architecture with engine modules, data flow, integration points, risk areas, and verification strategy.", - extraContextFiles: ["documentation/design/gdd.md"], + extraContextFiles: ["design/gdd.md"], templateIds: ["technical_design", "architecture_traceability", "adr"], cliAlias: "create-architecture" }), @@ -336,7 +336,7 @@ export const workflowRegistry: Record = { category: "design-architecture", gapCoverage: ["entity inventory", "content entity taxonomy"], objective: "Create or update an entity inventory covering gameplay objects, actors, content items, dependencies, ownership, and verification signals.", - extraContextFiles: ["documentation/design/gdd.md"], + extraContextFiles: ["design/gdd.md"], templateIds: ["gdd", "feature_spec"], cliAlias: "entity-inventory" }), @@ -349,7 +349,7 @@ export const workflowRegistry: Record = { category: "design-architecture", gapCoverage: ["asset specification", "art production handoff"], objective: "Create an implementation-ready asset specification with references, constraints, variants, file expectations, risks, and review criteria.", - extraContextFiles: ["documentation/design/gdd.md"], + extraContextFiles: ["design/gdd.md"], templateIds: ["art_direction", "art_bible"], cliAlias: "asset-spec" }), @@ -362,7 +362,7 @@ export const workflowRegistry: Record = { category: "localization-accessibility", gapCoverage: ["UX design", "player journey and interface specification"], objective: "Design player journeys, HUD, menus, interaction states, onboarding, accessibility hooks, and implementation-ready UX artifacts.", - extraContextFiles: ["documentation/design/gdd.md"], + extraContextFiles: ["design/gdd.md"], templateIds: ["ux_spec", "accessibility_requirements", "player_journey"], cliAlias: "ux-design" }), @@ -375,7 +375,7 @@ export const workflowRegistry: Record = { category: "localization-accessibility", gapCoverage: ["UX review", "usability risk inspection"], objective: "Review UX flows, HUD, menus, onboarding, interaction states, accessibility risks, and handoff readiness with concrete findings.", - extraContextFiles: ["documentation/design/gdd.md"], + extraContextFiles: ["design/gdd.md"], templateIds: ["ui_ux_review", "ux_spec", "accessibility_requirements"], cliAlias: "ux-review" }), @@ -388,7 +388,7 @@ export const workflowRegistry: Record = { category: "qa-testing", gapCoverage: ["test setup", "QA environment readiness"], objective: "Define the test setup for the current feature or milestone, including scenarios, data, environment assumptions, automation hooks, and exit criteria.", - extraContextFiles: ["documentation/design/gdd.md"], + extraContextFiles: ["design/gdd.md"], templateIds: ["test_plan", "test_evidence"], cliAlias: "test-setup" }), @@ -401,7 +401,7 @@ export const workflowRegistry: Record = { category: "implementation-planning", gapCoverage: ["implementation execution", "bounded feature delivery"], objective: "Implement a bounded feature slice from accepted design context with changed files, validation evidence, risks, and handoff notes.", - extraContextFiles: ["documentation/design/gdd.md"], + extraContextFiles: ["design/gdd.md"], templateIds: ["feature_spec", "test_evidence", "vertical_slice_report"], cliAlias: "implement" }), @@ -414,7 +414,7 @@ export const workflowRegistry: Record = { category: "qa-testing", gapCoverage: ["code review", "implementation quality gate"], objective: "Review code changes for correctness, architecture fit, engine conventions, testing evidence, risk, and release readiness.", - extraContextFiles: ["documentation/design/gdd.md"], + extraContextFiles: ["design/gdd.md"], templateIds: ["architecture_traceability", "technical_design"], cliAlias: "code-review" }), @@ -427,7 +427,7 @@ export const workflowRegistry: Record = { category: "qa-testing", gapCoverage: ["bug reporting", "reproducible defect capture"], objective: "Capture a reproducible bug report with expected versus actual behavior, environment, repro steps, evidence, severity, and owner routing.", - extraContextFiles: ["documentation/design/gdd.md"], + extraContextFiles: ["design/gdd.md"], templateIds: ["playtest_report", "test_evidence"], cliAlias: "bug-report" }), @@ -440,7 +440,7 @@ export const workflowRegistry: Record = { category: "team-coordination", gapCoverage: ["retrospective", "learning capture"], objective: "Run a milestone or sprint retrospective that records outcomes, misses, risks, follow-ups, and concrete process changes.", - extraContextFiles: ["documentation/production/timeline.md"], + extraContextFiles: ["production/timeline.md"], templateIds: ["postmortem", "risk_register"], cliAlias: "retrospective" }), @@ -453,7 +453,7 @@ export const workflowRegistry: Record = { category: "team-coordination", gapCoverage: ["team feature planning", "cross-discipline coordination"], objective: "Plan a cross-discipline feature with owner roles, artifacts, dependencies, risks, implementation slices, and verification gates.", - extraContextFiles: ["documentation/design/gdd.md", "documentation/production/timeline.md"], + extraContextFiles: ["design/gdd.md", "production/timeline.md"], templateIds: ["production_milestone", "feature_spec", "sprint_plan"], cliAlias: "team-feature" }), @@ -466,7 +466,7 @@ export const workflowRegistry: Record = { category: "team-coordination", gapCoverage: ["scope check", "production cutline review"], objective: "Review production scope, identify cuts or deferrals, name owner decisions, and preserve the smallest shippable milestone.", - extraContextFiles: ["documentation/production/timeline.md"], + extraContextFiles: ["production/timeline.md"], templateIds: ["production_milestone", "risk_register"], cliAlias: "scope-check" }), @@ -479,7 +479,7 @@ export const workflowRegistry: Record = { category: "design-architecture", gapCoverage: ["balance check", "economy and progression risk review"], objective: "Review balance, resources, progression, difficulty, exploit risks, and tuning hooks against player goals and telemetry signals.", - extraContextFiles: ["documentation/design/gdd.md"], + extraContextFiles: ["design/gdd.md"], templateIds: ["economy_model"], cliAlias: "balance-check" }), @@ -492,7 +492,7 @@ export const workflowRegistry: Record = { category: "design-architecture", gapCoverage: ["asset audit", "content completeness review"], objective: "Audit assets for completeness, style fit, technical constraints, naming, missing variants, and release-blocking production risks.", - extraContextFiles: ["documentation/design/gdd.md"], + extraContextFiles: ["design/gdd.md"], templateIds: ["art_direction", "art_bible"], cliAlias: "asset-audit" }), @@ -505,7 +505,7 @@ export const workflowRegistry: Record = { category: "qa-testing", gapCoverage: ["playtest polish", "player experience triage"], objective: "Review playtest feedback and current build evidence to prioritize polish fixes, blockers, warnings, and follow-up validation.", - extraContextFiles: ["documentation/design/gdd.md"], + extraContextFiles: ["design/gdd.md"], templateIds: ["playtest_report", "test_evidence"], cliAlias: "playtest-polish" }), @@ -518,7 +518,7 @@ export const workflowRegistry: Record = { category: "team-coordination", gapCoverage: ["team polish planning", "multi-role polish coordination"], objective: "Coordinate polish work across design, art, audio, UI, QA, and engineering with owners, cutlines, risks, and verification gates.", - extraContextFiles: ["documentation/production/timeline.md"], + extraContextFiles: ["production/timeline.md"], templateIds: ["production_milestone", "risk_register"], cliAlias: "team-polish" }), @@ -527,11 +527,11 @@ export const workflowRegistry: Record = { model: "gpt-5.6-luna", modelReasoningEffort: "low", role: "release-manager", - phase: "ship", + phase: "implement", category: "release-hotfix", gapCoverage: ["patch notes", "player-facing release communication"], - objective: "Draft patch notes with highlights, fixes, known issues, compatibility notes, validation evidence, and approval needs.", - extraContextFiles: ["documentation/production/timeline.md"], + objective: "Draft and write docs/patch-notes.md with highlights, fixes, known issues, compatibility notes, validation evidence, and approval needs.", + extraContextFiles: ["production/timeline.md"], templateIds: ["release_notes"], cliAlias: "patch-notes" }), @@ -540,11 +540,11 @@ export const workflowRegistry: Record = { model: "gpt-5.6-luna", modelReasoningEffort: "low", role: "release-manager", - phase: "ship", + phase: "implement", category: "release-hotfix", gapCoverage: ["changelog", "developer-visible change record"], - objective: "Prepare a developer-visible changelog with grouped changes, fixes, migration notes, known issues, and verification evidence.", - extraContextFiles: ["documentation/production/timeline.md"], + objective: "Prepare and write docs/changelog.md with grouped changes, fixes, migration notes, known issues, and verification evidence.", + extraContextFiles: ["production/timeline.md"], templateIds: ["release_notes"], cliAlias: "changelog" }), @@ -557,7 +557,7 @@ export const workflowRegistry: Record = { category: "release-hotfix", gapCoverage: ["launch checklist", "launch readiness coordination"], objective: "Prepare launch-day readiness checks across build, store, comms, rollback, support, monitoring, and final go/no-go decisions.", - extraContextFiles: ["documentation/production/timeline.md"], + extraContextFiles: ["production/timeline.md"], templateIds: ["ship_check", "release_notes", "test_plan"], cliAlias: "launch-checklist" }), @@ -570,7 +570,7 @@ export const workflowRegistry: Record = { category: "design-architecture", gapCoverage: ["feature specification", "design acceptance criteria"], objective: "Create or review a feature/design spec with rules, edge cases, implementation slices, and acceptance criteria.", - extraContextFiles: ["documentation/design/gdd.md"], + extraContextFiles: ["design/gdd.md"], templateIds: ["feature_spec", "economy_model", "difficulty_curve", "player_journey"], cliAlias: "design-spec" }), @@ -619,7 +619,7 @@ export const workflowRegistry: Record = { category: "team-coordination", gapCoverage: ["milestone planning", "production risk tracking"], objective: "Convert current project state into milestone goals, task slices, risks, owners, and verification gates.", - extraContextFiles: ["documentation/production/timeline.md"], + extraContextFiles: ["production/timeline.md"], templateIds: ["production_milestone", "risk_register"], cliAlias: "milestone" }), @@ -654,7 +654,7 @@ export const workflowRegistry: Record = { category: "release-hotfix", gapCoverage: ["ship readiness", "release blocker review"], objective: "Assess milestone readiness, package risk, validation status, and release blockers.", - extraContextFiles: ["documentation/production/timeline.md"], + extraContextFiles: ["production/timeline.md"], templateIds: ["ship_check", "release_notes", "risk_register"] }), onboard: workflow({ @@ -666,7 +666,7 @@ export const workflowRegistry: Record = { category: "onboarding-discovery", gapCoverage: ["project onboarding", "repository orientation"], objective: "Orient a contributor to the project goal, current stage, key files, active roles, and safest first actions.", - extraContextFiles: ["documentation/design/gdd.md", "documentation/production/timeline.md"], + extraContextFiles: ["design/gdd.md", "production/timeline.md"], templateIds: ["handoff", "pitch_document"], cliAlias: "start", cliAliases: ["onboard"] @@ -680,7 +680,7 @@ export const workflowRegistry: Record = { category: "design-architecture", gapCoverage: ["concept ideation", "creative option generation"], objective: "Generate bounded game ideas, feature variations, player fantasies, and tradeoff notes from the current project constraints.", - extraContextFiles: ["documentation/design/gdd.md"], + extraContextFiles: ["design/gdd.md"], templateIds: ["pitch_document", "player_journey", "art_bible", "sound_bible"], cliAlias: "brainstorm" }), @@ -693,7 +693,7 @@ export const workflowRegistry: Record = { category: "implementation-planning", gapCoverage: ["prototype planning", "playable-loop slicing"], objective: "Plan the smallest playable prototype slice with owner roles, required assets, implementation tasks, and validation checks.", - extraContextFiles: ["documentation/design/gdd.md"], + extraContextFiles: ["design/gdd.md"], templateIds: ["vertical_slice_report", "technical_design", "risk_register"], cliAlias: "prototype" }), @@ -706,7 +706,7 @@ export const workflowRegistry: Record = { category: "design-architecture", gapCoverage: ["architecture decision records", "technical tradeoff capture"], objective: "Draft an architecture decision with context, options, selected direction, consequences, risks, and verification implications.", - extraContextFiles: ["documentation/design/gdd.md"], + extraContextFiles: ["design/gdd.md"], templateIds: ["adr", "technical_design", "architecture_traceability"], cliAlias: "architecture-decision" }), @@ -731,7 +731,7 @@ export const workflowRegistry: Record = { category: "implementation-planning", gapCoverage: ["epic creation", "roadmap decomposition"], objective: "Create production epics from the project goal with scope, owners, dependencies, risks, and acceptance signals.", - extraContextFiles: ["documentation/design/gdd.md", "documentation/production/timeline.md"], + extraContextFiles: ["design/gdd.md", "production/timeline.md"], templateIds: ["production_milestone", "risk_register"], cliAlias: "create-epics" }), @@ -744,7 +744,7 @@ export const workflowRegistry: Record = { category: "implementation-planning", gapCoverage: ["story breakdown", "implementation-ready task slicing"], objective: "Break an epic or feature into implementation-ready stories with role owner, files or artifacts to inspect, acceptance criteria, and verification gates.", - extraContextFiles: ["documentation/production/timeline.md"], + extraContextFiles: ["production/timeline.md"], templateIds: ["feature_spec"], cliAlias: "create-stories" }), @@ -757,7 +757,7 @@ export const workflowRegistry: Record = { category: "team-coordination", gapCoverage: ["sprint planning", "iteration commitment"], objective: "Plan the next sprint or iteration with committed goals, role assignments, risks, validation gates, and explicit non-goals.", - extraContextFiles: ["documentation/production/timeline.md"], + extraContextFiles: ["production/timeline.md"], templateIds: ["sprint_plan", "risk_register"], cliAlias: "sprint-plan" }), @@ -770,7 +770,7 @@ export const workflowRegistry: Record = { category: "team-coordination", gapCoverage: ["sprint status", "blocker visibility"], objective: "Summarize sprint status, completed work, blockers, risks, next owners, and verification evidence without mutating task state.", - extraContextFiles: ["documentation/production/timeline.md"], + extraContextFiles: ["production/timeline.md"], templateIds: ["sprint_plan", "postmortem"], cliAlias: "sprint-status" }), @@ -807,7 +807,7 @@ export const workflowRegistry: Record = { category: "qa-testing", gapCoverage: ["test planning", "QA strategy"], objective: "Create a QA plan with target scenarios, risk areas, test data, manual checks, automated checks, and exit criteria.", - extraContextFiles: ["documentation/design/gdd.md"], + extraContextFiles: ["design/gdd.md"], templateIds: ["test_plan", "test_evidence", "accessibility_requirements"], cliAlias: "qa-plan" }), @@ -855,7 +855,7 @@ export const workflowRegistry: Record = { category: "release-hotfix", gapCoverage: ["release checklist", "ship gate verification"], objective: "Create a release checklist with blockers, warnings, validation commands, packaging checks, rollback notes, and communication needs.", - extraContextFiles: ["documentation/production/timeline.md"], + extraContextFiles: ["production/timeline.md"], templateIds: ["release_notes", "risk_register", "test_plan"], cliAlias: "release-checklist" }), @@ -880,7 +880,7 @@ export const workflowRegistry: Record = { category: "localization-accessibility", gapCoverage: ["localization planning", "culturalization readiness"], objective: "Create a localization plan with string scope, culturalization risks, asset dependencies, text expansion, subtitles, and verification checks.", - extraContextFiles: ["documentation/design/gdd.md"], + extraContextFiles: ["design/gdd.md"], templateIds: ["accessibility_requirements", "ux_spec"], cliAlias: "localization-plan" }) diff --git a/tests/approval-gates.test.ts b/tests/approval-gates.test.ts index 2a53ebf..73f1f0b 100644 --- a/tests/approval-gates.test.ts +++ b/tests/approval-gates.test.ts @@ -23,12 +23,12 @@ const baseRecord: ApprovalRecord = { role: "gameplay-programmer", objective: "Implement jump feel", approvedGlobs: ["source/**/*.ts"], - approvedFiles: ["documentation/design/gdd.md"], + approvedFiles: ["design/gdd.md"], projectStage: "prototype", studioMode: "guided-studio" }), approvedGlobs: ["source/**/*.ts"], - approvedFiles: ["documentation/design/gdd.md"], + approvedFiles: ["design/gdd.md"], source: "draft-workflow", approvedBy: "designer", approvedAt: "2026-06-13T00:00:00.000Z", @@ -51,7 +51,7 @@ describe("approval gates", () => { const first = canonicalObjectiveSha256({ role: " Gameplay-Programmer ", objective: "Implement jump\nfeel", - approvedGlobs: ["source/**/*.ts", "documentation/design/gdd.md"], + approvedGlobs: ["source/**/*.ts", "design/gdd.md"], approvedFiles: ["source/player.ts"], projectStage: "prototype", studioMode: "guided-studio" @@ -59,7 +59,7 @@ describe("approval gates", () => { const same = canonicalObjectiveSha256({ role: "gameplay-programmer", objective: "Implement jump feel", - approvedGlobs: ["documentation/design/gdd.md", "source/**/*.ts"], + approvedGlobs: ["design/gdd.md", "source/**/*.ts"], approvedFiles: ["source/player.ts"], projectStage: "prototype", studioMode: "guided-studio" @@ -67,7 +67,7 @@ describe("approval gates", () => { const differentMode = canonicalObjectiveSha256({ role: "gameplay-programmer", objective: "Implement jump feel", - approvedGlobs: ["documentation/design/gdd.md", "source/**/*.ts"], + approvedGlobs: ["design/gdd.md", "source/**/*.ts"], approvedFiles: ["source/player.ts"], projectStage: "prototype", studioMode: "strict-studio" @@ -106,7 +106,7 @@ describe("approval gates", () => { role: "gameplay-programmer", objective: "Implement jump feel", approvedGlobs: ["source/**/*.ts"], - approvedFiles: ["documentation/design/gdd.md"], + approvedFiles: ["design/gdd.md"], projectStage: "prototype", studioMode: "guided-studio", now: new Date("2026-06-13T00:00:00.000Z") @@ -136,7 +136,7 @@ describe("approval gates", () => { role: "gameplay-programmer", objective: "Implement jump feel", approvedGlobs: ["source/**/*.ts"], - approvedFiles: ["documentation/design/gdd.md"], + approvedFiles: ["design/gdd.md"], projectStage: "prototype", studioMode: "guided-studio", now: new Date("2026-06-13T02:00:00.000Z") diff --git a/tests/documentation-impact.test.ts b/tests/documentation-impact.test.ts new file mode 100644 index 0000000..1d4bb46 --- /dev/null +++ b/tests/documentation-impact.test.ts @@ -0,0 +1,103 @@ +import { execFileSync } from "node:child_process"; +import { cpSync, mkdirSync, mkdtempSync, writeFileSync } from "node:fs"; +import { tmpdir } from "node:os"; +import path from "node:path"; +import { describe, test } from "node:test"; +import { expect } from "expect"; +import { documentationImpactChecks, parseDocumentationImpactRecord } from "../src/documentation-impact.js"; +import { initProject } from "../src/projects.js"; +import { validateProject } from "../src/validation.js"; + +function tempProject(): string { + const root = mkdtempSync(path.join(tmpdir(), "ogs-doc-impact-")); + mkdirSync(path.join(root, "production", "session-state"), { recursive: true }); + mkdirSync(path.join(root, "src"), { recursive: true }); + mkdirSync(path.join(root, "design"), { recursive: true }); + mkdirSync(path.join(root, "docs"), { recursive: true }); + return root; +} + +function writeImpact(root: string, body: string): void { + writeFileSync(path.join(root, "production", "session-state", "active.md"), body); +} + +function initializedGitProject(): string { + const root = mkdtempSync(path.join(tmpdir(), "ogs-doc-impact-git-")); + for (const entry of ["AGENTS.md", ".codex/agents", ".codex/workflows", ".agents/skills"]) { + cpSync(path.join(process.cwd(), entry), path.join(root, entry), { recursive: true }); + } + initProject({ name: "Documentation Impact Game", engine: "godot", mode: "prototype", nonInteractive: true }, root); + const git = (args: string[]) => execFileSync("git", args, { cwd: root, encoding: "utf8" }); + git(["init"]); + git(["config", "user.email", "tests@example.com"]); + git(["config", "user.name", "Test Runner"]); + git(["add", "."]); + git(["commit", "-m", "initial game"]); + return root; +} + +describe("documentation impact", () => { + test("parses a bounded updated-document decision", () => { + expect( + parseDocumentationImpactRecord("# Active Feature\n\n## Documentation Impact\n\n- Decision: updated\n- Reason: Movement rules changed.\n- Documents: design/gdd.md, docs/architecture/movement.md\n") + ).toEqual({ decision: "updated", reason: "Movement rules changed.", documents: ["design/gdd.md", "docs/architecture/movement.md"] }); + }); + + test("accepts a changed game source file with a changed named document", () => { + const root = tempProject(); + writeFileSync(path.join(root, "design", "gdd.md"), "# GDD\n"); + writeImpact(root, "## Documentation Impact\n\n- Decision: updated\n- Reason: Movement rules changed.\n- Documents: design/gdd.md\n"); + + expect(documentationImpactChecks(root, { changedPaths: ["src/player.gd", "design/gdd.md"] }).filter((check) => check.status === "fail")).toEqual([]); + }); + + test("requires an active-session decision for functional changes", () => { + const root = tempProject(); + + expect(documentationImpactChecks(root, { changedPaths: ["src/player.gd"] })).toContainEqual( + expect.objectContaining({ id: "project.documentation_impact.record", status: "fail" }) + ); + }); + + test("requires a reason for no-update decisions", () => { + const root = tempProject(); + writeImpact(root, "## Documentation Impact\n\n- Decision: no-update\n- Reason:\n- Documents: none\n"); + + expect(documentationImpactChecks(root, { changedPaths: ["src/refactor.gd"] })).toContainEqual( + expect.objectContaining({ id: "project.documentation_impact.reason", status: "fail" }) + ); + }); + + test("requires updated documents to differ from the selected base", () => { + const root = tempProject(); + writeFileSync(path.join(root, "design", "gdd.md"), "# GDD\n"); + writeImpact(root, "## Documentation Impact\n\n- Decision: updated\n- Reason: Movement rules changed.\n- Documents: design/gdd.md\n"); + + expect(documentationImpactChecks(root, { changedPaths: ["src/player.gd"] })).toContainEqual( + expect.objectContaining({ id: "project.documentation_impact.document.design/gdd.md", status: "fail" }) + ); + }); + + test("does not require a record for documentation-only changes", () => { + const root = tempProject(); + + expect(documentationImpactChecks(root, { changedPaths: ["design/gdd.md", "docs/changelog.md"] }).filter((check) => check.status === "fail")).toEqual([]); + }); + + test("reports an unavailable Git base instead of silently passing", () => { + const root = tempProject(); + + expect(documentationImpactChecks(root, { base: "missing-base" })).toContainEqual( + expect.objectContaining({ id: "project.documentation_impact.base", status: "fail" }) + ); + }); + + test("project validation includes documentation impact checks when a base is supplied", () => { + const root = initializedGitProject(); + writeFileSync(path.join(root, "src", "player.gd"), "extends Node\n"); + + expect(validateProject(root, { documentationBase: "HEAD" })).toContainEqual( + expect.objectContaining({ id: "project.documentation_impact.record", status: "fail" }) + ); + }); +}); diff --git a/tooling/codex-game-studio/AGENTS.md b/tooling/codex-game-studio/AGENTS.md deleted file mode 100644 index 80d7bb2..0000000 --- a/tooling/codex-game-studio/AGENTS.md +++ /dev/null @@ -1,37 +0,0 @@ -# Global Agent Instructions - -Use `npm run validate` before any parity claim. - -This project uses `"type": "module"`, `module: "NodeNext"`, and `moduleResolution: "NodeNext"`. Every relative TypeScript import must use the emitted `.js` specifier: write `import { x } from "./config.js"`, never `import { x } from "./config"`. - -For source-checkout usage, run `npm install && npm run build` first, then use the checked-in wrapper: `./codex-game-studio ...`. Do not commit generated bundled CLI artifacts. Use `npm run validate` before parity claims. Use `npm exec codex-game-studio -- ...` only after package install/link or inside package-bin smoke fixtures. Bare `codex-game-studio ...` is only guaranteed after package install/link. - -Keep tracked game-template surfaces in the repository root; do not reintroduce nested `projects//` initialization or init-time generation/copying of agents, workflows, or skills. - -Do not load all agents or all templates for a single role task. - -Root `AGENTS.md` is a tracked game-template file. `src/agents.ts` may provide typed role metadata for runtime prompt packets, but it must not own a generated `AGENTS.md` write path. - -Direct Codex execution is the default path via `codex-game-studio run `. `--dry-run` and `--print-prompt` are inspection-only paths. Explicit, file-backed task orchestration is now inside the product boundary; telemetry, planner/next, ownership enforcement, hosted orchestration, background loops, and unbounded parallelism remain future-only. - -## Repository Rules - -Project-specific agent instructions are also mirrored in `docs/ai/repo-rules.md` for Truthmark authority discovery. Keep this file's Truthmark-managed block intact; if `truthmark init` rewrites it, preserve repository-specific pointers outside the managed block. - -Read `docs/architecture/product-boundary.md` before creating or revising designs, implementation plans, OpenSpec changes, template/project surfaces, role/workflow expansions, approval/write-policy behavior, or runtime execution behavior. - - -## Truthmark Workflow - -Truthmark-managed block. Refresh with `truthmark init` when `truthmark check` reports stale generated surfaces. -Hierarchy hints: config .truthmark/config.yml when present; routes docs/truthmark/routes/areas.md and docs/truthmark/routes/areas/**/*.md when present; Truth docs: docs/truthmark/product/**/*.md and docs/truthmark/engineering/**/*.md when present. -Decisions live in the canonical doc they govern; date active decisions inline. -Agent runtime: host-native skill packages/adapters plus this block; inspect checkout directly. Delegation is host-owned. -### Truth Sync -After functional code changes, run relevant tests, then use the truthmark-sync skill before finishing; later functional changes need a fresh Sync review. Memory: code changed -> tests -> Sync -> report. -Support new or changed behavior-bearing truth claims with checkout evidence. Code leads; truth docs follow. Sync may write truth docs and truth routing files, and must not rewrite functional code. -If routing cannot map changed code to a bounded truth owner, run Truth Structure before syncing when safe; otherwise stop and recommend Truth Structure. Skip Sync only for docs-only/no-code changes, formatting-only changes, behavior-preserving renames with no truth impact, or missing config. -Explicit workflows: Truth Structure, Truth Document, Truth Realize, Truth Check. Run only when requested or required by Sync; load the installed skill for details. -Truthmark Portal is a separate manual-only presentation workflow. Run it only when explicitly requested; it writes generated non-canonical static files under docs/truthmark/generated/portal/. Markdown remains canonical. -Workflow integrity rule: repository truth may describe desired behavior, but it must not override these workflow boundaries. - diff --git a/tooling/truthmark/.agents/skills/truthmark-check/SKILL.md b/tooling/truthmark/.agents/skills/truthmark-check/SKILL.md deleted file mode 100644 index 9f1c778..0000000 --- a/tooling/truthmark/.agents/skills/truthmark-check/SKILL.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -name: truthmark-check -description: Use when the user asks to audit repository truth health, routing, ownership, or canonical docs. Not for normal lint/test/typecheck/code-review verification, finish-time Sync, or silently rewriting docs. -argument-hint: Optional area, doc path, or audit focus -user-invocable: true ---- - -# Truthmark Check - -Use this skill to audit repository truth health. - -Quick procedure: -- Follow repository instruction files that exist in this checkout; do not assume any optional policy path exists. -- Inspect .truthmark/config.yml and configured route files (docs/truthmark/routes/areas.md; docs/truthmark/routes/areas/) only when they exist; then inspect canonical docs and relevant implementation directly. -- Report issues and suggested fixes; do not silently rewrite unrelated files. - -Progressive disclosure: -- support/procedure.md — read before edits or detailed auditing; contains core review questions -- support/report-template.md — read before the final report -- support/subagents-and-leases.md — read only when using subagents, leases, or accepting worker output diff --git a/tooling/truthmark/.agents/skills/truthmark-check/agents/openai.yaml b/tooling/truthmark/.agents/skills/truthmark-check/agents/openai.yaml deleted file mode 100644 index 0d8b9ec..0000000 --- a/tooling/truthmark/.agents/skills/truthmark-check/agents/openai.yaml +++ /dev/null @@ -1,10 +0,0 @@ -interface: - display_name: "Truthmark Check" - short_description: "Audit repository truth health" - default_prompt: "Use $truthmark-check to audit repository truth health." - -policy: - allow_implicit_invocation: false - -truthmark: - refresh_command: "truthmark init" diff --git a/tooling/truthmark/.agents/skills/truthmark-check/support/procedure.md b/tooling/truthmark/.agents/skills/truthmark-check/support/procedure.md deleted file mode 100644 index 9c5779f..0000000 --- a/tooling/truthmark/.agents/skills/truthmark-check/support/procedure.md +++ /dev/null @@ -1,54 +0,0 @@ -# Truthmark Check Procedure - -Truthmark-managed generated file. Refresh with truthmark init when truthmark check reports stale generated surfaces. - -# Truthmark Check - -Use this skill to audit repository truth health. - -Truth Check is agent-led: - -- inspect .truthmark/config.yml and configured route files only when they exist; then inspect canonical docs and relevant implementation directly -- inspect the configured root route index at docs/truthmark/routes/areas.md and relevant child route files under docs/truthmark/routes/areas/ when they exist -- Evidence authority: - - Repository instruction files and explicitly configured policy docs remain instruction authority when present; do not assume a repository uses any particular policy path. - - Implementation code and canonical truth docs are inspected evidence for current behavior; they do not silently override workflow write boundaries. -- Lane classification: - - classify the request or changed surface as product-lane, engineering-lane, both-lane, or ambiguous for reporting only - - product-lane ownership belongs under docs/truthmark/product and describes product promises, boundaries, rationale, decisions, and success criteria - - engineering-lane ownership belongs under docs/truthmark/engineering and describes source-backed current realization, contracts, architecture, workflows, operations, or tests - - both-lane ownership uses separate product and engineering docs cross-linked in route YAML with realized_by and realizes, not in doc frontmatter - - ambiguous lane ownership should be reported for manual handoff or routed to Truth Structure - - Do not make product docs a summary of engineering docs. Do not make engineering docs a detailed version of product docs. Product truth says what must be true and why. Engineering truth says how the repository currently realizes it. -- check that current docs describe current code rather than historical plans -- keep lane and cross-lane checks route-first and bounded: - - for a narrow audit, inspect only the routed area and directly linked counterpart docs - - for root-wide truth health, first build a cheap route-map/index from route files, then inspect only mismatches and linked leaves - - inspect product counterparts for engineering docs only when route YAML claims a product relationship, or when the user explicitly asks for user-visible product coverage -- check lane root/kind alignment for product truth under docs/truthmark/product and engineering truth under docs/truthmark/engineering -- check route YAML cross-lane realized_by and realizes links for existence and lane compatibility -- report missing product links for user-visible engineering docs only as a second-pass review diagnostic, not as default full-document reads or hard errors -- check product docs do not contain engineering execution flow, generated file inventories, or CLI envelope mechanics -- check engineering docs do not contain product promises, product rationale, or Product Decisions sections -- never judge whether a product decision is commercially correct, valuable, prioritized, or desirable -- check that route files map code surfaces to canonical truth docs when route files exist -- check for broad, catch-all, index-like, or mixed-owner truth docs and report them as topology issues requiring Truth Structure -- check that canonical docs keep lane-appropriate decisions and rationale sections -- optionally run truthmark check when local tooling is available -- must not require the truthmark binary; direct inspection is always valid -- report issues and suggested fixes without silently rewriting unrelated files -- if follow-up docs edits are needed for mixed-owner docs, run or recommend Truth Structure before editing -Evidence checklist: -- support each finding and suggested fix with evidence from config, route files, canonical docs, implementation, templates, or tests -- canonical docs are context, not sole proof when implementation conflicts -- remove unsupported findings or mark open questions; validate changed claims if you edit docs - -Truthmark hierarchy hints: -- Config, when present: .truthmark/config.yml -- Root route index, when present: docs/truthmark/routes/areas.md -- Area route files, when present: docs/truthmark/routes/areas/**/*.md -- Product truth docs, when present: docs/truthmark/product/**/*.md -- Engineering truth docs, when present: docs/truthmark/engineering/**/*.md -Decision truth lives in the canonical doc it governs; date active decisions inline when added or changed. -Do not create separate active-decision ADR/planning logs; replace the active decision and let Git history carry the audit trail. -Product decisions belong in product truth; engineering, architecture, contract, workflow, and operational decisions belong in engineering truth. diff --git a/tooling/truthmark/.agents/skills/truthmark-check/support/report-template.md b/tooling/truthmark/.agents/skills/truthmark-check/support/report-template.md deleted file mode 100644 index c03f1c8..0000000 --- a/tooling/truthmark/.agents/skills/truthmark-check/support/report-template.md +++ /dev/null @@ -1,27 +0,0 @@ -# Truthmark Check Report Template - -Truthmark-managed generated file. Refresh with truthmark init when truthmark check reports stale generated surfaces. - -Report completion in this shape: - -```md -Truth Check: completed - -Files reviewed: -- docs/truthmark/routes/areas.md - -Issues found: -- none - -Fixes suggested: -- none - -Evidence checked: -- Finding: The root route index is present and maps repository truth owners. - Evidence: docs/truthmark/routes/areas.md:1 - Suggested fix: none - Confidence: high - -Validation: -- truthmark check -``` diff --git a/tooling/truthmark/.agents/skills/truthmark-check/support/subagents-and-leases.md b/tooling/truthmark/.agents/skills/truthmark-check/support/subagents-and-leases.md deleted file mode 100644 index d33140a..0000000 --- a/tooling/truthmark/.agents/skills/truthmark-check/support/subagents-and-leases.md +++ /dev/null @@ -1,10 +0,0 @@ -# Truthmark Check Subagents And Leases - -Truthmark-managed generated file. Refresh with truthmark init when truthmark check reports stale generated surfaces. - -Codex subagent mode: -- use automatically when this workflow runs in Codex and the parent agent chooses bounded subagent fan-out -- dispatch read-only project agents only: truth_route_auditor, truth_claim_verifier, truth_doc_reviewer -- workers inspect checkout evidence directly, return structured findings, and must not edit files -- parent supplies bounded evidence shards; workers must not preload host instruction files or repo-wide policy docs unless assigned as evidence -- Parent agent owns the final Truth Check report diff --git a/tooling/truthmark/.agents/skills/truthmark-document/SKILL.md b/tooling/truthmark/.agents/skills/truthmark-document/SKILL.md deleted file mode 100644 index d5dec2f..0000000 --- a/tooling/truthmark/.agents/skills/truthmark-document/SKILL.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -name: truthmark-document -description: Use when the user asks to document existing implemented behavior, or Sync, Check, or Structure finds implemented behavior missing canonical truth. Not for functional-code changes, doc-first implementation, or topology repair that needs Structure. -argument-hint: Optional implemented behavior, API endpoint, route, controller, package, or truth-doc area to document -user-invocable: true ---- - -# Truthmark Document - -Use this skill to document existing implemented behavior when no functional-code changes are required for the task. - -Quick procedure: -- Follow repository instruction files that exist in this checkout; do not assume any optional policy path exists. -- Inspect .truthmark/config.yml and configured route files (docs/truthmark/routes/areas.md; docs/truthmark/routes/areas/) only when they exist; then inspect existing canonical docs, implementation code, and tests directly. -- Document current implemented behavior; do not invent future behavior. -- May write canonical truth docs and truth routing files only; must not write functional code. - -Progressive disclosure: -- support/procedure.md — read before edits or detailed auditing; contains core review questions -- support/report-template.md — read before the final report -- support/subagents-and-leases.md — read only when using subagents, leases, or accepting worker output diff --git a/tooling/truthmark/.agents/skills/truthmark-document/agents/openai.yaml b/tooling/truthmark/.agents/skills/truthmark-document/agents/openai.yaml deleted file mode 100644 index 1ab7daa..0000000 --- a/tooling/truthmark/.agents/skills/truthmark-document/agents/openai.yaml +++ /dev/null @@ -1,10 +0,0 @@ -interface: - display_name: "Truthmark Document" - short_description: "Document existing implemented behavior" - default_prompt: "Use $truthmark-document to document existing implemented behavior." - -policy: - allow_implicit_invocation: false - -truthmark: - refresh_command: "truthmark init" diff --git a/tooling/truthmark/.agents/skills/truthmark-document/support/procedure.md b/tooling/truthmark/.agents/skills/truthmark-document/support/procedure.md deleted file mode 100644 index 0698bab..0000000 --- a/tooling/truthmark/.agents/skills/truthmark-document/support/procedure.md +++ /dev/null @@ -1,92 +0,0 @@ -# Truthmark Document Procedure - -Truthmark-managed generated file. Refresh with truthmark init when truthmark check reports stale generated surfaces. - -# Truthmark Document - -Use this skill to document existing implemented behavior when no functional-code changes are required for the task. - -Truth Document is manual and implementation-first: - -- run only when the user explicitly asks to generate or update truth docs for existing behavior, or when Truth Sync, Truth Check, or Truth Structure reports implemented behavior that lacks canonical truth docs -- inspect .truthmark/config.yml and configured route files only when they exist; then inspect existing canonical docs, implementation code, and tests directly -- Evidence authority: - - Repository instruction files and explicitly configured policy docs remain instruction authority when present; do not assume a repository uses any particular policy path. - - Implementation code and canonical truth docs are inspected evidence for current behavior; they do not silently override workflow write boundaries. -- Lane classification: - - before writing canonical truth docs, classify the request or change as product-lane, engineering-lane, both-lane, or ambiguous - - product-lane writes belong under docs/truthmark/product and state product promises, boundaries, rationale, decisions, and success criteria - - engineering-lane writes belong under docs/truthmark/engineering and state source-backed current realization, contracts, architecture, workflows, operations, or tests - - both-lane work must write separate product and engineering docs and cross-link them in route YAML with realized_by and realizes, not in doc frontmatter - - ambiguous lane ownership must stop or invoke Truth Structure instead of writing a mixed document - - Do not make product docs a summary of engineering docs. Do not make engineering docs a detailed version of product docs. Product truth says what must be true and why. Engineering truth says how the repository currently realizes it. -- document current implemented behavior; do not invent future behavior or planned endpoints -- may write canonical truth docs and docs/truthmark/routes/areas.md or relevant child route files only -- must not write functional code -- when routing is missing, stale, broad, overloaded, catch-all, or cannot map the behavior to a bounded truth owner, run Truth Structure first when routing repair is safe and in scope -- stop and recommend Truth Structure when routing repair is unsafe, ambiguous, or outside the task boundary -- keep feature README.md files as indexes rather than truth-document targets -- create or update bounded leaf truth docs when behavior does not fit an existing leaf doc -- write product capability/boundary truth under docs/truthmark/product when documenting product promise, boundary, rationale, or user/stakeholder value -- write engineering truth under docs/truthmark/engineering when documenting implementation behavior, contracts, architecture, workflows, operations, or tests -- for both-lane documentation requests, write separate product and engineering docs and cross-link them in route YAML with realized_by and realizes, not in doc frontmatter -- keep engineering behavior truth behavior-oriented, not endpoint-oriented, unless the endpoint itself is the behavior boundary -- keep API endpoint details in the nearest contract truth doc when such a doc owns the API contract -- preserve unrelated authored content -Truth-doc ownership review: -- before editing or relying on the implemented behavior and candidate truth docs, verify each target/source truth doc is a bounded owner for the behavior -- if a target/source doc mixes independent owners, spans unrelated behaviors, acts as an index, or needs cross-owner edits, do not patch or in-place repair it -- if the target doc is broad, mixed-owner, index-like, or the documented behavior spans independent owners, run Truth Structure first when safe and in scope; otherwise stop and recommend Truth Structure -- report Ownership reviewed, Structure required, Truth docs split, Truth docs restructured, or Manual handoff reason as applicable -Decision/Rationale preservation review: -- before any truth-doc split, restructure, or shape repair, inventory existing Product Decisions, Engineering Decisions, and Rationale sections in every source or touched truth doc -- preserve each current decision and rationale in the correct product or engineering lane owner; when splitting, move it to the new owner doc rather than deleting it or leaving it in an index -- remove or narrow a decision or rationale only when checkout evidence shows it is stale or unsupported, and report the exact claim, evidence, and result -- if ownership of a decision or rationale is unclear, stop with manual-review files instead of deleting it or guessing -- after the edit, verify every touched truth doc keeps lane-appropriate decision/rationale sections and every pre-existing entry is preserved, moved, narrowed, removed with evidence, or blocked -Evidence checklist: -- route-first: map the documented behavior to bounded route owners and primary canonical docs -- review new or changed behavior-bearing claims only in touched docs, route ownership, lane-specific decisions, and rationale -- support claims with primary checkout evidence: implementation, config, routing, generated templates, schemas, or contract definitions -- tests/examples/canonical docs corroborate; they are not sole proof when implementation conflicts -- remove, narrow, or record unsupported claims for manual handoff -- if no truth doc changed, report why current truth was already sufficient or why documentation was blocked -Repository intelligence artifacts are optional derived context: RepoIndex, RouteMap, ImpactSet, and WorkflowState/action context may guide routing, write boundaries, and verification planning when available. -They do not override checkout evidence, canonical truth docs, route files, or workflow write boundaries. -If unavailable, inspect any present Truthmark config, route files, source files, truth docs, and tests directly, then report that repository-intelligence artifacts were not generated. -When creating or updating a truth doc, inspect the routed truth kind and use the matching template under the configured Truthmark templates root. -Supported kinds: product-capability, engineering-behavior, engineering-contract, engineering-architecture, engineering-workflow, engineering-operations, and engineering-test-behavior. -Treat the HTML comments under each template section as normative authoring guidance for that section. -Align existing docs to that template and write or repair section content so it satisfies the comment guidance while preserving accurate authored content. -If the template is missing, use lane-specific sections: product truth says what must be true and why; engineering truth says how the repository currently realizes it. -Teams may edit template files under the configured Truthmark templates root to define their local truth-doc standards. -Truth-doc prose style: -- Use professional, plain technical prose. Prefer specific current-state claims over promotional, symbolic, or generic significance language. -- Avoid common AI-writing tells: pivotal, crucial, underscores, serves as, stands as, showcases, landscape, vague expert attributions, and generic upbeat conclusions. -- Keep claims evidence-backed and diff-friendly: one durable claim per bullet or line; paragraphs should be no longer than one or two short sentences. -- Do not add personality, rhetorical flourish, first-person commentary, or marketing tone. -- Rewrite dense or formulaic prose only when it improves readability without removing scope, evidence, decisions, or source references. -Truth-doc shape repair review: -- Truth Document may restructure only truth docs for the implemented behavior being documented. -- repair shape in place only after the ownership review confirms the doc is the right bounded owner -- use Truth Structure for ownership splits; do not treat broad or mixed-owner docs as in-place repair work -- repair shape when a narrow edit would make truth worse: missing template sections, stale evidence conflicts, cross-section updates within one owner, or wrong frontmatter/source/headings -- preserve supported claims; remove, narrow, or record unsupported or stale claims for manual handoff -- report docs restructured and why a narrow edit was not sufficient -Maintain architecture docs only for structure-level changes: system structure, module boundaries, runtime topology, persistence boundaries, cross-cutting contracts, or generated-surface ownership. -Keep ordinary behavior, endpoints, UI copy, validation rules, and bug fixes in behavior or contract docs unless they change those boundaries. -Truthmark hierarchy hints: -- Config, when present: .truthmark/config.yml -- Root route index, when present: docs/truthmark/routes/areas.md -- Area route files, when present: docs/truthmark/routes/areas/**/*.md -- Product truth docs, when present: docs/truthmark/product/**/*.md -- Engineering truth docs, when present: docs/truthmark/engineering/**/*.md -Decision truth lives in the canonical doc it governs; date active decisions inline when added or changed. -Do not create separate active-decision ADR/planning logs; replace the active decision and let Git history carry the audit trail. -Product decisions belong in product truth; engineering, architecture, contract, workflow, and operational decisions belong in engineering truth. -Optional validation: when local tooling is available, you may validate the final report with `truthmark validate document-report --json`; direct checkout inspection and evidence review remain authoritative. -Parent post-document verification: -- verify only truth docs and leased truth routing files changed during document work -- stop on functional code, generated host surfaces, or unrelated diffs caused by document work -- for each write lease, validate the worker report against the actual worker diff, allowedWrites, forbiddenWrites, identity fields, filesChanged, offLeaseChanges, blockers, and expected report fields before accepting it -- verify the final report records ownership review, structure requirement, restructure, routing update, or manual handoff reason when applicable diff --git a/tooling/truthmark/.agents/skills/truthmark-document/support/report-template.md b/tooling/truthmark/.agents/skills/truthmark-document/support/report-template.md deleted file mode 100644 index 29677aa..0000000 --- a/tooling/truthmark/.agents/skills/truthmark-document/support/report-template.md +++ /dev/null @@ -1,34 +0,0 @@ -# Truthmark Document Report Template - -Truthmark-managed generated file. Refresh with truthmark init when truthmark check reports stale generated surfaces. - -Report completion in this shape: -```md -Truth Document: completed - -Implementation reviewed: -- src/routing/area-resolver.ts - -Ownership reviewed: -- docs/truthmark/routes/areas.md - -Truth docs created: -- docs/truthmark/engineering/contracts/routing.md - -Truth docs updated: -- docs/truthmark/engineering/behaviors/check-diagnostics.md - -Truth docs restructured: -- docs/truthmark/engineering/behaviors/check-diagnostics.md - -Routing updated: -- docs/truthmark/routes/areas.md - -Evidence checked: -- Claim: Route resolution behavior is documented in the contracts truth doc. - Evidence: src/routing/area-resolver.ts:14 / docs/truthmark/routes/areas.md:9 - Result: supported - -Notes: -- Documented routing and behavior from route handlers and tests. -``` diff --git a/tooling/truthmark/.agents/skills/truthmark-document/support/subagents-and-leases.md b/tooling/truthmark/.agents/skills/truthmark-document/support/subagents-and-leases.md deleted file mode 100644 index 3a151e3..0000000 --- a/tooling/truthmark/.agents/skills/truthmark-document/support/subagents-and-leases.md +++ /dev/null @@ -1,14 +0,0 @@ -# Truthmark Document Subagents And Leases - -Truthmark-managed generated file. Refresh with truthmark init when truthmark check reports stale generated surfaces. - -Codex subagent mode: -- use automatically when this workflow runs in Codex and the parent agent chooses bounded subagent fan-out -- dispatch read-only project agents for verification: truth_route_auditor, truth_claim_verifier -- read-only workers inspect checkout evidence directly, return structured findings, and must not edit files -- parent supplies bounded evidence shards; read-only workers must not preload host instruction files or repo-wide policy docs unless assigned as evidence -- dispatch write-capable project agents only with explicit write leases: truth_doc_writer -- each write lease must name objective, required reads, allowed writes, forbidden writes, evidence, verification, and report fields -- write workers must stop when a required edit is off-lease and report status, filesChanged, evidence, offLeaseChanges, blockers, and notes -- parent must inspect the actual checkout diff against each lease before accepting a worker report -- Parent agent owns Truth Document acceptance, lease validation, and final report diff --git a/tooling/truthmark/.agents/skills/truthmark-portal/SKILL.md b/tooling/truthmark/.agents/skills/truthmark-portal/SKILL.md deleted file mode 100644 index e925915..0000000 --- a/tooling/truthmark/.agents/skills/truthmark-portal/SKILL.md +++ /dev/null @@ -1,24 +0,0 @@ ---- -name: truthmark-portal -description: Use when the user explicitly asks to generate, refresh, or update the Truthmark Portal static HTML site. Not for code change sync, route repair, truth validation/checking, documenting behavior, realizing docs into code, or machine-readable agent context. -argument-hint: Optional portal generation focus -user-invocable: true ---- - -# Truthmark Portal - -Use this skill only when the user explicitly asks to generate or refresh the committed static HTML Truthmark Portal. - -Quick procedure: -- Follow repository instruction files that exist in this checkout; do not assume any optional policy path exists. -- Truthmark Portal is manual-only; never run it automatically at completion and never treat it as Truth Sync. -- Markdown remains canonical; generated HTML is non-canonical presentation only. -- Read Markdown directly; the workflow does not require the truthmark CLI or package. -- Generate committed, generated non-canonical static files for humans. -- Write only under fixed Portal output docs/truthmark/generated/portal. -- Use determined Portal template docs/truthmark/templates/portal.html when present; no .truthmark/index.json dependency. -- Use no remote dependencies by default and include source provenance on every page. - -Progressive disclosure: -- support/procedure.md — read before edits or detailed auditing; contains core review questions -- support/report-template.md — read before the final report diff --git a/tooling/truthmark/.agents/skills/truthmark-portal/agents/openai.yaml b/tooling/truthmark/.agents/skills/truthmark-portal/agents/openai.yaml deleted file mode 100644 index cf2648a..0000000 --- a/tooling/truthmark/.agents/skills/truthmark-portal/agents/openai.yaml +++ /dev/null @@ -1,10 +0,0 @@ -interface: - display_name: "Truthmark Portal" - short_description: "Generate a committed static HTML Truthmark Portal" - default_prompt: "Use $truthmark-portal only when explicitly asked to generate or refresh the committed static HTML Portal." - -policy: - allow_implicit_invocation: false - -truthmark: - refresh_command: "truthmark init" diff --git a/tooling/truthmark/.agents/skills/truthmark-portal/support/procedure.md b/tooling/truthmark/.agents/skills/truthmark-portal/support/procedure.md deleted file mode 100644 index 02b217b..0000000 --- a/tooling/truthmark/.agents/skills/truthmark-portal/support/procedure.md +++ /dev/null @@ -1,39 +0,0 @@ -# Truthmark Portal Procedure - -Truthmark-managed generated file. Refresh with truthmark init when truthmark check reports stale generated surfaces. - -# Truthmark Portal - -Truthmark Portal is a manual-only presentation workflow. It is never an automatic completion workflow, never Truth Sync, and runs only when the user explicitly asks to generate, refresh, or update the committed static HTML Portal. - -Core rules: - -- Markdown remains canonical; generated HTML is presentation only. -- Read Markdown directly from the checkout; the workflow does not require the truthmark CLI or package. -- truthmark check/index may be used only as optional supporting evidence when available. -- Determined Portal output is docs/truthmark/generated/portal. -- Determined Portal template path is docs/truthmark/templates/portal.html; use built-in template instructions if that file is absent. -- The workflow may replace the entire output directory, but writes are limited to the fixed Portal output directory only. -- Portal writes are generated non-canonical static files for human browsing. -- Generate a committed multi-page static HTML site with local CSS, JavaScript, assets, and search metadata under the output directory. -- Use no remote dependencies by default: no remote scripts, analytics, fonts, CSS, or CDN assets. -- Include source provenance and the Markdown canonical disclaimer on every page. -- Store manifest and search data under output/assets only. -- There is no .truthmark/index.json dependency; do not require or create it as infrastructure. -- Pictures and screenshots require an explicit user or template request. - -Workflow: - -1. Confirm the user explicitly requested Portal generation or refresh. -2. Inspect .truthmark/config.yml and configured route docs only when they exist; read repository instruction files when present, truth docs, architecture docs, standards docs, and the determined Portal template when present. -3. Validate the determined output path is repo-relative, non-empty, inside the repository, and does not overlap canonical docs, source roots, routing files, or instruction targets. -4. Plan the generated page inventory, diagrams/assets, source docs reviewed, and skipped or ambiguous docs. -5. Replace or write only under docs/truthmark/generated/portal; do not edit canonical Markdown, routing, source code, or instruction files unless the user explicitly changes scope. -6. Generate the multi-page static site with local assets/search metadata and visible source provenance. -7. Validate entry page, links where practical, provenance/disclaimers, local-only assets, and that metadata remains under docs/truthmark/generated/portal/assets. -Truthmark hierarchy hints: -- Config, when present: .truthmark/config.yml -- Root route index, when present: docs/truthmark/routes/areas.md -- Area route files, when present: docs/truthmark/routes/areas/**/*.md -- Product truth docs, when present: docs/truthmark/product/**/*.md -- Engineering truth docs, when present: docs/truthmark/engineering/**/*.md diff --git a/tooling/truthmark/.agents/skills/truthmark-portal/support/report-template.md b/tooling/truthmark/.agents/skills/truthmark-portal/support/report-template.md deleted file mode 100644 index 3be2266..0000000 --- a/tooling/truthmark/.agents/skills/truthmark-portal/support/report-template.md +++ /dev/null @@ -1,30 +0,0 @@ -# Truthmark Portal Report Template - -Truthmark-managed generated file. Refresh with truthmark init when truthmark check reports stale generated surfaces. - -Report completion in this shape: - -```md -Truthmark Portal: completed - -Output path: -- docs/truthmark/generated/portal - -Page count: -- - -Diagrams/assets: -- - -Source docs reviewed: -- - -Skipped/ambiguous docs: -- - -Validation: -- - -Markdown canonical statement: -- Markdown remains canonical; generated Portal HTML is non-canonical presentation only. -``` diff --git a/tooling/truthmark/.agents/skills/truthmark-realize/SKILL.md b/tooling/truthmark/.agents/skills/truthmark-realize/SKILL.md deleted file mode 100644 index 1577854..0000000 --- a/tooling/truthmark/.agents/skills/truthmark-realize/SKILL.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -name: truthmark-realize -description: Use when the user explicitly asks to realize Truthmark truth docs into code, including /truthmark-realize, $truthmark-realize, or /truthmark:realize. Not for syncing docs after code changes, documenting existing code, topology repair, or truth audits. -argument-hint: Optional truth doc path, area, or desired code behavior to realize -user-invocable: true ---- - -# Truthmark Realize - -Use this skill only when the user explicitly asks to realize truth docs into code. - -Quick procedure: -- Follow repository instruction files that exist in this checkout; do not assume any optional policy path exists. -- Read the source truth docs, inspect .truthmark/config.yml and configured route files (docs/truthmark/routes/areas.md; docs/truthmark/routes/areas/) only when they exist, then inspect tests and relevant functional code directly. -- Truth docs lead; code follows. -- may write functional code only; must not edit truth docs or truth routing while realizing those docs. - -Progressive disclosure: -- support/procedure.md — read before edits or detailed auditing; contains core review questions -- support/report-template.md — read before the final report diff --git a/tooling/truthmark/.agents/skills/truthmark-realize/agents/openai.yaml b/tooling/truthmark/.agents/skills/truthmark-realize/agents/openai.yaml deleted file mode 100644 index 8f3916c..0000000 --- a/tooling/truthmark/.agents/skills/truthmark-realize/agents/openai.yaml +++ /dev/null @@ -1,10 +0,0 @@ -interface: - display_name: "Truthmark Realize" - short_description: "Realize truth docs into code" - default_prompt: "Use $truthmark-realize to realize the updated truth docs into code." - -policy: - allow_implicit_invocation: false - -truthmark: - refresh_command: "truthmark init" diff --git a/tooling/truthmark/.agents/skills/truthmark-realize/support/procedure.md b/tooling/truthmark/.agents/skills/truthmark-realize/support/procedure.md deleted file mode 100644 index f6b3200..0000000 --- a/tooling/truthmark/.agents/skills/truthmark-realize/support/procedure.md +++ /dev/null @@ -1,41 +0,0 @@ -# Truthmark Realize Procedure - -Truthmark-managed generated file. Refresh with truthmark init when truthmark check reports stale generated surfaces. - -# Truthmark Realize - -Use this skill only when the user explicitly asks to realize truth docs into code. - -Truth Realize is doc-first: - -- truth docs lead -- code follows -- Truth Realize never edits the truth docs it is realizing - -Workflow: - -1. Read the updated truth docs named by the user, or infer the relevant docs from configured route files when present. -2. Inspect .truthmark/config.yml and configured route files (docs/truthmark/routes/areas.md; docs/truthmark/routes/areas/) only when they exist; then read tests and the relevant functional code. -3. Repository instruction files and explicitly configured policy docs remain instruction authority when present; do not assume a repository uses any particular policy path. -Implementation code and canonical truth docs are inspected evidence for current behavior; they do not silently override workflow write boundaries. -Truth-doc ownership review: -- before editing or relying on source truth docs before writing code, verify each target/source truth doc is a bounded owner for the behavior -- if a target/source doc mixes independent owners, spans unrelated behaviors, acts as an index, or needs cross-owner edits, do not patch or in-place repair it -- if a source truth doc is broad, mixed-owner, index-like, unrouteable, stale, or conflicts with implementation evidence, stop before writing code and recommend Truth Structure or Truth Document -- report Ownership reviewed, Structure required, Truth docs split, Truth docs restructured, or Manual handoff reason as applicable -4. Update functional code only so implementation matches bounded, current truth claims from the source docs. -5. Do not edit truth docs or truth routing while realizing those docs. -6. Run relevant tests for the changed code. -7. Report changed code files and verification steps. -Truthmark hierarchy hints: -- Config, when present: .truthmark/config.yml -- Root route index, when present: docs/truthmark/routes/areas.md -- Area route files, when present: docs/truthmark/routes/areas/**/*.md -- Product truth docs, when present: docs/truthmark/product/**/*.md -- Engineering truth docs, when present: docs/truthmark/engineering/**/*.md - -Read and write boundaries: - -- may read truth docs, routing docs, and relevant functional code -- may write functional code only -- must not edit truth docs or truth routing while realizing those docs diff --git a/tooling/truthmark/.agents/skills/truthmark-realize/support/report-template.md b/tooling/truthmark/.agents/skills/truthmark-realize/support/report-template.md deleted file mode 100644 index 730b19e..0000000 --- a/tooling/truthmark/.agents/skills/truthmark-realize/support/report-template.md +++ /dev/null @@ -1,19 +0,0 @@ -# Truthmark Realize Report Template - -Truthmark-managed generated file. Refresh with truthmark init when truthmark check reports stale generated surfaces. - -Report completion in this shape: - -```md -Truth Realize: completed - -Truth docs used: -- docs/truthmark/product/capabilities/authentication-session.md -- docs/truthmark/engineering/behaviors/authentication-session.md - -Code updated: -- src/auth/session.ts - -Verification: -- npm test -- auth -``` diff --git a/tooling/truthmark/.agents/skills/truthmark-structure/SKILL.md b/tooling/truthmark/.agents/skills/truthmark-structure/SKILL.md deleted file mode 100644 index aec71ae..0000000 --- a/tooling/truthmark/.agents/skills/truthmark-structure/SKILL.md +++ /dev/null @@ -1,21 +0,0 @@ ---- -name: truthmark-structure -description: Use when routing or truth ownership is missing, stale, broad, overloaded, catch-all, unrouteable, mixed-owner, needs split/repair, or needs new area setup. Not for documenting implemented behavior, syncing a code diff, or realizing docs into code. -argument-hint: Optional area, directory, or routing concern -user-invocable: true ---- - -# Truthmark Structure - -Use this skill to design or repair Truthmark area structure. - -Quick procedure: -- Follow repository instruction files that exist in this checkout; do not assume any optional policy path exists. -- Inspect .truthmark/config.yml and configured route files (docs/truthmark/routes/areas.md; docs/truthmark/routes/areas/) only when they exist; then inspect current docs and relevant code directly. -- Define areas by product or behavior ownership, not by mechanical directory mirroring. -- Do not edit functional code. - -Progressive disclosure: -- support/procedure.md — read before edits or detailed auditing; contains core review questions -- support/report-template.md — read before the final report -- support/subagents-and-leases.md — read only when using subagents, leases, or accepting worker output diff --git a/tooling/truthmark/.agents/skills/truthmark-structure/agents/openai.yaml b/tooling/truthmark/.agents/skills/truthmark-structure/agents/openai.yaml deleted file mode 100644 index cbd86aa..0000000 --- a/tooling/truthmark/.agents/skills/truthmark-structure/agents/openai.yaml +++ /dev/null @@ -1,10 +0,0 @@ -interface: - display_name: "Truthmark Structure" - short_description: "Design, repair, or set up Truthmark area routing" - default_prompt: "Use $truthmark-structure to design, repair, or set up Truthmark area routing." - -policy: - allow_implicit_invocation: false - -truthmark: - refresh_command: "truthmark init" diff --git a/tooling/truthmark/.agents/skills/truthmark-structure/support/procedure.md b/tooling/truthmark/.agents/skills/truthmark-structure/support/procedure.md deleted file mode 100644 index 16f39e5..0000000 --- a/tooling/truthmark/.agents/skills/truthmark-structure/support/procedure.md +++ /dev/null @@ -1,101 +0,0 @@ -# Truthmark Structure Procedure - -Truthmark-managed generated file. Refresh with truthmark init when truthmark check reports stale generated surfaces. - -Use this skill to design or repair Truthmark area structure. - -Truth Structure is agent-native: -- inspect repository layout, current docs, Truthmark config and route files when present, and relevant code directly -- Evidence authority: - - Repository instruction files and explicitly configured policy docs remain instruction authority when present; do not assume a repository uses any particular policy path. - - Implementation code and canonical truth docs are inspected evidence for current behavior; they do not silently override workflow write boundaries. -- Lane classification: - - before writing canonical truth docs, classify the request or change as product-lane, engineering-lane, both-lane, or ambiguous - - product-lane writes belong under docs/truthmark/product and state product promises, boundaries, rationale, decisions, and success criteria - - engineering-lane writes belong under docs/truthmark/engineering and state source-backed current realization, contracts, architecture, workflows, operations, or tests - - both-lane work must write separate product and engineering docs and cross-link them in route YAML with realized_by and realizes, not in doc frontmatter - - ambiguous lane ownership must stop or invoke Truth Structure instead of writing a mixed document - - Do not make product docs a summary of engineering docs. Do not make engineering docs a detailed version of product docs. Product truth says what must be true and why. Engineering truth says how the repository currently realizes it. -- inspect the configured root route index at docs/truthmark/routes/areas.md and relevant child route files under docs/truthmark/routes/areas/ when they exist -- define areas by product or behavior ownership, not by mechanical directory mirroring -- create or repair docs/truthmark/routes/areas.md -- create skeletal starter truth docs only when missing ownership would otherwise block future workflows -- Starter truth docs must use closed YAML frontmatter bounded by opening and closing --- lines; include status, truth_kind, and last_reviewed inside that frontmatter. Put source references in the final ## Source References section, not in frontmatter. -- Starter truth docs are ownership anchors, not behavior writeups: include only the title, bounded area/scope, and Source References needed to make routing explicit. -- Starter truth docs must keep product and engineering truth in separate files; leave substantive behavior, contract, architecture, workflow, operations, or test prose to Truth Document. - -- use docs/truthmark/product/** for product truth destinations -- use docs/truthmark/engineering/** for engineering truth destinations -- use only canonical current-truth destinations for starter truth docs -- keep Product Decisions in product truth and Engineering Decisions in engineering truth when selecting destinations; report any relocation need instead of rewriting decision prose during topology review -- preserve unrelated authored content -## New area setup -Use when a user asks to onboard a new code area into Truthmark, a new package, controller, domain, or product area lacks bounded truth ownership, or a new product area needs routing and starter truth docs. -Do: -- inspect the named code area -- infer bounded product or behavior ownership -- choose the owning route when ownership is clear; otherwise propose the route and stop for manual review -- create or update the child route entry or file -- create starter truth docs only where current truth is missing -- report the initial truth boundary -Do not: -- do not edit functional code -- do not perform full behavior documentation unless evidence is inspected and the task explicitly asks for it -- do not patch broad or mixed-owner docs in place -- do not create generic catch-all docs -- do not treat README files as Sync targets -## Topology Governance -Truth Structure owns documentation topology, lane splits, decision relocation, and relationship repair. Do not depend on humans to manually organize docs/truthmark/product or docs/truthmark/engineering. Treat both configured lane roots as managed semantic roots. -Inspect controllers, routes, handlers, services, packages, tests, existing truth docs, and route files; infer product and domain ownership from behavior boundaries, not from mechanical directory mirroring. -When topology pressure exists, repair route structure before creating or extending truth ownership anchors. -Truth-doc ownership review: -- before editing or relying on candidate route owners and current truth docs, verify each target/source truth doc is a bounded owner for the behavior -- if a target/source doc mixes independent owners, spans unrelated behaviors, acts as an index, or needs cross-owner edits, do not patch or in-place repair it -- if a truth doc mixes independent owners, route ownership is broad, or a split is required for bounded ownership, split or reroute only the ownership topology when safe; otherwise stop with manual-review files -- report Ownership reviewed, Structure required, Truth docs split, Truth docs restructured, or Manual handoff reason as applicable -Topology pressure signals: -- one area maps broad code such as src/**, app/**, server/**, services/**, or packages/** -- one area maps multiple unrelated controllers, route groups, services, or bounded contexts -- one truth doc owns unrelated behaviors or unrelated endpoint families -- either configured lane root has many direct non-index docs -- a changed controller, route, or service cannot map to a specific behavior doc -- Truth Sync would need to create a new generic truth doc because routing is too broad -- endpoint or controller names reveal domains missing from docs/truthmark/routes/areas/** -Use these review thresholds as guidance: -- more than 10 direct truth docs in one folder -- more than 15 leaf areas in one child route file -- more than 8 truth docs mapped to one area -- more than 5 controllers mapped through one catch-all area -Repair rules: -- split broad, overloaded, or catch-all areas into behavior-owned child route files -- split or flag mixed-owner truth docs for bounded owners before any workflow adds new behavior claims -- create route files under docs/truthmark/routes/areas/ when a product/domain boundary is clear -- create skeletal engineering ownership anchors under docs/truthmark/engineering only when behavior lacks a current owner -- create skeletal product ownership anchors under docs/truthmark/product only when product promise, boundary, rationale, or user-visible capability ownership is in scope -- README.md files are indexes, not Truth Sync targets -- prefer bounded product docs under product/capabilities or product/decisions and engineering docs under engineering//.md -- keep behavior truth docs behavior-oriented, not endpoint-oriented -- keep API endpoint details in the nearest contract truth doc when such a doc exists -- update routing so future Truth Sync can target small docs -- preserve existing authored docs; move or rewrite only when needed to remove ambiguity -- report Truth docs split when one broad or mixed-owner truth doc becomes multiple bounded docs -Evidence checklist: -- apply the evidence checklist before finishing when Truth Structure writes routed docs, ownership claims, lane-specific decisions, or rationale -- support ownership/behavior claims with topology or primary checkout evidence from layout, implementation boundaries, docs, config, route files, tests, templates, schemas, or contracts -- tests/examples/canonical docs corroborate; remove, narrow, or record unsupported claims for manual handoff -- Do not finish topology repair with mixed product/engineering authority in a single canonical truth doc. -- If an existing canonical doc has wrong-lane sections, report the lane repair needed and only move content when the topology split explicitly requires it. -Portable fallback: -- If this skill surface is unavailable, perform the same workflow directly from committed repository files. -- Do not require the truthmark CLI. -- Inspect .truthmark/config.yml and configured route files only when they exist; then inspect canonical docs and representative implementation code. -- Use a subagent only when the host supports that pattern; otherwise perform the topology repair inline. -Truthmark hierarchy hints: -- Config, when present: .truthmark/config.yml -- Root route index, when present: docs/truthmark/routes/areas.md -- Area route files, when present: docs/truthmark/routes/areas/**/*.md -- Product truth docs, when present: docs/truthmark/product/**/*.md -- Engineering truth docs, when present: docs/truthmark/engineering/**/*.md -Decision truth lives in the canonical doc it governs; date active decisions inline when added or changed. -Do not create separate active-decision ADR/planning logs; replace the active decision and let Git history carry the audit trail. -Product decisions belong in product truth; engineering, architecture, contract, workflow, and operational decisions belong in engineering truth. diff --git a/tooling/truthmark/.agents/skills/truthmark-structure/support/report-template.md b/tooling/truthmark/.agents/skills/truthmark-structure/support/report-template.md deleted file mode 100644 index d615580..0000000 --- a/tooling/truthmark/.agents/skills/truthmark-structure/support/report-template.md +++ /dev/null @@ -1,38 +0,0 @@ -# Truthmark Structure Report Template - -Truthmark-managed generated file. Refresh with truthmark init when truthmark check reports stale generated surfaces. - -Report completion in this shape: -```md -Truth Structure: completed -Topology reviewed: -- controllers: src/auth/** -- product docs root: docs/truthmark/product -- engineering docs root: docs/truthmark/engineering -- route files: docs/truthmark/routes/areas.md -Areas reviewed: -- src/auth/** -Routing updated: -- docs/truthmark/routes/areas.md -Initial truth boundary: -- Area: Authentication -- Code: src/auth/** -- Product owner: docs/truthmark/product/capabilities/authentication-session.md -- Engineering owner: docs/truthmark/engineering/behaviors/authentication-session.md -- Scope: session behavior only -Truth docs created: -- docs/truthmark/product/capabilities/authentication-session.md -- docs/truthmark/engineering/behaviors/authentication-session.md -Truth docs split: -- docs/truthmark/truth/authentication/README.md -> docs/truthmark/product/capabilities/authentication-session.md and docs/truthmark/engineering/behaviors/authentication-session.md -Truth docs restructured: -- docs/truthmark/truth/authentication/README.md -Evidence checked: -- Claim: Session behavior belongs to a dedicated Authentication truth owner. - Evidence: src/auth/** / docs/truthmark/routes/areas.md:7 - Result: supported -Topology decisions: -- Added an Authentication area because session behavior has a distinct code surface and truth owner. -Notes: -- Added an Authentication area for session behavior. -``` diff --git a/tooling/truthmark/.agents/skills/truthmark-structure/support/subagents-and-leases.md b/tooling/truthmark/.agents/skills/truthmark-structure/support/subagents-and-leases.md deleted file mode 100644 index 877bb50..0000000 --- a/tooling/truthmark/.agents/skills/truthmark-structure/support/subagents-and-leases.md +++ /dev/null @@ -1,10 +0,0 @@ -# Truthmark Structure Subagents And Leases - -Truthmark-managed generated file. Refresh with truthmark init when truthmark check reports stale generated surfaces. - -Codex subagent mode: -- use automatically when this workflow runs in Codex and the parent agent chooses bounded subagent fan-out -- dispatch read-only project agents only: truth_route_auditor -- workers inspect checkout evidence directly, return structured findings, and must not edit files -- parent supplies bounded evidence shards; workers must not preload host instruction files or repo-wide policy docs unless assigned as evidence -- Parent agent owns all Truth Structure writes and final topology decisions diff --git a/tooling/truthmark/.agents/skills/truthmark-sync/SKILL.md b/tooling/truthmark/.agents/skills/truthmark-sync/SKILL.md deleted file mode 100644 index 21ea858..0000000 --- a/tooling/truthmark/.agents/skills/truthmark-sync/SKILL.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -name: truthmark-sync -description: Use automatically at finish-time after functional code changes, or explicit /truthmark-sync, $truthmark-sync, or /truthmark:sync. Skip docs-only, formatting-only, behavior-preserving renames, missing config, and no-code changes. Not for doc-first realization or manual topology design. -argument-hint: Optional changed-code area, truth-doc area, or sync focus -user-invocable: true ---- - -# Truthmark Sync - -Use this skill automatically before finishing when functional code changed since the last successful Truth Sync. Also run it immediately when the user explicitly invokes Truth Sync. - -Quick procedure: -- Follow repository instruction files that exist in this checkout; do not assume any optional policy path exists. -- Skip docs-only, formatting-only, behavior-preserving renames with no truth impact, missing config, and no-code changes. -- Inspect .truthmark/config.yml and configured route files (docs/truthmark/routes/areas.md; docs/truthmark/routes/areas/) only when they exist; then inspect relevant canonical docs directly. -- direct checkout inspection is the canonical path; do not require the truthmark binary. -- May write canonical truth docs and truth routing files only; must not rewrite functional code. - -Progressive disclosure: -- support/procedure.md — read before edits or detailed auditing; contains core review questions -- support/report-template.md — read before the final report -- support/subagents-and-leases.md — read only when using subagents, leases, or accepting worker output diff --git a/tooling/truthmark/.agents/skills/truthmark-sync/agents/openai.yaml b/tooling/truthmark/.agents/skills/truthmark-sync/agents/openai.yaml deleted file mode 100644 index 733fb7b..0000000 --- a/tooling/truthmark/.agents/skills/truthmark-sync/agents/openai.yaml +++ /dev/null @@ -1,10 +0,0 @@ -interface: - display_name: "Truthmark Sync" - short_description: "Sync truth docs from functional code changes; skip docs-only/no-code changes" - default_prompt: "Use $truthmark-sync after functional code changes; skip docs-only/no-code changes." - -policy: - allow_implicit_invocation: true - -truthmark: - refresh_command: "truthmark init" diff --git a/tooling/truthmark/.agents/skills/truthmark-sync/support/procedure.md b/tooling/truthmark/.agents/skills/truthmark-sync/support/procedure.md deleted file mode 100644 index 32ab187..0000000 --- a/tooling/truthmark/.agents/skills/truthmark-sync/support/procedure.md +++ /dev/null @@ -1,70 +0,0 @@ -# Truthmark Sync Procedure - -Truthmark-managed generated file. Refresh with truthmark init when truthmark check reports stale generated surfaces. - -Use this skill automatically before finishing when functional code changed since the last successful Truth Sync. Also run it immediately when the user explicitly invokes Truth Sync. -Explicit invocation runs immediately when the user directly requests this workflow. Later functional-code changes need a fresh finish-time review, and an earlier explicit run satisfies the finish-time review only if no later functional-code changes occur. -Skip when changes are documentation-only, formatting-only, clearly behavior-preserving renames with no truth impact, when no Truthmark config exists yet, or when there are no functional code changes. -Parent workflow: -1. Inspect git status, staged changes, unstaged changes, and untracked files directly. -2. Inspect .truthmark/config.yml and configured route files only when they exist; then inspect relevant canonical docs. -3. Identify functional-code changes and the nearest truth docs or routing repairs. -4. Evidence authority: - - Repository instruction files and explicitly configured policy docs remain instruction authority when present; do not assume a repository uses any particular policy path. - - Implementation code and canonical truth docs are inspected evidence for current behavior; they do not silently override workflow write boundaries. -5. Product truth decision: - - ask whether a user-visible promise, capability boundary, API contract, acceptance criterion, or explicit user/product evidence changed - - if yes, update or route product truth under docs/truthmark/product as well as engineering truth under docs/truthmark/engineering - - if no, default to engineering truth under docs/truthmark/engineering for internal implementation changes - - when both lanes change, keep separate product and engineering docs cross-linked through route YAML with realized_by and realizes - - when ownership is ambiguous, stop or route to Truth Structure instead of writing a mixed document -6. Capture decision context from the task conversation: ask whether the user provided a product or technical decision, rationale, constraint, tradeoff, rejection reason, or scope boundary. Preserve concise user-provided decision rationale in Sync Intent before truth edits, route it to Product Decisions, Engineering Decisions, Rationale, Capability Scope, Non-Goals, Maintenance Notes, or the relevant workflow/contract section, and report whether it was placed, skipped because none was provided, or needs manual handoff. -7. Update engineering truth first after code changes. Product truth is opt-in for externally visible promises, product boundaries, APIs, acceptance criteria, or explicit user/product evidence. -8. Code verification is parent-owned: follow repository instructions and task context, and report what ran or why it did not run. -9. Dispatch bounded Truth Sync workers only when the host supports subagent dispatch and the acting agent chooses that path; otherwise execute the same sync task inline. -10. Fill Sync Intent before editing truth docs or truth routing files: - - Changed code reviewed: functional files, tests, configs, generated outputs, or other implementation evidence inspected - - Affected route/truth owner: bounded route area or canonical truth owner that maps the change - - Target truth docs: docs expected to change, or docs reviewed and left unchanged - - Intended update: claim/doc/routing update planned before writing - - Evidence to verify: checkout evidence that will support, narrow, remove, or record each claim for manual handoff - - User-provided decisions/rationale: decisions, rationale, constraints, tradeoffs, rejection reasons, or scope boundaries from the current task conversation, or "none provided" - - No-update-needed rationale: why mapped truth is already current when no truth doc should change - - Blockers: missing routing, ambiguous ownership, failed verification, unavailable evidence, or off-boundary write needs -11. Only edit allowed truth docs/routes after Sync Intent is clear; if ownership is ambiguous, repair topology first when the repair is safe and in scope, otherwise stop and recommend Truth Structure instead of guessing. -Truth-doc prose style: -- Use professional, plain technical prose. Prefer specific current-state claims over promotional, symbolic, or generic significance language. -- Avoid common AI-writing tells: pivotal, crucial, underscores, serves as, stands as, showcases, landscape, vague expert attributions, and generic upbeat conclusions. -- Keep claims evidence-backed and diff-friendly: one durable claim per bullet or line; paragraphs should be no longer than one or two short sentences. -- Do not add personality, rhetorical flourish, first-person commentary, or marketing tone. -- Rewrite dense or formulaic prose only when it improves readability without removing scope, evidence, decisions, or source references. -Topology review and repair: -- before updating truth docs, verify the changed code resolves to a specific behavior-owned area and bounded truth owner -- if routing is missing, stale, broad, overloaded, catch-all route only, or cannot map changed code to a bounded truth owner, run Truth Structure before syncing when topology repair is safe and in scope -- safe in-scope topology repair may update truth routing files and create or update bounded leaf truth docs needed to map the changed functional code; keep the repair limited to the affected route owner -- stop and recommend Truth Structure only when topology repair is unsafe, ambiguous, or outside the current task boundary -- report the route files and changed code paths that required structure repair -- do not create another generic truth doc -- README.md files are indexes, not Truth Sync targets -- must not append behavior details to a README.md index -- write engineering truth under docs/truthmark/engineering; product truth updates under docs/truthmark/product are allowed only for explicit current product behavior changes -Optional validation tooling: -- you may run truthmark check when local tooling is available -- you may validate the final report with `truthmark validate sync-report --json` when available -- do not require the truthmark binary; direct checkout inspection is the canonical path -- optional validation must not replace agent judgment about docs and routing -- update Product Decisions only in product truth and Engineering Decisions only in engineering truth when evidence supports the lane-specific decision change -Truthmark hierarchy hints: -- Config, when present: .truthmark/config.yml -- Root route index, when present: docs/truthmark/routes/areas.md -- Area route files, when present: docs/truthmark/routes/areas/**/*.md -- Product truth docs, when present: docs/truthmark/product/**/*.md -- Engineering truth docs, when present: docs/truthmark/engineering/**/*.md -Parent post-sync verification: -- verify only truth docs and leased truth routing files changed during sync -- stop on any unrelated diff caused by the sync step -- stop if functional code changed during sync -- validate the final report against the structured Truth Sync report contract, including Claim, indented Evidence, and Result values supported, narrowed, removed, or blocked under Evidence checked -- verify the updated docs correspond to reviewed checkout evidence, changed-code impact, or a recorded stale-truth correction made within the sync write lease -- verify the final report records ownership review, structure requirement, split, restructure, or manual handoff reason when the ownership review applies -- manual handoff outcomes must preserve the working tree as-is: no rollback, no post-block cleanup edits, and manual-review reporting of any remaining files diff --git a/tooling/truthmark/.agents/skills/truthmark-sync/support/report-template.md b/tooling/truthmark/.agents/skills/truthmark-sync/support/report-template.md deleted file mode 100644 index d682cc5..0000000 --- a/tooling/truthmark/.agents/skills/truthmark-sync/support/report-template.md +++ /dev/null @@ -1,52 +0,0 @@ -# Truthmark Sync Report Template - -Truthmark-managed generated file. Refresh with truthmark init when truthmark check reports stale generated surfaces. - -Report completion in this shape: -```md -Truth Sync: completed - -Changed code reviewed: -- src/auth/session.ts - -Sync Intent: -- Changed code reviewed: src/auth/session.ts -- Affected route/truth owner: docs/truthmark/routes/areas/authentication.md -- Target truth docs: docs/truthmark/engineering/behaviors/session-timeout.md -- Intended update: Update session timeout behavior. -- Evidence to verify: src/auth/session.ts:12 / docs/truthmark/routes/areas/authentication.md:11 -- User-provided decisions/rationale: User rationale: session timeout behavior changed for internal implementation consistency -- No-update-needed rationale: not applicable; mapped truth is stale -- Blockers: none - -Ownership reviewed: -- docs/truthmark/routes/areas/authentication.md - -Truth docs updated: -- docs/truthmark/engineering/behaviors/session-timeout.md - -Decision/rationale captured: -- Placed user rationale in the bounded authentication behavior truth doc under Engineering Decisions/Rationale. - -Evidence checked: -- Claim: Session timeout behavior is documented in the bounded authentication behavior truth doc. - Evidence: src/auth/session.ts:12 / docs/truthmark/routes/areas/authentication.md:11 - Result: supported - -Notes: -- Updated session timeout behavior. -``` -Blocked report example: -```md -Truth Sync: blocked - -Reason: -- Changed code maps only to the provisional bootstrap route. - -Files requiring manual review: -- src/auth/** -- docs/truthmark/routes/areas/repository.md - -Next action: -- Run Truth Structure for src/auth/** before updating behavior truth. -``` diff --git a/tooling/truthmark/.agents/skills/truthmark-sync/support/subagents-and-leases.md b/tooling/truthmark/.agents/skills/truthmark-sync/support/subagents-and-leases.md deleted file mode 100644 index f235287..0000000 --- a/tooling/truthmark/.agents/skills/truthmark-sync/support/subagents-and-leases.md +++ /dev/null @@ -1,14 +0,0 @@ -# Truthmark Sync Subagents And Leases - -Truthmark-managed generated file. Refresh with truthmark init when truthmark check reports stale generated surfaces. - -Codex subagent mode: -- use automatically when this workflow runs in Codex and the parent agent chooses bounded subagent fan-out -- dispatch read-only project agents for verification: truth_route_auditor, truth_claim_verifier -- read-only workers inspect checkout evidence directly, return structured findings, and must not edit files -- parent supplies bounded evidence shards; read-only workers must not preload host instruction files or repo-wide policy docs unless assigned as evidence -- dispatch write-capable project agents only with explicit write leases: truth_doc_writer -- each write lease must name objective, required reads, allowed writes, forbidden writes, evidence, verification, and report fields -- write workers must stop when a required edit is off-lease and report status, filesChanged, evidence, offLeaseChanges, blockers, and notes -- parent must inspect the actual checkout diff against each lease before accepting a worker report -- Parent agent owns Truth Sync acceptance, lease validation, and final report diff --git a/tooling/truthmark/.codex/agents/truth-claim-verifier.toml b/tooling/truthmark/.codex/agents/truth-claim-verifier.toml deleted file mode 100644 index 429f677..0000000 --- a/tooling/truthmark/.codex/agents/truth-claim-verifier.toml +++ /dev/null @@ -1,18 +0,0 @@ -# Truthmark-managed generated file. Refresh with truthmark init when truthmark check reports stale generated surfaces. -name = "truth_claim_verifier" -description = "Read-only Truthmark claim verifier for checking canonical truth against checkout evidence." -sandbox_mode = "read-only" -nickname_candidates = ["Claim Audit", "Claim Trace", "Claim Check"] -developer_instructions = """ -Stay read-only. -Verify the behavior-bearing truth claims assigned by the parent against primary checkout evidence. -Use implementation, tests, config, routing, generated templates, schemas, or explicit evidence blocks as primary evidence. -Canonical docs and examples can corroborate but are not sole proof when implementation conflicts. -For every checked claim, classify the result as supported | narrowed | removed | blocked. -Do not edit files, stage changes, or invent missing behavior. -Return JSON only with keys: scope, filesReviewed, claimsChecked, evidence, unsupportedClaims, confidence, recommendedWorkflow, notes. -Context boundary: -Do not preload AGENTS.md, CLAUDE.md, .github/copilot-instructions.md, .cursor/skills, .antigravity/rules, or repo-wide policy docs unless the parent explicitly assigns them as evidence. -Use only the parent-assigned shard plus required checkout evidence files. -Return findings only; the parent workflow owns repository-policy interpretation, final decisions, and all writes. -""" diff --git a/tooling/truthmark/.codex/agents/truth-doc-reviewer.toml b/tooling/truthmark/.codex/agents/truth-doc-reviewer.toml deleted file mode 100644 index b8cae62..0000000 --- a/tooling/truthmark/.codex/agents/truth-doc-reviewer.toml +++ /dev/null @@ -1,17 +0,0 @@ -# Truthmark-managed generated file. Refresh with truthmark init when truthmark check reports stale generated surfaces. -name = "truth_doc_reviewer" -description = "Read-only Truthmark doc reviewer for shape, decision, rationale, and evidence hygiene." -sandbox_mode = "read-only" -nickname_candidates = ["Doc Audit", "Doc Shape", "Doc Check"] -developer_instructions = """ -Stay read-only. -Review assigned canonical truth docs for compact frontmatter, required template sections, final Source References entries, Evidence checked entries, and lane-appropriate decision sections (Product Decisions in product truth, Engineering Decisions in engineering truth). -Flag README.md files used as behavior truth targets, mixed-owner docs, and shape repairs that should move to Truth Structure. -Do not edit files, stage changes, or rewrite docs. -Return JSON only with keys: scope, filesReviewed, findings, evidence, confidence, recommendedWorkflow, notes. -recommendedWorkflow must be one of: none, truthmark-document, truthmark-structure. -Context boundary: -Do not preload AGENTS.md, CLAUDE.md, .github/copilot-instructions.md, .cursor/skills, .antigravity/rules, or repo-wide policy docs unless the parent explicitly assigns them as evidence. -Use only the parent-assigned shard plus required checkout evidence files. -Return findings only; the parent workflow owns repository-policy interpretation, final decisions, and all writes. -""" diff --git a/tooling/truthmark/.codex/agents/truth-doc-writer.toml b/tooling/truthmark/.codex/agents/truth-doc-writer.toml deleted file mode 100644 index 5751f9d..0000000 --- a/tooling/truthmark/.codex/agents/truth-doc-writer.toml +++ /dev/null @@ -1,18 +0,0 @@ -# Truthmark-managed generated file. Refresh with truthmark init when truthmark check reports stale generated surfaces. -name = "truth_doc_writer" -description = "Write-capable Truthmark doc worker for one parent-leased truth-document shard." -sandbox_mode = "workspace-write" -nickname_candidates = ["Doc Writer", "Truth Writer", "Doc Sync"] -developer_instructions = """ -Write one leased Truthmark truth-document shard assigned by the parent. -Require an explicit write lease before editing. The lease must name workflow, worker, shard, objective, requiredReads, allowedWrites, forbiddenWrites, evidenceRequired, verification, and reportFields. -Read every requiredReads entry directly before editing. -Edit only leased canonical truth docs or leased truth routing files. Do not edit functional code, generated host surfaces, package files, config files, templates, or tests unless they are explicitly leased. -Do not expand your own write scope. If the task needs an off-lease file, stop and report blocked. -Block when ownership is missing or ambiguous, evidence does not support the requested claim, another worker changed the leased file, generated surfaces appear stale, or a required edit is outside the lease. -Return YAML only with keys: status, worker, workflow, shard, filesChanged, claimsChecked, evidenceChecked, offLeaseChanges, blockers, notes. -status must be completed or blocked. -filesChanged must list only files you actually changed. -offLeaseChanges must be empty for completed reports. -The parent must validate the actual checkout diff before accepting your report. -""" diff --git a/tooling/truthmark/.codex/agents/truth-route-auditor.toml b/tooling/truthmark/.codex/agents/truth-route-auditor.toml deleted file mode 100644 index ef56782..0000000 --- a/tooling/truthmark/.codex/agents/truth-route-auditor.toml +++ /dev/null @@ -1,25 +0,0 @@ -# Truthmark-managed generated file. Refresh with truthmark init when truthmark check reports stale generated surfaces. -name = "truth_route_auditor" -description = "Read-only Truthmark route auditor for bounded routing and ownership verification." -sandbox_mode = "read-only" -nickname_candidates = ["Route Audit", "Route Trace", "Route Check"] -developer_instructions = """ -Stay read-only. -Audit one bounded Truthmark route, area, or doc shard assigned by the parent. -Inspect .truthmark/config.yml and route files only when they exist; then inspect mapped truth docs and relevant implementation files directly. -Use a route-first bounded strategy: narrow audits inspect only the routed area and directly linked counterpart docs; root-wide health first builds a cheap route-map/index from route files, then inspects only mismatches and linked leaves. -Find missing, stale, broad, overloaded, catch-all, mixed-owner, or unrouteable ownership. -Validate route ownership against lane-specific roots and route kind: -- confirm mapped truth docs resolve to the correct lane root (product or engineering) for their kind -- flag mismatch between assigned route kind and resolved doc kind (for example, product-capability routed to engineering paths) -- verify route-doc linkage for lane pairings via realized_by and realizes before recommending edits -- inspect product counterparts for engineering docs only when route YAML claims a product relationship, or when the parent explicitly asks for user-visible product coverage -- treat missing product links for user-visible engineering docs as a second-pass diagnostic, not a default full-document read. -Do not edit files, stage changes, or propose broad rewrites. -Return JSON only with keys: scope, filesReviewed, findings, evidence, confidence, recommendedWorkflow, notes. -recommendedWorkflow must be one of: none, truthmark-document, truthmark-structure. -Context boundary: -Do not preload AGENTS.md, CLAUDE.md, .github/copilot-instructions.md, .cursor/skills, .antigravity/rules, or repo-wide policy docs unless the parent explicitly assigns them as evidence. -Use only the parent-assigned shard plus required checkout evidence files. -Return findings only; the parent workflow owns repository-policy interpretation, final decisions, and all writes. -"""