Repository object · research-note

ruff: noqa: E501

Accepted research note in the public catalog.

Source path
research/how-we-know/mehrabian-7-38-55/build_candidate.py
Media type
text/x-python
Object ID
em:research-note:sha256:d8696ead124f65b378a3c776a677192fb23dbecdc8554eaa3abb05513ebcc1e0
Content digest
42549b02f798c1e794d0baeb5b86e168a36602a5dccc0e51a927c479e85a4b74

Source content

#!/usr/bin/env python3

"""Build the deterministic Case 004 candidate dossier from accepted EM-0033 bytes.

The builder is deliberately offline. It reads only the accepted research

packet and its independent-review receipt, then projects those reviewed

records into the repository's dossier-v0.1 interchange shape.

"""

ruff: noqa: E501

from __future__ import annotations

import argparse

import copy

import hashlib

import json

from pathlib import Path

from typing import Any

from epistemedia.dossier import DOSSIER_FORMAT, stamp_dossier, validate_dossier

HERE = Path(__file__).resolve().parent

PACKET_PATH = HERE / "candidate-packet.json"

REVIEW_PATH = HERE / "independent-review-receipt.json"

SOURCE_RECORDS_PATH = HERE / "source-records.json"

OUTPUT_PATH = HERE / "candidate-dossier.json"

ACCEPTED_PACKET_SHA256 = "6253a8ece3bb3b5bfb393ec04ad4e0f14b88f567ddea2923300538eadb7c8cde"

ACCEPTED_REVIEW_SHA256 = "b70e6ae4f073004cc602860bf0a1c3976d6c7fb12c3440253e68a8ff20538d1b"

ACCEPTED_PACKET_ID = (

"em:research-packet:sha256:a73dc29f0a0c3f05a112b7c392d115cfcc38a1136a683325bf74bebf0c6b2e40"

)

ACCEPTED_SOURCE_RECORDS_SHA256 = "0ac4f87236882d32aa6018e50600a79642b87acdf05e27c291514e770fda081c"

ASSERTED_AT = "2026-08-27T16:03:55Z"

EXPECTED_COUNTS = {

"claims": 11,

"derivations": 6,

"follow_up_objects": 5,

"lineage_edges": 11,

"lineage_groups": 6,

"participant_data_roots": 5,

"propagation_objects": 3,

"quote_minimal_spans": 40,

"source_records": 12,

}

SOURCE_KIND = {

"work-mehrabian-author-page": "webpage",

"work-silent-messages": "book",

"work-hampshire-pcc-deck-2022": "report",

"work-birmingham-events-page-2020": "webpage",

}

URI_PRIORITY = (

"doi",

"landing",

"catalog",

"pubmed",

"inspected_scan",

"alternate_readback",

"pdf",

)

CLAIM_LINEAGE = {

"claim-popular-rule": "lineage-general-rule-synthesis",

"claim-p1-tone-dominance": "lineage-participant-p1",

"claim-p2-face-tone": "lineage-participant-p2",

"claim-three-coefficient-proposal": "lineage-cross-study-proposal",

"claim-seven-origin": "lineage-seven-origin-unknown",

"claim-book-boundary": "lineage-silent-1971",

"claim-1981-edition": "lineage-silent-1981-unknown",

"claim-hegstrom-rebuttal": "lineage-hegstrom-rebuttal",

"claim-related-context": "lineage-argyle-related-program",

"claim-propagation": "lineage-propagation-synthesis",

"claim-replication-search": "lineage-follow-up-synthesis",

}

DERIVATION_LINEAGE = {

"derive-proposed-sum": "lineage-cross-study-proposal",

"derive-proposed-facial-vocal-ratio": "lineage-cross-study-proposal",

"derive-p2-facial-vocal-ratio": "lineage-cross-study-proposal",

"derive-ratio-difference": "lineage-cross-study-proposal",

"derive-implied-vocal-verbal-ratio": "lineage-seven-origin-unknown",

"derive-p2-allocation-with-seven-reserved": "lineage-seven-origin-unknown",

}

