diff --git a/README.md b/README.md index d03dcc3..fed1722 100644 --- a/README.md +++ b/README.md @@ -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 diff --git a/The-Interdependency.github.io_msdmd.ts b/The-Interdependency.github.io_msdmd.ts index 9077003..584c30d 100644 --- a/The-Interdependency.github.io_msdmd.ts +++ b/The-Interdependency.github.io_msdmd.ts @@ -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": { @@ -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", @@ -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", @@ -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", @@ -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" }, @@ -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", @@ -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", diff --git a/docs/content-model.md b/docs/content-model.md index 8b22bc2..ab2a7bd 100644 --- a/docs/content-model.md +++ b/docs/content-model.md @@ -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 diff --git a/docs/research-method.md b/docs/research-method.md index 80d3aa4..508ee2e 100644 --- a/docs/research-method.md +++ b/docs/research-method.md @@ -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. diff --git a/scripts/validate-content.mjs b/scripts/validate-content.mjs index bcd85fe..19786bb 100644 --- a/scripts/validate-content.mjs +++ b/scripts/validate-content.mjs @@ -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 @@ -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'); @@ -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`); diff --git a/src/_data/research/claim-reviews-2026-07-31.yml b/src/_data/research/claim-reviews-2026-07-31.yml new file mode 100644 index 0000000..ce3fc0d --- /dev/null +++ b/src/_data/research/claim-reviews-2026-07-31.yml @@ -0,0 +1,143 @@ +- id: article-one-work-requirements-access + verification_status: provisional-full-text-locator-needed + locator: "hmmm — exact full-text result locator has not yet been recorded." + study_result: "A quasi-experimental cohort study associated reinstated SNAP work requirements with reduced program participation among vulnerable beneficiaries without evidence of transition off the broader safety net." + article_relation: "Challenges readings of contribution requirements that treat loss of food assistance as evidence of unwillingness or as a harmless enforcement device." + inference_gap: "One state policy and enrollment outcome cannot determine moral contribution, long-term employment, or allocation during acute scarcity." + reviewed_on: "2026-07-31" + +- id: article-one-sanctioned-contribution-norms + verification_status: provisional-full-text-locator-needed + locator: "hmmm — exact full-text result locator has not yet been recorded." + study_result: "Public-goods experiments found that participants paid to sanction free riders and that sanction availability increased cooperation." + article_relation: "Supports the narrower proposition that contribution-enforcement behavior can sustain cooperation." + inference_gap: "Laboratory monetary sanctions do not test withholding food, shelter, care, or safety and cannot license a specific real-world sanction." + reviewed_on: "2026-07-31" + +- id: article-one-exclusion-clause-harms + verification_status: provisional-full-text-locator-needed + locator: "hmmm — exact full-text result locator has not yet been recorded." + study_result: "A scoping review found benefit sanctions associated with hardship, adverse health and child outcomes, and movement into lower-quality, less stable work." + article_relation: "Challenges any presumption that withdrawing material support is a neutral or reliably beneficial response to noncontribution." + inference_gap: "State welfare regimes differ from the Article's community-scale clause, so the contact is analogical and bounded." + reviewed_on: "2026-07-31" + +- id: article-one-assistance-modality + verification_status: provisional-full-text-locator-needed + locator: "hmmm — exact full-text result locator has not yet been recorded." + study_result: "A systematic review found no universally superior emergency-assistance modality; cash, vouchers, and in-kind food varied with setting and outcome." + article_relation: "Limits any one-size-fits-all interpretation of how a survival floor must be delivered." + inference_gap: "Sparse, generally low-quality evidence through 2014 does not determine contribution rules or justified exclusion." + reviewed_on: "2026-07-31" + +- id: article-two-will-under-scarcity + verification_status: provisional-full-text-locator-needed + locator: "hmmm — exact full-text result locator has not yet been recorded." + study_result: "Laboratory and field experiments reported reduced cognitive performance when poverty-related financial concerns were salient." + article_relation: "Challenges readings that infer unconstrained will or character directly from refusal, compliance, or impaired performance under scarcity." + inference_gap: "The study did not measure consent directly; applying the result to voluntariness is an inference." + reviewed_on: "2026-07-31" + +- id: article-two-trauma-evidence-limit + verification_status: provisional-full-text-locator-needed + locator: "hmmm — exact full-text result locator has not yet been recorded." + study_result: "An AHRQ systematic review found insufficient comparative evidence for clear conclusions about trauma-informed-care outcomes." + article_relation: "Limits confident claims that trauma-informed labels establish intervention effectiveness." + inference_gap: "Insufficient evidence is not evidence of no effect, and results cannot resolve every duty in the Article." + reviewed_on: "2026-07-31" + +- id: article-two-autonomy-meta-analysis + verification_status: provisional-full-text-locator-needed + locator: "hmmm — exact full-text result locator has not yet been recorded." + study_result: "A meta-analysis linked autonomy support, need satisfaction, and autonomous motivation with sustained health behavior and beneficial health outcomes." + article_relation: "Supports an autonomy-preserving interpretation of necessary health and survival work." + inference_gap: "Heterogeneous health settings do not validate every duty in Article Two or make coercion autonomy-supportive." + reviewed_on: "2026-07-31" + +- id: article-two-care-duty-burden + verification_status: provisional-full-text-locator-needed + locator: "hmmm — exact full-text result locator has not yet been recorded." + study_result: "A systematic review and meta-analysis of observational studies found greater anxiety and depression among unpaid caregivers than noncaregivers in included settings." + article_relation: "Challenges allocation of necessary care as though caregivers have unlimited time, health, or support." + inference_gap: "Observational, geographically sparse evidence cannot show care is intrinsically harmful or prescribe one allocation system." + reviewed_on: "2026-07-31" + +- id: article-three-forgiving-reciprocity + verification_status: provisional-full-text-locator-needed + locator: "hmmm — exact full-text model/result locator has not yet been recorded." + study_result: "A mathematical and simulation study found that crosstalk across concurrent repeated games can spread defection and require stronger forgiveness for cooperation." + article_relation: "Limits strict act-for-act reciprocity by identifying an error-propagation mechanism and a formal corrective." + inference_gap: "A stylized non-empirical model does not establish real-world consent to retaliation or require anyone to remain exposed to abuse." + reviewed_on: "2026-07-31" + +- id: article-four-teach-back-comprehension + verification_status: provisional-full-text-locator-needed + locator: "hmmm — exact full-text result locator has not yet been recorded." + study_result: "A systematic review found teach-back can improve health knowledge, recall, self-management, and some outcomes across heterogeneous studies." + article_relation: "Supports teaching consequential instructions in usable language and checking comprehension." + inference_gap: "Health-education evidence does not prove generalization to all law or make enforcement legitimate by itself." + reviewed_on: "2026-07-31" + +- id: article-four-teaching-law-works + verification_status: provisional-full-text-locator-needed + locator: "hmmm — exact full-text result locator has not yet been recorded." + study_result: "A systematic evidence map found legal-literacy and community-paralegal studies most commonly reported improved knowledge and agency." + article_relation: "Supports testing the Article's duty-to-teach component through legal-empowerment interventions." + inference_gap: "The map did not establish a pooled causal effect or validate one teaching method, and the underlying evidence was uneven." + reviewed_on: "2026-07-31" + +- id: article-four-plain-language-boundary + verification_status: provisional-full-text-locator-needed + locator: "hmmm — exact full-text result locator has not yet been recorded." + study_result: "A controlled experiment found plain-language legal contracts improved nonexpert comprehension while substantial misunderstanding remained." + article_relation: "Supports simplification and instruction while limiting the claim that publication or plain wording guarantees knowledge." + inference_gap: "Contract comprehension in one experimental setting cannot establish comprehension of all laws or populations." + reviewed_on: "2026-07-31" + +- id: article-five-maturity-gap + verification_status: provisional-full-text-locator-needed + locator: "hmmm — exact full-text result locator has not yet been recorded." + study_result: "A multinational cross-sectional study found cognitive capacity reached adult levels earlier than psychosocial maturity." + article_relation: "Challenges a competence-only replacement for age thresholds by distinguishing demonstrated cognitive performance from impulse control and peer resistance." + inference_gap: "Cross-sectional measures do not evaluate the Article's portfolio process or determine a universal adulthood rule." + reviewed_on: "2026-07-31" + +- id: article-six-nonviolent-power + verification_status: provisional-full-text-locator-needed + locator: "hmmm — exact full-text result locator has not yet been recorded." + study_result: "A comparative campaign study reported greater success for nonviolent than violent campaigns in its dataset and analyzed participation and loyalty-shift mechanisms." + article_relation: "Challenges reduction of collective political power to violence alone." + inference_gap: "Historical observational comparison is not a complete theory of authority and does not show violence is never decisive." + reviewed_on: "2026-07-31" + +- id: article-six-collective-intelligence-dispute + verification_status: provisional-full-text-locator-needed + locator: "hmmm — exact full-text result locators for both studies have not yet been recorded." + study_result: "Small-group experiments found a collective-performance factor, while later replication and model tests disputed which member and interaction variables explained it." + article_relation: "Shows that group performance can be studied while leaving the Article's proposed circle size and authority mechanism unvalidated." + inference_gap: "Small selected groups and tasks cannot validate twelve-person circles, singular emergency leadership, or authority derived from violence." + reviewed_on: "2026-07-31" + +- id: article-seven-graded-categories + verification_status: provisional-full-text-locator-needed + locator: "hmmm — exact full-text result locator has not yet been recorded." + study_result: "Experiments found graded typicality effects within several ordinary semantic categories." + article_relation: "Challenges the assumption that every conversational category naturally has one sharp boundary fixed before use." + inference_gap: "Ordinary semantic-category experiments do not govern legal drafting or technical interfaces." + reviewed_on: "2026-07-31" + +- id: article-seven-standard-terminology-outcomes + verification_status: provisional-full-text-locator-needed + locator: "hmmm — exact full-text result locator has not yet been recorded." + study_result: "A systematic review and meta-analysis found possible documentation, coordination, knowledge, and outcome benefits from standardized nursing terminologies, with very low-to-low certainty." + article_relation: "Supports studying shared terminology while limiting claims that imposed definitions are neutral or sufficient." + inference_gap: "Terminology was often embedded in larger interventions, most evidence was observational, and ordinary conversation was not studied." + reviewed_on: "2026-07-31" + +- id: article-eight-decision-aids + verification_status: provisional-full-text-locator-needed + locator: "hmmm — exact full-text result locator has not yet been recorded." + study_result: "A Cochrane review of randomized trials found decision aids improved knowledge, risk perception, active participation, and informed values-congruent choices without increasing regret." + article_relation: "Supports consent practices that communicate options, benefits, harms, probabilities, and personal values." + inference_gap: "Health-treatment and screening decisions do not establish a universal consent standard or settle every conflict among autonomy, harm, and public duty." + reviewed_on: "2026-07-31" diff --git a/src/_data/research/claims-2026-07-23.yml b/src/_data/research/claims-2026-07-23.yml index 1043bda..9a0f3d5 100644 --- a/src/_data/research/claims-2026-07-23.yml +++ b/src/_data/research/claims-2026-07-23.yml @@ -28,12 +28,11 @@ - id: article-three-forgiving-reciprocity article: rights-and-definitions-of-the-way.article-three stance: mixed - status: theory-evidence-synthesis - claim: "Repeated interaction can sustain cooperative reciprocity, but strict act-for-act retaliation is error-sensitive; concurrent social crosstalk can spread defection and require bounded forgiveness or other error-correcting strategies." + status: formal-simulation-study + claim: "In a concurrent repeated-game model, social crosstalk can spread defection, make strict act-for-act retaliation brittle, and require stronger bounded forgiveness to preserve cooperation." source_ids: - - rossetti-hilbe-2024-direct-reciprocity - reiter-et-al-2018-reciprocity-crosstalk - limitation: "The evidence comes mainly from stylized games, mathematical models, and simulations; it neither establishes consent to retaliation nor instructs anyone to forgive or remain exposed to abuse." + limitation: "This is a mathematical and simulation study of stylized repeated games, not an empirical field study; it neither establishes consent to retaliation nor instructs anyone to forgive or remain exposed to abuse." - id: article-four-plain-language-boundary article: rights-and-definitions-of-the-way.article-four diff --git a/src/_data/research/evidence-gaps-2026-07-31.yml b/src/_data/research/evidence-gaps-2026-07-31.yml new file mode 100644 index 0000000..4ebc2b4 --- /dev/null +++ b/src/_data/research/evidence-gaps-2026-07-31.yml @@ -0,0 +1,71 @@ +- id: article-one-study-gap + article: rights-and-definitions-of-the-way.article-one + search_status: candidate-ledger-screened-both-directions + support_status: qualifying-study-found + dissent_status: qualifying-study-found + mixed_or_limit_status: qualifying-study-found + hmmm: "The current candidate ledger contains study contact in both directions; a comprehensive database search, independent duplicate screening, full-text locators, and design-specific risk-of-bias appraisals remain incomplete." + reviewed_on: "2026-07-31" + +- id: article-two-study-gap + article: rights-and-definitions-of-the-way.article-two + search_status: candidate-ledger-screened-both-directions + support_status: qualifying-study-found + dissent_status: qualifying-study-found + mixed_or_limit_status: qualifying-study-found + hmmm: "The current candidate ledger contains study contact in both directions; a comprehensive database search, independent duplicate screening, full-text locators, and design-specific risk-of-bias appraisals remain incomplete." + reviewed_on: "2026-07-31" + +- id: article-three-study-gap + article: rights-and-definitions-of-the-way.article-three + search_status: candidate-ledger-screened-both-directions + support_status: no-qualifying-study-found + dissent_status: no-qualifying-study-found + mixed_or_limit_status: qualifying-study-found + hmmm: "Only a non-empirical formal/simulation study currently qualifies. No qualifying support or dissent study is in the screened candidate ledger; a broader systematic search and empirical field evidence are needed." + reviewed_on: "2026-07-31" + +- id: article-four-study-gap + article: rights-and-definitions-of-the-way.article-four + search_status: candidate-ledger-screened-both-directions + support_status: qualifying-study-found + dissent_status: no-qualifying-study-found + mixed_or_limit_status: qualifying-study-found + hmmm: "No qualifying dissent study is in the screened candidate ledger. A broader search should test failure modes of legal education, teach-back, plain-language drafting, and comprehension-dependent enforcement." + reviewed_on: "2026-07-31" + +- id: article-five-study-gap + article: rights-and-definitions-of-the-way.article-five + search_status: candidate-ledger-screened-both-directions + support_status: no-qualifying-study-found + dissent_status: qualifying-study-found + mixed_or_limit_status: no-qualifying-study-found + hmmm: "No qualifying support study is in the screened candidate ledger. Studies directly evaluating competence portfolios, supported decision-making, task specificity, and age-based alternatives are needed." + reviewed_on: "2026-07-31" + +- id: article-six-study-gap + article: rights-and-definitions-of-the-way.article-six + search_status: candidate-ledger-screened-both-directions + support_status: no-qualifying-study-found + dissent_status: qualifying-study-found + mixed_or_limit_status: qualifying-study-found + hmmm: "No qualifying support study is in the screened candidate ledger. Direct evidence on bounded emergency authority, leader selection, group size, accountability, transfer, and demobilization is needed." + reviewed_on: "2026-07-31" + +- id: article-seven-study-gap + article: rights-and-definitions-of-the-way.article-seven + search_status: candidate-ledger-screened-both-directions + support_status: no-qualifying-study-found + dissent_status: qualifying-study-found + mixed_or_limit_status: qualifying-study-found + hmmm: "No qualifying support study is in the screened candidate ledger. Research should compare negotiated, imposed, and standardized definitions across ordinary, technical, legal, and cross-cultural settings." + reviewed_on: "2026-07-31" + +- id: article-eight-study-gap + article: rights-and-definitions-of-the-way.article-eight + search_status: candidate-ledger-screened-both-directions + support_status: qualifying-study-found + dissent_status: no-qualifying-study-found + mixed_or_limit_status: no-qualifying-study-found + hmmm: "No qualifying dissent or limit study is in the screened candidate ledger. Research is needed on consent failure, collective harms, vulnerability, coercion, and competing definitions of harm." + reviewed_on: "2026-07-31" diff --git a/src/_data/research/ledger-manifest.json b/src/_data/research/ledger-manifest.json index a2bfd1f..b9245eb 100644 --- a/src/_data/research/ledger-manifest.json +++ b/src/_data/research/ledger-manifest.json @@ -6,5 +6,14 @@ "claims": [ "src/_data/research/claims.yml", "src/_data/research/claims-2026-07-23.yml" + ], + "source_admissions": [ + "src/_data/research/source-admissions-2026-07-31.yml" + ], + "claim_reviews": [ + "src/_data/research/claim-reviews-2026-07-31.yml" + ], + "gaps": [ + "src/_data/research/evidence-gaps-2026-07-31.yml" ] } diff --git a/src/_data/research/source-admissions-2026-07-31.yml b/src/_data/research/source-admissions-2026-07-31.yml new file mode 100644 index 0000000..8620485 --- /dev/null +++ b/src/_data/research/source-admissions-2026-07-31.yml @@ -0,0 +1,366 @@ +- id: patrick-williams-2012-sdt-health + decision: exclude-non-study + record_class: nonstudy_context + exclusion_reason: "Narrative review without a declared systematic search, selection, and synthesis method." + screened_on: "2026-07-31" + +- id: who-2018-sanitation-health + decision: exclude-non-study + record_class: nonstudy_context + exclusion_reason: "Practice guideline; evidence-informed guidance is not itself a research study." + screened_on: "2026-07-31" + +- id: mani-et-al-2013-poverty-cognition + decision: admit-study + record_class: research_study + study_design: "Laboratory and field experiments" + evidence_mode: empirical + screening_status: provisional-study-admission + appraisal_status: hmmm-full-text-locator-pending + risk_of_bias_status: hmmm-design-specific-appraisal-pending + funding_conflicts_status: hmmm-extraction-pending + correction_retraction_status: hmmm-integrity-check-pending + admission_basis: "Reports methods, analyses, and results from empirical experiments." + screened_on: "2026-07-31" + +- id: ahrq-2025-trauma-informed-care + decision: admit-study + record_class: research_study + study_design: "Systematic review" + evidence_mode: systematic_synthesis + screening_status: provisional-study-admission + appraisal_status: hmmm-full-text-locator-pending + risk_of_bias_status: hmmm-design-specific-appraisal-pending + funding_conflicts_status: hmmm-extraction-pending + correction_retraction_status: hmmm-integrity-check-pending + admission_basis: "Declares a systematic evidence-synthesis method and reports results and limitations." + screened_on: "2026-07-31" + +- id: gundersen-ziliak-2015-food-insecurity + decision: exclude-non-study + record_class: nonstudy_context + exclusion_reason: "Narrative review without a declared systematic search, selection, and synthesis method." + screened_on: "2026-07-31" + +- id: andersson-pearson-1999-incivility + decision: exclude-non-study + record_class: nonstudy_context + exclusion_reason: "Theoretical article; it proposes a model but does not report a study." + screened_on: "2026-07-31" + +- id: ahrq-2023-teamstepps + decision: exclude-non-study + record_class: nonstudy_context + exclusion_reason: "Implementation curriculum and framework; it is not itself a research study." + screened_on: "2026-07-31" + +- id: nagin-telep-2017-procedural-justice + decision: exclude-non-study + record_class: nonstudy_context + exclusion_reason: "Narrative review without a declared systematic search, selection, and synthesis method." + screened_on: "2026-07-31" + +- id: who-2001-icf + decision: exclude-non-study + record_class: nonstudy_context + exclusion_reason: "International classification and framework; a standard is not a research study." + screened_on: "2026-07-31" + +- id: who-2022-uhc-competency + decision: exclude-non-study + record_class: nonstudy_context + exclusion_reason: "Competency framework; a framework is not a research study." + screened_on: "2026-07-31" + +- id: fema-2017-nims + decision: exclude-non-study + record_class: nonstudy_context + exclusion_reason: "Operational doctrine and framework; it is not a research study." + screened_on: "2026-07-31" + +- id: ietf-1997-rfc2119 + decision: exclude-non-study + record_class: nonstudy_context + exclusion_reason: "Technical standard; a standard is not a research study." + screened_on: "2026-07-31" + +- id: ietf-2017-rfc8174 + decision: exclude-non-study + record_class: nonstudy_context + exclusion_reason: "Technical standard clarification; a standard is not a research study." + screened_on: "2026-07-31" + +- id: hhs-1979-belmont-report + decision: exclude-non-study + record_class: nonstudy_context + exclusion_reason: "Ethics declaration and guidance; normative doctrine is not a research study." + screened_on: "2026-07-31" + +- id: ndumele-et-al-2025-snap-work-requirements + decision: admit-study + record_class: research_study + study_design: "Quasi-experimental cohort study" + evidence_mode: empirical + screening_status: provisional-study-admission + appraisal_status: hmmm-full-text-locator-pending + risk_of_bias_status: hmmm-design-specific-appraisal-pending + funding_conflicts_status: hmmm-extraction-pending + correction_retraction_status: hmmm-integrity-check-pending + admission_basis: "Reports an empirical design, analysis, results, and limitations." + screened_on: "2026-07-31" + +- id: talevski-et-al-2020-teach-back + decision: admit-study + record_class: research_study + study_design: "Systematic review" + evidence_mode: systematic_synthesis + screening_status: provisional-study-admission + appraisal_status: hmmm-full-text-locator-pending + risk_of_bias_status: hmmm-design-specific-appraisal-pending + funding_conflicts_status: hmmm-extraction-pending + correction_retraction_status: hmmm-integrity-check-pending + admission_basis: "Declares systematic search and selection methods and synthesizes study results." + screened_on: "2026-07-31" + +- id: webb-2020-legislative-complexity + decision: exclude-non-study + record_class: nonstudy_context + exclusion_reason: "Legal analysis; peer review does not convert legal reasoning into a research study." + screened_on: "2026-07-31" + +- id: un-crpd-2014-legal-capacity + decision: exclude-non-study + record_class: nonstudy_context + exclusion_reason: "Treaty-body interpretation; legislation and legal doctrine are not science." + screened_on: "2026-07-31" + +- id: stephan-chenoweth-2008-civil-resistance + decision: admit-study + record_class: research_study + study_design: "Comparative observational study" + evidence_mode: empirical + screening_status: provisional-study-admission + appraisal_status: hmmm-full-text-locator-pending + risk_of_bias_status: hmmm-design-specific-appraisal-pending + funding_conflicts_status: hmmm-extraction-pending + correction_retraction_status: hmmm-integrity-check-pending + admission_basis: "Reports a defined campaign dataset, comparative analysis, results, and limitations." + screened_on: "2026-07-31" + +- id: rosch-1975-semantic-categories + decision: admit-study + record_class: research_study + study_design: "Experimental study" + evidence_mode: empirical + screening_status: provisional-study-admission + appraisal_status: hmmm-full-text-locator-pending + risk_of_bias_status: hmmm-design-specific-appraisal-pending + funding_conflicts_status: hmmm-extraction-pending + correction_retraction_status: hmmm-integrity-check-pending + admission_basis: "Reports empirical experiments, analyses, and results." + screened_on: "2026-07-31" + +- id: solove-2013-consent-dilemma + decision: exclude-non-study + record_class: nonstudy_context + exclusion_reason: "Legal analysis drawing on research; an analysis of studies is not itself a study." + screened_on: "2026-07-31" + +- id: fehr-gachter-2000-cooperation-punishment + decision: admit-study + record_class: research_study + study_design: "Public-goods laboratory experiments" + evidence_mode: empirical + screening_status: provisional-study-admission + appraisal_status: hmmm-full-text-locator-pending + risk_of_bias_status: hmmm-design-specific-appraisal-pending + funding_conflicts_status: hmmm-extraction-pending + correction_retraction_status: hmmm-integrity-check-pending + admission_basis: "Reports experimental methods, analyses, results, and limitations." + screened_on: "2026-07-31" + +- id: pattaro-et-al-2022-benefit-sanctions + decision: admit-study + record_class: research_study + study_design: "Scoping review of quantitative studies" + evidence_mode: systematic_synthesis + screening_status: provisional-study-admission + appraisal_status: hmmm-full-text-locator-pending + risk_of_bias_status: hmmm-design-specific-appraisal-pending + funding_conflicts_status: hmmm-extraction-pending + correction_retraction_status: hmmm-integrity-check-pending + admission_basis: "Declares search and selection methods and maps quantitative study results." + screened_on: "2026-07-31" + +- id: goodwin-maru-2017-legal-empowerment + decision: admit-study + record_class: research_study + study_design: "Systematic evidence map" + evidence_mode: systematic_synthesis + screening_status: provisional-study-admission + appraisal_status: hmmm-full-text-locator-pending + risk_of_bias_status: hmmm-design-specific-appraisal-pending + funding_conflicts_status: hmmm-extraction-pending + correction_retraction_status: hmmm-integrity-check-pending + admission_basis: "Reports a declared evidence-mapping search, selection, and synthesis process." + screened_on: "2026-07-31" + +- id: who-2002-world-report-violence + decision: exclude-non-study + record_class: nonstudy_context + exclusion_reason: "Global public-health report; the report is not one reproducible research study or systematic synthesis." + screened_on: "2026-07-31" + +- id: icenogle-et-al-2019-maturity-gap + decision: admit-study + record_class: research_study + study_design: "Multinational cross-sectional study" + evidence_mode: empirical + screening_status: provisional-study-admission + appraisal_status: hmmm-full-text-locator-pending + risk_of_bias_status: hmmm-design-specific-appraisal-pending + funding_conflicts_status: hmmm-extraction-pending + correction_retraction_status: hmmm-integrity-check-pending + admission_basis: "Reports a defined sample, empirical measures, analysis, results, and limitations." + screened_on: "2026-07-31" + +- id: sunstein-2002-group-polarization + decision: exclude-non-study + record_class: nonstudy_context + exclusion_reason: "Theoretical synthesis; it is not itself a research study or systematic review." + screened_on: "2026-07-31" + +- id: harcourt-1999-collapse-harm-principle + decision: exclude-non-study + record_class: nonstudy_context + exclusion_reason: "Law-review argument; legal theory is not a research study." + screened_on: "2026-07-31" + +- id: doocy-tappis-2017-humanitarian-cash + decision: admit-study + record_class: research_study + study_design: "Systematic review" + evidence_mode: systematic_synthesis + screening_status: provisional-study-admission + appraisal_status: hmmm-full-text-locator-pending + risk_of_bias_status: hmmm-design-specific-appraisal-pending + funding_conflicts_status: hmmm-extraction-pending + correction_retraction_status: hmmm-integrity-check-pending + admission_basis: "Declares systematic search, selection, appraisal, synthesis, results, and limitations." + screened_on: "2026-07-31" + +- id: ng-et-al-2012-sdt-meta-analysis + decision: admit-study + record_class: research_study + study_design: "Systematic review and meta-analysis" + evidence_mode: systematic_synthesis + screening_status: provisional-study-admission + appraisal_status: hmmm-full-text-locator-pending + risk_of_bias_status: hmmm-design-specific-appraisal-pending + funding_conflicts_status: hmmm-extraction-pending + correction_retraction_status: hmmm-integrity-check-pending + admission_basis: "Reports systematic synthesis and meta-analytic methods and results." + screened_on: "2026-07-31" + +- id: magana-et-al-2020-unpaid-caregivers-lmic + decision: admit-study + record_class: research_study + study_design: "Systematic review and meta-analysis of observational studies" + evidence_mode: systematic_synthesis + screening_status: provisional-study-admission + appraisal_status: hmmm-full-text-locator-pending + risk_of_bias_status: hmmm-design-specific-appraisal-pending + funding_conflicts_status: hmmm-extraction-pending + correction_retraction_status: hmmm-integrity-check-pending + admission_basis: "Declares systematic search, selection, synthesis, results, and limitations." + screened_on: "2026-07-31" + +- id: rossetti-hilbe-2024-direct-reciprocity + decision: exclude-non-study + record_class: nonstudy_context + exclusion_reason: "Narrative theory-and-evidence review without a declared systematic synthesis method." + screened_on: "2026-07-31" + +- id: reiter-et-al-2018-reciprocity-crosstalk + decision: admit-study + record_class: research_study + study_design: "Mathematical model and simulation study" + evidence_mode: formal_simulation + screening_status: provisional-study-admission + appraisal_status: hmmm-full-text-locator-pending + risk_of_bias_status: hmmm-design-specific-appraisal-pending + funding_conflicts_status: hmmm-extraction-pending + correction_retraction_status: hmmm-integrity-check-pending + admission_basis: "Reports a formal research question, model, simulation analysis, results, and limitations; explicitly non-empirical." + screened_on: "2026-07-31" + +- id: masson-waldron-1994-legal-contract-comprehension + decision: admit-study + record_class: research_study + study_design: "Controlled comprehension experiment" + evidence_mode: empirical + screening_status: provisional-study-admission + appraisal_status: hmmm-full-text-locator-pending + risk_of_bias_status: hmmm-design-specific-appraisal-pending + funding_conflicts_status: hmmm-extraction-pending + correction_retraction_status: hmmm-integrity-check-pending + admission_basis: "Reports experimental methods, analysis, results, and limitations." + screened_on: "2026-07-31" + +- id: zietlow-et-al-2022-guardianship-capacity + decision: exclude-non-study + record_class: nonstudy_context + exclusion_reason: "Medicolegal narrative review; clinical and legal guidance is not itself a research study." + screened_on: "2026-07-31" + +- id: woolley-et-al-2010-collective-intelligence + decision: admit-study + record_class: research_study + study_design: "Small-group experiments" + evidence_mode: empirical + screening_status: provisional-study-admission + appraisal_status: hmmm-full-text-locator-pending + risk_of_bias_status: hmmm-design-specific-appraisal-pending + funding_conflicts_status: hmmm-extraction-pending + correction_retraction_status: hmmm-integrity-check-pending + admission_basis: "Reports empirical group experiments, analyses, results, and limitations." + screened_on: "2026-07-31" + +- id: bates-gupta-2017-group-intelligence + decision: admit-study + record_class: research_study + study_design: "Replication and latent-variable model tests" + evidence_mode: empirical + screening_status: provisional-study-admission + appraisal_status: hmmm-full-text-locator-pending + risk_of_bias_status: hmmm-design-specific-appraisal-pending + funding_conflicts_status: hmmm-extraction-pending + correction_retraction_status: hmmm-integrity-check-pending + admission_basis: "Reports empirical replication studies, analyses, results, and limitations." + screened_on: "2026-07-31" + +- id: bertocchi-et-al-2023-standardized-terminologies + decision: admit-study + record_class: research_study + study_design: "Systematic review and meta-analysis" + evidence_mode: systematic_synthesis + screening_status: provisional-study-admission + appraisal_status: hmmm-full-text-locator-pending + risk_of_bias_status: hmmm-design-specific-appraisal-pending + funding_conflicts_status: hmmm-extraction-pending + correction_retraction_status: hmmm-integrity-check-pending + admission_basis: "Declares systematic search, selection, synthesis, certainty assessment, results, and limitations." + screened_on: "2026-07-31" + +- id: stacey-et-al-2024-decision-aids + decision: admit-study + record_class: research_study + study_design: "Cochrane systematic review of randomized controlled trials" + evidence_mode: systematic_synthesis + screening_status: provisional-study-admission + appraisal_status: hmmm-full-text-locator-pending + risk_of_bias_status: hmmm-design-specific-appraisal-pending + funding_conflicts_status: hmmm-extraction-pending + correction_retraction_status: hmmm-integrity-check-pending + admission_basis: "Declares systematic methods, risk-of-bias assessment, synthesis, results, and limitations." + screened_on: "2026-07-31" diff --git a/src/_data/research_data.js b/src/_data/research_data.js index ce2c5d0..383912f 100644 --- a/src/_data/research_data.js +++ b/src/_data/research_data.js @@ -5,25 +5,25 @@ import yaml from 'js-yaml'; // id: article_lab_research_data_adapter // module_name: research_data // module_kind: adapter -// summary: Loads manifest-declared reviewed research source and claim ledgers into one explicit Eleventy global-data object. +// summary: Admits only research studies from manifest-declared candidate ledgers and exposes their bounded claims, reviews, and evidence gaps. // owner: Erin Spencer -// public_surface: research_data.sources, research_data.claims -// internal_surface: validateLedgerPaths, readYamlList, readYamlLedgers +// public_surface: research_data.sources, research_data.claims, research_data.gaps, research_data.stats +// internal_surface: validateLedgerPaths, readYamlList, readYamlLedgers, indexUnique // auth_boundary: none -// storage_boundary: read the repository-owned research manifest and its declared YAML ledgers +// storage_boundary: read the repository-owned candidate, admission, claim-review, and gap ledgers // network_boundary: none // user_data_boundary: none // admin_only: false // tests: tests/research-ledger.test.mjs, tests/generated-site.test.mjs // rollout: loaded automatically by Eleventy from src/_data/research_data.js -// rollback: restore direct two-file reads and remove the manifest-declared tranche files +// rollback: revert this adapter and the admission-ledger manifest entries together // === END MODULE_BUILD === -// Usage: add a repository-local YAML ledger path to ledger-manifest.json, then reference `research_data.sources` and `research_data.claims` in Nunjucks templates. -// Limits: this adapter exposes reviewed ledger content only; it does not infer stance, truth, source relevance, or evidentiary weight. +// Usage: add candidate sources and claims to their ledgers, classify every source in source-admissions, review every publishable claim in claim-reviews, and record Article-level search gaps before running `npm test`. +// Limits: admission establishes record class, not truth. A provisional claim remains provisional until its full-text result locator and appraisal are recorded. // === BOUNDARIES === // id: article_lab_research_data_storage_boundary -// 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. // auth_boundary: none // storage_boundary: read beneath src/_data/research only // network_boundary: none @@ -61,14 +61,104 @@ async function readYamlLedgers(paths, kind) { return ledgers.flat(); } +function indexUnique(records, kind) { + const index = new Map(); + for (const record of records) { + if (!record?.id || typeof record.id !== 'string') throw new TypeError(`${kind} record is missing a string id`); + if (index.has(record.id)) throw new TypeError(`duplicate ${kind} id: ${record.id}`); + index.set(record.id, record); + } + return index; +} + export default async function researchData() { const manifest = JSON.parse(await readFile(manifestPath, 'utf8')); if (!manifest || typeof manifest !== 'object' || Array.isArray(manifest)) throw new TypeError(`${manifestPath} must contain a JSON object`); - const [sources, claims] = await Promise.all([ + const [candidateSources, candidateClaims, sourceAdmissions, claimReviews, gaps] = await Promise.all([ readYamlLedgers(manifest.sources, 'source'), - readYamlLedgers(manifest.claims, 'claim') + readYamlLedgers(manifest.claims, 'claim'), + readYamlLedgers(manifest.source_admissions, 'source admission'), + readYamlLedgers(manifest.claim_reviews, 'claim review'), + readYamlLedgers(manifest.gaps, 'evidence gap') ]); - return { sources, claims }; + const sourceIndex = indexUnique(candidateSources, 'candidate source'); + const claimIndex = indexUnique(candidateClaims, 'candidate claim'); + const admissionIndex = indexUnique(sourceAdmissions, 'source admission'); + const reviewIndex = indexUnique(claimReviews, 'claim review'); + + for (const sourceId of sourceIndex.keys()) { + if (!admissionIndex.has(sourceId)) throw new TypeError(`candidate source is missing an admission decision: ${sourceId}`); + } + for (const sourceId of admissionIndex.keys()) { + if (!sourceIndex.has(sourceId)) throw new TypeError(`source admission has no candidate source: ${sourceId}`); + } + + const admittedSourceIds = new Set(); + const sources = []; + for (const source of candidateSources) { + const admission = admissionIndex.get(source.id); + if (admission.decision === 'admit-study') { + if (admission.record_class !== 'research_study') throw new TypeError(`admitted source must be a research_study: ${source.id}`); + if ( + !admission.study_design + || !admission.evidence_mode + || !admission.screening_status + || !admission.appraisal_status + || !admission.risk_of_bias_status + || !admission.funding_conflicts_status + || !admission.correction_retraction_status + ) { + throw new TypeError(`admitted source is missing study admission metadata: ${source.id}`); + } + admittedSourceIds.add(source.id); + sources.push({ ...source, ...admission }); + } else if (admission.decision === 'exclude-non-study') { + if (admission.record_class !== 'nonstudy_context' || !admission.exclusion_reason) { + throw new TypeError(`excluded source is missing its non-study reason: ${source.id}`); + } + } else { + throw new TypeError(`unknown source admission decision for ${source.id}: ${String(admission.decision)}`); + } + } + + for (const claim of candidateClaims) { + if (!Array.isArray(claim.source_ids) || claim.source_ids.length === 0) throw new TypeError(`claim is missing source_ids: ${claim.id}`); + for (const sourceId of claim.source_ids) { + if (!sourceIndex.has(sourceId)) throw new TypeError(`claim ${claim.id} references unknown source ${sourceId}`); + } + } + + const admissibleClaims = candidateClaims.filter(claim => claim.source_ids.every(sourceId => admittedSourceIds.has(sourceId))); + const admissibleClaimIds = new Set(admissibleClaims.map(claim => claim.id)); + for (const claim of admissibleClaims) { + if (!reviewIndex.has(claim.id)) throw new TypeError(`study-only claim is missing a claim review: ${claim.id}`); + } + for (const claimId of reviewIndex.keys()) { + if (!claimIndex.has(claimId)) throw new TypeError(`claim review has no candidate claim: ${claimId}`); + if (!admissibleClaimIds.has(claimId)) throw new TypeError(`claim review cites a claim with a non-study source: ${claimId}`); + } + + const claims = admissibleClaims.map(claim => ({ ...claim, ...reviewIndex.get(claim.id) })); + const gapIds = new Set(); + for (const gap of gaps) { + if (!gap?.article || gapIds.has(gap.article)) throw new TypeError(`evidence gap records must have unique article ids: ${String(gap?.article)}`); + gapIds.add(gap.article); + } + + return { + sources, + claims, + gaps, + stats: { + screenedSourceCount: candidateSources.length, + admittedStudyCount: sources.length, + excludedNonstudyCount: candidateSources.length - sources.length, + candidateClaimCount: candidateClaims.length, + publishedStudyClaimCount: claims.length, + excludedContextClaimCount: candidateClaims.length - claims.length, + verifiedClaimCount: claims.filter(claim => claim.verification_status === 'verified-full-text').length + } + }; } diff --git a/src/_includes/partials/research-attachment.njk b/src/_includes/partials/research-attachment.njk index 72497fe..584b75c 100644 --- a/src/_includes/partials/research-attachment.njk +++ b/src/_includes/partials/research-attachment.njk @@ -1,8 +1,10 @@ {% set claims = research_data.claims | where("article", researchArticleId) %} +{% set gapMatches = research_data.gaps | where("article", researchArticleId) %} +{% set gap = gapMatches[0] %}
-

