One'),
+ waitImpl: async () => {},
+ }), /more than 2 content pages/i);
+
+ assert.deepEqual(await readdir(outputRoot), ['previous.md']);
+ assert.equal(await readFile(path.join(outputRoot, 'previous.md'), 'utf8'), 'previous snapshot');
+ assert.equal(await readFile(manifestPath, 'utf8'), '{"snapshot":"previous"}\n');
});
test('capture command reports failure after the crawler preserves its manifest', async () => {
@@ -220,3 +442,11 @@ function response(body, status = 200) {
headers: { 'content-type': 'text/html; charset=utf-8' },
});
}
+
+function redirectResponse(location, status = 302) {
+ return new Response('', {
+ status,
+ statusText: status === 302 ? 'Found' : 'Redirect',
+ headers: { location },
+ });
+}
diff --git a/to-be-studied/README.md b/to-be-studied/README.md
index f827a94..2c6fa6b 100644
--- a/to-be-studied/README.md
+++ b/to-be-studied/README.md
@@ -2,7 +2,7 @@
This directory is a research snapshot of public, unauthenticated pages from `https://wiki.msvincognito.nl/`. It is not a source for the published migration and may contain incomplete, superseded, or outdated material.
-The snapshot was captured on 2026-08-02 with `npm run capture:live-wiki`. The crawler stays on the live wiki's origin, never authenticates or submits forms, waits 150 ms between requests, refuses to crawl more than 500 content pages, and records request failures in `manifest.json`. It converts the first `` element (falling back to `` and then ``) to readable Markdown after removing site chrome. Public navigation enumerated the content; the site's `/sitemap.xml` and `/robots.txt` routes both render its soft-404 page, so neither supplied additional URLs. The capture excludes navigation category URLs that return the same deterministic soft-404 page instead of content.
+The snapshot was captured on 2026-08-02 with `npm run capture:live-wiki`. The crawler stays on the live wiki's origin, never authenticates or submits forms, waits 150 ms between every request and redirect hop, refuses to crawl more than 500 content pages, and records request failures in `manifest.json`. It follows only bounded, same-origin redirects and records each final canonical URL once. It converts the first `` element (falling back to `` and then ``) to readable Markdown after removing site chrome. Public navigation enumerated the content; the site's `/sitemap.xml` and `/robots.txt` routes both render its soft-404 page, so neither supplied additional URLs. The capture excludes navigation category URLs that return the same deterministic soft-404 page instead of content.
Files under `live-wiki/2026-08-02/` retain their public source URL and capture date. `manifest.json` records the sorted capture inventory and SHA-256 hash of every Markdown file. `comparison.md` compares that inventory with the 29-entry DokuWiki export manifest.
diff --git a/to-be-studied/comparison.md b/to-be-studied/comparison.md
index c76b401..19760e1 100644
--- a/to-be-studied/comparison.md
+++ b/to-be-studied/comparison.md
@@ -1,14 +1,14 @@
# Export and live-wiki comparison
-This is a research inventory, not a merge decision. It compares the 98 successful pages in `manifest.json` with all 29 source entries in `docs/migration-manifest.json`. The comparison is page-level: a live course page can be new-only even when its surrounding year/programme taxonomy overlaps an exported index page.
+This is a research inventory, not a merge decision. It compares the 93 successful canonical pages in `manifest.json` with all 29 source entries in `docs/migration-manifest.json`. The comparison is page-level: a live course page can be new-only even when its surrounding year/programme taxonomy overlaps an exported index page. Five public navigation aliases redirect to canonical description routes and are not duplicated in the capture.
## New live-wiki pages with no exported page equivalent
-These 88 successful live pages have no one-to-one page in the export. Course titles are listed so every captured course page is concretely classified rather than represented only by a count.
+These 87 successful live pages have no one-to-one page in the export. Course titles are listed so every captured course page is concretely classified rather than represented only by a count.
| Live route or family | Count | Captured pages | Classification |
| --- | ---: | --- | --- |
-| `/computer-science` and `/computer-science/course-description` | 2 | Course Description (two routes with the same sparse content) | The export has no Computer Science programme page; its bachelor programme is Data Science and Artificial Intelligence. |
+| `/computer-science/course-description` | 1 | Course Description | The export has no Computer Science programme page; its bachelor programme is Data Science and Artificial Intelligence. The `/computer-science` navigation alias redirects here. |
| `/computer-science/year-1/**` | 12 | Discrete Math; Introduction to Computer Science; Procedural Programming; Calculus; Logic; Objects in Programming; Computer Architecture; Data Structures and Algorithms; Linear Algebra; Databases; Algorithmic Design; Statistics | New course-level hierarchy organized by year and period; the export has no corresponding course pages. |
| `/computer-science/year-2/**` | 14 | Intelligent User Interfaces; Introduction to Artificial Intelligence; Operating Systems; Computer Networks; Software Engineering and Architectures; Computer Security; Embedded Programming; Parallel Programming; Numerical Methods; Principles of Programming Languages; M2-1: AI and Machine Learning; M2-1: Intelligent Interaction; M2-2: Cybersecurity; M2-2: High Performance Computing | New course/elective pages; no exported equivalents. |
| `/computer-science/year-3/**` | 16 | Digital Society; Game Theory; Graph Theory; Introduction to Quantum Computing; Robotics and Embedded Systems; Ubiquitous Computing & Internet of Things; Block Chains; Cryptography; Immersive Technologies; Introduction to Bio-Informatics; Large Scale IT and Cloud Computing; Software and Systems Verification; Startup Engineering: Building Scalable Tech Ventures; The History and Philosophy of Computing; Operating Systems; Theory of Computing | New course/elective pages; no exported equivalents. |
@@ -53,13 +53,13 @@ All seven exported project pages are called out explicitly. Year landing pages a
| Export source path | Live URL | Substantive difference |
| --- | --- | --- |
| `pages/start.txt` + `pages/study.txt` | `https://wiki.msvincognito.nl/` | The export has association/registration/editing instructions, official links, Maastricht University context, and programme descriptions. The live home is a short DACS landing page linking four programme areas and Useful Guides. |
-| `pages/study/bachelor.txt` | `https://wiki.msvincognito.nl/data-science-and-artificial-intelligence` and `/course-description` | Both identify the Data Science and Artificial Intelligence bachelor area. The export explains the programme index and contribution workflow; both live routes currently contain only a sparse “Course Description / #Hello” page. |
+| `pages/study/bachelor.txt` | `https://wiki.msvincognito.nl/data-science-and-artificial-intelligence/course-description` | Both identify the Data Science and Artificial Intelligence bachelor area. The export explains the programme index and contribution workflow; the canonical live route currently contains only a sparse “Course Description / #Hello” page. The base navigation route redirects here. |
| `pages/study/bachelor/year_1.txt` | `https://wiki.msvincognito.nl/data-science-and-artificial-intelligence/year-1/period-1/discrete-mathematics` (representative of 12 Year 1 leaf pages) | The export is a year index with a missing schedule image and page-creation controls. The live wiki has period/course leaf pages but its Year 1 and period category URLs render soft 404s. |
| `pages/study/bachelor/year_2.txt` | `https://wiki.msvincognito.nl/data-science-and-artificial-intelligence/year-2/period-1/databases` (representative of 13 Year 2 leaf pages) | The export is a schedule/index shell plus upload instructions. The live wiki replaces that organization with period/elective course leaves and no valid Year 2 landing page. |
| `pages/study/bachelor/year_3.txt` | `https://wiki.msvincognito.nl/data-science-and-artificial-intelligence/year-3/period-4/data-analysis` (representative of 16 Year 3 leaf pages) | The export discusses thesis timing and indexes thesis/project/study-abroad pages. The live branch lists course/elective leaves and contains no thesis or project page. |
-| `pages/study/master_ai.txt` | `https://wiki.msvincognito.nl/artificial-intelligence` and `/course-description` | Both label the MSc Artificial Intelligence area. The export describes course summaries, exams, year navigation, and contribution flow; the live routes are currently a sparse “Course Description / #Hello” page with no year/course content. |
-| `pages/study/master_dsdm.txt` | `https://wiki.msvincognito.nl/data-science-for-decision-making` and `/course-description` | Both label the MSc Data Science for Decision Making area. The export has year navigation and contribution context; the live routes contain only the sparse description placeholder. |
-| `pages/study/useful_information.txt` | `https://wiki.msvincognito.nl/useful-guides` and `/description` | The export indexes locations, IT services, and laptop advice. The live index instead presents Housing, Laptop Buying Advice, Linux Tricks, and Surviving DACS, and claims the guides are updated “somewhat regularly.” |
+| `pages/study/master_ai.txt` | `https://wiki.msvincognito.nl/artificial-intelligence/course-description` | Both label the MSc Artificial Intelligence area. The export describes course summaries, exams, year navigation, and contribution flow; the canonical live route is currently a sparse “Course Description / #Hello” page with no year/course content. The base navigation route redirects here. |
+| `pages/study/master_dsdm.txt` | `https://wiki.msvincognito.nl/data-science-for-decision-making/course-description` | Both label the MSc Data Science for Decision Making area. The export has year navigation and contribution context; the canonical live route contains only the sparse description placeholder. The base navigation route redirects here. |
+| `pages/study/useful_information.txt` | `https://wiki.msvincognito.nl/useful-guides/description` | The export indexes locations, IT services, and laptop advice. The canonical live index instead presents Housing, Laptop Buying Advice, Linux Tricks, and Surviving DACS, and claims the guides are updated “somewhat regularly.” The `/useful-guides` navigation alias redirects here. |
| `pages/study/useful_information/pages/laptop_buy_advice.txt` | `https://wiki.msvincognito.nl/useful-guides/laptop-buying-advice` | The live page preserves and edits the exported tier guide, marks it as last updated 2021, and adds a current minimum of 16 GB RAM/512 GB SSD, Apple M-series compatibility, and an Nvidia/CUDA recommendation for data-science programmes. |
## Navigation placeholders excluded from the capture
diff --git a/to-be-studied/live-wiki/2026-08-02/artificial-intelligence.md b/to-be-studied/live-wiki/2026-08-02/artificial-intelligence.md
deleted file mode 100644
index c0d0493..0000000
--- a/to-be-studied/live-wiki/2026-08-02/artificial-intelligence.md
+++ /dev/null
@@ -1,8 +0,0 @@
-> Source: https://wiki.msvincognito.nl/artificial-intelligence
-> Captured: 2026-08-02
-
-# Course Description
-
-#Hello
-
-#Hello
diff --git a/to-be-studied/live-wiki/2026-08-02/computer-science.md b/to-be-studied/live-wiki/2026-08-02/computer-science.md
deleted file mode 100644
index 4b5afda..0000000
--- a/to-be-studied/live-wiki/2026-08-02/computer-science.md
+++ /dev/null
@@ -1,8 +0,0 @@
-> Source: https://wiki.msvincognito.nl/computer-science
-> Captured: 2026-08-02
-
-# Course Description
-
-#Hello
-
-#Hello
diff --git a/to-be-studied/live-wiki/2026-08-02/data-science-and-artificial-intelligence.md b/to-be-studied/live-wiki/2026-08-02/data-science-and-artificial-intelligence.md
deleted file mode 100644
index d4e7c3c..0000000
--- a/to-be-studied/live-wiki/2026-08-02/data-science-and-artificial-intelligence.md
+++ /dev/null
@@ -1,8 +0,0 @@
-> Source: https://wiki.msvincognito.nl/data-science-and-artificial-intelligence
-> Captured: 2026-08-02
-
-# Course Description
-
-#Hello
-
-#Hello
diff --git a/to-be-studied/live-wiki/2026-08-02/data-science-for-decision-making.md b/to-be-studied/live-wiki/2026-08-02/data-science-for-decision-making.md
deleted file mode 100644
index 4c28efa..0000000
--- a/to-be-studied/live-wiki/2026-08-02/data-science-for-decision-making.md
+++ /dev/null
@@ -1,8 +0,0 @@
-> Source: https://wiki.msvincognito.nl/data-science-for-decision-making
-> Captured: 2026-08-02
-
-# Course Description
-
-#Hello
-
-#Hello
diff --git a/to-be-studied/live-wiki/2026-08-02/useful-guides.md b/to-be-studied/live-wiki/2026-08-02/useful-guides.md
deleted file mode 100644
index 0c7fba7..0000000
--- a/to-be-studied/live-wiki/2026-08-02/useful-guides.md
+++ /dev/null
@@ -1,50 +0,0 @@
-> Source: https://wiki.msvincognito.nl/useful-guides
-> Captured: 2026-08-02
-
-# Useful Guides
-
-Essential resources and tips for your academic journey at Maastricht University
-
-Welcome to the **Useful Guides** section of the Incognito Wiki! This collection contains practical resources and tips to help you navigate your academic journey and student life at **Maastricht University**.
-
-[
-
-### Housing Guide
-
-Essential information for finding accommodation in **Maastricht**. Navigate the housing market, understand rental agreements, and discover the best neighborhoods for students.
-
-
-
-](https://wiki.msvincognito.nl/useful-guides/housing-guide)
-
-[
-
-### Laptop Buying Advice
-
-Recommendations for choosing the right laptop for your studies. Get insights on specifications, brands, and budget considerations tailored for **DACS students**.
-
-
-
-](https://wiki.msvincognito.nl/useful-guides/laptop-buying-advice)
-
-[
-
-### Linux Tricks
-
-Helpful tips and commands for working with **Linux systems**. Master the command line, learn essential shortcuts, and boost your productivity.
-
-
-
-](https://wiki.msvincognito.nl/useful-guides/linux-tricks)
-
-[
-
-### Surviving DACS
-
-Insider tips for making the most of your time in the **Department of Data Science & Knowledge Engineering**. Study strategies, course insights, and academic advice.
-
-
-
-](https://wiki.msvincognito.nl/useful-guides/survivingdacs)
-
-These guides are created by fellow students and updated somewhat regularly to ensure they remain relevant and helpful. Whether you're a first-year student just starting out or a senior looking for specific technical advice, you'll find valuable information here to support your academic success.
diff --git a/to-be-studied/manifest.json b/to-be-studied/manifest.json
index cca3e6f..ab0eb47 100644
--- a/to-be-studied/manifest.json
+++ b/to-be-studied/manifest.json
@@ -8,24 +8,12 @@
"path": "live-wiki/2026-08-02/index.md",
"contentHash": "f1dae2fe65c445a89efae3a2b2b88e9e00c942894d64a158a9fc1ce69c71edb5"
},
- {
- "url": "https://wiki.msvincognito.nl/artificial-intelligence",
- "title": "Course Description",
- "path": "live-wiki/2026-08-02/artificial-intelligence.md",
- "contentHash": "f2bb513f738e2dd940b4c6c5be2295d65fc9c0c7a59e96a93edef0efefafea36"
- },
{
"url": "https://wiki.msvincognito.nl/artificial-intelligence/course-description",
"title": "Course Description",
"path": "live-wiki/2026-08-02/artificial-intelligence/course-description.md",
"contentHash": "9643a34b326331798ab1ac3d512f8b65107b6eb4029bb364a40cec7797fea982"
},
- {
- "url": "https://wiki.msvincognito.nl/computer-science",
- "title": "Course Description",
- "path": "live-wiki/2026-08-02/computer-science.md",
- "contentHash": "e815decc8bc817d8338a3950451f729790feec25fc06e9663cad6a7ce0139d39"
- },
{
"url": "https://wiki.msvincognito.nl/computer-science/course-description",
"title": "Course Description",
@@ -284,12 +272,6 @@
"path": "live-wiki/2026-08-02/computer-science/year-3/period-4/theory-of-computing.md",
"contentHash": "9e804bc6fad536feeebf5268ddfd6d597787f534b5de76c03d51f8b52283e71e"
},
- {
- "url": "https://wiki.msvincognito.nl/data-science-and-artificial-intelligence",
- "title": "Course Description",
- "path": "live-wiki/2026-08-02/data-science-and-artificial-intelligence.md",
- "contentHash": "8d9f7850bc1124678c0ee0533472423bf0ea4906ef95471ea87de3ec1fe5ab10"
- },
{
"url": "https://wiki.msvincognito.nl/data-science-and-artificial-intelligence/course-description",
"title": "Course Description",
@@ -542,24 +524,12 @@
"path": "live-wiki/2026-08-02/data-science-and-artificial-intelligence/year-3/period-4/operations-research.md",
"contentHash": "542864580dd0d5e839ce607581807bfdde2454e591980948e0d3828233070250"
},
- {
- "url": "https://wiki.msvincognito.nl/data-science-for-decision-making",
- "title": "Course Description",
- "path": "live-wiki/2026-08-02/data-science-for-decision-making.md",
- "contentHash": "a9a3d434f808edcfd5760bc99433b568268de7548bd4a9a9da51677ea78899f1"
- },
{
"url": "https://wiki.msvincognito.nl/data-science-for-decision-making/course-description",
"title": "Course Description",
"path": "live-wiki/2026-08-02/data-science-for-decision-making/course-description.md",
"contentHash": "d356ae2e36ef1fa1a575d9afe333597864a0da19e18e99ebecc575c733007858"
},
- {
- "url": "https://wiki.msvincognito.nl/useful-guides",
- "title": "Useful Guides",
- "path": "live-wiki/2026-08-02/useful-guides.md",
- "contentHash": "b60fccd25e412b5f52149f89e4efa2f802c14f1a0c44500190ec099f5cd997f6"
- },
{
"url": "https://wiki.msvincognito.nl/useful-guides/description",
"title": "Useful Guides",