DERIVATION_SPANS = {

"derive-proposed-sum": ["span-ferris-proposal"],

"derive-proposed-facial-vocal-ratio": ["span-ferris-proposal"],

"derive-p2-facial-vocal-ratio": ["span-ferris-regression"],

"derive-ratio-difference": ["span-ferris-regression", "span-ferris-proposal"],

"derive-implied-vocal-verbal-ratio": ["span-ferris-proposal"],

"derive-p2-allocation-with-seven-reserved": [

"span-ferris-regression",

"span-ferris-proposal",

],

}

EDGE_ENDPOINTS = {

"edge-p1-p2-participant": ("lineage-participant-p1", "lineage-participant-p2"),

"edge-p1-p2-speaker": ("lineage-participant-p1", "lineage-participant-p2"),

"edge-p1-p2-author-social": ("lineage-participant-p1", "lineage-participant-p2"),

"edge-p1-p2-grant": ("lineage-participant-p1", "lineage-participant-p2"),

"edge-p1-p2-stimulus": ("lineage-participant-p1", "lineage-participant-p2"),

"edge-p1-p2-material": ("lineage-participant-p1", "lineage-participant-p2"),

"edge-p1-p2-method": ("lineage-participant-p1", "lineage-participant-p2"),

"edge-p1-p2-scale": ("lineage-participant-p1", "lineage-participant-p2"),

"edge-p2-cites-p1": ("lineage-participant-p2", "lineage-participant-p1"),

"edge-silent-messages-editions": (

"lineage-silent-1971",

"lineage-silent-1981-unknown",

),

"edge-p1-p2-proposal-derivation": (

"lineage-mehrabian-original-program",

"lineage-cross-study-proposal",

),

}

def canonical_json(value: Any) -> bytes:

"""Return the repository's stable JSON encoding."""

return json.dumps(value, sort_keys=True, separators=(",", ":"), ensure_ascii=False).encode(

"utf-8"

)

def sha256_bytes(value: bytes) -> str:

return hashlib.sha256(value).hexdigest()

def digest(value: Any) -> str:

raw = value.encode("utf-8") if isinstance(value, str) else canonical_json(value)

return "sha256:" + sha256_bytes(raw)

def canonical_uri(record: dict[str, Any]) -> str:

urls = record.get("urls")

if not isinstance(urls, dict):

raise ValueError(f"{record.get('source_id')} has no URL register")

for role in URI_PRIORITY:

value = urls.get(role)

if isinstance(value, str) and value:

return value

raise ValueError(f"{record.get('source_id')} has no canonical URI")

def edition_record(

source: dict[str, Any],

captured_at: str,

) -> dict[str, Any]:

content = {

"format": "epistemedia-em0033-source-record-projection-v1",

"accepted_packet_id": ACCEPTED_PACKET_ID,

"source_record": source,

}

encoded = canonical_json(content)

return {

"key": source["edition_id"],

"work_key": source["work_id"],

"edition_label": f"Reviewed source-record projection of {source['edition_id']}",

"media_type": "application/json",

"retrieved_at": captured_at,

"content": content,

"content_digest": "sha256:" + sha256_bytes(encoded),

"content_length": len(encoded),

"visibility": "public",

}

def span_record(

source: dict[str, Any],

index: int,

span: dict[str, Any],

) -> dict[str, Any]:

return {

"key": span["span_id"],

"edition_key": source["edition_id"],

"locator": {

"type": "json-pointer",

"pointer": f"/source_record/spans/{index}",

"label": span["locator"],

},

"extent": {"type": "json-value", "value": span},

"digest": digest(span),

"visibility": "public",

}

def lineage_record(

lineage_key: str,

*,

status: str,

dimensions: list[str],

depends_on: list[str],

basis_span_keys: list[str],

note: str,

) -> dict[str, Any]:

return {

"key": lineage_key,

"status": status,

"dimensions": dimensions,

"depends_on": depends_on,

"basis_span_keys": sorted(set(basis_span_keys)),

"assertion_keys": [],

"note": note,

"visibility": "public",

}

