Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
30 commits
Select commit Hold shift + click to select a range
db44c74
feat(research): enforce study-only evidence
erinepshovel-code Jul 31, 2026
14ce0d4
feat(research): enforce study-only evidence
erinepshovel-code Jul 31, 2026
a4a03ec
feat(research): enforce study-only evidence
erinepshovel-code Jul 31, 2026
124ff85
feat(research): enforce study-only evidence
erinepshovel-code Jul 31, 2026
48c91fe
feat(research): enforce study-only evidence
erinepshovel-code Jul 31, 2026
5252d44
feat(research): enforce study-only evidence
erinepshovel-code Jul 31, 2026
a60cfff
feat(research): enforce study-only evidence
erinepshovel-code Jul 31, 2026
2f0f2c0
feat(research): enforce study-only evidence
erinepshovel-code Jul 31, 2026
6ba76fd
feat(research): enforce study-only evidence
erinepshovel-code Jul 31, 2026
a5aea65
feat(research): enforce study-only evidence
erinepshovel-code Jul 31, 2026
a1bfa0b
feat(research): enforce study-only evidence
erinepshovel-code Jul 31, 2026
6ae4a52
feat(research): enforce study-only evidence
erinepshovel-code Jul 31, 2026
d18906a
feat(research): enforce study-only evidence
erinepshovel-code Jul 31, 2026
914f954
feat(research): enforce study-only evidence
erinepshovel-code Jul 31, 2026
24c5f81
feat(research): enforce study-only evidence
erinepshovel-code Jul 31, 2026
1650935
feat(research): enforce study-only evidence
erinepshovel-code Jul 31, 2026
46da590
feat(research): enforce study-only evidence
erinepshovel-code Jul 31, 2026
9ec4f2a
feat(research): enforce study-only evidence
erinepshovel-code Jul 31, 2026
83a0ad0
feat(research): enforce study-only evidence
erinepshovel-code Jul 31, 2026
275e0f8
feat(research): enforce study-only evidence
erinepshovel-code Jul 31, 2026
6e71291
feat(research): enforce study-only evidence
erinepshovel-code Jul 31, 2026
27f015e
feat(research): enforce study-only evidence
erinepshovel-code Jul 31, 2026
6599575
feat(research): enforce study-only evidence
erinepshovel-code Jul 31, 2026
deef37c
feat(research): enforce study-only evidence
erinepshovel-code Jul 31, 2026
4ddd675
feat(research): enforce study-only evidence
erinepshovel-code Jul 31, 2026
7d95cc9
feat(research): enforce study-only evidence
erinepshovel-code Jul 31, 2026
9d7c3ca
feat(research): enforce study-only evidence
erinepshovel-code Jul 31, 2026
86a11b6
feat(research): enforce study-only evidence
erinepshovel-code Jul 31, 2026
f2b2c13
feat(research): enforce study-only evidence
erinepshovel-code Jul 31, 2026
9945f1b
feat(research): enforce study-only evidence
erinepshovel-code Jul 31, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,8 @@ Place that file at `.interdependency/project.yml`. Until it exists, the public p
- **canon** — exact or mechanically derived from the canonical source
- **distributed textbook** — exact source material whose status remains local to its owning repository
- **interpretation** — explanatory material subject to review
- **research** — externally sourced support, dissent, or context
- **research** — primary studies or systematic evidence-synthesis studies admitted through explicit screening
- **non-study context** — legislation, treaties, standards, guidelines, frameworks, doctrine, and analysis kept outside Research
- **implemented** — a working public surface exists
- **frontier** — experimental, incomplete, or not externally established
- **hmmm** — an unresolved constraint with enough context for continuation
Expand Down
70 changes: 61 additions & 9 deletions The-Interdependency.github.io_msdmd.ts
Original file line number Diff line number Diff line change
Expand Up @@ -159,6 +159,44 @@ export default defineMsdmdCollection({
"file": "scripts/fetch-textbook.mjs",
"id": "distributed_textbook_fetch"
},
{
"block": "BOUNDARIES",
"fields": {
"admin_only": "false",
"auth_boundary": "optional GitHub read token",
"network_boundary": "external read-only",
"owner": "Erin Spencer",
"pii": "none beyond what submitters publish themselves",
"secrets": "GITHUB_TOKEN is passed only as an HTTPS authorization header and never written",
"side_effects": "generated dataset and snapshot writes",
"storage_boundary": "write beneath src/_data/generated and src/_data/snapshots",
"summary": "Reads only issues labeled related-work and approved from this repository via the allowlisted GitHub API.",
"user_data_boundary": "public issue content only; submitter login retained as provenance"
},
"file": "scripts/fetch-works.mjs",
"id": "related_works_network_boundary"
},
{
"block": "MODULE_BUILD",
"fields": {
"admin_only": "false",
"auth_boundary": "optional read-only GITHUB_TOKEN",
"internal_surface": "issue-form body parsing, per-submission validation with visible exclusions, snapshot fallback",
"module_kind": "instrument",
"module_name": "fetch-works",
"network_boundary": "allowlisted read-only HTTPS to api.github.com",
"owner": "Erin Spencer",
"public_surface": "npm run refresh:works, generated.works",
"rollback": "remove refresh:works and the /works/ route; submissions remain as ordinary GitHub issues",
"rollout": "included in refresh:data before validation and Eleventy generation",
"storage_boundary": "writes generated works data and a last-known-good snapshot",
"summary": "Resolves maintainer-approved related-work submissions from GitHub issues into one provenance-bearing works registry dataset.",
"tests": "tests/works-registry.test.mjs",
"user_data_boundary": "publishes only fields submitters place in a public GitHub issue"
},
"file": "scripts/fetch-works.mjs",
"id": "related_works_registry_fetch"
},
{
"block": "BOUNDARIES",
"fields": {
Expand Down Expand Up @@ -315,7 +353,7 @@ export default defineMsdmdCollection({
"fields": {
"admin_only": "false",
"auth_boundary": "none",
"internal_surface": "canon snapshot digest, heading hierarchy, distributed-textbook provenance, and repository-route assertions",
"internal_surface": "canon snapshot digest, heading hierarchy, distributed-textbook provenance, study-only research admission, and repository-route assertions",
"module_kind": "instrument",
"module_name": "validate-content",
"network_boundary": "none",
Expand All @@ -324,8 +362,8 @@ export default defineMsdmdCollection({
"rollback": "remove the gate only with an explicit replacement preserving provenance, hierarchy, textbook, and route checks",
"rollout": "required by npm run build and npm run check",
"storage_boundary": "read",
"summary": "Refuses deployment when canon identity, heading hierarchy, textbook coverage, snapshot integrity, generated route coverage, or recovery artifacts drift.",
"tests": "tests/canon-parser.test.mjs, tests/canon-integrity.test.mjs, tests/textbook-integrity.test.mjs, tests/repo-coverage.test.mjs, tests/site-contract.test.mjs",
"summary": "Refuses deployment when canon identity, heading hierarchy, textbook coverage, study-only research admission, snapshot integrity, generated route coverage, or recovery artifacts drift.",
"tests": "tests/canon-parser.test.mjs, tests/canon-integrity.test.mjs, tests/textbook-integrity.test.mjs, tests/repo-coverage.test.mjs, tests/research-ledger.test.mjs, tests/site-contract.test.mjs",
"user_data_boundary": "none"
},
"file": "scripts/validate-content.mjs",
Expand Down Expand Up @@ -456,7 +494,7 @@ export default defineMsdmdCollection({
"secrets": "none",
"side_effects": "none",
"storage_boundary": "read beneath src/_data/research only",
"summary": "Reads allowlisted repository-local YAML ledgers during static-site generation and returns parsed arrays.",
"summary": "Reads allowlisted repository-local YAML ledgers, rejects incomplete classifications, and returns study-only public arrays.",
"user_data_boundary": "none"
},
"file": "src/_data/research_data.js",
Expand All @@ -467,16 +505,16 @@ export default defineMsdmdCollection({
"fields": {
"admin_only": "false",
"auth_boundary": "none",
"internal_surface": "validateLedgerPaths, readYamlList, readYamlLedgers",
"internal_surface": "validateLedgerPaths, readYamlList, readYamlLedgers, indexUnique",
"module_kind": "adapter",
"module_name": "research_data",
"network_boundary": "none",
"owner": "Erin Spencer",
"public_surface": "research_data.sources, research_data.claims",
"rollback": "restore direct two-file reads and remove the manifest-declared tranche files",
"public_surface": "research_data.sources, research_data.claims, research_data.gaps, research_data.stats",
"rollback": "revert this adapter and the admission-ledger manifest entries together",
"rollout": "loaded automatically by Eleventy from src/_data/research_data.js",
"storage_boundary": "read the repository-owned research manifest and its declared YAML ledgers",
"summary": "Loads manifest-declared reviewed research source and claim ledgers into one explicit Eleventy global-data object.",
"storage_boundary": "read the repository-owned candidate, admission, claim-review, and gap ledgers",
"summary": "Admits only research studies from manifest-declared candidate ledgers and exposes their bounded claims, reviews, and evidence gaps.",
"tests": "tests/research-ledger.test.mjs, tests/generated-site.test.mjs",
"user_data_boundary": "none"
},
Expand Down Expand Up @@ -558,6 +596,13 @@ export default defineMsdmdCollection({
"source_id": "public_site_verification_boundary",
"to": "Erin Spencer"
},
{
"from": "related_works_network_boundary",
"kind": "owns",
"source_block": "BOUNDARIES",
"source_id": "related_works_network_boundary",
"to": "Erin Spencer"
},
{
"from": "static_textbook_math_rendering_boundary",
"kind": "owns",
Expand Down Expand Up @@ -635,6 +680,13 @@ export default defineMsdmdCollection({
"source_id": "public_build_identity",
"to": "Erin Spencer"
},
{
"from": "related_works_registry_fetch",
"kind": "owns",
"source_block": "MODULE_BUILD",
"source_id": "related_works_registry_fetch",
"to": "Erin Spencer"
},
{
"from": "static_textbook_math_renderer",
"kind": "owns",
Expand Down
2 changes: 1 addition & 1 deletion docs/content-model.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ Rights and Definitions of The Way
## Other records

- Project records: public GitHub facts plus visible `hmmm` when editorial metadata is missing.
- Lab records: generated per canon unit, with reviewed research gaps explicitly shown.
- Lab records: generated per canon unit, with study-only research contact and screened `hmmm` gaps explicitly shown. Non-study context never counts toward Research coverage.

## Usage guidance

Expand Down
60 changes: 51 additions & 9 deletions docs/research-method.md
Original file line number Diff line number Diff line change
@@ -1,18 +1,60 @@
# Research method

Sources and claims are stored in `src/_data/research`. Stance classification is editorial review, not automated metadata inference. Missing support or dissent must render as a documented `hmmm` gap.
|∆|Only primary research studies and systematic evidence-synthesis studies count as Research.|∆| Legislation is not science. Treaties, standards, guidelines, frameworks, doctrine, legal analysis, policy reports, editorials, narrative reviews, protocols without results, and AI summaries may be preserved as non-study context, but they never count toward Research coverage or stance.

## Article Lab contact structure
The historical source and claim YAML files in `src/_data/research` are candidate-intake ledgers. `source-admissions-*.yml` classifies every candidate. The Eleventy adapter fails closed: only `admit-study` records with `record_class: research_study` and claims whose every source is admitted reach `research_data.sources` or `research_data.claims`.

The eight Rights Article Labs use `src/_data/article_lab.json`. Every record must include:
## Admission

- a reductio ad absurdum test in both directions plus a bounded reading;
- at least four worst practices and four best practices;
- applications for medical, construction, engineering, agriculture, jurisprudence, transportation and distribution, child craft, information systems, emergency response, hospitality and sanitation, and community governance;
- at least one reviewed claim linked to a source with an explicit evidence boundary.
A primary study must state a research question or objective, reproducible methods, analysis, results, and limitations. Eligible designs include experiments and trials, observational studies, qualitative and mixed-methods research, quasi-experiments, natural experiments, replications, and formal or simulation studies that are labeled non-empirical.

A systematic synthesis must declare its search, selection, and synthesis or mapping method. Systematic reviews, scoping reviews, evidence maps, and meta-analyses can qualify. A narrative review does not qualify merely because it cites studies or is peer reviewed.

Institutional authority, prestige, peer review, and citation counts are not record classes. Unclear records remain excluded with `hmmm` until full text establishes a qualifying method and result.

## Claim contract

Every published study-linked claim records:

- the exact canonical unit;
- stance: `support`, `dissent`, `mixed`, or `limit`;
- a bounded study result;
- the separate Article relation;
- the inference gap;
- source IDs that all resolve to admitted studies;
- an exact full-text locator or an explicit provisional `hmmm`;
- verification status and review date.

`verified-full-text` is allowed only when the locator names a page, table, figure, appendix, or Results section. Abstract-only, indirect, or locator-free claims stay `provisional-full-text-locator-needed`. One study is provisional contact; a broad conclusion needs a systematic synthesis or convergent independent studies.

## Search and appraisal

Search in both supporting and challenging directions. Record databases, queries, dates, eligibility rules, screening decisions, and Article-level gaps. Do not manufacture support/dissent symmetry: “no qualifying study found” is a valid result.

Use design-appropriate risk-of-bias reasoning rather than one universal score. Record population or corpus, place, time, method, outcomes, effect or result, uncertainty, limitations, funding, conflicts, preregistration, data and code availability, and correction or retraction status when available. Check corrections and retractions on admission and during scheduled review.

## Usage guidance

Add or revise operational applications in `article_lab.json`. Add research evidence separately in `sources.yml` and `claims.yml`; do not place an uncited empirical claim inside an application paragraph. Run `npm test`, `npm run build`, `npm run test:generated`, and `npm run test:browser` before publication.
1. Add a candidate source to a manifest-declared `sources*.yml` file.
2. Add exactly one decision to `source-admissions-*.yml`.
3. Add or revise the smallest bounded claim in `claims*.yml`.
4. For an admissible claim, add its result, Article relation, inference gap, locator, status, and review date to `claim-reviews-*.yml`.
5. Update the relevant record in `evidence-gaps-*.yml`.
6. Run:

```sh
npm run check
npm run test:browser
```

The public method page shows the live admission totals, provisional locator count, and all Article-level `hmmm` gaps.

## Provenance and authority

Research never changes canon. The controlling text remains `wayseer00/main:canon/INTERDEPENDENT_WAY.txt`; generated research and interpretation are subordinate contact layers.

This migration followed `The-Interdependency/skill-lib` at commit `289d4959f7920efc214f180cca3443d8090f4095`, using the `the-interdependency`, `canon`, and `skill-usage` procedures. Repo-local skill copies are not treated as canonical.

## hmmm

An application is a bounded hypothesis about how an Article might constrain practice in a domain. It does not supersede domain standards, professional duties, law, safety rules, or the canonical text. Reductio sections deliberately test destructive overextension and destructive absolute rejection; neither is presented as the endorsed reading.
The 2026-07-31 migration is a strict screen of the existing candidate ledger, not a comprehensive systematic review. Exact full-text locators, duplicate independent screening, design-specific risk-of-bias appraisals, funding and conflict extraction, and scheduled correction/retraction checks remain incomplete and must not be inferred.
19 changes: 13 additions & 6 deletions scripts/validate-content.mjs
Original file line number Diff line number Diff line change
@@ -1,25 +1,26 @@
import { createHash } from 'node:crypto';
import { access, readFile } from 'node:fs/promises';
import loadResearchData from '../src/_data/research_data.js';

// === MODULE_BUILD ===
// id: generated_content_gate
// module_name: validate-content
// module_kind: instrument
// summary: Refuses deployment when canon identity, heading hierarchy, textbook coverage, snapshot integrity, generated route coverage, or recovery artifacts drift.
// summary: Refuses deployment when canon identity, heading hierarchy, textbook coverage, study-only research admission, snapshot integrity, generated route coverage, or recovery artifacts drift.
// owner: Erin Spencer
// public_surface: npm run validate
// internal_surface: canon snapshot digest, heading hierarchy, distributed-textbook provenance, and repository-route assertions
// internal_surface: canon snapshot digest, heading hierarchy, distributed-textbook provenance, study-only research admission, and repository-route assertions
// auth_boundary: none
// storage_boundary: read
// network_boundary: none
// user_data_boundary: none
// admin_only: false
// tests: tests/canon-parser.test.mjs, tests/canon-integrity.test.mjs, tests/textbook-integrity.test.mjs, tests/repo-coverage.test.mjs, tests/site-contract.test.mjs
// tests: tests/canon-parser.test.mjs, tests/canon-integrity.test.mjs, tests/textbook-integrity.test.mjs, tests/repo-coverage.test.mjs, tests/research-ledger.test.mjs, tests/site-contract.test.mjs
// rollout: required by npm run build and npm run check
// rollback: remove the gate only with an explicit replacement preserving provenance, hierarchy, textbook, and route checks
// === END MODULE_BUILD ===
// Usage: run `npm run validate`; it refreshes data first and exits nonzero on any integrity mismatch.
// Limits: validates repository artifacts, not GitHub Pages settings or public DNS.
// Usage: run `npm run validate`; it refreshes data first and exits nonzero on any integrity mismatch, including an unclassified or non-study Research source.
// Limits: validates repository artifacts and study admission structure, not each study's substantive result, GitHub Pages settings, or public DNS.

// === BOUNDARIES ===
// id: generated_content_validation_boundary
Expand All @@ -39,6 +40,7 @@ const canon = JSON.parse(await readFile('src/_data/generated/canon.json', 'utf8'
const repos = JSON.parse(await readFile('src/_data/generated/repos.json', 'utf8'));
const textbook = JSON.parse(await readFile('src/_data/generated/textbook.json', 'utf8'));
const textbookSources = JSON.parse(await readFile('src/_data/textbook_sources.json', 'utf8'));
const research = await loadResearchData();
const snapshotRaw = await readFile('src/_data/snapshots/canon.last-known-good.md', 'utf8');
const snapshotText = snapshotRaw.replace(/^---\n[\s\S]*?\n---\n/, '');
const snapshotHash = createHash('sha256').update(snapshotText).digest('hex');
Expand Down Expand Up @@ -90,6 +92,11 @@ if (process.env.OFFLINE !== '1') {

if (repos.publicRepoCount !== repos.generatedRouteCount) throw new Error('repo route mismatch');
if (new Set(repos.repositories.map(repo => repo.slug)).size !== repos.repositories.length) throw new Error('duplicate project slug');
if (!research.sources.length || research.sources.some(source => source.record_class !== 'research_study')) throw new Error('public Research contains a non-study source or no admitted studies');
if (!research.claims.length || research.claims.some(claim => claim.source_ids.some(sourceId => !research.sources.some(source => source.id === sourceId)))) {
throw new Error('public Research claim cites a non-study or unknown source');
}
if (research.gaps.length !== 8 || research.gaps.some(gap => !gap.hmmm)) throw new Error('each Rights Article needs one explicit study-coverage hmmm');
await access('fallback/index.html');
await access('artifacts/four-cuts-1.html');
console.log(`validated ${canon.units.length} canon units, ${canon.notes.length} notes, ${textbook.chapterCount} textbook chapters, canonical hierarchy, and ${repos.publicRepoCount} repositories`);
console.log(`validated ${canon.units.length} canon units, ${canon.notes.length} notes, ${textbook.chapterCount} textbook chapters, ${research.stats.admittedStudyCount} admitted studies, ${research.stats.publishedStudyClaimCount} study-only claims, canonical hierarchy, and ${repos.publicRepoCount} repositories`);
Loading
Loading