2026-09-25
- Making the site thesis explicit — one surface, many projections: a decade-plus of externalized thinking as a longitudinal record, not a snapshot; the trajectory compounds. One Surface, Many Projections
Recent changes to the public research, software, citation, evidence, and discovery index.
.github entry describes organization/community infrastructure. ActiveACO’s maintained fork is unarchived; its originating source corrections retain separate commit evidence.build <short-sha> <YYYY-MM-DD>) and the UTC rendering instant (generated <ISO-8601>). Previously the single bare date left it ambiguous whether it was the payload commit's committer date or the build time. The contiguous build <sha> <date> prefix stays first because the deploy freshness alarm parses the payload SHA from it.validate_repo.py fails on a pre-suffix label, with a negative-control regression proving the check catches one.sync_site_facts.py now owns the stamp on a hand-authored page that carries one (index.html, for deploy-freshness verification). It migrates a legacy label, reuses a current one when only the stamp would change, and refreshes both facts when the page's content changes — the same contract the page generators apply to generated pages.build prefix used to read as an unstamped page and pass the check; it is now reported as a problem, as is a marker that is not a parseable anchor at all. Regression tests cover both negative controls.build_blake_index.py from the same hash-bound payload as pages/BLAKE.md; wired it into the sitemap policy, search index, generated manifest, publications hub, and llms.txt. pages/BLAKE.md remains the GitHub/agent markdown source and now links the styled page, resolving the raw-markdown presentation gap observed on the live site.pymupdf imports..python-version, and derived release runtime/version metadata from pyproject.toml to prevent duplicated contract drift. Pillow 13 provides supported native wheels; CI enforces the lock, and required native libraries refuse source-build fallbacks. Every Python workflow, including IndexNow, selects the same runtime pin.--output path and still report source-access warnings; a regression test covers that boundary.DOCXOLOGY_TEST_RENDER=1; all four formats rendered successfully with the pinned tools. Human visual, editorial, and publication-readiness decisions remain pending.daf-okn graph toolkit and added it to the software catalog. Refreshed public inventory and freshness evidence; live OKN endpoint verification remains qualified.cadence fork) and Zenodo record totals are applied to the claims and discovery pages; newer Ento-Linguistics and GNN versions and repository activity are acknowledged. This resolves the drift reported in issue #44.fep_formal v1.5.0 release archive is linked from its software catalog row. The uncatalogued-records check now treats a Zenodo software record as catalogued when it supplements an already catalogued work, that is, when the work's software row links its concept DOI, so later releases of the same repository are not reported again. Any other record, including a paper Zenodo files as software, still needs a bibliography row.Working_Groups, which supplements work #224 (release v1.0.0), and active_inference_language_model, empty at review, join the software catalog. Work #224 now links its source repository. Six new docxology forks are recorded under the standing fork policy.Active_InferAnts, GEO_INFER, Generalized_Notation_Notation, Journal_Utilities), so the repository review queue is empty. Domain pages keep both ant repositories and list fep_formal under its current name.record_scholar_observation.py writes the metric snapshot and its SHA-256-bound receipt together from an operator-attested direct authenticated observation. It refuses older, same-day, or internally inconsistent values, predicts the bound hash in a dry run, and restores both files if a write fails. The 2026-10-05 observation was recorded with it.papers/ pages, redirect stubs, the noindex videos/ index), drops videos/ from the indexing-request list, and covers removing the retired image sitemap, which returns 404 by design. The preflight now checks that robots.txt names only the canonical sitemap, that every priority URL is indexable and in the sitemap, and that retired sitemaps stay gone. Dated observations are in the 2026-10-05 report.sync_flickr_artworks.py validates the export before writing, reports tag and description coverage (key-free with --coverage-local), refuses a fetch shorter than Flickr's public total, can require complete metadata, and no longer reports view-count changes as drift. Quoted multiword Flickr tags arrive in Flickr's normalized form (for example summersolstice) and stay single matching tokens. The live re-sync waits on a Flickr API key. The start page's artwork count is now derived from the export.manuscript/ paths had been changed by a directory migration, and corrected one evidence quotation against the archived PDF. All archived PDFs and the newer Pitch Deck extraction are preserved; the custody receipt records exact checks and their limits.actionlint confirmed the workflow syntax.full_text.md. Each item records a verbatim quote (evidence, key_findings_evidence) that was mechanically verified against the text before merge, and summary_provenance says how it was produced. These replace the domain-template filler and abstract echoes, as well as several "specific" method lists the text did not support (for example, interviews credited with "modeling"). Paper READMEs/SKILLs render the methods as "name — description" with a provenance note, and work pages pick them up as their Use Notes. test_grounded_summary_evidence_occurs_verbatim_in_full_text re-checks every quote on each run. An independent second-pass review read every item against its quote and surrounding text. It found 0 major and 39 minor issues (dropped hedges or scope conditions, cited or relayed claims worded as the paper's own, one added detail), and all were corrected. Each folder's summary_provenance.reviewed records the review.papers/2018_DopamineForaging held a byte-identical copy of the 2016 foraging-gene PDF, and papers/2023_ToComment held the DRE3 paper (#77, Zenodo 5573947). Their PDFs, extracted text, images, and the borrowed Zenodo fields were removed, because the real documents are not yet archived (DOC-016). papers/2025_OnTime/full_text.md contained another paper's text and was re-extracted from its own PDF. papers/2026_TemplatePitchDeck had been extracted from an example deck and was re-extracted from the manuscript; extract_paper_texts.py now honours a primary_pdf metadata field and accepts --only FOLDER. Ten folders whose PDFs had never been extracted now have full text. New test: no two paper folders may share an identical source document.fetch_work_authors.py accepts status: "document_verified", which requires a source file and a verbatim title-page / edited-by quote. These entries survive registry refreshes and are re-checked by --check. It is applied to six works (#28, #44, #71, #79, #89, #93: dissertation, edited volumes, essay, chapter), so 209 of 219 works now list authors.title_mismatch; seven journal titles corrected to the publisher's exact wording (#32, #68, #95, #100, #105, #107, #108). Every edit keeps its frozen works/ URL.artifact_doi; removed #30's row, work page, and the byte-identical papers/2024_BioFirm/ folder, per the #49/#118/#193 precedent. Works 220 → 219, paper folders 203 → 202, Presentations 9 → 8.regenerate_docs.py reads both from pages/BIBLIOGRAPHY.md, and generate_citation_cff.py reconciles CFF title/authors from it too, rewriting only files whose parsed identity differs: 73 CITATION.cff files corrected, one of which (#63) had cited a different paper outright. 37 metadata.json files and 46 paper_metadata.json author strings were corrected at the source.code/src/metadata_templates.py). Where nothing paper-specific is recorded, the page says so instead. Seed-data cleanup is tracked as DOC-016.familyName: "Daniel Ari Friedman" with no given name. These rendered uninverted and exported to CSL-JSON as organisation literals. When the creator carries an ORCID, fetch_work_authors.format_author now splits the name (46 names fixed); without an ORCID, a collective or pseudonym is left verbatim. One explicit owner correction maps Crossref's mis-split "Ari Friedman, Daniel" (#46).regenerate_all.py no longer halts when the number of works changes, because the start-here step now runs build_start_here.py --sync-counts (idempotent, no date stamp); test_reproducibility_ledger now tampers with a tmp_path copy instead of the tracked outputs, which had raced the parallel SEO single-read guard and was the cause of the intermittent test_one_seo_pass_reads_each_page_once… failure; SKILL.md frontmatter scalars are JSON-quoted, so titles with quotes stay valid YAML, and the SKILL citation names the venue instead of the domain. New code/tests/test_bibliography_authority.py pins all of the above.<title> is SERP-clipped (render_pillar_head(serp_title=...)); 404 page gained BreadcrumbList JSON-LD; the works index leads with the longitudinal-record framing and a year-range hero; per-work pages dropped the duplicate Copy-BibTeX control and now render Findings/Methods cards without "Not yet summarized." placeholders. Per-domain RSS/Atom feeds (8 domains) ship with a deterministic --check that reuses on-disk lastBuildDate; software.html nav syncs from the shared manifest; start-here counts stamp from data/current-counts.json with a matching freshness check.--check green, 949 artwork/collection pages brought current with the nav changes, and a zero-byte truncated domain-active-inference.html (drive failure during the concurrent session) rebuilt from build_domain_pages.py. Static accessibility 2537/2537; repositories refreshed from data/github-repositories.json.reports/public_source_review_2026-09-27.json/.md supersede the 09-26 pair (279 applied / 77 deferred / 317 rejected, reflecting the DOC-005 fork classifications); live-site verification receipt reports/live_site_verification_2026-09-27.json (12/17 passing at push time, five checks pending deploy propagation of the agent-index, works/software data, and hub pages); date-stamped generated surfaces (site facts, catalog, search index) converged to the receipt-day stamp. Binder chain bound with control-only tails; validate_repo.py green and the full suite 759 passed / 5 skipped at the pushed tip.projections.html documents the site as a single corpus with many projections (works, videos, artworks, domains, feeds, agent index), with SoftwarePage/WebPage JSON-LD, #page nav anchor, breadcrumb, and its own data/agent-index.json route. Registered in the sitemap, llms.txt, the nav manifest (top-level "Projections" entry), start-here, discovery, 404, and the software/publications/video hub navs.pages/THINKING_LOG.md (one line per entry) feeds a new build_updates_page.py band on updates.html; the first entry frames the decade-plus longitudinal-record thesis.noindex, follow canonicals to works/{citation_key}.html; the stray BreadcrumbList JSON-LD that violated the canonical policy (and test_seo_invariants/test_paper_pages) is no longer emitted by build_paper_pages.py.build_domain_feeds.py derives lastBuildDate from the newest item pubDate instead of wall-clock time, restoring the byte-identical-across-runs contract (test_domain_feeds 10/10); --check still reuses on-disk dates.pages/SOFTWARE.md hero updated 116 → 119 docxology repositories to match the curated table and data/current-counts.json (count-consistency gate green).data/repository-exclusions.json and the projection data/repository-classification.json regenerated (forks 96/96 acknowledged).data/artworks.json refreshed live from Flickr via the new code/orchestrators/sync_flickr_artworks.py freshness step (flickr.people.getPublicPhotos + per-photo getSizes, key from the FLICKR_API_KEY env var/CI secret, deterministic upload-desc order, one-time HTML entity unescape of descriptions). Export now carries 943 artworks including the previously missing Solstice (Turning Point) (55349041831, 2026-06-21) plus additive license/license_name/ license_url/date_upload fields (942 records CC BY-NC 2.0; one CC BY-NC 4.0). Compact index rebuilt with a generator-owned page field.build_artwork_pages.py (generation step artwork-pages) emits artworks/<id>-<slug>.html for all 943 records — VisualArtwork + BreadcrumbList JSON-LD (creator @id reference, license, Flickr sameAs), meta description with unique fallbacks, canonical + OpenGraph/Twitter tags, meaningful alt text, tags, license notice, prev/next + tag-overlap related works, and a Flickr backlink. The artworks/index.html plain-HTML hub lists every page plus curated collections; 0 pages are thin (noindex) today — the 14 untagged records all carry real descriptions.pages/ART_COLLECTIONS.md (source of truth) → five art-collections/<slug>.html CollectionPage+ItemList pages (Neuroscience & Molecular Biology, Collective Behavior & Ants, Sacred Geometry & Kabbalistic Triangles, Active Inference, Americana & Seals).artworks/<id>-<slug>.html anchor links (lightbox = progressive enhancement via tileClick), the SSR floor is maintained by the new sync_art_gallery.py patcher step (art-gallery-sync), and the noscript block points at the plain-HTML artwork index. Gallery hydration (js/art-gallery.js) renders link tiles and defers to the lightbox only on plain clicks.artworks/ + the five collection hubs; build_sitemap.py appends all non-thin artwork pages with Flickr-upload lastmod. Search index gains compact artwork items (thin pages excluded).sameAs in index.html, work pages, and publications JSON-LD; rel="me" Flickr link site-wide (index.html + deploy_seo_security.py append behavior + site_nav.REL_ME_LINKS); art entries in llms.txt, humans.txt, and start-here.html; domain pages (art-synergetics, entomology, active-inference) link their matching collections.2026_JevPractice) plus 54 metadata updates; 14 needs_review pairs remain queue items for manual curation.KNOWN_STALE_RECORD_IDS with their curation dispositions — daf-jev release archive 22817425 (SOFTWARE.md row cites concept 10.5281/zenodo.22816187), EvoJump canonical curated deposit 22667290 per R80, EvoJump GitHub-Zenodo automated integration archive 22667291 per R81 (superseded; kept record 22667290), and the CCD software revision archive v2.6.0 22760881 (supplement to paper row #112; same class as 22666981). The freshness gate now reads zero uncatalogued records on a fresh 464-pair scan (464 pairs, 0 new, 0 needs_review, 50 update_existing = the already-applied 2026-09-17 set). The EvoJump software row carries its canonical concept DOI (10.5281/zenodo.22664675) in pages/SOFTWARE.md and data/software.json, matching the daf-jev curation format; software surfaces regenerated..py references, ~50 CLI flags, numeric claims (16 accessibility checks, 32 report_paths importers, 61 orchestrators, 48-step generation chain), and every relative link target in live docs verified against current code — zero stale mentions found; the two build_image_sitemap.py mentions are deliberate removal records pinned by code/tests/test_regenerate_all.py:20-21. No edits required.main into the sidecar main (400 commits since 0d4e8da1; 18 conflicts resolved in favor of the canonical upstream payloads). DOC-010 re-run at the merged head: gsc_followup_preflight PASS (sitemap 1375 URLs, seo_invariants ok, robots open-crawl, 29 live HTTP 200s; dated receipt reports/gsc_preflight_2026-09-18.json), checklist refreshed; signed-in Search Console steps remain externally blocked. Binder chain rebound at the merge receipt; validate_repo.py and the full suite green.docxology/daf-jev curated into pages/SOFTWARE.md Developer Tools (TypeSafe Jev client toolkit, Zenodo concept DOI 10.5281/zenodo.22816187) — originals 115 → 116, grand total 154 → 155; classification queue clean (classify_repositories.py --check exit 0). Steganographer row fact-checked against its README (132 → 484 tests). Fresh snapshot/inventory/pairing/external-link/PSR receipts for 2026-09-17, discovery pointers re-rendered, binder chain rebound.docxology_tools owns the canonical bootstrap); CLI surface unchanged (smoke-verified), suite green. The Pages-artifact dangling-reference guard now skips gitignored paths (a locally-generated regeneration-state.json reference no longer fails local assembly; CI behavior unchanged, fail-closed outside a repo), with a regression test; the two prose references to that gitignored path were reworded so the shipped artifact cannot 404 on it.dicklesworthstone_meta_operator, Skillarum, nockchain-migration) — 115 originals / 154 grand total — classification queue at 4 honest defers pending paper/deposit. Privacy: insecure http:// URLs upgraded to https across the bibliography/works/resume/artwork chain, stealth records carry explicit status, public_integrity.py now fails plain http:// links. Agent layer: ReproducibilityLedger registered (schema registry 1.5) fixing the dangling schema_ref, two inert query recipes removed, release-integrity date preservation verified by-design with fresh SHAs. QA: browser smoke 10/10 + QA 7/7 re-run green at current HEAD; GSC preflight refreshed (signed-in Search Console steps remain externally blocked). Budget: artifact 825.6 MiB / 4,820 files, 54.4 MiB headroom, omission classes verified, ADR re-anchored. Runbooks: settle.md Notes and AGENT_START carry the discovery-pointer rule; the TODO binder bullet corrected to the fails-closed reality. SEC-002 unblock attempt: plugin enabled, scan attempted against a clean candidate, failed closed on the managed-profile runtime requirement — blocked state stands with updated evidence.refresh_public_sources.py fans out through ThreadPoolExecutor(8) with order-identical output (the serial fan-out is now concurrent; 429 Retry-After and safe-fetch isolation unchanged; equivalence test-pinned). refresh_public_source_inventory.py --cache-reports reuses a same-day report's payloads (freshness keyed on generated_at, any !ok section fails closed to a live fetch, --force lifts it with warnings accepted, reuse adds an anchors provenance block). sync_paired_publications.py --cache-reports reuses the same-day report's GitHub releases and Zenodo records while already_reviewed classification becomes fingerprint-incremental — short-circuited when the (bibliography, decisions) hashes match the prior report's persisted classification_cache, full scan re-run on drift with a stderr note (drift surfaced, never absorbed); create_new/update_existing/needs_review always re-derive and cached-but-warned scans fail validation. check_zenodo_uncatalogued.py --records-from <paired_report.json> reuses the pairing scan's Zenodo records — one fetch per intake — failing closed on non-pairing sources, warned scans, or stale reports unless --force. Apply mode no longer regenerates inline: the hardcoded 13-generator run_regeneration chain is deleted and regenerate_all.py is the single write-mode driver, now input-gated — steps with declared inputs (paper-documents, work-pages, video-pages, asset-audit-first/final, accessibility-first/final) skip when their input fingerprints are unchanged (state in a gitignored local reports/ state file named regeneration-state.json — never shipped to Pages — fingerprint recorded only after a successful run, unmatched patterns and empty inputs never skip; --force restores always-run). Measured: cold chain 48 steps in 1m52s; warm no-op rerun skips 7/7 gated steps, runs 41 in 1m35s, byte-identical tree; validate_repo.py --check remains the ungated authority and the full settle battery (~6 min) and CI (~4 min) are unchanged. docs/operations/publication-sync.md documents the fast intake path (when it applies, the exact command sequence, what never gets skipped) with a signpost from AGENT_START.md and a regeneration-skip note in docs/operations/settle.md. Wall-clock measured same-day on this machine: snapshot fan-out 11.4s serial → 1.8s parallel (6.4×, byte-identical modulo generated_at); pairing scan 122.1s full → 0.60s with --cache-reports (~200×; 464 pairs, actions and counts byte-equal, zero warnings, fingerprint hashes stable across the two runs).code/orchestrators/settle.py) + change classifier (code/src/change_classifier.py): one command classifies dirty paths into surfaces (reports/site/code/tests/ci/docs/other) and runs a tiered gate battery — fast (sitemap --check, artifact budget, ruff), full (adds pytest + standard validate_repo.py, CI-equivalent per .github/workflows/validate.yml), release (adds validate_repo.py --release --strict-reports, binding the conventional reports/deployment-attestations/<HEAD>.json when present) — then lands the payload + control-tail commit split (release_controls.is_control_path is the single control predicate), optionally pushing and opening a PR. Decision tree, tier table, and measured timings live in the new docs/operations/settle.md runbook, signposted from AGENT_START.md.code/src/build_stamp.py memoizes the build stamp (one git probe per process; video-pages check measured 55s → 5.7s), and build_sitemap.py's _batch_latest_map now caches its full-history walk result, including the failure path; previously every git_lastmod call re-walked the whole history (sitemap --check measured 0.8s after the fix versus 19s before, with an 11m47s worst case eliminated).docs/operations/*, the root agent docs, and the satellite docs checked every cited command/flag against the code and receipts; all findings landed. docs/operations/settle.md gained the code-verified corrections (drift review is inside the full battery; the manifest write fails closed on dirty post-deploy inputs with --allow-dirty-prepayload-evidence whitelisting only the pre-payload snapshot; the lint step's --no-sync exception; the binder chain restated in the canonical generation_plan.py order ending on a second build_generated_manifest.py pass, with build_public_source_review.py described as the excluded manual render). TODO.md closes PERF-001 with the measured evidence (batch walk adopted, byte-identical, 0.8s vs 19s) and records the 2026-09-12 session findings. The root docs (AGENTS, CLAUDE, GENERATED, AGENT_START) and nine operations runbooks now cross-reference the settle driver; stale references fixed (CLAUDE maintenance-log path, docs/AGENTS cache-bust version, ADR growth receipt re-anchored to the 2026-09-12 receipt, security-posture CSP example aligned to the deployed CSP_META_TAG, releases/design AGENTS boilerplate corrected to the single-origin flow, manuscript inventory completed).10.5281/zenodo.22664675 as software-catalog and R81 supersedes the six auto-archive pairs under 10.5281/zenodo.22664645 (data/paired-publication-decisions.json, groups 79 → 81; the citable paper remains row #12, concept 10.5281/zenodo.17229924; no new bibliography row). CCD row #112 adopted the Zenodo v2.4.0 self-title "Cognitive Diagrams: Reviewing Categorical Accounts of Linguistic Case". The On Time version-DOI citation (record 15168382) gained its full-identity VERSION_SPECIFIC_CITATION_EXCEPTIONS entry, and software-only record 22666981 was registered in KNOWN_STALE_RECORD_IDS by record id (check_zenodo_uncatalogued.py) — the next uncatalogued/DOI-role reports should show zero flags for both.build_pages_artifact.py gained a third omission class — any tracked reports/ path strictly older than the newest date of its family (top-level reports/<family>_<YYYY-MM-DD> receipts, including qualifier variants like paired_publications_2026-06-09-itrace.json, plus whole dated reports/visual-qa/, reports/browser-smoke/, reports/browser-qa/ sets) is left out of the deploy artifact while every file stays committed in the repository. Files sharing a family's newest date stay published together, and the new shared citation scan (code/src/report_references.py, reused by prune_old_reports._referenced_externally so both tools share one exclusion semantics — papers/ in scope, inventory manifests and repo-only trees out) keeps any report cited from a published page or data file in the projection. Measured against the 2026-09-11 growth receipt (864.17 MiB, 5,184 files): 390 files / 70.9 MiB newly leave the artifact, projecting ≈793.3 MiB with ≈87 MiB of headroom under the unchanged 880 MiB review band — the band and the 900 MiB release ceiling are untouched, and each new evidence wave now adds only the newest receipt per family. The manifest gains the omitted_superseded_reports summary (count, bytes, examples) with the superseded_report_policy key, MANIFEST_COMPARISON_FIELDS covers the new field, the growth receipt adds omitted_superseded_report_count/_bytes, and a durable 404 guard fails the build if any repository-relative reports/ reference in the assembled projection was not copied. Docs: github-pages-artifact.md, report-retention.md (projection-only omission is the default archive tier, no retention entry needed), asset-strategy-adr.md execution subsection, and the agent-index PagesArtifactManifest schema; the principal-review TODO item is resolved.reports/paired_publications_ 2026-09-10.json: 462 pairs; 239 releases; 155 Zenodo records) against the 2026-09-07 baseline. Applied the single strong create_new and 48 strong update_existing actions; works total 212 → 213. New work #216 Skillarum: Conditionally Reproducible Website-to-Agent-Skill Compilation (concept DOI 10.5281/zenodo.22663906; v0.2.0, 2026-09-08) with a complete paper folder and the versioned combined PDF. Row #112 (Cognitive Case Diagrams) updated to Zenodo record 22653315 v2.4.0 (2026-09-07) with the new 15.3 MB versioned PDF retained alongside the v1 PDF; the v2.5.0 re-release is ledgered as version-history-only (decision R79). The 47 baseline update_existing actions re-verified idempotently (folder metadata and PDF refreshes). New fork docxology/oh-my-pi registered under the standing fork policy (DOC-005 mechanized path, RGMs precedent). Principal-review items left open with evidence in TODO.md ("Session findings (2026-09-10)"): 12 EvoJump needs_review pairs (duplicate Zenodo concepts 22664645/22664675), the CCD row #112 title divergence, the deliberate On Time version-DOI citation (commit d086e7a3) missing its VERSION_SPECIFIC_CITATION_ EXCEPTIONS entry, and the software-only record 22666981.fetch_work_authors.py, title-similarity 1.0, no invented authors); Domain Legend now declares Other (row 215); GNN and Codomyrmex paper folders record their version records as artifact_doi/artifact_doi_url (verified live: 10.5281/zenodo.20671741, 10.5281/zenodo.21750801) with CITATION.cff DOI roles synced.sync_site_facts.py covered only three report families, so llms.txt, discovery.html, and pages/DISCOVERY.md pointed agents at 3-4-month-old snapshots (external-links 2026-05-15, live-site 2026-07-17, source-coverage 2026-07-17; llms.txt never refreshed its snapshot/inventory pair). The rewrite list now covers external-links/triage, live-site verification, source coverage, and the snapshot/inventory pair for llms.txt, with the resolver glob digit-anchored so external_links_triage_* can no longer shadow external_links_*. Also: duplicated discovery-page ListItems and table rows removed; llms.txt manifest/registry versions corrected to 1.5/1.4 with the ScholarVerificationReceipt schema added; agent-index Work schema now documents the Report type and the authors field.prefers-color-scheme: light the card family (white cards via the remapped --bg-card) still inherited hardcoded dark-theme ink (#fff headings, #cfcfcf body) and was unreadable on every page that renders cards. The light fixups block now maps card headings/body/stat numerals to the text tokens, with compensating light-ink rules for the by-design dark plates (art cards on their hardcoded #0b0b0b background, .section-alt dark bands) and a specificity bump for repositories.html's later-loading inline style. Verified with light/dark full-page captures before and after; dark mode is pixel-identical.docs/README.md index gained the missing asset-strategy-adr.md row and the manuscript/ tree; the 2026-09-08 section backfilled the PR #18 median-of-3 Lighthouse change; codemeta.json dateModified refreshed.code/src/ artifact_budget.py, build_pages_artifact.py, and the manifest warning_policy string updated together). The durable alternative — omitting superseded dated reports from the Pages projection while they remain in the repository — is flagged for the principal in TODO.md (DOC-009/DOC-012).Verify live site workflow (added 2026-09-05) compared the live homepage's build stamp against main's HEAD truncated to 7 characters, but git's --short auto-lengthens on ambiguity and the deployed stamp is 8 (8ecdaa07) — 8ecdaa07 != 8ecdaa0 retried through the whole grace window and failed every run since the alarm shipped. Two corrections: the comparison is now prefix-based (run_freshness_check in code/src/deploy_freshness.py, with a regression test for the auto-lengthened form), and the workflow derives its expectation from the stamp embedded in the committed index.html rather than HEAD — page stamps are deliberately reused across non-rendering commits (build_stamp.reuse_or_current), so "stamp equals HEAD" was unsatisfiable by design while "live site serves the deployed artifact" is the check's actual intent.verify_live_site.py expected "@type": "CollectionPage" (with a space) on publications.html, while the page's JSON-LD is emitted compact ("@type":"CollectionPage"). The marker now matches the emitted format, consistent with the software.html marker.57cd548d): the Lighthouse budget gate tripped on shared-runner variance — index.html performance=52 < baseline floor 55 on a byte-identical homepage that had passed four PR runs and re-passed green on rerun (the file's baseline comment records ±20 swings, 76/75/57, on identical content). Per-page scoring now takes the median of 3 runs when the first run lands below a floor, so a single noisy dip no longer fails the gate while a genuine regression stays below the median; floor values are unchanged (integrator-owned). In the same pass the spaced-vs-compact marker pin in verify_live_site.py was replaced by structural JSON-LD parsing (jsonld_types_in_html) asserting @type values, immune to generator re-serialization. The workflow has been green end-to-end since.build_search_index.py wrote search-index.json and its three split companions (search-index-core.json, search-index-content-work.json, search-index-content-video.json) with different generated_at values — stable_generated_at returned None for changed bodies, and the fallback None made render() and render_split() call the clock independently. The committed tree then failed validate_repo.py --check ("Stale generated search index surfaces: …") until a second idempotent run rewrote all four files with one reused timestamp; the 2 s skew in f58f0be9 and the 3 s skew in 71506b8b are both visible in git history. The builder now resolves one timestamp (stable_generated_at(...) or the candidate's own generated_at) before rendering any surface, and code/tests/test_build_search_index.py pins the invariant with a countable fake clock — under the old writer the changed-content test fails with exactly the observed main-vs-splits skew, and the unchanged-content test pins the existing stable-timestamp reuse. The three committed split artifacts were regenerated with the fixed writer (single 2026-09-05T22:50:01Z timestamp across all four surfaces).classify_repositories.py --check (2 primary decisions pending, matching DOC-005), the 2026-09-04 paired-publications report (5 unreviewed actions, queue sharpened in DOC-004 with the four DOIs and their already-represented status), sync_scholar_metrics.py --check (815 citations snapshot current), the 2026-09-05 external-link triage (no hard 404s; 129 warnings are bot-protection/timeouts/transients), asset and accessibility reports current. Resolved MIN-01/MIN-02 sections removed from TODO.md per the completed-rows-deleted convention (evidence: 2026-08-31 entry above); no new MAJOR items found.pull_request event checked out the synthetic merge ref, whose first parent is the base branch, so its first-parent diff is the entire PR and the commit-bound source_commit_at_generation binding could never resolve there — every content PR since the provenance pattern landed failed build_pages_artifact.py --check-manifest ("stale Pages artifact manifest") while push runs stayed green. .github/workflows/validate.yml now checks out github.event.pull_request.head.sha.untagged-ce7d… v1.3.0 release and GNN v3.2.0 are now recorded superseded / bibliography-folder version-history-only in data/paired-publication-decisions.json, each citing its curated bibliography folder; the refreshed full-scope 2026-09-07 pairing receipt (450 pairs) drops the queue to 4 unreviewed actions — the rotating-draft Codomyrmex URLs and the Cognitive Integrity cluster held for the principal (DOC-005 overlap).docxology/cognitive_integrity as curated (added to pages/SOFTWARE.md, backed by papers/2026_CognitiveIntegrity/ and papers/2026_CognitiveIntegrityFramework/), confirmed superseded dispositions for the rotating Codomyrmex draft URLs (R75/R76) and for the ActiveInferAnts and CEREBRUM releases as version-specific artifacts under the represented Cognitive Integrity Framework DOI (R77/R78), and directed that draft releases be skipped from pairing. The refreshed full-scope 2026-09-07 pairing receipt has zero unreviewed candidates (447 pairs; the three skipped draft pairs account for the 450 → 447 delta) and classify_repositories.py leaves one open primary (docxology/dicklesworthstone_meta_operator).is_draft_release in code/src/publication_pairing.py skips releases whose canonical URL is the rotating untagged-<hash> draft slug, ending the requeue treadmill (R71 → R73 → R75 documented three rotations of the same Codomyrmex draft).latest_payload_commit in code/src/release_controls.py steps through a merge commit whose tree is identical to one of its parents (a PR merge ref's first parent is the base branch, so its first-parent diff is the whole branch and the tip-recorded source_commit_at_generation could never resolve there). Covered by pure-function fixtures and an end-to-end PR-merge-ref test that was mutation-verified to fail under the old walk.python3 resolved through PATH, so running validate_repo.py with the project's own .venv/bin/python silently validated under a different Python — reproducibly failing with ModuleNotFoundError: No module named 'PIL' while Pillow was installed in the launching environment. All 30 call sites in validate_repo.py, regenerate_all.py, sync_paired_publications.py, add_zenodo_only.py, browser_qa.py, browser_smoke.py, visual_qa.py, and the test suite now use sys.executable. The CV generator keeps its deliberate uv run python3 for byte-identical ReportLab PDFs, and code/tests/test_interpreter_consistency.py holds that as the one documented exception.ruff check --select W605 code, which left 44 real findings invisible — unused imports, a shadowed json import, import sys missing from a module that calls sys.path.insert, ambiguous l bindings, and an unused argparse result. All 44 are fixed, the rule set now lives in pyproject.toml under [tool.ruff.lint] (Ruff defaults + W605), and both validate.yml and pages.yml run the config-driven ruff check code so a local run and CI enforce the same rules. Deliberate re-exports (seo_invariants.REDIRECT_STUBS) are marked rather than deleted.data/repository-exclusions.json schema 1.4): a fork that appeared in the 2026-08-30 inventory refresh (docxology/RGMs) sat unacknowledged and failed the classification contract. Rather than backdate a review nobody performed, reviewed_by now distinguishes principal (this repository was reviewed individually, on reviewed_at) from standing_policy (an already-recorded principal decision was applied to a repository nobody looked at one by one). A standing_policy entry must name that decision in policy_source and may only cover a fork — retiring a primary repository is always an individual call, enforced in classify_repositories.py with negative fixtures. data/agent-index.json documents all three provenance fields (schema registry 1.4). The fork-review test no longer pins the literal 2026-08-26 review date, which had made every later decision a test failure.build_image_sitemap.py and sitemap-images.xml were deleted on 2026-08-28, but the generated manifest kept publishing a rebuild command and an output file for both, so GENERATED.md and data/generated-manifest.json handed every agent a generator that does not exist. Cleared from the manifest, code/AGENTS.md, code/README.md, CLAUDE.md, and the asset-strategy ADR (which credited the decision to a test file that had also been deleted; the real pin is code/tests/test_regenerate_all.py). A new manifest test fails on any declared generator script that is missing from the tree.CLAUDE.md's prose step list had fallen nine steps behind LOCAL_GENERATION_STEPS — it still named the deleted image-sitemap generator and omitted ten steps added since — so an agent following it would have rebuilt the site incorrectly and trusted the result. The chain is corrected, prune_old_reports.py's deliberate exclusion is stated (a destructive step has no place in an idempotent rebuild), and code/tests/test_generation_plan_docs.py pins prose to plan. code/tests/test_code_agents_doc.py does the same for code/AGENTS.md's layout table and its report_paths importer count, which had drifted twice (~20 → ~26 → the actual 31).collect_seo_errors() pass decoded 5,613 files / 91.1 MB because eight checks walked overlapping page sets and check_canonical_integrity read every HTML file twice on its own. A revision-keyed page cache (path + inode + size + nanosecond mtime, so any rewrite or atomic replace misses) brings that to 1,582 files / 24.9 MB, and memoizing internal-link resolution — shared nav links resolved thousands of times through Path.resolve() — took check_canonical_integrity from 45.5 s to 1.2 s in the same run. Two regression tests hold both properties, including that a rewritten file is never served from the cache.bind() is a missing local capability like a missing chromium binary, not a site defect. Only PermissionError is treated this way; an address in use or any other OSError still fails..github/README.md is generated, not copied — 120 broken links on the repository page: GitHub renders .github/README.md in preference to the root README.md and resolves its relative links against .github/, so the 2026-09-02 byte-identical mirror pointed every repo-relative link at .github/publications.html, .github/papers/..., and so on. That is also why validate_repo.py's local-link gate was red at HEAD. New build_github_readme.py renders the mirror from README.md with ../-relocated targets and a do-not-edit marker, registered in the generation plan (after the final sync_site_facts.py, so it carries the final counts), the generated manifest, and code/AGENTS.md. The two files can no longer drift, because one is derived from the other. validate_local_links passes.check_external_links.py --check was failing at HEAD because the cached coverage contract included the footer build-stamp permalink (.../commit/<sha>), which every regeneration rewrites — each refresh made the next commit's report "missing" the new SHA while carrying the old ones as "unexpected", so the gate could never be current for more than one commit, and the URLs are unverifiable before the commit is pushed anyway. Build-stamp permalinks joined IGNORE_PREFIXES, the same forgiveness build_stamp.reuse_on_disk_stamp and build_sitemap --check already apply. The report was then refreshed against the live web (809 URLs, 680 ok): no 404s, and the failure profile is unchanged from the 2026-08-29 report (98 doi.org 429 rate-limits, 24 bot-protection 403s, 1 LinkedIn 999), so the triage backlog is the same known set, not new rot.curated is derived from data/software.json, but it was only recomputed when build_github_inventory.py ran a network fetch and froze the flag into its snapshot — so every catalog promotion left a review-queue row demanding a decision that had already been made, until someone happened to run an authenticated refresh. docxology/millennium_audit had been sitting there since 2026-09-04. classify_repositories.py now reads the catalog directly, as a second reason to exclude and never a reason to include, so it can only remove a false row. The primary review queue drops from three rows to the two that are genuinely undecided (docxology/cognitive_integrity, docxology/dicklesworthstone_meta_operator).discover_redirect_stubs walks every HTML document through the hardened reader, and several callers reach it more than once per process, which made it the slowest thing in the test suite. It now memoizes by lstat identity — path, inode, size, nanosecond mtime — so a rewrite, an atomic replace, or a path that becomes a symlink all miss the cache and go back through the reader that refuses them. test_redirect_stubs.py fell from 439 s to 92 s, and two new tests hold both properties, including that a cached path replaced by a symlink still fails closed.reproducibility.json / reproducibility.html / REPRODUCIBILITY.md carried pre-millennium_audit figures (executable-code signal 63 → 64, mean score 4.693 → 4.698), and the nine domain pages carried a dateModified older than data/current-counts.json.docxology/millennium_audit from papers/2026_MillenniumAudit/ (README pointer and github_repo metadata field; AGENTS/SKILL/papers/paper_metadata.json regenerated)..github/README.md for GitHub profile rendering and dropped the duplicated tagline from the root README.reports/current_counts.md and data/current-counts.json via the documented pipeline (build_current_counts.py, then regenerate_all.py --validate) so the volatile totals no longer predate bibliography row 215, and aligned the hand-authored count sources with the parsed totals: pages/BIBLIOGRAPHY.md hero lines now 212 works / 195 indexed folders (types row gains **1** Report), papers/README.md heading now ## Papers (195) (test_count_consistency 4/4 passing).22243473 (concept DOI 10.5281/zenodo.22243472, version DOI 10.5281/zenodo.22243473): Forensic Audit of the MillenniumLean Clay-Proof Package (AIX Global) — a statement-level audit that independently reproduces every kernel-hygiene claim of the AIX Global MillenniumLean package (clean build, zero sorry, zero project axioms) under the pinned toolchain, then audits what the theorem types actually say; verdict: none of the six Clay Millennium Problems is resolved (14 line-anchored, byte-verified findings).papers/2026_MillenniumAudit/ with README, AGENTS, SKILL, CITATION.cff, metadata.json, source PDF, and full-text extraction.bibliography.bib, bibliography.csl.json, bibliography.ris), data/works.json, data/publications-ld.json, work enrichment, and per-paper site cross-references.manuscript/ → docs/manuscript/ paths across paper full-text extractions plus bibliography metadata corrections (2026-08-31 pass residue); removed the dated REVIEW_LOG_2026-08-31.md scratch report (point-in-time; content remains in git history).REVIEW_LOG_2026-08-31.md): pointed the AGENT_START.md external-link triage recipe at the GENERATED.md triage row and the two-command refresh instead of the stale hard-coded 2026-05-15 report; added llms.txt to the GENERATED.md Volatile-site-facts outputs row (it is rewritten by sync_site_facts.py); refreshed the TODO.md last-reviewed stamp and recorded the two minor doc findings as resolved.data/scholar-verification-receipt.json, a SHA-256-bound baseline record for the existing 2026-06-09 direct logged-in snapshot. Any future snapshot edit invalidates the receipt and makes sync_scholar_metrics.py --check fail until a new direct-authenticated observation is reviewed and recorded; no Scholar metrics were changed in this release work.21985580 (concept DOI 10.5281/zenodo.21983948, version DOI 10.5281/zenodo.21985580): docxplus — the Intelligent Document Container.papers/2026_DocxplusIntelligentDocument/ with full metadata, skill, and extracted text representations.pages/SOFTWARE.md after they gained descriptions: Active_Fedference (paper 2026_RobustBeliefSharing), Active_Skillference (paper 2026_ActiveSkillference), and active_inference_power (paper 2026_ActiveInferencePower). AII catalogued 38→41; curated software total 143→146. Left as explicit deferrals (description-less or not auto-promoted): Active_Inference_Un0, docxology/GrowthModel, docxology/multi-time, and docxology/math4wisdom-superhuman-docs-archive. Forks were not auto-promoted.code/src/domain_inference.py (whole-word matching; computational before entomology). add_zenodo_only.py, batch_enrich_metadata.py, regenerate_docs.py, and publication_pairing.py now delegate. A metadata/bibliography diff showed text-only re-inference would reclassify 110 stored domains; no papers/*/metadata.json or pages/BIBLIOGRAPHY.md rewrites were accepted./js/repo-inventory.js instead of inline filter JS (CSP script-src 'self'); --check-manifest no longer requires an unwritten today's growth report; Pages deploy no longer cancels in-progress jobs; live-verify.yml and indexnow-on-push.yml run after a successful Pages deploy; Action bumps checkout@v7, setup-python@v7, configure-pages@v6, deploy-pages@v5.esc() from js/search-utils.js; TTS panel aria-hidden tracks open state; ? keyboard shortcut works; check_external_links.py URL accounting and tab stripping; prune_old_reports.py scans the working tree; feed site-updates moved to data/site-updates.json; export_agent_data.py import is IO-free; brittle catalog pins replaced with structure/count assertions; add_zenodo_only.render_citation YAML-quotes version and names; regenerate_all.py re-runs sync_site_facts.py after the second accessibility audit.zenodo.21864003; source repository ActiveInferenceInstitute/active_fedference).zenodo.21865643; source repository ActiveInferenceInstitute/active_skillference).update_existing refreshes applied: version/PDF/metadata + software-link updates across already-catalogued works (template exemplars, DigiPPPiP, PROJECT BOND, Codomyrmex v1.3.0-paper, AlphaCOGANT, Active Inference Power Suite, prior_cognitive_art, BeeStack, COGANT, and more).code/orchestrators/sync_paired_publications.py). Decisions R25-R27 stored raw_candidates as bare release-URL strings, which reviewed_pair_decisions() silently dropped — re-surfacing a create_new duplicate for an already-decided pair. The parser now accepts both dict and URL-string candidates, the three decisions were normalized to dict form, and a regression test was added. The CogSecSkills v1.0.0/zenodo.20804585 false positive is again correctly reported already_reviewed instead of create_new (report: 0 new, 28 already reviewed).zenodo.21843592; source repository docxology/bond).zenodo.21815704; authors Siddhant Shrivastava, Evelyn C. Goh, Alexandra Mikhailova, and Daniel Ari Friedman).docxology/bond to the owned Developer Tools list; owned-repository count 94→95 and total curated software count 132→133.zenodo.10362561 to concept DOI zenodo.10296601; the retired #49 duplicate remains a permanent gap.21418901 (SynthOBS), 20804586 (CogSecSkills), and 19139090 (retired Template/Reproducible duplicate) are not new publications and are not added.2026.08.07.pages/SOFTWARE.md after manual review of the authenticated inventory (forks cleared by the owner are now reflected; inventory is 241 public repos = 154 primary + 87 forks): the six research-practice line-set repos (line_set, black_line, white_line, golden_line, red_line, witness_register, new Research Practice summary category, 6), the DigiPPPiP computational companion Digi-PPPiP (Other), the whole-colony simulation scaffold BeeStack (Developer Tools), the template_advanced_literature_review exemplar (Developer Tools), and crescent-city-intel (Data & Policy). Owned repositories 95->105; curated total 133->143; data/repository-classification.json uncatalogued queue 112->101 with 4 primary-review non-fork items remaining (active_inference_power, Active_Inference_Un0, GrowthModel, multi-time - all description-less, deferred for human review).data/paired-publication-decisions.json: the single new-candidate action from the paired-publication refresh (CogSecSkills v1.0.0 GitHub release paired with old concept zenodo.20804585) is rejected as a superseded-version false positive - bibliography row #174 already cites concept zenodo.21513316.data/paired-publication-decisions.json: the 9 CogSecSkills release pairs under concept zenodo.21513316 (row #174) and 18 Codomyrmex release pairs under zenodo.21750800 (row #206) are superseded/version-history relations; no duplicate bibliography rows were created.data/github-repositories.json 2026-08-07) and refreshed 2026-08-07 pairing receipt; the curated flag is now computed against the full 143-row catalog.add_zenodo_only.py as the DAF "line set" research-practice instruments plus a software release, each with full paper-folder documentation (README/AGENTS/SKILL/CITATION.cff/metadata.json + PDF) and regenerated downstream surfaces:zenodo.21754245)zenodo.21754243)zenodo.21754241)zenodo.21754239)zenodo.21754237)zenodo.21754235)zenodo.21750800)21418901 and CogSecSkills 20804586 flags are stale-version duplicate detections of already-catalogued works and were intentionally not added; the AII-Ecosystem 17982447 non-canonical-DOI note remains the documented exception).sync_paired_publications.py could not complete due a GitHub API rate limit (HTTP 403). codomyrmex's GitHub repo is already catalogued in SOFTWARE.md (Developer Tools); new line-set GitHub repos remain an open DOC-005 triage item pending a manual review pass.zenodo.10296601, duplicate of kept #136 /10362561) and #193 (Template/Reproducible v1 concept zenodo.19139089, duplicate of kept #1 /16903351). Retired numbers are left as gaps (49, 118, 193) per the repo's immutable-catalog convention — no renumbering, so every later work URL is preserved. Removed the retired paper folders (papers/2023_ATLAS/, papers/2026_TemplateApproachReproducible2/) and their work pages; paper_metadata.json 189→187; papers/README.md and BIBLIOGRAPHY header updated. Works 206→204, Papers 185→183. #123 (template_ approach, template_template) confirmed distinct and retained.zenodo.21763244, 2026-08-02), a typed agentic harness for reproducible long-context memory experiments, with paired GitHub repo docxology/thalia added to pages/SOFTWARE.md (owned-repos table; software catalog rows 93→94).research.html, reports.html, reproducibility.html, agent-verify.html, art.html, nft.html, meditations.html, about.html, exports.html and the pages/… sources (WIKIPEDIA.md, EVIDENCE.md, RESOURCES.md, VIDEOS.md, README.md); enumerated the eight domain-*.html clusters under the domains.html hub. Verified all 114 relative link targets resolve on disk (0 broken), all non-domain root .html and all pages/*.md are linked, and the Repository Map table is well-formed.nav{position:fixed;top:0;z-index:200;background;...} rule in style.css applies to every <nav> element, so the breadcrumb <nav> rendered as a second full-width fixed dark bar painted directly over the primary navigation. On every page and viewport the logo, middle nav links, and the mobile hamburger were hidden/unclickable behind the breadcrumb bar. Fixed by pinning the breadcrumb as a slim bar directly below the nav (position:fixed;top:74px;z-index:150) at a z-index below the nav (200), in code/src/site_nav.py BREADCRUMB_CSS (generated pages), the inline breadcrumb <style> on the 11 hand-authored pages, and the work-page template in code/orchestrators/build_work_pages.py (230 breadcrumb pages total). Verified via Playwright: mobile hamburger receives taps and opens the menu, desktop nav links are no longer covered (0/11 covered), breadcrumb sits below the nav and non-hero pages stay clear. pytest 231 green, validate_repo green.2026.08.02.add_zenodo_only.py: #199 Active Inference Power Suite: Conditional Statistical Power under Controlled Generative Settings (, zenodo.21695160), with full paper folder documentation and regenerated downstream surfaces.20804585 → 21513316, domain corrected to ) and #198 SynthOBS & FractiSynth (21418687 → 21418782). Duplicate rows #200–#201 retired.validate_repo.py checks pass (39/40 — live-site mismatch at 197 vs 199 is expected pre-push), 216 pytest green, 1540/1540 static accessibility passes, 0 asset-size warnings, all count-consistency surfaces aligned.--require-deployed gate; accessibility commands use the supported --check flag; public-page SEO guidance distinguishes indexable pages from intentional paper/redirect exceptions; cache-buster documentation matches the generated layer; and the historical maintenance table moved out of always-loaded AGENTS.md.build_generated_manifest.py now runs before build_agent_index.py, so the agent route manifest hashes the current command matrix on its first pass; a final manifest pass still closes the release-integrity envelope. The ordering is regression-tested in test_regenerate_all.py.data/videos-index.json (VideoIndex.v1, 1127 compact records) while the complete data/videos.json remains available for downloads and detail pages; the repository classification queue now preserves description, language, topics, privacy, update, and derived description-quality fields for all 292 uncatalogued repositories (45 missing, 43 short, 204 substantive descriptions) without auto-promotion.docs/README.md and AGENT_START.md. The ordered regeneration chain now re-runs asset and static accessibility reports after catalog rendering so generated report checks remain current when the catalog grows.regenerate_all.py pass now produces zero file-content changes; the Pages artifact also treats GENERATED.md as control metadata so the integrity tail cannot invalidate its own manifest.browser_qa.py now exercises no-JavaScript fallbacks, mobile menu Escape/focus, publication filtering and sorting, gallery lightbox focus, reduced motion at 320px, forced colors, console/page errors, and YouTube iframe origin/title/referrer policy. The fresh report passes 7/7; browser smoke passes 10/10 and visual QA covers 26 screenshots.data/artworks-index.json (942 grid records, 712 KiB versus the 3.1 MiB full export) and lazy full-detail loading for description search and lightbox resolution links. The complete data/artworks.json export remains available for agents and downloads.TODO.md, kept remaining release work as recurring gates, corrected the animation documentation's obsolete inline-script reference, and documented the GitHub Pages meta-CSP frame-ancestors limitation.data/*.json and search-index.json were served cache-first, and each page fetches them at a stable ?v= query that does not change when the data does — so a returning visitor kept seeing the previous publication list (e.g. 193 works after #195 was added) until the SW version happened to bump. These content-data requests are now network-first (cache fallback for offline), matching navigations; static assets (JS/CSS/images/fonts) stay cache-first for speed. Bumped v19 → v20 to clear existing stale caches. This is why a freshly-added publication now appears immediately.10.5281/zenodo.21330636) as work #195 via add_zenodo_only.py. Created papers/2026_ActiveFractalRabbit/ (README/AGENTS/SKILL/CITATION.cff/metadata.json + PDF), the works/…195.html page, and regenerated the bibliography, works/software exports, catalog, search index, feed, sitemaps, and counts (bibliography works 193 → 194). check_zenodo_uncatalogued.py now reports the bibliography caught up (0 uncatalogued). Scope note: "0 uncatalogued" covers the Zenodo/ORCID deposit channel (DAF's primary archival target) — curated software (SOFTWARE.md) and presentations are deliberately-curated subsets, not auto-swept, and Google Scholar citation metrics (data/scholar-snapshot.json, as_of 2026-06-09) require DAF's own signed-in browser fetch per repo policy and were not updated. The record-17982447 non-canonical-DOI note is the documented AII-Ecosystem yearly-snapshot exception and is intentionally unchanged.add_zenodo_only.py DOI fix: the tool wrote the version-specific DOI into the per-paper folder files (README/AGENTS/SKILL/CITATION.cff/metadata.json) while the bibliography and paper_metadata.json used the canonical concept DOI — splitting one work across two DOIs and failing test_paper_readme_contracts.py. Added a canonical_doi(rec, meta) helper (concept-DOI-first, mirroring the bibliography derivation) and routed every folder renderer through it; the version id is retained separately as record_id. Future Zenodo-only additions are now concept-DOI-consistent by construction.script-src 'self' CSP deployed 2026-07-12 silently blocked the inline <script> blocks still shipping on art.html, videos.html, search.html, repositories.html, repositories-forks.html, and index.html — /art rendered zero of its 942 artworks and its search box only surfaced site-wide paper suggestions. All six pages' scripts externalized to js/art-gallery.js, js/videos-page.js, js/search-page.js, js/repo-inventory.js (shared by both repo pages), and js/index-page.js.data-local-search attribute on the /art search input opts it out of the site-wide search-index.json autocomplete in js/interactive.js; gallery filtering (title/description/tags over all 942 works) is handled by js/art-gallery.js. Also fixed a latent error-path bug (getElementById('empty') → emptyState) and a duplicated tts-controls.js include.data-* attributes already delegated by js/interactive.js to window.* globals; js/art-gallery.js was additionally addEventListener-wiring the same buttons, so each ‹/› click advanced two artworks. art-gallery.js now wires only the search input, Escape/arrow keys, and overlay-click and defers the delegated controls to interactive.js (caught by cross-vendor review).onfocus/onblur (CSP-blocked) replaced with a CSS :focus reveal rule.media="print" onload="this.media='all'" pattern (blocked by CSP, so Google Fonts never applied on nine pages) replaced with media="print" data-media-swap="all" + an external swap in js/interactive.js; optimize_font_loading.py updated to emit and migrate to the new pattern.oninput="filterPubs()" replaced with addEventListener wiring in js/publications.js.media="print" onload="this.media='all'" pattern, eliminating render-blocking CSS on first paint. New code/orchestrators/optimize_font_loading.py orchestrator.twitter:card, twitter:title, twitter:description, twitter:image meta tags for social sharing parity with OG tags.except Exception: continue now logs the exception with page number, image index, and PDF filename to stderr before continuing, preventing silent extraction failures."Figure from [paper_name], page N" instead of raw filenames, improving screen reader usability and SEO.generate_citation_cff.py script creates CFF 1.2.0 files from metadata.json. 47 papers that were missing CITATION.cff now have it. Year extracted from folder names for older papers. Multi-line author format with ORCID for DAF.BIOFIBIOFIRM_v2.pptx from Zenodo, extracted 11 slides of text + 8 images using python-pptx. 173 of 176 papers now have full_text.md (98.3% coverage).script-src 'self') now on all 23 indexable HTML pages, blocking inline event handlers and inline <script> blocks. Documented in docs/security/security-posture.md.onclick/onchange/onsubmit handlers across 23 pages migrated to data-* attributes wired via addEventListener in js/interactive.js. New code/orchestrators/migrate_inline_handlers.py orchestrator.js/menu-esc.js: menu Escape-to-close handler moved from inline <script> to external file for CSP compliance.accessibility_audit.py now checks for no_inline_handlers as a gate (16 checks, up from 15). All 23 pages pass..menu-btn for keyboard-accessible menu toggle on the art gallery page.deploy_seo_security.py (idempotent CSP/rel-me/hreflang deployment), migrate_inline_handlers.py (inline handler → data-attribute conversion).HEAD_EXTRAS constant in code/src/site_nav.py centralizes CSP + rel-me + hreflang + dns-prefetch for generated HTML templates (domain, work, paper, video pages).image_gallery_link() in build_paper_pages.py now shows up to 6 thumbnail previews of extracted figures with lazy loading and a "+N more" indicator. All 176 paper pages regenerated..image-thumbs, .thumb-link, and .muted added to style.css, replacing inline styles for cleaner maintenance and consistent rendering.build_search_index.py now includes image_count for works with extracted images (140 works). Search results page shows "Full Text" and "N Images" badges on matching works.BIOFIBIOFIRM_v2.pptx (11 slides) for 2025_BiofirmDevelopmentWith. 172 of 176 papers now have full_text.md (97.7% coverage).zenodo.21316510, docxology/prior_cognitive_art v0.1.0) via the canonical sync_paired_publications.py --apply path. Paper folder, bibliography row, work page, domain page, search index, sitemap, and all generated surfaces updated.extract_paper_texts.py now embeds inline image references in full_text.md at the correct page positions, so readers and crawlers can discover extracted figures in context.full_text.md (was 166 — gained 5 from ODT/DOCX/PDF source extractions)full_text.md with 0 broken linksformat_markdown() now accepts an images parameter and groups image refs by pageextract_images() now returns (page_num, filename) tuples for page-aware embeddingbuild_image_sitemap.py now includes paper-extracted figures in sitemap-images.xml (9,928 total images, was 942 — 139 paper pages with image galleries)code/orchestrators/extract_paper_texts.py extracts page-level text and embedded images from all paper PDFs using PyMuPDF (with OCR fallback via tesseract for scanned PDFs).full_text.md with complete page-by-page text extractionimages/ subdirectories across 136 paperspapers/*/index.html) now link to full_text.md and the images/ galleryencoding field (Schema.org TextObject) for all 166 works with full textfull_text_url for all 166 works with extracted textpapers/README.md updated to document full_text.md and images/ as standard folder contentsllms.txt updated with full-text extraction pipeline linkregenerate_all.py to use sys.executable instead of hardcoded python3 (was breaking on Python 3.9 vs 3.14 datetime.UTC import)build_current_counts.py Python 3.9 compatibility (datetime.UTC → datetime.timezone.utc)build_resume.py to gracefully skip PDF generation when reportlab is not installedvalidate_repo.py to skip full_text.md files in local-link validation (academic paper internal references)build_sitemap.py to not list /papers/ URLs (SEO invariant compliance)js/tts-controls.js) — floating control panel, speed/voice selection, paragraph highlighting, keyboard shortcut Tjs/interactive.js): reading progress bar, scroll-to-top button, keyboard shortcuts overlay (?), section anchor copy-links, search autocomplete from search-index.json, image lazy loading, external link safetypreconnect for Scholar/ORCIDrel="me" social profile verification links, hreflang support, WebPage JSON-LD on homepageSKILL.md, docs/design/components/tts.md, docs/design/animations.md; updated AGENTS.md with WEB DEVELOPER role, CLAUDE.md with interactive layer commands, design-system docs with new componentsnoindex redirect stubs intentionally skipped (about, research, meditations, nft, google verification)batch_enrich_metadata.py. 44 previously-missing metadata.json files created, 119 existing ones extended with paper-specific content.code/orchestrators/batch_enrich_metadata.py (bulk metadata generation), code/orchestrators/improve_metadata_quality.py (paper-specific methods/findings), code/src/paper_metadata_schema.py (dataclass schema).validate_repo.py --strict-reports pipeline passes (30+ checks including browser smoke, accessibility, visual QA, live-site verification, sitemap, search index, external links).zenodo.21083779), #181 "Exploratory Data Analysis: A Reproducible Notebook Template" (zenodo.21086292), #182 "A Domain Language for Specifying Controlled Methods" (zenodo.21086548) — all Computational, with paper folders and full metadata.zenodo.21047573, docxology/blake v0.1.0) via the canonical sync_paired_publications.py --apply path, plus benign checked_at metadata bumps on existing rows. Full local regenerate (works.json, exports, publications, work/domain/paper pages, resume, claims, catalog, search index, feed, sitemap, counts) and live-site snapshot refresh; validate_repo + pytest green. Also fixed 32 malformed bare-domain markdown links in reports/publishing_status_megaindex.md.zenodo.20976824, docxology/alphacogant v1.0.1) with paper folder, PDF, and work page; updated "A template/ approach to Reproducible Generative Research" to Zenodo version v1.0.9. Regenerated the dependent layer and refreshed the live-site verification snapshot.build_work_pages.py now renders a Platform availability card on every canonical work page (Zenodo/GitHub/arXiv/OSF/HuggingFace/Software-Heritage/PyPI/site), driven by a new data/publishing-status.json; added reports/publishing_status_megaindex.md, a publishing-status mega-index across 272 items (works + software) with per-platform coverage and gaps. Began archiving origins to Software Heritage via anonymous Save Code Now.checked_at metadata on 27 existing paired works. Regenerated bibliography exports, publications/works/paper/domain pages, catalog, search index, feed, sitemap, resume, claims, evidence/reconciliation, and current counts; live-site snapshot refreshed.zenodo.20834846, docxology/realizing_emptiness v1.0.0) via sync_paired_publications.py --apply; refreshed checked_at metadata and software links for 25 existing works; fixed the pages/BIBLIOGRAPHY.md paper-folder prose count (156→157).code/orchestrators/regenerate_all.py: a single-command, dependency-ordered, local-only write-mode counterpart to validate_repo.py's --check sequence (manifest last), replacing manual whack-a-mole after a publication-sync apply. refresh_bibliography_counts now also keeps the "N indexed paper folders" prose current. validate_repo.py now runs sync_scholar_metrics.py --check, catching Scholar-metric drift across README/BIBLIOGRAPHY/PROFILE/LINKS/DISCOVERY (previously unguarded).reports/visual-qa and reports/browser-smoke (validation only reads the latest); reports/ 100 MB → 40 MB. add_zenodo_only.py now runs regenerate_all.py automatically after adding records.regenerate_all.py's report-producer ordering so write-mode indexes don't go stale relative to the dated reports they link.zenodo.20804585, ) and hardened publication intake.zenodo.20786638, ) — docxology/template_madlib, deterministic token injection for conditional IMRAD manuscripts — as work 172, and California Public Records (zenodo.20789899, ) — a technical and legal reference for the post-AB 473 era — as work 173. Downloaded both PDFs, generated work/paper pages, and registered papers/README.md entries. Bibliography 170→172; paper folders 153→155. Also added the previously-missing COGANT-0.6.0.pdf and removed a duplicate On-Policy Distillation folder.itrace / ntqr_llm / on_policy_distillation software-catalog links) from per-version DOIs to their concept DOIs, each verified against the Zenodo API conceptdoi field so the citation always resolves to the latest version. Deliberately excluded version-distinct works that share a single concept DOI (e.g. the AII Ecosystem v1/v2/v3 snapshots) to avoid duplicate DOIs.docxology/AGEINT) and template_madlib (docxology/template_madlib) to the software catalog: docxology owned 58→60, Grand Total 92→94 (Education 5→6, Developer Tools 15→16); recomputed the GitHub-inventory curated split.sync_publications_html.py now patches twitter:image:alt with the live work count (was stale at 170); removed a doubled "Abstract" heading and added the MIT license field in the On-Policy Distillation paper folder; reconciled that folder's metadata to its concept DOI.design-system.md to the actual style.css (corrected background/radius/body-font/focus-color tokens, documented previously-missing tokens); added mobile-menu aria-expanded toggling, ESC-to-close, and a 44px WCAG touch target across all 20 nav pages and their generators; fixed heading-hierarchy skips (h1→h3/h2→h4) on domain and index pages; added aria-labels to 3 unlabelled search inputs; tokenized 26 hardcoded gold rgba() values into 14 --gold-NN tokens (no visual change); accessibility_audit.py now enforces single-h1, no-heading-skips, and form-control-labels (22/22 pages pass).site_nav.MENU_ESC_SCRIPT; removed 26 lines of verified-dead CSS (duplicate footer block, zero-reference selectors) after confirming the two-layer base+newspaper override structure is intentional, not duplication.zenodo.20732275, ) — docxology/AGEINT v0.1.0, a Synthetic Analytic Tradecraft curriculum-and-assurance atlas — as work 170 via the canonical sync_paired_publications.py apply path, scoped --since 2026-06-16 to isolate the single new release. Stripped the <p> HTML the Zenodo abstract carried into metadata.json/README.md; renumbered the papers/README.md index strictly 1..152 (closed the gap at 111 left by the CEREBRUM dedup, plus a duplicate 152). Regenerated all dependent surfaces. Bibliography 168→169; paper folders 151→152; software unchanged at 91; Computational domain 27→28. Identified CEREBRUM (zenodo.15231156) and Self-Improvement Agent Harness (zenodo.20693012) as re-versions of existing works …010 / …127 (newer version DOIs of already-curated concepts) — update-only, not new rows.zenodo.20705351, ) and coasys / COGANT software-catalog intake after commit b6fa1b4: added 2026_COGANT to papers/README.md (151 folders), paper_metadata.json, and the Computational domain blurb (27 works); regenerated publications, software, sitemap, resume, evidence, search, feed, domain, and count exports. Bibliography 167→168; software catalog 89→91 (58 owned + 33 AII); paper folders 150→151.add_zenodo_only.py: DemoCreate (zenodo.20693217, ) and ENTO (zenodo.20647443, ); added the GeneralizedNotationNotation (GNN) software v2.0.0 (zenodo.20671741, ) as a distinct work from the 2023 GNN paper (different Zenodo concept). Bibliography 165→167.…118 (papers/2025_CEREBRUM2, the v1.4 deposit zenodo.15231156) outright, keeping the primary …010 (papers/2025_CEREBRUM, zenodo.15170907). Retired the now-empty WORK_CANONICAL_OVERRIDES entry and its regression test; re-pointed the CEREBRUM software-catalog entry to the surviving paper folder. Removed-work numbers are retired, not renumbered, so existing work-page URLs stay stable — sync_publications_html.validate_rows now allows numbering gaps (strictly-increasing instead of exactly-sequential).zenodo.20669283 (v3.4.0).build_work_pages.py now fails loud on a duplicate citation_key (was silent last-write-wins page overwrite); new test_frozen_work_keys.py freezes every num → citation_key so a retitle that would churn a live URL fails CI; documented works/{citation_key}.html as a permanent opaque contract in the canonical policy.docs/ from 7 flat files into topic subdirectories (operations/, seo/, design/, security/, releases/) with a new docs/README.md navigation index; updated all inbound references across code, agent entrypoints, and the search index. docs/AGENTS.md retained as agent operational guidance.LINKS, PROFILE, WIKIPEDIA, COLLABORATORS, MEDIA) that had silently drifted to 125/154-work counts → 167, and added them to count_consistency so they can no longer rot. Linked the new docs/README.md index from README.md, AGENT_START.md, and llms.txt; documented data/works.json as the canonical works registry and the security.txt/warrant-canary status under docs/security/.build_work_pages.py now clips on a word boundary with an ellipsis via new clip_description() in code/src/site_nav.py (145 of 165 work descriptions corrected; rendered length ≤160).summary_large_image) and og:image:alt tags site-wide. Generators (build_work_pages, build_domain_pages, build_catalog, build_exports_page, build_evidence_page, build_updates_page, build_github_inventory) emit them; hand-maintained pages (index, publications, art, videos, collaborators, search, discovery, cite-verify, media, software) are covered by a new idempotent code/orchestrators/ensure_social_meta.py.domain-biomedicine.html (Genetics & Biomedicine, , 15 works) with og-biomedicine.jpg; added to sitemap_policy.py; relinked the homepage card from a raw pages/BIBLIOGRAPHY.md#… anchor to the new page.theme-color and standardized to #0c0c0e (matches manifest); tightened the meta/og description to 153 chars; added word separators between publication-card title/venue/citation spans so text extractors and screen readers no longer read them run-together.code/src/seo_invariants.py (check_social_meta, check_work_descriptions) with tests in test_seo_invariants.py and test_site_nav.py; full suite 88 passing.ScholarlyArticle.author JSON-LD with inline @type/name/url (not just a cross-document @id) so search engines reliably attribute authorship for rich results. Applied the same word-boundary clip_description() to build_paper_pages.py (148 paper-folder pages no longer truncate mid-word). Verified site-wide: 373 JSON-LD blocks all valid, full image-alt coverage (incl. the JS-rendered art gallery via artAlt()), no broken internal links.papers/2024_PopulationSearch/) is stale (crawled before publish; now live, noindex, canonicalized). Findings + roadmap recorded in reports/seo-discoverability-audit-2026-06-10.md.sitemap-images.xml, new build_image_sitemap.py) declaring 942 gallery artworks for Google Images discovery — preferring the same-domain /art/*.jpg copies (939) over Flickr, since art.html renders client-side and the images are otherwise invisible to crawlers. Registered in robots.txt; well-formedness + freshness covered by test_build_image_sitemap.py.…118 (papers/2025_CEREBRUM2, the v1.4 deposit) now sets rel=canonical + og:url to the primary entry …010 (papers/2025_CEREBRUM), consolidating ranking signals for the same paper. Added a shared WORK_CANONICAL_OVERRIDES/canonical_work_key in code/src/site_nav.py, used by both the work-page generator and the check_work_pages invariant, with a regression test.2023_HoneyBeeGeneExpression (Zenodo TSGE meta-analysis abstract), 2023_AII_v1 (AII overview, recovered from the file's own schema block — the body had TrustFinder text), and 2023_ToComment (a Physics of Life Reviews commentary on Manrique & Walker's "To copy or not to copy?", per Semantic Scholar — not the digital-memes text it carried). All 165 work-page meta descriptions are now unique. Confirmed www→apex 301 redirect and self-canonical (no duplicate-content split). Flagged: works …010/…118 are the same CEREBRUM paper (DOI zenodo.15170907 resolves to 15231156, v1.4) — a bibliography dedup/curation decision left to the maintainer.2026_DeterministicTestbedSelf, 2026_RecoveringLLMPersona, 2026_Triplicate, and 2026_TemplateTextbook; bibliography 150→154, paper folders 143→147.WhenDoBugs, MusicNeverStopped, BeeStack, BiologyTextbook, CrescentCity, and template-derived exemplars; left review-only pairings untouched.template_autoscientists, template_newspaper, template_textbook, ntqr_llm, grateful_data, cohereants); software catalog 50→56 owned, 82→88 total.docxology/template DOI 10.5281/zenodo.20469500 as software/version metadata, not a bibliography work row.llms.txt, software JSON/LD, and GitHub inventory counts.llms.txt, release notes, and publications head meta; added count-consistency validation (code/src/count_consistency.py).publications.html to load catalog rows from data/works.json via js/publications.js; externalized CollectionPage JSON-LD to data/publications-ld.json (166-line shell).docs/SECURITY.md, docs/DESIGN_SYSTEM.md, reports/web_assessment_2026-05-26.md, shared nav (code/src/site_nav.py) on work and domain pages; removed Inter from body typography in favor of system-ui stack.2026_BiologyTextbook — Introduction to Biology: A Generative Approach (DOI 10.5281/zenodo.20286478; repo docxology/biology_textbook); bibliography 116→117; paper folders 109→110; Computational domain 7→8; Books 3→4.papers/software_table.py and papers/sync_software_html.py: full 82-row software catalog sync from pages/SOFTWARE.md to software.html + data/software-ld.json; fixed SOFTWARE.md subtotal 49→50; biology_textbook on software surface; work-page source-repo links from metadata.json.2026_CrescentCity — Crescent City in Living Waves: Space, Time, People, and Minds on the Southern Cascadian Coast (DOI 10.5281/zenodo.20286171; repo docxology/crescent_city), filed under Cognitive Security.README.md, AGENTS.md, SKILL.md, CITATION.cff, and metadata.json.papers/paper_metadata.json, the papers/README.md index, and papers/AGENTS.md (counts + maintenance log + domain coverage).pages/BIBLIOGRAPHY.md and the Cognitive Security domain index; regenerated data/works.json and bibliography exports via export_bibliography.py.publications.html PUBS + JSON-LD mainEntity and regenerated downstream artifacts (search index, domain/work/catalog pages, evidence, feed, sitemap, updates).llms.txt, CITATION.cff, codemeta.json, bibliography exports, and structured data/*.json.search.html, opensearch.xml, catalog.html, data/catalog.json, GENERATED.md, and data/generated-manifest.json for human search, browser discovery, dataset discovery, and generated-file rebuild provenance.updates.html, AGENT_START.md, humans.txt, .well-known/security.txt, external-link triage, live-site verification, asset-size audit, and selector-based browser smoke reporting.YYYY_Topic.2020_FacilitatorsCatechism.