def make_lineages(spans_by_source: dict[str, list[str]]) -> list[dict[str, Any]]:

roots = [

(

"lineage-participant-p1",

"source-mehrabian-wiener-1967",

"known",

["data", "method", "apparatus", "social"],

"First 1967 paper: one reported participant-data root for the words-and-tone task.",

),

(

"lineage-participant-p2",

"source-mehrabian-ferris-1967",

"known",

["data", "method", "apparatus", "social"],

"Second 1967 paper: a distinct reported participant-data root for the face-and-tone task; person-level overlap is not disclosed.",

),

(

"lineage-author-qualification",

"source-mehrabian-author-qualification",

"known",

["source", "social"],

"Later author interpretation and qualification; it supplies no new participant evidence.",

),

(

"lineage-silent-1971",

"source-silent-messages-1971",

"known",

["source", "model"],

"Inspected 1971 book edition, represented only by reviewed quote-minimal spans and capture identity.",

),

(

"lineage-silent-1981-unknown",

"source-silent-messages-1981",

"unknown",

["source", "retrieval"],

"The 1981 second-edition identity is known, but formula-page continuity is unknown because the edition was not textually collated.",

),

(

"lineage-hegstrom-rebuttal",

"source-hegstrom-1979",

"known",

["data", "method", "source"],

"Separate reported participant-data root and direct all-channel rebuttal; full-text participant and material details remain unavailable.",

),

(

"lineage-participant-argyle-1970",

"source-argyle-1970",

"known",

["data", "method", "source"],

"Reported participant-data root for the 1970 superiority/inferiority experiment.",

),

(

"lineage-participant-argyle-1971",

"source-argyle-1971",

"known",

["data", "method", "source"],

"Reported participant-data root for the 1971 friendly/hostile experiments.",

),

(

"lineage-lapakko-1997",

"source-lapakko-1997",

"known",

["source", "method", "social"],

"Methodological critique source; no new participant evidence is credited.",

),

(

"lineage-lapakko-2007",

"source-lapakko-2007",

"known",

["source", "method", "social"],

"Bounded propagation study and critique; circulation receives zero scientific-rule credit.",

),

(

"lineage-hampshire-propagation",

"source-hampshire-pcc-2022",

"known",

["source", "social"],

"Institutional recirculation object with zero scientific-rule evidence credit.",

),

(

"lineage-birmingham-propagation",

"source-birmingham-events-2020",

"known",

["source", "social"],

"Institutional recirculation object with zero scientific-rule evidence credit.",

),

]

result = [

lineage_record(

lineage_key,

status=status,

dimensions=dimensions,

depends_on=[],

basis_span_keys=spans_by_source[source_id],

note=note,

)

for lineage_key, source_id, status, dimensions, note in roots

]

def spans(*source_ids: str) -> list[str]:

return [span_key for source_id in source_ids for span_key in spans_by_source[source_id]]

