Repository object · research-note

Build Packet

Accepted research note in the public catalog.

Source path
research/how-we-know/mehrabian-7-38-55/build_packet.py
Media type
text/x-python
Object ID
em:research-note:sha256:646b115e9e481475f61c052e6d222f6866e86da72b2c164f93bfdda84f4a9871
Content digest
e26fe4d96b23249f5a293b657e9477709523008e85d80f5ad7aad4dc6ebf0769

Source content

"""Build the deterministic EM-0033 Mehrabian research packet."""

from __future__ import annotations

import argparse

import copy

import hashlib

import json

from pathlib import Path

from typing import Any

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

SOURCE_RECORDS = PACKET_ROOT / "source-records.json"

CANDIDATE_PACKET = PACKET_ROOT / "candidate-packet.json"

REQUIRED_LINEAGE_DIMENSIONS = {

"participant",

"speaker",

"author",

"grant",

"stimulus",

"material",

"method",

"scale",

"citation",

"book-edition",

"derivation",

}

def canonical_bytes(value: Any) -> bytes:

return json.dumps(

value,

ensure_ascii=False,

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

sort_keys=True,

).encode()

def digest_bytes(payload: bytes) -> str:

return hashlib.sha256(payload).hexdigest()

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

payload = path.read_bytes()

return {"bytes": len(payload), "sha256": digest_bytes(payload)}

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

value = json.loads(path.read_text())

if not isinstance(value, dict):

raise SystemExit(f"{path} must contain a JSON object")

return value

def require(condition: bool, message: str) -> None:

if not condition:

raise SystemExit(message)

def validate_source_records(content: dict[str, Any]) -> None:

sources = content.get("source_records", [])

require(isinstance(sources, list) and sources, "source records missing")

source_ids = [item.get("source_id") for item in sources]

require(len(source_ids) == len(set(source_ids)), "duplicate source ID")

spans = [span for source in sources for span in source.get("spans", [])]

span_ids = [span.get("span_id") for span in spans]

require(len(span_ids) == len(set(span_ids)), "duplicate span ID")

require(all(isinstance(item, str) and item for item in span_ids), "invalid span ID")

span_id_set = set(span_ids)

for span in spans:

quote = span.get("quote")

require(isinstance(quote, str) and quote.strip(), f"empty quote: {span['span_id']}")

kind = span.get("span_kind", "contiguous_quote")

if kind == "contiguous_quote":

require(" ... " not in quote, f"undeclared omission: {span['span_id']}")

elif kind == "verbatim_segments":

segments = span.get("segments")

require(

isinstance(segments, list)

and len(segments) >= 2

and all(isinstance(item, str) and item.strip() for item in segments),

f"invalid segments: {span['span_id']}",

)

require(quote == " ... ".join(segments), f"segment rendering drift: {span['span_id']}")

elif kind == "structured_transcription":

fields = span.get("fields")

require(isinstance(fields, dict) and fields, f"missing fields: {span['span_id']}")

else:

raise SystemExit(f"unknown span kind: {span['span_id']}")

claims = content.get("claims", [])

claim_ids = [item.get("claim_id") for item in claims]

require(len(claim_ids) == len(set(claim_ids)), "duplicate claim ID")

for claim in claims:

cited = claim.get("span_ids", [])

require(cited and set(cited) <= span_id_set, f"claim span gap: {claim['claim_id']}")

edges = content.get("lineage_edges", [])

edge_ids = [item.get("edge_id") for item in edges]

require(len(edge_ids) == len(set(edge_ids)), "duplicate lineage edge ID")

require(

{item.get("dimension") for item in edges} == REQUIRED_LINEAGE_DIMENSIONS,

"lineage dimension coverage drift",

)

for edge in edges:

require(

edge.get("from_ids") and edge.get("to_ids"),

f"lineage endpoint gap: {edge['edge_id']}",

)

cited = edge.get("evidence_span_ids", [])

require(cited and set(cited) <= span_id_set, f"lineage evidence gap: {edge['edge_id']}")

require(edge.get("status"), f"lineage status gap: {edge['edge_id']}")

require(edge.get("effect_on_independence"), f"lineage effect gap: {edge['edge_id']}")

require(

all(

item.get("scientific_rule_evidence_credit") == 0

for item in content["propagation_ledger"]

),

"propagation object received scientific evidence credit",

)

