witsoc-bio 1.0.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (97) hide show
  1. witsoc_bio-1.0.0/PKG-INFO +18 -0
  2. witsoc_bio-1.0.0/pyproject.toml +32 -0
  3. witsoc_bio-1.0.0/src/witsoc_domain_bio/__init__.py +17 -0
  4. witsoc_bio-1.0.0/src/witsoc_domain_bio/__main__.py +18 -0
  5. witsoc_bio-1.0.0/src/witsoc_domain_bio/domain/capabilities.json +142 -0
  6. witsoc_bio-1.0.0/src/witsoc_domain_bio/domain/claim.schema.json +285 -0
  7. witsoc_bio-1.0.0/src/witsoc_domain_bio/domain/data/claim_classes.json +512 -0
  8. witsoc_bio-1.0.0/src/witsoc_domain_bio/domain/data/confounders.json +100 -0
  9. witsoc_bio-1.0.0/src/witsoc_domain_bio/domain/data/metrics.json +24 -0
  10. witsoc_bio-1.0.0/src/witsoc_domain_bio/domain/data/unit_taxonomy.json +36 -0
  11. witsoc_bio-1.0.0/src/witsoc_domain_bio/domain/doctrine/baselines_and_metrics.md +74 -0
  12. witsoc_bio-1.0.0/src/witsoc_domain_bio/domain/doctrine/claim_freeze.md +81 -0
  13. witsoc_bio-1.0.0/src/witsoc_domain_bio/domain/doctrine/confounders.md +61 -0
  14. witsoc_bio-1.0.0/src/witsoc_domain_bio/domain/doctrine/demotion.md +49 -0
  15. witsoc_bio-1.0.0/src/witsoc_domain_bio/domain/doctrine/denominators.md +78 -0
  16. witsoc_bio-1.0.0/src/witsoc_domain_bio/domain/doctrine/discovery_engine.md +19 -0
  17. witsoc_bio-1.0.0/src/witsoc_domain_bio/domain/doctrine/explorer.md +158 -0
  18. witsoc_bio-1.0.0/src/witsoc_domain_bio/domain/doctrine/generator.md +183 -0
  19. witsoc_bio-1.0.0/src/witsoc_domain_bio/domain/doctrine/genetics_to_function.md +20 -0
  20. witsoc_bio-1.0.0/src/witsoc_domain_bio/domain/doctrine/leakage.md +49 -0
  21. witsoc_bio-1.0.0/src/witsoc_domain_bio/domain/doctrine/open_problem.md +71 -0
  22. witsoc_bio-1.0.0/src/witsoc_domain_bio/domain/doctrine/provenance.md +62 -0
  23. witsoc_bio-1.0.0/src/witsoc_domain_bio/domain/doctrine/report_language.md +63 -0
  24. witsoc_bio-1.0.0/src/witsoc_domain_bio/domain/doctrine/researcher.md +159 -0
  25. witsoc_bio-1.0.0/src/witsoc_domain_bio/domain/doctrine/structure_function.md +20 -0
  26. witsoc_bio-1.0.0/src/witsoc_domain_bio/domain/doctrine/systems_context.md +18 -0
  27. witsoc_bio-1.0.0/src/witsoc_domain_bio/domain/doctrine/two_pack.md +56 -0
  28. witsoc_bio-1.0.0/src/witsoc_domain_bio/domain/doctrine/unconventional_pass.md +50 -0
  29. witsoc_bio-1.0.0/src/witsoc_domain_bio/domain/domain.json +485 -0
  30. witsoc_bio-1.0.0/src/witsoc_domain_bio/domain/operators.json +147 -0
  31. witsoc_bio-1.0.0/src/witsoc_domain_bio/domain/packet-types.json +15 -0
  32. witsoc_bio-1.0.0/src/witsoc_domain_bio/domain/receipt.schema.json +109 -0
  33. witsoc_bio-1.0.0/src/witsoc_domain_bio/domain/references/capability_map.md +12 -0
  34. witsoc_bio-1.0.0/src/witsoc_domain_bio/domain/schemas/problem-v2.schema.json +61 -0
  35. witsoc_bio-1.0.0/src/witsoc_domain_bio/domain/scripts/availability.py +128 -0
  36. witsoc_bio-1.0.0/src/witsoc_domain_bio/domain/scripts/biolib.py +536 -0
  37. witsoc_bio-1.0.0/src/witsoc_domain_bio/domain/scripts/bundle.py +341 -0
  38. witsoc_bio-1.0.0/src/witsoc_domain_bio/domain/scripts/check.py +413 -0
  39. witsoc_bio-1.0.0/src/witsoc_domain_bio/domain/scripts/classify_claim.py +427 -0
  40. witsoc_bio-1.0.0/src/witsoc_domain_bio/domain/scripts/corpus.py +156 -0
  41. witsoc_bio-1.0.0/src/witsoc_domain_bio/domain/scripts/counts.py +437 -0
  42. witsoc_bio-1.0.0/src/witsoc_domain_bio/domain/scripts/design.py +301 -0
  43. witsoc_bio-1.0.0/src/witsoc_domain_bio/domain/scripts/diagnostics.py +171 -0
  44. witsoc_bio-1.0.0/src/witsoc_domain_bio/domain/scripts/differential.py +257 -0
  45. witsoc_bio-1.0.0/src/witsoc_domain_bio/domain/scripts/discovery_ops.py +287 -0
  46. witsoc_bio-1.0.0/src/witsoc_domain_bio/domain/scripts/expression_diagnostics.py +670 -0
  47. witsoc_bio-1.0.0/src/witsoc_domain_bio/domain/scripts/gates/baseline_gate.py +117 -0
  48. witsoc_bio-1.0.0/src/witsoc_domain_bio/domain/scripts/gates/confounder_sweep.py +296 -0
  49. witsoc_bio-1.0.0/src/witsoc_domain_bio/domain/scripts/gates/context_protection.py +102 -0
  50. witsoc_bio-1.0.0/src/witsoc_domain_bio/domain/scripts/gates/contradiction_ledger.py +122 -0
  51. witsoc_bio-1.0.0/src/witsoc_domain_bio/domain/scripts/gates/denominator_gate.py +308 -0
  52. witsoc_bio-1.0.0/src/witsoc_domain_bio/domain/scripts/gates/leakage_audit.py +122 -0
  53. witsoc_bio-1.0.0/src/witsoc_domain_bio/domain/scripts/gates/metric_panel.py +136 -0
  54. witsoc_bio-1.0.0/src/witsoc_domain_bio/domain/scripts/gates/provenance_trace.py +113 -0
  55. witsoc_bio-1.0.0/src/witsoc_domain_bio/domain/scripts/gates/scope_language.py +144 -0
  56. witsoc_bio-1.0.0/src/witsoc_domain_bio/domain/scripts/gates/source_capability.py +115 -0
  57. witsoc_bio-1.0.0/src/witsoc_domain_bio/domain/scripts/gates/statistical_audit.py +165 -0
  58. witsoc_bio-1.0.0/src/witsoc_domain_bio/domain/scripts/missing.py +177 -0
  59. witsoc_bio-1.0.0/src/witsoc_domain_bio/domain/scripts/multiplicity.py +177 -0
  60. witsoc_bio-1.0.0/src/witsoc_domain_bio/domain/scripts/multiverse.py +251 -0
  61. witsoc_bio-1.0.0/src/witsoc_domain_bio/domain/scripts/negative_control/broken_pipeline_bundle.json +270 -0
  62. witsoc_bio-1.0.0/src/witsoc_domain_bio/domain/scripts/negative_control/broken_pipeline_claim.json +79 -0
  63. witsoc_bio-1.0.0/src/witsoc_domain_bio/domain/scripts/negative_control/broken_pipeline_metadata.csv +481 -0
  64. witsoc_bio-1.0.0/src/witsoc_domain_bio/domain/scripts/negative_control/context_drift_bundle.json +271 -0
  65. witsoc_bio-1.0.0/src/witsoc_domain_bio/domain/scripts/negative_control/context_drift_claim.json +79 -0
  66. witsoc_bio-1.0.0/src/witsoc_domain_bio/domain/scripts/negative_control/contradicted_confounder_bundle.json +284 -0
  67. witsoc_bio-1.0.0/src/witsoc_domain_bio/domain/scripts/negative_control/controls.json +81 -0
  68. witsoc_bio-1.0.0/src/witsoc_domain_bio/domain/scripts/negative_control/edited_prereg_bundle.json +270 -0
  69. witsoc_bio-1.0.0/src/witsoc_domain_bio/domain/scripts/negative_control/edited_prereg_claim.json +79 -0
  70. witsoc_bio-1.0.0/src/witsoc_domain_bio/domain/scripts/negative_control/fatal_contradiction_bundle.json +276 -0
  71. witsoc_bio-1.0.0/src/witsoc_domain_bio/domain/scripts/negative_control/fatal_contradiction_claim.json +79 -0
  72. witsoc_bio-1.0.0/src/witsoc_domain_bio/domain/scripts/negative_control/generic_response_design.csv +73 -0
  73. witsoc_bio-1.0.0/src/witsoc_domain_bio/domain/scripts/negative_control/generic_response_diagnostics.json +145 -0
  74. witsoc_bio-1.0.0/src/witsoc_domain_bio/domain/scripts/negative_control/generic_response_matrix.csv +161 -0
  75. witsoc_bio-1.0.0/src/witsoc_domain_bio/domain/scripts/negative_control/generic_response_signature.txt +10 -0
  76. witsoc_bio-1.0.0/src/witsoc_domain_bio/domain/scripts/negative_control/good_bundle.json +281 -0
  77. witsoc_bio-1.0.0/src/witsoc_domain_bio/domain/scripts/negative_control/good_claim.json +79 -0
  78. witsoc_bio-1.0.0/src/witsoc_domain_bio/domain/scripts/negative_control/good_metadata.csv +481 -0
  79. witsoc_bio-1.0.0/src/witsoc_domain_bio/domain/scripts/negative_control/good_prereg.json +15 -0
  80. witsoc_bio-1.0.0/src/witsoc_domain_bio/domain/scripts/negative_control/pseudoreplicated_metadata.csv +3001 -0
  81. witsoc_bio-1.0.0/src/witsoc_domain_bio/domain/scripts/negative_control/pseudoreplication_bundle.json +261 -0
  82. witsoc_bio-1.0.0/src/witsoc_domain_bio/domain/scripts/negative_control/pseudoreplication_claim.json +79 -0
  83. witsoc_bio-1.0.0/src/witsoc_domain_bio/domain/scripts/negative_control/retracted_source_bundle.json +270 -0
  84. witsoc_bio-1.0.0/src/witsoc_domain_bio/domain/scripts/negative_control/retracted_source_claim.json +79 -0
  85. witsoc_bio-1.0.0/src/witsoc_domain_bio/domain/scripts/negative_control/same_source_replicate_bundle.json +278 -0
  86. witsoc_bio-1.0.0/src/witsoc_domain_bio/domain/scripts/negative_control/scope_escalation_bundle.json +270 -0
  87. witsoc_bio-1.0.0/src/witsoc_domain_bio/domain/scripts/negative_control/scope_escalation_claim.json +79 -0
  88. witsoc_bio-1.0.0/src/witsoc_domain_bio/domain/scripts/negative_control/source_overreach_bundle.json +287 -0
  89. witsoc_bio-1.0.0/src/witsoc_domain_bio/domain/scripts/negative_control/source_overreach_claim.json +79 -0
  90. witsoc_bio-1.0.0/src/witsoc_domain_bio/domain/scripts/negative_control/unchecked_confounders_bundle.json +258 -0
  91. witsoc_bio-1.0.0/src/witsoc_domain_bio/domain/scripts/negative_control/unchecked_confounders_claim.json +79 -0
  92. witsoc_bio-1.0.0/src/witsoc_domain_bio/domain/scripts/power.py +239 -0
  93. witsoc_bio-1.0.0/src/witsoc_domain_bio/domain/scripts/report.py +170 -0
  94. witsoc_bio-1.0.0/src/witsoc_domain_bio/domain/scripts/tiers/executable.py +299 -0
  95. witsoc_bio-1.0.0/src/witsoc_domain_bio/domain/scripts/tiers/replication.py +178 -0
  96. witsoc_bio-1.0.0/src/witsoc_domain_bio/domain/scripts/tiers/structural.py +233 -0
  97. witsoc_bio-1.0.0/src/witsoc_domain_bio/pack.json +478 -0