result.extend(

[

lineage_record(

"lineage-mehrabian-original-program",

status="known",

dimensions=["data", "method", "apparatus", "model", "social"],

depends_on=["lineage-participant-p1", "lineage-participant-p2"],

basis_span_keys=spans(

"source-mehrabian-wiener-1967",

"source-mehrabian-ferris-1967",

),

note="Two distinct reported participant groups within one linked UCLA author, grant, material, method, scale, citation, and derivation program.",

),

lineage_record(

"lineage-mehrabian-interpretation",

status="known",

dimensions=["source", "model", "retrieval", "social"],

depends_on=[

"lineage-silent-1971",

"lineage-silent-1981-unknown",

"lineage-author-qualification",

],

basis_span_keys=spans(

"source-silent-messages-1971",

"source-silent-messages-1981",

"source-mehrabian-author-qualification",

),

note="One authorial interpretation and book-edition lineage; it supplies no new participant evidence and preserves the unknown 1981 formula-page comparison.",

),

lineage_record(

"lineage-argyle-related-program",

status="known",

dimensions=["data", "method", "source", "social"],

depends_on=[

"lineage-participant-argyle-1970",

"lineage-participant-argyle-1971",

],

basis_span_keys=spans("source-argyle-1970", "source-argyle-1971"),

note="Two related Oxford studies with shared author/program and different attitude dimensions; related boundary evidence, not exact replication.",

),

lineage_record(

"lineage-lapakko-critique-propagation",

status="known",

dimensions=["source", "method", "social"],

depends_on=["lineage-lapakko-1997", "lineage-lapakko-2007"],

basis_span_keys=spans("source-lapakko-1997", "source-lapakko-2007"),

note="Same-author critique program; the 2007 bounded website sample measures circulation, not scientific effect.",

),

lineage_record(

"lineage-institutional-recirculation",

status="known",

dimensions=["source", "social"],

depends_on=[

"lineage-hampshire-propagation",

"lineage-birmingham-propagation",

],

basis_span_keys=spans(

"source-hampshire-pcc-2022",

"source-birmingham-events-2020",

),

note="Separate institutional recirculation objects, each assigned zero empirical evidence credit.",

),

lineage_record(

"lineage-cross-study-proposal",

status="known",

dimensions=["data", "method", "model", "source", "social"],

depends_on=["lineage-mehrabian-original-program"],

basis_span_keys=[

"span-ferris-citation-p1",

"span-ferris-design",

"span-ferris-regression",

"span-ferris-proposal",

],

note="The later .07/.38/.55 proposal combines the two linked 1967 studies; it is not a third participant-data root or one three-channel experiment.",

),

lineage_record(

"lineage-seven-origin-unknown",

status="unknown",

dimensions=["model", "source"],

depends_on=["lineage-cross-study-proposal"],

basis_span_keys=[

"span-ferris-regression",

"span-ferris-proposal",

"span-silent-1971-liking",

],

note="The exact source derivation of the .07 verbal coefficient remains unknown and receives no credit; reverse engineering is sensitivity analysis only.",

),

lineage_record(

"lineage-propagation-synthesis",

status="known",

dimensions=["source", "method", "social"],

depends_on=[

"lineage-lapakko-critique-propagation",

"lineage-institutional-recirculation",

],

basis_span_keys=spans(

"source-lapakko-2007",

"source-hampshire-pcc-2022",

"source-birmingham-events-2020",

),

note="Circulation synthesis only; every propagation object remains at zero scientific-rule evidence credit.",

),

lineage_record(

"lineage-follow-up-synthesis",

status="known",

dimensions=["data", "method", "source", "social"],

depends_on=[

"lineage-hegstrom-rebuttal",

"lineage-argyle-related-program",

"lineage-lapakko-1997",

],

basis_span_keys=spans(

"source-hegstrom-1979",

"source-argyle-1970",

"source-argyle-1971",

"source-lapakko-1997",

),

note="A direct all-channel rebuttal, related context-dependent studies, and critique remain separate; no exhaustive replication claim is made.",

),

lineage_record(

"lineage-general-rule-synthesis",

status="known",

dimensions=["data", "method", "model", "source", "social"],

depends_on=[

"lineage-cross-study-proposal",

"lineage-mehrabian-interpretation",

"lineage-hegstrom-rebuttal",

"lineage-argyle-related-program",

"lineage-propagation-synthesis",

],

basis_span_keys=sorted(

{

span_key

for source_spans in spans_by_source.values()

for span_key in source_spans

}

),

note="Synthesis retains narrow experimental results, later qualification, direct rebuttal, and zero-credit recirculation without promoting a universal communication rule.",

),

lineage_record(

"lineage-reviewed-source-register",

status="known",

dimensions=["source", "retrieval", "other"],

depends_on=[

"lineage-mehrabian-original-program",

"lineage-mehrabian-interpretation",

"lineage-hegstrom-rebuttal",

"lineage-argyle-related-program",

"lineage-lapakko-critique-propagation",

"lineage-institutional-recirculation",

],

basis_span_keys=sorted(

{

span_key

for source_spans in spans_by_source.values()

for span_key in source_spans

}

),

note="Relation-derived register of the accepted packet's source, edition, span, claim, calculation, lineage, propagation, and follow-up objects.",

),

]

)

