Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 0 additions & 28 deletions .github/workflows/rebuild-content.yml
Original file line number Diff line number Diff line change
Expand Up @@ -83,11 +83,6 @@ on:
required: false
type: boolean
default: false
legacy-concept-render:
description: '#1327 escape hatch. Default (false): CAP renders /concepts/ list + detail pages server-side; the Hugo concept fetcher is skipped and publish-content calls the render-concepts phase. Set true to restore the legacy Hugo concept pipeline (fetch-concepts emits .md, publish-content walks hugo/public/concepts).'
required: false
type: boolean
default: false

env:
NODE_VERSION: '22'
Expand Down Expand Up @@ -387,24 +382,6 @@ jobs:
env:
CAP_BASE_URL: ${{ steps.srv.outputs.srv_url }}

# [Phase 3-A] Fetch published-concept payload from CAP and write
# one hugo/content/concepts/<slug>.md per published concept. Runs on
# `full` and `catalog-only`; skipped on `slug-targeted` (a single-tutorial
# rebuild does not need concept landing-page regeneration). The Hugo
# build picks up the new .md files in the subsequent build step.
# All other Phase 3-A wiring (classifier, kg.after hook, Hugo layout,
# publish-content concept support, AppRouter route, CAP serve handler)
# shipped in #685 — only this workflow invocation was missing.
- name: Fetch published concepts
if: ${{ steps.mode.outputs.effective_mode != 'slug-targeted' }}
run: npm run fetch-concepts
env:
CAP_BASE_URL: ${{ steps.srv.outputs.srv_url }}
# #1327 — fetch-concepts.ts self-guards: it early-exits unless
# LEGACY_CONCEPT_RENDER=true (default new pipeline renders concepts
# in CAP). Passing the input keeps the escape hatch one flag away.
LEGACY_CONCEPT_RENDER: ${{ inputs.legacy-concept-render == true && 'true' || 'false' }}

# [#759] Homepage data feeds — homepage-shelves (60 link cards),
# verb-definitions (6 verb tile back-faces), shelf-definitions
# (4 shelf-header explainers). All three are read by Hugo at build
Expand Down Expand Up @@ -564,11 +541,6 @@ jobs:
# other mode → whole-catalog delta, unchanged. TUTORIAL_SLUG is the
# already-resolved slug (inputs.slug || dispatch_slug).
PUBLISH_SLUG: ${{ steps.mode.outputs.effective_mode == 'slug-targeted' && (inputs.slug || steps.mode.outputs.dispatch_slug) || '' }}
# #1327 — drives publish-content's concept handling. Default (false):
# skip the hugo/public/concepts walk and call the render-concepts
# phase (CAP renders concept detail BLOBs). true: legacy Hugo walk,
# no render-concepts call.
LEGACY_CONCEPT_RENDER: ${{ inputs.legacy-concept-render == true && 'true' || 'false' }}