Reviewed research attachment

-

Support, dissent, and limits

-

These records attach sources to bounded claims. They support, challenge, or limit the public reading without converting interpretation into canon.

+

Study-only research attachment

+

Study results, Article contact, and limits

+

|∆| Only admitted research studies appear here. Legislation, treaties, standards, guidelines, frameworks, doctrine, legal analysis, and narrative reviews do not count as Research. |∆|

{% if claims.length %}
{% for claim in claims %} @@ -10,13 +12,16 @@ {% if claim.stance == "dissent" %}{% set stanceClass = "status-risk" %}{% endif %} {% if claim.stance == "limit" or claim.stance == "mixed" %}{% set stanceClass = "status-frontier" %}{% endif %}
- {{ claim.stance }} · {{ claim.status }} + {{ claim.stance }} · {{ claim.verification_status }}

{{ claim.claim }}

-

Evidence boundary: {{ claim.limitation }}

+

Study result: {{ claim.study_result }}

+

Article contact: {{ claim.article_relation }}

+

Inference boundary: {{ claim.inference_gap }}

+

Citation locator: {{ claim.locator }}

Sources:
    {% for sourceId in claim.source_ids %} {% for source in research_data.sources %} - {% if source.id == sourceId %}
  • {{ source.title }}
    {{ source.type }} · reviewed {{ source.reviewed_on }}
    {{ source.boundary }}
  • {% endif %} + {% if source.id == sourceId %}
  • {{ source.title }}
    {{ source.study_design }} · {{ source.evidence_mode }} · screened {{ source.screened_on }}
    {{ source.boundary }}
    Risk of bias: {{ source.risk_of_bias_status }} · funding/conflicts: {{ source.funding_conflicts_status }} · corrections/retractions: {{ source.correction_retraction_status }}
  • {% endif %} {% endfor %} {% endfor %}