return result

def load_accepted_json(path: Path, expected_sha256: str) -> dict[str, Any]:

payload = path.read_bytes()

actual = sha256_bytes(payload)

if actual != expected_sha256:

raise ValueError(f"{path.name} changed: expected {expected_sha256}, observed {actual}")

value = json.loads(payload)

if not isinstance(value, dict):

raise ValueError(f"{path.name} must contain a JSON object")

return value

def build_candidate() -> dict[str, Any]:

packet = load_accepted_json(PACKET_PATH, ACCEPTED_PACKET_SHA256)

review = load_accepted_json(REVIEW_PATH, ACCEPTED_REVIEW_SHA256)

source_register = load_accepted_json(SOURCE_RECORDS_PATH, ACCEPTED_SOURCE_RECORDS_SHA256)

if packet.get("packet_id") != ACCEPTED_PACKET_ID:

raise ValueError("accepted packet ID does not match the bound EM-0033 packet")

if (

review.get("decision") != "pass"

or review.get("recommendation") != "GO"

or review.get("complete") is not True

or review.get("task_id") != "EM-0033"

):

raise ValueError("accepted independent review is not a passing GO receipt")

bindings = review.get("bindings")

if not isinstance(bindings, dict):

raise ValueError("accepted independent review has no bindings")

if bindings.get("packet_id") != ACCEPTED_PACKET_ID:

raise ValueError("independent review packet-ID binding drift")

if bindings.get("candidate_packet") != {

"bytes": len(PACKET_PATH.read_bytes()),

"sha256": ACCEPTED_PACKET_SHA256,

}:

raise ValueError("independent review packet-byte binding drift")

if bindings.get("source_records") != {

"bytes": len(SOURCE_RECORDS_PATH.read_bytes()),

"sha256": ACCEPTED_SOURCE_RECORDS_SHA256,

}:

raise ValueError("independent review source-register binding drift")

content = packet.get("content")

if not isinstance(content, dict):

raise ValueError("accepted packet content must be an object")

projected_register = copy.deepcopy(source_register)

for source in projected_register["source_records"]:

for span in source["spans"]:

span["quote_sha256"] = sha256_bytes(span["quote"].encode("utf-8"))

for field, value in projected_register.items():

if field in content and content[field] != value:

raise ValueError(f"accepted packet/source-register drift at {field}")

sources = content.get("source_records")

if not isinstance(sources, list):

raise ValueError("accepted packet source_records must be an array")

derived_counts = {

"claims": len(content["claims"]),

"derivations": len(content["derivations"]),

"follow_up_objects": len(content["follow_up_ledger"]),

"lineage_edges": len(content["lineage_edges"]),

"lineage_groups": len(content["lineages"]),

"participant_data_roots": sum(

item["participant_data_roots"] for item in content["lineages"]

),

"propagation_objects": len(content["propagation_ledger"]),

"quote_minimal_spans": sum(len(source["spans"]) for source in sources),

"source_records": len(sources),

}

if derived_counts != EXPECTED_COUNTS or content.get("counts") != derived_counts:

raise ValueError("accepted relation-derived count identity drift")

if any(

item.get("scientific_rule_evidence_credit") != 0 for item in content["propagation_ledger"]

):

raise ValueError("propagation object received scientific-rule evidence credit")

sources_by_id = {source["source_id"]: source for source in sources}

if len(sources_by_id) != len(sources):

raise ValueError("duplicate accepted source ID")

works: dict[str, list[dict[str, Any]]] = {}

for source in sources:

works.setdefault(source["work_id"], []).append(source)

source_works = []

for work_id, records in sorted(works.items()):

ordered = sorted(records, key=lambda item: item["source_id"])

first = ordered[0]

licenses = sorted({item["license_treatment"] for item in records})

