diff --git a/.github/workflows/psychsocio-metafauna.yml b/.github/workflows/psychsocio-metafauna.yml index eb13bb4..5a8be8c 100644 --- a/.github/workflows/psychsocio-metafauna.yml +++ b/.github/workflows/psychsocio-metafauna.yml @@ -4,12 +4,14 @@ on: pull_request: paths: - "research/psychsocio-metafauna/**" + - "research/metapat/BASE.json" - "README.md" - ".github/workflows/psychsocio-metafauna.yml" push: branches: [main] paths: - "research/psychsocio-metafauna/**" + - "research/metapat/BASE.json" - "README.md" - ".github/workflows/psychsocio-metafauna.yml" diff --git a/research/psychsocio-metafauna/PREREGISTRATION.md b/research/psychsocio-metafauna/PREREGISTRATION.md index 0e547c9..7a768f0 100644 --- a/research/psychsocio-metafauna/PREREGISTRATION.md +++ b/research/psychsocio-metafauna/PREREGISTRATION.md @@ -12,7 +12,7 @@ This is the first bounded test of the internal usefulness of the psychsocio-meta ## Decision -Does the combined claim of **damage-affordance specificity + nonlinear coalescence + hysteresis** earn implementation beyond a vocabulary map? +Do **damage-affordance specificity + a super-additive match × reinforcement interaction + hysteresis** jointly earn implementation beyond a vocabulary map, while threshold-shaped nonlinear coalescence remains explicitly unresolved for a later preregistration? ## Load-bearing unknown @@ -55,8 +55,9 @@ The result changes the next branch: ```text SURVIVED -> implement a richer AHBG adapter and external-literature comparison -FALSIFIED -> retire coalescence as a distinct mechanism for this formal scope; - retain ordinary influence and social-learning language +FALSIFIED -> retire only the frozen hypothesis component actually falsified; + retain ordinary influence/social-learning language and keep any + untested threshold-shaped coalescence mechanism UNRESOLVED UNRESOLVED -> repair the earliest failed prerequisite or measurement separation BLOCKED -> do not run until deterministic completion and verification are feasible ``` @@ -258,13 +259,35 @@ Matched damaged-host/pattern pairs produce greater persistence than the same pat **Falsifier:** either difference is below `0.15`, reverses sign, or is explained by a pattern's globally higher reward independent of match. -### H2 — coalescence interaction +### H2 — super-additive interaction precursor -The joint effect of match and social reinforcement on persistence is super-additive. +This run tests whether match and social reinforcement interact super-additively on persistence. It does **not** test a threshold crossing and cannot by itself establish nonlinear coalescence. -**Survival rule:** the predeclared interaction contrast is at least `0.10`, and a threshold/interaction model improves held-out mean squared error by at least `10%` relative to the additive model. +Eligible H2 cells are restricted to the comparable high-demand `P1`–`P4` profiles. For each damaged host `D1`–`D4`: -**Falsifier:** the interaction contrast is below `0.10`, or the additive model predicts held-out persistence within the same error band. +- the matched cell uses its corresponding `Pi`; +- mismatched cells use each of the other three `Pj != Pi` profiles with equal weight; +- `PM`, `P0`, `PX`, and `PR` are excluded from H2; +- independent support is fixed to `absent`; +- safe-exit `absent` and `present` cells receive equal weight; +- only held-out seeds `16..31` are evaluated. + +Within each `Di`, first average persistence over held-out seeds within each exact factorial cell. Then average those cell means with equal weight to obtain the four `matched/unmatched × reinforcement/no-reinforcement` means. The predeclared difference-in-differences contrast is: + +```text +I_i = mean(persistence | matched, reinforcement) + - mean(persistence | matched, no reinforcement) + - mean(persistence | mismatched, reinforcement) + + mean(persistence | mismatched, no reinforcement) +``` + +The H2 statistic is `I = mean(I_1, I_2, I_3, I_4)` with equal weight for each damage profile. + +**Survival rule:** `I >= 0.10`. + +**Falsifier:** `I < 0.10` or reverses sign. This falsifies only the frozen super-additive interaction precursor; it does not falsify an untested threshold-shaped coalescence mechanism. + +**Interpretation boundary:** `H2 = SURVIVED` means only that this frozen super-additive interaction precursor survived. `nonlinear coalescence threshold = UNRESOLVED` regardless of H2 status. A threshold/breakpoint model requires a separate preregistration before it may contribute to the coalescence claim. ### H3 — hysteresis @@ -276,19 +299,50 @@ After initiating exposure is removed, matched high-demand patterns retain more h ### H4 — adoption/capture separation -The measurement vector distinguishes high adoption with preserved revision and exit from the candidate capture configuration. +The measurement vector distinguishes high adoption with preserved inspection/revision capacity from high adoption under a high-demand pattern with narrowed inspectability. + +H4 uses paired held-out episodes only. For each damage profile `D1`–`D4`, social-reinforcement level, safe-exit level, and held-out seed `16..31`, pair the matched-support `PM` episode with the corresponding matched high-demand `Pi` episode while fixing `independent support = absent`. A pair is H4-eligible only when **both** episodes have adoption at or above `0.75`. -**Survival rule:** at least `90%` of matched-support episodes with adoption at or above `0.75` remain outside the candidate capture configuration. +If no H4-eligible pairs exist, `H4 = UNRESOLVED`; neither `SURVIVED` nor `FALSIFIED` may be assigned from an empty denominator. Missing required source episodes are `BLOCKED` rather than silently excluded. -**Falsifier:** strong adaptive adoption is routinely classified as capture. +For each eligible pair compute: + +```text +revision_separation = revision openness(PM) - revision openness(Pi) +alternative_separation = alternative access(PM) - alternative access(Pi) +``` + +Each eligible pair receives equal weight. + +**Survival rule:** at least `90%` of the `PM` sides of eligible pairs must independently satisfy both `revision openness >= 0.50` and `alternative access >= 0.50`; at least `90%` of the corresponding high-demand `Pi` sides must independently satisfy both `revision openness <= 0.50` and `alternative access <= 0.50`; and the equal-weight mean `revision_separation` and `alternative_separation` must each be at least `0.15`. Safe-exit behavior is reported separately and absence of exit alone cannot make this rule survive or fail. + +**Falsifier:** more than `10%` of eligible `PM` sides fail either preservation threshold, more than `10%` of eligible `Pi` sides fail either narrowing threshold, or either mean separation is below `0.15` or reverses sign. + +This rule does not reuse the candidate-capture configuration or its host-outcome comparison. It requires a nonempty paired cohort in which the support side preserves inspectability and the high-demand side actually satisfies the frozen narrowing gates before H4 can survive. ### H5 — noncoercive repair -Independent support reduces persistence and reproduction demands while increasing revision, alternative access, or exit, without deleting the pattern or imposing a belief action. +Independent support reduces persistence and reproduction allocation while increasing revision, alternative access, or exit, without deleting the pattern or imposing a belief action. + +H5 uses only matched high-demand `D1/P1` through `D4/P4` conditions. Social reinforcement and safe exit each retain both declared levels. For every held-out seed `16..31`, pair the `independent support = present` episode with the otherwise identical `independent support = absent` episode. + +For each pair compute: + +```text +persistence_reduction = persistence(no support) - persistence(support) +reproduction_reduction = reproduction allocation(no support) - reproduction allocation(support) +revision_gain = revision openness(support) - revision openness(no support) +alternative_gain = alternative access(support) - alternative access(no support) +exit_gain = exit capacity exercised(support) - exit capacity exercised(no support) +``` + +If any required H5 source episode or support/no-support pair is missing, `H5 = BLOCKED`; verification fails before effect thresholds are interpreted. Incomplete evidence is not a scientific negative result. + +`exit_gain` is evaluated only where `safe exit = present`. First average paired deltas over held-out seeds within each exact factorial cell; then average those cell means with equal weight across eligible cells. `exit_gain` averages only the safe-exit-present cell means. No episode-count weighting or fit/calibration seeds enter H5. -**Survival rule:** compared with the no-support counterpart, support changes at least two agency measures by `0.15` or more in the predicted direction and does not directly force `exit`, `revise`, or `ignore`. +**Survival rule:** the equal-weight aggregate persistence reduction is at least `0.15`, the equal-weight aggregate reproduction-allocation reduction is at least `0.15`, at least two of the three aggregate agency gains (`revision_gain`, `alternative_gain`, `exit_gain`) are at least `0.15`, and support never directly forces `exit`, `revise`, or `ignore`. -**Falsifier:** repair works only through forced deletion, punishment, isolation, or an encoded anti-pattern preference. +**Falsifier:** with all required pairs present, either aggregate persistence or reproduction reduction is below `0.15`, fewer than two aggregate agency gains reach `0.15`, or the apparent repair depends on forced deletion, punishment, isolation, or an encoded anti-pattern preference. ### H6 — broad-spectrum alternative @@ -308,8 +362,8 @@ If `PX` performs as well as or better than specifically matched profiles across 6. Fit only these candidate models to persistence: - exposure-only; - additive main effects; - - declared match × reinforcement interaction; - - one declared piecewise-threshold model. + - the H2 comparable-cell match × reinforcement interaction. + A piecewise-threshold or breakpoint model is explicitly out of scope for this run because no threshold form was frozen before the design merge. Its status is `UNRESOLVED`, not inferred from H2. 7. Evaluate the frozen contrasts and held-out errors. 8. Apply each hypothesis's survival and falsification rule independently. 9. Emit `SURVIVED`, `FALSIFIED`, `UNRESOLVED`, or `BLOCKED` for every hypothesis. @@ -399,7 +453,7 @@ A synthetic `FALSIFIED` result remains in the repository and changes the archite - the exact implementation language and agent update rule; - whether four synthetic damage profiles provide enough topology diversity; - whether the fixed thresholds are too permissive or too strict for useful separation; -- the correct model family for nonlinear coalescence without baking the result into the simulator; +- the threshold/breakpoint form for a later nonlinear-coalescence preregistration; - the exact AHBG adapter after this standalone falsifier; - whether repair should target host capacity, environmental dependency, network plurality, or all three independently. diff --git a/research/psychsocio-metafauna/WORK_GRAPH.json b/research/psychsocio-metafauna/WORK_GRAPH.json index e91b209..6116743 100644 --- a/research/psychsocio-metafauna/WORK_GRAPH.json +++ b/research/psychsocio-metafauna/WORK_GRAPH.json @@ -2,17 +2,17 @@ "schema": "the-interdependency.psychsocio-metafauna-work-graph", "version": "0.1.0", "as_of": "2026-09-04", - "work_graph_sha256": "c0ab4f6f720136448570a71fa87c83e93399361949b84d6e15f0edf38e35c905", + "work_graph_sha256": "aa475076249eecdcfb114cdde55118828e41eeeb6fe708d9197e4976d1aed60d", "digest_contract": "sha256(canonical-json({participants,boundaries}); sort_keys=true; separators=(',',':'); participant order is significant)", "participants": [ { "id": "stack", "kind": "repository", "repository": "The-Interdependency/stack", - "commit": "5b24db9a7fe40df4b2791e1137ade5de01c78942", + "commit": "6c3f94b1e6d77e8f1abd36edc53da5fda596b416", "path": "research/psychsocio-metafauna/", - "authority": "composition, provenance, and stack-local research placement", - "relation": "owner of this proposed cross-domain synthesis; owns no imported repository canon" + "authority": "composition, provenance, and stack-local research placement at workspace introduction", + "relation": "immutable introduction snapshot for this research workspace; current bytes are identified by the enclosing stack commit, avoiding recursive self-reference" }, { "id": "skill-lib", @@ -26,9 +26,9 @@ "id": "metapat", "kind": "repository", "repository": "The-Interdependency/metapat", - "commit": "d6699e21b11c8f8394998efc34a468e2d6efc8b0", - "authority": "METAPAT root semantics and application-layer question forms", - "relation": "supplies distinction, boundary, relation, transformation, registration, symbolic transfer, and domain restraint" + "commit": "34d954aa1e2092e615b03a180500f6b6977f501e", + "authority": "METAPAT semantics present in the stack-pinned canonical view", + "relation": "supplies root-preserving distinction/relation framing and domain-restraint rules available in libs/metapat; no later METAPAT commit is imported implicitly" }, { "id": "ucns", diff --git a/research/psychsocio-metafauna/tests/test_contracts.py b/research/psychsocio-metafauna/tests/test_contracts.py index 8f5522a..118da54 100644 --- a/research/psychsocio-metafauna/tests/test_contracts.py +++ b/research/psychsocio-metafauna/tests/test_contracts.py @@ -76,6 +76,22 @@ def test_work_graph_identity_and_digest(self) -> None: else: self.assertRegex(commit, HEX40) + stack_participant = next(item for item in participants if item["id"] == "stack") + self.assertEqual( + stack_participant["commit"], + "6c3f94b1e6d77e8f1abd36edc53da5fda596b416", + ) + self.assertEqual(stack_participant["path"], "research/psychsocio-metafauna/") + self.assertIn("introduction snapshot", stack_participant["relation"]) + self.assertIn("avoiding recursive self-reference", stack_participant["relation"]) + + metapat = next(item for item in participants if item["id"] == "metapat") + metapat_base = json.loads( + (STACK / "research" / "metapat" / "BASE.json").read_text(encoding="utf-8") + ) + self.assertEqual(metapat["commit"], metapat_base["source_commit"]) + self.assertIn("libs/metapat", metapat["relation"]) + payload = {"participants": participants, "boundaries": boundaries} canonical = json.dumps( payload, sort_keys=True, separators=(",", ":") @@ -83,6 +99,16 @@ def test_work_graph_identity_and_digest(self) -> None: observed = hashlib.sha256(canonical).hexdigest() self.assertEqual(observed, graph["work_graph_sha256"]) + def test_workflow_rechecks_when_metapat_base_changes(self) -> None: + workflow = (STACK / ".github" / "workflows" / "psychsocio-metafauna.yml").read_text( + encoding="utf-8" + ) + self.assertGreaterEqual( + workflow.count('"research/metapat/BASE.json"'), + 2, + "pull_request and push path filters must both watch the exact METAPAT pin", + ) + def test_non_transfer_boundaries_fail_closed(self) -> None: boundaries = load_json("WORK_GRAPH.json")["boundaries"] @@ -106,6 +132,75 @@ def test_non_transfer_boundaries_fail_closed(self) -> None: self.assertIsNone(boundaries["canon_selection"]) self.assertTrue(boundaries["hmmm"]) + def test_preregistration_decision_rules_are_independent_and_frozen(self) -> None: + prereg = (PROJECT / "PREREGISTRATION.md").read_text(encoding="utf-8") + + self.assertIn("predeclared difference-in-differences contrast", prereg) + self.assertIn( + "Eligible H2 cells are restricted to the comparable high-demand `P1`–`P4` profiles.", + prereg, + ) + self.assertIn("`PM`, `P0`, `PX`, and `PR` are excluded from H2", prereg) + self.assertIn("independent support is fixed to `absent`", prereg) + self.assertIn( + "`nonlinear coalescence threshold = UNRESOLVED` regardless of H2 status", + prereg, + ) + self.assertIn( + "This falsifies only the frozen super-additive interaction precursor", + prereg, + ) + self.assertNotIn("one declared piecewise-threshold model", prereg) + self.assertIn( + "does not reuse the candidate-capture configuration", + prereg, + ) + self.assertIn( + "A pair is H4-eligible only when **both** episodes have adoption at or above `0.75`", + prereg, + ) + self.assertIn( + "If no H4-eligible pairs exist, `H4 = UNRESOLVED`", + prereg, + ) + self.assertIn( + "at least `90%` of the corresponding high-demand `Pi` sides", + prereg, + ) + self.assertIn( + "high-demand side actually satisfies the frozen narrowing gates", + prereg, + ) + self.assertIn( + "For every held-out seed `16..31`, pair the `independent support = present` episode", + prereg, + ) + self.assertIn( + "then average those cell means with equal weight across eligible cells", + prereg, + ) + self.assertIn( + "equal-weight aggregate reproduction-allocation reduction is at least `0.15`", + prereg, + ) + self.assertIn( + "If any required H5 source episode or support/no-support pair is missing, `H5 = BLOCKED`", + prereg, + ) + self.assertIn( + "retire only the frozen hypothesis component actually falsified", + prereg, + ) + self.assertNotIn( + "retire coalescence as a distinct mechanism for this formal scope", + prereg, + ) + self.assertNotIn( + "a required support/no-support pair is missing, or the apparent repair", + prereg, + ) + self.assertNotIn("reduces persistence and reproduction demands", prereg) + def test_human_and_machine_entrypoints_agree(self) -> None: readme = (PROJECT / "README.md").read_text(encoding="utf-8") prereg = (PROJECT / "PREREGISTRATION.md").read_text(encoding="utf-8")