@@ -24,6 +29,13 @@ {% endfor %}
{% else %} -

No reviewed claim is attached to this article yet.

+

No qualifying research-study claim is attached to this article yet.

+ {% endif %} + {% if gap %} + {% endif %}
diff --git a/src/articles/article-eight.njk b/src/articles/article-eight.njk index ba7cbb0..ae999d7 100644 --- a/src/articles/article-eight.njk +++ b/src/articles/article-eight.njk @@ -1,14 +1,14 @@ --- layout: layouts/base.njk title: "Article Eight: Rights with living limits" -description: A public-facing Article Eight vertical slice with exact canon excerpt, companion reading, note conversation, application, handbook seed, short script, and reviewed research. +description: A public-facing Article Eight vertical slice with exact canon excerpt, companion reading, note conversation, application, handbook seed, short script, and study-only research. permalink: /articles/article-eight/ ---

Vertical slice · canon-safe draft

Article Eight: Rights with living limits

-
canon excerptcompanion readingreviewed research
+
canon excerptcompanion readingstudy-only research

Article Eight gathers the rights logic: non-harm, preservation of life, resistance to coercion, informed consent, and protection of tools needed to live or practice art.

diff --git a/src/articles/article-five.njk b/src/articles/article-five.njk index 580ce1b..668e938 100644 --- a/src/articles/article-five.njk +++ b/src/articles/article-five.njk @@ -1,14 +1,14 @@ --- layout: layouts/base.njk title: "Article Five: Adulthood as demonstrated competence" -description: A public-facing Article Five vertical slice with exact canon excerpt, companion reading, note conversation, application, handbook seed, short script, and reviewed research. +description: A public-facing Article Five vertical slice with exact canon excerpt, companion reading, note conversation, application, handbook seed, short script, and study-only research. permalink: /articles/article-five/ ---