source_works.append(

{

"key": work_id,

"kind": SOURCE_KIND.get(work_id, "paper"),

"title": first["title"],

"creators": first["authors"],

"canonical_uri": canonical_uri(first),

"license": "; ".join(licenses),

"visibility": "public",

}

)

editions = []

spans = []

spans_by_source: dict[str, list[str]] = {}

span_ids: set[str] = set()

for source in sorted(sources, key=lambda item: item["source_id"]):

editions.append(edition_record(source, content["captured_at"]))

source_span_keys = []

for index, span in enumerate(source["spans"]):

span_key = span["span_id"]

if span_key in span_ids:

raise ValueError(f"duplicate accepted span ID: {span_key}")

span_ids.add(span_key)

source_span_keys.append(span_key)

spans.append(span_record(source, index, span))

spans_by_source[source["source_id"]] = source_span_keys

if len(spans) != EXPECTED_COUNTS["quote_minimal_spans"]:

raise ValueError("accepted parent-span count drift")

propositions = [

{

"key": claim["claim_id"],

"text": claim["proposition"],

"scope": (

f"Accepted EM-0033 status: {claim['status']}; "

f"evidence cutoff {content['evidence_cutoff']}."

),

"visibility": "public",

}

for claim in content["claims"]

]

for calculation in content["derivations"]:

result_text = json.dumps(

calculation["result"],

sort_keys=True,

separators=(",", ":"),

ensure_ascii=False,

)

propositions.append(

{

"key": calculation["derivation_id"],

"text": (

f"{calculation['interpretation']} "

f"Calculation: {calculation['equation']} = {result_text}."

),

"scope": (

"Mechanical reproduction from accepted EM-0033 inputs; "

"not a new empirical estimate."

),

"visibility": "public",

}

)

unique_work_count = len(works)

edition_count = len({source["edition_id"] for source in sources})

propositions.extend(

[

{

"key": "prop-reviewed-source-register",

"text": (

f"The accepted packet contains {len(sources)} source records, "

f"{unique_work_count} source works, {edition_count} editions, "

f"{len(spans)} parent spans, {len(content['claims'])} claims, "

f"{len(content['derivations'])} calculations, "

f"{len(content['lineages'])} lineage groups, "

f"{derived_counts['participant_data_roots']} participant-data roots, "

f"{len(content['lineage_edges'])} typed lineage edges, "

f"{len(content['propagation_ledger'])} propagation objects, and "

f"{len(content['follow_up_ledger'])} follow-up dispositions."

),

"scope": "Counts derived from accepted packet relations, never editorial totals.",

"visibility": "public",

},

{

"key": "prop-encyclopedia-evaluation",

"text": (

"The historically defensible account is a narrow cross-study weighting "

"proposal over inconsistent feelings-and-attitudes tasks, with the two "

"1967 participant roots and later interpretation kept distinct."

),

"scope": "Encyclopedia policy: document the bounded historical proposal and its limits.",

"visibility": "public",

},

{

"key": "prop-skeptical-evaluation",

"text": (

"A universal 93-percent rule should be withheld because no reviewed "

"three-channel experiment established it, the .07 origin is unresolved, "

"and direct all-channel evidence reported message-specific equations."

),

"scope": "Skeptical policy: withhold broad causal or universal interpretation.",

"visibility": "public",

},

]

)

lineages = make_lineages(spans_by_source)

lineages_by_key = {lineage["key"]: lineage for lineage in lineages}

if len(lineages_by_key) != len(lineages):

raise ValueError("duplicate dossier lineage key")

assertions: list[dict[str, Any]] = []

relations: list[dict[str, Any]] = []

def add_assertion(

assertion_key: str,

proposition_key: str,

lineage_key: str,

source_span_keys: list[str],

*,

actor_id: str = "accepted-em0033-reviewed-record",

stance: str = "asserts",

relation_type: str = "support",

) -> None:

if not source_span_keys or any(key not in span_ids for key in source_span_keys):

raise ValueError(f"{assertion_key} lacks exact accepted span closure")