# #1373 — synthetic watchdog. A green publish step is not proof rows
# landed (the #1372 render-concepts 404 aborted AFTER an earlier
Expand Down
7 changes: 5 additions & 2 deletions docs/developers/architecture/knowledge-graph.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,8 +22,11 @@ Each sub-phase adds one corpus with:
and `renderMeta`.
- A union extension in `hugo-apps/src/related-graph/types.ts` (`NodeType` +
`OtherResource.type`).
- A Hugo template section appended to `hugo/layouts/concepts/single.html`.
- A frontmatter emission block in `scripts/fetch-concepts.ts`.
- A `<section data-kg-section="…">` block in the concept detail template
`srv/lib/templates/concept-detail.ejs`, rendered server-side by CAP
(`srv/lib/concept-detail-render.js`) into the `concept-<slug>` BLOB. (The
legacy Hugo concept path — `hugo/layouts/concepts/single.html` +
`scripts/fetch-concepts.ts` — was retired in #1327.)

### Phase 4.1 — Learning journeys (#447)

Expand Down
2 changes: 1 addition & 1 deletion docs/developers/operations/testing-endpoints.md
Original file line number Diff line number Diff line change
Expand Up @@ -171,7 +171,7 @@ When `EXPOSE_CAP_UI=true` is set on the CAP srv app, these are accessible throug
| `/build/slug-mapping` | GET | Slug→ID mapping for all missions/groups | None |
| `/build/repo-catalog` | GET | Slug-keyed `DiscoveredTutorial` map (third-tier discovery fallback) | None |
| `/build/repo-catalog` | POST | Write the discovered-tutorial baseline (CI-as-canonical-writer) | Bearer (`CONTENT_API_KEY`) |
| `/build/concepts` | GET | Published Knowledge-Graph concepts (slug, name, description, teaches/requires/requiredBy/relatedTo). Consumed at build time by `scripts/fetch-concepts.ts`. | None |
| `/build/concepts` | GET | Published Knowledge-Graph concepts (slug, name, description, teaches/requires/requiredBy/relatedTo). Shares `buildConceptsPayload` with the CAP concept-render pipeline (`GET /content/concepts-index` list page + the `POST /content/publish/render-concepts` detail phase, #1327). | None |
| `/graph/publishConcept` | POST | Admin action — sets `publishedAt` + `publishedBy` on a Concept | XSUAA + `KnowledgeGraph.Admin` |
| `/graph/unpublishConcept` | POST | Admin action — clears `publishedAt` + `publishedBy` on a Concept | XSUAA + `KnowledgeGraph.Admin` |
| `/graph/explore-data` | GET | Bulk graph JSON for the `/explore/` page (nodes + edges + generatedAt; 5-min LRU cache) | None |
Expand Down
2 changes: 1 addition & 1 deletion docs/superpowers/plans/2026-07-08-concepts-scale.md
Original file line number Diff line number Diff line change
Expand Up @@ -607,7 +607,7 @@ Fetch payload once. Read shell fragments once (throw → whole phase fails: "she
- [ ] **Step 1** Snapshot parity (**required PR check before Task 5 lands**): 10 hand-picked slugs (varied shapes) in the fixture. Fetch legacy Hugo output from DEV; render same slugs via new pipeline; diff allowing an explicit expected-diff list (render-source marker, `<script>` whitespace). Fail on unexpected diffs.
- [ ] **Step 2** Smoke (`test/smoke/concepts-page.test.js`): `/concepts/` 200, `text/html`, gzip < 2MB, `#concepts-data` array of expected length, SSR `<li>` count == min(100,N), `/concepts/cap/` 200, cache headers, p50 cold < 200ms / warm < 30ms.
- [ ] **Step 3** Load characterization (`hyperfine`, not a merge gate) — document p50/p95 in PR; block cutover if p95 cold > 300ms pending investigation.
- [ ] **Step 4 (deferred, own PR)** After ~2 weeks DEV stability: delete legacy Hugo concept path + flag (~200 lines net deletion).
- [x] **Step 4 (done, this PR)** Legacy Hugo concept path + `LEGACY_CONCEPT_RENDER` flag deleted after DEV+PROD stability confirmed (2026-08-09): removed `scripts/fetch-concepts.ts`, `hugo/layouts/concepts/{list,single}.html`, the `fetch-concepts` npm script + `build:all` reference, the workflow `legacy-concept-render` input + fetch step + publish env, and the `legacyConceptRender` branch in `publish-content.ts`.

---

Expand Down
3 changes: 2 additions & 1 deletion hugo-apps/src/concepts-filter/main.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
// hugo-apps/src/concepts-filter/main.ts
//
// Mount point for the concepts filter island (#859). The island targets
// the empty container Hugo emits in layouts/concepts/list.html —
// the empty container CAP emits in the concept list page shell
// (srv/lib/concept-list-page.js, #1327) —
// `<div id="concepts-filter-controls" hidden>` — fills it in, and reveals
// it. The rest of the page (grid, count, empty-state) is untouched by
// this bootstrap and manipulated directly by App.vue's watcher.
Expand Down
174 changes: 0 additions & 174 deletions hugo/layouts/concepts/list.html

This file was deleted.

Loading
Loading