Vertical slice · canon-safe draft

Article Five: Adulthood as demonstrated competence

-
canon excerptcompanion readingreviewed research
+
canon excerptcompanion readingstudy-only research

Article Five separates biological age from public competence. Adulthood becomes something demonstrated, not merely asserted.

diff --git a/src/articles/article-four.njk b/src/articles/article-four.njk index a68c59c..6778740 100644 --- a/src/articles/article-four.njk +++ b/src/articles/article-four.njk @@ -1,14 +1,14 @@ --- layout: layouts/base.njk title: "Article Four: Law as teachable duty" -description: A public-facing Article Four vertical slice with exact canon excerpt, companion reading, note conversation, application, handbook seed, short script, and reviewed research. +description: A public-facing Article Four vertical slice with exact canon excerpt, companion reading, note conversation, application, handbook seed, short script, and study-only research. permalink: /articles/article-four/ ---

Vertical slice · canon-safe draft

Article Four: Law as teachable duty

-
canon excerptcompanion readingreviewed research
+
canon excerptcompanion readingstudy-only research

Article Four treats law as something that must be made knowable. If people are bound by a rule, someone has a duty to teach it.

diff --git a/src/articles/article-one.njk b/src/articles/article-one.njk index 4311ee6..da6eefa 100644 --- a/src/articles/article-one.njk +++ b/src/articles/article-one.njk @@ -1,14 +1,14 @@ --- layout: layouts/base.njk title: "Article One: Contribution without contempt" -description: A public-facing Article One vertical slice with exact canon excerpt, companion reading, note conversation, application, handbook seed, short script, and reviewed research. +description: A public-facing Article One vertical slice with exact canon excerpt, companion reading, note conversation, application, handbook seed, short script, and study-only research. permalink: /articles/article-one/ ---