assertion = {

"key": assertion_key,

"proposition_key": proposition_key,

"actor": {"id": actor_id, "kind": "collective"},

"stance": stance,

"span_keys": source_span_keys,

"lineage_key": lineage_key,

"asserted_at": ASSERTED_AT,

"visibility": "public",

}

assertions.append(assertion)

lineages_by_key[lineage_key]["assertion_keys"].append(assertion_key)

relations.append(

{

"key": f"relation-{assertion_key}",

"relation_type": relation_type,

"from_ref": source_span_keys[0],

"to_ref": proposition_key,

"basis_span_keys": source_span_keys,

"note": "Material proposition closes over the listed exact reviewed parent spans.",

"visibility": "public",

}

)

for claim in content["claims"]:

claim_id = claim["claim_id"]

add_assertion(

"assertion-" + claim_id.removeprefix("claim-"),

claim_id,

CLAIM_LINEAGE[claim_id],

claim["span_ids"],

)

for calculation in content["derivations"]:

derivation_id = calculation["derivation_id"]

add_assertion(

"assertion-" + derivation_id,

derivation_id,

DERIVATION_LINEAGE[derivation_id],

DERIVATION_SPANS[derivation_id],

actor_id="em0033-deterministic-calculator",

)

all_span_keys = sorted(span_ids)

add_assertion(

"assertion-reviewed-source-register",

"prop-reviewed-source-register",

"lineage-reviewed-source-register",

all_span_keys,

actor_id="em0035-relation-counter",

)

add_assertion(

"assertion-encyclopedia-evaluation",

"prop-encyclopedia-evaluation",

"lineage-general-rule-synthesis",

[

"span-wiener-target",

"span-ferris-target",

"span-ferris-design",

"span-ferris-proposal",

"span-silent-1971-boundary",

"span-author-qualification",

],

actor_id="em0035-encyclopedia-policy",

)

add_assertion(

"assertion-skeptical-evaluation",

"prop-skeptical-evaluation",

"lineage-general-rule-synthesis",

[

"span-wiener-target",

"span-ferris-target",

"span-ferris-design",

"span-ferris-proposal",

"span-hegstrom-result",

"span-lapakko-1997-abstract",

],

actor_id="em0035-skeptical-policy",

)

relations.extend(

[

{

"key": "relation-author-qualification",

"relation_type": "qualification",

"from_ref": "span-author-qualification",

"to_ref": "claim-popular-rule",

"basis_span_keys": ["span-author-qualification"],

"note": "The author's later statement limits the formula to inconsistent feelings and attitudes.",

"visibility": "public",

},

{

"key": "relation-hegstrom-direct-rebuttal",

"relation_type": "rebuttal",

"from_ref": "span-hegstrom-result",

"to_ref": "claim-popular-rule",

"basis_span_keys": ["span-hegstrom-design", "span-hegstrom-result"],

"note": "The direct all-channel reconsideration reports message-specific equations unlike a fixed universal rule.",

"visibility": "public",

},

{

"key": "relation-lapakko-method-undercutting",

"relation_type": "undercutting",

"from_ref": "span-lapakko-1997-abstract",

"to_ref": "claim-popular-rule",

"basis_span_keys": ["span-lapakko-1997-abstract"],

"note": "The methodological critique says the limitations do not warrant a precise general formula.",

"visibility": "public",

},

{

"key": "relation-argyle-context-qualification",

"relation_type": "qualification",

"from_ref": "span-argyle-1970-abstract",

"to_ref": "claim-related-context",

"basis_span_keys": [

"span-argyle-1970-abstract",

"span-argyle-1971-experiment-one",

"span-argyle-1971-experiment-two",

],

"note": "Related tasks produce materially different ratios and therefore qualify any fixed cross-context weighting.",

"visibility": "public",

},

]

)

edges_by_id = {edge["edge_id"]: edge for edge in content["lineage_edges"]}

if set(edges_by_id) != set(EDGE_ENDPOINTS):

raise ValueError("accepted typed-lineage edge identity drift")

for edge_id in sorted(edges_by_id):

