497 lines
37 KiB
Markdown
497 lines
37 KiB
Markdown
---
|
||
phase: 11.1-summercms-documentation-for-humans-and-ai-agents
|
||
verified: 2026-10-01T07:31:53Z
|
||
status: human_needed
|
||
score: 13/13 must-haves verified
|
||
covered_files:
|
||
- ".gitignore"
|
||
- ".planning/phases/11.1-summercms-documentation-for-humans-and-ai-agents/11.1-01-PLAN.md"
|
||
- ".planning/phases/11.1-summercms-documentation-for-humans-and-ai-agents/11.1-01-SUMMARY.md"
|
||
- ".planning/phases/11.1-summercms-documentation-for-humans-and-ai-agents/11.1-02-PLAN.md"
|
||
- ".planning/phases/11.1-summercms-documentation-for-humans-and-ai-agents/11.1-02-SUMMARY.md"
|
||
- ".planning/phases/11.1-summercms-documentation-for-humans-and-ai-agents/11.1-03-PLAN.md"
|
||
- ".planning/phases/11.1-summercms-documentation-for-humans-and-ai-agents/11.1-03-SUMMARY.md"
|
||
- ".planning/phases/11.1-summercms-documentation-for-humans-and-ai-agents/11.1-04-PLAN.md"
|
||
- ".planning/phases/11.1-summercms-documentation-for-humans-and-ai-agents/11.1-04-SUMMARY.md"
|
||
- ".planning/phases/11.1-summercms-documentation-for-humans-and-ai-agents/11.1-05-PLAN.md"
|
||
- ".planning/phases/11.1-summercms-documentation-for-humans-and-ai-agents/11.1-05-SUMMARY.md"
|
||
- ".planning/phases/11.1-summercms-documentation-for-humans-and-ai-agents/11.1-06-PLAN.md"
|
||
- ".planning/phases/11.1-summercms-documentation-for-humans-and-ai-agents/11.1-06-SUMMARY.md"
|
||
- ".planning/phases/11.1-summercms-documentation-for-humans-and-ai-agents/11.1-07-PLAN.md"
|
||
- ".planning/phases/11.1-summercms-documentation-for-humans-and-ai-agents/11.1-07-SUMMARY.md"
|
||
- ".planning/phases/11.1-summercms-documentation-for-humans-and-ai-agents/11.1-REVIEW-DISPOSITION.md"
|
||
- ".planning/phases/11.1-summercms-documentation-for-humans-and-ai-agents/11.1-REVIEW.md"
|
||
- ".planning/phases/11.1-summercms-documentation-for-humans-and-ai-agents/11.1-VALIDATION.md"
|
||
- ".planning/todos/pending/readme-go-fences-src.md"
|
||
- "CLAUDE.md"
|
||
- "README.md"
|
||
- "cmd/summer/docs.go"
|
||
- "cmd/summer/docs_test.go"
|
||
- "cmd/summer/main.go"
|
||
- "cmd/summer/main_test.go"
|
||
- "cmd/summer/phase11_1_acceptance_test.go"
|
||
- "docs/architecture/application-lifecycle.md"
|
||
- "docs/architecture/go-modules-and-workspaces.md"
|
||
- "docs/architecture/introduction.md"
|
||
- "docs/architecture/request-lifecycle.md"
|
||
- "docs/backend/admin-controllers.md"
|
||
- "docs/backend/admin-spa.md"
|
||
- "docs/backend/forms.md"
|
||
- "docs/backend/lists-and-filters.md"
|
||
- "docs/backend/partials-and-widgets.md"
|
||
- "docs/backend/relation-manager.md"
|
||
- "docs/backend/settings.md"
|
||
- "docs/backend/users-and-permissions.md"
|
||
- "docs/console/introduction.md"
|
||
- "docs/console/scaffolding.md"
|
||
- "docs/console/setup-and-maintenance.md"
|
||
- "docs/console/utilities.md"
|
||
- "docs/console/writing-commands.md"
|
||
- "docs/database/attachments.md"
|
||
- "docs/database/casts-and-validation.md"
|
||
- "docs/database/migrations.md"
|
||
- "docs/database/models.md"
|
||
- "docs/database/queries-and-pagination.md"
|
||
- "docs/database/relations.md"
|
||
- "docs/database/transactions.md"
|
||
- "docs/examples/blog/blog_test.go"
|
||
- "docs/examples/blog/classes/doc.go"
|
||
- "docs/examples/blog/config/config.yaml"
|
||
- "docs/examples/blog/console/doc.go"
|
||
- "docs/examples/blog/console/publish.go"
|
||
- "docs/examples/blog/console/publish_test.go"
|
||
- "docs/examples/blog/controllers/doc.go"
|
||
- "docs/examples/blog/controllers/posts.go"
|
||
- "docs/examples/blog/controllers/posts/config_form.yaml"
|
||
- "docs/examples/blog/controllers/posts/config_list.yaml"
|
||
- "docs/examples/blog/controllers/posts_test.go"
|
||
- "docs/examples/blog/jobs/doc.go"
|
||
- "docs/examples/blog/lang/en/lang.yaml"
|
||
- "docs/examples/blog/middleware/doc.go"
|
||
- "docs/examples/blog/models/doc.go"
|
||
- "docs/examples/blog/models/post.go"
|
||
- "docs/examples/blog/models/post_test.go"
|
||
- "docs/examples/blog/models/posts/columns.yaml"
|
||
- "docs/examples/blog/models/posts/fields.yaml"
|
||
- "docs/examples/blog/plugin.go"
|
||
- "docs/examples/blog/postgres_test.go"
|
||
- "docs/examples/blog/registry.gen.go"
|
||
- "docs/examples/blog/routes.go"
|
||
- "docs/examples/blog/scaffold_layout_test.go"
|
||
- "docs/examples/blog/updates/20260101000000_create_acme_blog_posts.go"
|
||
- "docs/examples/blog/updates/20260101000100_add_published_at.go"
|
||
- "docs/examples/blog/updates/doc.go"
|
||
- "docs/examples/blog/updates/updates_test.go"
|
||
- "docs/examples/blog/views/mail/welcome.htm"
|
||
- "docs/index.md"
|
||
- "docs/plugins/extending.md"
|
||
- "docs/plugins/registration.md"
|
||
- "docs/plugins/scheduling.md"
|
||
- "docs/plugins/testing.md"
|
||
- "docs/services/authentication.md"
|
||
- "docs/services/configuration.md"
|
||
- "docs/services/events.md"
|
||
- "docs/services/frontend-and-ajax.md"
|
||
- "docs/services/jobs.md"
|
||
- "docs/services/localization.md"
|
||
- "docs/services/mail.md"
|
||
- "docs/services/oauth-server.md"
|
||
- "docs/services/outbound-http.md"
|
||
- "docs/services/parity-testing.md"
|
||
- "docs/services/push.md"
|
||
- "docs/services/rate-limiting.md"
|
||
- "docs/services/realtime.md"
|
||
- "docs/services/routing.md"
|
||
- "docs/services/search.md"
|
||
- "docs/services/storage.md"
|
||
- "docs/setup/coming-from-wintercms.md"
|
||
- "docs/setup/configuration.md"
|
||
- "docs/setup/installation.md"
|
||
- "docs/setup/introduction.md"
|
||
- "docs/setup/porting-a-plugin.md"
|
||
- "docs/site.yaml"
|
||
- "go.mod"
|
||
- "go.sum"
|
||
- "internal/docsite/check_commands.go"
|
||
- "internal/docsite/check_forbidden.go"
|
||
- "internal/docsite/check_identifiers.go"
|
||
- "internal/docsite/check_links.go"
|
||
- "internal/docsite/check_policy.go"
|
||
- "internal/docsite/checks_test.go"
|
||
- "internal/docsite/docsite.go"
|
||
- "internal/docsite/docsite_test.go"
|
||
- "internal/docsite/emit.go"
|
||
- "internal/docsite/emit_test.go"
|
||
- "internal/docsite/fences.go"
|
||
- "internal/docsite/fences_test.go"
|
||
- "internal/docsite/highlight.go"
|
||
- "internal/docsite/highlight_test.go"
|
||
- "internal/docsite/load.go"
|
||
- "internal/docsite/load_test.go"
|
||
- "internal/docsite/render.go"
|
||
- "internal/docsite/render_test.go"
|
||
- "internal/docsite/serve.go"
|
||
- "internal/docsite/serve_test.go"
|
||
- "internal/docsite/snippet.go"
|
||
- "internal/docsite/snippet_test.go"
|
||
- "internal/docsite/testdata/violations/command-bin-no-dot/docs/extras/faq.md"
|
||
- "internal/docsite/testdata/violations/command-bin-no-dot/want.txt"
|
||
- "internal/docsite/testdata/violations/command-env-prefix/docs/extras/faq.md"
|
||
- "internal/docsite/testdata/violations/command-env-prefix/want.txt"
|
||
- "internal/docsite/testdata/violations/command-flag-first/docs/extras/faq.md"
|
||
- "internal/docsite/testdata/violations/command-flag-first/want.txt"
|
||
- "internal/docsite/testdata/violations/command-go-run/docs/extras/faq.md"
|
||
- "internal/docsite/testdata/violations/command-go-run/want.txt"
|
||
- "internal/docsite/testdata/violations/command-in-callout/docs/extras/faq.md"
|
||
- "internal/docsite/testdata/violations/command-in-callout/want.txt"
|
||
- "internal/docsite/testdata/violations/go-fence-callout-no-src/docs/extras/faq.md"
|
||
- "internal/docsite/testdata/violations/go-fence-callout-no-src/want.txt"
|
||
- "internal/docsite/testdata/violations/go-fence-golang/docs/extras/faq.md"
|
||
- "internal/docsite/testdata/violations/go-fence-golang/want.txt"
|
||
- "internal/docsite/testdata/violations/identifier-wrong-case/docs/extras/faq.md"
|
||
- "internal/docsite/testdata/violations/identifier-wrong-case/modules/demo/open.go"
|
||
- "internal/docsite/testdata/violations/identifier-wrong-case/want.txt"
|
||
- "internal/docsite/testdata/violations/snippet-blockquote/docs/extras/faq.md"
|
||
- "internal/docsite/testdata/violations/snippet-blockquote/want.txt"
|
||
- "internal/docsite/testdata/violations/snippet-build-ignored-test-root/docs/extras/faq.md"
|
||
- "internal/docsite/testdata/violations/snippet-build-ignored-test-root/modules/demo/demo_test.go"
|
||
- "internal/docsite/testdata/violations/snippet-build-ignored-test-root/modules/demo/ignored_test.go"
|
||
- "internal/docsite/testdata/violations/snippet-build-ignored-test-root/want.txt"
|
||
- "internal/docsite/testdata/violations/snippet-build-ignored/docs/extras/faq.md"
|
||
- "internal/docsite/testdata/violations/snippet-build-ignored/modules/demo/broken.go"
|
||
- "internal/docsite/testdata/violations/snippet-build-ignored/want.txt"
|
||
- "internal/docsite/testdata/violations/snippet-callout-drift/docs/extras/faq.md"
|
||
- "internal/docsite/testdata/violations/snippet-callout-drift/want.txt"
|
||
- "internal/docsite/testdata/violations/snippet-callout-missing/docs/extras/faq.md"
|
||
- "internal/docsite/testdata/violations/snippet-callout-missing/want.txt"
|
||
- "internal/docsite/testdata/violations/snippet-example-no-output-helper/docs/extras/faq.md"
|
||
- "internal/docsite/testdata/violations/snippet-example-no-output-helper/modules/demo/never_test.go"
|
||
- "internal/docsite/testdata/violations/snippet-example-no-output-helper/want.txt"
|
||
- "internal/docsite/testdata/violations/snippet-example-no-output-region/docs/extras/faq.md"
|
||
- "internal/docsite/testdata/violations/snippet-example-no-output-region/modules/demo/never_test.go"
|
||
- "internal/docsite/testdata/violations/snippet-example-no-output-region/want.txt"
|
||
- "internal/docsite/testdata/violations/snippet-list-item/docs/extras/faq.md"
|
||
- "internal/docsite/testdata/violations/snippet-list-item/want.txt"
|
||
- "internal/docsite/testdata/violations/snippet-readme-src/modules/demo/README.md"
|
||
- "internal/docsite/testdata/violations/snippet-readme-src/want.txt"
|
||
- "internal/docsite/testdata/violations/snippet-testdata-go/docs/extras/faq.md"
|
||
- "internal/docsite/testdata/violations/snippet-testdata-go/modules/demo/testdata/fixture_test.go"
|
||
- "internal/docsite/testdata/violations/snippet-testdata-go/want.txt"
|
||
- "internal/docsite/theme/assets/search.js"
|
||
- "internal/docsite/theme/assets/site.css"
|
||
- "internal/docsite/theme/assets/site.js"
|
||
- "internal/docsite/theme/assets/theme-init.js"
|
||
- "internal/docsite/theme/templates/404.html"
|
||
- "internal/docsite/theme/templates/footer.html"
|
||
- "internal/docsite/theme/templates/header.html"
|
||
- "internal/docsite/theme/templates/icons.html"
|
||
- "internal/docsite/theme/templates/page.html"
|
||
- "internal/docsite/theme/templates/pager.html"
|
||
- "internal/docsite/theme/templates/search.html"
|
||
- "internal/docsite/theme/templates/sidebar.html"
|
||
- "internal/docsite/theme/templates/toc.html"
|
||
- "internal/docsite/theme_test.go"
|
||
- "internal/docsite/violations_test.go"
|
||
- "modules/backpack/example_test.go"
|
||
- "modules/beachcomber/example_test.go"
|
||
- "modules/beachcomber/export_docs_test.go"
|
||
- "modules/beachcomber/typesense/example_test.go"
|
||
- "modules/bonfire/example_test.go"
|
||
- "modules/bouncer/example_test.go"
|
||
- "modules/cabana/example_controller_test.go"
|
||
- "modules/cabana/example_test.go"
|
||
- "modules/cabana/testdata/docs/controllers/posts/config_filter.yaml"
|
||
- "modules/cabana/testdata/docs/controllers/posts/config_form.yaml"
|
||
- "modules/cabana/testdata/docs/controllers/posts/config_list.yaml"
|
||
- "modules/cabana/testdata/docs/models/post/columns.yaml"
|
||
- "modules/cabana/testdata/docs/models/post/fields.yaml"
|
||
- "modules/cabana/testdata/docs/models/settings/fields.yaml"
|
||
- "modules/compass/example_test.go"
|
||
- "modules/conga/example_test.go"
|
||
- "modules/conga/export_docs_test.go"
|
||
- "modules/festival/example_test.go"
|
||
- "modules/fetchguard/example_test.go"
|
||
- "modules/flare/example_test.go"
|
||
- "modules/lagoon/attach/example_test.go"
|
||
- "modules/lagoon/example_test.go"
|
||
- "modules/lagoon/export_docs_test.go"
|
||
- "modules/lighthouse/centrifugo/example_test.go"
|
||
- "modules/lighthouse/example_test.go"
|
||
- "modules/lighthouse/export_docs_test.go"
|
||
- "modules/pact/example_test.go"
|
||
- "modules/party/example_plugin_test.go"
|
||
- "modules/party/example_test.go"
|
||
- "modules/phrasebook/example_test.go"
|
||
- "modules/postcard/example_test.go"
|
||
- "modules/surf/example_test.go"
|
||
- "modules/tide/example_test.go"
|
||
- "modules/tide/testdata/docs/posts-spec.yaml"
|
||
- "modules/towel/example_test.go"
|
||
- "modules/wire/example_test.go"
|
||
- "modules/wristband/example_test.go"
|
||
- "scripts/check-phase11.1.sh"
|
||
covered_digest: "v2:sha256:69e8741c6e6d238b3ae5164f594e9dce56016ddf6cda5b738f3fb81f3fec780e"
|
||
behavior_unverified: 0
|
||
overrides_applied: 0
|
||
re_verification:
|
||
previous_status: gaps_found
|
||
previous_score: 10/13
|
||
gaps_closed:
|
||
- "DOCS-04 fence discovery: AST collection refuses nested and README src= fences, Go-lexer aliases need src=, and captions cover only checked fences"
|
||
- "D-07 proof of execution: src= targets must be in the default build and reached from a Test or an Example with output"
|
||
- "DOCS-05 name forms: go doc -c is case-sensitive, and command words cover env prefixes, flags, go run ./cmd/summer and bin/{app}"
|
||
gaps_remaining: []
|
||
regressions: []
|
||
decision_coverage:
|
||
honored: 18
|
||
total: 18
|
||
not_honored: []
|
||
advisory:
|
||
- finding: "The identifier index still reads build-ignored Go files, so a declaration go test never compiles can still satisfy an identifier span."
|
||
category: other
|
||
reason: "Recorded by plan 11.1-07 as outside the gap-closure contract. It is not one of the three prior gaps. No red test was run for it on this pass, so it does not reopen DOCS-05."
|
||
evidence_status: "none provided"
|
||
human_verification:
|
||
- test: "Run summer docs:serve, open the printed address, search for a module name and a CLI command, and use the arrow keys and Enter."
|
||
expected: "Rows show section, title, heading and a 2-line excerpt with mark highlights; arrow keys move the selection and Enter opens the page; the live region announces the count; empty and zero-result states show the UI-SPEC copy."
|
||
why_human: "Plan 02 and plan 06 backstop truths, and the two manual rows in 11.1-VALIDATION.md. search.js has no JS test runner."
|
||
- test: "Cycle the theme toggle through light, dark and system, reload in each mode, and check a guide page and an API page at 1280px, 1024px and 375px."
|
||
expected: "No flash of the wrong theme; the choice persists; UI-SPEC contrast pairs hold in both themes."
|
||
why_human: "Plan 02 backstop truths. Visual timing is not observable from Go tests."
|
||
- test: "Disable JavaScript and load a guide page below 1024px."
|
||
expected: "The sidebar renders above the content and the search and theme buttons are hidden."
|
||
why_human: "Plan 02 backstop truth (no-JS layout)."
|
||
- test: "Read llms.txt, one page .md and llms-full.txt as an agent would."
|
||
expected: "Spec shape with predictable .md URLs that are useful without the HTML."
|
||
why_human: "Plan 01 backstop truth. Usefulness is non-inferable from structure. unverified — held-out test recommended."
|
||
- test: "Read Setup, Backend, Database and Services, and follow docs/setup/porting-a-plugin.md top to bottom."
|
||
expected: "WinterCMS docs tone, accurate to the module READMEs, ending at the same acme.blog plugin as docs/examples/blog."
|
||
why_human: "Plans 03, 04 and 05 backstop truths."
|
||
- test: "Resolve the seven judgment-tier prohibitions in the report body."
|
||
expected: "Each holds. The verifier's non-authoritative verdict is holds for all seven."
|
||
why_human: "unverified-prohibition — human review recommended. Judgment-tier prohibitions are not a silent pass."
|
||
---
|
||
|
||
# Phase 11.1: SummerCMS documentation for humans and AI agents Verification Report
|
||
|
||
**Phase Goal:** SummerCMS has a WinterCMS-style documentation set that serves both humans and AI agents. The Markdown source lives in `summercms.go/docs/` and a `summer` CLI command builds it into a static site with sidebar navigation, search, `llms.txt`/`llms-full.txt` and a raw `.md` per page. Every code example compiles and is tested, and a "Coming from WinterCMS" map plus an `acme/blog` porting walkthrough cover the migration path. It documents the framework as it stands after Phase 11 and never names a consuming application.
|
||
**Verified:** 2026-10-01T07:31:53Z
|
||
**Status:** human_needed
|
||
**Re-verification:** Yes — after gap closure (plan 11.1-07)
|
||
|
||
## Verdict in one paragraph
|
||
|
||
The three gaps from 2026-09-30 are closed in the code, and the phase gate is green. `collectFences` walks the goldmark AST the renderer uses. A `src=` fence inside a callout, blockquote or list item, and any `src=` fence in a module README, fails Check and is not captioned. Go-lexer aliases need `src=`. A `.go` target must be in the default build and reached from a `Test` or an Example with output. `go doc -c` is case-sensitive, and `commandWord` accepts env prefixes, cobra-style flags, `go run ./cmd/summer` and `bin/{app}`. `bash scripts/check-phase11.1.sh --all` printed `phase11.1 all passed` (exit 0), including a scratch-tree self-test that plants the old holes. Automated must-haves are 13/13. Status stays `human_needed` because the plans' backstop truths (search, theme, no-JS layout, editorial usefulness) and seven judgment-tier prohibitions still need a person. That is not a code gap.
|
||
|
||
## Goal Achievement
|
||
|
||
### Observable Truths
|
||
|
||
The scored set is the same 13 truths as the previous report. Plan 11.1-07's ten truths are the re-test of truths 6–8; they are listed under that table and are not a second denominator.
|
||
|
||
| # | Truth | Status | Evidence |
|
||
| --- | --- | --- | --- |
|
||
| 1 | SC1: docs/ holds Markdown pages with frontmatter in Setup, Architecture, Plugins, Backend, Database, Services, Console, API reference, and every framework module is reachable from the sidebar | ✓ VERIFIED | Regression: `docs/site.yaml` still lists those eight sections. `scripts/check-phase11.1.sh --all` ran `TestPhase11_1Acceptance` under `--named` (`-count=1`, skips refused) and printed `phase11.1 named passed`. `docs:build` wrote 72 pages. |
|
||
| 2 | SC2: a `summer` command builds a self-contained static site with sidebar, TOC, prev/next, client-side search and dark mode, no Node toolchain; only new dep is approved | ✓ VERIFIED | `--deps` passed (chroma/v2 only). `--docs` built the site. Search keystrokes and theme flash stay in human verification; markup is covered by the acceptance test the gate ran. |
|
||
| 3 | SC3/DOCS-03: `llms.txt`, `llms-full.txt` and a clean `.md` per page, with a test asserting sync with the page tree | ✓ VERIFIED | `--docs` requires `llms.txt`, `llms-full.txt` and `index.md`. `TestDocsAIOutputsInSync` is in the named set that passed. Usefulness of the raw files stays a backstop. |
|
||
| 4 | SC4 (current content): every Go example in a docs/ page is compiled and run by `go test ./...` | ✓ VERIFIED | `TestPhase11_1Acceptance` passed via `--named`. The acceptance scanner now marks blockquoted fences nested (`scanDocFences` / `TestAcceptanceFenceScanner`) and the real tree has no nested `src=` fence. |
|
||
| 5 | SC5 / DOCS-07: the concept map and the acme/blog walkthrough exist, and the walkthrough's code is verified under SC4 | ✓ VERIFIED | Both pages are still present. `--named` ran the blog package tests, including the Docker migrate/route/command tests, and refuses a skip. `phase11.1 named passed`. |
|
||
| 6 | DOCS-04 enforcement: a test fails on a missing or drifted snippet; every Go fence must carry src= | ✓ VERIFIED | Closed by plan 07 truths G1–G5 and G10. Self-test on a scratch copy of the real tree refused a callout `src=` fence (`must be a top-level block`) and a `golang` fence with no `src=`. `TestPlantedViolations` walks all 81 violation directories, including the new plants, and the self-test stage passed. |
|
||
| 7 | D-07 proof of execution: src= must name compiled source, and code no Test or Example runs is a snippet problem | ✓ VERIFIED | Closed by G6–G7. `loadTestGraph` roots are `isTestName` plus `doc.Examples` with `Output` or `EmptyOutput`. `checkBuiltGo` uses `build.ImportDir` on `build.Default` and refuses `testdata` and `_` directories. `TestSnippetRootsAndBuild` and the planted fixtures `snippet-example-no-output-helper`, `snippet-build-ignored` and `snippet-testdata-go` are in the corpus the self-test ran. |
|
||
| 8 | DOCS-05: checkers fail on stale identifiers, broken links/anchors, unknown command names and forbidden names | ✓ VERIFIED | Closed by G8–G9 for the two holes. `goDoc` runs `go doc -c`. Self-test refused `lagoon.Openfromapp`, `FOO=1 summer no:such` and `summer --root . no:such`. Links, anchors and forbidden names were already refused and the same self-test still plants them. |
|
||
| 9 | DOCS-06: "Coming from WinterCMS" maps Winter concepts to SummerCMS, with checker-verified identifiers and explicit Not provided rows | ✓ VERIFIED | Regression: the Not provided table in `docs/setup/coming-from-wintercms.md` still links `docs/services/frontend-and-ajax.md`. Identifiers are inside the checkers the gate ran. |
|
||
| 10 | DOCS-08: CLAUDE.md records the docs update rule and names the checkers | ✓ VERIFIED | `CLAUDE.md` `## Documentation` still names `TestDocsTree` and `summer docs:build --check`. `--claude` passed. |
|
||
| 11 | D-11: no page, snippet or built output names a consuming application | ✓ VERIFIED | `grep -rliE` over `docs/**/*.md` found no consuming-application spelling. `--forbidden` passed. A planted name is still in the self-test. |
|
||
| 12 | Phase-end tests: docsite coverage ≥85%, a planted fixture per rule, and acceptance subtests SC1–SC5 | ✓ VERIFIED | This pass: `go test -count=1 -cover ./internal/docsite` reported `coverage: 94.1% of statements`. 81 violation directories. `TestPlantedViolations` and `TestPhase11_1Acceptance` passed inside the gate. |
|
||
| 13 | The gate: `check-phase11.1.sh --all` is green and `--named` refuses skipped or zero-match runs | ✓ VERIFIED | This pass ran `bash scripts/check-phase11.1.sh --all`. Every stage passed and it printed `phase11.1 all passed`, exit 0. `detect_json` still exits on skip, "no tests to run" and a missing required name. |
|
||
|
||
**Score:** 13/13 truths verified (0 present, behavior-unverified)
|
||
|
||
Five backstop truths (search rows and keys, no theme flash, contrast, no-JS layout, llms usefulness, editorial and walkthrough followability) stay non-inferable. They are not in the 13. They route to human verification with reason `insufficient_spec`.
|
||
|
||
### Plan 11.1-07 closure truths
|
||
|
||
All ten are verified. They are the detailed contract for truths 6–8, not extra score rows.
|
||
|
||
| # | Truth | Status | Evidence |
|
||
| --- | --- | --- | --- |
|
||
| G1 | Snippet, policy and command checks find every goldmark `*ast.FencedCodeBlock` | ✓ VERIFIED | `collectFences` in `internal/docsite/fences.go` walks the document from `newMarkdown`. `checkSnippets`, `checkPolicy` and `checkCommands` call it. `TestCollectFences` expects the callout, blockquote and list fences and rejects a four-space indented fence. |
|
||
| G2 | A non-top-level `src=` fence fails Check, docs:build --check and docs:sync, and sync writes nothing | ✓ VERIFIED | `nestedSrcMessage` in `checkFences` returns before `Extract`. `TestSyncParsedFences` expects one problem and an unchanged tree. Self-test plant on the real-tree copy was refused. |
|
||
| G3 | A module README `src=` fence is refused and no unchecked fence gets a figcaption | ✓ VERIFIED | `readmeSrcMessage` when `page.Module != ""`. `fenceAnnotator` sets `data-src` only when `Module == ""` and the parent is the document. `TestFenceCaptionsOnlyVerified` expects one guide caption and none on the API page. |
|
||
| G4 | Any fence whose chroma lexer is Go needs `src=`, at any depth; go-html-template, text and empty do not | ✓ VERIFIED | `goLang` uses `lexerFor`. `checkPolicy` applies it to every collected fence of a docs page. `TestGoLang` and `TestNestedFenceChecks` (callout `go`, `GO`, `main.go`). Self-test refused `golang`. |
|
||
| G5 | Shell fences inside callouts are command-checked; four or more leading spaces are not a fence | ✓ VERIFIED | `checkCommands` reads `f.code` from the AST for `sh`/`shell`/`bash`/`console`. `openFence` rejects indent above 3. `TestCollectFences` wants 6 fences, not 7. Plant `command-in-callout`. |
|
||
| G6 | Reachability roots are Test functions plus Examples with output, from test files in the default build | ✓ VERIFIED | `loadTestGraph` skips Examples with empty `Output` and no `EmptyOutput`, and only parses `TestGoFiles`/`XTestGoFiles`. `TestSnippetRootsAndBuild` asserts `ExampleNone` and `onlyFromIgnored` are not reachable. |
|
||
| G7 | A `.go` src= target fails when it is under `testdata` or `_`, or `build.ImportDir` does not list it | ✓ VERIFIED | `checkBuiltGo`. Plants `snippet-build-ignored`, `snippet-build-ignored-test-root`, `snippet-testdata-go`. |
|
||
| G8 | `go doc -c`, so `demo.Openfromapp` fails | ✓ VERIFIED | `check_identifiers.go` argv is `go`, `doc`, `-c`. `TestIdentifierGoDocCaseSensitive` expects `Openfromapp` false. Self-test refused `lagoon.Openfromapp`. Plant `identifier-wrong-case`. |
|
||
| G9 | Command word after `VAR=value` and flags, for `summer`, `go run ./cmd/summer`, `./bin/{app}` and `bin/{app}`; `summer --help` alone is not a command | ✓ VERIFIED | `commandWord` in `check_commands.go`. `TestCommandWord` covers those forms. Self-test refused the env-prefix and flag-first plants. |
|
||
| G10 | Each hole has a planted fixture; the real tree passes TestDocsTree, docs:build --check and TestPhase11_1Acceptance; the gate prints `phase11.1 all passed` | ✓ VERIFIED | 18 new plants are in `testdata/violations` and `TestPlantedViolations` runs every directory. Gate exit 0, quoted above. `scanDocFences` strips `>` and `goFenceLang` uses chroma. SC4 cross-checks figcaption counts. |
|
||
|
||
### Required Artifacts
|
||
|
||
| Artifact | Expected | Status | Details |
|
||
| --- | --- | --- | --- |
|
||
| `internal/docsite/fences.go` | AST fence discovery | ✓ VERIFIED | `func collectFences`; wired from snippet, policy and command checks |
|
||
| `internal/docsite/snippet.go` | top-level src=, README refusal, build membership, Example roots | ✓ VERIFIED | `build.ImportDir`, `doc.Examples`, `nestedSrcMessage`, `readmeSrcMessage` |
|
||
| `internal/docsite/highlight.go` | `goLang` via the highlighter lookup | ✓ VERIFIED | `func goLang`; `checkPolicy` calls `goLang(` |
|
||
| `internal/docsite/check_commands.go` | `commandWord` | ✓ VERIFIED | env prefix, flags, `go run ./cmd/summer`, `bin/` |
|
||
| `internal/docsite/check_identifiers.go` | case-sensitive go doc fallback | ✓ VERIFIED | `"doc", "-c"` |
|
||
| `internal/docsite/render.go` | captions only on verified fences | ✓ VERIFIED | `Module == ""` and document parent |
|
||
| `internal/docsite/testdata/violations/snippet-callout-drift/want.txt` | CR-01 plant | ✓ VERIFIED | message contains `top-level block` |
|
||
| `cmd/summer/phase11_1_acceptance_test.go` | independent scanner and caption cross-check | ✓ VERIFIED | `TestAcceptanceFenceScanner`, `scanDocFences` |
|
||
| `scripts/check-phase11.1.sh` | gate plants the holes; `--all` | ✓ VERIFIED | ran this pass |
|
||
| `internal/docsite/docsite.go` | Check calls `checkSnippets` after parse | ✓ VERIFIED | call at `checkContent`; not left only in assemble |
|
||
| `docs/setup/coming-from-wintercms.md` | concept map | ✓ VERIFIED | regression, file present, Not provided rows |
|
||
| `docs/setup/porting-a-plugin.md` | walkthrough | ✓ VERIFIED | regression, file present |
|
||
| `docs/examples/blog/*` | in-root plugin | ✓ VERIFIED | named blog tests passed inside the gate |
|
||
| `CLAUDE.md` | documentation rule | ✓ VERIFIED | `--claude` passed |
|
||
|
||
### Key Link Verification
|
||
|
||
| From | To | Via | Status | Details |
|
||
| --- | --- | --- | --- | --- |
|
||
| `internal/docsite/render.go` | `internal/docsite/snippet.go` | caption set equals the fences `checkSnippets` compares | WIRED | `Module == ""` and `KindDocument` in `fenceAnnotator`; `TestFenceCaptionsOnlyVerified` |
|
||
| `internal/docsite/check_policy.go` | `internal/docsite/highlight.go` | `goLang` reuses `lexerFor` | WIRED | `goLang(` at the policy loop |
|
||
| `internal/docsite/snippet.go` | `go/build` and `go/doc` | `build.ImportDir` and `doc.Examples` | WIRED | `buildPackage`, `exampleHasOutput`, `loadTestGraph` |
|
||
| `internal/docsite/check_identifiers.go` | `go doc -c` | `goDoc` argv | WIRED | `exec.CommandContext(ctx, "go", "doc", "-c", ...)` |
|
||
| `scripts/check-phase11.1.sh` | new tests and fixtures | `--named` list includes `TestNestedFenceChecks`, `TestCommandWord`, `TestSnippetRootsAndBuild` | WIRED | `--named` passed |
|
||
| `cmd/summer/docs.go` | `internal/docsite` | `Build` / `Check` / `Sync` | WIRED | regression; gate builds `./cmd/summer` and runs `docs:build --check` |
|
||
| `docs/setup/porting-a-plugin.md` | `docs/examples/blog` | `src=` fences | WIRED | acceptance SC4/SC5 inside the gate |
|
||
|
||
### Data-Flow Trace (Level 4)
|
||
|
||
The docsite does not render application data from a database. Page HTML is produced from the Markdown sources.
|
||
|
||
| Artifact | Data Variable | Source | Produces Real Data | Status |
|
||
| --- | --- | --- | --- | --- |
|
||
| Built guide HTML | fenced code and figcaption | docs page body plus `Extract` of a `src=` target, caption only when the checker compared it | Yes | ✓ FLOWING |
|
||
| `llms.txt` / per-page `.md` | title, description, body | loaded page tree (`emit.go`) | Yes | ✓ FLOWING |
|
||
| Search index | page titles and text | the same page tree written by the build | Yes | ✓ FLOWING |
|
||
| API reference pages | README body | `modules/*/README.md` via `loadModules` | Yes | ✓ FLOWING |
|
||
|
||
### Behavioral Spot-Checks
|
||
|
||
| Behavior | Command | Result | Status |
|
||
| --- | --- | --- | --- |
|
||
| Full phase gate, including scratch-tree plants of the old holes | `bash scripts/check-phase11.1.sh --all` | all stages passed, `phase11.1 all passed`, exit 0 | ✓ PASS |
|
||
| Docsite coverage at least 85% | `go test -count=1 -cover ./internal/docsite` | `coverage: 94.1% of statements` | ✓ PASS |
|
||
| Callout src=, golang fence, wrong-case ident, env-prefix and flag-first commands | self-test plants inside the gate (real-tree copy) | each `expect_refusal` returned; stage printed `phase11.1 self-test passed` | ✓ PASS |
|
||
| Named tests, skips refused | gate `--named` (`go test -json -count=1`) | `phase11.1 named passed` | ✓ PASS |
|
||
| Full module tests | gate `--go` (`go vet ./...` then `go test ./...`) | `phase11.1 go passed` (many packages `(cached)` after `--named` had already run the docs packages with `-count=1`) | ✓ PASS |
|
||
|
||
### Probe Execution
|
||
|
||
| Probe | Command | Result | Status |
|
||
| --- | --- | --- | --- |
|
||
| `scripts/check-phase11.1.sh` | `bash scripts/check-phase11.1.sh --all` | exit 0, `phase11.1 all passed` | PASS |
|
||
|
||
### Requirements Coverage
|
||
|
||
| Requirement | Source Plan | Description | Status | Evidence |
|
||
| --- | --- | --- | --- | --- |
|
||
| DOCS-01 | 01, 03, 04, 06 | Markdown pages with strict frontmatter in Winter sections; every module reachable via an API page | ✓ SATISFIED | Truth 1 |
|
||
| DOCS-02 | 01, 02, 06 | self-contained site, docs:serve on loopback, no Node, only chroma/v2 added | ✓ SATISFIED | Truth 2. Search and theme interaction remain human UAT, as 11.1-VALIDATION.md already records. |
|
||
| DOCS-03 | 01, 06 | llms.txt, llms-full.txt, .md per page, sync test | ✓ SATISFIED | Truth 3 |
|
||
| DOCS-04 | 01–07 | every Go fence in docs/ has src=; a test fails on a missing or drifted snippet; Examples carry Output and run | ✓ SATISFIED | Truths 4, 6, 7 and G1–G7, G10. REQUIREMENTS.md still shows this box open and the traceability row as Gaps Found; this dispatch was not allowed to edit that file. The code satisfies the requirement. |
|
||
| DOCS-05 | 02, 06, 07 | checkers fail on stale identifiers, broken links and anchors, unknown commands, forbidden names | ✓ SATISFIED | Truth 8 and G8–G9. Same note: the REQUIREMENTS.md checkbox was left for a later edit and is not evidence. |
|
||
| DOCS-06 | 03, 04, 06 | concept map with checker-verified identifiers | ✓ SATISFIED | Truth 9 |
|
||
| DOCS-07 | 05, 06 | acme/blog walkthrough as a real in-root package | ✓ SATISFIED | Truth 5 |
|
||
| DOCS-08 | 02, 06 | CLAUDE.md documentation rule naming the checkers | ✓ SATISFIED | Truth 10 |
|
||
|
||
No orphaned requirement. REQUIREMENTS.md maps exactly DOCS-01 through DOCS-08 to Phase 11.1, and every ID is claimed by at least one plan.
|
||
|
||
### Decision Coverage
|
||
|
||
All trackable CONTEXT.md decisions are honored by shipped artifacts. 18 honored, 18 total, none missing. Non-blocking.
|
||
|
||
### Prohibitions (judgment-tier)
|
||
|
||
**unverified-prohibition — human review recommended.** These verdicts are a non-authoritative LLM judge. They are not a silent pass. Autonomous completion is complete with 7 flagged prohibitions.
|
||
|
||
| # | Statement | Verdict | Evidence |
|
||
| --- | --- | --- | --- |
|
||
| 1 | The built site must not reference a third-party origin for assets (plans 01, 02) | holds | Theme templates and assets were not modified by plan 07. The gate rebuilt the site. Prior inspection (no external `src=`, vendored font `url()`) still applies to those unchanged files. |
|
||
| 2 | The theme must not load third-party fonts, icons or scripts, and has no analytics | holds | Same unchanged theme tree. Licences ship under the theme assets. |
|
||
| 3 | The docs must not describe an unprovided WinterCMS feature as available (plans 03, 04) | holds | Not provided table re-read this pass; it links Frontend and AJAX. `docs/site.yaml` `llms_notes` still say the framework is headless. |
|
||
| 4 | The docs must not present an insecure setting as the default (plan 04) | holds (spot-check carried forward) | Mail, push, search and serve pages were not in the plan 07 diff. A full read is still a human item. |
|
||
| 5 | The walkthrough must not show a write without a fill allow-list, or an admin controller without a permission | holds | `lagoon.Fill(post, post.Fillable(), ...)` in `docs/examples/blog/models/post.go`; `RequiredPermissions` in `controllers/posts.go`. |
|
||
| 6 | The gate must not count a skipped, filtered or zero-match run as a pass | holds | `detect_json` exits on `skip`, `no tests to run`, zero passes and a missing required name. `--named` passed under that detector. |
|
||
| 7 | The site must not show a source caption over a code block the snippet checker did not compare (plan 07) | holds | `fenceAnnotator` matches the checked set. `TestFenceCaptionsOnlyVerified` and the acceptance figcaption cross-check ran inside the gate. |
|
||
|
||
### Test Quality Audit
|
||
|
||
| Test File | Linked Req | Active | Skipped | Circular | Assertion Level | Verdict |
|
||
| --- | --- | --- | --- | --- | --- | --- |
|
||
| `internal/docsite/violations_test.go` | DOCS-04, DOCS-05 | 81 directory cases plus runtime forbidden plants; each expects exactly one problem and a refused Build | 0 (`t.Skip` absent in `internal/docsite/*_test.go`) | No. Expected text is the planted `want.txt`, not output of the checker | Value | OK |
|
||
| `internal/docsite/snippet_test.go` `TestSnippetRootsAndBuild` | DOCS-04 | reachability and `Extract` error substrings | 0 | No. Oracle is `go/doc` and `go/build`, not the checker echoing itself | Behavioral | OK |
|
||
| `internal/docsite/checks_test.go` `TestCommandWord`, `TestIdentifierGoDocCaseSensitive`, `TestNestedFenceChecks` | DOCS-04, DOCS-05 | table and fixture assertions | 0 | No | Value | OK |
|
||
| `cmd/summer/phase11_1_acceptance_test.go` | DOCS-01..07 | SC1–SC5 plus `TestAcceptanceFenceScanner` | 0 in the named run (a skip would have failed the gate) | No. Scanner is independent of `docsite.collectFences` | Behavioral | OK |
|
||
| `scripts/check-phase11.1.sh` self-test | DOCS-04, DOCS-05 | plants on a copy of the real tree | n/a | No. The plant is a hand-written bad fence, not generated by the checker | Behavioral | OK |
|
||
|
||
**Disabled tests on requirements:** 0
|
||
**Circular patterns detected:** 0
|
||
**Insufficient assertions:** 0
|
||
|
||
### Anti-Patterns Found
|
||
|
||
| File | Line | Pattern | Severity | Impact |
|
||
| --- | --- | --- | --- | --- |
|
||
| phase Go, the gate script, `docs/console/utilities.md`, `README.md` | — | TBD / FIXME / XXX | — | none |
|
||
| `internal/docsite` | — | `t.Skip` | — | none |
|
||
|
||
### Advisory (New Scope, Unevidenced)
|
||
|
||
New-scope findings from this re-verification with no deterministic evidence. Not blocking. They do not reopen a closed must-have.
|
||
|
||
| # | Finding | Category | Why Advisory |
|
||
| --- | --- | --- | --- |
|
||
| 1 | Identifier index still parses build-ignored Go files | other | Named in the plan 07 summary as out of scope. Not a prior gap. No failing test was run. |
|
||
|
||
### Human Verification Required
|
||
|
||
Automated checks passed. These items are why status is `human_needed` rather than `passed`.
|
||
|
||
### 1. Search interaction
|
||
|
||
**Test:** Run `summer docs:serve`, search for a module name and a CLI command, use arrow keys and Enter.
|
||
**Expected:** Rows show section, title, heading and a marked excerpt; Enter opens the page; the live region announces the count.
|
||
**Why human:** Plan 02 and plan 06 backstop. No JS test runner.
|
||
|
||
### 2. Theme, contrast, no flash
|
||
|
||
**Test:** Cycle light, dark and system; reload; check a guide page and an API page at 1280px, 1024px and 375px.
|
||
**Expected:** No flash; the choice persists; UI-SPEC contrast holds.
|
||
**Why human:** Visual and first-paint timing.
|
||
|
||
### 3. No-JS layout
|
||
|
||
**Test:** Disable JavaScript and load a guide page below 1024px.
|
||
**Expected:** Sidebar above the content; search and theme buttons hidden.
|
||
**Why human:** Plan 02 backstop.
|
||
|
||
### 4. Raw files for an agent
|
||
|
||
**Test:** Read `llms.txt`, one page `.md` and `llms-full.txt`.
|
||
**Expected:** Spec shape and URLs that are useful without HTML.
|
||
**Why human:** Plan 01 backstop (`insufficient_spec`). unverified — held-out test recommended.
|
||
|
||
### 5. Editorial and walkthrough
|
||
|
||
**Test:** Read Setup, Backend, Database and Services, and follow `docs/setup/porting-a-plugin.md`.
|
||
**Expected:** WinterCMS tone, accurate to the READMEs, ending at `docs/examples/blog`.
|
||
**Why human:** Plans 03, 04 and 05 backstop.
|
||
|
||
### 6. Judgment-tier prohibitions
|
||
|
||
**Test:** Confirm the seven prohibition rows above.
|
||
**Expected:** Each holds.
|
||
**Why human:** unverified-prohibition — human review recommended.
|
||
|
||
### Gaps Summary
|
||
|
||
No code gap remains from the previous report. Fence discovery, proof of execution, and the identifier and command forms now fail closed, with planted fixtures and a green `scripts/check-phase11.1.sh --all`. Nothing in a later milestone phase was needed to defer them. The open work is human UAT already scheduled in `11.1-VALIDATION.md`, plus explicit resolution of the judgment-tier prohibitions. Do not open another gap-closure plan for those.
|
||
|
||
---
|
||
|
||
_Verified: 2026-10-01T07:31:53Z_
|
||
_Verifier: the agent (gsd-verifier)_
|