Vertical slice · canon-safe draft

Article One: Contribution without contempt

-
canon excerptcompanion readingreviewed research
+
canon excerptcompanion readingstudy-only research

Article One tests how public obligation can feed everyone without turning need into contempt or turning contribution into a weapon.

diff --git a/src/articles/article-seven.njk b/src/articles/article-seven.njk index 78ce450..9c0a2fd 100644 --- a/src/articles/article-seven.njk +++ b/src/articles/article-seven.njk @@ -1,14 +1,14 @@ --- layout: layouts/base.njk title: "Article Seven: Definitions before governance" -description: A public-facing Article Seven vertical slice with exact canon excerpt, companion reading, note conversation, application, handbook seed, short script, and reviewed research. +description: A public-facing Article Seven vertical slice with exact canon excerpt, companion reading, note conversation, application, handbook seed, short script, and study-only research. permalink: /articles/article-seven/ ---

Vertical slice · canon-safe draft

Article Seven: Definitions before governance

-
canon excerptcompanion readingreviewed research
+
canon excerptcompanion readingstudy-only research

Article Seven makes shared definition the threshold for consent. If people do not know what terms mean, they cannot honestly agree, disagree, or decide.

diff --git a/src/articles/article-six.njk b/src/articles/article-six.njk index dd0a732..389981c 100644 --- a/src/articles/article-six.njk +++ b/src/articles/article-six.njk @@ -1,14 +1,14 @@ --- layout: layouts/base.njk title: "Article Six: Authority as burden" -description: A public-facing Article Six vertical slice with exact canon excerpt, companion reading, note conversation, application, handbook seed, short script, and reviewed research. +description: A public-facing Article Six vertical slice with exact canon excerpt, companion reading, note conversation, application, handbook seed, short script, and study-only research. permalink: /articles/article-six/ ---

Vertical slice · canon-safe draft

Article Six: Authority as burden

-
canon excerptcompanion readingreviewed research
+
canon excerptcompanion readingstudy-only research

Article Six faces the hard edge of authority: public power is tied to consequence, and consequence must be burdened, witnessed, limited, and accountable.

diff --git a/src/articles/article-three.njk b/src/articles/article-three.njk index 13adc26..5838d08 100644 --- a/src/articles/article-three.njk +++ b/src/articles/article-three.njk @@ -1,14 +1,14 @@ --- layout: layouts/base.njk title: "Article Three: Speech as demonstrated consent" -description: A public-facing Article Three vertical slice with exact canon excerpt, companion reading, note conversation, application, handbook seed, short script, and reviewed research. +description: A public-facing Article Three vertical slice with exact canon excerpt, companion reading, note conversation, application, handbook seed, short script, and study-only research. permalink: /articles/article-three/ ---

Vertical slice · canon-safe draft

Article Three: Speech as demonstrated consent

-
canon excerptcompanion readingreviewed research
+
canon excerptcompanion readingstudy-only research

Article Three treats communication style as evidence: how a person speaks and acts shapes what kind of response they have demonstrated willingness to receive.

diff --git a/src/articles/article-two.njk b/src/articles/article-two.njk index 64dcf3e..87c88e2 100644 --- a/src/articles/article-two.njk +++ b/src/articles/article-two.njk @@ -1,7 +1,7 @@ --- layout: layouts/base.njk title: "Article Two: Freedom without abandonment" -description: A public-facing Article Two vertical slice with exact canon excerpt, companion reading, note conversation, application, handbook seed, short script, and reviewed research. +description: A public-facing Article Two vertical slice with exact canon excerpt, companion reading, note conversation, application, handbook seed, short script, and study-only research. permalink: /articles/article-two/ --- @@ -11,7 +11,7 @@ permalink: /articles/article-two/
canon excerpt companion reading - reviewed research + study-only research

This page tests the public method: one canon unit becomes an orientation, a note conversation, a concrete application, a handbook seed, a short script, and an evidence field without pretending the interpretation is the source.

diff --git a/src/articles/index.njk b/src/articles/index.njk index 328361f..800f0d3 100644 --- a/src/articles/index.njk +++ b/src/articles/index.njk @@ -22,5 +22,5 @@ permalink: /articles/

hmmm

-

All eight Rights and Definitions articles now have public vertical-slice drafts. The next pass is research attachment, tone review, and linking each static article to its generated canon unit once the deployed parser route slugs are confirmed.

+

All eight Rights and Definitions articles now have public vertical-slice drafts with study-only research attachments and explicit hmmm gaps. The next pass is full-text result locators, design-specific appraisal, tone review, and linking each static article to its generated canon unit once the deployed parser route slugs are confirmed.

diff --git a/src/home/index.njk b/src/home/index.njk index d1ac95f..1b40b49 100644 --- a/src/home/index.njk +++ b/src/home/index.njk @@ -22,7 +22,7 @@ permalink: /home/

Eight rights-article laboratories

From canon excerpt to public practice

-

All eight Rights articles now have a canon-bounded path through exact excerpt, note conversation, reductio ad absurdum, worst and best practices, applications across eleven domains, and an initial reviewed research field.

+

All eight Rights articles now have a canon-bounded path through exact excerpt, note conversation, reductio ad absurdum, worst and best practices, applications across eleven domains, and a study-only research field with explicit coverage gaps.

@@ -30,4 +30,4 @@ permalink: /home/

{{ generated.repos.publicRepoCount }} public repositories · {{ generated.canon.units.length }} canonical units · {{ generated.textbook.chapterCount }} textbook chapters

