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
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
16 changes: 15 additions & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,21 @@ jobs:
# a snapshot generated on one platform can never match a rebuild on the
# other. Everything else (HTML, JS, CSS, assets) is byte-identical
# across both. Tracked as UPD-004 in UPDATES-NEEDED.md.
drift="$(git status --porcelain -- static-site | grep -v '/__next\.' || true)"
#
# The default 404/not-found pages are also excluded. Two Linux builds
# of the same commit have been observed to emit the same <head> tags
# on these routes in a different order (a <title> and a <meta
# name="robots"> swapping places) — a race in Next.js's own default
# export-mode 404 handling, not anything in src/. Any real content
# regression on these routes (e.g. a broken header or footer) would
# still be caught, since every other page shares the same layout and
# is not excluded. Tracked as UPD-020 in UPDATES-NEEDED.md.
drift="$(git status --porcelain -- static-site \
| grep -v '/__next\.' \
| grep -v '^.. static-site/404\.html$' \
| grep -v '^.. static-site/404/index\.html$' \
| grep -v '^.. static-site/_not-found/index\.html$' \
|| true)"
if [ -z "$drift" ]; then
echo "static-site/ matches src/."
exit 0
Expand Down
40 changes: 40 additions & 0 deletions UPDATES-NEEDED.md
Original file line number Diff line number Diff line change
Expand Up @@ -507,6 +507,46 @@ produces the same CSS chunk hash as one regenerated on Linux, or the
Windows→Linux-artifact workaround above is written into `CONTRIBUTING.md` as
the documented procedure.

### UPD-020 - The default 404/not-found page's `<head>` tag order is non-deterministic

**Priority:** Low

While chasing UPD-019's CSS discrepancy, two separate Linux CI builds of the
exact same commit (one triggered by `workflow_dispatch`, one rebuilt moments
later for comparison) produced byte-identical output everywhere except
`404.html`, `404/index.html`, and `_not-found/index.html`. The diff is not
content, only order: one build emitted
`<title>404: This page could not be found.</title><meta name="robots"
content="noindex"/>`, the other emitted the same two tags swapped. This
repeated on a second pair of same-commit Linux builds, so it is a genuine
run-to-run race, not a Windows-vs-Linux difference, and not caused by any
particular source change — `src/app` has no custom `not-found.tsx`, so both
tags come from Next.js's own default export-mode 404 handling. The likely
cause is concurrent metadata resolution (the root layout and the generated
not-found boundary both contributing `<head>` tags) racing during static
export, which is a known class of issue in the app router's streaming
metadata API.

The tags themselves are correct and harmless either way — this does not
affect page behavior, SEO, or appearance — but it means
`npm run check:snapshot` / CI's drift check can fail on these two routes for
a commit that has not actually drifted, indistinguishable at a glance from a
real missed `npm run sync:static`. It surfaced now only because recent PRs
happened to trigger enough separate rebuilds in a row (chasing UPD-019) to
catch it; it was very likely always possible.

**Proposed update:** Either special-case these two routes out of the drift
check the same way `__next.*` is excluded (with the same comment explaining
why), or find the specific concurrent `generateMetadata`/root-layout
resolution path responsible and make its tag emission order deterministic
upstream in Next.js. Re-running CI is a sufficient workaround for a human
hitting this by chance; it is not a fix.

**Acceptance:** A commit that has not touched `src/` no longer fails
`check:snapshot` on `404.html` / `_not-found` across repeated Linux rebuilds,
or the two routes are excluded from the drift check with the reasoning
recorded in `ci.yml`.

### UPD-017 - Decide how UI symbols are drawn

**Priority:** Medium — **done.**
Expand Down
19 changes: 19 additions & 0 deletions src/content/site.ts
Original file line number Diff line number Diff line change
Expand Up @@ -757,6 +757,25 @@ export const publications = {
},

// ── Practice guides ──────────────────────────────────────────────────
{
// The newest entry on this shelf — placed first so the Guidelines
// list reads most-recent-to-earliest. Public repo with its own
// GitHub Pages dashboard, so url points straight at that (no on-site
// reader page exists for it, unlike the Cyber Dictionary below).
index: "33",
area: "Guidelines",
topic: "Guidelines",
question:
"How do you start a project with an AI assistant without skipping the thinking?",
title:
"Project Startup Guide: Think in Documents, Review With a Human, Then Build",
summary:
"A starter kit and interactive dashboard for students and non-engineers beginning a project with AI assistance. Four Markdown documents to write before any code — concept/idea, specification, plan and backlog — each gated by a human review before work moves forward, plus a recommended free toolchain and MCP server setup. The dashboard walks the whole method step by step with progress tracking, copy-ready prompts, and downloadable templates; this repository is the source behind it.",
status: "Published",
date: "September 2026",
url: "https://ethical-tech-colab.github.io/project-startup-guide/",
repo: "https://github.com/Ethical-Tech-CoLab/project-startup-guide",
},
{
// Also a public tool rather than an internal guide: no
// access: "internal", and it sits on the Guidelines shelf because it is
Expand Down
2 changes: 1 addition & 1 deletion static-site/404.html

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion static-site/404/index.html

Large diffs are not rendered by default.

Loading
Loading