Incognito-Wiki/docs/superpowers/plans/2026-08-03-publish-legacy-pdfs.md
msa46 c590f77d96
Some checks failed
Deploy to GitHub Pages / build (push) Has been cancelled
Deploy to GitHub Pages / deploy (push) Has been cancelled
feat: publish legacy course archive
2026-08-03 15:12:11 +02:00

78 lines
4.4 KiB
Markdown

# Publish Legacy PDFs Implementation Plan
> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking.
**Goal:** Publish all 332 permission-cleared legacy PDFs through a searchable Starlight archive without changing their bytes.
**Architecture:** Public files retain their DokuWiki-derived hierarchy under `public/media/legacy-dokuwiki/`. A generated Markdown catalog and explicit supplemental-content registry make the collection discoverable while keeping the original 29-page migration manifest unchanged.
**Tech Stack:** Astro 7, Starlight 0.41, Node.js 22, Markdown, Node test runner, Poppler `pdfinfo`.
## Global Constraints
- Publish exactly the 332 records in `docs/pdf-inventory.tsv`.
- Preserve PDF bytes, relative namespace paths, sizes, and SHA-256 checksums.
- Record the maintainer's 2026-08-03 permission confirmation.
- Preserve unrelated working-tree changes.
- Do not deploy or push.
---
### Task 1: Define the supplemental publication contract
**Files:**
- Create: `docs/supplemental-content.json`
- Modify: `scripts/audit-content.mjs`
- Modify: `tests/content-audit.test.mjs`
**Interfaces:**
- Consumes: original destinations from `docs/migration-manifest.json`
- Produces: an allowlist of `{ destination, source, category }` records loaded by `auditContent`
- [ ] **Step 1: Write failing audit tests** proving a declared supplemental page is accepted, an undeclared page is rejected, and a registry destination missing from disk is rejected.
- [ ] **Step 2: Run `node --test tests/content-audit.test.mjs`** and confirm the declared supplemental-page test fails.
- [ ] **Step 3: Add `docs/supplemental-content.json`** with the PDF archive destination and implement strict registry loading and validation in `scripts/audit-content.mjs`.
- [ ] **Step 4: Run `node --test tests/content-audit.test.mjs`** and confirm all content-audit tests pass.
### Task 2: Publish and verify the recovered files
**Files:**
- Move: `to-be-studied/legacy-pdfs/study/**` to `public/media/legacy-dokuwiki/study/**`
- Modify: `docs/pdf-inventory.tsv`
- Modify: `docs/pdf-publication-review.tsv`
- Modify: `docs/pdf-publication-review.md`
- Modify: `docs/pdf-archive.md`
- Modify: `to-be-studied/README.md`
- Create: `scripts/verify-pdf-archive.mjs`
- Create: `tests/pdf-archive.test.mjs`
**Interfaces:**
- Consumes: current inventory rows and staged PDFs
- Produces: byte-identical public files plus a verifier that returns counts and throws on missing files, size mismatches, checksum mismatches, duplicate public paths, or malformed PDF signatures
- [ ] **Step 1: Write failing verifier tests** using temporary valid-signature fixtures for success, missing-file, byte-count, and checksum cases.
- [ ] **Step 2: Run `node --test tests/pdf-archive.test.mjs`** and confirm failure because the verifier does not exist.
- [ ] **Step 3: Implement the verifier** and update inventory/review documentation to public URLs and permission-confirmed status.
- [ ] **Step 4: Move each inventoried file with an explicit source/destination mapping**, leaving no recovered PDF in the non-public staging directory.
- [ ] **Step 5: Run the verifier and `pdfinfo` over all public PDFs**; expect exactly 332 successes and matching hashes.
### Task 3: Add the searchable archive page
**Files:**
- Create: `src/content/docs/previous-exams-and-documents.md`
- Modify: `src/config/sidebar.mjs`
- Modify: `src/content/docs/bachelor/index.md`
- Modify: `src/content/docs/master-ai/index.md`
- Modify: `src/content/docs/master-dsdm/index.md`
- Modify: `tests/content-audit.test.mjs`
**Interfaces:**
- Consumes: the normalized `docs/pdf-inventory.tsv`
- Produces: `/previous-exams-and-documents/` with exactly one working link per inventory record
- [ ] **Step 1: Write failing tests** for archive frontmatter, sidebar registration, programme links, link count, and one-to-one inventory URL coverage.
- [ ] **Step 2: Run the focused tests** and confirm they fail before the page exists.
- [ ] **Step 3: Generate the archive Markdown** grouped by programme/course namespace with human-readable labels and original filenames.
- [ ] **Step 4: Add sidebar and programme links** and replace wording that still calls the recovered archive non-public.
- [ ] **Step 5: Run `npm run verify`** and confirm the full site, rendered output, and internal links pass with all 332 PDFs present in `dist/`.