Repository navigation
Expand file tree
/
Copy pathtasks.yaml
More file actions
2104 lines (2103 loc) · 105 KB
/
Copy pathtasks.yaml
File metadata and controls
2104 lines (2103 loc) · 105 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
# tasks.yaml - task + Gantt source of truth for this project.
# Managed by Operator (live read-write).
# status: todo | in_progress | blocked | done. dates: YYYY-MM-DD. progress: 0-100.
project:
lifeArea: volunteering
title: Active Skillference - Active Inference micro-learning platform
status: active
updated: "2026-07-31"
live_metrics:
skills: 630
subjects: 111
prerequisite_edges: 1199
dependencies: 1199
quizzes: 630
assessments: 2520
claims: 79
figures: 26
cited_sources: 188
max_depth: 75
tasks:
- id: asf-roadmap-oracle
title: Roadmap and live-count drift validation
status: done
surface: roadmap
owner: src.roadmap
metrics:
skills: 630
subjects: 111
prerequisite_edges: 1199
assessments: 2520
claims: 79
figures: 26
cited_sources: 188
max_depth: 75
evidence:
- uv run python scripts/validate_roadmap.py
- uv run python scripts/validate_live_counts.py
notes: tasks.yaml is now the machine-readable roadmap source, and TODO.md is validated against it so
stale counts cannot remain green.
start: ""
end: ""
progress: 0
milestone: false
deps: []
tags: []
- id: asf-distractor-quality-and-accessibility
title: Off-domain distractor cleanup with regression gate, dashboard accessibility, and DAG-safety
figure
status: done
surface: curriculum
owner: src.curriculum
metrics:
skills: 630
subjects: 111
prerequisite_edges: 1199
assessments: 2520
evidence:
- uv run python scripts/build_curriculum.py
- uv run pytest tests/test_curriculum_quality.py tests/test_dashboard.py tests/test_figures.py
tests/test_claim_support.py tests/test_manuscript_artifacts.py -q
notes: Replaced off-domain placeholder quiz distractors (UI/plumbing junk) with on-domain
alternatives and added quality._audit_implausible_distractors (verbatim + display-class guard,
scoped to incorrect answers) so the class cannot regress; the gate caught a residual joint
after a cross-vendor (Forge) audit flagged the first verbatim-only version as near-vacuous.
Dashboard gained WCAG keyboard tab navigation, focus-visible styles, a skip link, and an
accessible prerequisite-flow table. plot_dependency_strata_flow now marks the backward
(lower-triangle) zone as must-stay-empty so the no-backward-edges invariant is self-proving.
claim_support cross-checks declared claim tokens against the kernel registry and validator
paths against the filesystem.
- id: asf-curriculum-hardening
title: Curriculum expansion and stricter quiz quality
status: done
surface: curriculum
owner: src.curriculum
metrics:
skills: 630
subjects: 111
prerequisite_edges: 1199
assessments: 2520
evidence:
- uv run python scripts/build_curriculum.py
- uv run pytest tests/test_curriculum_catalog.py tests/test_curriculum_quality.py -q
notes: The graph includes continuous dynamics, state-space probability, rate-distortion information,
continuous variational inference, predictive-coding process theory, hierarchical active
inference, reproducible simulation labs, applied evaluation dossiers, supplemental VFE/EFE
scientific critique subjects, visual reasoning review subjects, and publication-synthesis
handoff subjects.
- id: asf-supplement-science-expansion
title: Supplemental mathematical analysis and scientific curriculum expansion
status: done
surface: manuscript
owner: manuscript/08_supplement_variational_free_energy.md
metrics:
skills: 630
subjects: 111
prerequisite_edges: 1199
assessments: 2520
figures: 26
evidence:
- uv run python scripts/build_curriculum.py
- uv run python scripts/run_kernels.py
- uv run pytest tests/test_curriculum_catalog.py tests/test_manuscript_artifacts.py
tests/test_figures.py -q
notes: Detailed VFE/EFE walkthroughs moved into a numbered supplement, and scientific supplement
subjects add falsifiable VFE/EFE interpretation practice across all strata.
- id: asf-visual-reasoning-expansion
title: Visual reasoning curriculum and stratum-balance figure
status: done
surface: figures
owner: src.curriculum._ext_visual_reasoning
metrics:
skills: 630
subjects: 111
prerequisite_edges: 1199
assessments: 2520
figures: 26
evidence:
- uv run python scripts/build_curriculum.py
- uv run python scripts/run_kernels.py
- uv run pytest tests/test_curriculum_catalog.py tests/test_figures.py
tests/test_manuscript_artifacts.py -q
notes: Eight visual-reasoning subjects add figure-reading, captioning, dashboard, and
manuscript-review skills across all strata, while the stratum-balance figure exposes expansion
concentration risk.
- id: asf-visual-evidence-contracts
title: Visual-evidence contract curriculum and ladder figure
status: done
surface: figures
owner: src.curriculum._ext_visual_evidence_contracts
metrics:
skills: 630
subjects: 111
prerequisite_edges: 1199
assessments: 2520
figures: 26
evidence:
- uv run python scripts/build_curriculum.py
- uv run python scripts/run_kernels.py
- uv run python scripts/validate_manuscript_artifacts.py
- uv run pytest tests/test_curriculum_catalog.py tests/test_figures.py tests/test_dashboard.py
tests/test_manuscript_artifacts.py -q
notes: Two focused six-skill subjects teach visual evidence contracts across computation and
active-inference explanation. The visual_evidence_contract_ladder figure, registry
chart-contract fields, manuscript prose, dashboard detail view, and artifact validator now
share the same question, source, encoding, static/mobile, and failure-mode contract.
- id: asf-scholarship-health
title: Scholarship coverage and source-health validation
status: done
surface: scholarship
owner: src.scholarship
metrics:
cited_sources: 188
evidence:
- uv run python scripts/analyze_scholarship.py
- uv run python scripts/validate_scholarship_sources.py
- uv run python scripts/validate_scholarship_sources.py --online --strict-online
- uv run pytest tests/test_scholarship.py -q
notes: Scholarship rows must be cited, BibTeX-backed, lane-assigned, role-specific, and
locator-specific. The default check is offline; --online --strict-online hard-fails on a dead
DOI/URL (404, DNS) while tolerating publisher 403 bot-blocks, and is run as a networked
release gate (not in offline CI).
- id: asf-dashboard-graph-diagnostics
title: Dashboard graph diagnostics and accessible table fallback
status: done
surface: dashboard
owner: src.dashboard
evidence:
- uv run pytest tests/test_dashboard.py tests/test_dashboard_console.py -q
- chrome-devtools-axi eval "document.title"
- uv run python scripts/validate_dashboard_console.py
notes: The dashboard exposes graph bottlenecks, prerequisite neighborhoods, subject flows, max-depth
filtering, and read-only Learn/Quiz SkillTree handoff routes. validate_dashboard_console.py is
an opt-in browser gate that fails on any console error except the known, cosmetic upstream
skills-client probe of SkillTree's built-in Inception project (401, non-blocking, not fixable
from our config); it reports skipped (not clean) without a browser or running dashboard.
- id: asf-visualization-artifacts
title: Diagnostic figures and artifact registry validation
status: done
surface: figures
owner: src.figures
metrics:
figures: 26
evidence:
- uv run pytest tests/test_figures.py tests/test_manuscript_artifacts.py -q
- uv run python scripts/validate_manuscript_artifacts.py
notes: Graph bottlenecks, skill-neighborhood paths, scholarship source health, roadmap risk,
validation-surface, and validation-intent mismatch figures are generated, captioned,
alt-texted, and exposed to the dashboard.
- id: asf-technical-docs-visualization-contracts
title: Technical documentation and visualization contract hardening
status: done
surface: figures
owner: tests/test_docs_inventory.py
metrics:
skills: 630
subjects: 111
prerequisite_edges: 1199
assessments: 2520
figures: 26
evidence:
- uv run pytest tests/test_docs_inventory.py tests/test_figures.py
tests/test_manuscript_artifacts.py tests/test_dashboard.py -q
- uv run python scripts/run_kernels.py
- uv run python scripts/validate_manuscript_artifacts.py
- uv run python scripts/validate_rendered_freshness.py
- uv run python scripts/validate_roadmap.py
- uv run pytest --cov=src --cov-fail-under=90
notes: Technical documentation inventories now compare docs, scripts, and figure rows against the
live repository and planned figure registry. The figure contract adds data grain, palette
policy, palette roots, and non-color encoding fields; the manuscript artifact audit, dashboard
artifact cards, negative controls, and targeted figures use the same fields. Graph
bottlenecks, validation-surface, and roadmap-risk visuals now carry more of their reading in
direct labels, totals, hatching, and status text rather than hue alone.
- id: asf-visual-contract-specificity-and-doc-accuracy
title: Figure contract specificity and technical documentation accuracy
status: done
surface: figures
owner: src.figures
metrics:
figures: 26
evidence:
- uv run pytest tests/test_figures.py tests/test_manuscript_artifacts.py
tests/test_docs_inventory.py -q
- uv run python scripts/run_kernels.py
- uv run python scripts/validate_manuscript_artifacts.py
- uv run python scripts/validate_rendered_freshness.py
- uv run python scripts/validate_roadmap.py
notes: Figure registry validation now rejects generic fallback question, data-grain, static-read,
mobile-read, and failure-mode text. All registered figures carry figure-specific chart
contracts; sparse source views were redesigned as ledgers/status cards, concept coverage as a
lollipop audit, graph bottlenecks as a top-N direct-label ranking, and the long-path
diagnostic as a checkpointed route. Technical docs and manuscript prose now describe the full
visual QA field set, learn-route versus quiz-route fragments, and the bounded 90% src coverage
gate without claiming blanket 100% kernel coverage.
- id: asf-cover-publication-synthesis
title: Generated cover asset and publication-synthesis curriculum
status: done
surface: manuscript
owner: src.curriculum._ext_publication_synthesis
metrics:
skills: 630
subjects: 111
prerequisite_edges: 1199
assessments: 2520
figures: 26
evidence:
- uv run python scripts/build_curriculum.py
- uv run python scripts/run_kernels.py
- uv run python scripts/validate_manuscript_artifacts.py
- uv run pytest tests/test_curriculum_catalog.py tests/test_figures.py
tests/test_manuscript_artifacts.py -q
notes: A deterministic first-page cover and page-two named-skill atlas are generated from live
graph, claim, roadmap, and skill-name data as non-numbered front-matter artifacts, while eight
publication-synthesis subjects train reader handoff across all strata.
- id: asf-scientific-integrity-refactor
title: Claim-support evidence taxonomy and scientific-audit curriculum
status: done
surface: manuscript
owner: src.manuscript.claim_support
metrics:
skills: 630
subjects: 111
prerequisite_edges: 1199
assessments: 2520
figures: 26
cited_sources: 188
evidence:
- uv run python scripts/validate_claim_support.py
- uv run python scripts/validate_scholarship_sources.py
- uv run pytest tests/test_claim_support.py tests/test_scholarship.py tests/test_figures.py -q
notes: Manuscript claim-support anchors now bind strong scientific wording to computed, count,
simulation, literature, scope, delivery, or visual evidence classes; eight scientific-audit
subjects teach these proof obligations across all strata.
- id: asf-skilltree-nsa-security-context
title: SkillTree NSA provenance and national-security posture documentation
status: done
surface: scholarship
owner: manuscript/07_scope_and_related_work.md
metrics:
skills: 630
subjects: 111
prerequisite_edges: 1199
assessments: 2520
cited_sources: 188
evidence:
- uv run python scripts/analyze_scholarship.py
- uv run python scripts/validate_claim_support.py
- uv run pytest tests/test_scholarship.py tests/test_claim_support.py
tests/test_curriculum_catalog.py -q
notes: SkillTree is now treated as an NSA-origin open-source substrate with explicit
non-endorsement, deployment-posture, trusted-client, supply-chain, and APT-aware misuse
boundaries.
- id: asf-american-english-readiness-redteam
title: American English manuscript gate and initial-publication RedTeam review
status: done
surface: manuscript
owner: src.manuscript.american_english
metrics:
skills: 630
subjects: 111
prerequisite_edges: 1199
assessments: 2520
claims: 79
figures: 26
cited_sources: 188
max_depth: 75
evidence:
- uv run python scripts/validate_american_english.py
- uv run python scripts/validate_claim_support.py
- uv run pytest tests/test_manuscript_language.py tests/test_claim_support.py
tests/test_manuscript_artifacts.py -q
notes: Authored manuscript prose now uses American English with a fail-closed validator. The project
is suitable for initial static public-review publication, while live SkillTree proof and
DOI/repository publication metadata remain tracked as separate open tasks.
- id: asf-skilltree-live-recheck
title: Re-verify live SkillTree service and official quiz render
status: done
surface: skilltree
owner: scripts/run_learning_dashboard.sh
metrics:
skills: 630
subjects: 111
prerequisite_edges: 1199
dependencies: 1199
quizzes: 630
assessments: 2520
evidence:
- SKILLTREE_URL=http://localhost:8080 ACTIVE_SKILLFERENCE_LOCAL_AUTH=1
./scripts/run_learning_dashboard.sh
- uv run python scripts/bootstrap_local_skilltree.py --base-url http://localhost:8080 --no-seed
- uv run python scripts/validate_live_skilltree_dashboard.py --dashboard-url
http://127.0.0.1:8765 --skilltree-url http://localhost:8080
- "chrome-devtools-axi: verified dashboard title, SkillTree online status, official display
mount, mastery_computation_07 search, Learn/Quiz links, and real four-question SkillTree
quiz render"
notes: Docker SkillTree is reachable at localhost:8080, the dashboard is relaunched with local auth
at 127.0.0.1:8765, the official SkillTree display mounts, and mastery_computation_07 renders a
real four-question quiz in Chrome. Skills and quizzes seeded through local SkillTree
workflows; remaining large-graph dependency rows were synchronized idempotently into the local
Docker database because per-edge REST dependency validation was too slow at the 600-skill
scale.
- id: asf-skilltree-452-live-reverify
title: Live re-verify local SkillTree stack against skills-service 4.5.2
status: done
scale: minor
surface: skilltree
owner: docker-compose.yml
deps:
- asf-skilltree-live-recheck
metrics:
skills: 630
subjects: 111
prerequisite_edges: 1199
quizzes: 630
evidence:
- uv run python scripts/reset_local_skilltree.py --confirm-local-reset --timeout 1200
- "proof.ok=true; proof.mode=app-ready; liveAdminProject.skills=630;
artifacts present=42/42; figureContracts registered=21/dashboard=21;
browserConsole 'dashboard console gate OK'; rawSkillTreeLogin
adminSurfaceVisible=true, title='SkillTree Dashboard - Project Administrator'"
- uv run python scripts/validate_docker_digests.py
- uv run pytest tests/ --cov=src --cov-report=term-missing -q (814 passed, 90.17%)
notes: >-
Closed 2026-07-04. Two real bugs surfaced and fixed en route (both pre-existing, not
introduced by the 4.5.2 bump, but blocking this task): (1)
scripts/validate_full_app_stack.py called `docker compose up -d` without first setting
ACTIVE_SKILLFERENCE_POSTGRES_PASSWORD the way scripts/run_skilltree.sh does, so the
documented vendor/README.md one-liner failed on a fresh checkout; fixed by adding
src/integration/full_app_stack.py:ensure_postgres_password() (same state-dir-scoped file
convention as the shell script) and calling it before the compose command. (2)
scripts/reset_local_skilltree.py's `docker compose down -v` has the same interpolation
requirement and had the same gap; fixed by calling the same ensure_postgres_password()
helper there too. A stale skilltree_auth.json from the 2026-06-22 4.4.2 run also caused a
transient 401 on the first clean-volume attempt (stored admin credentials no longer matched
the freshly-initialized Postgres DB) — resolved by using the documented
reset_local_skilltree.py path (which backs up + removes local auth state before resetting
the volume) instead of a bare `docker compose down -v`. Final run: `--app-ready` proof is
green end-to-end against 4.5.2 (root bootstrap, project seed, dashboard health, figure
contracts, browser console gate, raw FORM login all passed). Full live-dependency parity
(1199/1199 edges via the admin REST API) was NOT attempted here — `--app-ready` explicitly
skips it, consistent with this project's own prior finding that per-edge REST dependency
validation is too slow at the 600-skill scale (see asf-skilltree-live-recheck's notes); that
remains a separately-scoped, still-open concern independent of this version bump. Docker
containers and the dashboard process were stopped and the compose volume removed after
recording evidence, per the "disposable outputs" convention.
- id: asf-skilltree-460-live-reverify
title: Live re-verify local SkillTree stack against skills-service 4.6.0
status: todo
scale: minor
surface: skilltree
owner: docker-compose.yml
deps:
- asf-skilltree-452-live-reverify
metrics:
skills: 630
subjects: 111
prerequisite_edges: 1199
quizzes: 630
evidence:
- uv run python scripts/reset_local_skilltree.py --confirm-local-reset --timeout 1200
- uv run python scripts/validate_docker_digests.py
notes: >-
Opened 2026-08-01 after bumping the pinned runtime from skills-service 4.5.2 to 4.6.0
(upstream release 2026-07-28). docker-compose.yml postgres:15 digest and the
skills-service tag+digest were refreshed via the documented Docker Hub procedure
(skills-service 4.6.0 = sha256:071220ce..., single-arch; postgres:15 = sha256:74e110c4...,
multi-arch incl. arm64), and AuthMode was re-confirmed as FORM/PKI/SAML2 at the 4.6.0 tag
(no PKI_OR_FORM). The digest pin and docs were updated, but no live full-app boot against
4.6.0 was recorded because Docker was not running on the reconciliation host. Per the
provenance-over-assertion principle, the 4.5.2 live records (asf-skilltree-452-live-reverify)
do NOT prove anything about 4.6.0; run the full-app proof (reset_local_skilltree.py
--confirm-local-reset --timeout 1200) against 4.6.0 and record proof.ok here before reading
this pin as live-verified.
2026-08-09 partial progress on a Docker-capable host, recorded without claiming the phase
exit: validate_docker_digests.py passes against the running stack, and the strict
full-parity proof (validate_full_app_stack.py --skip-regenerate, see
asf-live-stack-ci-rehearsal) is green against skills-service 4.6.0 with 1199/1199 live
dependencies, 630 live admin skills, raw FORM login, and the browser console gate. What is
still NOT proven is the fresh-volume path this task actually asks for: whether the
documented default root credentials bootstrap correctly on a newly created 4.6.0 volume.
That requires the destructive reset (docker compose down -v), which would also discard the
1199/1199 parity that took roughly an hour of per-edge writes to reach on this Apple/ARM
host, so it is deliberately left for an explicit maintainer run rather than folded in here.
scholarship_plan:
lanes:
- delivery_and_reporting
existing_source_keys: []
planned_source_targets: []
claim_support_types:
- scope_limit
boundaries:
- "Live full-app proof against skills-service 4.6.0 is operational verification, not a scientific or learner-outcome claim."
phase_exit:
- "`uv run python scripts/reset_local_skilltree.py --confirm-local-reset --timeout 1200` reports proof.ok=true against 4.6.0 and the evidence is recorded in this task."
- id: asf-captured-delivery-evidence
title: Captured browser evidence for the delivery surface
status: done
scale: medium
surface: manuscript
owner: src.screenshots
metrics:
skills: 630
subjects: 111
prerequisite_edges: 1199
figures: 26
evidence:
- uv run python scripts/capture_dashboard_screenshots.py
- uv run python scripts/validate_manuscript_artifacts.py
- uv run python scripts/validate_claim_support.py
- uv run pytest tests/test_screenshots.py -q
notes: >-
Closed 2026-08-09. The delivery result was the only Results subsection carrying no
visual evidence, which left the strongest delivery claim unfalsifiable from the paper:
that the official SkillTree learner client actually mounts and renders the seeded
project rather than a local copy of course text. Five browser recordings of the running
dashboard now carry that claim. They are registered in the same figure registry as the
deterministic plots, so they inherit the caption, alt-text, and chart-contract floors
and the manuscript and dashboard parity checks, but they declare evidence_kind captured
and a tracked asset root because a recording is not a function of project data and
cannot be rebuilt from a checkout. They are therefore version-controlled under
manuscript/assets/screenshots, excluded from the deterministic render/registry parity
check, staged into the generated figure directory at build time so the renderer resolves
them, and stamped with a provenance record naming the dashboard address, viewport, live
SkillTree counts, and full-app proof mode of the capture run. Known limitation recorded
rather than papered over: no gate detects a screenshot that has gone stale against a
changed interface, so a capture must be rerun whenever the dashboard display changes.
scholarship_plan:
lanes:
- delivery_and_reporting
existing_source_keys: []
planned_source_targets: []
claim_support_types:
- visual
- delivery
boundaries:
- Captured browser evidence records interface delivery, not learner outcomes or efficacy.
- A recording is not reproducible byte-for-byte and is not presented as a deterministic render.
phase_exit:
- Every captured view is declared, cross-referenced, registered, and dashboard-visible.
- The capture provenance record names the system state the images evidence.
- id: asf-public-release-metadata
title: Publication DOI and repository target decision
status: blocked
scale: external
surface: metadata
owner: manuscript/config.yaml
evidence:
- uv run python scripts/validate_live_counts.py
- uv run python scripts/validate_manuscript_variables.py
- uv run python scripts/z_generate_manuscript_variables.py
- uv run python scripts/validate_rendered_freshness.py
- git ls-remote --heads https://github.com/ActiveInferenceInstitute/Active_Skillference.git
HEAD
notes: The public repository target is owner-confirmed as ActiveInferenceInstitute/Active_Skillference
and is set in manuscript/config.yaml. The owner also confirmed MIT for authored code/content
and generated artifacts, Daniel Ari Friedman as the copyright holder, and the need for a
counsel-review checklist before formal release. The private docxology/Active_Skillference
mirror is current and local offline validators are green. Probed on 2026-08-09, the public
target now exists and is public, but git ls-remote returns zero refs and the GitHub API
reports size 0, so the target is reachable and still unpublished. Existence is not
publication, and no commit, no tag, no archive deposit, and no DOI exist for it yet. This task
stays blocked rather than todo because the remaining step is an owner-executed push, release,
and Zenodo deposit performed outside this repository, not repository work that can be
implemented here. DOI, release-date, and repository-URL fields stay blank rather than
carrying fabricated metadata.
scholarship_plan:
lanes:
- delivery_and_reporting
- applications_and_scope
existing_source_keys:
- smith2016softwarecitation
- citationfileformat2026
- codemeta2026schema
- github2026citingcontent
- zenodo2026github
- wilkinson2016fair
- nosek2015top
planned_source_targets: []
claim_support_types:
- delivery
- scope_limit
- literature
boundaries:
- The empty public repository remains an external blocker, not a failed scholarly claim.
- DOI and repository metadata remain blank until real GitHub and Zenodo events are observed.
phase_exit:
- The public target carries published content and a real release, and the publication environment can complete the actual release path.
- Any release metadata is copied from observed repository and archive records.
- id: asf-planning-surface-reconciliation
title: Reconcile TODO, tasks, and ISA planning surfaces
status: done
surface: roadmap
owner: ISA.md
evidence:
- uv run python scripts/validate_roadmap.py
- uv run python scripts/validate_live_counts.py
- rg -n "^- \\[ \\]|DEFERRED-VERIFY|progress:|updated:" ISA.md TODO.md tasks.yaml
notes: ISA.md now declares tasks.yaml as the canonical forward roadmap and TODO.md as the generated
reader view. The stale 143/145 progress field was replaced with a tasks.yaml-canonical marker,
the update date is 2026-06-18, and the duplicate Forge/GPT-5.4 ISC entries are superseded by
asf-cross-vendor-security-audit rather than remaining as a second open-work queue.
- id: asf-cross-vendor-security-audit
title: Cross-vendor security audit closure for dashboard and local auth
status: done
surface: validation
owner: src/dashboard/server.py
evidence:
- uv run pytest tests/test_dashboard_server.py tests/test_dashboard_console.py
tests/test_skilltree_local_auth.py tests/test_dashboard.py -q
- uv run python scripts/validate_dashboard_console.py --require-browser --require-dashboard
- Forge/GPT-5.4 read-only audit over src/dashboard/server.py, src/skilltree/local_auth.py,
scripts/validate_full_app_stack.py, and related tests
notes: "Closed 2026-06-20 — scope: an independent Forge/GPT-5.4 cross-vendor, read-only (static, no
dynamic/runtime testing) audit at reasoning_effort=high over the
dashboard/local-auth/full-stack source + tests. This closes the specific deferred task (run
the independent cross-vendor pass and fix findings); it is a point-in-time static scan, not a
guarantee of completeness — dependency/supply-chain, secrets-in-git-history, and
dynamic-runtime classes are out of its scope. Within that scope it returned NO unresolved
critical/high issues: both prior fixes are present, correct, and non-vacuously tested — the
DNS-rebind / cross-site token-theft fix (Host-header hostname pinning + Sec-Fetch-Site/Origin
gate, server.py:142-190; the credible cross-site GET vector sends Sec-Fetch-Site:cross-site
and is rejected and tested at test_dashboard_server.py:329-344) and the fail-open
token-exchange fix (empty/typeless/token-less bodies raise; structured-but-secretless JSON is
not laundered, local_auth.py:1009-1050). Path traversal is closed (exact-id allowlist;
'/'+leading-'.' rejection) and CORS is allowlist-gated. The one actionable defense-in-depth
finding was implemented this session: DashboardConfig now fails closed on a non-loopback bind
when local_auth_enabled (src/dashboard/config.py _is_loopback_host) with a firing
negative-control test (tests/test_dashboard.py::test_local_auth_requires_loopback_bind).
Remaining audit notes were low-severity and non-exploitable under the localhost-browser threat
model."
- id: asf-kernel-bound-aif-expansion
title: Kernel-bound numbers for belief propagation, parameter learning, model reduction, and
multi-step planning
status: done
surface: curriculum
owner: src/kernels
evidence:
- uv run pytest tests/test_kernels_examples.py tests/test_kernels_inference.py
tests/test_kernels_active_inference.py -q
- uv run python scripts/run_kernels.py
- uv run python scripts/z_generate_manuscript_variables.py
- Forge/GPT-5.4 read-only math + crippled-comparator audit of the new kernels
notes: "Closed 2026-06-20. Six Active Inference / FEP concepts that the curriculum taught with zero
kernel-bound numbers are now backed by tested kernels emitting provenance claims: exact
sum-product belief propagation on a chain (belief_propagation_chain, cross-checked against
brute-force joint enumeration); Dirichlet-conjugate parameter learning (digamma identity);
Bayesian model reduction (log Bayes factor full vs reduced); the expected-free-energy
ambiguity term; multi-step planning (evaluate_multistep_policies) with an honest measured
look-ahead gain — zero in a decoupled model, positive in a coupled investment model, compared
against the STRONGEST greedy baseline (not a crippled comparator, independently re-verified by
Forge); and continuous predictive coding (linear-Gaussian prediction-error descent converging
to the analytic posterior with balanced precision-weighted errors). Bound into the manuscript
supplement via {{claim:...}} tokens and new claim-bound figures (planning_lookahead,
predictive_coding_descent). The kernel input parameters are also registered as claims so the
model definition cannot silently drift from the manuscript."
- id: asf-predictive-coding-and-learner-facing-binding
title: Continuous predictive-coding kernel and learner-facing binding of kernel claims
status: done
surface: curriculum
owner: src/kernels/predictive_coding.py
evidence:
- uv run pytest tests/test_kernels_predictive_coding.py tests/test_kernels_examples.py
tests/test_figures.py tests/test_claim_support.py -q
- uv run python scripts/run_kernels.py
- uv run python scripts/z_generate_manuscript_variables.py
- Forge/GPT-5.4 read-only math + binding-honesty audit of the predictive-coding kernel and the
new claim bindings
notes: "Closed 2026-06-20. Added the continuous-state predictive-coding kernel (linear-Gaussian
prediction-error descent) the curriculum taught with zero numbers: the latent estimate settles
at the exact analytic precision-weighted posterior (1.333333) where the sensory and prior
prediction errors balance, with the free energy descending monotonically — cross-checked
against the closed-form posterior, not self-consistency. Bound into the manuscript supplement
+ a new claim-bound figure (predictive_coding_descent), raising the live claim and figure
counts. Crucially, the prior round's new kernel numbers were manuscript-only; this round binds
them into the LEARNER-FACING curriculum: the belief-propagation marginals into
mp_belief_propagation and the predictive-coding result into ai_generalized_coordinates, so the
SkillTree export now shows the computed numbers, not just descriptive prose. The hand-typed
kernel input parameters in 05_experimental_setup are now bound via {{claim:param_*}} tokens so
the experimental-setup prose cannot drift from the kernel constants."
- id: asf-integrity-gate-and-floor-hardening
title: Integrity-gate hardening, assessment-floor binding, and figure-layer drift fixes
status: done
surface: validation
owner: scripts/validate_manuscript_variables.py
evidence:
- uv run pytest tests/test_manuscript_variables.py tests/test_claim_support.py
tests/test_figures.py tests/test_release_readiness_inventory.py -q
- uv run python scripts/validate_manuscript_variables.py
- uv run python scripts/run_kernels.py
- Forge/GPT-5.4 read-only vacuity audit of the new and modified gates
notes: "Closed 2026-06-20. Fixed real defects and vacuous gates surfaced by a cross-vendor review:
the hard-coded-count linter glob now covers the lettered subsection files (NNx_*.md) where
result/methodology prose lives, with a firing negative-control test (previously a hand-typed
count in 03a bypassed the gate); the manuscript-wide endorsement-phrase blocklist is now wired
into run_kernels as a fail-closed gate (find_banned_phrases had zero production callers) and
resists whitespace/NBSP/zero-width evasion; the enforced assessment floor
(MIN_ASSESSMENTS_PER_SKILL=4) is now a bound manuscript variable and a dynamically-rendered
figure value, replacing the factually-wrong hand-typed 'three-question floor' across the
manuscript AND five figure strings (Forge caught the figure layer the manuscript fix had
missed); strata_count is exported and bound, removing the 'eight strata' hand-typed
word-numerals; the dashboard fails closed on a non-loopback bind when local auth is enabled;
the typography font-floor gate also scans labelsize=; and the release-readiness blocker-probe
subsystem gained real subprocess coverage (76.8% -> 89%)."
- id: asf-live-full-stack-release-rehearsal
title: Live SkillTree and dashboard full-stack release rehearsal
status: done
surface: skilltree
owner: scripts/validate_full_app_stack.py
metrics:
skills: 630
subjects: 111
prerequisite_edges: 1199
dependencies: 1199
quizzes: 630
assessments: 2520
evidence:
- docker info
- colima start
- uv run python scripts/validate_full_app_stack.py --app-ready --skip-regenerate
- uv run python scripts/validate_full_app_stack.py --skip-regenerate
notes: The 2026-06-19 closeout started Colima, confirmed Docker was reachable, and ran both
full-stack release proofs. App-ready and full-parity modes passed against live SkillTree at
localhost:8080 and the local dashboard at 127.0.0.1:8765 with 630 live skills, 111 subjects,
1199 expected/live/matched dependencies, 630 quizzes, 37 dashboard artifacts present, 19
registered/dashboard figure contracts, 630 course-material records, 2023 external pointers,
clean live-admin checks, and a browser-console gate with only the known upstream Inception
probe allow-listed.
- id: asf-raw-skilltree-form-login-proof
title: Raw SkillTree FORM login proof in the full-stack validator
status: done
surface: skilltree
owner: scripts/validate_skilltree_form_login.py
metrics:
skills: 630
subjects: 111
prerequisite_edges: 1199
dependencies: 1199
quizzes: 630
assessments: 2520
evidence:
- uv run pytest tests/test_skilltree_form_login.py tests/test_full_app_stack.py
- uvx ruff check scripts/validate_skilltree_form_login.py src/integration/full_app_stack.py
tests/test_skilltree_form_login.py tests/test_full_app_stack.py
- uv run python scripts/validate_full_app_stack.py --keep-running
notes: The full-stack proof now distinguishes local trusted-client state readiness
from live browser-login proof. validate_skilltree_form_login.py drives
chrome-devtools-axi through the raw SkillTree FORM login, submits the ignored
local admin credentials server-side, fails unless the authenticated administrator
surface loads, and redacts admin passwords, trusted-client secrets, and bearer
tokens from diagnostics. validate_full_app_stack.py includes this rawSkillTreeLogin
proof whenever browser checks are enabled, before treating the local app as
fully proven.
- id: asf-publication-bundle-render-rehearsal
title: Re-render full publication bundle after roadmap expansion
status: done
surface: manuscript
owner: output
evidence:
- uv run python scripts/z_generate_manuscript_variables.py
- uv run python scripts/validate_rendered_freshness.py
- uv run python /Users/4d/Documents/GitHub/template/scripts/03_render_pdf.py --project
Active_Skillference
- rg -n "open items|roadmap_open_count" output/pdf output/web output/docx output/epub
output/manuscript
notes: Publication freshness now has a fail-closed gate for stale roadmap-open-count prose across
rendered bundle text artifacts. The full bundle must be regenerated from the final
tasks.yaml/TODO state before publication; the validator rejects old metadata-only open-count
text.
- id: asf-release-readiness-inventory-contract
title: Release-readiness inventory contract
status: done
surface: validation
owner: src.release_readiness
metrics:
skills: 630
subjects: 111
prerequisite_edges: 1199
assessments: 2520
figures: 26
evidence:
- uv run pytest tests/test_release_readiness_inventory.py tests/test_docs_inventory.py
tests/test_figures.py tests/test_manuscript_artifacts.py tests/test_roadmap.py -q
- uv run python scripts/validate_release_readiness_inventory.py
- uv run python scripts/validate_roadmap.py
- uv run python scripts/validate_live_counts.py
notes: Release readiness is now a machine-checked inventory surface. src.release_readiness and
scripts/validate_release_readiness_inventory.py validate the dirty tracked-file summary,
untracked-file list, ignored generated-output examples, and required evidence commands, while
--write refreshes docs/release_readiness_inventory.md with current Docker and
public-repository blocker probes.
- id: asf-pasted-review-notation-release-hardening
title: Deep-review notation, route, and release-evidence hardening
status: done
surface: manuscript
owner: manuscript
metrics:
skills: 630
subjects: 111
prerequisite_edges: 1199
assessments: 2520
figures: 26
evidence:
- uv run pytest tests/test_curriculum_catalog.py tests/test_claim_support.py
tests/test_manuscript_artifacts.py tests/test_figures.py
tests/test_release_readiness_inventory.py -q
- uv run python scripts/run_kernels.py
- uv run python scripts/validate_manuscript_artifacts.py
- uv run python scripts/validate_release_readiness_inventory.py
- uv run python scripts/validate_roadmap.py
notes: "The pasted technical review is encoded in source-controlled gates and manuscript prose: VFE
now states the joint-density/posterior identity at first use; EFE states the lower-is-better
softmax convention and policy-precision sign; hardware determinism is narrowed to supported
software-environment reproducibility; the supplemental bridge separates learn routes from quiz
routes; and the reproducibility section records local release evidence through the generated
release-readiness inventory instead of implying a clean public release."
- id: asf-reproducibility-citation-hardening
title: Paper-embedded reproducibility and primary-citation hardening
status: done
surface: manuscript
owner: manuscript
metrics:
skills: 630
subjects: 111
prerequisite_edges: 1199
assessments: 2520
figures: 26
cited_sources: 188
evidence:
- uv run python scripts/validate_claim_support.py
- uv run python scripts/analyze_scholarship.py
- uv run python scripts/validate_scholarship_sources.py
- uv run pytest tests/test_release_readiness_inventory.py tests/test_claim_support.py
tests/test_scholarship.py
notes: The June 2026 rigorous manuscript review is encoded in source-owned prose,
scholarship rows, and validation code. The paper now frames the work as a
systems/curriculum-infrastructure artifact, removes modular scaffold blocks, adds primary
citations for sum-product, Bayesian model reduction, linear filtering, mastery learning, and
PROV constraints, gives supplement parameter tables, separates structural quiz checks from
psychometric validity, and records SHA-256 hashes for generated key artifacts and registered
figures in the release-readiness inventory.
- id: asf-release-branch-hygiene
title: Isolate and commit release-ready project changes
status: done
surface: validation
owner: git worktree
evidence:
- git status --short
- git ls-files -o --exclude-standard
- git diff --check
- git diff --stat
- uv run python scripts/validate_release_readiness_inventory.py
- git rev-parse HEAD
- git ls-remote --heads origin main
- /opt/homebrew/bin/gh-axi repo view docxology/Active_Skillference
- docs/release_readiness_inventory.md
notes: Release-ready project changes were staged, committed, and pushed to the private
docxology/Active_Skillference main branch on 2026-06-19. Remote main was verified at
d03f56c516ab1d813e8bde7185751b760bdbeb9f after the follow-up TODO closeout; the
release-readiness inventory renderer also distinguishes dirty pre-commit evidence from a clean
post-commit checkout so it cannot keep certifying stale modified/untracked file lists after
branch hygiene is complete.
- id: asf-coverage-frontier-hardening
title: Raise coverage and negative controls on integration frontiers
status: done
surface: validation
owner: tests
evidence:
- uv run pytest --cov=src --cov-fail-under=90
- uv run pytest tests/test_course_materials.py tests/test_dependency_reconciler.py
tests/test_full_app_stack.py -q
- uvx ruff check src scripts tests
- uvx ruff format --check src scripts tests
- uv run mypy src
notes: Added targeted negative controls for malformed material records/topic mappings, stale or
invalid dependency progress, extra live dependency parity, unreachable Docker daemon, early
dashboard process exit, and stale rendered publication roadmap prose. The full 90% coverage
gate remains the release authority.
- id: asf-fail-closed-handoff-boundaries
title: Fail-closed artifact, URL, REST, and live-proof handoff boundaries
status: done
scale: minor
surface: validation
owner: src/skilltree/summary.py
metrics:
skills: 630
subjects: 111
prerequisite_edges: 1199
assessments: 2520
claims: 79
figures: 26
cited_sources: 188
max_depth: 75
evidence:
- uv run pytest tests/test_dashboard.py tests/test_skilltree_client.py tests/test_skilltree_model.py
tests/test_course_materials.py tests/test_full_app_stack.py -q
- uvx ruff check src scripts tests
- uvx ruff format --check src scripts tests
- uv run mypy src
- uv run pytest --cov=src --cov-fail-under=90
- uv run python scripts/validate_rendered_freshness.py
- uv run python scripts/validate_roadmap.py
notes: >-
A first-principles and RedTeam review removed several false-certification assumptions at
system handoffs. Exported SkillTree JSON is now structurally validated before dashboard
consumption and before writing the canonical artifact; malformed exports fail closed rather
than appearing available with zero counts. REST base URLs require HTTP(S), path identifiers
are encoded as single URL segments, course-material pointers accept only credential-free
HTTP(S) URLs, browser rendering applies the same safe-link rule, derived alignment summaries
must match their records, live proof summaries cannot override a failed subproof, and local
Postgres password files reject symlinks/non-regular files and normalize owner-only mode.
The validation-surface figure now exposes export-integrity and material-link-safety coverage.
Remaining external deployment, learner-outcome, adaptive-recommendation, and public-release
work stays explicitly open in the following TODO tasks rather than being implied by local
gates.
start: "2026-07-16"
end: "2026-07-16"
progress: 100
milestone: false
deps: []
tags:
- first-principles
- redteam
- fail-closed
- handoff
- id: asf-residue-and-verifier-cleanup
title: Remove stale verifier exemptions and test-scaffolding residue
status: done
scale: minor
surface: validation
owner: src.live_counts
metrics:
skills: 630
subjects: 111
prerequisite_edges: 1199
assessments: 2520
claims: 79
figures: 26
cited_sources: 188
max_depth: 75
evidence:
- uv run pytest tests/test_roadmap.py tests/test_skilltree_exporter.py
tests/test_dependency_reconciler.py tests/test_scripts_smoke.py
tests/test_skilltree_local_auth.py -q
- uvx ruff check src scripts tests
- uvx ruff format --check src scripts tests
- uv run mypy src
- uv run pytest --cov=src --cov-fail-under=90
- uv run python scripts/validate_live_counts.py
- rg -n "\\b(Fake|fake|Stub|stub)\\b" src scripts tests || echo clean
notes: >-
Removed the compatibility-window exemption that allowed stale authored live counts to pass
when nearby prose described an older export. The audit now reports every stale count literal;
its regression test covers historical wording. Removed an unused legacy artifact identity,
renamed test-only graph/client/result fixtures and subprocess probes to precise fixture names,
and updated non-email credential diagnostics and stale terminology. Project policy documents
retain explicit real-data testing rules; no fabricated collaborator remains in executable code.
start: "2026-07-16"
end: "2026-07-16"
progress: 100
milestone: false
deps: []
tags:
- redteam
- verifier
- maintenance
- id: asf-curriculum-expert-content-audit
title: Expert audit of high-depth curriculum paths and quiz quality
status: done
surface: curriculum
owner: src/curriculum/catalog.py
evidence:
- uv run python scripts/build_curriculum.py
- uv run pytest tests/test_curriculum_catalog.py tests/test_curriculum_quality.py -q
- uv run python scripts/export_skilltree.py
- docs/curriculum_expert_audit.md
notes: Recorded a deterministic expert-review sample of the max-depth SkillTree mastery chain,
high-fanout EFE/VFE/Bayes/FEP nodes, and templated visual/publication/security extension
subjects in docs/curriculum_expert_audit.md. No repeated vacuity or template-defect pattern
was found beyond existing DAG, semantic-prerequisite, quiz, material and artifact gates.
- id: asf-learner-outcome-pilot
title: Learner outcome pilot and evidence boundary
status: done
surface: curriculum
owner: experiment_plan.yaml
evidence:
- uv run python scripts/validate_claim_support.py
- uv run python scripts/validate_manuscript_variables.py
- uv run python scripts/build_curriculum.py
notes: experiment_plan.yaml now contains a preregistered design-only learner-outcome pilot with
consent/privacy boundaries, SkillTree-owned progress export, pre/post and delayed-retention
measures, exclusion rules, and analysis plan. Manuscript setup and limitations explicitly
state that no efficacy, retention, or transfer claim is made without real data and
claim-support rows.
- id: asf-docker-digest-lint
title: Docker image digest pinning and supply-chain lint
status: done
surface: validation
owner: docker-compose.yml
evidence:
- uv run python scripts/validate_docker_digests.py
- unset VIRTUAL_ENV && uv run --active pytest tests/test_scripts_smoke.py -q
notes: docker-compose images are pinned by registry-resolved @sha256 digest, not mutable tag, and
validate_docker_digests.py fails the build if any image line lacks a digest so the
supply-chain claim is enforced rather than aspirational.
- id: asf-scholarship-role-quality
title: Lane-token scholarship role-quality gate
status: done
surface: scholarship
owner: src.scholarship
evidence:
- uv run python scripts/validate_scholarship_sources.py
- unset VIRTUAL_ENV && uv run --active pytest tests/test_scholarship.py -q
notes: Scholarship role text must name a lane-relevant content token, not merely clear a word-count
floor, so a generic sentence cannot pass as a claim-specific role.
- id: asf-redteam-gate-hardening
title: RedTeam hardening of vacuous integrity gates
status: done
surface: validation
owner: src.provenance
metrics:
skills: 630
subjects: 111
prerequisite_edges: 1199
assessments: 2520
evidence:
- uv run python scripts/validate_claim_support.py
- uv run python scripts/build_curriculum.py
- uv run pytest tests/test_provenance.py tests/test_claim_support.py tests/test_scholarship.py
tests/test_kernels_information.py -q
notes: "An adversarial gate-vacuity audit (8 read-only specialists, independently refuted findings)
fixed five gates that passed real data but would not fire on an injected same-class defect:
provenance render now fails closed on whitespaced malformed claim tokens; computed claims
require a backing token and have their prose scanned for hand-typed result numbers; the
off-domain distractor gate covers an extended compute/infra/web/finance class (and caught a
real 'browser cache' distractor); the scholarship role gate no longer counts lane-NAME tokens
as content; the manuscript variable validator uses word boundaries. kernels.cross_entropy now
accepts a non-normalized likelihood column. Every fix carries a negative-control test that
fires on injection. A proposed MC-index threshold change was rejected: per-index 50% is the
ideal for 2-of-4 selection; the joint correct-set share (16.8%) is the real gameability
bound."
- id: asf-semantic-prerequisite-gate
title: Semantic prerequisite gate and DAG pedagogical fixes
status: done
surface: curriculum
owner: src.curriculum.quality
metrics:
skills: 630
subjects: 111
prerequisite_edges: 1199
assessments: 2520
evidence:
- uv run python scripts/build_curriculum.py
- uv run pytest tests/test_curriculum_quality.py -q
notes: "A new audit_semantic_prerequisites gate flags any skill assessed on a load-bearing concept
(KL divergence, Markov chain, Laplace approximation, ELBO, Taylor expansion) without the
concept's defining skill in its transitive prerequisites. Scoped to assessment text and to
same-or-earlier-stratum definers so it fires on real inversions, not forward references. It
surfaced three genuine inversions, now fixed: cross-entropy was taught before KL (dependency
direction reversed to entropy->KL->cross-entropy), and the ELBO and continuous-Laplace skills
gained their missing KL and Laplace prerequisites."