> ## Continuous-process anchor
>
> This spec describes an instance of one of the retired-script themes
> documented in docs/design/retired_scripts_patterns.md. Before
> implementing, read:
>
> 1. The "Design principles for continuous processes" section of that
> atlas — every principle is load-bearing. In particular:
> - LLMs for semantic judgment; rules for syntactic validation.
> - Gap-predicate driven, not calendar-driven.
> - Idempotent + version-stamped + observable.
> - No hardcoded entity lists, keyword lists, or canonical-name tables.
> - Three surfaces: FastAPI + orchestra + MCP.
> - Progressive improvement via outcome-feedback loop.
> 2. The theme entry in the atlas matching this task's capability:
> A6 (pick the closest from Atlas A1–A7, Agora AG1–AG5,
> Exchange EX1–EX4, Forge F1–F2, Senate S1–S8, Cross-cutting X1–X2).
> 3. If the theme is not yet rebuilt as a continuous process, follow
> docs/planning/specs/rebuild_theme_template_spec.md to scaffold it
> BEFORE doing the per-instance work.
>
> **Specific scripts named below in this spec are retired and must not
> be rebuilt as one-offs.** Implement (or extend) the corresponding
> continuous process instead.
Recurring CI task for Quest 17 (Rich Artifacts). Scan for completed analyses that lack notebooks, generate notebook stubs for the top 3 missing, verify /artifacts and /notebooks pages load correctly, and report coverage percentage to track progress toward 100% notebook coverage.
SELECT id, title FROM analyses WHERE status='completed' AND id NOT IN (SELECT DISTINCT analysis_id FROM notebooks WHERE analysis_id IS NOT NULL)post_process.py or direct DB insert with summary contentnotebooks table with analysis_id column(timestamped entries added during execution)
task-083db551-3597-46e6-94a0-714ea9087bb3.ci_notebook_coverage.py implementation./artifacts and /notebooks routes, and record coverage snapshot.timeout 300 python3 ci_notebook_coverage.py43 / 43 completed analyses covered (100.00%)0timeout 120 scidex status → api and nginx active200 /api/status200 /artifacts200 /notebooks200 /notebook/nb-SDA-2026-04-04-gap-senescent-clearance-neuro (existing notebook still accessible)
timeout 300 python3 link_checker.py1826 pages, 2064 links, 0 concrete broken linksscidex status, and read task spec + quest priorities.ci_notebook_coverage.py for recurring Artifact CI coverage checks and stub generation.35 / 41 covered = 85.37%.SDA-2026-04-04-gap-tau-prop-20260402003221astrocyte-subtypesgba-pd
GET /api/status → 200GET /artifacts → 200GET /notebooks → 200GET /notebook/nb-SDA-2026-04-04-gap-senescent-clearance-neuro → 200
timeout 300 python3 link_checker.py → no persistent broken links (0 broken), transient local API outages auto-suppressed by checker.python3 ci_notebook_coverage.pyapi.py.site/notebooks/, verify /artifacts and /notebooks route health, and record coverage metrics.scripts/artifacts_notebook_coverage_ci.py to automate Quest 17 coverage checks and top-missing stub generation.timeout 180 python3 scripts/artifacts_notebook_coverage_ci.py --db-path postgresql://scidex --notebooks-dir site/notebooks --limit 346/60 completed analyses (76.7%).SDA-2026-04-04-gap-neuro-microglia-early-ad-20260404SDA-2026-04-04-gap-tau-prop-20260402003221sda-2026-04-01-001
site/notebooks/ (.ipynb + .html for each analysis).timeout 120 scidex status => api and nginx active.curl checks after transient outage recovery:200 /artifacts200 /notebooks200 /api/status302 /200 /notebooks/SDA-2026-04-04-gap-neuro-microglia-early-ad-20260404.htmltimeout 300 python3 link_checker.py completed with no broken-link report; run skipped deep crawl due repeated API readiness timeouts (transient service churn).
timeout 300 python3 ci_notebook_coverage.py41 / 43 completed analyses covered (95.35%)2 (below top-3 cap)gut-brain-adtrem2-adsite/notebooks/gut-brain-ad.ipynbsite/notebooks/gut-brain-ad.htmlsite/notebooks/trem2-ad.ipynbsite/notebooks/trem2-ad.html
timeout 120 scidex status → api active, nginx active200 /api/status200 /artifacts200 /notebooks200 /notebook/nb-SDA-2026-04-04-gap-senescent-clearance-neuro (existing notebook route still healthy)
timeout 300 python3 link_checker.py1584 pages, 1737 links, 8 broken refs; most failures were auto-classified as transient outage retrieslogs/link-check-latest.json
95.35% with no regression on core artifact routes.timeout 300 python3 ci_notebook_coverage.py100.00% (46/46 completed analyses covered)200 /api/status200 /artifacts200 /notebooks200 /notebook/nb-SDA-2026-04-04-gap-senescent-clearance-neuro (existing notebook still accessible)
timeout 300 python3 link_checker.pylogs/link-check-latest.json
task-bc5704ce-f2df-401b-a640-f57ded341ced.8e893dbe) included scope creep: hardcoded DB_PATH, removed participant_contributions.py + 4 API endpoints + migration + script, deleted 3 spec files, added .ipynb files to repo.agent_registry.py DB_PATH env-var fallbackapi.py participant contribution endpointsparticipant_contributions.py, migrations/060_agent_contribution_ledger.py, scripts/register_agent_finding.pytimeout 300 python3 ci_notebook_coverage.pydaad56e4task-bc5704ce-f2df-401b-a640-f57ded341ced.timeout 300 python3 ci_notebook_coverage.py --no-registerSDA-2026-04-04-gap-epigenetic-reprog-b685190e (missing_ref, score 0.5609)SDA-2026-04-04-analysis_sea_ad_001 (missing_ref, score 0.5454)SDA-2026-04-09-gap-debate-20260409-201742-ca7016f1 (missing_ref, score 0.0000)SDA-2026-04-08-gap-pubmed-20260406-062218-5c7f15f4 (stale_ref)SDA-2026-04-08-gap-pubmed-20260406-062111-db808ee9 (stale_ref)SDA-2026-04-08-gap-debate-20260406-062033-fecb8755 (stale_ref)SDA-2026-04-03-gap-seaad-v4-20260402065846 (stale_ref)SDA-2026-04-03-gap-seaad-v2-20260402032945 (stale_ref)
sqlite3.DatabaseError: database disk image is malformed in artifacts table INSERT — DB corruption confirmed by PRAGMA integrity_check. Registration skipped this cycle; stubs written only to worktree site/.200 /api/status, 200 /artifacts, 200 /notebookssite/notebooks/ in worktree (will sync via orchestra push)7d1532d1timeout 300 python3 ci_notebook_coverage.pySDA-2026-04-03-gap-aging-mouse-brain-v2-20260402SDA-2026-04-06-gap-pubmed-20260406-041428-e14e6524SDA-2026-04-04-gap-debate-20260403-222510-20260402
200 /api/status, 200 /artifacts, 200 /notebookstimeout 300 python3 ci_notebook_coverage.py --no-registerSDA-2026-04-04-gap-apoe4-lipid-metabolism (1 analysis without notebook ref)SDA-2026-04-04-gap-20260404-052358 (stale notebook_path ref)
ci_notebook_coverage.py: added PRAGMA journal_mode=WAL and PRAGMA busy_timeout=30000 to _connect() function.200 /api/status200 /artifacts200 /notebooks
timeout 300 python3 link_checker.py (background)task-685ade6e-b77e-4794-a6f8-cf2e21e0780c.timeout 120 python3 ci_notebook_coverage.py --db-path postgresql://scidex --site-root /home/ubuntu/scidex/siteSDA-2026-04-03-gap-immune-atlas-neuroinflam-20260402 (missing_ref, score 0.5220, hyps 1)SDA-2026-04-12-gap-debate-20260410-112908-13c403ee (missing_ref, score 0.4800, hyps 1)SDA-2026-04-04-frontier-immunomics-e6f97b29 (missing_ref, score 0.0000, hyps 0)
200 /api/status200 /artifacts200 /notebooks
logs/notebook-coverage-latest.json, logs/notebook-coverage-latest.md, site/notebooks/notebook_coverage_summary_latest.mdtask-ef45217e-ef7d-4535-8cc9-d358abbf5258.timeout 120 python3 ci_notebook_coverage.py --db-path postgresql://scidex --site-root /home/ubuntu/scidex/siteSDA-2026-04-04-gap-epigenetic-reprog-b685190e (missing_ref, score 0.5204, hyps 7)SDA-2026-04-04-analysis_sea_ad_001 (missing_ref, score 0.5117, hyps 5)SDA-2026-04-11-gap-debate-20260410-111113-052488a8 (missing_ref, score 0.0000, hyps 0)
200 /api/status200 /artifacts200 /notebooks
logs/notebook-coverage-latest.json, logs/notebook-coverage-latest.md, site/notebooks/notebook_coverage_summary_latest.mdtask-730d0425-7980-4695-b216-6beac90b0603.timeout 120 python3 ci_notebook_coverage.py --db-path postgresql://scidex --site-root /home/ubuntu/scidex/siteSDA-2026-04-04-frontier-connectomics-84acb35a (missing_ref, score 0.0000, hyps 0)SDA-2026-04-04-frontier-proteomics-1c3dba72 (missing_ref, score 0.0000, hyps 0)SDA-2026-04-09-gap-debate-20260409-201742-ca7016f1 (missing_ref, score 0.0000, hyps 0)
200 /api/status200 /artifacts200 /notebooks
logs/notebook-coverage-latest.json, logs/notebook-coverage-latest.md, site/notebooks/notebook_coverage_summary_latest.mdtimeout 300 python3 ci_notebook_coverage.py in worktree task-33803258-84bd-4bde-873b-740f1de9d1c3SDA-2026-04-09-gap-debate-20260409-201742-1e8eb3bd (missing_ref)SDA-2026-04-09-gap-debate-20260409-201742-d279750b (missing_ref)SDA-2026-04-09-gap-debate-20260409-201742-5407d57d (missing_ref)SDA-2026-04-04-frontier-connectomics-84acb35a (stale_ref repair)SDA-2026-04-04-frontier-proteomics-1c3dba72 (stale_ref repair)
200 /api/status200 /artifacts200 /notebooks
logs/notebook-coverage-latest.json, logs/notebook-coverage-latest.md, site/notebooks/notebook_coverage_summary_latest.mdAGENTS.md, task spec, Quest 17 artifacts spec, artifact governance notes, and retired-script A6 continuous-process guidance.scripts/ci_notebook_coverage.py --report-only --ci-mode: completed-analysis notebook references were 131/131 but strict file coverage was 76/131 (58.02%) with 20 stale analyses.notebook_path refs and 55 stale notebook-link refs.INSERT OR REPLACE / INSERT OR IGNORE syntax; patched registration and artifact-link writes to PostgreSQL-compatible ON CONFLICT upserts and guarded inserts.131/131 (100.00%), missing refs 0, stale analysis refs 0, stale notebook-link refs 0; 55 CI notebook stubs were registered and 57 stale work items were repaired/rewritten.python3 -m py_compile scripts/ci_notebook_coverage.py passes./api/status, /artifacts, /notebooks, and an existing notebook route, but the live API returned 500s from psycopg_pool.PoolTimeout before route-specific handling. scidex services restart api was attempted but sandbox sudo restrictions prevented an effective restart.