Project data was generated {{ generated.repos.snapshotAt | dateOnly }}{% if generated.repos.fallback %} from the last verified snapshot{% endif %}. Canon digest {{ generated.canon.source.contentSha256 }}. Textbook complete: {{ generated.textbook.complete }}.

-

hmmm

The textbook now has a complete public reading spine, while each chapter remains independently revisable in its source repository. The Article Lab research remains deliberately open to stronger dissent, replication, field studies, disability-led critique, and non-Western evidence.

+

hmmm

The textbook now has a complete public reading spine, while each chapter remains independently revisable in its source repository. The Article Lab now excludes legislation, standards, guidelines, frameworks, and other non-study records from Research. Its retained study claims still need full-text locators, design-specific appraisal, stronger dissent, replication, field studies, disability-led critique, and non-Western evidence.

diff --git a/src/lab/index.njk b/src/lab/index.njk index 9ac3f5e..3919dfa 100644 --- a/src/lab/index.njk +++ b/src/lab/index.njk @@ -6,7 +6,7 @@ description: A structured conversation between canonical body text, notes, resea

Interpretation with visible seams

Article Lab

-

Each Rights article is tested from several directions: the body text and notes remain distinct speakers; reductio ad absurdum exposes destructive overextensions; worst and best practices translate the tension into operations; domain applications test whether the reading survives contact with different kinds of work; reviewed research remains visibly bounded.

+

Each Rights article is tested from several directions: the body text and notes remain distinct speakers; reductio ad absurdum exposes destructive overextensions; worst and best practices translate the tension into operations; domain applications test whether the reading survives contact with different kinds of work; study-only research remains visibly bounded.

Rights Article laboratories

@@ -18,7 +18,7 @@ description: A structured conversation between canonical body text, notes, resea Lab

{{ record.public_title }}

-

{{ unit.notes.length }} separately parsed note{% if unit.notes.length != 1 %}s{% endif %} · {{ claims.length }} reviewed claim{% if claims.length != 1 %}s{% endif %} · {{ record.applications | length }} application domains

+

{{ unit.notes.length }} separately parsed note{% if unit.notes.length != 1 %}s{% endif %} · {{ claims.length }} study-linked claim{% if claims.length != 1 %}s{% endif %} · {{ record.applications | length }} application domains

{% endif %} {% endfor %} @@ -27,6 +27,6 @@ description: A structured conversation between canonical body text, notes, resea

Method boundary

-

Applications are operational hypotheses, not claims that one rule transfers unchanged across domains. Research sources support, dissent from, or limit a particular component; they do not prove an Article as a whole. Other canonical units retain generated Lab routes, but this index begins with the eight Rights articles as the first complete comparative set.

+

Applications are operational hypotheses, not claims that one rule transfers unchanged across domains. Only admitted research studies can support, dissent from, or limit a particular component in the Research field; they do not prove an Article as a whole. Legislation, treaties, standards, guidelines, frameworks, and other non-study context do not count. Other canonical units retain generated Lab routes, but this index begins with the eight Rights articles as the first comparative set.

-

Research coverage

The initial pack establishes reviewed contact for all eight Rights articles. It is not exhaustive: each claim remains open to stronger replication, domain-specific evidence, direct dissent, and evidence from outside United States and institutional settings.

+

Research coverage

The existing candidate ledger has been screened into {{ research_data.stats.admittedStudyCount }} admitted studies and {{ research_data.stats.excludedNonstudyCount }} excluded non-study records. Study contact exists for all eight Rights articles, but support and dissent are not forced into false symmetry; see each Article's explicit hmmm gap.

diff --git a/src/lab/unit.njk b/src/lab/unit.njk index c84137c..880225f 100644 --- a/src/lab/unit.njk +++ b/src/lab/unit.njk @@ -10,6 +10,8 @@ title: "Lab: {{ unit.title }}" {% set labMatches = article_lab | where("unit_id", unit.id) %} {% set lab = labMatches[0] %} {% set claims = research_data.claims | where("article", unit.id) %} +{% set gapMatches = research_data.gaps | where("article", unit.id) %} +{% set gap = gapMatches[0] %}

Interpretive laboratory

@@ -54,8 +56,9 @@ title: "Lab: {{ unit.title }}"
-

Reviewed contact

+

Study-only contact

Research field

+

|∆| Research means an admitted primary study or systematic evidence-synthesis study. Legislation and other non-study context never count toward this field. |∆|

{% if claims.length %}
{% for claim in claims %} @@ -63,13 +66,16 @@ title: "Lab: {{ unit.title }}" {% if claim.stance == "dissent" %}{% set stanceClass = "status-risk" %}{% endif %} {% if claim.stance == "limit" or claim.stance == "mixed" %}{% set stanceClass = "status-frontier" %}{% endif %}
- {{ claim.stance }} · {{ claim.status }} + {{ claim.stance }} · {{ claim.verification_status }}

{{ claim.claim }}

-

Evidence boundary: {{ claim.limitation }}

+

Study result: {{ claim.study_result }}

+

Article contact: {{ claim.article_relation }}

+

Inference boundary: {{ claim.inference_gap }}

+

Citation locator: {{ claim.locator }}

Sources:
    {% for sourceId in claim.source_ids %} {% for source in research_data.sources %} - {% if source.id == sourceId %}
  • {{ source.title }}
    {{ source.type }} · reviewed {{ source.reviewed_on }}
  • {% endif %} + {% if source.id == sourceId %}
  • {{ source.title }}
    {{ source.study_design }} · {{ source.evidence_mode }} · screened {{ source.screened_on }}
    Risk of bias: {{ source.risk_of_bias_status }} · funding/conflicts: {{ source.funding_conflicts_status }} · corrections/retractions: {{ source.correction_retraction_status }}
  • {% endif %} {% endfor %} {% endfor %}
@@ -77,7 +83,14 @@ title: "Lab: {{ unit.title }}" {% endfor %}
{% else %} -

No reviewed claim is attached to this unit yet.

+

No qualifying research-study claim is attached to this unit yet.

+ {% endif %} + {% if gap %} + {% endif %}
{% else %} diff --git a/src/research/method.njk b/src/research/method.njk index a6dafc0..988c684 100644 --- a/src/research/method.njk +++ b/src/research/method.njk @@ -1,45 +1,73 @@ --- layout: layouts/base.njk title: Research method -description: How The Interdependent Way site distinguishes support, dissent, mixed evidence, implementation, and unresolved research gaps. +description: The study-only admission, claim-review, citation, and visible-gap rules for The Interdependent Way website. ---

Research method

-

Evidence is not a decorative citation layer.

-

Sources are attached to specific claims and units. A metadata service may help locate or normalize a source, but it does not decide whether the source supports, dissents from, limits, or merely contextualizes a claim.

+

Legislation is not science.

+

|∆| This site counts only primary research studies and systematic evidence-synthesis studies as Research. |∆| Non-study material may matter as legal, normative, implementation, or historical context, but it cannot supply research coverage, stance, or evidentiary weight.

-

Classification rules

+

Admission boundary

-
Support

Substantive agreement

The source supplies evidence or reasoning that materially strengthens the identified claim.

-
Dissent

Substantive challenge

The source disputes a premise, mechanism, prediction, interpretation, or consequence.

-
Mixed

Conditional or partial result

The source supports one part while limiting another, or shows the claim depends on context.

-
Gap

No qualifying source found

The site says so directly. It does not manufacture false balance or cite a weak source to fill visual symmetry.

+
Admitted

Research studies

Empirical experiments and trials, observational studies, qualitative or mixed-methods studies, quasi-experiments, replications, and explicitly labeled formal or simulation studies may qualify when they report a research question, reproducible method, analysis, results, and limitations.

+
Admitted synthesis

Systematic evidence studies

Systematic reviews, scoping reviews, evidence maps, and meta-analyses may qualify when they declare search, selection, appraisal or mapping, and synthesis methods.

+
Excluded

Non-study context

Legislation, regulation, cases, treaties, policy, doctrine, ethics declarations, technical standards, practice guidelines, frameworks, advocacy reports, journalism, legal analysis, editorials, opinion, theory essays, narrative reviews, protocols without results, and AI summaries do not count as Research.

+
hmmm

Unclear record class

An unclear source stays out of Research until its full text establishes a qualifying method and result. Prestige, institutional authority, citation count, and peer review alone do not establish that it is a study.

-

Usage guidance

+

Current migration audit

+

{{ research_data.stats.screenedSourceCount }} candidate sources were screened: {{ research_data.stats.admittedStudyCount }} admitted studies and {{ research_data.stats.excludedNonstudyCount }} non-study records excluded from Research.

+

{{ research_data.stats.publishedStudyClaimCount }} study-only claim contacts remain from {{ research_data.stats.candidateClaimCount }} candidates. {{ research_data.stats.excludedContextClaimCount }} claims were removed from the Research surface because one or more cited records were not studies.

+

Verified full-text claim citations: {{ research_data.stats.verifiedClaimCount }}. The retained legacy claims are visibly provisional until an exact page, table, figure, or Results-section locator and design-specific appraisal are recorded.

+
+
+

Claim and citation contract

+
+
Study result

What the study found

Record the design, sample or corpus, setting, method, result or effect, uncertainty, and limitations without turning association into causation.

+
Article contact

Why it bears on the text

State the bounded support, dissent, mixed result, or limit separately from the study's own result. The canonical unit remains independent and controlling.

+
Inference gap

What does not transfer

Identify population, setting, measurement, design, time, cultural, scale, and analogy boundaries. One study is provisional contact, not a broad conclusion.

+
Locator

Where the result appears

A verified claim needs a full-text page, table, figure, appendix, or Results-section locator. Abstract-only or indirect citation remains provisional and is shown as hmmm.

+
+
+
+

