Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
45 commits
Select commit Hold shift + click to select a range
74aab8f
ci(pages): harden Pages deploy (E5/J7) — pin utilities SHA, sparse ch…
docxology Sep 23, 2026
e101619
ci(integrity): E13 manifest staleness annotation + reconciliation
docxology Sep 23, 2026
a220429
docs(translations): migration map for legacy Translations/ (M2 part 1)
docxology Sep 23, 2026
7f12135
data(translations): migrate Applied Active Inference Symposium legacy…
docxology Sep 24, 2026
d730fd1
data(translations): migrate BookStream legacy Translations/ (M2 part 2)
docxology Sep 24, 2026
39d7827
data(translations): migrate Courses legacy Translations/ (M2 part 2)
docxology Sep 24, 2026
e43074b
data(translations): migrate GuestStream legacy Translations/ (M2 part 2)
docxology Sep 24, 2026
3127591
data(translations): migrate Insights legacy Translations/ (M2 part 2)
docxology Sep 24, 2026
d73abf9
data(translations): migrate Livestream legacy Translations/ (M2 part 2)
docxology Sep 24, 2026
3b9104d
data(translations): migrate MathStream legacy Translations/ (M2 part 2)
docxology Sep 24, 2026
5d4e08d
data(translations): migrate ModelStream legacy Translations/ (M2 part 2)
docxology Sep 24, 2026
f03025d
data(translations): migrate Roundtable legacy Translations/ (M2 part 2)
docxology Sep 24, 2026
670936c
data(translations): migrate TextbookGroup legacy Translations/ (M2 pa…
docxology Sep 24, 2026
897f5c4
data(translations): migrate Twitter Spaces legacy Translations/ (M2 p…
docxology Sep 24, 2026
dbc37ca
data(translations): record previous_paths for Applied Active Inferenc…
docxology Sep 24, 2026
3c2a110
data(translations): record previous_paths for BookStream (M2 part 2)
docxology Sep 24, 2026
a989c27
data(translations): record previous_paths for Courses (M2 part 2)
docxology Sep 24, 2026
60989a5
data(translations): record previous_paths for GuestStream (M2 part 2)
docxology Sep 24, 2026
1c6f14c
data(translations): record previous_paths for Insights (M2 part 2)
docxology Sep 24, 2026
348798d
data(translations): record previous_paths for Livestream (M2 part 2)
docxology Sep 24, 2026
8d8fe81
data(translations): record previous_paths for MathStream (M2 part 2)
docxology Sep 24, 2026
d9e5bd7
data(translations): record previous_paths for ModelStream (M2 part 2)
docxology Sep 24, 2026
76698a6
data(translations): record previous_paths for Roundtable (M2 part 2)
docxology Sep 24, 2026
e84a48f
data(translations): record previous_paths for TextbookGroup (M2 part 2)
docxology Sep 24, 2026
f1368bf
data(translations): record previous_paths for Twitter Spaces (M2 part 2)
docxology Sep 24, 2026
dd56fb2
docs(translations): mark 1,340 unmigrated files as REMAINING with rea…
docxology Sep 24, 2026
9539aa3
data(translations): resolve Applied Active Inference Symposium collap…
docxology Sep 24, 2026
1c14356
data(translations): resolve Courses collapse conflicts (M2 pass 2b)
docxology Sep 24, 2026
c207a84
data(translations): resolve GuestStream collapse conflicts (M2 pass 2b)
docxology Sep 24, 2026
b91782a
data(translations): resolve Livestream collapse conflicts (M2 pass 2b)
docxology Sep 24, 2026
77bcc4e
data(translations): resolve MathStream collapse conflicts (M2 pass 2b)
docxology Sep 24, 2026
12040e9
data(translations): resolve ModelStream collapse conflicts (M2 pass 2b)
docxology Sep 24, 2026
2147db2
data(translations): resolve MorphStream collapse conflicts (M2 pass 2b)
docxology Sep 24, 2026
ec91631
data(translations): resolve TextbookGroup collapse conflicts (M2 pass…
docxology Sep 24, 2026
a7b4d5f
data(translations): record previous_paths for Applied Active Inferenc…
docxology Sep 24, 2026
e4a485f
data(translations): record previous_paths for Courses conflicts pass …
docxology Sep 24, 2026
a3552ab
data(translations): record previous_paths for Livestream conflicts pa…
docxology Sep 24, 2026
757c905
data(translations): record previous_paths for MathStream conflicts pa…
docxology Sep 24, 2026
584746c
data(translations): record previous_paths for ModelStream conflicts p…
docxology Sep 24, 2026
a22874c
data(translations): record previous_paths for MorphStream conflicts p…
docxology Sep 24, 2026
3575052
data(translations): record previous_paths for TextbookGroup conflicts…
docxology Sep 24, 2026
e38ae28
docs(translations): record pass 2b conflict resolution in migration map
docxology Sep 24, 2026
059b948
merge: origin/main (org-migration repoint) into feat/m2-translations …
docxology Sep 24, 2026
075a6f6
docs(translations): record post-execution state, builder integration …
docxology Sep 24, 2026
21c5854
Merge remote-tracking branch 'origin/main' into feat/m2-translations
docxology Sep 24, 2026
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
  •  
  •  
  •  
80 changes: 50 additions & 30 deletions .github/workflows/deploy-pages.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,13 @@ on:
push:
branches:
- main
paths:
- 'data/**'
- 'INDEX.json'
- '.github/workflows/deploy-pages.yml'
workflow_dispatch:

permissions:
contents: write
pages: write
id-token: write

Expand All @@ -16,51 +19,68 @@ concurrency:
cancel-in-progress: false

jobs:
integrity:
uses: ./.github/workflows/journal-integrity.yml
permissions:
contents: read

build-and-deploy:
needs: integrity
runs-on: ubuntu-latest
timeout-minutes: 15
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
steps:
- name: Check out ActiveInferenceJournal
uses: actions/checkout@v4
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
with:
path: journal
fetch-depth: 0
fetch-depth: 1

- name: Check out Journal-Utilities
uses: actions/checkout@v4
# Pinned to the verified HEAD of Journal-Utilities main. The v0.1.0 tag
# peels to an older commit (bd875b20...); branch refs drift silently, so
# a SHA pin is the only stable choice until a newer release tag exists.
# Bump via Dependabot/Renovate or a reviewed PR (handoff E5/J7).
- name: Check out Journal-Utilities (pinned)
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
with:
repository: ActiveInferenceInstitute/Journal_Utilities
path: utilities
ref: ea873718a5de5317d3ae8d80cf2118f7792b179d path: utilities
fetch-depth: 1
sparse-checkout: |
scripts/build_pages_site.py
src/journal_utilities

- name: Install uv
uses: astral-sh/setup-uv@v5
- name: Set up Python
uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6
with:
enable-cache: true
python-version: "3.12"

- name: Build Static Site Bundle
# Plain stdlib python: build_pages_site.py imports only
# journal_utilities.site.builder (json/logging/re/shutil/pathlib).
# No uv sync, no torch/CUDA (handoff E5/J7).
- name: Build static site bundle
run: |
cd utilities
uv run python scripts/build_pages_site.py --journal ../journal --output ../_site
# Add .nojekyll to prevent Jekyll processing on GitHub Pages
touch ../_site/.nojekyll
python3 utilities/scripts/build_pages_site.py --journal journal --output _site
touch _site/.nojekyll

# 1. Deploy via GitHub Actions Pages artifact (when Pages source is GitHub Actions)
- name: Upload Pages Artifact
uses: actions/upload-pages-artifact@v3
- name: Upload Pages artifact
uses: actions/upload-pages-artifact@56afc609e74202658d3ffba0e8f6dda462b719fa # v3
with:
path: _site

- name: Deploy to GitHub Pages (Actions mode)
- name: Deploy to GitHub Pages
id: deployment
continue-on-error: true
uses: actions/deploy-pages@v4
uses: actions/deploy-pages@d6db90164ac5ed86f2b6aed7e0febac5b3c0c03e # v4

# 2. Deploy to gh-pages branch (when Pages source is "Deploy from a branch")
- name: Deploy to gh-pages branch (Branch mode)
uses: peaceiris/actions-gh-pages@v4
with:
github_token: ${{ secrets.GITHUB_TOKEN }}
publish_dir: ./_site
publish_branch: gh-pages
force_orphan: true
user_name: 'github-actions[bot]'
user_email: 'github-actions[bot]@users.noreply.github.com'
- name: Post-deploy smoke test
run: |
BASE="${{ steps.deployment.outputs.page_url }}"
status=0
for f in index.html manifest.json .nojekyll; do
code=$(curl -s -o /dev/null -w '%{http_code}' "$BASE$f")
echo "$f -> HTTP $code"
[ "$code" = "200" ] || status=1
done
exit $status
54 changes: 50 additions & 4 deletions .github/workflows/journal-integrity.yml
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ name: Validate journal integrity
on:
push:
pull_request:
workflow_call:

permissions:
contents: read
Expand All @@ -13,17 +14,18 @@ jobs:
timeout-minutes: 15
steps:
- name: Check out journal
uses: actions/checkout@v6
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3

# Pinned SHA (verified main HEAD 2026-09-23; v0.1.0 tag is older).
- name: Check out Journal-Utilities
uses: actions/checkout@v6
uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6.0.3
with:
repository: ActiveInferenceInstitute/Journal_Utilities
path: .journal-utilities
ref: ea873718a5de5317d3ae8d80cf2118f7792b179d path: .journal-utilities
fetch-depth: 1

- name: Install Python
uses: actions/setup-python@v6
uses: actions/setup-python@ece7cb06caefa5fff74198d8649806c4678c61a1 # v6
with:
python-version: "3.12"

Expand All @@ -40,3 +42,47 @@ jobs:
python .journal-utilities/scripts/validate_journal.py
--journal .
--manifest .journal-utilities/data/output/channel_videos.json

- name: Manifest staleness and reconciliation (E13)
run: |
python3 - <<'PY'
import collections
import datetime
import json

manifest = json.load(open(".journal-utilities/data/output/channel_videos.json"))
enumerated = datetime.datetime.fromisoformat(manifest["enumerated_at"])
age = (datetime.datetime.now(datetime.timezone.utc) - enumerated).days
listed = [v["id"] for v in manifest["videos"]]
mset = set(listed)
dupes = sorted(v for v, c in collections.Counter(listed).items() if c > 1)

index = json.load(open("INDEX.json"))
index_vids = set()
for it in index.get("items", []):
for p in it.get("parts", []):
index_vids.add(p if isinstance(p, str) else p.get("video_id"))

missing = sorted(mset - index_vids)
extra = sorted(index_vids - mset)
print(f"manifest: enumerated_at={manifest['enumerated_at']} age_days={age} "
f"declared={manifest.get('total_videos')} listed={len(listed)} "
f"unique={len(mset)} duplicate_ids={len(dupes)}")
print(f"INDEX: count={index.get('count')} unique_videos={index.get('unique_videos')} "
f"part_ids={len(index_vids)}")
print(f"reconciliation: manifest-not-in-INDEX={len(missing)} INDEX-not-in-manifest={len(extra)}")
for v in missing[:20]:
print(f" manifest-only: {v}")
for v in extra[:20]:
print(f" index-only: {v}")

# Annotate (not fail): the scheduled manifest refresh (M5) does not
# exist yet, so failing here would block every PR on a known-stale
# manifest. Flip to failure once M5 lands.
if age > 7:
print(f"::warning::channel_videos.json is {age} days old "
f"(enumerated_at {manifest['enumerated_at']}) — exceeds the 7-day "
f"freshness budget (E13); refresh via the scheduled enumeration")
if dupes:
print(f"::warning::manifest contains {len(dupes)} duplicate video ids: {dupes[:5]}")
PY
11 changes: 11 additions & 0 deletions TO-DO.md
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,17 @@ overhaul, cross-cutting refactors.
verified), 23 refs to absent images replaced with italic alt-text
placeholders, line endings preserved. Verified 0 broken refs remain.
(`dc1ba164`)
- ✓ **M2 translations migration (J2/Y15)** — 2,880 legacy `Translations/` files
across 131 items migrated non-destructively: 1,857 now normalized as
`translations/<video_id>.<bcp47>.srt` (talkslug suffix for per-talk files in
single-part interval items; 13 cross-item misfiles rescued via INDEX
title-verification), 600 multi-version conflicts quarantined under
`translations/conflicts/<series>/` with reasons in
[`docs/translation-migration-map.md`](docs/translation-migration-map.md)
(CONFLICTS appendix), 423 machine-unresolvable files left in place for
volunteer triage (I16). Original paths recorded in each item's
`metadata.json` `previous_paths` (1,857 entries). Verified with
`validate_journal.py` (PASS) after every pass. (`74aab8f4`..`e38ae28f`)

## Verification (this pass)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -365,5 +365,18 @@
"start": "0:58:31",
"title": "Intervention"
}
],
"previous_paths": [
"data/video/activeinferenceinstitute/Applied Active Inference Symposium/2021 Symposium with Karl Friston/Translations/Prof. Karl Friston ~ Applied Active Inference Symposium pt. 2 (Communication).de.srt",
"data/video/activeinferenceinstitute/Applied Active Inference Symposium/2021 Symposium with Karl Friston/Translations/Prof. Karl Friston ~ Applied Active Inference Symposium pt. 2 (Communication).es.srt",
"data/video/activeinferenceinstitute/Applied Active Inference Symposium/2021 Symposium with Karl Friston/Translations/Prof. Karl Friston ~ Applied Active Inference Symposium pt. 2 (Communication).fr.srt",
"data/video/activeinferenceinstitute/Applied Active Inference Symposium/2021 Symposium with Karl Friston/Translations/Prof. Karl Friston ~ Applied Active Inference Symposium pt. 2 (Communication).it.srt",
"data/video/activeinferenceinstitute/Applied Active Inference Symposium/2021 Symposium with Karl Friston/Translations/Prof. Karl Friston ~ Applied Active Inference Symposium pt. 2 (Communication).ja.srt",
"data/video/activeinferenceinstitute/Applied Active Inference Symposium/2021 Symposium with Karl Friston/Translations/Prof. Karl Friston ~ Applied Active Inference Symposium pt. 2 (Communication).ko.srt",
"data/video/activeinferenceinstitute/Applied Active Inference Symposium/2021 Symposium with Karl Friston/Translations/Prof. Karl Friston ~ Applied Active Inference Symposium pt. 2 (Communication).nl.srt",
"data/video/activeinferenceinstitute/Applied Active Inference Symposium/2021 Symposium with Karl Friston/Translations/Prof. Karl Friston ~ Applied Active Inference Symposium pt. 2 (Communication).pt.srt",
"data/video/activeinferenceinstitute/Applied Active Inference Symposium/2021 Symposium with Karl Friston/Translations/Prof. Karl Friston ~ Applied Active Inference Symposium pt. 2 (Communication).ru.srt",
"data/video/activeinferenceinstitute/Applied Active Inference Symposium/2021 Symposium with Karl Friston/Translations/Prof. Karl Friston ~ Applied Active Inference Symposium pt. 2 (Communication).zh-Hans.srt",
"data/video/activeinferenceinstitute/Applied Active Inference Symposium/2021 Symposium with Karl Friston/Translations/Prof. Karl Friston ~ Applied Active Inference Symposium pt. 2 (Communication).zh-Hant.srt"
]
}
Loading