@@ -0,0 +1,18 @@
1
+ Metadata-Version: 2.5
2
+ Name: witsoc-bio
3
+ Version: 1.0.0
4
+ Summary: Witsoc biology domain pack
5
+ Author: Witsoc contributors
6
+ License: Proprietary
7
+ Keywords: biology,causal-inference,open-problems,research
8
+ Classifier: Programming Language :: Python :: 3
9
+ Classifier: Programming Language :: Python :: 3 :: Only
10
+ Classifier: Programming Language :: Python :: 3.10
11
+ Classifier: Programming Language :: Python :: 3.11
12
+ Classifier: Programming Language :: Python :: 3.12
13
+ Classifier: Programming Language :: Python :: 3.13
14
+ Classifier: Topic :: Scientific/Engineering :: Bio-Informatics
15
+ Requires-Python: >=3.10
16
+ Description-Content-Type: text/markdown
17
+
18
+ The biology domain pack for the Witsoc research architecture. Install it directly only for inspection; the Witsoc skill installs and activates this pinned pack automatically when a biological task is routed.
@@ -0,0 +1,32 @@
1
+ [build-system]
2
+ requires = ["hatchling>=1.25"]
3
+ build-backend = "hatchling.build"
4
+
5
+ [project]
6
+ name = "witsoc-bio"
7
+ version = "1.0.0"
8
+ description = "Witsoc biology domain pack"
9
+ readme = {text = "The biology domain pack for the Witsoc research architecture. Install it directly only for inspection; the Witsoc skill installs and activates this pinned pack automatically when a biological task is routed.", content-type = "text/markdown"}
10
+ requires-python = ">=3.10"
11
+ license = {text = "Proprietary"}
12
+ authors = [{name = "Witsoc contributors"}]
13
+ dependencies = []
14
+ keywords = ["biology", "research", "open-problems", "causal-inference"]
15
+ classifiers = [
16
+ "Programming Language :: Python :: 3",
17
+ "Programming Language :: Python :: 3 :: Only",
18
+ "Programming Language :: Python :: 3.10",
19
+ "Programming Language :: Python :: 3.11",
20
+ "Programming Language :: Python :: 3.12",
21
+ "Programming Language :: Python :: 3.13",
22
+ "Topic :: Scientific/Engineering :: Bio-Informatics",
23
+ ]
24
+
25
+ [project.scripts]
26
+ witsoc-bio-pack = "witsoc_domain_bio.__main__:main"
27
+
28
+ [tool.hatch.build.targets.wheel]
29
+ packages = ["src/witsoc_domain_bio"]
30
+
31
+ [tool.hatch.build.targets.sdist]
32
+ include = ["src/witsoc_domain_bio", "pyproject.toml"]
@@ -0,0 +1,17 @@
1
+ """Installed resource access for the Witsoc biology domain pack."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import json
6
+ from importlib.resources import files
7
+ from typing import Any
8
+
9
+ __version__ = "1.0.0"
10
+
11
+
12
+ def metadata() -> dict[str, Any]:
13
+ return json.loads(files(__package__).joinpath("pack.json").read_text(encoding="utf-8"))
14
+
15
+
16
+ def domain_root():
17
+ return files(__package__).joinpath("domain")
@@ -0,0 +1,18 @@
1
+ """Inspect the installed biology pack without invoking the Witsoc core."""
2
+
3
+ from __future__ import annotations
4
+
5
+ import json
6
+
7
+ from . import domain_root, metadata
8
+
9
+
10
+ def main() -> int:
11
+ value = metadata()
12
+ value["installed_domain_root"] = str(domain_root())
13
+ print(json.dumps(value, indent=2, sort_keys=True))
14
+ return 0
15
+
16
+
17
+ if __name__ == "__main__":
18
+ raise SystemExit(main())
@@ -0,0 +1,142 @@
1
+ {
2
+ "schema": "witsoc.capability-manifest.v1",
3
+ "owner": "bio",
4
+ "version": 1,
5
+ "capabilities": [
6
+ {
7
+ "id": "source-status-map",
8
+ "summary": "Bind biological claims to primary sources, samples, corrections, and contradictions.",
9
+ "modes": ["SOURCE_SYNTHESIS", "OPEN_DISCOVERY"],
10
+ "roles": ["explorer", "researcher"],
11
+ "default": true,
12
+ "triggers": [],
13
+ "inputs": ["witsoc.target.v2"],
14
+ "outputs": ["witsoc.source-map.v2", "witsoc.obstruction.v2"],
15
+ "requires": ["retrievable source and dataset provenance"],
16
+ "load": ["domains/bio/doctrine/provenance.md"],
17
+ "commands": ["python3 \"$WITSOC_ROOT/domains/bio/scripts/discovery_ops.py\" plan --help", "python3 \"$WITSOC_ROOT/domains/bio/scripts/discovery_ops.py\" contract --help"],
18
+ "cost_class": "small",
19
+ "priority": 95
20
+ },
21
+ {
22
+ "id": "open-frontier",
23
+ "summary": "Reduce competing biological mechanisms through bounded discriminating episodes.",
24
+ "modes": ["OPEN_DISCOVERY"],
25
+ "roles": ["explorer", "researcher"],
26
+ "default": true,
27
+ "triggers": [],
28
+ "inputs": ["witsoc.target.v2", "witsoc.source-map.v2", "witsoc.research-delta.v1", "witsoc.obstruction.v2"],
29
+ "outputs": ["witsoc.frontier.v2", "witsoc.research-episode.v1", "witsoc.research-delta.v1", "witsoc.obstruction.v2"],
30
+ "requires": ["frozen evidence scope", "competing mechanism set"],
31
+ "load": ["domains/bio/doctrine/open_problem.md"],
32
+ "commands": ["python3 \"$WITSOC_ROOT/domains/bio/scripts/discovery_ops.py\" plan --help", "python3 \"$WITSOC_ROOT/domains/bio/scripts/discovery_ops.py\" contract --help"],
33
+ "cost_class": "medium",
34
+ "priority": 100
35
+ },
36
+ {
37
+ "id": "causal-perturbation",
38
+ "summary": "Audit intervention response, denominator, confounding, controls, replication, and scope.",
39
+ "modes": ["OPEN_DISCOVERY", "CLAIM_VERIFICATION", "ARTIFACT_PRODUCTION"],
40
+ "roles": ["explorer", "generator", "researcher"],
41
+ "default": false,
42
+ "triggers": ["perturbation", "knockdown", "knockout", "crispr", "intervention", "causal mechanism"],
43
+ "inputs": ["witsoc.target.v2", "witsoc.research-episode.v1", "witsoc.candidate.v2"],
44
+ "outputs": ["witsoc.candidate.v2", "witsoc.receipt.v2", "witsoc.obstruction.v2"],
45
+ "requires": ["unit-level data and metadata", "negative and positive controls"],
46
+ "load": ["domains/bio/doctrine/claim_freeze.md", "domains/bio/doctrine/denominators.md", "domains/bio/doctrine/confounders.md"],
47
+ "commands": ["python3 \"$WITSOC_ROOT/domains/bio/scripts/check.py\" --help"],
48
+ "cost_class": "medium",
49
+ "priority": 90
50
+ },
51
+ {
52
+ "id": "genetics-to-function",
53
+ "summary": "Trace variants through fine mapping, molecular consequence, effector, and functional phenotype.",
54
+ "modes": ["OPEN_DISCOVERY", "CROSS_DOMAIN"],
55
+ "roles": ["explorer", "researcher"],
56
+ "default": false,
57
+ "triggers": ["gwas", "variant", "fine mapping", "allele", "locus", "colocalization", "genetic interaction"],
58
+ "inputs": ["witsoc.target.v2", "witsoc.source-map.v2", "witsoc.transfer.v2"],
59
+ "outputs": ["witsoc.candidate.v2", "witsoc.obstruction.v2", "witsoc.transfer.v2"],
60
+ "requires": ["population and linkage context", "functional discriminator"],
61
+ "load": ["domains/bio/doctrine/genetics_to_function.md"],
62
+ "commands": ["python3 \"$WITSOC_ROOT/domains/bio/scripts/discovery_ops.py\" plan --help"],
63
+ "cost_class": "medium",
64
+ "priority": 80
65
+ },
66
+ {
67
+ "id": "structure-function",
68
+ "summary": "Convert molecular structures into specific, rescuable, orthogonally measured functional predictions.",
69
+ "modes": ["OPEN_DISCOVERY", "CROSS_DOMAIN"],
70
+ "roles": ["explorer", "researcher"],
71
+ "default": false,
72
+ "triggers": ["structure", "interface", "binding", "domain", "conformation", "mutation", "structure function"],
73
+ "inputs": ["witsoc.target.v2", "witsoc.source-map.v2", "witsoc.transfer.v2"],
74
+ "outputs": ["witsoc.candidate.v2", "witsoc.obstruction.v2", "witsoc.transfer.v2"],
75
+ "requires": ["construct and state provenance", "orthogonal functional readout"],
76
+ "load": ["domains/bio/doctrine/structure_function.md"],
77
+ "commands": ["python3 \"$WITSOC_ROOT/domains/bio/scripts/discovery_ops.py\" plan --help"],
78
+ "cost_class": "medium",
79
+ "priority": 75
80
+ },
81
+ {
82
+ "id": "systems-context",
83
+ "summary": "Resolve state, composition, feedback, compensation, spatial, temporal, and multi-modal context.",
84
+ "modes": ["OPEN_DISCOVERY", "CLAIM_VERIFICATION", "CROSS_DOMAIN"],
85
+ "roles": ["explorer", "researcher"],
86
+ "default": false,
87
+ "triggers": ["multi-omics", "single-cell", "spatial", "cell state", "tissue", "feedback", "compensation"],
88
+ "inputs": ["witsoc.target.v2", "witsoc.source-map.v2", "witsoc.candidate.v2"],
89
+ "outputs": ["witsoc.candidate.v2", "witsoc.obstruction.v2", "witsoc.transfer.v2"],
90
+ "requires": ["unit alignment across measurements", "context metadata"],
91
+ "load": ["domains/bio/doctrine/systems_context.md", "domains/bio/doctrine/confounders.md"],
92
+ "commands": ["python3 \"$WITSOC_ROOT/domains/bio/scripts/expression_diagnostics.py\" --help"],
93
+ "cost_class": "medium",
94
+ "priority": 75
95
+ },
96
+ {
97
+ "id": "discriminating-design",
98
+ "summary": "Design controls, estimands, sampling, power, and outcomes that distinguish live mechanisms.",
99
+ "modes": ["OPEN_DISCOVERY", "ARTIFACT_PRODUCTION"],
100
+ "roles": ["explorer", "generator", "researcher"],
101
+ "default": false,
102
+ "triggers": ["experiment", "study design", "control", "power", "replication", "preregister"],
103
+ "inputs": ["witsoc.frontier.v2", "witsoc.obstruction.v2", "witsoc.research-episode.v1"],
104
+ "outputs": ["witsoc.candidate.v2", "witsoc.research-episode.v1"],
105
+ "requires": ["named competing explanations", "measurement feasibility"],
106
+ "load": ["domains/bio/doctrine/baselines_and_metrics.md"],
107
+ "commands": ["python3 \"$WITSOC_ROOT/domains/bio/scripts/design.py\" --help", "python3 \"$WITSOC_ROOT/domains/bio/scripts/power.py\" --help"],
108
+ "cost_class": "small",
109
+ "priority": 70
110
+ },
111
+ {
112
+ "id": "evidence-adapter",
113
+ "summary": "Recompute pinned evidence and enforce denominator, provenance, contradiction, confounding, and scope gates.",
114
+ "modes": ["CLAIM_VERIFICATION", "ARTIFACT_PRODUCTION", "REPAIR", "OPEN_DISCOVERY"],
115
+ "roles": ["generator", "explorer"],
116
+ "default": true,
117
+ "triggers": [],
118
+ "inputs": ["witsoc.candidate.v2", "witsoc.target.v2"],
119
+ "outputs": ["witsoc.receipt.v2", "witsoc.obstruction.v2"],
120
+ "requires": ["pinned inputs and analysis context"],
121
+ "load": ["domains/bio/doctrine/report_language.md", "domains/bio/doctrine/provenance.md"],
122
+ "commands": ["python3 \"$WITSOC_ROOT/domains/bio/scripts/check.py\" --help"],
123
+ "cost_class": "medium",
124
+ "priority": 85
125
+ },
126
+ {
127
+ "id": "cross-domain-transfer",
128
+ "summary": "Exchange typed models and discriminators while retaining biological scope ownership.",
129
+ "modes": ["CROSS_DOMAIN"],
130
+ "roles": ["explorer", "researcher"],
131
+ "default": true,
132
+ "triggers": [],
133
+ "inputs": ["witsoc.transfer.v2", "witsoc.obstruction.v2", "witsoc.candidate.v2"],
134
+ "outputs": ["witsoc.transfer.v2", "witsoc.obstruction.v2", "witsoc.candidate.v2"],
135
+ "requires": ["scope and invariant audit"],
136
+ "load": ["domains/bio/doctrine/two_pack.md"],
137
+ "commands": ["python3 \"$WITSOC_ROOT/domains/bio/scripts/discovery_ops.py\" plan --help"],
138
+ "cost_class": "small",
139
+ "priority": 90
140
+ }
141
+ ]
142
+ }
@@ -0,0 +1,285 @@
1
+ {
2
+ "$schema": "http://json-schema.org/draft-07/schema#",
3
+ "$id": "bio-claim-v1",
4
+ "title": "Frozen perturbation claim",
5
+ "description": "Extends frame-claim-v1 with everything that can change what a perturbation result MEANS. The rule that makes this worth writing out: freeze every dimension even when the value is unknown. An explicit 'unknown' and a silently omitted field read identically in a report and have entirely different consequences — the first is a stated limit, the second is a limit nobody knows about. A changed value here is a NEW claim with a new hash and its own lineage; it never mutates this one.",
6
+ "type": "object",
7
+ "additionalProperties": true,
8
+ "required": [
9
+ "claim_id",
10
+ "exact_statement",
11
+ "target_sha256",
12
+ "organism",
13
+ "claim_class",
14
+ "biological_context",
15
+ "perturbation",
16
+ "assay",
17
+ "dataset",
18
+ "claimed_effect",
19
+ "falsification_conditions",
20
+ "allowed_scope",
21
+ "frozen_conditions"
22
+ ],
23
+ "properties": {
24
+ "claim_id": {
25
+ "type": "string",
26
+ "minLength": 1
27
+ },
28
+ "target_sha256": {
29
+ "description": "SHA-256 over the canonical form of this claim with this field removed. Recomputed at every gate rather than read back.",
30
+ "type": "string",
31
+ "pattern": "^[0-9a-f]{64}$"
32
+ },
33
+ "organism": {
34
+ "type": "string",
35
+ "minLength": 1
36
+ },
37
+ "claim_class": {
38
+ "description": "Which row of data/claim_classes.json this is. The class sets the ceiling, so an unclassified claim has no ceiling and cannot be audited.",
39
+ "enum": [
40
+ "cell_level_association",
41
+ "guide_conditioned_within_screen",
42
+ "target_conditioned",
43
+ "donor_replicated_population",
44
+ "in_vivo_animal",
45
+ "organoid_patient_model",
46
+ "spatial_tissue",
47
+ "network_causal_method",
48
+ "model_predictive_superiority",
49
+ "literature_only"
50
+ ]
51
+ },
52
+ "generalization_axis": {
53
+ "description": "The axis along which generality is claimed — cell_line, donor, perturbation, context, or none. This decides which leakage findings are fatal rather than cosmetic.",
54
+ "enum": [
55
+ "none",
56
+ "cell_line",
57
+ "donor",
58
+ "perturbation",
59
+ "context",
60
+ "time",
61
+ "dose"
62
+ ]
63
+ },
64
+ "biological_context": {
65
+ "type": "object",
66
+ "required": [
67
+ "cell_type",
68
+ "tissue",
69
+ "disease_state",
70
+ "donor_or_model_system"
71
+ ],
72
+ "properties": {
73
+ "cell_type": {
74
+ "type": "string",
75
+ "minLength": 1
76
+ },
77
+ "tissue": {
78
+ "type": "string",
79
+ "minLength": 1
80
+ },
81
+ "disease_state": {
82
+ "type": "string",
83
+ "minLength": 1
84
+ },
85
+ "donor_or_model_system": {
86
+ "type": "string",
87
+ "minLength": 1
88
+ }
89
+ }
90
+ },
91
+ "perturbation": {
92
+ "type": "object",
93
+ "required": [
94
+ "entity",
95
+ "modality",
96
+ "dose",
97
+ "duration",
98
+ "delivery"
99
+ ],
100
+ "properties": {
101
+ "entity": {
102
+ "type": "string",
103
+ "minLength": 1
104
+ },
105
+ "modality": {
106
+ "type": "string",
107
+ "minLength": 1
108
+ },
109
+ "dose": {
110
+ "type": "string",
111
+ "minLength": 1
112
+ },
113
+ "duration": {
114
+ "type": "string",
115
+ "minLength": 1
116
+ },
117
+ "delivery": {
118
+ "type": "string",
119
+ "minLength": 1
120
+ },
121
+ "is_combination": {
122
+ "description": "True for a combination claim, which makes the additive baseline mandatory — it is the baseline elaborate models most often lose to.",
123
+ "type": "boolean"
124
+ }
125
+ }
126
+ },
127
+ "assay": {
128
+ "type": "object",
129
+ "required": [
130
+ "type",
131
+ "readout",
132
+ "experimental_unit",
133
+ "controls",
134
+ "batches",
135
+ "replicates"
136
+ ],
137
+ "properties": {
138
+ "type": {
139
+ "type": "string",
140
+ "minLength": 1
141
+ },
142
+ "readout": {
143
+ "description": "What was physically measured. Every scope-language check works back from this: a transcriptomic readout cannot reach mechanism, organism, or clinic on its own.",
144
+ "type": "string",
145
+ "minLength": 1
146
+ },
147
+ "experimental_unit": {
148
+ "description": "The unit the claim is about. Usually decided implicitly by whatever the analysis groups by, which is exactly why it is frozen here instead.",
149
+ "type": "string",
150
+ "minLength": 1
151
+ },
152
+ "controls": {
153
+ "type": "string",
154
+ "minLength": 1
155
+ },
156
+ "batches": {
157
+ "type": "string",
158
+ "minLength": 1
159
+ },
160
+ "replicates": {
161
+ "type": "string",
162
+ "minLength": 1
163
+ }
164
+ }
165
+ },
166
+ "dataset": {
167
+ "type": "object",
168
+ "required": [
169
+ "id",
170
+ "version",
171
+ "source",
172
+ "preprocessing_state"
173
+ ],
174
+ "properties": {
175
+ "id": {
176
+ "type": "string",
177
+ "minLength": 1
178
+ },
179
+ "version": {
180
+ "type": "string",
181
+ "minLength": 1
182
+ },
183
+ "source": {
184
+ "type": "string",
185
+ "minLength": 1
186
+ },
187
+ "license": {
188
+ "type": "string"
189
+ },
190
+ "preprocessing_state": {
191
+ "description": "Raw, filtered, normalized, integrated. Two analyses of 'the same dataset' at different preprocessing states are analyses of different data.",
192
+ "type": "string",
193
+ "minLength": 1
194
+ }
195
+ }
196
+ },
197
+ "model_evaluation": {
198
+ "description": "Present only for a predictive claim. Its absence is what makes the baseline and metric gates not-applicable rather than failed.",
199
+ "type": "object",
200
+ "required": [
201
+ "model",
202
+ "baseline",
203
+ "split"
204
+ ],
205
+ "properties": {
206
+ "model": {
207
+ "type": "string"
208
+ },
209
+ "model_version": {
210
+ "type": "string"
211
+ },
212
+ "training_data": {
213
+ "type": "string"
214
+ },
215
+ "baseline": {
216
+ "type": "string"
217
+ },
218
+ "split": {
219
+ "type": "string"
220
+ },
221
+ "evaluation_unit": {
222
+ "type": "string"
223
+ }
224
+ }
225
+ },
226
+ "claimed_effect": {
227
+ "type": "object",
228
+ "required": [
229
+ "direction",
230
+ "magnitude",
231
+ "endpoint"
232
+ ],
233
+ "properties": {
234
+ "direction": {
235
+ "enum": [
236
+ "increase",
237
+ "decrease",
238
+ "change",
239
+ "no_change",
240
+ "unknown"
241
+ ]
242
+ },
243
+ "magnitude": {
244
+ "type": "string",
245
+ "minLength": 1
246
+ },
247
+ "endpoint": {
248
+ "type": "string",
249
+ "minLength": 1
250
+ }
251
+ }
252
+ },
253
+ "falsification_conditions": {
254
+ "description": "What would show this claim is wrong. A claim with no stated way to be wrong cannot be audited: there is nothing for a check to fail.",
255
+ "type": "array",
256
+ "minItems": 1,
257
+ "items": {
258
+ "type": "string",
259
+ "minLength": 10
260
+ }
261
+ },
262
+ "allowed_scope": {
263
+ "description": "The bounds inside which a result would hold. Written before the result, because after it the temptation is to write the bounds that fit.",
264
+ "type": "string",
265
+ "minLength": 10
266
+ },
267
+ "derived_from": {
268
+ "description": "The claim hash this one was narrowed, widened, or repaired from. Present whenever a context changed: the lineage is recorded, the old claim is not edited.",
269
+ "type": "string",
270
+ "pattern": "^[0-9a-f]{64}$"
271
+ },
272
+ "exact_statement": {
273
+ "description": "The claim in one sentence, in the form: perturbing X with modality P changes response Y in context Z. If it cannot be written this way, it is more than one claim. The frame's claim calls this `exact_statement` and so does this one. It was `statement` until a contract-shape check noticed that a pack declaring `extends: frame-claim-v1` while renaming one of its required fields is not extending it — and that the frame's reducer, reading the name it expects, had been recording an EMPTY statement for every claim this pack froze. The campaign state was unreadable and nothing failed.",
274
+ "type": "string",
275
+ "minLength": 20
276
+ },
277
+ "frozen_conditions": {
278
+ "description": "What must not drift, under the name the frame reads. These are the same dimensions this field's own gates already diff against — collecting them here is what lets the FRAME see them too, rather than each pack protecting its target in a vocabulary only it understands.",
279
+ "type": "object"
280
+ },
281
+ "status": {
282
+ "description": "Inherited from frame-claim-v1; declared here so the extension is checkable."
283
+ }
284
+ }
285
+ }