Skip to content

scaffolder | features | documentation | TESTING

scaffolder | features | documentation | TESTING

Section titled “scaffolder | features | documentation | TESTING”
project: scaffolder
feature: documentation
doc-type: TESTING
status: accepted
version: 0.1
updated: 2026-03-22
depends-on: scaffolder | features | documentation | SPEC,
scaffolder | features | documentation | TASKS

This feature has no application code — it’s infrastructure (folder restructure, config files, a static site, and a deployment). Testing is verification-based: confirm each piece exists, works, and connects correctly to the others.

Tests are grouped by the SPEC’s acceptance criteria sections. Each test has a method (how to verify) and an expected result.


T1 — Workspace config exists and is valid

Section titled “T1 — Workspace config exists and is valid”

Method: Read D:\purlshq-dev\workspace.json, parse as JSON Expected: Valid JSON with keys: workspace_root, engine_root, docs_site_root, backups_root, github_org, domain, projects Who: Harley

Method: Read {docs_site_root}/src/content/docs/scaffolder/project.json, parse as JSON Expected: Valid JSON with keys: project, github_repo, scale_tier, engine_project_path, linear_project, version Who: Harley

T3 — Joker can read workspace config via MCP

Section titled “T3 — Joker can read workspace config via MCP”

Method: Joker reads D:\purlshq-dev\workspace.json via filesystem MCP Expected: File contents returned, all keys present Who: Joker (next session start)

T4 — Joker can read project config via MCP

Section titled “T4 — Joker can read project config via MCP”

Method: Joker reads project.json via path resolved from workspace config Expected: File contents returned, all keys present Who: Joker (next session start)

T5 — No hardcoded paths in reference files

Section titled “T5 — No hardcoded paths in reference files”

Method: Search CHAT-REFERENCE.md, PROJECT-INSTRUCTIONS.md, CLAUDE.md, and STANDARDS.md for literal D:\scaffolder-engine or D:\purlshq-dev\scaffolder-engine or any other absolute path that should be config-resolved Expected: Zero matches. All paths use {config_key} notation. Who: Harley (grep -r across reference files)


Method: ls /mnt/d/purlshq-dev/scaffolder-engine/package.json Expected: File exists Who: Harley

Method: ls /mnt/d/scaffolder-engine/ Expected: No such directory Who: Harley

Method: cd /mnt/d/purlshq-dev/scaffolder-engine && git remote -v Expected: origin points to github.com/purlshq/scaffolder Who: Harley

Method: cd /mnt/d/purlshq-dev/scaffolder-engine && sc create --dry-run "test-verify" Expected: Dry run completes without errors Who: Harley

Method: Run harley from any directory Expected: Claude Code launches, points at correct project Who: Operator

Method: ls /mnt/d/purlshq-dev/backups/ Expected: Directory exists (may be empty) Who: Harley


Method: find /mnt/d/purlshq-dev/projects-purlshq-com/src/content/docs/scaffolder/docs/ -name "*.md" | wc -l Expected: Count matches the number of doc files that existed before migration Who: Harley

Method: ls /mnt/d/purlshq-dev/scaffolder-engine/projects/scaffolder/docs/ Expected: No such directory Who: Harley

T14 — Session files present in doc site repo

Section titled “T14 — Session files present in doc site repo”

Method: Verify existence of:

  • src/content/docs/scaffolder/ai-sessions/CURRENT-CHAT.md
  • src/content/docs/scaffolder/ai-sessions/CURRENT-CODE.md
  • src/content/docs/scaffolder/ai-sessions/logs/ (with contents) Expected: All files present, content intact Who: Harley

Method: ls /mnt/d/purlshq-dev/scaffolder-engine/projects/scaffolder/ai-sessions/ Expected: No such directory Who: Harley

Method: Diff file lists before and after migration (capture “before” list during Task 5 execution) Expected: Every file that existed before exists after, same content Who: Harley


T17 — All markdown files have frontmatter

Section titled “T17 — All markdown files have frontmatter”

Method: For each .md file under src/content/docs/scaffolder/, check that the first line is --- and a title: field exists Expected: Every .md file has YAML frontmatter with title Who: Harley (script or grep)

Method: Compare content below frontmatter block with original files (captured before frontmatter was added) Expected: Identical content — only the frontmatter block was prepended Who: Harley


Method: cd /mnt/d/purlshq-dev/projects-purlshq-com && npm run build Expected: Clean build, no errors, no warnings about missing titles Who: Harley

Method: npm run dev, open localhost in browser, inspect sidebar Expected: Scaffolder project appears with nested docs and ai-sessions Who: Operator (visual inspection)

Method: Navigate to a deeply nested doc (e.g., a decision page) Expected: Breadcrumbs show full hierarchy: scaffolder > docs > features > documentation > decisions > [page] Who: Operator (visual inspection)

Method: Open a long doc (e.g., SPEC.md or ARCHITECTURE.md) Expected: “On this page” nav on the right side lists section headings Who: Operator (visual inspection)

Method: Use the built-in search, search for a known term Expected: Results returned, clicking leads to correct page Who: Operator (visual inspection)

Method: Click the theme toggle Expected: Site switches between light and dark themes Who: Operator (visual inspection)


Method: Push a trivial change to main, check Cloudflare Pages dashboard Expected: Build triggered, completes successfully, site updated Who: Operator

Method: Visit https://projects.purlshq.com Expected: Cloudflare Access login screen appears (not a DNS error) Who: Operator

T27 — Access blocks unauthenticated visitors

Section titled “T27 — Access blocks unauthenticated visitors”

Method: Visit site in incognito without authenticating Expected: Cloudflare Access login required, no site content visible Who: Operator

Method: Enter operator email, receive OTP, enter code Expected: Access granted, site content visible Who: Operator


Method: Start a new Joker session. Joker reads workspace.json, resolves project paths, reads CURRENT-CHAT.md and CURRENT-CODE.md Expected: Joker successfully reads all files using config-resolved paths, presents session summary Who: Joker (next session)

Method: Start Harley. Harley reads workspace.json, resolves paths, reads CURRENT-CODE.md and relevant docs Expected: Harley successfully reads all files using config-resolved paths, ready to work Who: Harley (next session)

T31 — Harley session end writes to correct location

Section titled “T31 — Harley session end writes to correct location”

Method: End a Harley session, check that CURRENT-CODE.md and session log are written to the doc site repo path Expected: Files written to {docs_site_root}/src/content/docs/scaffolder/ai-sessions/ Who: Harley


  1. T1-T5 (config) — after Tasks 1, 8
  2. T6-T11 (folder restructure) — after Task 2
  3. T12-T16 (migration) — after Tasks 5, 6
  4. T17-T18 (frontmatter) — after Task 7
  5. T19-T24 (doc site) — after Task 7, local dev server
  6. T25-T28 (Cloudflare) — after Tasks 10, 11
  7. T29-T31 (path resolution) — after Task 9, next Joker/Harley session

TESTING — accepted.