require(

content["derivation_inputs"].get("origin_of_verbal_coefficient") == "unresolved-no-credit",

"missing seven-percent derivation was inferred",

)

def build_derivations(inputs: dict[str, Any]) -> list[dict[str, Any]]:

verbal = float(inputs["proposed_verbal"])

vocal = float(inputs["proposed_vocal"])

facial = float(inputs["proposed_facial"])

p2_facial = float(inputs["p2_facial_coefficient"])

p2_vocal = float(inputs["p2_vocal_coefficient"])

p2_ratio = p2_facial / p2_vocal

proposed_ratio = facial / vocal

remaining = 1.0 - verbal

p2_allocated_facial = remaining * p2_facial / (p2_facial + p2_vocal)

p2_allocated_vocal = remaining * p2_vocal / (p2_facial + p2_vocal)

return [

{

"derivation_id": "derive-proposed-sum",

"equation": "0.07 + 0.38 + 0.55",

"inputs": [verbal, vocal, facial],

"result": verbal + vocal + facial,

"interpretation": "The printed proposal is normalized to one.",

},

{

"derivation_id": "derive-proposed-facial-vocal-ratio",

"equation": "0.55 / 0.38",

"inputs": [facial, vocal],

"result": proposed_ratio,

"interpretation": "Facial-to-vocal ratio implied by the printed proposal.",

},

{

"derivation_id": "derive-p2-facial-vocal-ratio",

"equation": "1.50 / 1.03",

"inputs": [p2_facial, p2_vocal],

"result": p2_ratio,

"interpretation": "Facial-to-vocal ratio from P2's reported regression.",

},

{

"derivation_id": "derive-ratio-difference",

"equation": "abs((1.50 / 1.03) - (0.55 / 0.38))",

"inputs": [p2_ratio, proposed_ratio],

"result": abs(p2_ratio - proposed_ratio),

"interpretation": (

"The reported regression and printed proposal are close, not identical."

),

},

{

"derivation_id": "derive-implied-vocal-verbal-ratio",

"equation": "0.38 / 0.07",

"inputs": [vocal, verbal],

"result": vocal / verbal,

"interpretation": (

"Reverse-engineered ratio implied by the proposal; it does not recover "

"the missing source derivation of 0.07."

),

},

{

"derivation_id": "derive-p2-allocation-with-seven-reserved",

"equation": "allocate 0.93 in the ratio 1.50:1.03",

"inputs": {

"reserved_verbal": verbal,

"remaining": remaining,

"p2_facial": p2_facial,

"p2_vocal": p2_vocal,

},

"result": {

"verbal": verbal,

"vocal": p2_allocated_vocal,

"facial": p2_allocated_facial,

},

"interpretation": (

"Sensitivity reconstruction only. Reserving 0.07 is an assumption, not "

"a derivation supplied by P1 or P2."

),

},

]

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

source_records = load(SOURCE_RECORDS)

content = copy.deepcopy(source_records)

validate_source_records(content)

spans = []

for source in content["source_records"]:

for span in source.get("spans", []):

span["quote_sha256"] = digest_bytes(span["quote"].encode())

spans.append(span)

derivations = build_derivations(content["derivation_inputs"])

content["derivations"] = derivations

content["counts"] = {

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

"quote_minimal_spans": len(spans),

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

"derivations": len(derivations),

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

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

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

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

"participant_data_roots": sum(

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

),

}

content["source_records_identity"] = identity(SOURCE_RECORDS)

packet_id = f"em:research-packet:sha256:{digest_bytes(canonical_bytes(content))}"

return {"packet_id": packet_id, "content": content}

def main() -> None:

parser = argparse.ArgumentParser()

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

args = parser.parse_args()

built = build_packet()

rendered = json.dumps(built, ensure_ascii=False, indent=2, sort_keys=True) + "\n"

if args.check:

require(CANDIDATE_PACKET.is_file(), "candidate packet missing")

require(CANDIDATE_PACKET.read_text() == rendered, "candidate packet drift")

else:

CANDIDATE_PACKET.write_text(rendered)

print(

json.dumps(

{"packet_id": built["packet_id"], **built["content"]["counts"]},

indent=2,

sort_keys=True,

)

)

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