From 5f07b7be29c94ea364004d68d05510bb54e3eb61 Mon Sep 17 00:00:00 2001 From: Ross Gardler Date: Sun, 11 Jan 2026 22:22:33 -0800 Subject: [PATCH 1/2] ci: add validate-story workflow to run CLI on PRs and main --- .beads/issues.jsonl | 1 + .github/workflows/validate-story.yml | 28 ++++++++++++++++++++++++++++ 2 files changed, 29 insertions(+) create mode 100644 .github/workflows/validate-story.yml diff --git a/.beads/issues.jsonl b/.beads/issues.jsonl index 24b5d850..23db4a7e 100644 --- a/.beads/issues.jsonl +++ b/.beads/issues.jsonl @@ -78,6 +78,7 @@ {"id":"ge-hch.3.2","title":"Feature: Stable story integration","description":"Ensure the stable demo story is the fallback and is packaged alongside generated stories.\\n\\n## Acceptance Criteria\\n- Stable story present at web/stories/demo.ink and referenced by README/manifest.\\n- Playwright and unit tests pass using stable story.\\n\\n## Minimal Implementation\\n- Confirm location and update docs/InkJS_README.md to document the stable story and how to swap in generated ones.\\n","status":"open","priority":2,"issue_type":"feature","assignee":"Build","created_at":"2026-01-07T19:42:28.644251263-08:00","created_by":"rgardler","updated_at":"2026-01-07T23:50:07.643688233-08:00","dependencies":[{"issue_id":"ge-hch.3.2","depends_on_id":"ge-hch.3","type":"parent-child","created_at":"2026-01-07T19:42:28.64606758-08:00","created_by":"rgardler"},{"issue_id":"ge-hch.3.2","depends_on_id":"ge-hch.3.4","type":"blocks","created_at":"2026-01-07T19:45:49.82618952-08:00","created_by":"rgardler"}],"comments":[{"id":30,"issue_id":"ge-hch.3.2","author":"rgardler","text":"Inspected smoke implementation: web/demo/js/smoke.js implements the Smoke runtime used by the demo.\n\nSummary:\n- API: window.Smoke.trigger({duration, intensity}), window.Smoke.getState(), window.Smoke.loadState(state), window.Smoke.resize()\n- Emits a CustomEvent 'smoke_state' with { running, durationMs, remainingMs, intensity } and provides getState() for test assertions.\n- Includes a no-canvas fallback exposing the same API (returns running:false).\n- Inktrunner (web/demo/js/inkrunner.js) calls Smoke.trigger on the 'smoke' tag and reads/getState for save/load; Playwright tests assert smoke events/state.\n\nFiles read during inspection:\n- web/demo/js/smoke.js\n- web/demo/js/inkrunner.js\n- web/stories/demo.ink\n- tests/demo.telemetry.spec.ts\n- docs/InkJS_README.md\n\nRemaining follow-ups (from ge-hch.3.2): add docs section, add stable E2E test that uses the real demo.ink, and implement scripts/validate-story.js (ge-hch.3.4) to enforce .ink parsing/runtime in CI.\n","created_at":"2026-01-08T07:02:16Z"},{"id":31,"issue_id":"ge-hch.3.2","author":"rgardler","text":"Status update (corrected): mapping ge-hch.3.2 to acceptance criteria and next actions\n\nSummary — current status vs acceptance criteria:\n\nImplemented (present in repo):\n- Stable demo story file: web/stories/demo.ink is present and readable.\n- Demo runtime and UI: web/demo/js/inkrunner.js loads/compiles the Ink story, advances choices, emits telemetry events, and integrates with the Smoke runtime.\n- Smoke runtime: web/demo/js/smoke.js provides window.Smoke.trigger/getState/loadState and emits 'smoke_state' events (useful for tests).\n- Demo page and vendored ink: web/demo/index.html and web/demo/vendor/ink.js exist and are used by the runner.\n- CI job that runs Playwright E2E exists (.github/workflows/playwright.yml) and package.json contains test:demo which serves web/ and runs Playwright.\n\nMissing / outstanding (blocks ge-hch.3.2 acceptance):\n1) Docs (ge-hch.3.2.1) — Required: add a dedicated \"Stable story \u0026 swap workflow\" section to docs/InkJS_README.md that clearly states the canonical location (web/stories/demo.ink), file layout expectations (server root or web/ must expose /stories/demo.ink), example commands to swap in a generated story, and instructions to run the validation tool (scripts/validate-story.js).\n - Status: OPEN\n - Acceptance: docs/InkJS_README.md updated with the section and example commands.\n\n2) Stable E2E test (ge-hch.3.2.2) — Required: add a Playwright spec that runs the actual, bundled demo story (no route replacement) and asserts telemetry and Smoke behavior (story_start, smoke_triggered, choice_selected, story_complete; assert Smoke state or emitted 'smoke_state').\n - Status: OPEN\n - Acceptance: tests/demo.stable.spec.ts exists and passes locally (npm run test:demo).\n - Note: existing tests (e.g., tests/demo.telemetry.spec.ts) intercept web/stories/demo.ink and replace it with test.ink. The new test must *not* intercept so it exercises the repo’s demo.ink.\n\n3) Story validation tool \u0026 CI enforcement (ge-hch.3.4) — Required: scripts/validate-story.js that parses .ink with InkJS and performs a minimal runtime smoke; CI should run it against web/stories/*.ink before E2E tests.\n - Status: OPEN (blocking for robust CI enforcement)\n - Acceptance: scripts/validate-story.js exists and CI runs it against web/stories/*.ink; exits non-zero on parse/runtime failure.\n\nFiles inspected during this review (read-only):\n- web/stories/demo.ink\n- web/stories/test.ink\n- web/demo/index.html\n- web/demo/js/inkrunner.js\n- web/demo/js/smoke.js\n- web/demo/js/telemetry.js\n- web/demo/vendor/ink.js\n- docs/InkJS_README.md\n- package.json\n- .github/workflows/playwright.yml\n- tests/demo.telemetry.spec.ts\n- tests/demo.smoke.spec.ts\n- config/waif_pacakges.yaml\n\nCommands executed during inspection (audit):\n- bd show ge-hch.3.2 --json\n- bd show ge-hch.3.2.1 --json\n- bd show ge-hch.3.2.2 --json\n- glob web/stories/**/*.ink\n- read web/stories/demo.ink\n- read web/demo/js/inkrunner.js\n- read web/demo/js/smoke.js\n- read docs/InkJS_README.md\n- read .github/workflows/playwright.yml\n- read package.json\n- read tests/demo.telemetry.spec.ts\n\nFiles created/edited/deleted while working this issue in this session: none\n\nVerification commands for implementers:\n- npm run test:demo # serves web/ and runs Playwright E2E\n- npx playwright test tests/demo.stable.spec.ts --config=playwright.config.ts # run the stable demo spec only\n- npm run test:unit\n\nRisks and notes:\n- CI currently does not parse/validate .ink files; without ge-hch.3.4 a swapped/generated story could break runtime and only be caught during E2E or post-merge.\n- Existing Playwright tests route/replace demo.ink for deterministic assertions; that masks whether the bundled demo.ink itself is valid under InkJS in CI. Add the stable E2E to guarantee the shipped story works.\n- Ensure server root used by test:demo exposes /stories/demo.ink; package.json currently runs http-server web which is appropriate if web/ contains stories/ (confirm if repo layout changes).\n\nRecommended immediate next actions (prioritized):\n1) Scribbler: update docs/InkJS_README.md with the Stable story section and swap workflow (P2). Mark ge-hch.3.2.1 in_progress when claimed.\n2) Probe: add tests/demo.stable.spec.ts (P2). Run locally and mark ge-hch.3.2.2 in_progress when claimed.\n3) Patch: implement scripts/validate-story.js and add a CI step to run it (P2, blocking for robustness). Link ge-hch.3.4 as a dependency for ge-hch.3.2.\n\nOffer: I can draft any of the following now — pick one and I’ll produce a ready-to-drop artifact:\n- A markdown snippet to add to docs/InkJS_README.md describing the stable story location and swap workflow.\n- A Playwright test (tests/demo.stable.spec.ts) that runs the actual demo.ink and asserts telemetry + Smoke state.\n- A starter scripts/validate-story.js that parses .ink files with InkJS and performs a minimal runtime check, plus a suggested CI step.\n\nIf you want me to post this as the issue comment now, I will.\n","created_at":"2026-01-08T07:17:22Z"}]} {"id":"ge-hch.3.2.1","title":"Docs: stable story \u0026 swap workflow","description":"Document where the stable story lives (web/stories/demo.ink), and how to swap in generated stories (file layout, manifest, and example command).\\n\\n## Acceptance Criteria\\n- docs/InkJS_README.md updated with stable story section and swap workflow.\\n- Example commands provided to swap stories and trigger validate-story.\\n","status":"open","priority":2,"issue_type":"task","assignee":"Scribbler","created_at":"2026-01-07T19:42:48.733218318-08:00","created_by":"rgardler","updated_at":"2026-01-07T23:46:34.802463503-08:00","dependencies":[{"issue_id":"ge-hch.3.2.1","depends_on_id":"ge-hch.3.2","type":"parent-child","created_at":"2026-01-07T19:42:48.735196919-08:00","created_by":"rgardler"}]} {"id":"ge-hch.3.2.2","title":"Tests: stable story sanity test","description":"Add a Playwright test that runs the stable demo story and asserts completion and telemetry emissions.\\n\\n## Acceptance Criteria\\n- tests/demo.stable.spec.ts exists and passes locally.\\n","status":"open","priority":2,"issue_type":"task","assignee":"Probe","created_at":"2026-01-07T19:42:51.060849315-08:00","created_by":"rgardler","updated_at":"2026-01-07T23:46:34.8586792-08:00","dependencies":[{"issue_id":"ge-hch.3.2.2","depends_on_id":"ge-hch.3.2","type":"parent-child","created_at":"2026-01-07T19:42:51.062074565-08:00","created_by":"rgardler"}]} +{"id":"ge-hch.3.2.3","title":"Implement: add stable demo story (web/stories/demo.ink)","status":"in_progress","priority":1,"issue_type":"feature","assignee":"patch","created_at":"2026-01-11T22:00:53.030258551-08:00","created_by":"rgardler","updated_at":"2026-01-11T22:04:23.26992299-08:00","dependencies":[{"issue_id":"ge-hch.3.2.3","depends_on_id":"ge-hch.3.2","type":"parent-child","created_at":"2026-01-11T22:00:53.040321356-08:00","created_by":"rgardler"}],"comments":[{"id":49,"issue_id":"ge-hch.3.2.3","author":"rgardler","text":"Added stable demo story at web/stories/demo.ink (short deterministic path with story_start, choice_selected, story_complete tags and #smoke cue). Added validate-story integration coverage (tests/validate-story/demo.story.test.js) to ensure it passes. Ran npm ci \u0026\u0026 npm test (all tests pass).","created_at":"2026-01-12T06:11:29Z"},{"id":50,"issue_id":"ge-hch.3.2.3","author":"rgardler","text":"Experiment: Removed #choice_selected tags from web/stories/demo.ink to verify runtime telemetry still emits choice_selected events. Branch: feature/ge-hch.3.2/no-choice-tags. PR (draft): https://github.com/TheWizardsCode/GEngine/pull/114. Results: npm ci; npm test (unit + Playwright demo) passed. Playwright logs show telemetry wait succeeded for 'choice_selected'; console telemetry logs observed (story_start, choice_selected, smoke_triggered, story_complete). validate-story CLI: node scripts/validate-story.js --story web/stories/demo.ink --output stdout --state-file /tmp/validate-state.json =\u003e exit 0, pass true. No content tags needed for telemetry emission.","created_at":"2026-01-12T06:21:16Z"}]} {"id":"ge-hch.3.3","title":"Implement: GitHub Pages deploy for static demo","description":"Add GitHub Actions workflow to deploy web/demo static output to GitHub Pages (branch or docs/).\\n\\n## Acceptance Criteria\\n- .github/workflows/gh-pages.yml exists to build (if needed) and deploy web/demo to GitHub Pages.\\n- Docs updated describing how to access the pages URL.\\n","notes":"PRs #106, #107, #108 merged; Pages live with web/ root landing. Follow-up: ge-2b0 (Ship) to limit Playwright on main.","status":"closed","priority":2,"issue_type":"task","assignee":"rgardler","created_at":"2026-01-07T19:42:31.306809853-08:00","created_by":"rgardler","updated_at":"2026-01-08T01:53:01.787074738-08:00","closed_at":"2026-01-08T01:53:01.787083938-08:00","external_ref":"https://github.com/TheWizardsCode/GEngine/pull/108","labels":["Status: PR Created"],"dependencies":[{"issue_id":"ge-hch.3.3","depends_on_id":"ge-hch.3","type":"parent-child","created_at":"2026-01-07T19:42:31.307589419-08:00","created_by":"rgardler"}]} {"id":"ge-hch.3.4","title":"Tool: validate-story (ink parse + runtime smoke)","description":"Create a validate-story script that ensures any .ink file parses under InkJS and that the runtime can reach first choice. Used in CI for generated/stable stories.\\n\\n## Acceptance Criteria\\n- scripts/validate-story.js exists and exits non-zero on parse/runtime failure.\\n- CI hook runs this script against web/stories/*.ink.\\n","status":"closed","priority":2,"issue_type":"task","assignee":"rgardler","created_at":"2026-01-07T19:42:33.606187788-08:00","created_by":"rgardler","updated_at":"2026-01-11T20:22:00.562685368-08:00","closed_at":"2026-01-11T20:22:00.562685368-08:00","close_reason":"Implementation merged; closing per Patch","labels":["Status: Plan Created"],"dependencies":[{"issue_id":"ge-hch.3.4","depends_on_id":"ge-hch.3","type":"parent-child","created_at":"2026-01-07T19:42:33.609684247-08:00","created_by":"rgardler"}],"comments":[{"id":33,"issue_id":"ge-hch.3.4","author":"rgardler","text":"Created scoped implementation tasks for validate-story and linked them as children: ge-hch.3.4.5 (Implement: validate-story CLI core), ge-hch.3.4.6 (Tests: validate-story core), ge-hch.3.4.7 (Docs+CI: validate-story workflow \u0026 usage). No repo files were edited in this step. Next recommended actions: 1) Patch to implement scripts/validate-story.js on branch feature/ge-hch.3.4-validate; 2) Probe to add tests under tests/validate-story; 3) Scribbler to draft docs and Ship to add .github/workflows/validate-story.yml. See beads for acceptance criteria and dependencies.","created_at":"2026-01-08T10:21:32Z"},{"id":34,"issue_id":"ge-hch.3.4","author":"rgardler","text":"Examined current state for ge-hch.3.4: \\n- Issue status: in_progress (Plan created).\\n- Description/acceptance criteria present: scripts/validate-story.js must exit non-zero on parse/runtime failure; CI hook to run against web/stories/*.ink.\\n- Children/tasks created: ge-hch.3.4.1 (CLI core), .3.4.2 (path rotation \u0026 persistence), .3.4.3 (CI gate), .3.4.4 (Docs \u0026 fixtures), .3.4.5 (Implement CLI core - priority 1), .3.4.6 (Tests - priority 1), .3.4.7 (Docs+CI chore). All children are open.\\n- Assignee: rgardler on parent; implementation tasks unassigned or assigned to Patch/Probe per comment.\\n- Repo changes: none so far (no files edited).\\n\\nNext recommended actions (handoff):\\n1) Patch: implement scripts/validate-story.js on branch feature/ge-hch.3.4-validate (acceptance = ge-hch.3.4.1 ACs).\\n2) Probe: add tests under tests/validate-story (ge-hch.3.4.6).\\n3) Ship: add .github/workflows/validate-story.yml and ensure it runs before Playwright (ge-hch.3.4.3).\\n4) Scribbler: add docs/fixtures describing usage and state format (ge-hch.3.4.4 \u0026 .7).\\n\\nRisks/blockers: inkjs availability in CI, ensuring deterministic path-rotation without exhausting alternatives, and coordinating CI trigger to run only on non-markdown changes.\\n\\nCommands run during this review: # In Progress\n\nID Type / Status / Title Priority Blockers Blocks Assignee\n---------- ------------------------------------------------------------ -------- -------- ------ --------\nge-hch.3 🗺️ 🚧 M1 — MVP: Ink runtime + UI + save/load + telemetry +… 1 0 7 Build \n Children\n ID Type / Status / Title Priority Blockers Blocks Assignee\n ---------- ------------------------------------------------------------ -------- -------- ------ --------\n ge-hch.3.2 ❓ ⭕ Feature: Stable story integration 2 0 0 Build \n ge-hch.3.4 ❓ 🚧 Tool: validate-story (ink parse + runtime smoke) 2 0 0 rgardler\n ge-hch.3.5 ❓ ⭕ Implement: package.json scripts (start/build/validate/t… 2 0 0 patch \n ge-hch.3.6 ❓ ⭕ CI: Build + validate + Playwright (PR) 2 0 0 Ship \n\nge-hch.3.4 🧩 🚧 Tool: validate-story (ink parse + runtime smoke) 2 0 11 rgardler\n Children\n ID Type / Status / Title Priority Blockers Blocks Assignee\n ------------ -------------------------------------------- -------- -------- ------ --------\n ge-hch.3.4.1 ❓ ⭕ Validate CLI core (parse + walk) 2 0 0 \n ge-hch.3.4.2 ❓ ⭕ Path rotation \u0026 persistence 2 0 0 \n ge-hch.3.4.3 ❓ ⭕ CI: validate-story gate 2 0 0 \n ge-hch.3.4.4 ❓ ⭕ Docs \u0026 fixtures for validate-story 2 0 0 \n ge-hch.3.4.5 ❓ ⭕ Implement: validate-story CLI core 1 0 0 \n ge-hch.3.4.6 ❓ ⭕ Tests: validate-story core 1 0 0 \n ge-hch.3.4.7 ❓ ⭕ Docs+CI: validate-story workflow \u0026 usage 2 0 0, [\n {\n \"id\": \"ge-hch.3.4\",\n \"title\": \"Tool: validate-story (ink parse + runtime smoke)\",\n \"description\": \"Create a validate-story script that ensures any .ink file parses under InkJS and that the runtime can reach first choice. Used in CI for generated/stable stories.\\\\n\\\\n## Acceptance Criteria\\\\n- scripts/validate-story.js exists and exits non-zero on parse/runtime failure.\\\\n- CI hook runs this script against web/stories/*.ink.\\\\n\",\n \"status\": \"in_progress\",\n \"priority\": 2,\n \"issue_type\": \"task\",\n \"assignee\": \"rgardler\",\n \"created_at\": \"2026-01-07T19:42:33.606187788-08:00\",\n \"created_by\": \"rgardler\",\n \"updated_at\": \"2026-01-08T01:57:17.075526965-08:00\",\n \"labels\": [\n \"Status: Plan Created\"\n ],\n \"dependencies\": [\n {\n \"id\": \"ge-hch.3\",\n \"title\": \"M1 — MVP: Ink runtime + UI + save/load + telemetry + demo story\",\n \"description\": \"M1 — MVP: Ink runtime + UI + save/load + telemetry + 1 demo story\\\\n\\\\nDeliver a playable text-only interactive novel using InkJS at runtime with branching choices, single-slot save/load, runtime telemetry, and at least one AI-generated demo story.\\\\n\\\\nSuccess criteria: runtime story end-to-end with no fatal errors; player choice selection; save/load demonstrable; telemetry events emitted; AI demo story included.\",\n \"status\": \"in_progress\",\n \"priority\": 1,\n \"issue_type\": \"epic\",\n \"assignee\": \"Build\",\n \"created_at\": \"2026-01-07T17:24:00.942344426-08:00\",\n \"created_by\": \"rgardler\",\n \"updated_at\": \"2026-01-07T23:50:28.2463118-08:00\",\n \"labels\": [\n \"Status: Implementation Committed\",\n \"Status: Plan Created\",\n \"milestone\"\n ],\n \"dependency_type\": \"parent-child\"\n }\n ],\n \"dependents\": [\n {\n \"id\": \"ge-hch.3.4.5\",\n \"title\": \"Implement: validate-story CLI core\",\n \"status\": \"open\",\n \"priority\": 1,\n \"issue_type\": \"feature\",\n \"created_at\": \"2026-01-08T02:21:24.563632618-08:00\",\n \"created_by\": \"rgardler\",\n \"updated_at\": \"2026-01-08T02:21:24.563632618-08:00\",\n \"dependency_type\": \"parent-child\"\n },\n {\n \"id\": \"ge-hch.3.4.6\",\n \"title\": \"Tests: validate-story core\",\n \"status\": \"open\",\n \"priority\": 1,\n \"issue_type\": \"task\",\n \"created_at\": \"2026-01-08T02:21:24.619687557-08:00\",\n \"created_by\": \"rgardler\",\n \"updated_at\": \"2026-01-08T02:21:24.619687557-08:00\",\n \"dependency_type\": \"parent-child\"\n },\n {\n \"id\": \"ge-hch.3.2\",\n \"title\": \"Feature: Stable story integration\",\n \"description\": \"Ensure the stable demo story is the fallback and is packaged alongside generated stories.\\\\n\\\\n## Acceptance Criteria\\\\n- Stable story present at web/stories/demo.ink and referenced by README/manifest.\\\\n- Playwright and unit tests pass using stable story.\\\\n\\\\n## Minimal Implementation\\\\n- Confirm location and update docs/InkJS_README.md to document the stable story and how to swap in generated ones.\\\\n\",\n \"status\": \"open\",\n \"priority\": 2,\n \"issue_type\": \"feature\",\n \"assignee\": \"Build\",\n \"created_at\": \"2026-01-07T19:42:28.644251263-08:00\",\n \"created_by\": \"rgardler\",\n \"updated_at\": \"2026-01-07T23:50:07.643688233-08:00\",\n \"dependency_type\": \"blocks\"\n },\n {\n \"id\": \"ge-hch.3.6\",\n \"title\": \"CI: Build + validate + Playwright (PR)\",\n \"description\": \"Update CI workflows to run: npm build, scripts/validate-story against web/stories, package artifact, run Playwright E2E tests against built artifact, and (optionally) deploy to GitHub Pages on merge.\\\\n\\\\n## Acceptance Criteria\\\\n- .github/workflows/pr-ci.yml updated/added to run build + validate + Playwright on PRs.\\\\n- CI artifacts archived for Playwright runs and GitHub Pages deploy.\\\\n\",\n \"status\": \"open\",\n \"priority\": 2,\n \"issue_type\": \"task\",\n \"assignee\": \"Ship\",\n \"created_at\": \"2026-01-07T19:45:40.535363424-08:00\",\n \"created_by\": \"rgardler\",\n \"updated_at\": \"2026-01-07T23:46:35.086644546-08:00\",\n \"dependency_type\": \"blocks\"\n },\n {\n \"id\": \"ge-hch.4.1\",\n \"title\": \"Tool: replay harness (golden-path)\",\n \"description\": \"Add a headless replay harness that can drive a story to completion using scripted choices and record results.\\\\n\\\\n## Acceptance Criteria\\\\n- scripts/replay.js exists and can be fed a story + choice sequence and returns success/failure.\\\\n- Example golden-path script present for stable demo.\\\\n\",\n \"status\": \"open\",\n \"priority\": 2,\n \"issue_type\": \"task\",\n \"assignee\": \"Patch\",\n \"created_at\": \"2026-01-07T19:42:36.286010273-08:00\",\n \"created_by\": \"rgardler\",\n \"updated_at\": \"2026-01-07T23:49:04.685286732-08:00\",\n \"dependency_type\": \"blocks\"\n },\n {\n \"id\": \"ge-hch.5.1\",\n \"title\": \"Agent: Story Author (Ink)\",\n \"description\": \"Define and implement a Story Author agent that generates valid Ink (.ink) stories suitable for runtime execution and automated testing.\\\\n\\\\n## Acceptance Criteria\\\\n- Generates a .ink file that parses with InkJS with no fatal errors.\\\\n- Includes metadata manifest (title, author, prompt, version).\\\\n- Emits telemetry tags/Ink markers required by M1 (story_start, choice_selected, smoke_trigger).\\\\n- Output placed at web/stories/generated/\\u003cname\\u003e.ink and web/stories/generated/\\u003cname\\u003e.json.\\\\n\\\\n## Minimal Implementation\\\\n- Agent spec (history/ai/agent-story-author.md).\\\\n- Test harness that runs the agent, validates parse via InkJS, and runs the golden-path smoke test.\\\\n\\\\n## Dependencies\\\\n- Access to an OpenAI-compatible endpoint (configurable).\\\\n- inkjs runner \\u0026 test harness (existing).\\\\n\\\\n## Deliverables\\\\n- history/ai/agent-story-author.md, web/stories/generated/*, tests for validation.\\\\n\",\n \"status\": \"open\",\n \"priority\": 2,\n \"issue_type\": \"feature\",\n \"assignee\": \"Build\",\n \"created_at\": \"2026-01-07T19:37:54.162109871-08:00\",\n \"created_by\": \"rgardler\",\n \"updated_at\": \"2026-01-07T23:46:39.717890567-08:00\",\n \"dependency_type\": \"blocks\"\n },\n {\n \"id\": \"ge-hch.3.4.1\",\n \"title\": \"Validate CLI core (parse + walk)\",\n \"description\": \"## Summary\\\\nCLI validates .ink stories by parsing and auto-walking to completion with seedable choice selection.\\\\n\\\\n## Acceptance Criteria\\\\n- node scripts/validate-story.js exits non-zero on parse or runtime failure.\\\\n- Supports all stories under web/stories (glob).\\\\n- Auto-selects a choice each step; reachable end or max-steps enforcement.\\\\n- Emits structured result (pass/fail, path taken, steps count) to stdout/JSON.\\\\n- Supports seed input for deterministic runs.\\\\n\\\\n## Minimal Implementation\\\\n- InkJS load/compile wrapper for a given .ink file.\\\\n- Runner loop that advances story and chooses a choice per step.\\\\n- CLI flags: --story path, --seed, --max-steps, --output (json).\\\\n- Non-zero exit on any failure; zero on success.\\\\n\\\\n## Dependencies\\\\n- inkjs runtime available.\\\\n\\\\n## Deliverables\\\\n- scripts/validate-story.js with CLI.\\\\n- Example command in docs.\\\\n\\\\n## Tasks to create\\\\n- Implement, Tests, Docs.\",\n \"status\": \"open\",\n \"priority\": 2,\n \"issue_type\": \"feature\",\n \"created_at\": \"2026-01-08T02:13:30.11480307-08:00\",\n \"created_by\": \"rgardler\",\n \"updated_at\": \"2026-01-08T02:13:30.11480307-08:00\",\n \"labels\": [\n \"feature\"\n ],\n \"dependency_type\": \"parent-child\"\n },\n {\n \"id\": \"ge-hch.3.4.2\",\n \"title\": \"Path rotation \\u0026 persistence\",\n \"description\": \"## Summary\\\\nPersist last path per story and avoid repeating the same choice at a decision point on the next run (when alternatives exist).\\\\n\\\\n## Acceptance Criteria\\\\n- Stores last path taken per story (e.g., .validate-story-state.json).\\\\n- On next run, avoids the previously chosen choice index when \\u003e1 options exist at a decision.\\\\n- Deterministic fallback when only one choice.\\\\n- Exits non-zero if no alternative path remains.\\\\n- Logs chosen path; supports seedable selection.\\\\n\\\\n## Minimal Implementation\\\\n- Read/write state file keyed by story path.\\\\n- Decision hook that skips last-choice index when \\u003e1 options; bounded retry.\\\\n- Option to clear state.\\\\n\\\\n## Dependencies\\\\n- Validate CLI core.\\\\n\\\\n## Deliverables\\\\n- State file format doc.\\\\n- Logging of path taken.\\\\n\\\\n## Tasks to create\\\\n- Implement, Tests, Docs.\",\n \"status\": \"open\",\n \"priority\": 2,\n \"issue_type\": \"feature\",\n \"created_at\": \"2026-01-08T02:13:36.317351311-08:00\",\n \"created_by\": \"rgardler\",\n \"updated_at\": \"2026-01-08T02:13:36.317351311-08:00\",\n \"labels\": [\n \"feature\"\n ],\n \"dependency_type\": \"parent-child\"\n },\n {\n \"id\": \"ge-hch.3.4.3\",\n \"title\": \"CI: validate-story gate\",\n \"description\": \"## Summary\\\\nDedicated workflow to run validate-story on pushes/PRs when non-Markdown files change, before Playwright.\\\\n\\\\n## Acceptance Criteria\\\\n- New workflow triggers on push/PR and gates on non-Markdown diff.\\\\n- Runs npm ci and node scripts/validate-story.js across web/stories/**/*.ink.\\\\n- Fails job on validation failure.\\\\n- Runs before Playwright workflow (or as a prerequisite job).\\\\n\\\\n## Minimal Implementation\\\\n- .github/workflows/validate-story.yml with change detection.\\\\n- Matrix over stories or single pass over all files.\\\\n- Uploads logs/artifacts on failure.\\\\n\\\\n## Dependencies\\\\n- Validate CLI core.\\\\n\\\\n## Deliverables\\\\n- Workflow file and doc note.\\\\n\\\\n## Tasks to create\\\\n- Implement, Tests, Docs.\",\n \"status\": \"open\",\n \"priority\": 2,\n \"issue_type\": \"feature\",\n \"created_at\": \"2026-01-08T02:13:43.695830378-08:00\",\n \"created_by\": \"rgardler\",\n \"updated_at\": \"2026-01-08T02:13:43.695830378-08:00\",\n \"labels\": [\n \"feature\"\n ],\n \"dependency_type\": \"parent-child\"\n },\n {\n \"id\": \"ge-hch.3.4.4\",\n \"title\": \"Docs \\u0026 fixtures for validate-story\",\n \"description\": \"## Summary\\\\nDocument usage/options, path-rotation behavior, CI hook, and provide example outputs/fixtures.\\\\n\\\\n## Acceptance Criteria\\\\n- README/InkJS docs updated with validate-story usage, seed/rotation notes, CI hook description.\\\\n- Sample log/JSON output checked in (docs or fixtures).\\\\n- Notes on non-Markdown gating behavior in CI.\\\\n\\\\n## Minimal Implementation\\\\n- Doc section with commands and options.\\\\n- Example output snippet (JSON) and explanation of state file.\\\\n- Reference to CI workflow and how to clear state.\\\\n\\\\n## Dependencies\\\\n- Validate CLI core, Path rotation.\\\\n\\\\n## Deliverables\\\\n- Docs update + example fixture/log.\\\\n\\\\n## Tasks to create\\\\n- Implement, Tests, Docs.\",\n \"status\": \"open\",\n \"priority\": 2,\n \"issue_type\": \"feature\",\n \"created_at\": \"2026-01-08T02:13:52.56971808-08:00\",\n \"created_by\": \"rgardler\",\n \"updated_at\": \"2026-01-08T02:13:52.56971808-08:00\",\n \"labels\": [\n \"feature\"\n ],\n \"dependency_type\": \"parent-child\"\n },\n {\n \"id\": \"ge-hch.3.4.7\",\n \"title\": \"Docs+CI: validate-story workflow \\u0026 usage\",\n \"status\": \"open\",\n \"priority\": 2,\n \"issue_type\": \"chore\",\n \"created_at\": \"2026-01-08T02:21:24.685539352-08:00\",\n \"created_by\": \"rgardler\",\n \"updated_at\": \"2026-01-08T02:21:24.685539352-08:00\",\n \"dependency_type\": \"parent-child\"\n }\n ],\n \"comments\": [\n {\n \"id\": 33,\n \"issue_id\": \"ge-hch.3.4\",\n \"author\": \"rgardler\",\n \"text\": \"Created scoped implementation tasks for validate-story and linked them as children: ge-hch.3.4.5 (Implement: validate-story CLI core), ge-hch.3.4.6 (Tests: validate-story core), ge-hch.3.4.7 (Docs+CI: validate-story workflow \\u0026 usage). No repo files were edited in this step. Next recommended actions: 1) Patch to implement scripts/validate-story.js on branch feature/ge-hch.3.4-validate; 2) Probe to add tests under tests/validate-story; 3) Scribbler to draft docs and Ship to add .github/workflows/validate-story.yml. See beads for acceptance criteria and dependencies.\",\n \"created_at\": \"2026-01-08T10:21:32Z\"\n }\n ],\n \"parent\": \"ge-hch.3\"\n }\n]. No files were edited.","created_at":"2026-01-09T04:25:18Z"},{"id":37,"issue_id":"ge-hch.3.4","author":"rgardler","text":"ge-hch.3.4.5 implemented (patch). PR: https://github.com/TheWizardsCode/GEngine/pull/new/feature/ge-hch.3.4-validate — next: Probe to review tests and Ship to add CI workflow.","created_at":"2026-01-09T04:59:48Z"},{"id":42,"issue_id":"ge-hch.3.4","author":"rgardler","text":"Probe completed tests (ge-hch.3.4.6). PR: https://github.com/TheWizardsCode/GEngine/pull/110","created_at":"2026-01-09T05:16:24Z"},{"id":44,"issue_id":"ge-hch.3.4","author":"rgardler","text":"Summary: validate-story implementation and tests are present and passing locally. Next actions: (1) add CI workflow to run scripts/validate-story.js against web/stories/**/*.ink (ge-hch.3.4.3, assignee=Ship), (2) add docs/usage and fixtures (ge-hch.3.4.4, assignee=Scribbler), (3) implement path-rotation + persistence (ge-hch.3.4.2, assignee=Patch), and (4) gate PR CI to run validate-story before Playwright (ge-hch.3.4.3). Build can draft the CI workflow and docs if desired — reply which to prepare now. For each action, include acceptance criteria and an implementation owner. Current files referenced during inspection: scripts/validate-story.js, tests/validate-story/*, tests/fixtures/*, docs/InkJS_README.md.","created_at":"2026-01-12T04:16:51Z"},{"id":45,"issue_id":"ge-hch.3.4","author":"rgardler","text":"Patch complete: validate-story implementation merged and tests added. Files touched: scripts/validate-story.js; tests/validate-story/validate-story.test.js; tests/validate-story/validate-story.integration.test.js; tests/fixtures/{valid.ink,invalid.ink,runtime_err.ink}; package.json; package-lock.json; jest.config.js; docs/InkJS_README.md. Acceptance: CLI exits non-zero on parse/runtime failures; unit+integration tests pass locally. Remaining follow-ups (left open or for future work): ge-hch.3.4.2 (path rotation \u0026 persistence), ge-hch.3.4.3 (CI gate), ge-hch.3.4.4 (Docs \u0026 fixtures). Closing ge-hch.3.4 as implementation complete per Patch.","created_at":"2026-01-12T04:21:54Z"}]} {"id":"ge-hch.3.4.1","title":"Validate CLI core (parse + walk)","description":"## Summary\\nCLI validates .ink stories by parsing and auto-walking to completion with seedable choice selection.\\n\\n## Acceptance Criteria\\n- node scripts/validate-story.js exits non-zero on parse or runtime failure.\\n- Supports all stories under web/stories (glob).\\n- Auto-selects a choice each step; reachable end or max-steps enforcement.\\n- Emits structured result (pass/fail, path taken, steps count) to stdout/JSON.\\n- Supports seed input for deterministic runs.\\n\\n## Minimal Implementation\\n- InkJS load/compile wrapper for a given .ink file.\\n- Runner loop that advances story and chooses a choice per step.\\n- CLI flags: --story path, --seed, --max-steps, --output (json).\\n- Non-zero exit on any failure; zero on success.\\n\\n## Dependencies\\n- inkjs runtime available.\\n\\n## Deliverables\\n- scripts/validate-story.js with CLI.\\n- Example command in docs.\\n\\n## Tasks to create\\n- Implement, Tests, Docs.","status":"open","priority":2,"issue_type":"feature","created_at":"2026-01-08T02:13:30.11480307-08:00","created_by":"rgardler","updated_at":"2026-01-08T02:13:30.11480307-08:00","labels":["feature"],"dependencies":[{"issue_id":"ge-hch.3.4.1","depends_on_id":"ge-hch.3.4","type":"parent-child","created_at":"2026-01-08T02:13:30.122822123-08:00","created_by":"rgardler"}]} diff --git a/.github/workflows/validate-story.yml b/.github/workflows/validate-story.yml new file mode 100644 index 00000000..bc8ab4ce --- /dev/null +++ b/.github/workflows/validate-story.yml @@ -0,0 +1,28 @@ +name: Validate stories + +on: + pull_request: + paths: + - 'web/stories/**' + - 'scripts/validate-story.js' + - 'package.json' + push: + branches: + - main + paths-ignore: + - 'docs/**' + +jobs: + validate-story: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: 18 + - name: Install dependencies + run: npm ci + - name: Run validate-story + run: | + node scripts/validate-story.js --glob "web/stories/**/*.ink" --output json --max-steps 2000 From c54d3647976061d93bd7f14a79f44e8cbacc738c Mon Sep 17 00:00:00 2001 From: Ross Gardler Date: Sun, 11 Jan 2026 22:22:40 -0800 Subject: [PATCH 2/2] bd sync: 2026-01-11 22:22:40 --- .beads/issues.jsonl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.beads/issues.jsonl b/.beads/issues.jsonl index 23db4a7e..7d36c7e4 100644 --- a/.beads/issues.jsonl +++ b/.beads/issues.jsonl @@ -87,7 +87,7 @@ {"id":"ge-hch.3.4.4","title":"Docs \u0026 fixtures for validate-story","description":"## Summary\\nDocument usage/options, path-rotation behavior, CI hook, and provide example outputs/fixtures.\\n\\n## Acceptance Criteria\\n- README/InkJS docs updated with validate-story usage, seed/rotation notes, CI hook description.\\n- Sample log/JSON output checked in (docs or fixtures).\\n- Notes on non-Markdown gating behavior in CI.\\n\\n## Minimal Implementation\\n- Doc section with commands and options.\\n- Example output snippet (JSON) and explanation of state file.\\n- Reference to CI workflow and how to clear state.\\n\\n## Dependencies\\n- Validate CLI core, Path rotation.\\n\\n## Deliverables\\n- Docs update + example fixture/log.\\n\\n## Tasks to create\\n- Implement, Tests, Docs.","status":"open","priority":2,"issue_type":"feature","created_at":"2026-01-08T02:13:52.56971808-08:00","created_by":"rgardler","updated_at":"2026-01-08T02:13:52.56971808-08:00","labels":["feature"],"dependencies":[{"issue_id":"ge-hch.3.4.4","depends_on_id":"ge-hch.3.4","type":"parent-child","created_at":"2026-01-08T02:13:52.571169285-08:00","created_by":"rgardler"},{"issue_id":"ge-hch.3.4.4","depends_on_id":"ge-hch.3.4.1","type":"blocks","created_at":"2026-01-08T02:14:22.124404224-08:00","created_by":"rgardler"}]} {"id":"ge-hch.3.4.5","title":"Implement: validate-story CLI core","status":"closed","priority":1,"issue_type":"feature","assignee":"patch","created_at":"2026-01-08T02:21:24.563632618-08:00","created_by":"rgardler","updated_at":"2026-01-08T21:00:15.89384788-08:00","closed_at":"2026-01-08T21:00:15.89385635-08:00","dependencies":[{"issue_id":"ge-hch.3.4.5","depends_on_id":"ge-hch.3.4","type":"parent-child","created_at":"2026-01-08T02:21:24.565684562-08:00","created_by":"rgardler"}],"comments":[{"id":35,"issue_id":"ge-hch.3.4.5","author":"rgardler","text":"patch starting implementation on branch feature/ge-hch.3.4-validate","created_at":"2026-01-09T04:35:37Z"},{"id":36,"issue_id":"ge-hch.3.4.5","author":"rgardler","text":"patch complete: implemented validate-story CLI and unit tests. Files: scripts/validate-story.js, tests/validate-story/validate-story.test.js, tests/fixtures/valid.ink, tests/fixtures/invalid.ink, package.json, package-lock.json, jest.config.js. PR: https://github.com/TheWizardsCode/GEngine/pull/new/feature/ge-hch.3.4-validate","created_at":"2026-01-09T04:59:47Z"}]} {"id":"ge-hch.3.4.6","title":"Tests: validate-story core","status":"closed","priority":1,"issue_type":"task","assignee":"probe","created_at":"2026-01-08T02:21:24.619687557-08:00","created_by":"rgardler","updated_at":"2026-01-08T21:16:23.078380551-08:00","closed_at":"2026-01-08T21:16:23.078386601-08:00","dependencies":[{"issue_id":"ge-hch.3.4.6","depends_on_id":"ge-hch.3.4","type":"parent-child","created_at":"2026-01-08T02:21:24.621293235-08:00","created_by":"rgardler"}],"comments":[{"id":38,"issue_id":"ge-hch.3.4.6","author":"rgardler","text":"Probe: please review the new validate-story unit tests and expand them to include integration-style scenarios and edge-cases. Goals:\\n- Verify parse failures, runtime failures, deterministic seeded paths, and state rotation behavior.\\n- Add tests that run the CLI against multiple stories (including web/stories/demo.ink if present) and assert expected pass/fail outcomes.\\n- Add tests covering state persistence and path rotation: ensure subsequent runs avoid last-choice index when alternatives exist.\\n- Use the existing tests/fixtures and add new fixtures as needed under tests/fixtures/validate-story/.\\n\\nContext: scripts/validate-story.js implemented and PR opened: https://github.com/TheWizardsCode/GEngine/pull/109. Patch has added tests/validate-story.test.js and fixtures (valid.ink, invalid.ink). Please update bd when complete.","created_at":"2026-01-09T05:03:31Z"},{"id":39,"issue_id":"ge-hch.3.4.6","author":"rgardler","text":"probe starting test implementation on branch feature/ge-hch.3.4.6-tests","created_at":"2026-01-09T05:07:32Z"},{"id":40,"issue_id":"ge-hch.3.4.6","author":"rgardler","text":"probe starting test implementation on branch feature/ge-hch.3.4.6-tests (reaffirming).","created_at":"2026-01-09T05:14:02Z"},{"id":41,"issue_id":"ge-hch.3.4.6","author":"rgardler","text":"probe complete: added integration tests and fixtures. Files: tests/validate-story/validate-story.integration.test.js, tests/fixtures/valid.ink, tests/fixtures/invalid.ink, tests/fixtures/runtime_err.ink. PR: https://github.com/TheWizardsCode/GEngine/pull/110","created_at":"2026-01-09T05:16:21Z"},{"id":43,"issue_id":"ge-hch.3.4.6","author":"rgardler","text":"Evaluation: inspected branch feature/ge-hch.3.4.6-tests and repository state. Findings:\\n- Integration tests and fixtures for validate-story were added (tests/validate-story/validate-story.integration.test.js, tests/fixtures/{valid.ink,invalid.ink,runtime_err.ink}).\\n- The validate-story CLI implementation (scripts/validate-story.js) is not present on this branch; earlier work exists on feature/ge-hch.3.4-validate (ge-hch.3.4.5).\\n\\nRemaining work (recommended next actions):\\n1) Ensure CLI is merged/available: merge or cherry-pick scripts/validate-story.js and related unit tests from feature/ge-hch.3.4-validate into this branch (owner: patch).\\n2) Run the integration tests (owner: probe) locally/CI and fix any failures. Confirm deterministic seed/path-rotation behavior and add any additional edge-case fixtures as needed.\\n3) Add package.json script and Jest config if missing; ensure npm test runs integration suite (owner: patch).\\n4) Add CI workflow to run scripts/validate-story.js on PRs/changes (ge-hch.3.4.3) and wire artifacts/log upload on failure (owner: ship).\\n5) Update docs/usage and path-rotation docs (ge-hch.3.4.4) (owner: scribbler).\\n\\nNotes / Risks:\\n- Current local bd daemon reports a repo/database mismatch; run → Importing from JSONL...\nImport complete: 0 created, 0 updated, 101 unchanged, 7 skipped\n✓ Import complete before making bd changes to avoid data loss.\\n- Working tree contains uncommitted changes (.beads/issues.jsonl and others). Per Build policy, do not commit code changes from this session; coordinate merges via PRs.\\n\\nCommands run during evaluation: git rev-parse, git status, git fetch, git rev-list, git diff, git log, bd show ge-hch.3.4, bd ready, git diff --name-only, git status --porcelain, git remote -v.\\n\\nFiles inspected: .beads/issues.jsonl, tests/validate-story/validate-story.integration.test.js, tests/fixtures/valid.ink, tests/fixtures/invalid.ink, tests/fixtures/runtime_err.ink, package.json.\\n\\nNext step: @patch please bring scripts/validate-story.js into this branch or merge feature/ge-hch.3.4-validate; @probe finish running the tests and update this bead with pass/fail results.","created_at":"2026-01-12T03:18:41Z"}]} -{"id":"ge-hch.3.4.7","title":"Docs+CI: validate-story workflow \u0026 usage","status":"open","priority":2,"issue_type":"chore","created_at":"2026-01-08T02:21:24.685539352-08:00","created_by":"rgardler","updated_at":"2026-01-08T02:21:24.685539352-08:00","dependencies":[{"issue_id":"ge-hch.3.4.7","depends_on_id":"ge-hch.3.4","type":"parent-child","created_at":"2026-01-08T02:21:24.686292195-08:00","created_by":"rgardler"}]} +{"id":"ge-hch.3.4.7","title":"Docs+CI: validate-story workflow \u0026 usage","status":"open","priority":2,"issue_type":"chore","assignee":"Ship","created_at":"2026-01-08T02:21:24.685539352-08:00","created_by":"rgardler","updated_at":"2026-01-11T22:22:37.152625606-08:00","dependencies":[{"issue_id":"ge-hch.3.4.7","depends_on_id":"ge-hch.3.4","type":"parent-child","created_at":"2026-01-08T02:21:24.686292195-08:00","created_by":"rgardler"}],"comments":[{"id":51,"issue_id":"ge-hch.3.4.7","author":"rgardler","text":"Draft CI workflow added at .github/workflows/validate-story.yml to run scripts/validate-story.js on web/stories/**/*.ink. This will run on PRs changing stories or the CLI and on pushes to main. Assign Ship for review/approval of CI policy.","created_at":"2026-01-12T06:22:35Z"}]} {"id":"ge-hch.3.5","title":"Implement: package.json scripts (start/build/validate/test)","description":"Add npm scripts to run dev server, build static output, run validate-story, and run tests.\\n\\n## Acceptance Criteria\\n- package.json scripts: start, build, validate-story, test are present.\\n- Docs updated with commands.\\n","status":"open","priority":2,"issue_type":"task","assignee":"patch","created_at":"2026-01-07T19:42:53.712420193-08:00","created_by":"rgardler","updated_at":"2026-01-07T23:46:35.040195751-08:00","dependencies":[{"issue_id":"ge-hch.3.5","depends_on_id":"ge-hch.3","type":"parent-child","created_at":"2026-01-07T19:42:53.713310043-08:00","created_by":"rgardler"}]} {"id":"ge-hch.3.6","title":"CI: Build + validate + Playwright (PR)","description":"Update CI workflows to run: npm build, scripts/validate-story against web/stories, package artifact, run Playwright E2E tests against built artifact, and (optionally) deploy to GitHub Pages on merge.\\n\\n## Acceptance Criteria\\n- .github/workflows/pr-ci.yml updated/added to run build + validate + Playwright on PRs.\\n- CI artifacts archived for Playwright runs and GitHub Pages deploy.\\n","status":"open","priority":2,"issue_type":"task","assignee":"Ship","created_at":"2026-01-07T19:45:40.535363424-08:00","created_by":"rgardler","updated_at":"2026-01-07T23:46:35.086644546-08:00","dependencies":[{"issue_id":"ge-hch.3.6","depends_on_id":"ge-hch.3","type":"parent-child","created_at":"2026-01-07T19:45:40.539250533-08:00","created_by":"rgardler"},{"issue_id":"ge-hch.3.6","depends_on_id":"ge-hch.3.5","type":"blocks","created_at":"2026-01-07T19:45:58.315417759-08:00","created_by":"rgardler"},{"issue_id":"ge-hch.3.6","depends_on_id":"ge-hch.3.4","type":"blocks","created_at":"2026-01-07T19:46:00.441977661-08:00","created_by":"rgardler"},{"issue_id":"ge-hch.3.6","depends_on_id":"ge-hch.3.3","type":"blocks","created_at":"2026-01-07T19:46:03.024294382-08:00","created_by":"rgardler"}]} {"id":"ge-hch.4","title":"M1.5 — Content iteration tooling \u0026 replay regression","description":"M1.5 — Content iteration tooling \u0026 replay regression\\n\\nProvide tooling and workflows to rapidly swap stories, run replay tests (golden path), and enable fast content iteration for authors and AI content generation.\\n\\n## Success Criteria\\n- Tooling exists to replace demo story and load new stories without code changes.\\n- Automated replay harness can run and validate golden-path story completion for at least one story.\\n- Documentation for content-iteration workflow and example commands.","status":"open","priority":1,"issue_type":"epic","assignee":"Build","created_at":"2026-01-07T17:24:07.829287373-08:00","created_by":"rgardler","updated_at":"2026-01-07T23:46:35.137015008-08:00","labels":["milestone"],"dependencies":[{"issue_id":"ge-hch.4","depends_on_id":"ge-hch.3","type":"blocks","created_at":"2026-01-07T17:24:30.333029896-08:00","created_by":"rgardler"}]}