Review requirements

    -
  1. Open the exact canonical unit before reading the research cards; the cards test bounded claims and do not replace the source text.
  2. -
  3. Read support and dissent as claim-specific contact. A source may assent to one component while challenging another.
  4. -
  5. Compare source quality, relevance, method, and stated boundary. Never treat citation counts as a vote.
  6. -
  7. Use the two-sided coverage floor to expose each Rights Article to serious challenge, not to manufacture symmetry where evidence quality differs.
  8. +
  9. Identify the exact canonical unit and write the smallest study-linked claim.
  10. +
  11. Search in both supporting and challenging directions; document the query, databases, dates, screening rules, and result.
  12. +
  13. Record authors, year, venue, DOI or stable identifier, study design, evidence mode, population, setting, methods, outcomes, uncertainty, limitations, funding, conflicts, preregistration, data or code availability, and correction or retraction status when available.
  14. +
  15. Use a design-appropriate risk-of-bias appraisal with reasons. Do not replace it with one universal score.
  16. +
  17. Separate the study result, the Article relation, and the inference gap. Preserve contradictory qualifying studies.
  18. +
  19. Recheck corrections and retractions at admission and during scheduled review.
  20. +
  21. Do not require visual support/dissent symmetry. “No qualifying study found” is a valid result and must render as hmmm.
-

Coverage floor: Every Rights Article carries at least one reviewed support claim and one reviewed dissent claim. This proves contact with both directions of inquiry; it does not prove truth, falsity, balance, or comprehensive coverage.

+
+
+

Article-level study gaps

+
+ {% for gap in research_data.gaps %} +
+ {{ gap.search_status }} +

{{ gap.article }}

+

Support: {{ gap.support_status }}
Dissent: {{ gap.dissent_status }}
Mixed or limit: {{ gap.mixed_or_limit_status }}

+

{{ gap.hmmm }}

+ Screened {{ gap.reviewed_on }} +
+ {% endfor %} +
-

Publication requirements

+

Usage guidance

    -
  1. Identify the exact canonical unit or project claim.
  2. -
  3. Record source title, authorship, date, stable identifier, and retrieval date.
  4. -
  5. Separate direct findings from editorial inference.
  6. -
  7. Label stance through review, not keyword sentiment.
  8. -
  9. Preserve contradictory high-quality evidence.
  10. -
  11. Mark retractions, corrections, and stale data.
  12. -
  13. Keep implementation evidence separate from theoretical validity.
  14. +
  15. Open the exact canonical unit first; research cards test bounded contact and never replace the source text.
  16. +
  17. Read the study result before the Article relation, then inspect the inference gap and locator.
  18. +
  19. Treat provisional-full-text-locator-needed as unfinished citation verification, not as a verified finding.
  20. +
  21. To add a source, append the candidate record, make one explicit source-admission decision, add or revise the bounded claim, record its claim review, update the Article gap, then run npm run check and npm run test:browser.

hmmm

-

The version-controlled research ledger now provides two-sided contact for every Rights Article, but the reviewed corpus remains an opening tranche rather than a comprehensive literature review.

+

The study-only boundary is enforced in code and tests. The current corpus is a screened legacy candidate set, not a comprehensive systematic review; exact full-text result locators, duplicate independent screening, design-specific risk-of-bias appraisals, funding and conflict extraction, and scheduled correction/retraction checks remain to be completed.

diff --git a/src/start.njk b/src/start.njk index c1a5388..dc22aa0 100644 --- a/src/start.njk +++ b/src/start.njk @@ -5,6 +5,6 @@ permalink: /start/ description: Orientation to The Interdependent Way, its layered source model, project constellation, and research boundaries. ---

Orientation before density

Start here

The Interdependent Way is simultaneously a canonical text, an interpretive problem, a research program, a public project constellation, and a set of frontier claims. Those layers are related, but they are not interchangeable.

-

How to read this site

Canon

What the source says

Exact text and mechanically derived structure. Canon wins whenever a companion reading disagrees.

Interpretation

What a reading proposes

Orientation, plain-language companions, and tension analysis. Useful scaffolding, always subordinate to source.

Research

What evidence bears on it

Support, dissent, mixed results, context, and evidence gaps are classified by editorial review rather than automated sentiment.

Implementation

What has been built

Repositories and artifacts that attempt to embody, test, measure, publish, or challenge part of the work.

Frontier

What remains unsettled

Experimental or incomplete claims remain named without borrowing certainty from neighboring formal work.

hmmm

What is honestly unresolved

A boundary object that records the missing constraint and preserves a place for continuation.

+

How to read this site

Canon

What the source says

Exact text and mechanically derived structure. Canon wins whenever a companion reading disagrees.

Interpretation

What a reading proposes

Orientation, plain-language companions, and tension analysis. Useful scaffolding, always subordinate to source.

Research

What studies found

Only primary studies and systematic evidence-synthesis studies count. Support, dissent, mixed results, limits, and missing directions are classified by review rather than automated sentiment.

Non-study context

What rules or institutions say

Legislation, treaties, standards, guidelines, frameworks, and doctrine may matter as context, but they are not science and never count as Research.

Implementation

What has been built

Repositories and artifacts that attempt to embody, test, measure, publish, or challenge part of the work.

Frontier

What remains unsettled

Experimental or incomplete claims remain named without borrowing certainty from neighboring formal work.

hmmm

What is honestly unresolved

A boundary object that records the missing constraint and preserves a place for continuation.

A suggested first path

  1. Open The Way and choose one section.
  2. Read its companion page to locate the unit.
  3. Enter the unit’s Article Lab to see body text and notes treated as separate speakers.
  4. Open exact source when you are ready to verify wording and provenance.
  5. Use Projects to see what has actually been implemented.