edge = edges_by_id[edge_id]

from_ref, to_ref = EDGE_ENDPOINTS[edge_id]

relations.append(

{

"key": edge_id,

"relation_type": "dependence",

"from_ref": from_ref,

"to_ref": to_ref,

"basis_span_keys": edge["evidence_span_ids"],

"note": (

f"accepted_dimension={edge['dimension']}; "

f"accepted_status={edge['status']}; "

f"effect={edge['effect_on_independence']}"

),

"visibility": "public",

}

)

for lineage in lineages:

lineage["assertion_keys"].sort()

proposition_keys = [item["key"] for item in propositions]

assertion_keys = [item["key"] for item in assertions]

relation_keys = [item["key"] for item in relations]

family_key = "family-mehrabian-7-38-55"

families = [

{

"key": family_key,

"title": "Mehrabian 7-38-55: narrow findings, later integration, and overgeneralization",

"question": content["question"],

"proposition_keys": proposition_keys,

"assertion_keys": assertion_keys,

"relation_keys": relation_keys,

"visibility": "public",

}

]

evaluations = [

{

"key": "evaluation-encyclopedia",

"claim_family_key": family_key,

"policy_id": "epistemedia-encyclopedia-v1",

"frontier": ACCEPTED_PACKET_ID,

"label": "documented narrow historical proposal with explicit experiment and edition boundaries",

"reason_codes": [

"historical-proposal-documented",

"two-participant-roots-kept-distinct",

"cross-study-integration-not-one-experiment",

"scope-qualification-retained",

],

"visibility": "public",

},

{

"key": "evaluation-skeptical",

"claim_family_key": family_key,

"policy_id": "epistemedia-skeptical-v1",

"frontier": ACCEPTED_PACKET_ID,

"label": "withhold universal rule and withhold recovered-origin claim for the seven-percent coefficient",

"reason_codes": [

"no-reviewed-three-channel-test",

"seven-percent-origin-unresolved",

"direct-rebuttal-message-specific",

"propagation-zero-truth-credit",

"second-edition-formula-pages-uncollated",

],

"visibility": "public",

},

]

material = {

"format": DOSSIER_FORMAT,

"title": "Case 004: What the Mehrabian 7-38-55 weighting did and did not show",

"question": content["question"],

"scope": (

f"Evidence through {content['evidence_cutoff']}; a disclosure-safe research "

"candidate derived only from the accepted EM-0033 packet. It is not admitted, "

"not featured, not live, not published, and not evidence for a universal "

"communication rule."

),

"stage": "draft",

"visibility": "public",

"source_works": source_works,

"editions": editions,

"spans": spans,

"propositions": propositions,

"lineages": lineages,

"assertions": assertions,

"evidence_relations": relations,

"claim_families": families,

"evaluations": evaluations,

}

return stamp_dossier(material)

def main() -> None:

parser = argparse.ArgumentParser()

parser.add_argument("--check", action="store_true")

args = parser.parse_args()

candidate = build_candidate()

validate_dossier(candidate)

rendered = (

json.dumps(candidate, indent=2, sort_keys=True, ensure_ascii=False).encode("utf-8") + b"\n"

)

if args.check:

if not OUTPUT_PATH.is_file() or OUTPUT_PATH.read_bytes() != rendered:

raise SystemExit("candidate dossier differs from deterministic build")

else:

OUTPUT_PATH.write_bytes(rendered)

if __name__ == "__main__":

main()

Build receipt

Reproduce this projection

Reproducible projection
Catalog
em:catalog:sha256:9bfc972213cba2cde167386103dc2c011ee74639fb7f0794c54120fbbdef1a5d
Frontier
em:frontier:sha256:f33be3eae4c75232d56750ef9a1aa79d96274ece3417d65a75c1391bf61a81bf
Accepted commit
f92846570180dfa4511263f8ba98ecd18f7772c9
Epistemic policy
commons-balanced-v0.1
Disclosure policy
public-noninterference-v0.1
Compiler
epistemedia/0.2.0