diff --git a/tests/accessibility.spec.mjs b/tests/accessibility.spec.mjs index 2704b8a..2f94d05 100644 --- a/tests/accessibility.spec.mjs +++ b/tests/accessibility.spec.mjs @@ -13,7 +13,8 @@ if (!firstLabUnit) throw new Error(`missing Lab canon unit ${articleLab[0].unit_ for (const route of [ '/', '/home/', '/preamble/', '/chapters/', '/chapters/chapter-zero/', '/chapters/chapter-seven/', - '/articles/', '/articles/article-two/', '/way/', '/lab/', `/lab/${firstLabUnit.routeSlug}/`, '/projects/' + '/articles/', '/articles/article-two/', '/way/', '/lab/', `/lab/${firstLabUnit.routeSlug}/`, '/projects/', + '/research/method/' ]) { test(`${route} has no serious or critical automated accessibility violations`, async ({ page }) => { await page.goto(route); diff --git a/tests/generated-site.test.mjs b/tests/generated-site.test.mjs index 30f7821..585bb62 100644 --- a/tests/generated-site.test.mjs +++ b/tests/generated-site.test.mjs @@ -113,8 +113,9 @@ test('generated deployment artifact contains all rights article vertical slices assert.match(html, titlePattern); assert.match(html, canonPattern); assert.match(html, /60–90 second script/); - assert.match(html, /Reviewed research attachment/); - assert.match(html, /Evidence boundary/); + assert.match(html, /Study-only research attachment/); + assert.match(html, /Inference boundary/); + assert.match(html, /hmmm · study coverage/); assert.match(html, /hmmm/); } }); @@ -136,12 +137,34 @@ test('every Rights Article Lab renders absurd-limit, practice, domain, and resea assert.match(html, /Worst practices and best practices/); assert.match(html, /Applications by domain/); assert.match(html, /Research field/); - assert.match(html, /Evidence boundary/); + assert.match(html, /Inference boundary/); + assert.match(html, /Only admitted research studies appear here|Research means an admitted primary study/); + assert.match(html, /hmmm · study coverage/); assert.match(html, /href="https?:\/\//); for (const domain of requiredDomains) assert.match(html, new RegExp(domain.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'))); } }); +test('public Research pages exclude legislation, standards, guidelines, frameworks, and doctrine', async () => { + const method = await readFile('_site/research/method/index.html', 'utf8'); + const articlePages = await Promise.all([ + 'article-one', 'article-two', 'article-three', 'article-four', + 'article-five', 'article-six', 'article-seven', 'article-eight' + ].map(slug => readFile(`_site/articles/${slug}/index.html`, 'utf8'))); + const publicResearch = [method, ...articlePages].join('\n'); + + assert.match(method, /Legislation is not science/); + assert.match(method, /19<\/strong> admitted studies/); + assert.match(method, /20<\/strong> non-study records excluded/); + for (const excludedTitle of [ + 'Guidelines on sanitation and health', + 'General comment No. 1', + 'RFC 2119', + 'National Incident Management System', + 'The Belmont Report' + ]) assert.doesNotMatch(publicResearch, new RegExp(excludedTitle.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'))); +}); + test('generated deployment artifact publishes verifiable build identity', async () => { const build = JSON.parse(await readFile('_site/build.json', 'utf8')); assert.equal(build.repository, 'The-Interdependency/The-Interdependency.github.io'); diff --git a/tests/research-ledger.test.mjs b/tests/research-ledger.test.mjs index 18f1adc..6fabb28 100644 --- a/tests/research-ledger.test.mjs +++ b/tests/research-ledger.test.mjs @@ -1,9 +1,10 @@ -// Usage: run through `npm test`; every manifest-declared research ledger must parse and every Rights Article must retain reviewed support and dissent. -// Evidence boundary: validates provenance, segmentation, and coverage structure, not the truth of every source claim or application. +// Usage: run through `npm test`; candidate ledgers must be fully screened and only admitted studies may reach the public Research data. +// Evidence boundary: validates record class, provenance structure, claim admission, and visible gaps; it does not reproduce or independently appraise each study. import test from 'node:test'; import assert from 'node:assert/strict'; import { readFile } from 'node:fs/promises'; import yaml from 'js-yaml'; +import loadResearchData from '../src/_data/research_data.js'; const manifestPath = 'src/_data/research/ledger-manifest.json'; const ledgerPathPattern = /^src\/_data\/research\/[a-z0-9][a-z0-9.-]*\.yml$/; @@ -36,47 +37,121 @@ async function readYamlLedgers(paths, kind) { return ledgers.flat(); } -test('research ledgers parse and claims resolve to reviewed sources', async () => { +test('research admission is study-only and every candidate receives an explicit decision', async () => { const manifest = JSON.parse(await readFile(manifestPath, 'utf8')); - assert.ok(manifest && typeof manifest === 'object' && !Array.isArray(manifest)); - - const [sources, claims, articleLab] = await Promise.all([ + const [candidateSources, candidateClaims, admissions, claimReviews, researchData] = await Promise.all([ readYamlLedgers(manifest.sources, 'source'), readYamlLedgers(manifest.claims, 'claim'), - readFile('src/_data/article_lab.json', 'utf8').then(JSON.parse) + readYamlLedgers(manifest.source_admissions, 'source admission'), + readYamlLedgers(manifest.claim_reviews, 'claim review'), + loadResearchData() ]); - assert.ok(sources.length >= 32, 'the reviewed source corpus must not regress below the current evidence floor'); - assert.ok(claims.length >= 30, 'the reviewed claim corpus must not regress below the current evidence floor'); - assert.ok(Array.isArray(articleLab) && articleLab.length === 8); + const candidateSourceIds = new Set(candidateSources.map(source => source.id)); + const admissionIds = new Set(admissions.map(admission => admission.id)); + const admittedIds = new Set(researchData.sources.map(source => source.id)); + const publishedClaimIds = new Set(researchData.claims.map(claim => claim.id)); - const sourceIds = new Set(sources.map(source => source.id)); - const labUnitIds = new Set(articleLab.map(record => record.unit_id)); - assert.equal(sourceIds.size, sources.length, 'source ids must be unique across all ledgers'); - assert.equal(new Set(claims.map(claim => claim.id)).size, claims.length, 'claim ids must be unique across all ledgers'); - assert.equal(labUnitIds.size, 8, 'each Rights article must have one Lab record'); + assert.equal(candidateSourceIds.size, candidateSources.length, 'candidate source ids must be unique'); + assert.equal(admissionIds.size, admissions.length, 'source admission ids must be unique'); + assert.deepEqual(admissionIds, candidateSourceIds, 'every candidate source needs exactly one admission decision'); + assert.equal(new Set(candidateClaims.map(claim => claim.id)).size, candidateClaims.length, 'candidate claim ids must be unique'); + assert.equal(new Set(claimReviews.map(review => review.id)).size, claimReviews.length, 'claim review ids must be unique'); - for (const source of sources) { + for (const admission of admissions) { + assert.ok(admission.screened_on, `${admission.id} is missing its screening date`); + assert.ok(['admit-study', 'exclude-non-study'].includes(admission.decision)); + if (admission.decision === 'admit-study') { + assert.equal(admission.record_class, 'research_study'); + assert.ok(admission.study_design && admission.evidence_mode && admission.screening_status && admission.appraisal_status); + assert.ok(admission.risk_of_bias_status && admission.funding_conflicts_status && admission.correction_retraction_status); + assert.ok(['empirical', 'systematic_synthesis', 'formal_simulation'].includes(admission.evidence_mode)); + assert.ok(admittedIds.has(admission.id), `${admission.id} was admitted but not published`); + } else { + assert.equal(admission.record_class, 'nonstudy_context'); + assert.ok(admission.exclusion_reason); + assert.ok(!admittedIds.has(admission.id), `${admission.id} is non-study context but reached Research`); + } + } + + for (const source of researchData.sources) { + assert.equal(source.record_class, 'research_study'); + assert.equal(source.decision, 'admit-study'); assert.ok(source.id && source.title && source.authors && source.year && source.publication && source.type); assert.ok(source.url && source.reviewed_on && source.relevance && source.boundary); } - for (const claim of claims) { + + for (const claim of researchData.claims) { assert.ok(['support', 'dissent', 'limit', 'mixed'].includes(claim.stance)); assert.ok(claim.id && claim.status && claim.claim && claim.limitation); - assert.ok(labUnitIds.has(claim.article), `claim ${claim.id} is not attached to a Rights Article Lab record`); - assert.ok(Array.isArray(claim.source_ids) && claim.source_ids.length > 0); - for (const sourceId of claim.source_ids) assert.ok(sourceIds.has(sourceId), `unknown source ${sourceId}`); + assert.ok(claim.study_result && claim.article_relation && claim.inference_gap && claim.locator && claim.reviewed_on); + assert.ok(['verified-full-text', 'provisional-full-text-locator-needed'].includes(claim.verification_status)); + if (claim.verification_status === 'verified-full-text') { + assert.ok(!claim.locator.startsWith('hmmm'), `${claim.id} cannot be verified without an exact locator`); + } else { + assert.match(claim.locator, /^hmmm\b/, `${claim.id} must expose its missing locator as hmmm`); + } + for (const sourceId of claim.source_ids) assert.ok(admittedIds.has(sourceId), `${claim.id} cites non-study source ${sourceId}`); } + for (const candidateClaim of candidateClaims) { + const onlyStudies = candidateClaim.source_ids.every(sourceId => admittedIds.has(sourceId)); + assert.equal(publishedClaimIds.has(candidateClaim.id), onlyStudies, `${candidateClaim.id} admission does not match its source classes`); + } + + for (const requiredNonstudyId of [ + 'who-2018-sanitation-health', + 'un-crpd-2014-legal-capacity', + 'ietf-1997-rfc2119', + 'fema-2017-nims', + 'hhs-1979-belmont-report' + ]) { + assert.ok(!admittedIds.has(requiredNonstudyId), `${requiredNonstudyId} must remain outside Research`); + } + + assert.equal(researchData.stats.screenedSourceCount, candidateSources.length); + assert.equal(researchData.stats.admittedStudyCount, researchData.sources.length); + assert.equal(researchData.stats.excludedNonstudyCount, candidateSources.length - researchData.sources.length); + assert.equal(researchData.stats.candidateClaimCount, candidateClaims.length); + assert.equal(researchData.stats.publishedStudyClaimCount, researchData.claims.length); + assert.equal(researchData.stats.excludedContextClaimCount, candidateClaims.length - researchData.claims.length); +}); + +test('every Rights Article records bidirectional screening without manufactured balance', async () => { + const manifest = JSON.parse(await readFile(manifestPath, 'utf8')); + const [articleLab, gaps, researchData] = await Promise.all([ + readFile('src/_data/article_lab.json', 'utf8').then(JSON.parse), + readYamlLedgers(manifest.gaps, 'evidence gap'), + loadResearchData() + ]); + + const labUnitIds = new Set(articleLab.map(record => record.unit_id)); + assert.equal(labUnitIds.size, 8, 'each Rights article must have one Lab record'); + assert.equal(gaps.length, 8, 'each Rights article must have one evidence-gap record'); + assert.deepEqual(new Set(gaps.map(gap => gap.article)), labUnitIds); + for (const record of articleLab) { assert.ok(record.public_title); assert.ok(record.ad_absurdum?.overextension && record.ad_absurdum?.counter_overextension && record.ad_absurdum?.boundary); assert.ok(Array.isArray(record.worst_practices) && record.worst_practices.length >= 4); assert.ok(Array.isArray(record.best_practices) && record.best_practices.length >= 4); assert.deepEqual(Object.keys(record.applications), requiredDomains, `${record.unit_id} must preserve the shared domain order`); - const articleClaims = claims.filter(claim => claim.article === record.unit_id); - assert.ok(articleClaims.length >= 3, `${record.unit_id} needs more than a minimal support-dissent pair`); - assert.ok(articleClaims.some(claim => claim.stance === 'support'), `${record.unit_id} needs reviewed support`); - assert.ok(articleClaims.some(claim => claim.stance === 'dissent'), `${record.unit_id} needs reviewed dissent`); + + const claims = researchData.claims.filter(claim => claim.article === record.unit_id); + const gap = gaps.find(candidate => candidate.article === record.unit_id); + assert.ok(claims.length >= 1, `${record.unit_id} needs at least one admitted study contact or an intentional no-evidence page design`); + assert.equal(gap.search_status, 'candidate-ledger-screened-both-directions'); + assert.ok(gap.hmmm && gap.reviewed_on); + + const expectedStatus = stance => claims.some(claim => stance.includes(claim.stance)) + ? 'qualifying-study-found' + : 'no-qualifying-study-found'; + assert.equal(gap.support_status, expectedStatus(['support'])); + assert.equal(gap.dissent_status, expectedStatus(['dissent'])); + assert.equal(gap.mixed_or_limit_status, expectedStatus(['mixed', 'limit'])); } + + const articleThreeClaims = researchData.claims.filter(claim => claim.article === 'rights-and-definitions-of-the-way.article-three'); + assert.ok(!articleThreeClaims.some(claim => claim.stance === 'support'), 'do not fabricate Article Three support for visual balance'); + assert.ok(!articleThreeClaims.some(claim => claim.stance === 'dissent'), 'do not relabel non-study theory as Article Three dissent'); }); diff --git a/tests/site.spec.mjs b/tests/site.spec.mjs index cd7c703..ecb9544 100644 --- a/tests/site.spec.mjs +++ b/tests/site.spec.mjs @@ -26,6 +26,7 @@ const routes = [ ['/source/', /Source/], ['/projects/', /Projects/], ['/artifacts/', /Artifacts/], + ['/research/method/', /Legislation is not science/], ['/fallback/', /Emergency static edition/] ]; @@ -100,3 +101,17 @@ test('all eight Rights Article Labs are indexed and expose the shared contact st await expect(page.locator('body')).toContainText('Child craft'); await expect(page.locator('body')).toContainText('Research field'); }); + +test('Research is study-only and exposes provisional citation gaps', async ({ page }) => { + await page.goto('/research/method/'); + await expect(page.locator('h1')).toHaveText('Legislation is not science.'); + await expect(page.locator('body')).toContainText('19 admitted studies'); + await expect(page.locator('body')).toContainText('20 non-study records excluded'); + await expect(page.locator('body')).toContainText('provisional-full-text-locator-needed'); + + await page.goto('/articles/article-three/'); + await expect(page.locator('body')).toContainText('Study-only research attachment'); + await expect(page.locator('body')).toContainText('support no-qualifying-study-found'); + await expect(page.locator('body')).toContainText('dissent no-qualifying-study-found'); + await expect(page.locator('body')).not.toContainText('TeamSTEPPS'); +});