From 01014cbe772ea5a59ccbc55266222433944c7368 Mon Sep 17 00:00:00 2001 From: Ali Romman <226877337+aliromman@users.noreply.github.com> Date: Mon, 26 Oct 2026 11:59:51 -0500 Subject: [PATCH 1/5] test: retain frozen research routes across priority revisions (cherry picked from commit ba8a9e640e1983f3c29993fefa3f46e8ed03313a) --- tests/fixtures/README.md | 41 ++++++ tests/fixtures/research-routing-v7.json | 87 ++++++++++++ tests/test_research_current_assignment.py | 164 +++++++++++++++------- 3 files changed, 242 insertions(+), 50 deletions(-) create mode 100644 tests/fixtures/README.md create mode 100644 tests/fixtures/research-routing-v7.json diff --git a/tests/fixtures/README.md b/tests/fixtures/README.md new file mode 100644 index 0000000000..472a6a502f --- /dev/null +++ b/tests/fixtures/README.md @@ -0,0 +1,41 @@ +# Frozen research routing fixture + +`research-routing-v7.json` retains two exact task cards from priority revision 7: +`portable-replay` and `centre-path-sharing`. They exercise the generic-baseline +and historical-ceiling routes in `choose_current_research_task.py`. The fixture +records the source commit, path and SHA256. The card objects are unchanged. + +The source is commit `553d26d796fde9871ff2661a49ac7732e945410f`, file +`docs/research/agent-task-catalog.json`. The test places these cards in a small +catalogue with one track of weight 100. This carrier is test data, not a change +to research priorities. Current cards are checked separately from the live +catalogue. Every live card must preserve its other fields; each distinct direct +command also passes through both real CLIs. + +The CLI fixture copies the two real scripts. It creates inert reference files +for path validation and copies the current selected record for receipt fields. +It does not execute those references or verify a mathematical claim. Missing +references, sparse omissions, deleted files and staged replacements have separate +negative tests. No Git history, network request or change to the live catalogue +is needed to run the fixture. + +```sh +python3 -B -m unittest discover -s tests -p test_research_current_assignment.py -v +python3 -B -m unittest discover -s tests -p test_research_assignment.py -v +``` + +This fixture repairs the CI handoff in +[Discussion 5722](https://github.com/CrocSwap/integer-mult-bounds/discussions/5722). +The [investigation](https://github.com/CrocSwap/integer-mult-bounds/discussions/5758) +records the failure, checks and publication status. The original scripts, task +catalogue and selected frontier are unchanged. + +On base `de5ec2e7a6074068452f45b1a191b5c72832df4a`, the old suite has eight +failures and two errors. After the repair, all 12 current-assignment tests pass +under Python 3.14.7 and Python 3.12.14, including an isolated optimized run. +All 16 related assignment tests pass under Python 3.12.14. This is test coverage, +not a mathematical replay. See the investigation for hosted-plan status. + +Retain the original catalogue, routing and test authors, including Douglas +Colkitt, Ali Romman and Mihir Srivastava. New fixture and test repair: Ali Romman +with substantial OpenAI Codex assistance. No subagents. Apache-2.0. diff --git a/tests/fixtures/research-routing-v7.json b/tests/fixtures/research-routing-v7.json new file mode 100644 index 0000000000..f5d52ac21d --- /dev/null +++ b/tests/fixtures/research-routing-v7.json @@ -0,0 +1,87 @@ +{ + "source_commit": "553d26d796fde9871ff2661a49ac7732e945410f", + "source_path": "docs/research/agent-task-catalog.json", + "source_sha256": "f7a48bfa2659b88378282a8eee7d9fe52cdf505594124c4d1686b58510fffd72", + "scope": "Two exact revision-7 cards. The test carrier is not a research allocation.", + "cards": [ + { + "id": "centre-path-sharing", + "question": "Can the 64-per-call centre path (eight rank-8 COPY/ERASE totals through the private temporary) be shared across calls or shrunk?", + "starting_points": [ + "docs/research/research-family-status.md", + "research/complex-local-word-ceiling/README.md", + "research/split-centres-global/proofs/PR386-BIT-GEOMETRY.txt", + "certificates/selected-result.json" + ], + "methods": [ + "Derive a fully charged favorable relaxation for sharing one centre path across k calls, including restoration, hosting and precision.", + "Prove a lower bound on copied information per call for the selected decoder contract." + ], + "acceptance_gate": "Show the changed centre charge and copy profile per call with every added restoration or hosting cost charged, and its ceiling via ceiling.ceiling(centre=...). A scoped local result may be retained without a complete supplier. Expanding it into further construction rounds requires the family-level budget and obligation gate in research-family-status.md; an optimistic passing relaxation alone is not acceptance.", + "first_step": { + "command": [ + "python3", + "-B", + "research/complex-local-word-ceiling/verify.py" + ], + "expected": "PASS_COMPLEX_LOCAL_WORD_CEILING", + "inspect": "Read the selected word's per-call local profile, its packing ceiling and the lever table; run levers.py for the ideal budget of the lever you target.", + "scope": "Positive control and planning budget only; this is not a new construction or full cold replay." + }, + "first_experiment": "Write the per-call centre charge and copy children for sharing across k = 2 calls, charge the sharing overhead, and screen it; stop this route if even the ideal sharing gains under 10%. Ideal budgets: free 2.80x, shared by two 1.90x (levers.py).", + "bottleneck_link": "The centre path consumes 64 of about 99.6 unpaid coordinates per call, i.e. about 64% of the raw deficit.", + "allowed_variations": [ + "One sharing pattern across a fixed number of calls.", + "One reduced copied-total contract for the existing decoder.", + "If the coverage law, template or guard changes, derive an applicable fully charged replacement bound instead of applying the incumbent ceiling outside its scope." + ], + "scope_change_triggers": [ + "Removing copies without a replacement contract for the decoder's copied totals.", + "Continuing a partial cost improvement while leaving the same unpriced consumer, restoration or central-readout obligation unresolved; refresh the family expansion decision first. Local product-retiming evidence has a narrow scope and is not a ban on changed graphs or contracts." + ], + "overlap_terms": [ + "centre path", + "copied totals", + "private temporary", + "shared centre", + "batching" + ] + }, + { + "id": "portable-replay", + "question": "Can one reproducible environment or artifact-comparison failure be repaired?", + "starting_points": [ + "research/gzip-container-reproducibility/README.md", + "docs/ci-verification.md" + ], + "methods": [ + "Reproduce one portability failure and add a minimal cross-environment fix.", + "Audit one canonical-payload comparison for omitted proof-relevant fields." + ], + "acceptance_gate": "Preserve immutable source hashes and proof-relevant content; a different compressed byte stream alone is not a mathematical mismatch.", + "first_step": { + "command": [ + "python3", + "-B", + "scripts/research_baseline.py" + ], + "expected": "PASS_RESEARCH_BASELINE_BINDINGS_ONLY", + "inspect": "Read the gzip-container reproducibility examples and distinguish frozen source bytes from regenerated payloads.", + "scope": "Positive control / source-bound orientation only; this is not a new construction or full cold replay." + }, + "first_experiment": "Reproduce one specific mismatch or audit one canonical comparison for omitted proof-relevant fields.", + "bottleneck_link": "Portable exact checks prevent environment failures from blocking valid contributions.", + "allowed_variations": [ + "One interpreter/version mismatch or one payload field comparison." + ], + "scope_change_triggers": [ + "Removing immutable-source pins because generated compressed bytes differ." + ], + "overlap_terms": [ + "gzip container", + "reproducibility", + "canonical payload" + ] + } + ] +} diff --git a/tests/test_research_current_assignment.py b/tests/test_research_current_assignment.py index 860f6b9b9e..c524c0037f 100644 --- a/tests/test_research_current_assignment.py +++ b/tests/test_research_current_assignment.py @@ -1,9 +1,15 @@ -"""Current orientation must preserve frozen task-selection evidence.""" +"""Current orientation must preserve frozen task-selection evidence. + +Frozen fixtures and live-catalog coverage: Ali Romman with OpenAI Codex +assistance. Retain the original routing and test authors. Apache-2.0. +""" import copy +from contextlib import contextmanager import importlib.util import json from pathlib import Path import subprocess +import shutil import sys import tempfile import unittest @@ -15,16 +21,49 @@ LEGACY = current.LEGACY legacy = current.runpy.run_path(str(LEGACY)) CATALOG = json.loads((ROOT / legacy["CATALOG"]).read_text(encoding="utf-8")) +FROZEN = json.loads((ROOT / "tests/fixtures/research-routing-v7.json").read_text()) +FROZEN_CATALOG = { + "schema_version": 1, "priority_revision": 7, + "priority_log": "docs/research/routing-fixture.md", + "tracks": [{"id": "routing-fixtures", "weight": 100, "tasks": FROZEN["cards"]}], +} + + +@contextmanager +def frozen_cli_tree(): + """Run the real scripts with exact old cards and inert reference files.""" + with tempfile.TemporaryDirectory() as directory: + root = Path(directory) + required = {FROZEN_CATALOG["priority_log"], + "scripts/research_selected_baseline.py", "scripts/research_package.py", + "research/historical-complex-ceiling-replay/VERIFY.json", + "research/historical-complex-ceiling-replay/verify.py"} + for card in FROZEN["cards"]: + required.update(card["starting_points"]) + required.add(card["first_step"]["command"][-1]) + for name in required: + path = root / name + path.parent.mkdir(parents=True, exist_ok=True) + path.write_text("Inert reference for CLI validation only.\n") + for name in ("choose_research_task.py", "choose_current_research_task.py"): + shutil.copyfile(ROOT / "scripts" / name, root / "scripts" / name) + path = root / legacy["CATALOG"] + path.parent.mkdir(parents=True, exist_ok=True) + path.write_text(json.dumps(FROZEN_CATALOG)) + path = root / "certificates/selected-result.json" + path.parent.mkdir(parents=True, exist_ok=True) + shutil.copyfile(ROOT / "certificates/selected-result.json", path) + yield root class CurrentResearchAssignmentTests(unittest.TestCase): - def test_every_frozen_card_and_other_fields_stay_exact(self): - before = copy.deepcopy(CATALOG) + def check_card_round_trips(self, catalog): + before = copy.deepcopy(catalog) resolved = 0 historical = 0 - for track in CATALOG["tracks"]: + for track in catalog["tracks"]: for task in track["tasks"]: - result = legacy["select"](CATALOG, "a1" * 16, task_id=task["id"]) + result = legacy["select"](catalog, "a1" * 16, task_id=task["id"]) original = copy.deepcopy(result) current.resolve_current_first_steps(result, ROOT) card = result["suggestions"][0] @@ -55,19 +94,25 @@ def test_every_frozen_card_and_other_fields_stay_exact(self): self.assertTrue(card.pop("first_step_resolution")) card["first_step"] = card.pop("catalog_first_step") self.assertEqual(result, original) - self.assertEqual(resolved, 16) - self.assertEqual(historical, 4) - self.assertEqual(CATALOG, before) + self.assertEqual(catalog, before) + return resolved, historical + + def test_frozen_routes_and_other_fields_stay_exact(self): + self.assertEqual(self.check_card_round_trips(FROZEN_CATALOG), (1, 1)) + + def test_every_live_card_and_other_fields_stay_exact(self): + self.assertTrue(CATALOG["tracks"]) + self.check_card_round_trips(CATALOG) def test_only_exact_generic_command_is_resolved(self): - result = copy.deepcopy(legacy["select"](CATALOG, "0" * 32, task_id="portable-replay")) + result = copy.deepcopy(legacy["select"](FROZEN_CATALOG, "0" * 32, task_id="portable-replay")) result["suggestions"][0]["first_step"]["command"].append("--historical-fixture") original = copy.deepcopy(result) self.assertEqual(current.resolve_current_first_steps(result, ROOT), []) self.assertEqual(result, original) def test_missing_current_helper_does_not_change_receipt(self): - result = legacy["select"](CATALOG, "0" * 32, task_id="portable-replay") + result = legacy["select"](FROZEN_CATALOG, "0" * 32, task_id="portable-replay") original = copy.deepcopy(result) with tempfile.TemporaryDirectory() as directory: with self.assertRaisesRegex(ValueError, "missing current first-step script"): @@ -82,7 +127,7 @@ def test_nonexact_scientific_commands_are_not_reinterpreted(self): ): with self.subTest(command=command): result = copy.deepcopy(legacy["select"]( - CATALOG, "0" * 32, task_id="centre-path-sharing")) + FROZEN_CATALOG, "0" * 32, task_id="centre-path-sharing")) result["suggestions"][0]["first_step"]["command"] = command original = copy.deepcopy(result) self.assertEqual(current.resolve_current_first_steps(result, ROOT), []) @@ -102,34 +147,52 @@ def test_missing_historical_reference_leaves_all_cards_unchanged(self): path = root / name path.parent.mkdir(parents=True, exist_ok=True) path.write_text("fixture\n") - result = legacy["select"](CATALOG, "0" * 32, task_id="portable-replay") + result = legacy["select"](FROZEN_CATALOG, "0" * 32, task_id="portable-replay") result["suggestions"] += legacy["select"]( - CATALOG, "0" * 32, task_id="centre-path-sharing")["suggestions"] + FROZEN_CATALOG, "0" * 32, task_id="centre-path-sharing")["suggestions"] original = copy.deepcopy(result) with self.assertRaises(ValueError) as raised: current.resolve_current_first_steps(result, root) self.assertIn(absent, str(raised.exception)) self.assertEqual(result, original) - def cli(self, script, args): - return subprocess.run([sys.executable, "-B", str(script), *args], cwd=ROOT, + def cli(self, script, args, root=ROOT): + return subprocess.run([sys.executable, "-B", str(root / "scripts" / Path(script).name), *args], cwd=root, capture_output=True, text=True, encoding="utf-8") def test_cli_preserves_legacy_output_and_emits_both_commands(self): - args = ["--seed", "0" * 32, "--task", "portable-replay"] - original = self.cli(LEGACY, args) - output = self.cli(ROOT / "scripts/choose_current_research_task.py", args) - self.assertEqual(original.returncode, 0) - self.assertEqual(output.returncode, 0) - old, new = json.loads(original.stdout), json.loads(output.stdout) - card = new["suggestions"][0] - self.assertEqual(card["first_step"]["command"], - ["python3", "-B", "scripts/research_selected_baseline.py"]) - self.assertEqual(card.pop("catalog_first_step"), old["suggestions"][0]["first_step"]) - self.assertTrue(card.pop("first_step_resolution")) - card["first_step"] = old["suggestions"][0]["first_step"] - self.assertEqual(new, old) - self.assertEqual(self.cli(LEGACY, args).stdout, original.stdout) + with frozen_cli_tree() as root: + args = ["--seed", "0" * 32, "--task", "portable-replay"] + original = self.cli(LEGACY, args, root) + output = self.cli(ROOT / "scripts/choose_current_research_task.py", args, root) + self.assertEqual(original.returncode, 0) + self.assertEqual(output.returncode, 0) + old, new = json.loads(original.stdout), json.loads(output.stdout) + card = new["suggestions"][0] + self.assertEqual(card["first_step"]["command"], + ["python3", "-B", "scripts/research_selected_baseline.py"]) + self.assertEqual(card.pop("catalog_first_step"), old["suggestions"][0]["first_step"]) + self.assertTrue(card.pop("first_step_resolution")) + card["first_step"] = old["suggestions"][0]["first_step"] + self.assertEqual(new, old) + self.assertEqual(self.cli(LEGACY, args, root).stdout, original.stdout) + + def test_live_cli_preserves_each_unmapped_command(self): + checked = {tuple(card["first_step"]["command"]) for card in FROZEN["cards"]} + for track in CATALOG["tracks"]: + for task in track["tasks"]: + command = tuple(task["first_step"]["command"]) + if command in checked: + continue + checked.add(command) + with self.subTest(task=task["id"]): + args = ["--seed", "0" * 32, "--task", task["id"]] + original = self.cli(LEGACY, args) + output = self.cli(ROOT / "scripts/choose_current_research_task.py", args) + self.assertEqual(original.returncode, 0, original.stderr) + self.assertEqual(output.returncode, 0, output.stderr) + self.assertEqual(json.loads(output.stdout), json.loads(original.stdout)) + self.assertEqual(self.cli(LEGACY, args).stdout, original.stdout) def test_help_and_error_preserve_child_status_and_output(self): for args, code in ((["--help"], 0), (["--unknown-option"], 2), (["--seed", "bad"], 2)): @@ -139,23 +202,24 @@ def test_help_and_error_preserve_child_status_and_output(self): self.assertEqual((output.stdout, output.stderr), (original.stdout, original.stderr)) def test_cli_distinguishes_current_orientation_from_historical_control(self): - args = ["--seed", "0" * 32, "--task", "complex-new-helper-inventory"] - original = self.cli(LEGACY, args) - output = self.cli(ROOT / "scripts/choose_current_research_task.py", args) - self.assertEqual(original.returncode, 0, original.stderr) - self.assertEqual(output.returncode, 0, output.stderr) - old, new = json.loads(original.stdout), json.loads(output.stdout) - card = new["suggestions"][0] - self.assertEqual(card["first_step"]["command"][2], "scripts/research_selected_baseline.py") - self.assertEqual(card["first_step"]["expected"], "PASS_RESEARCH_BASELINE_BINDINGS_ONLY") - follow_up, = card.pop("follow_up_steps") - self.assertEqual(follow_up["command"][-1], "research/historical-complex-ceiling-replay") - self.assertIn("historical", follow_up["scope"].lower()) - self.assertIn("cost law", follow_up["inspect"]) - self.assertTrue(card.pop("first_step_resolution")) - card["first_step"] = card.pop("catalog_first_step") - self.assertEqual(new, old) - self.assertEqual(self.cli(LEGACY, args).stdout, original.stdout) + with frozen_cli_tree() as root: + args = ["--seed", "0" * 32, "--task", "centre-path-sharing"] + original = self.cli(LEGACY, args, root) + output = self.cli(ROOT / "scripts/choose_current_research_task.py", args, root) + self.assertEqual(original.returncode, 0, original.stderr) + self.assertEqual(output.returncode, 0, output.stderr) + old, new = json.loads(original.stdout), json.loads(output.stdout) + card = new["suggestions"][0] + self.assertEqual(card["first_step"]["command"][2], "scripts/research_selected_baseline.py") + self.assertEqual(card["first_step"]["expected"], "PASS_RESEARCH_BASELINE_BINDINGS_ONLY") + follow_up, = card.pop("follow_up_steps") + self.assertEqual(follow_up["command"][-1], "research/historical-complex-ceiling-replay") + self.assertIn("historical", follow_up["scope"].lower()) + self.assertIn("cost law", follow_up["inspect"]) + self.assertTrue(card.pop("first_step_resolution")) + card["first_step"] = card.pop("catalog_first_step") + self.assertEqual(new, old) + self.assertEqual(self.cli(LEGACY, args, root).stdout, original.stdout) def test_sparse_historical_references_require_unchanged_head_entries(self): with tempfile.TemporaryDirectory() as directory: @@ -178,12 +242,12 @@ def git(*args): git("update-index", "--skip-worktree", *omitted) for name in omitted: (root / name).unlink() - result = legacy["select"](CATALOG, "0" * 32, task_id="coverage-law-change") + result = legacy["select"](FROZEN_CATALOG, "0" * 32, task_id="centre-path-sharing") self.assertEqual(current.resolve_current_first_steps(result, root), sorted(omitted)) # Ordinary deletion must not acquire the deliberate-sparse exemption. changed = omitted[-1] git("update-index", "--no-skip-worktree", changed) - result = legacy["select"](CATALOG, "0" * 32, task_id="coverage-law-change") + result = legacy["select"](FROZEN_CATALOG, "0" * 32, task_id="centre-path-sharing") original = copy.deepcopy(result) with self.assertRaises(ValueError): current.resolve_current_first_steps(result, root) @@ -208,9 +272,9 @@ def git(*args): git("-c", "user.name=Fixture", "-c", "user.email=fixture@example.invalid", "-c", "core.hooksPath=/dev/null", "commit", "-qm", "helper") git("update-index", "--skip-worktree", name); path.unlink() - result = legacy["select"](CATALOG, "0" * 32, task_id="portable-replay") + result = legacy["select"](FROZEN_CATALOG, "0" * 32, task_id="portable-replay") self.assertEqual(current.resolve_current_first_steps(result, root), [name]) git("update-index", "--no-skip-worktree", name) - result = legacy["select"](CATALOG, "0" * 32, task_id="portable-replay") + result = legacy["select"](FROZEN_CATALOG, "0" * 32, task_id="portable-replay") with self.assertRaisesRegex(ValueError, "missing current first-step script"): current.resolve_current_first_steps(result, root) From b41545693de902b2b3b1ffd0218090de0cbcc062 Mon Sep 17 00:00:00 2001 From: d3lerium Date: Tue, 27 Oct 2026 16:16:06 +1100 Subject: [PATCH 2/5] Retain exact PR5831 qualification source export --- .../inputs/PR5831.tar | Bin 0 -> 389120 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 research/p104-single-pass-qualification/inputs/PR5831.tar diff --git a/research/p104-single-pass-qualification/inputs/PR5831.tar b/research/p104-single-pass-qualification/inputs/PR5831.tar new file mode 100644 index 0000000000000000000000000000000000000000..eddee1f6a956d1c4d0008bf75fc66a0a36ad56a2 GIT binary patch literal 389120 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

=p3w{xRszftT!dQ6Fzi8BjG(od!eV+Z79e+%)X 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

2elaU5-=;q!qvW=RGH@Ya^} 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 literal 0 HcmV?d00001 From 9b8cffa57c09eefba39dc6a4efdc34a15dfc1ebd Mon Sep 17 00:00:00 2001 From: d3lerium Date: Tue, 27 Oct 2026 16:22:28 +1100 Subject: [PATCH 3/5] Qualify frozen precision once per backend with complete observation coverage --- .../p104-single-pass-qualification/.gitignore | 3 + .../BENCHMARK-pair.json | 21 +++ .../BENCHMARK-remaining.json | 25 ++++ .../BENCHMARK.json | 31 +++++ .../COVERAGE.md | 33 +++++ .../p104-single-pass-qualification/PROFILE.md | 35 +++++ .../p104-single-pass-qualification/PROOF.md | 13 ++ .../p104-single-pass-qualification/README.md | 54 ++++++++ .../RESULT.json | 22 ++++ .../SOURCES.json | 32 +++++ .../p104-single-pass-qualification/TASK.json | 66 ++++++++++ .../VALIDATION.json | 32 +++++ .../VERIFY.json | 20 +++ .../baseline.py | 2 + .../benchmark.py | 50 ++++++++ .../candidate.py | 79 ++++++++++++ .../p104-single-pass-qualification/custody.py | 67 ++++++++++ .../evidence/B1/receipt.json | 25 ++++ .../evidence/B1/stderr.txt | 0 .../evidence/B1/stdout.txt | 2 + .../evidence/B1/usage.json | 1 + .../evidence/B2/receipt.json | 25 ++++ .../evidence/B2/stderr.txt | 0 .../evidence/B2/stdout.txt | 2 + .../evidence/B2/usage.json | 1 + .../evidence/B3/receipt.json | 25 ++++ .../evidence/B3/stderr.txt | 0 .../evidence/B3/stdout.txt | 2 + .../evidence/B3/usage.json | 1 + .../evidence/C1/receipt.json | 25 ++++ .../evidence/C1/stderr.txt | 0 .../evidence/C1/stdout.txt | 3 + .../evidence/C1/usage.json | 1 + .../evidence/C2/receipt.json | 25 ++++ .../evidence/C2/stderr.txt | 0 .../evidence/C2/stdout.txt | 3 + .../evidence/C2/usage.json | 1 + .../evidence/C3/receipt.json | 25 ++++ .../evidence/C3/stderr.txt | 0 .../evidence/C3/stdout.txt | 3 + .../evidence/C3/usage.json | 1 + .../evidence/CLAIM.md | 1 + .../evidence/FEASIBILITY-PLAN.md | 9 ++ .../evidence/HELPER-CLOSURE.json | 58 +++++++++ .../evidence/METADATA-DRAFT-REJECTION.txt | 1 + .../evidence/PLAN.json | 51 ++++++++ .../evidence/finite-O/receipt.json | 25 ++++ .../evidence/finite-O/stderr.txt | 0 .../evidence/finite-O/stdout.txt | 1 + .../evidence/finite-O/usage.json | 1 + .../evidence/finite-native-set-O/receipt.json | 25 ++++ .../evidence/finite-native-set-O/stderr.txt | 0 .../evidence/finite-native-set-O/stdout.txt | 1 + .../evidence/finite-native-set-O/usage.json | 1 + .../evidence/finite-native-set/receipt.json | 25 ++++ .../evidence/finite-native-set/stderr.txt | 0 .../evidence/finite-native-set/stdout.txt | 1 + .../evidence/finite-native-set/usage.json | 1 + .../evidence/finite/receipt.json | 25 ++++ .../evidence/finite/stderr.txt | 0 .../evidence/finite/stdout.txt | 1 + .../evidence/finite/usage.json | 1 + .../evidence/helper/receipt.json | 25 ++++ .../evidence/helper/stderr.txt | 0 .../evidence/helper/stdout.txt | 16 +++ .../evidence/helper/usage.json | 1 + .../evidence/precision/receipt.json | 25 ++++ .../evidence/precision/stderr.txt | 0 .../evidence/precision/stdout.txt | 1 + .../evidence/precision/usage.json | 1 + .../evidence/profile-runtime/dispatch.py | 6 + .../evidence/profile-runtime/guard.py | 119 +++++++++++++++++ .../profile-runtime/profile_helper.py | 23 ++++ .../profile-runtime/profile_precision.py | 35 +++++ .../evidence/profile-runtime/source.py | 67 ++++++++++ .../evidence/registered-O/receipt.json | 25 ++++ .../evidence/registered-O/stderr.txt | 0 .../evidence/registered-O/stdout.txt | 4 + .../evidence/registered-O/usage.json | 1 + .../evidence/registered-normal/receipt.json | 25 ++++ .../evidence/registered-normal/stderr.txt | 0 .../evidence/registered-normal/stdout.txt | 4 + .../evidence/registered-normal/usage.json | 1 + .../p104-single-pass-qualification/finite.py | 49 +++++++ .../p104-single-pass-qualification/guard.py | 120 ++++++++++++++++++ .../p104-single-pass-qualification/observe.py | 72 +++++++++++ .../p104-single-pass-qualification/replay.py | 31 +++++ .../p104-single-pass-qualification/source.py | 67 ++++++++++ .../p104-single-pass-qualification/verify.py | 9 ++ 89 files changed, 1711 insertions(+) create mode 100644 research/p104-single-pass-qualification/.gitignore create mode 100644 research/p104-single-pass-qualification/BENCHMARK-pair.json create mode 100644 research/p104-single-pass-qualification/BENCHMARK-remaining.json create mode 100644 research/p104-single-pass-qualification/BENCHMARK.json create mode 100644 research/p104-single-pass-qualification/COVERAGE.md create mode 100644 research/p104-single-pass-qualification/PROFILE.md create mode 100644 research/p104-single-pass-qualification/PROOF.md create mode 100644 research/p104-single-pass-qualification/README.md create mode 100644 research/p104-single-pass-qualification/RESULT.json create mode 100644 research/p104-single-pass-qualification/SOURCES.json create mode 100644 research/p104-single-pass-qualification/TASK.json create mode 100644 research/p104-single-pass-qualification/VALIDATION.json create mode 100644 research/p104-single-pass-qualification/VERIFY.json create mode 100644 research/p104-single-pass-qualification/baseline.py create mode 100644 research/p104-single-pass-qualification/benchmark.py create mode 100644 research/p104-single-pass-qualification/candidate.py create mode 100644 research/p104-single-pass-qualification/custody.py create mode 100644 research/p104-single-pass-qualification/evidence/B1/receipt.json create mode 100644 research/p104-single-pass-qualification/evidence/B1/stderr.txt create mode 100644 research/p104-single-pass-qualification/evidence/B1/stdout.txt create mode 100644 research/p104-single-pass-qualification/evidence/B1/usage.json create mode 100644 research/p104-single-pass-qualification/evidence/B2/receipt.json create mode 100644 research/p104-single-pass-qualification/evidence/B2/stderr.txt create mode 100644 research/p104-single-pass-qualification/evidence/B2/stdout.txt create mode 100644 research/p104-single-pass-qualification/evidence/B2/usage.json create mode 100644 research/p104-single-pass-qualification/evidence/B3/receipt.json create mode 100644 research/p104-single-pass-qualification/evidence/B3/stderr.txt create mode 100644 research/p104-single-pass-qualification/evidence/B3/stdout.txt create mode 100644 research/p104-single-pass-qualification/evidence/B3/usage.json create mode 100644 research/p104-single-pass-qualification/evidence/C1/receipt.json create mode 100644 research/p104-single-pass-qualification/evidence/C1/stderr.txt create mode 100644 research/p104-single-pass-qualification/evidence/C1/stdout.txt create mode 100644 research/p104-single-pass-qualification/evidence/C1/usage.json create mode 100644 research/p104-single-pass-qualification/evidence/C2/receipt.json create mode 100644 research/p104-single-pass-qualification/evidence/C2/stderr.txt create mode 100644 research/p104-single-pass-qualification/evidence/C2/stdout.txt create mode 100644 research/p104-single-pass-qualification/evidence/C2/usage.json create mode 100644 research/p104-single-pass-qualification/evidence/C3/receipt.json create mode 100644 research/p104-single-pass-qualification/evidence/C3/stderr.txt create mode 100644 research/p104-single-pass-qualification/evidence/C3/stdout.txt create mode 100644 research/p104-single-pass-qualification/evidence/C3/usage.json create mode 100644 research/p104-single-pass-qualification/evidence/CLAIM.md create mode 100644 research/p104-single-pass-qualification/evidence/FEASIBILITY-PLAN.md create mode 100644 research/p104-single-pass-qualification/evidence/HELPER-CLOSURE.json create mode 100644 research/p104-single-pass-qualification/evidence/METADATA-DRAFT-REJECTION.txt create mode 100644 research/p104-single-pass-qualification/evidence/PLAN.json create mode 100644 research/p104-single-pass-qualification/evidence/finite-O/receipt.json create mode 100644 research/p104-single-pass-qualification/evidence/finite-O/stderr.txt create mode 100644 research/p104-single-pass-qualification/evidence/finite-O/stdout.txt create mode 100644 research/p104-single-pass-qualification/evidence/finite-O/usage.json create mode 100644 research/p104-single-pass-qualification/evidence/finite-native-set-O/receipt.json create mode 100644 research/p104-single-pass-qualification/evidence/finite-native-set-O/stderr.txt create mode 100644 research/p104-single-pass-qualification/evidence/finite-native-set-O/stdout.txt create mode 100644 research/p104-single-pass-qualification/evidence/finite-native-set-O/usage.json create mode 100644 research/p104-single-pass-qualification/evidence/finite-native-set/receipt.json create mode 100644 research/p104-single-pass-qualification/evidence/finite-native-set/stderr.txt create mode 100644 research/p104-single-pass-qualification/evidence/finite-native-set/stdout.txt create mode 100644 research/p104-single-pass-qualification/evidence/finite-native-set/usage.json create mode 100644 research/p104-single-pass-qualification/evidence/finite/receipt.json create mode 100644 research/p104-single-pass-qualification/evidence/finite/stderr.txt create mode 100644 research/p104-single-pass-qualification/evidence/finite/stdout.txt create mode 100644 research/p104-single-pass-qualification/evidence/finite/usage.json create mode 100644 research/p104-single-pass-qualification/evidence/helper/receipt.json create mode 100644 research/p104-single-pass-qualification/evidence/helper/stderr.txt create mode 100644 research/p104-single-pass-qualification/evidence/helper/stdout.txt create mode 100644 research/p104-single-pass-qualification/evidence/helper/usage.json create mode 100644 research/p104-single-pass-qualification/evidence/precision/receipt.json create mode 100644 research/p104-single-pass-qualification/evidence/precision/stderr.txt create mode 100644 research/p104-single-pass-qualification/evidence/precision/stdout.txt create mode 100644 research/p104-single-pass-qualification/evidence/precision/usage.json create mode 100644 research/p104-single-pass-qualification/evidence/profile-runtime/dispatch.py create mode 100644 research/p104-single-pass-qualification/evidence/profile-runtime/guard.py create mode 100644 research/p104-single-pass-qualification/evidence/profile-runtime/profile_helper.py create mode 100644 research/p104-single-pass-qualification/evidence/profile-runtime/profile_precision.py create mode 100644 research/p104-single-pass-qualification/evidence/profile-runtime/source.py create mode 100644 research/p104-single-pass-qualification/evidence/registered-O/receipt.json create mode 100644 research/p104-single-pass-qualification/evidence/registered-O/stderr.txt create mode 100644 research/p104-single-pass-qualification/evidence/registered-O/stdout.txt create mode 100644 research/p104-single-pass-qualification/evidence/registered-O/usage.json create mode 100644 research/p104-single-pass-qualification/evidence/registered-normal/receipt.json create mode 100644 research/p104-single-pass-qualification/evidence/registered-normal/stderr.txt create mode 100644 research/p104-single-pass-qualification/evidence/registered-normal/stdout.txt create mode 100644 research/p104-single-pass-qualification/evidence/registered-normal/usage.json create mode 100644 research/p104-single-pass-qualification/finite.py create mode 100644 research/p104-single-pass-qualification/guard.py create mode 100644 research/p104-single-pass-qualification/observe.py create mode 100644 research/p104-single-pass-qualification/replay.py create mode 100644 research/p104-single-pass-qualification/source.py create mode 100644 research/p104-single-pass-qualification/verify.py diff --git a/research/p104-single-pass-qualification/.gitignore b/research/p104-single-pass-qualification/.gitignore new file mode 100644 index 0000000000..85ac65a5e8 --- /dev/null +++ b/research/p104-single-pass-qualification/.gitignore @@ -0,0 +1,3 @@ +__pycache__/ +runs/ +execution.lock diff --git a/research/p104-single-pass-qualification/BENCHMARK-pair.json b/research/p104-single-pass-qualification/BENCHMARK-pair.json new file mode 100644 index 0000000000..25f2530375 --- /dev/null +++ b/research/p104-single-pass-qualification/BENCHMARK-pair.json @@ -0,0 +1,21 @@ +{ + "complete_receipts_equal": true, + "medians": { + "B": { + "cpu": 60.949999999999996, + "wall": 61.007068632985465 + }, + "C": { + "cpu": 38.879999999999995, + "wall": 38.93709892901825 + } + }, + "order": [ + "B1", + "C1" + ], + "saving": { + "cpu": 0.36210008203445454, + "wall": 0.36176086146244313 + } +} diff --git a/research/p104-single-pass-qualification/BENCHMARK-remaining.json b/research/p104-single-pass-qualification/BENCHMARK-remaining.json new file mode 100644 index 0000000000..ec511c4d28 --- /dev/null +++ b/research/p104-single-pass-qualification/BENCHMARK-remaining.json @@ -0,0 +1,25 @@ +{ + "complete_receipts_equal": true, + "medians": { + "B": { + "cpu": 60.949999999999996, + "wall": 61.007068632985465 + }, + "C": { + "cpu": 38.879999999999995, + "wall": 39.01491572102532 + } + }, + "order": [ + "B1", + "C1", + "C2", + "B2", + "B3", + "C3" + ], + "saving": { + "cpu": 0.36210008203445454, + "wall": 0.3604853241558532 + } +} diff --git a/research/p104-single-pass-qualification/BENCHMARK.json b/research/p104-single-pass-qualification/BENCHMARK.json new file mode 100644 index 0000000000..d72676197d --- /dev/null +++ b/research/p104-single-pass-qualification/BENCHMARK.json @@ -0,0 +1,31 @@ +{ + "complete_receipts_equal": true, + "medians": { + "B": { + "cpu": 60.949999999999996, + "wall": 61.007068632985465 + }, + "C": { + "cpu": 38.879999999999995, + "wall": 39.01491572102532 + } + }, + "order": [ + "B1", + "C1", + "C2", + "B2", + "B3", + "C3" + ], + "saving": { + "cpu": 0.36210008203445454, + "wall": 0.3604853241558532 + }, + "limits": { + "per_command_seconds": 180, + "cumulative_seconds": 1500, + "group_rss_bytes": 1073741824 + }, + "scope": "Complete frozen qualification incl 27 new finite controls; four inherited custody controls are outside the benchmark stage and inside registered verification." +} diff --git a/research/p104-single-pass-qualification/COVERAGE.md b/research/p104-single-pass-qualification/COVERAGE.md new file mode 100644 index 0000000000..64c324c5aa --- /dev/null +++ b/research/p104-single-pass-qualification/COVERAGE.md @@ -0,0 +1,33 @@ +# Coverage preservation + +The source is the complete official PR #5831 export at `7c5eb98e7439d778141d63e801e53d4cd7e1d587`, containing the unchanged PR #5826 source at `58f93cf41751920f3d6766a39caccc2974ce18b0`. `source.py` authenticates every outer file/mode and the entire archive before importing; the original source context authenticates the nested archive and checks every declared contract edit. Frozen files and the arithmetic backend are not edited. + +| Obligation | Frozen full qualification | Proposed qualification | +|---|---|---| +| Integer complete contract | Exact `contract.calculate(p, Engine(reference))` | Same calculation, with an observational proxy that forwards every call | +| Fraction complete contract | Unchanged `original.calculate()` | Same function and newly loaded original module, observed via a scoped module-factory seam; restored in `finally` | +| Actual dimensions | 25,984 events, 799 coordinates, every arbitrary-input/native/ownership check | Same word in both complete calculations | +| Source result | Both complete encoded outputs equal original RESULT | Same two checks plus full output equality | +| Ideal metadata and local weights | Extra full reference and integer ideal passes, compared | Compare complete deep-copied first-pass outputs from the two independent calculations | +| Actual error trace and all signed witness dictionaries | Extra reference/integer error passes, compared | Compare complete deep-copied first-pass outputs from the two independent calculations | +| Final transpose scores and signed coefficients | Each full calculation calls unchanged `reverse_all` and checks all values/hashes | Unchanged in both calculations | +| Attaining prefix/input fixtures | Each complete contract uses unchanged `reverse_cut` and literal `execute` | All retained; no sampled rows | +| Additive COPY/reset semantics | Both complete contracts run every original residual fixture and six rejections | All retained; malformed-word calls still reach the backend and cannot replace the actual observation | +| Dyadic finite differential | Original seeded 120 programs/4,240 events, complete trace/witness and reverse equality | Call original `fixtures` unchanged with raw independent reference and integer backend | +| Integer validity failures | Nondyadic scalar, inexact division, nondyadic weight | All three retained | +| Precision guards and scale | Prefix/public/owned 26/23/22, coefficient scale 55 | Exact same receipt, not a weaker subset | +| Source isolation | Distinct Fraction module and explicit contract/backend under authenticated source context | Same source authentication and distinct modules; no cross-backend value sharing | +| Timeout | Original full qualification 180 seconds | 180 seconds; unchanged numerical or proof limits | +| Shared tooling tests | Full CI plan has 513 tests and 22 platform skips | No shared script, test, wait, fixture or skip changes; nominated group all ten pass in profile | + +The omitted repeated calculations are deterministic calls of byte-identical functions with identical complete inputs inside one successful invocation. The replacement observations retain their complete output values. This is intra-invocation common-work elimination; it is not an independent extra scientific oracle. The two arithmetic representations and all original literal/transpose oracles still execute independently. Cold process/source authentication occurs on every qualification. Nested source scratch keeps the predecessor's private writable semantics; this contribution adds no claim that it is sealed. + +## Observation lifetime and failure rules + +A context binds the canonical complete word. Only the actual successful ideal and trace calls can be recorded, once each. The trace must use the observed ideal's exact weights and operation set. Arguments are checked before/after invocation, outputs are deep-copied, and snapshots are hashed again at consumption. Each backend has a separate context. Outputs cannot be consumed until the full enclosing contract has succeeded, and can be consumed only once. A backend exception on the actual word aborts its observations. Any exception in the complete candidate/parallel Fraction calculation aborts both contexts. The source module factory is restored even on failure. Nothing is persisted between commands. + +The finite feasibility gate uses the real frozen backends, a valid five-event COPY/SCALE/CLEAR word, complete fresh reruns, and 27 explicit failure/isolation controls. It runs both normally and under `-O`; checks use explicit exceptions. The original finite corpus and original scientific rejections are additional coverage. + +## Limits + +This covers the frozen contract only. Different source bytes, word, weights, operations, ownership semantics, backend or oracle require a fresh binding and feasibility gate. Assisted local review and CI do not prove the multiplication theorem, supplier admission, exact physical reset, a funded kappa gain or independent human review. diff --git a/research/p104-single-pass-qualification/PROFILE.md b/research/p104-single-pass-qualification/PROFILE.md new file mode 100644 index 0000000000..a1e2768990 --- /dev/null +++ b/research/p104-single-pass-qualification/PROFILE.md @@ -0,0 +1,35 @@ +# Measured nomination and rejected alternative + +Both profiles run the full unchanged entry points, serially, with fresh processes and private bytecode prefixes. Whole-call wall timers are observational and inclusive: nested totals overlap. They are excluded from speed statistics. Raw outputs and Linux resource receipts are retained in `evidence/`. The canonical base and fixture census appear in `evidence/HELPER-CLOSURE.json`. + +## Shared-helper group + +Existing hosted verbose-test timestamps suggested the descendant-source-role group. These were only screening proxies; buffered output is not an exact per-test profile. Before collection, all seven manifest inputs, six package files and exact original/historical Git rows were materialized/authenticated. No incomplete discovery or missing fixture was accepted as a pass. + +The complete group then passes **10 tests, zero errors/failures/skips** in 51.317 seconds wall /48.85 CPU. Fresh per-test fixture setup is 0.287 seconds across ten setups; 100 inclusive Git calls total0.305 seconds. The complete historical-source-substitution guard takes37.290 seconds, and the broken live cache-isolation regression12.125 seconds. These execute real historical/negative CLI behaviour; they are not removable setup. + +Even eliminating every fixture setup would save at most **0.56% of this group** on the observed run, far below15%. This rejects only this fixture-only nomination, not all shared-tooling optimization. No helper/test/skip/wait/source change is made. Required stale-import, historical-source, descendant and lifetime rejection coverage remains in CI. + +## Complete precision qualification + +The complete frozen PR5831 profile passes in61.609 seconds wall /61.55 CPU with the exact original scientific receipt. It includes: + +| Inclusive operation | Calls | Seconds | +|---|---:|---:| +| Full Fraction contract |1|28.038| +| Fraction contract error trace |1|19.828| +| Fraction contract ideal (actual+rejections) |4|4.077| +| Fraction contract reverse-all |1|2.785| +| Extra Fraction ideal |1|2.163| +| Extra Fraction error trace (actual+120 finite cases) |121|21.102| +| Full integer contract |1|6.052| +| Integer error trace (two actual+120 finite) |122|6.104| +| Integer ideal (two actual+rejections) |5|1.408| + +The full contract already computes the actual ideal/weights and trace/witness values later recomputed by qualification. The nomination retains both independent first-pass output pairs, then compares their complete values. Every original actual and finite oracle stays active. The profile justifies finite feasibility; it is not itself an optimization benchmark. + +## Gate history + +The preconstruction five-event fixture uses the actual authenticated Fraction and integer modules and complete fresh comparisons.27 explicit controls cover one-use/readiness, closed/duplicate calls, changed word/weights/rounding, caller-return alias isolation, original malformed-input exceptions, failed/aborted lifetimes, input mutation and no transfer from a previous context. Both normal and `-O` pass. An initial prototype normalized rounded arguments to a list; before construction it was hardened to preserve the original set object type while normalizing only its fingerprint. Both earlier and final receipts are retained, without claiming they are distinct backend implementations. + +No scientific failures occurred in these profiles/finite runs. A draft metadata outcome string was rejected before the registered entry point; its message and enum-only correction are retained separately. All later full measurements remain separately labelled and are never silently rerun. diff --git a/research/p104-single-pass-qualification/PROOF.md b/research/p104-single-pass-qualification/PROOF.md new file mode 100644 index 0000000000..b7bc789413 --- /dev/null +++ b/research/p104-single-pass-qualification/PROOF.md @@ -0,0 +1,13 @@ +# Source-bound elimination of duplicate qualification passes + +This is a verification-engineering argument about exact deterministic computations on one frozen word, not a proof of the multiplication theorem. + +Let I_B(w) return the complete ideal metadata and local weights and E_B(w,a,R) the complete error trace and signed witness dictionaries for backend B. In the authenticated source, Fraction `ideal`/`error_trace` and integer `Engine.ideal`/`Engine.error_trace` allocate their state locally, use exact arithmetic, and do not read random, time, file or caller-global state. They do not mutate w,a,R. The complete source contract calls I_B(w), defines R from all operation counts and then calls E_B(w,a,R). Qualification subsequently calls the byte-identical functions on the same complete word, weights and rounded operation set to obtain values for cross-backend comparison. These repeated calls are not additional independent scientific implementations. + +The replacement retains a deep copy of the full outputs of the first actual I_B and E_B calls in each separately executed complete contract. It does not replace either backend computation with the other's output. Canonical input fingerprints bind the whole word; the trace binding also requires the precise independently computed weights and full rounded operation set. Arguments are fingerprinted before and after each invocation. Only actual successful calls are recorded, exactly once each, and only a successful complete enclosing contract permits consumption. Corrupt source, missing calls, duplicate actual calls, input changes, failed complete contracts or output drift prevent admission. Deep copies isolate the retained values from later mutation of returned values. Output fingerprints are rechecked at one-use consumption. + +Consequently the complete ideal/weight and trace/witness equality predicates receive the same exact values as the unchanged qualifier's second calls. Full original RESULT equality is checked separately against each independent complete contract and between them. Every literal input/defect attaining fixture, signed final transpose check and original semantic rejection remains inside those untouched calculations. The original seeded 120-program differential is called unchanged with raw backends, including full trace/witness and reverse equality, plus all three integer failures. The coefficient scale and complete scientific receipt are still computed/compared to the original source record. + +The Fraction calculation retains its own newly loaded original precision module. Its factory is wrapped only to observe the first-pass returns; the factory is restored in `finally`. The raw reference module, integer arithmetic and literal/reverse oracle code stay unchanged and authenticated. A context has no cross-command storage or reuse. The argument assumes the normal deterministic interpreter model; this does not claim hardware-fault independence from two repetitions of the same computation. + +The finite gate precedes construction. The complete actual-word comparisons, six-process measurements, normal/optimized full commands and sealed export checks are additional implementation evidence. A source or word successor requires fresh purity/input/coverage review and finite feasibility. Physical native correctness, reset implementation, exact owned zero return, tapes, compiler/outer admission and the five framework assumptions remain predecessor obligations. No kappa change follows from this optimization. diff --git a/research/p104-single-pass-qualification/README.md b/research/p104-single-pass-qualification/README.md new file mode 100644 index 0000000000..af48357694 --- /dev/null +++ b/research/p104-single-pass-qualification/README.md @@ -0,0 +1,54 @@ +# Complete single-pass precision qualification + +This opt-in verification package builds on Ali Romman's [PR #5831](https://github.com/CrocSwap/integer-mult-bounds/pull/5831) and its [Linux validation in PR #5839](https://github.com/CrocSwap/integer-mult-bounds/pull/5839). Both complete arithmetic implementations still execute. It retains the actual ideal metadata, local weights, complete error traces and every signed witness from those executions, instead of recomputing the same values solely to compare them. All literal and transpose oracles, actual source controls and original finite differential remain. + +See [COVERAGE.md](COVERAGE.md) for the obligation-by-obligation preservation argument and observation lifetime. This changes verification cost only; it does not change the precision theorem, physical construction, five framework assumptions, kappa or selected result. Frozen archives and expected results are unchanged. + +## Reproduce + +Python 3.12, standard library only: + +```sh +python3 -B scripts/research_package.py --package research/p104-single-pass-qualification +``` + +The registered command performs the four inherited pre-import source-custody controls, 27 new finite observation controls, and **fresh full qualification**. It authenticates the complete official source export, runs both complete Fraction and exact-integer contracts on all 25,984 events/799 coordinates, compares all observed actual ideal/weight/trace/witness values and executes the original 120-program/4,240-event finite differential and three integer rejections. Both full contracts still run the six original semantic rejections, signed final transpose and literal attaining fixtures. The source's 180-second timeout is unchanged. Expected time on this Linux host is about 40 seconds, subject to host load. + +For deliberate optimized validation use the same source-isolated registered runner or the README export procedure. All new guards raise explicit exceptions; they remain effective under `-O`. + +## Bounded performance comparison + +Run only with separately available local budget in a fresh complete checkout/export. `runs/` must not already contain these labels; an existing or failed measurement is never overwritten or retried automatically. + +```sh +python3 -B research/p104-single-pass-qualification/benchmark.py pair +python3 -B research/p104-single-pass-qualification/benchmark.py remaining +``` + +The first command measures one fresh complete frozen qualification and one fresh candidate, including its 27 new finite controls. It requires **at least 15% less wall AND CPU time** before the second command can run. The second retains the original serial B,C,C,B,B,C order and applies the same threshold to all six medians. Every run has the original 180-second limit, 1 GiB sampled process-group RSS, bounded output, complete scientific-receipt equality, clean private bytecode prefix and before/after source-byte/mode inventory. The cumulative 1,500-second cap includes the fixed prior profiling/finite development cost declared in `guard.py`. OS caches are not flushed. The host is unreserved. Three observations per arm establish a local measurement, not universal or statistical performance. + +The inherited four custody controls are a separate small prequalification stage in `verify.py`; their cost is included in registered normal/optimized/export validation, while the B/C comparison concerns the complete scientific qualification. The profile is excluded from benchmark statistics. Full finite actual-corpus comparisons are never replaced with a stored receipt. + +## Profiling and feasibility before construction + +The unchanged nominated shared-helper group passes all ten tests after exact historical fixture closure. Its 0.287-second fixture setup is only 0.56% of the 51.317-second group bill. Eliminating it could not meet the requested threshold, so shared scripts/tests/fixtures/waits/skips are unchanged. Most cost is required actual historical/negative CLI execution. + +Full precision qualification profiles at 61.609 seconds. Extra same-input ideal/error calls account for over 23 seconds in the Fraction reference alone. Before constructing the full candidate, a five-event valid COPY/SCALE/CLEAR fixture passes with both real frozen backends, full fresh output comparisons and 27 input/lifetime/exception/alias controls, normally and under `-O`. A small hardening preserves the original set argument type; both earlier and final finite receipts are retained. These are finite feasibility checks, followed by complete actual qualification. + +## Source and independence boundaries + +`inputs/PR5831.tar` is the complete official 13-file export at `7c5eb98e7439d778141d63e801e53d4cd7e1d587`, SHA256 `6ad8d8e0463e8e6ea8d503610c3f9ec38108f16092bc479bc1cb6f48683f6ab6`, retained at this branch's own ancestor. It contains the unchanged PR #5826 source at `58f93cf41751920f3d6766a39caccc2974ce18b0`. Original notices and source licenses remain inside the archives. No pending contributor Git objects are runtime dependencies. + +No persisted cache, source-result substitution, cross-backend weight reuse, changed arithmetic or sampled witness is introduced. Each observation context is scoped to one successful complete contract, holds full deep copies, binds all exact inputs and is consumed once. The independent Fraction module still loads afresh; only its factory return is observationally wrapped and the factory is restored on success or failure. The original private nested scratch remains writable; the outer authenticated export is read-only and checked. The coverage statement concerns this deterministic frozen source, not fault-injection independence from repeating an identical call. + +## Credit + +Ali Romman supplied the integer backend, exact dyadic scale proof, explicit contract seam, original qualification and macOS measurements. Retain PR #5826, [PR #5819](https://github.com/CrocSwap/integer-mult-bounds/pull/5819), Adam Gall, ywz65, [PR #2878](https://github.com/CrocSwap/integer-mult-bounds/pull/2878), Mason Hale/[PR #5811](https://github.com/CrocSwap/integer-mult-bounds/pull/5811) and every retained native/compiler/precision notice. The test-only [PR #5761](https://github.com/CrocSwap/integer-mult-bounds/pull/5761) dependency retains Ali Romman's authorship and exact cherry-pick credit. roger-sato/Arham Tahir supplied the historical-source-role test lineage. Guard/custody mechanics follow [PR #5816](https://github.com/CrocSwap/integer-mult-bounds/pull/5816), [PR #5818](https://github.com/CrocSwap/integer-mult-bounds/pull/5818), [PR #5832](https://github.com/CrocSwap/integer-mult-bounds/pull/5832) and PR #5839. New profiling, one-use observation, controls and Linux measurements: Chris R / Clear1nsight, with substantial OpenAI Codex assistance; no subagents or independent human/kernel acceptance. Apache-2.0. + +## Open next questions + +1. Does another Linux host reproduce the complete-qualification saving? Authenticate the same export and repeat the bounded six-process comparison; retain every observation. +2. Should the source qualifier expose explicit first-pass outputs? A source-owned return interface could simplify the scoped module-factory wrapper. Review the coverage and lifetime rules before any source change, and coordinate with the source author. +3. Can the optimization transfer to a changed word/backend? Only after new source binding, input/operation/ownership mapping and finite feasibility. This package gives no automatic transfer. + +Kappa research, Work 1/2, feeds, workers and automations remain paused. The bounded engineering scope ends after this submission/handoff and starts no successor experiment. diff --git a/research/p104-single-pass-qualification/RESULT.json b/research/p104-single-pass-qualification/RESULT.json new file mode 100644 index 0000000000..1952424ccc --- /dev/null +++ b/research/p104-single-pass-qualification/RESULT.json @@ -0,0 +1,22 @@ +{ + "all_actual_witness_rows_equal": true, + "coefficient_scale_bits": 55, + "coordinates": 799, + "events": 25984, + "finite_fixtures": { + "cases": 120, + "controls": [ + "nondyadic scalar", + "inexact scale division", + "nondyadic weight" + ], + "events": 4240 + }, + "guards": { + "owned": 22, + "prefix": 26, + "public": 23 + }, + "source_controls": 6, + "source_result_sha256": "cc7739703ed23532d187949c8507d09c13ac4c152e07a930f0087cde0d7a3d98" +} diff --git a/research/p104-single-pass-qualification/SOURCES.json b/research/p104-single-pass-qualification/SOURCES.json new file mode 100644 index 0000000000..6c75dd971b --- /dev/null +++ b/research/p104-single-pass-qualification/SOURCES.json @@ -0,0 +1,32 @@ +{ + "schema_version": 1, + "base_commit": "de5ec2e7a6074068452f45b1a191b5c72832df4a", + "files": [ + { + "path": "docs/research/agent-task-catalog.json", + "usage": "provenance", + "git_blob": "3404fbdd5e7529a0674eef26114b5071e4586cec", + "sha256": "ead6cdc9d0af6d58e8a49744d8ec8c7c15e13d2ba93c276c434bcf9b51b93a81" + }, + { + "path": "certificates/selected-result.json", + "usage": "provenance", + "git_blob": "581f8d87008354eb5b869f7ed9de1317ad837ce8", + "sha256": "2a0220e866417774606e0f991e41b9c1d26b1f43b97857238cf478dbc7d330b5" + }, + { + "path": "research/p104-single-pass-qualification/inputs/PR5831.tar", + "usage": "input", + "git_blob": "eddee1f6a956d1c4d0008bf75fc66a0a36ad56a2", + "sha256": "6ad8d8e0463e8e6ea8d503610c3f9ec38108f16092bc479bc1cb6f48683f6ab6", + "pin": "head:b41545693de902b2b3b1ffd0218090de0cbcc062:research/p104-single-pass-qualification/inputs/PR5831.tar" + } + ], + "external_origin": { + "pr": 5831, + "head": "7c5eb98e7439d778141d63e801e53d4cd7e1d587", + "source_pr": 5826, + "source_head": "58f93cf41751920f3d6766a39caccc2974ce18b0", + "files": 13 + } +} diff --git a/research/p104-single-pass-qualification/TASK.json b/research/p104-single-pass-qualification/TASK.json new file mode 100644 index 0000000000..28a35f3db3 --- /dev/null +++ b/research/p104-single-pass-qualification/TASK.json @@ -0,0 +1,66 @@ +{ + "schema_version": 1, + "task_id": "replay-runtime", + "original_card": { + "id": "replay-runtime", + "question": "Can one measured replay bottleneck be sped up without dropping coverage?", + "starting_points": [ + "scripts/run_isolated_tests.py", + "scripts/verify_replay_coverage.py", + "certificates/selected-result.json" + ], + "methods": [ + "Profile one isolated replay and optimize the measured bottleneck.", + "Design source-bound reuse with explicit dependency invalidation and negative controls." + ], + "acceptance_gate": "Report before/after wall time on the same fixture, retained checks and invalidation behavior.", + "first_step": { + "command": [ + "python3", + "-B", + "scripts/research_selected_baseline.py" + ], + "expected": "PASS_RESEARCH_BASELINE_BINDINGS_ONLY", + "inspect": "Resolve the current selected review, separate complex/ordinary BIT/admitted BIT/outer budgets, and compare the card against live handoffs before starting. Historical ceilings require exact source/model equivalence.", + "scope": "Source-binding orientation only; not a scientific replay or all-size proof. Materialize selected inputs if this checkout is sparse." + }, + "first_experiment": "Measure one unchanged fixture, preserve check coverage, and test one optimization with invalidation controls.", + "bottleneck_link": "Faster trustworthy replays increase review throughput and let mechanism candidates be checked sooner.", + "allowed_variations": [ + "Profile one stage or design one source-bound cache boundary." + ], + "scope_change_triggers": [ + "Skipping coverage or comparing different fixtures to claim speedup." + ], + "overlap_terms": [ + "replay runtime", + "cache invalidation", + "isolated tests" + ] + }, + "scope_status": "refined", + "scope_change_reason": "Explicit donor request to profile shared helper tests/full qualification, gate finite feasibility before construction, retain every check and require at least15% wall and CPU saving. Shared fixture setup screened out; only repeated same-input qualification passes removed.", + "actual_scope": "PR5831/frozen-7c5eb98/complete-single-pass-qualification", + "bottleneck_link": "Faster trustworthy replays increase review throughput and let mechanism candidates be checked sooner.", + "stop_rule": "Source, observation, complete receipt, stderr or resource failure stops. No automatic retries. 180 seconds/command,1GiB sampled group RSS,1500 seconds shared cumulative; first pair then all six in B,C,C,B,B,C order must save15% wall and CPU.", + "time_budget_minutes": 90, + "outcome": "partial", + "evidence": "COVERAGE.md, evidence/, BENCHMARK-pair.json and BENCHMARK-remaining.json; every measurement retained.", + "author": "Chris R / Clear1nsight", + "ai_assistance": "Substantial OpenAI Codex assistance for source review, execution, tooling and report; no subagents, independent human or proof-kernel acceptance.", + "open_questions": [ + { + "question": "Does another host reproduce the complete-qualification gain?", + "why_it_matters": "Three samples per arm on one unreserved host are not universal performance.", + "first_step": "Authenticate exact export; run full normal and optimized qualification, then the six fresh bounded measurements.", + "blocked_by": "Separately authorized host time." + }, + { + "question": "Should the source qualifier expose explicit observation outputs?", + "why_it_matters": "A source-owned return interface could remove the scoped factory wrapper while retaining every oracle.", + "first_step": "Review this coverage map and source-bound observation lifetime; preserve failures before changing the source.", + "blocked_by": "Source-author coordination and a new source pin; no automatic transfer." + } + ], + "base_commit": "de5ec2e7a6074068452f45b1a191b5c72832df4a" +} diff --git a/research/p104-single-pass-qualification/VALIDATION.json b/research/p104-single-pass-qualification/VALIDATION.json new file mode 100644 index 0000000000..389240c753 --- /dev/null +++ b/research/p104-single-pass-qualification/VALIDATION.json @@ -0,0 +1,32 @@ +{ + "all_benchmark_runs": 6, + "complete_receipt": { + "all_actual_witness_rows_equal": true, + "coefficient_scale_bits": 55, + "coordinates": 799, + "events": 25984, + "finite_fixtures": { + "cases": 120, + "controls": [ + "nondyadic scalar", + "inexact scale division", + "nondyadic weight" + ], + "events": 4240 + }, + "guards": { + "owned": 22, + "prefix": 26, + "public": 23 + }, + "source_controls": 6, + "source_result_sha256": "cc7739703ed23532d187949c8507d09c13ac4c152e07a930f0087cde0d7a3d98" + }, + "export": "pending", + "inherited_custody_controls": 4, + "kappa_research": "PAUSED", + "new_controls": 27, + "normal_seconds": 39.24033334100386, + "optimized_seconds": 39.1790381349856, + "shared_tests_changed": false +} diff --git a/research/p104-single-pass-qualification/VERIFY.json b/research/p104-single-pass-qualification/VERIFY.json new file mode 100644 index 0000000000..875ee459e5 --- /dev/null +++ b/research/p104-single-pass-qualification/VERIFY.json @@ -0,0 +1,20 @@ +{ + "schema_version": 1, + "status": "ready", + "python": "3.12", + "requirements": [], + "inputs": [ + "research/p104-single-pass-qualification/inputs/PR5831.tar" + ], + "commands": [ + { + "argv": [ + "{python}", + "-B", + "{package}/verify.py" + ], + "timeout_seconds": 180, + "checks": "Fresh full source-pinned Fraction and integer qualification with all 25984 events/799 coordinates, complete first-pass ideal/weights and actual trace/witness equality, unchanged 120-program/4240-event finite differential, six original plus three integer rejections, four inherited custody and 27 new finite observation controls. No coverage sampling or cross-run cache." + } + ] +} diff --git a/research/p104-single-pass-qualification/baseline.py b/research/p104-single-pass-qualification/baseline.py new file mode 100644 index 0000000000..783543c2ca --- /dev/null +++ b/research/p104-single-pass-qualification/baseline.py @@ -0,0 +1,2 @@ +from replay import main +if __name__=='__main__':main() diff --git a/research/p104-single-pass-qualification/benchmark.py b/research/p104-single-pass-qualification/benchmark.py new file mode 100644 index 0000000000..174d2761ec --- /dev/null +++ b/research/p104-single-pass-qualification/benchmark.py @@ -0,0 +1,50 @@ +"""Fresh serial full-qualification B,C,C,B,B,C; fail closed at the first pair.""" +import json +import statistics +import sys +from pathlib import Path +import guard +from source import payload, require + +EXPECTED = json.loads(payload()['research/p104-integer-error-replay/RESULT.json']) +ORDER = [('B1','baseline.py'),('C1','candidate.py'),('C2','candidate.py'), + ('B2','baseline.py'),('B3','baseline.py'),('C3','candidate.py')] + + +def receipt(label): + folder=guard.HERE/'runs'/label + measurement=json.loads((folder/'receipt.json').read_bytes()) + require(measurement['status']=='PASS','bounded command pass '+label) + result=json.loads((folder/'stdout.txt').read_text().splitlines()[-1]) + require(result['mode']=='qualify' and result['receipt']==EXPECTED,'complete scientific receipt '+label) + return measurement + + +def gate(labels): + groups={arm:[receipt(label) for label in labels if label.startswith(arm)] for arm in 'BC'} + rows={arm:dict(wall=statistics.median(x['wall_seconds'] for x in group), + cpu=statistics.median(x['usage']['user_seconds']+x['usage']['system_seconds'] for x in group)) + for arm,group in groups.items()} + saving={key:1-rows['C'][key]/rows['B'][key] for key in ('wall','cpu')} + require(min(saving.values())>=0.15,'15% complete-stage wall AND CPU gate') + return dict(medians=rows,saving=saving,order=labels,complete_receipts_equal=True) + + +def main(): + require(len(sys.argv)==2 and sys.argv[1] in ('pair','remaining'),'pair or remaining') + with (guard.HERE/'execution.lock').open('a') as lock: + guard.fcntl.flock(lock,guard.fcntl.LOCK_EX|guard.fcntl.LOCK_NB) + if sys.argv[1]=='pair': + for label,script in ORDER[:2]: + guard.run(label,script) + receipt(label) + summary=gate(['B1','C1']) + else: + gate(['B1','C1']) + for label,script in ORDER[2:]: + guard.run(label,script) + receipt(label) + summary=gate([label for label,_ in ORDER]) + (guard.HERE/('BENCHMARK-'+sys.argv[1]+'.json')).write_text(json.dumps(summary,indent=2,sort_keys=True)+'\n') + print(json.dumps(summary,sort_keys=True)) +if __name__=='__main__':main() diff --git a/research/p104-single-pass-qualification/candidate.py b/research/p104-single-pass-qualification/candidate.py new file mode 100644 index 0000000000..b2464cccfe --- /dev/null +++ b/research/p104-single-pass-qualification/candidate.py @@ -0,0 +1,79 @@ +"""Qualify each frozen arithmetic backend once; compare all retained outputs. + +Chris R / Clear1nsight with substantial OpenAI Codex assistance. Apache-2.0. +Arithmetic and every scientific oracle remain Ali Romman's unchanged sources. +""" +import gzip +import importlib.util +import json +import time + +from source import baseline, require, sha256 +from observe import Observation + + +def qualify(): + started = time.perf_counter() + with baseline() as package: + spec = importlib.util.spec_from_file_location('single_pass_source', package/'verify.py') + v = importlib.util.module_from_spec(spec) + spec.loader.exec_module(v) + with v.source() as (p, original, reference): + word = json.loads(gzip.decompress((p/'inputs/WORD.json.gz').read_bytes())) + expected = json.loads((p/'RESULT.json').read_bytes()) + contract = v.load('explicit_contract', package/'contract.py') + integer = v.load('integer_backend', package/'integer.py') + engine = integer.Engine(reference) + candidate = Observation(engine, reference.digest, word) + captures = [] + factory = original.module + + def observed_module(name, path): + value = factory(name, path) + if name == 'noisy_precision': + require(path == p/'precision.py' and not captures, 'one authenticated Fraction module') + value = Observation(value, reference.digest, word) + captures.append(value) + return value + + try: + result = contract.calculate(p, candidate) + require(result == expected, 'complete candidate source result and controls') + candidate.finish() + original.module = observed_module + fraction = original.calculate() + require(fraction == expected and result == fraction, 'complete independent Fraction/candidate result') + require(len(captures) == 1, 'one complete independent Fraction observation') + captures[0].finish() + except BaseException: + candidate.abort() + for capture in captures: + capture.abort() + raise + finally: + original.module = factory + a, b = captures[0].take(word), candidate.take(word) + require(a['ideal'] == b['ideal'], 'full independent ideal metadata and local weights') + require(a['error_trace'] == b['error_trace'], 'all actual trace and signed witness rows') + ideal, weights = a['ideal'] + receipt = dict(source_result_sha256=sha256(json.dumps(result,sort_keys=True,separators=(',',':')).encode()).hexdigest(), + events=result['ideal']['events'],coordinates=result['ideal']['n'], + source_controls=len(result['rejected_controls']),guards=result['sufficient_guard_bits']) + receipt['finite_fixtures'] = v.fixtures(reference, engine, integer) + receipt['coefficient_scale_bits'] = integer.setup(word, weights)[2].bit_length()-1 + receipt['all_actual_witness_rows_equal'] = True + require(receipt == json.loads((package/'RESULT.json').read_bytes()), 'complete frozen qualification receipt') + return receipt, time.perf_counter()-started + + +def main(): + # Qualification entry point includes the new finite observation controls. + import runpy + runpy.run_path(str(__import__('pathlib').Path(__file__).with_name('finite.py')),run_name='__main__') + receipt, seconds = qualify() + print('PASS_P104_SINGLE_PASS_QUALIFICATION') + print(json.dumps({'mode':'qualify','receipt':receipt,'seconds':round(seconds,6)},sort_keys=True)) + + +if __name__ == '__main__': + main() diff --git a/research/p104-single-pass-qualification/custody.py b/research/p104-single-pass-qualification/custody.py new file mode 100644 index 0000000000..f1fd37b644 --- /dev/null +++ b/research/p104-single-pass-qualification/custody.py @@ -0,0 +1,67 @@ +"""Reject corrupt source boundaries before scientific imports or execution.""" +import importlib.util +import json +from pathlib import Path +import shutil +import sys +import tempfile + +from source import baseline, payload, require, HERE + + +def reject(action, expected): + try: + action() + except ValueError as error: + require(str(error) == expected, 'Exact custody rejection predicate') + else: + raise ValueError('Corrupt source accepted') + + +def main(): + require(not sys.argv[1:], 'No custody arguments') + science = {'frozen_contract', 'frozen_precision', 'explicit_contract', 'integer_backend'} + before = set(sys.modules) & science + results = {} + with tempfile.TemporaryDirectory(prefix='precision-custody-') as temporary: + temporary = Path(temporary) + raw = bytearray((HERE / 'inputs/PR5831.tar').read_bytes()) + raw[len(raw) // 2] ^= 1 + damaged = temporary / 'damaged.tar' + damaged.write_bytes(raw) + reject(lambda: payload(damaged), 'Exact PR5831 bundle') + results['official_export_byte'] = 'Exact PR5831 bundle' + with baseline() as package: + for label in ('inner_archive', 'contract', 'declared_edit'): + root = temporary / label + copy = root / 'research/p104-integer-error-replay' + shutil.copytree(package, copy) + for path in [root, *root.rglob('*')]: + path.chmod(0o755 if path.is_dir() else 0o644) + if label == 'inner_archive': + file = copy / 'inputs/source.tar' + raw = bytearray(file.read_bytes()); raw[len(raw) // 2] ^= 1 + file.write_bytes(raw) + expected = 'source hash' + elif label == 'contract': + file = copy / 'contract.py' + file.write_bytes(file.read_bytes() + b'\n# changed contract\n') + expected = 'declared contract edits' + else: + file = copy / 'CONTRACT-EDITS.json' + edits = json.loads(file.read_bytes()); edits[0][0] = 'missing_backend_seam' + file.write_text(json.dumps(edits)) + expected = 'unique backend seam' + spec = importlib.util.spec_from_file_location('custody_entry_' + label, copy / 'verify.py') + module = importlib.util.module_from_spec(spec); spec.loader.exec_module(module) + def enter(): + with module.source(): + raise ValueError('Unexpected scientific admission') + reject(enter, expected) + require(set(sys.modules) & science == before, 'No scientific imports before rejection') + results[label] = expected + print('PASS_PRECISION_LINUX_SOURCE_CONTROLS', json.dumps(results, sort_keys=True)) + + +if __name__ == '__main__': + main() diff --git a/research/p104-single-pass-qualification/evidence/B1/receipt.json b/research/p104-single-pass-qualification/evidence/B1/receipt.json new file mode 100644 index 0000000000..bb9a0bda4c --- /dev/null +++ b/research/p104-single-pass-qualification/evidence/B1/receipt.json @@ -0,0 +1,25 @@ +{ + "exit": 0, + "label": "B1", + "optimized": false, + "platform": "Linux-7.0.0-38-generic-x86_64-with-glibc2.39", + "python": "3.12.3 (main, Aug 31 2026, 10:18:26) [GCC 13.3.0]", + "runner_sha256": "523aca683d41dd67cc08e6d7e3cff7bbd5ae5f43f22b4a446cb6b8c964703680", + "runtime_policy_sha256": "9e3b359ae35f943747fef22749632cb137606606c934da66bb83c75e22209900", + "sampled_process_group_rss_bytes": 107347968, + "source_bytes_and_modes_unchanged": true, + "source_inventory_sha256": "f1b9cd629a8b82fbbbfe8bfcfa255a5976c8379cc2e8ecc48a6f34c6ce521e81", + "status": "PASS", + "stderr_bytes": 0, + "stderr_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stdout_bytes": 490, + "stdout_sha256": "d835d0c9eecd0f1ea8ece765700ef3f8e51601f45533a1d5b4c5680fb5e5671a", + "termination": null, + "usage": { + "exit": 0, + "kernel_max_rss_kib": 103380, + "system_seconds": 0.12, + "user_seconds": 60.83 + }, + "wall_seconds": 61.007068632985465 +} diff --git a/research/p104-single-pass-qualification/evidence/B1/stderr.txt b/research/p104-single-pass-qualification/evidence/B1/stderr.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/research/p104-single-pass-qualification/evidence/B1/stdout.txt b/research/p104-single-pass-qualification/evidence/B1/stdout.txt new file mode 100644 index 0000000000..803479bcd5 --- /dev/null +++ b/research/p104-single-pass-qualification/evidence/B1/stdout.txt @@ -0,0 +1,2 @@ +PASS_P104_INTEGER_ERROR_REPLAY +{"mode": "qualify", "receipt": {"all_actual_witness_rows_equal": true, "coefficient_scale_bits": 55, "coordinates": 799, "events": 25984, "finite_fixtures": {"cases": 120, "controls": ["nondyadic scalar", "inexact scale division", "nondyadic weight"], "events": 4240}, "guards": {"owned": 22, "prefix": 26, "public": 23}, "source_controls": 6, "source_result_sha256": "cc7739703ed23532d187949c8507d09c13ac4c152e07a930f0087cde0d7a3d98"}, "seconds": 60.734479} diff --git a/research/p104-single-pass-qualification/evidence/B1/usage.json b/research/p104-single-pass-qualification/evidence/B1/usage.json new file mode 100644 index 0000000000..21949d369d --- /dev/null +++ b/research/p104-single-pass-qualification/evidence/B1/usage.json @@ -0,0 +1 @@ +{"user_seconds":60.83,"system_seconds":0.12,"kernel_max_rss_kib":103380,"exit":0} diff --git a/research/p104-single-pass-qualification/evidence/B2/receipt.json b/research/p104-single-pass-qualification/evidence/B2/receipt.json new file mode 100644 index 0000000000..f68e27f7c6 --- /dev/null +++ b/research/p104-single-pass-qualification/evidence/B2/receipt.json @@ -0,0 +1,25 @@ +{ + "exit": 0, + "label": "B2", + "optimized": false, + "platform": "Linux-7.0.0-38-generic-x86_64-with-glibc2.39", + "python": "3.12.3 (main, Aug 31 2026, 10:18:26) [GCC 13.3.0]", + "runner_sha256": "523aca683d41dd67cc08e6d7e3cff7bbd5ae5f43f22b4a446cb6b8c964703680", + "runtime_policy_sha256": "9e3b359ae35f943747fef22749632cb137606606c934da66bb83c75e22209900", + "sampled_process_group_rss_bytes": 107671552, + "source_bytes_and_modes_unchanged": true, + "source_inventory_sha256": "f1b9cd629a8b82fbbbfe8bfcfa255a5976c8379cc2e8ecc48a6f34c6ce521e81", + "status": "PASS", + "stderr_bytes": 0, + "stderr_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stdout_bytes": 490, + "stdout_sha256": "5364ed37f332b0dc413139f7b247ad7167f05376ddfed0db163d412444c54e8c", + "termination": null, + "usage": { + "exit": 0, + "kernel_max_rss_kib": 103696, + "system_seconds": 0.09, + "user_seconds": 62.82 + }, + "wall_seconds": 63.0594787329901 +} diff --git a/research/p104-single-pass-qualification/evidence/B2/stderr.txt b/research/p104-single-pass-qualification/evidence/B2/stderr.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/research/p104-single-pass-qualification/evidence/B2/stdout.txt b/research/p104-single-pass-qualification/evidence/B2/stdout.txt new file mode 100644 index 0000000000..968afd624a --- /dev/null +++ b/research/p104-single-pass-qualification/evidence/B2/stdout.txt @@ -0,0 +1,2 @@ +PASS_P104_INTEGER_ERROR_REPLAY +{"mode": "qualify", "receipt": {"all_actual_witness_rows_equal": true, "coefficient_scale_bits": 55, "coordinates": 799, "events": 25984, "finite_fixtures": {"cases": 120, "controls": ["nondyadic scalar", "inexact scale division", "nondyadic weight"], "events": 4240}, "guards": {"owned": 22, "prefix": 26, "public": 23}, "source_controls": 6, "source_result_sha256": "cc7739703ed23532d187949c8507d09c13ac4c152e07a930f0087cde0d7a3d98"}, "seconds": 62.802535} diff --git a/research/p104-single-pass-qualification/evidence/B2/usage.json b/research/p104-single-pass-qualification/evidence/B2/usage.json new file mode 100644 index 0000000000..6355236221 --- /dev/null +++ b/research/p104-single-pass-qualification/evidence/B2/usage.json @@ -0,0 +1 @@ +{"user_seconds":62.82,"system_seconds":0.09,"kernel_max_rss_kib":103696,"exit":0} diff --git a/research/p104-single-pass-qualification/evidence/B3/receipt.json b/research/p104-single-pass-qualification/evidence/B3/receipt.json new file mode 100644 index 0000000000..d3da142604 --- /dev/null +++ b/research/p104-single-pass-qualification/evidence/B3/receipt.json @@ -0,0 +1,25 @@ +{ + "exit": 0, + "label": "B3", + "optimized": false, + "platform": "Linux-7.0.0-38-generic-x86_64-with-glibc2.39", + "python": "3.12.3 (main, Aug 31 2026, 10:18:26) [GCC 13.3.0]", + "runner_sha256": "523aca683d41dd67cc08e6d7e3cff7bbd5ae5f43f22b4a446cb6b8c964703680", + "runtime_policy_sha256": "9e3b359ae35f943747fef22749632cb137606606c934da66bb83c75e22209900", + "sampled_process_group_rss_bytes": 107892736, + "source_bytes_and_modes_unchanged": true, + "source_inventory_sha256": "f1b9cd629a8b82fbbbfe8bfcfa255a5976c8379cc2e8ecc48a6f34c6ce521e81", + "status": "PASS", + "stderr_bytes": 0, + "stderr_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stdout_bytes": 490, + "stdout_sha256": "0a4fadf5e8f111853df912f005bafa35bf150f40be39af16e0dde7bb0c6f6de6", + "termination": null, + "usage": { + "exit": 0, + "kernel_max_rss_kib": 103912, + "system_seconds": 0.09, + "user_seconds": 60.54 + }, + "wall_seconds": 60.716181925992714 +} diff --git a/research/p104-single-pass-qualification/evidence/B3/stderr.txt b/research/p104-single-pass-qualification/evidence/B3/stderr.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/research/p104-single-pass-qualification/evidence/B3/stdout.txt b/research/p104-single-pass-qualification/evidence/B3/stdout.txt new file mode 100644 index 0000000000..d1edb1e57c --- /dev/null +++ b/research/p104-single-pass-qualification/evidence/B3/stdout.txt @@ -0,0 +1,2 @@ +PASS_P104_INTEGER_ERROR_REPLAY +{"mode": "qualify", "receipt": {"all_actual_witness_rows_equal": true, "coefficient_scale_bits": 55, "coordinates": 799, "events": 25984, "finite_fixtures": {"cases": 120, "controls": ["nondyadic scalar", "inexact scale division", "nondyadic weight"], "events": 4240}, "guards": {"owned": 22, "prefix": 26, "public": 23}, "source_controls": 6, "source_result_sha256": "cc7739703ed23532d187949c8507d09c13ac4c152e07a930f0087cde0d7a3d98"}, "seconds": 60.397112} diff --git a/research/p104-single-pass-qualification/evidence/B3/usage.json b/research/p104-single-pass-qualification/evidence/B3/usage.json new file mode 100644 index 0000000000..078be6f9cf --- /dev/null +++ b/research/p104-single-pass-qualification/evidence/B3/usage.json @@ -0,0 +1 @@ +{"user_seconds":60.54,"system_seconds":0.09,"kernel_max_rss_kib":103912,"exit":0} diff --git a/research/p104-single-pass-qualification/evidence/C1/receipt.json b/research/p104-single-pass-qualification/evidence/C1/receipt.json new file mode 100644 index 0000000000..38705c7ed2 --- /dev/null +++ b/research/p104-single-pass-qualification/evidence/C1/receipt.json @@ -0,0 +1,25 @@ +{ + "exit": 0, + "label": "C1", + "optimized": false, + "platform": "Linux-7.0.0-38-generic-x86_64-with-glibc2.39", + "python": "3.12.3 (main, Aug 31 2026, 10:18:26) [GCC 13.3.0]", + "runner_sha256": "523aca683d41dd67cc08e6d7e3cff7bbd5ae5f43f22b4a446cb6b8c964703680", + "runtime_policy_sha256": "9e3b359ae35f943747fef22749632cb137606606c934da66bb83c75e22209900", + "sampled_process_group_rss_bytes": 122322944, + "source_bytes_and_modes_unchanged": true, + "source_inventory_sha256": "f1b9cd629a8b82fbbbfe8bfcfa255a5976c8379cc2e8ecc48a6f34c6ce521e81", + "status": "PASS", + "stderr_bytes": 0, + "stderr_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stdout_bytes": 1086, + "stdout_sha256": "597f01e3e708ab5513242e1867c15d8a33c7c2ebf0d1ed60ae97301e118931fc", + "termination": null, + "usage": { + "exit": 0, + "kernel_max_rss_kib": 118004, + "system_seconds": 0.08, + "user_seconds": 38.8 + }, + "wall_seconds": 38.93709892901825 +} diff --git a/research/p104-single-pass-qualification/evidence/C1/stderr.txt b/research/p104-single-pass-qualification/evidence/C1/stderr.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/research/p104-single-pass-qualification/evidence/C1/stdout.txt b/research/p104-single-pass-qualification/evidence/C1/stdout.txt new file mode 100644 index 0000000000..624c66aca2 --- /dev/null +++ b/research/p104-single-pass-qualification/evidence/C1/stdout.txt @@ -0,0 +1,3 @@ +{"backends": 2, "controls": ["one-use", "closed-call", "missing", "duplicate", "changed-weights", "changed-rounding", "changed-word", "original-malformed-rejection", "propagated-exception", "failed-finish", "failed-take", "fresh-context-not-previous-pass", "aborted-take", "one-use", "closed-call", "missing", "duplicate", "changed-weights", "changed-rounding", "changed-word", "original-malformed-rejection", "propagated-exception", "failed-finish", "failed-take", "fresh-context-not-previous-pass", "aborted-take", "input-mutation"], "events": 5, "status": "PASS_FINITE_FEASIBILITY_ONLY"} +PASS_P104_SINGLE_PASS_QUALIFICATION +{"mode": "qualify", "receipt": {"all_actual_witness_rows_equal": true, "coefficient_scale_bits": 55, "coordinates": 799, "events": 25984, "finite_fixtures": {"cases": 120, "controls": ["nondyadic scalar", "inexact scale division", "nondyadic weight"], "events": 4240}, "guards": {"owned": 22, "prefix": 26, "public": 23}, "source_controls": 6, "source_result_sha256": "cc7739703ed23532d187949c8507d09c13ac4c152e07a930f0087cde0d7a3d98"}, "seconds": 38.617363} diff --git a/research/p104-single-pass-qualification/evidence/C1/usage.json b/research/p104-single-pass-qualification/evidence/C1/usage.json new file mode 100644 index 0000000000..07a215b257 --- /dev/null +++ b/research/p104-single-pass-qualification/evidence/C1/usage.json @@ -0,0 +1 @@ +{"user_seconds":38.80,"system_seconds":0.08,"kernel_max_rss_kib":118004,"exit":0} diff --git a/research/p104-single-pass-qualification/evidence/C2/receipt.json b/research/p104-single-pass-qualification/evidence/C2/receipt.json new file mode 100644 index 0000000000..22ddc3b79d --- /dev/null +++ b/research/p104-single-pass-qualification/evidence/C2/receipt.json @@ -0,0 +1,25 @@ +{ + "exit": 0, + "label": "C2", + "optimized": false, + "platform": "Linux-7.0.0-38-generic-x86_64-with-glibc2.39", + "python": "3.12.3 (main, Aug 31 2026, 10:18:26) [GCC 13.3.0]", + "runner_sha256": "523aca683d41dd67cc08e6d7e3cff7bbd5ae5f43f22b4a446cb6b8c964703680", + "runtime_policy_sha256": "9e3b359ae35f943747fef22749632cb137606606c934da66bb83c75e22209900", + "sampled_process_group_rss_bytes": 122236928, + "source_bytes_and_modes_unchanged": true, + "source_inventory_sha256": "f1b9cd629a8b82fbbbfe8bfcfa255a5976c8379cc2e8ecc48a6f34c6ce521e81", + "status": "PASS", + "stderr_bytes": 0, + "stderr_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stdout_bytes": 1086, + "stdout_sha256": "20c06368a4b7b79a23c1b60ecb9662e6fe453c5361aae975f7ca0cbe37cb4655", + "termination": null, + "usage": { + "exit": 0, + "kernel_max_rss_kib": 117920, + "system_seconds": 0.08, + "user_seconds": 38.8 + }, + "wall_seconds": 39.01679050299572 +} diff --git a/research/p104-single-pass-qualification/evidence/C2/stderr.txt b/research/p104-single-pass-qualification/evidence/C2/stderr.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/research/p104-single-pass-qualification/evidence/C2/stdout.txt b/research/p104-single-pass-qualification/evidence/C2/stdout.txt new file mode 100644 index 0000000000..5ce55f33c1 --- /dev/null +++ b/research/p104-single-pass-qualification/evidence/C2/stdout.txt @@ -0,0 +1,3 @@ +{"backends": 2, "controls": ["one-use", "closed-call", "missing", "duplicate", "changed-weights", "changed-rounding", "changed-word", "original-malformed-rejection", "propagated-exception", "failed-finish", "failed-take", "fresh-context-not-previous-pass", "aborted-take", "one-use", "closed-call", "missing", "duplicate", "changed-weights", "changed-rounding", "changed-word", "original-malformed-rejection", "propagated-exception", "failed-finish", "failed-take", "fresh-context-not-previous-pass", "aborted-take", "input-mutation"], "events": 5, "status": "PASS_FINITE_FEASIBILITY_ONLY"} +PASS_P104_SINGLE_PASS_QUALIFICATION +{"mode": "qualify", "receipt": {"all_actual_witness_rows_equal": true, "coefficient_scale_bits": 55, "coordinates": 799, "events": 25984, "finite_fixtures": {"cases": 120, "controls": ["nondyadic scalar", "inexact scale division", "nondyadic weight"], "events": 4240}, "guards": {"owned": 22, "prefix": 26, "public": 23}, "source_controls": 6, "source_result_sha256": "cc7739703ed23532d187949c8507d09c13ac4c152e07a930f0087cde0d7a3d98"}, "seconds": 38.679268} diff --git a/research/p104-single-pass-qualification/evidence/C2/usage.json b/research/p104-single-pass-qualification/evidence/C2/usage.json new file mode 100644 index 0000000000..71a2ccbdfe --- /dev/null +++ b/research/p104-single-pass-qualification/evidence/C2/usage.json @@ -0,0 +1 @@ +{"user_seconds":38.80,"system_seconds":0.08,"kernel_max_rss_kib":117920,"exit":0} diff --git a/research/p104-single-pass-qualification/evidence/C3/receipt.json b/research/p104-single-pass-qualification/evidence/C3/receipt.json new file mode 100644 index 0000000000..30a135acaa --- /dev/null +++ b/research/p104-single-pass-qualification/evidence/C3/receipt.json @@ -0,0 +1,25 @@ +{ + "exit": 0, + "label": "C3", + "optimized": false, + "platform": "Linux-7.0.0-38-generic-x86_64-with-glibc2.39", + "python": "3.12.3 (main, Aug 31 2026, 10:18:26) [GCC 13.3.0]", + "runner_sha256": "523aca683d41dd67cc08e6d7e3cff7bbd5ae5f43f22b4a446cb6b8c964703680", + "runtime_policy_sha256": "9e3b359ae35f943747fef22749632cb137606606c934da66bb83c75e22209900", + "sampled_process_group_rss_bytes": 121622528, + "source_bytes_and_modes_unchanged": true, + "source_inventory_sha256": "f1b9cd629a8b82fbbbfe8bfcfa255a5976c8379cc2e8ecc48a6f34c6ce521e81", + "status": "PASS", + "stderr_bytes": 0, + "stderr_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stdout_bytes": 1085, + "stdout_sha256": "516780c2b8645a2536280c20ec8885e60b96b0debff5005f91a2ba327fdc0a95", + "termination": null, + "usage": { + "exit": 0, + "kernel_max_rss_kib": 117320, + "system_seconds": 0.1, + "user_seconds": 38.83 + }, + "wall_seconds": 39.01491572102532 +} diff --git a/research/p104-single-pass-qualification/evidence/C3/stderr.txt b/research/p104-single-pass-qualification/evidence/C3/stderr.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/research/p104-single-pass-qualification/evidence/C3/stdout.txt b/research/p104-single-pass-qualification/evidence/C3/stdout.txt new file mode 100644 index 0000000000..f022a48359 --- /dev/null +++ b/research/p104-single-pass-qualification/evidence/C3/stdout.txt @@ -0,0 +1,3 @@ +{"backends": 2, "controls": ["one-use", "closed-call", "missing", "duplicate", "changed-weights", "changed-rounding", "changed-word", "original-malformed-rejection", "propagated-exception", "failed-finish", "failed-take", "fresh-context-not-previous-pass", "aborted-take", "one-use", "closed-call", "missing", "duplicate", "changed-weights", "changed-rounding", "changed-word", "original-malformed-rejection", "propagated-exception", "failed-finish", "failed-take", "fresh-context-not-previous-pass", "aborted-take", "input-mutation"], "events": 5, "status": "PASS_FINITE_FEASIBILITY_ONLY"} +PASS_P104_SINGLE_PASS_QUALIFICATION +{"mode": "qualify", "receipt": {"all_actual_witness_rows_equal": true, "coefficient_scale_bits": 55, "coordinates": 799, "events": 25984, "finite_fixtures": {"cases": 120, "controls": ["nondyadic scalar", "inexact scale division", "nondyadic weight"], "events": 4240}, "guards": {"owned": 22, "prefix": 26, "public": 23}, "source_controls": 6, "source_result_sha256": "cc7739703ed23532d187949c8507d09c13ac4c152e07a930f0087cde0d7a3d98"}, "seconds": 38.68864} diff --git a/research/p104-single-pass-qualification/evidence/C3/usage.json b/research/p104-single-pass-qualification/evidence/C3/usage.json new file mode 100644 index 0000000000..f18c8053dd --- /dev/null +++ b/research/p104-single-pass-qualification/evidence/C3/usage.json @@ -0,0 +1 @@ +{"user_seconds":38.83,"system_seconds":0.10,"kernel_max_rss_kib":117320,"exit":0} diff --git a/research/p104-single-pass-qualification/evidence/CLAIM.md b/research/p104-single-pass-qualification/evidence/CLAIM.md new file mode 100644 index 0000000000..3953de4f1e --- /dev/null +++ b/research/p104-single-pass-qualification/evidence/CLAIM.md @@ -0,0 +1 @@ +CLAIM — bounded verification-engineering follow-up to [PR #5839](https://github.com/CrocSwap/integer-mult-bounds/pull/5839). Profile shared helper tests (first the complete descendant-source-role group flagged by existing CI timestamps) and full frozen [PR #5831](https://github.com/CrocSwap/integer-mult-bounds/pull/5831) qualification at `7c5eb98e7439d778141d63e801e53d4cd7e1d587`. Authenticate fixtures/history first; profile before nomination; test finite coverage/isolation feasibility before construction. Keep all affected tests and failure behaviour, or all 25,984 events/799 coordinates, independent Fraction/integer backends, actual witnesses and 120-program/4,240-event controls. At most one candidate; a performance PR requires >=15% complete-stage wall AND CPU savings. Serial, no automatic retries; source precision command remains 180 s, helper group capped at 300 s (below its 10-minute CI job), 1 GiB sampled group RSS, 600 s profile stage and 1,500 s later cumulative cap. Stop on missing closure, source/receipt/control drift, stderr/resource failure or insufficient complete-stage saving; preserve failures. Canonical main `de5ec2e7a6074068452f45b1a191b5c72832df4a`; targeted PR/source searches show no matching successor but do not establish exhaustive/unpublished coverage. Expiry 27 October 2026 at 18:00 AEDT. Kappa research, Work 1/2, feeds, workers and automations remain paused. Preserve Ali Romman, roger-sato/Arham Tahir, PR5761/5816/5818/5831/5832/5839 and all retained precision/tooling provenance. Chris R / Clear1nsight with substantial OpenAI Codex assistance; no subagents. diff --git a/research/p104-single-pass-qualification/evidence/FEASIBILITY-PLAN.md b/research/p104-single-pass-qualification/evidence/FEASIBILITY-PLAN.md new file mode 100644 index 0000000000..a2ed933e42 --- /dev/null +++ b/research/p104-single-pass-qualification/evidence/FEASIBILITY-PLAN.md @@ -0,0 +1,9 @@ +# Pre-construction feasibility gate + +Profile result: complete frozen PR5831 qualification costs 61.609 s wall /61.55 s CPU. Extra Fraction ideal/error calls account for about 23 s inclusive; integer actual calls add more. No full-stage saving is claimed from this instrumented run. + +Nomination: scoped capture of the successful actual ideal and error-trace outputs inside each independently executed complete contract. Keep the full Fraction and integer calculations, every transpose/literal oracle and rejection, all actual witness/weight comparisons and all 120 finite programs. No sharing between backends or runs, no persisted cache, and no removal of full-source authentication. Captures are one-use observations rather than arithmetic results reused to skip a backend. + +Before construction, use a valid five-event native-frame fixture through the real frozen Fraction and integer modules. Compare both full captured ideal/weights and trace/witness results to fresh independent reruns. Require missing capture, duplicate actual calls, wrong word, changed weights/rounding, mutable-return aliasing, exception, cross-context reuse and use after close to be detected or isolated as specified. Original source exceptions must propagate; unrelated malformed-word rejection calls cannot overwrite actual observations. Capture succeeds only after a successful complete enclosing calculation. Fail closed on changed input during execution. No scientific construction or source edit before this test passes. + +A positive finite result only permits one complete candidate. First fresh complete B/C pair must save >=15% wall and CPU, followed by the retained B,C,C,B,B,C order, normal/optimized/sealed qualification and receipt/control equality. Coverage includes every 25,984 event,799-coordinate pass and independent oracle from PR5831; no shared-helper test change is authorized by this nomination. diff --git a/research/p104-single-pass-qualification/evidence/HELPER-CLOSURE.json b/research/p104-single-pass-qualification/evidence/HELPER-CLOSURE.json new file mode 100644 index 0000000000..431852011c --- /dev/null +++ b/research/p104-single-pass-qualification/evidence/HELPER-CLOSURE.json @@ -0,0 +1,58 @@ +{ + "status": "PASS_PREFLIGHT", + "original": "20ecf2891d80b5acf18d980b2164fb44ea7faa90", + "base": "6f100d4bb5083f8c35d96fd95a539811c62f245c", + "files": { + "research/isolated-descendant-bytecode/README.md": "30ade86e2681f2e81f63deef3abf0b0e57f8af63118bd0333d8011695f24e67d", + "research/isolated-descendant-bytecode/RESULT.json": "f427603d45345ebc2ccaee556e8e400e4440634eec14d6ae81df0fb581df1b63", + "research/isolated-descendant-bytecode/SOURCES.json": "5f0801637836f610178e969b14225e14d6dfc945f8c4b674130facf6a3003b11", + "research/isolated-descendant-bytecode/TASK.json": "a7839edce8a021efc250887a69bf1d12fa4b838ced52d2e8b275df5442b182ba", + "research/isolated-descendant-bytecode/VERIFY.json": "44f95793d568c302d9256395560c45bed3254f1c8c6850a4e12c62ab8544263f", + "research/isolated-descendant-bytecode/verify.py": "788ec6375dff8c519a96801aca78d5c3c3724de80458db48606e68fda9091b31", + "scripts/check_research_commit.py": "63026ec3805f2a3236cc071fc78cf1c54bc6528c43e2f3d82548dc68bf346bce", + "scripts/replay_historical_check.py": "5467619c78183d3adc82b0cb55af28e5c1a01fca2b0588677816244b53e2bafd", + "scripts/research_package.py": "84a45190a6a96c20993a0d4a1045fbf24de660d2e6fef8f8a447bb3d1aa78db6", + "scripts/run_isolated_tests.py": "f52f3df082b55f19a39db1d7874a29a7797ffa9ae2bac34f9a97789657e03948", + "tests/test_isolated_test_bytecode.py": "c0aa83b63b982a3a7283a28b86c4ddf2edc6060f53be7d206a90a147b7676004", + "tests/test_research_bytecode_isolation.py": "799244198e2e673cab05537d5a4b36ceed3dacc3e4e6677d25467103edd65270", + "tests/test_research_source_history.py": "0175206fa52dff514fea4d625a072bb66735eb5214be9396dc42b874f0918454" + }, + "pinned_historical_rows": [ + { + "path": "certificates/selected-result.json", + "usage": "provenance", + "git_blob": "b1fea0c94436b236cc2b7d41a7be032811b94c81", + "sha256": "bb2eaa58647b353f88d0aec2eafb9d30df1be53589231b23e12ceef3e4bad129" + }, + { + "path": "docs/research/agent-task-catalog.json", + "usage": "provenance", + "git_blob": "67f085acd86acd7d4e03922d9cf4b26bca66fed5", + "sha256": "47b42433f5a85809a3aadd29c2c339da2c6ed728e4f7762df6b88bccb7874cf0" + }, + { + "path": "scripts/check_research_commit.py", + "usage": "input", + "git_blob": "08a956131b578fe947c20148871dc1c34fba9b12", + "sha256": "ecf206a82bf1f4e748efb6cc639919582050d173b3537ec12f7265a4f7b55ead" + }, + { + "path": "scripts/research_package.py", + "usage": "provenance", + "git_blob": "404823640a4506cc363d5e999b724553a41a39a2", + "sha256": "8e1fe8bebe7f045c82a672a103ed87a35cd9dfdbab5848b97969350449d0c8b4" + }, + { + "path": "scripts/run_isolated_tests.py", + "usage": "provenance", + "git_blob": "50a2d5d2af4ea8f61b6c1d93924febea4f32f439", + "sha256": "88d738d3c1e8eb9bd580d9dc2f40b0421975e46013ce09bd6833d97a8600789d" + }, + { + "path": "tests/test_research_source_history.py", + "usage": "provenance", + "git_blob": "9c52884a4663c089e2331b769b50d14da4575d9f", + "sha256": "2b974b7c1f5fcb1994c2b76be32554378cec91871224fca0af011d0640dc5514" + } + ] +} diff --git a/research/p104-single-pass-qualification/evidence/METADATA-DRAFT-REJECTION.txt b/research/p104-single-pass-qualification/evidence/METADATA-DRAFT-REJECTION.txt new file mode 100644 index 0000000000..e34101fd1a --- /dev/null +++ b/research/p104-single-pass-qualification/evidence/METADATA-DRAFT-REJECTION.txt @@ -0,0 +1 @@ +Before execution of the registered entry point, metadata --check-only rejected the draft outcome string: TASK.json.outcome must be partial, completed, blocked or negative-result; found "in validation". Corrected the draft enum to partial; no source, expected output, scientific code or resource limit changed. This is a metadata preflight rejection, not a scientific run. diff --git a/research/p104-single-pass-qualification/evidence/PLAN.json b/research/p104-single-pass-qualification/evidence/PLAN.json new file mode 100644 index 0000000000..724dda740c --- /dev/null +++ b/research/p104-single-pass-qualification/evidence/PLAN.json @@ -0,0 +1,51 @@ +{ + "scope": "Profile a nominated shared-helper group and full frozen PR5831 qualification, then choose at most one optimisation after feasibility.", + "main": "de5ec2e7a6074068452f45b1a191b5c72832df4a", + "base_with_exact_PR5761_test_dependency": "01014cbe772ea5a59ccbc55266222433944c7368", + "precision_head": "7c5eb98e7439d778141d63e801e53d4cd7e1d587", + "helper_group": "test_research_descendant_source_roles (screened from existing CI timestamps; not yet profiled)", + "gates": [ + "Authenticate full helper fixture/history closure before collecting tests; preserve incomplete preflight as unavailable, never as a pass.", + "One serial per-test/function profile of the nominated helper group and one full precision qualification. Profiling excluded from performance comparison.", + "Require source-bound coverage map and tiny actual feasibility with mutation/stale/missing/exception controls before optimisation construction.", + "Require >=15% less wall and CPU across the complete affected stage, first pair before expanded measurements. Retain all samples and failures.", + "If shared tests change, preserve all 513 collected test IDs and platform-skip conditions with fresh mutable state; if precision changes, preserve all original 25984 events/799 coordinates, both independent arithmetic backends, full witnesses, all 120/4240 finite checks and all controls.", + "Normal/optimized/read-only Git-free relevant checks, exact committed head and hosted CI before final PR handoff." + ], + "limits": { + "profile_stage_seconds": 600, + "later_cumulative_seconds": 1500, + "precision_command_seconds": 180, + "helper_group_seconds": 300, + "sampled_process_group_rss_bytes": 1073741824, + "serial_full_runs": true, + "automatic_retries": 0 + }, + "stop": [ + "Source/fixture/head/byte/mode drift or incomplete required closure.", + "Scientific/test assertion/receipt/control mismatch, unexpected stderr or resource stop. Preserve a diagnosed pre-target launcher error separately before any manual correction.", + "No credible complete-stage 15% opportunity, coverage/isolation loss or existing overlapping implementation: retain scoped finding and reassess before expansion." + ], + "kappa_research": "PAUSED", + "agents_dispatched": 0, + "nomination": "Independent one-use first-pass observation for frozen PR5831 complete qualification; no shared helper edits", + "profile_gate": { + "status": "PASS", + "helper_wall_seconds": 51.317216966999695, + "helper_setup_seconds": 0.2867602859332692, + "helper_fixture_only_max_fraction": 0.005587993715981805, + "helper_tests": 10, + "helper_fixture_reuse": "STOP: even zero setup is below15%", + "precision_wall_seconds": 61.608995726011926, + "full_receipt_equal": true + }, + "feasibility_gate": { + "status": "PASS", + "controls": 27, + "backends": 2, + "events": 5, + "normal_and_O": true, + "native_argument_types_preserved": true + }, + "construction_gate": "OPEN: one candidate; first complete B/C pair gates expanded runs" +} diff --git a/research/p104-single-pass-qualification/evidence/finite-O/receipt.json b/research/p104-single-pass-qualification/evidence/finite-O/receipt.json new file mode 100644 index 0000000000..19a6b2a4cb --- /dev/null +++ b/research/p104-single-pass-qualification/evidence/finite-O/receipt.json @@ -0,0 +1,25 @@ +{ + "exit": 0, + "label": "finite-O", + "optimized": true, + "platform": "Linux-7.0.0-38-generic-x86_64-with-glibc2.39", + "python": "3.12.3 (main, Aug 31 2026, 10:18:26) [GCC 13.3.0]", + "runner_sha256": "269fbaf3439c35813a6b979d1f270c43ffc1eee887687683931f28a1906d8a85", + "runtime_policy_sha256": "1841981e12a6f7ab70e17fdbedb913b15fc365aa28292f0c5fc3cb7e4ec2ba86", + "sampled_process_group_rss_bytes": 26308608, + "source_bytes_and_modes_unchanged": true, + "source_inventory_sha256": "c4928c1ce12e50e4b3a28e4a415f28aabc8cd26eccb2e4ad7f33925fc90edf1f", + "status": "PASS", + "stderr_bytes": 0, + "stderr_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stdout_bytes": 591, + "stdout_sha256": "a572476833d446e9ea4197aa8550854997bdd344fa9fd6e5dc916cb236a46f42", + "termination": null, + "usage": { + "exit": 0, + "kernel_max_rss_kib": 24424, + "system_seconds": 0.01, + "user_seconds": 0.21 + }, + "wall_seconds": 0.2544275099935476 +} diff --git a/research/p104-single-pass-qualification/evidence/finite-O/stderr.txt b/research/p104-single-pass-qualification/evidence/finite-O/stderr.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/research/p104-single-pass-qualification/evidence/finite-O/stdout.txt b/research/p104-single-pass-qualification/evidence/finite-O/stdout.txt new file mode 100644 index 0000000000..a9fca8aeef --- /dev/null +++ b/research/p104-single-pass-qualification/evidence/finite-O/stdout.txt @@ -0,0 +1 @@ +{"backends": 2, "controls": ["one-use", "closed-call", "missing", "duplicate", "changed-weights", "changed-rounding", "changed-word", "original-malformed-rejection", "propagated-exception", "failed-finish", "failed-take", "fresh-context-not-previous-pass", "aborted-take", "one-use", "closed-call", "missing", "duplicate", "changed-weights", "changed-rounding", "changed-word", "original-malformed-rejection", "propagated-exception", "failed-finish", "failed-take", "fresh-context-not-previous-pass", "aborted-take", "input-mutation"], "events": 5, "status": "PASS_FINITE_FEASIBILITY_ONLY"} diff --git a/research/p104-single-pass-qualification/evidence/finite-O/usage.json b/research/p104-single-pass-qualification/evidence/finite-O/usage.json new file mode 100644 index 0000000000..7ad12dbfe8 --- /dev/null +++ b/research/p104-single-pass-qualification/evidence/finite-O/usage.json @@ -0,0 +1 @@ +{"user_seconds":0.21,"system_seconds":0.01,"kernel_max_rss_kib":24424,"exit":0} diff --git a/research/p104-single-pass-qualification/evidence/finite-native-set-O/receipt.json b/research/p104-single-pass-qualification/evidence/finite-native-set-O/receipt.json new file mode 100644 index 0000000000..7344ac3e7f --- /dev/null +++ b/research/p104-single-pass-qualification/evidence/finite-native-set-O/receipt.json @@ -0,0 +1,25 @@ +{ + "exit": 0, + "label": "finite-native-set-O", + "optimized": true, + "platform": "Linux-7.0.0-38-generic-x86_64-with-glibc2.39", + "python": "3.12.3 (main, Aug 31 2026, 10:18:26) [GCC 13.3.0]", + "runner_sha256": "269fbaf3439c35813a6b979d1f270c43ffc1eee887687683931f28a1906d8a85", + "runtime_policy_sha256": "1841981e12a6f7ab70e17fdbedb913b15fc365aa28292f0c5fc3cb7e4ec2ba86", + "sampled_process_group_rss_bytes": 25640960, + "source_bytes_and_modes_unchanged": true, + "source_inventory_sha256": "3acf6e190c978a1b736896cceea89423b9190063b9111cc160414d0879df2444", + "status": "PASS", + "stderr_bytes": 0, + "stderr_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stdout_bytes": 591, + "stdout_sha256": "a572476833d446e9ea4197aa8550854997bdd344fa9fd6e5dc916cb236a46f42", + "termination": null, + "usage": { + "exit": 0, + "kernel_max_rss_kib": 24376, + "system_seconds": 0.01, + "user_seconds": 0.2 + }, + "wall_seconds": 0.2536778039939236 +} diff --git a/research/p104-single-pass-qualification/evidence/finite-native-set-O/stderr.txt b/research/p104-single-pass-qualification/evidence/finite-native-set-O/stderr.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/research/p104-single-pass-qualification/evidence/finite-native-set-O/stdout.txt b/research/p104-single-pass-qualification/evidence/finite-native-set-O/stdout.txt new file mode 100644 index 0000000000..a9fca8aeef --- /dev/null +++ b/research/p104-single-pass-qualification/evidence/finite-native-set-O/stdout.txt @@ -0,0 +1 @@ +{"backends": 2, "controls": ["one-use", "closed-call", "missing", "duplicate", "changed-weights", "changed-rounding", "changed-word", "original-malformed-rejection", "propagated-exception", "failed-finish", "failed-take", "fresh-context-not-previous-pass", "aborted-take", "one-use", "closed-call", "missing", "duplicate", "changed-weights", "changed-rounding", "changed-word", "original-malformed-rejection", "propagated-exception", "failed-finish", "failed-take", "fresh-context-not-previous-pass", "aborted-take", "input-mutation"], "events": 5, "status": "PASS_FINITE_FEASIBILITY_ONLY"} diff --git a/research/p104-single-pass-qualification/evidence/finite-native-set-O/usage.json b/research/p104-single-pass-qualification/evidence/finite-native-set-O/usage.json new file mode 100644 index 0000000000..1eaaa8ca23 --- /dev/null +++ b/research/p104-single-pass-qualification/evidence/finite-native-set-O/usage.json @@ -0,0 +1 @@ +{"user_seconds":0.20,"system_seconds":0.01,"kernel_max_rss_kib":24376,"exit":0} diff --git a/research/p104-single-pass-qualification/evidence/finite-native-set/receipt.json b/research/p104-single-pass-qualification/evidence/finite-native-set/receipt.json new file mode 100644 index 0000000000..4049d117ba --- /dev/null +++ b/research/p104-single-pass-qualification/evidence/finite-native-set/receipt.json @@ -0,0 +1,25 @@ +{ + "exit": 0, + "label": "finite-native-set", + "optimized": false, + "platform": "Linux-7.0.0-38-generic-x86_64-with-glibc2.39", + "python": "3.12.3 (main, Aug 31 2026, 10:18:26) [GCC 13.3.0]", + "runner_sha256": "269fbaf3439c35813a6b979d1f270c43ffc1eee887687683931f28a1906d8a85", + "runtime_policy_sha256": "1841981e12a6f7ab70e17fdbedb913b15fc365aa28292f0c5fc3cb7e4ec2ba86", + "sampled_process_group_rss_bytes": 26578944, + "source_bytes_and_modes_unchanged": true, + "source_inventory_sha256": "3acf6e190c978a1b736896cceea89423b9190063b9111cc160414d0879df2444", + "status": "PASS", + "stderr_bytes": 0, + "stderr_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stdout_bytes": 591, + "stdout_sha256": "a572476833d446e9ea4197aa8550854997bdd344fa9fd6e5dc916cb236a46f42", + "termination": null, + "usage": { + "exit": 0, + "kernel_max_rss_kib": 24832, + "system_seconds": 0.01, + "user_seconds": 0.24 + }, + "wall_seconds": 0.3065952259930782 +} diff --git a/research/p104-single-pass-qualification/evidence/finite-native-set/stderr.txt b/research/p104-single-pass-qualification/evidence/finite-native-set/stderr.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/research/p104-single-pass-qualification/evidence/finite-native-set/stdout.txt b/research/p104-single-pass-qualification/evidence/finite-native-set/stdout.txt new file mode 100644 index 0000000000..a9fca8aeef --- /dev/null +++ b/research/p104-single-pass-qualification/evidence/finite-native-set/stdout.txt @@ -0,0 +1 @@ +{"backends": 2, "controls": ["one-use", "closed-call", "missing", "duplicate", "changed-weights", "changed-rounding", "changed-word", "original-malformed-rejection", "propagated-exception", "failed-finish", "failed-take", "fresh-context-not-previous-pass", "aborted-take", "one-use", "closed-call", "missing", "duplicate", "changed-weights", "changed-rounding", "changed-word", "original-malformed-rejection", "propagated-exception", "failed-finish", "failed-take", "fresh-context-not-previous-pass", "aborted-take", "input-mutation"], "events": 5, "status": "PASS_FINITE_FEASIBILITY_ONLY"} diff --git a/research/p104-single-pass-qualification/evidence/finite-native-set/usage.json b/research/p104-single-pass-qualification/evidence/finite-native-set/usage.json new file mode 100644 index 0000000000..c84cfe9707 --- /dev/null +++ b/research/p104-single-pass-qualification/evidence/finite-native-set/usage.json @@ -0,0 +1 @@ +{"user_seconds":0.24,"system_seconds":0.01,"kernel_max_rss_kib":24832,"exit":0} diff --git a/research/p104-single-pass-qualification/evidence/finite/receipt.json b/research/p104-single-pass-qualification/evidence/finite/receipt.json new file mode 100644 index 0000000000..576220ae3d --- /dev/null +++ b/research/p104-single-pass-qualification/evidence/finite/receipt.json @@ -0,0 +1,25 @@ +{ + "exit": 0, + "label": "finite", + "optimized": false, + "platform": "Linux-7.0.0-38-generic-x86_64-with-glibc2.39", + "python": "3.12.3 (main, Aug 31 2026, 10:18:26) [GCC 13.3.0]", + "runner_sha256": "269fbaf3439c35813a6b979d1f270c43ffc1eee887687683931f28a1906d8a85", + "runtime_policy_sha256": "1841981e12a6f7ab70e17fdbedb913b15fc365aa28292f0c5fc3cb7e4ec2ba86", + "sampled_process_group_rss_bytes": 26574848, + "source_bytes_and_modes_unchanged": true, + "source_inventory_sha256": "c4928c1ce12e50e4b3a28e4a415f28aabc8cd26eccb2e4ad7f33925fc90edf1f", + "status": "PASS", + "stderr_bytes": 0, + "stderr_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stdout_bytes": 591, + "stdout_sha256": "a572476833d446e9ea4197aa8550854997bdd344fa9fd6e5dc916cb236a46f42", + "termination": null, + "usage": { + "exit": 0, + "kernel_max_rss_kib": 24828, + "system_seconds": 0.01, + "user_seconds": 0.22 + }, + "wall_seconds": 0.2534722599957604 +} diff --git a/research/p104-single-pass-qualification/evidence/finite/stderr.txt b/research/p104-single-pass-qualification/evidence/finite/stderr.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/research/p104-single-pass-qualification/evidence/finite/stdout.txt b/research/p104-single-pass-qualification/evidence/finite/stdout.txt new file mode 100644 index 0000000000..a9fca8aeef --- /dev/null +++ b/research/p104-single-pass-qualification/evidence/finite/stdout.txt @@ -0,0 +1 @@ +{"backends": 2, "controls": ["one-use", "closed-call", "missing", "duplicate", "changed-weights", "changed-rounding", "changed-word", "original-malformed-rejection", "propagated-exception", "failed-finish", "failed-take", "fresh-context-not-previous-pass", "aborted-take", "one-use", "closed-call", "missing", "duplicate", "changed-weights", "changed-rounding", "changed-word", "original-malformed-rejection", "propagated-exception", "failed-finish", "failed-take", "fresh-context-not-previous-pass", "aborted-take", "input-mutation"], "events": 5, "status": "PASS_FINITE_FEASIBILITY_ONLY"} diff --git a/research/p104-single-pass-qualification/evidence/finite/usage.json b/research/p104-single-pass-qualification/evidence/finite/usage.json new file mode 100644 index 0000000000..94cfebd24c --- /dev/null +++ b/research/p104-single-pass-qualification/evidence/finite/usage.json @@ -0,0 +1 @@ +{"user_seconds":0.22,"system_seconds":0.01,"kernel_max_rss_kib":24828,"exit":0} diff --git a/research/p104-single-pass-qualification/evidence/helper/receipt.json b/research/p104-single-pass-qualification/evidence/helper/receipt.json new file mode 100644 index 0000000000..e7abdb37ce --- /dev/null +++ b/research/p104-single-pass-qualification/evidence/helper/receipt.json @@ -0,0 +1,25 @@ +{ + "exit": 0, + "label": "helper", + "optimized": false, + "platform": "Linux-7.0.0-38-generic-x86_64-with-glibc2.39", + "python": "3.12.3 (main, Aug 31 2026, 10:18:26) [GCC 13.3.0]", + "runner_sha256": "6cd355f162aa5be9ee1f6a59a74612983b3a97aee4d3e30630dffe22d25bcc6e", + "runtime_policy_sha256": "8429a601d0e78b4e0e41b440a0db5202ca1dad6606d02d0a6f550d859f53a03b", + "sampled_process_group_rss_bytes": 94314496, + "source_bytes_and_modes_unchanged": true, + "source_inventory_sha256": "8238a336e92c6d530518a6db63ae76681d3b3e986655661a1c97ce3bfd0e7383", + "status": "PASS", + "stderr_bytes": 0, + "stderr_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stdout_bytes": 3393, + "stdout_sha256": "e25c68dc48c5155b81a9c4097c3c462bd30053276b811f2389f0c8f327fff6bd", + "termination": null, + "usage": { + "exit": 0, + "kernel_max_rss_kib": 37324, + "system_seconds": 3.12, + "user_seconds": 45.73 + }, + "wall_seconds": 51.317216966999695 +} diff --git a/research/p104-single-pass-qualification/evidence/helper/stderr.txt b/research/p104-single-pass-qualification/evidence/helper/stderr.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/research/p104-single-pass-qualification/evidence/helper/stdout.txt b/research/p104-single-pass-qualification/evidence/helper/stdout.txt new file mode 100644 index 0000000000..9b368ad885 --- /dev/null +++ b/research/p104-single-pass-qualification/evidence/helper/stdout.txt @@ -0,0 +1,16 @@ +test_broken_live_cache_isolation_fails_the_unchanged_registered_command (profile_helper_group.DescendantSourceRoleTests.test_broken_live_cache_isolation_fails_the_unchanged_registered_command) ... ok +test_current_helper_remains_a_planner_and_publication_input (profile_helper_group.DescendantSourceRoleTests.test_current_helper_remains_a_planner_and_publication_input) ... ok +test_historical_blob_and_hash_corruption_still_rejects (profile_helper_group.DescendantSourceRoleTests.test_historical_blob_and_hash_corruption_still_rejects) ... ok +test_historical_history_test_pin_corruption_rejects (profile_helper_group.DescendantSourceRoleTests.test_historical_history_test_pin_corruption_rejects) ... ok +test_live_history_guard_is_not_a_historical_source_substitution (profile_helper_group.DescendantSourceRoleTests.test_live_history_guard_is_not_a_historical_source_substitution) ... ok +test_live_history_test_remains_a_planner_and_publication_input (profile_helper_group.DescendantSourceRoleTests.test_live_history_test_remains_a_planner_and_publication_input) ... ok +test_only_source_role_changes_and_frozen_evidence_is_retained (profile_helper_group.DescendantSourceRoleTests.test_only_source_role_changes_and_frozen_evidence_is_retained) ... ok +test_original_gate_rejects_but_correct_role_accepts_current_helper (profile_helper_group.DescendantSourceRoleTests.test_original_gate_rejects_but_correct_role_accepts_current_helper) ... ok +test_original_history_input_role_rejects_live_guard_successor (profile_helper_group.DescendantSourceRoleTests.test_original_history_input_role_rejects_live_guard_successor) ... ok +test_unrelated_live_input_drift_still_rejects (profile_helper_group.DescendantSourceRoleTests.test_unrelated_live_input_drift_still_rejects) ... ok + +---------------------------------------------------------------------- +Ran 10 tests in 50.948s + +OK +{"errors": 0, "failures": 0, "inclusive_profiles": {"cli": [14, 38.50282166697434], "git": [100, 0.30546388085349463], "setUp": [10, 0.2867602859332692]}, "skips": [], "tests": [["profile_helper_group.DescendantSourceRoleTests.test_broken_live_cache_isolation_fails_the_unchanged_registered_command", 12.125240368011873], ["profile_helper_group.DescendantSourceRoleTests.test_current_helper_remains_a_planner_and_publication_input", 0.23834448101115413], ["profile_helper_group.DescendantSourceRoleTests.test_historical_blob_and_hash_corruption_still_rejects", 0.21692941398941912], ["profile_helper_group.DescendantSourceRoleTests.test_historical_history_test_pin_corruption_rejects", 0.21818014400196262], ["profile_helper_group.DescendantSourceRoleTests.test_live_history_guard_is_not_a_historical_source_substitution", 37.28955376299564], ["profile_helper_group.DescendantSourceRoleTests.test_live_history_test_remains_a_planner_and_publication_input", 0.23631637301878072], ["profile_helper_group.DescendantSourceRoleTests.test_only_source_role_changes_and_frozen_evidence_is_retained", 0.047184900991851464], ["profile_helper_group.DescendantSourceRoleTests.test_original_gate_rejects_but_correct_role_accepts_current_helper", 0.22216980601660907], ["profile_helper_group.DescendantSourceRoleTests.test_original_history_input_role_rejects_live_guard_successor", 0.21904245699988678], ["profile_helper_group.DescendantSourceRoleTests.test_unrelated_live_input_drift_still_rejects", 0.13501371600432321]], "tests_run": 10} diff --git a/research/p104-single-pass-qualification/evidence/helper/usage.json b/research/p104-single-pass-qualification/evidence/helper/usage.json new file mode 100644 index 0000000000..44eac8fb4c --- /dev/null +++ b/research/p104-single-pass-qualification/evidence/helper/usage.json @@ -0,0 +1 @@ +{"user_seconds":45.73,"system_seconds":3.12,"kernel_max_rss_kib":37324,"exit":0} diff --git a/research/p104-single-pass-qualification/evidence/precision/receipt.json b/research/p104-single-pass-qualification/evidence/precision/receipt.json new file mode 100644 index 0000000000..87a0f8f7b2 --- /dev/null +++ b/research/p104-single-pass-qualification/evidence/precision/receipt.json @@ -0,0 +1,25 @@ +{ + "exit": 0, + "label": "precision", + "optimized": false, + "platform": "Linux-7.0.0-38-generic-x86_64-with-glibc2.39", + "python": "3.12.3 (main, Aug 31 2026, 10:18:26) [GCC 13.3.0]", + "runner_sha256": "6cd355f162aa5be9ee1f6a59a74612983b3a97aee4d3e30630dffe22d25bcc6e", + "runtime_policy_sha256": "8429a601d0e78b4e0e41b440a0db5202ca1dad6606d02d0a6f550d859f53a03b", + "sampled_process_group_rss_bytes": 107343872, + "source_bytes_and_modes_unchanged": true, + "source_inventory_sha256": "8238a336e92c6d530518a6db63ae76681d3b3e986655661a1c97ce3bfd0e7383", + "status": "PASS", + "stderr_bytes": 0, + "stderr_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stdout_bytes": 1156, + "stdout_sha256": "123308d716a5e12b464b1110c719174f8e290d6a890022ea1382cd92ad32e49f", + "termination": null, + "usage": { + "exit": 0, + "kernel_max_rss_kib": 103380, + "system_seconds": 0.12, + "user_seconds": 61.43 + }, + "wall_seconds": 61.608995726011926 +} diff --git a/research/p104-single-pass-qualification/evidence/precision/stderr.txt b/research/p104-single-pass-qualification/evidence/precision/stderr.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/research/p104-single-pass-qualification/evidence/precision/stdout.txt b/research/p104-single-pass-qualification/evidence/precision/stdout.txt new file mode 100644 index 0000000000..72366727bc --- /dev/null +++ b/research/p104-single-pass-qualification/evidence/precision/stdout.txt @@ -0,0 +1 @@ +{"inclusive_function_profiles": {"Fraction.calculate": [1, 28.037889314990025], "Fraction.contract.error_trace": [1, 19.827579191012774], "Fraction.contract.execute": [6, 0.7518134470446967], "Fraction.contract.ideal": [4, 4.077143681031885], "Fraction.contract.reverse_all": [1, 2.7852682619995903], "Fraction.contract.reverse_cut": [4, 0.08186139797908254], "Fraction.extra.error_trace": [121, 21.10238755188766], "Fraction.extra.ideal": [1, 2.163068828987889], "Fraction.extra.reverse_all": [120, 0.024764867150224745], "integer.calculate": [1, 6.051532823999878], "integer.error_trace": [122, 6.10431206409703], "integer.ideal": [5, 1.4079569660243578], "integer.reverse_all": [121, 1.0686794288340025]}, "receipt": {"all_actual_witness_rows_equal": true, "coefficient_scale_bits": 55, "coordinates": 799, "events": 25984, "finite_fixtures": {"cases": 120, "controls": ["nondyadic scalar", "inexact scale division", "nondyadic weight"], "events": 4240}, "guards": {"owned": 22, "prefix": 26, "public": 23}, "source_controls": 6, "source_result_sha256": "cc7739703ed23532d187949c8507d09c13ac4c152e07a930f0087cde0d7a3d98"}, "seconds": 61.35474420999526} diff --git a/research/p104-single-pass-qualification/evidence/precision/usage.json b/research/p104-single-pass-qualification/evidence/precision/usage.json new file mode 100644 index 0000000000..1ffda11658 --- /dev/null +++ b/research/p104-single-pass-qualification/evidence/precision/usage.json @@ -0,0 +1 @@ +{"user_seconds":61.43,"system_seconds":0.12,"kernel_max_rss_kib":103380,"exit":0} diff --git a/research/p104-single-pass-qualification/evidence/profile-runtime/dispatch.py b/research/p104-single-pass-qualification/evidence/profile-runtime/dispatch.py new file mode 100644 index 0000000000..499d56210a --- /dev/null +++ b/research/p104-single-pass-qualification/evidence/profile-runtime/dispatch.py @@ -0,0 +1,6 @@ +import guard,sys +if sys.argv[1]=='helper':guard.TIMEOUT=300 +script='../feasibility/test_finite.py' if sys.argv[1].startswith('finite') else 'profile_'+sys.argv[1]+'.py' +with (guard.HERE/'execution.lock').open('a') as lock: + guard.fcntl.flock(lock,guard.fcntl.LOCK_EX|guard.fcntl.LOCK_NB) + print(guard.run(sys.argv[1],script,optimized=sys.argv[1].endswith('-O'))) diff --git a/research/p104-single-pass-qualification/evidence/profile-runtime/guard.py b/research/p104-single-pass-qualification/evidence/profile-runtime/guard.py new file mode 100644 index 0000000000..209af2bc2b --- /dev/null +++ b/research/p104-single-pass-qualification/evidence/profile-runtime/guard.py @@ -0,0 +1,119 @@ +"""Serial bounded Linux measurements; preserve the complete frozen precision contract.""" +import argparse +import fcntl +import hashlib +import json +import os +from pathlib import Path +import platform +import signal +import statistics +import subprocess +import sys +import tempfile +import time + +HERE = Path(__file__).resolve().parent +SOURCE = HERE +CLOSURE = ('source.py','profile_helper.py','profile_precision.py','guard.py','dispatch.py','inputs/PR5831.tar','../feasibility/observe.py','../feasibility/test_finite.py') +TIMEOUT = 180 +RSS_CAP = 1024**3 +OUTPUT_CAP = 2*1024**2 +AGGREGATE = 600 + +def sha(raw): + return hashlib.sha256(raw).hexdigest() + +def inventory(): + result = {} + for name in CLOSURE: + path = SOURCE / name + if path.is_symlink() or not path.is_file(): + raise ValueError('Regular complete runtime file: ' + name) + result[name] = [sha(path.read_bytes()), path.stat().st_mode & 0o777] + return result + +def group_rss(group): + total = 0 + count = 0 + for p in Path('/proc').iterdir(): + if not p.name.isdigit(): + continue + try: + raw = (p/'stat').read_text() + fields = raw[raw.rfind(')')+2:].split() + if int(fields[2]) == group: + total += int(fields[21])*os.sysconf('SC_PAGE_SIZE') + count += 1 + except (FileNotFoundError, ProcessLookupError, PermissionError): + pass + return total, count + +def run(label, script, optimized=False): + records = HERE/'runs' + records.mkdir(exist_ok=True) + prior = list(records.glob('*/receipt.json')) + spent = sum(json.loads(p.read_bytes())['wall_seconds'] for p in prior) + if spent >= AGGREGATE: + raise ValueError('Aggregate budget consumed') + folder = records/label + folder.mkdir() + before = inventory() + env = os.environ.copy() + for key in ('PYTHONPATH','PYTHONOPTIMIZE','PYTHONINSPECT','PYTHONSTARTUP','PYTHONPYCACHEPREFIX'): + env.pop(key,None) + env.update(PYTHONHASHSEED='0', LC_ALL='C.UTF-8', TZ='UTC') + usage = folder/'usage.json' + with tempfile.TemporaryDirectory(prefix='linux5757-bytecode-') as cache: + command = ['/usr/bin/python3.12', '-B', '-X', 'pycache_prefix='+cache] + if optimized: + command.append('-O') + command.append(str(SOURCE/script)) + timed = ['/usr/bin/time','-f','{"user_seconds":%U,"system_seconds":%S,"kernel_max_rss_kib":%M,"exit":%x}', '-o', str(usage),'--',*command] + start = time.monotonic() + peak = 0 + stop = None + with (folder/'stdout.txt').open('wb') as out, (folder/'stderr.txt').open('wb') as err: + p = subprocess.Popen(timed, cwd=SOURCE, env=env, stdout=out, stderr=err, start_new_session=True) + try: + while p.poll() is None: + rss, _ = group_rss(p.pid) + peak = max(peak,rss) + elapsed = time.monotonic()-start + if rss > RSS_CAP: + stop='sampled_group_rss_cap' + elif elapsed > min(TIMEOUT,AGGREGATE-spent): + stop='wall_or_aggregate_cap' + elif max((folder/'stdout.txt').stat().st_size,(folder/'stderr.txt').stat().st_size)>OUTPUT_CAP: + stop='output_cap' + if stop: + os.killpg(p.pid,signal.SIGKILL) + break + time.sleep(0.05) + code=p.wait() + finally: + try: os.killpg(p.pid,signal.SIGKILL) + except ProcessLookupError: pass + p.wait() + elapsed = time.monotonic()-start + stdout=(folder/'stdout.txt').read_bytes() + stderr=(folder/'stderr.txt').read_bytes() + after=inventory() + measurement=None + if usage.exists(): + try: measurement=json.loads(usage.read_bytes()) + except json.JSONDecodeError: measurement={'raw':usage.read_text()} + receipt={'label':label,'script':script,'optimized':optimized,'wall_seconds':elapsed, + 'exit':code,'termination':stop,'sampled_process_group_rss_bytes':peak, + 'usage':measurement,'stdout_sha256':sha(stdout),'stdout_bytes':len(stdout), + 'stderr_sha256':sha(stderr),'stderr_bytes':len(stderr), + 'source_inventory_sha256':sha(json.dumps(before,sort_keys=True,separators=(',',':')).encode()), + 'source_bytes_and_modes_unchanged':before==after, + 'python':sys.version,'platform':platform.platform(), + 'runner_sha256':sha(Path(__file__).read_bytes()),'runtime_policy_sha256':sha(json.dumps(CLOSURE).encode())} + receipt['status']='PASS' if code==0 and stop is None and not stderr and before==after else 'STOP' + (folder/'receipt.json').write_text(json.dumps(receipt,indent=2,sort_keys=True)+'\n') + print(json.dumps(receipt,sort_keys=True),flush=True) + if receipt['status']!='PASS': + raise SystemExit(1) + return receipt diff --git a/research/p104-single-pass-qualification/evidence/profile-runtime/profile_helper.py b/research/p104-single-pass-qualification/evidence/profile-runtime/profile_helper.py new file mode 100644 index 0000000000..a808e5b2db --- /dev/null +++ b/research/p104-single-pass-qualification/evidence/profile-runtime/profile_helper.py @@ -0,0 +1,23 @@ +"""Run all ten nominated tests; record inclusive setup, Git and CLI times.""" +import importlib.util,json,sys,time,unittest,hashlib +from collections import defaultdict +from pathlib import Path +repo=Path(__file__).resolve().parents[1]/'repo';path=repo/'tests/test_research_descendant_source_roles.py' +spec=importlib.util.spec_from_file_location('profile_helper_group',path);m=importlib.util.module_from_spec(spec);spec.loader.exec_module(m) +rows=defaultdict(lambda:[0,0.0]);tests=[] +def observe(obj,name,label): + original=getattr(obj,name) + def wrapped(*a,**kw): + start=time.perf_counter() + try:return original(*a,**kw) + finally: + row=rows[label];row[0]+=1;row[1]+=time.perf_counter()-start + setattr(obj,name,wrapped) +observe(m,'git','git');observe(m.DescendantSourceRoleTests,'setUp','setUp');observe(m.DescendantSourceRoleTests,'cli','cli') +class Result(unittest.TextTestResult): + def startTest(self,t):self.start=time.perf_counter();super().startTest(t) + def stopTest(self,t):tests.append([t.id(),time.perf_counter()-self.start]);super().stopTest(t) +suite=unittest.defaultTestLoader.loadTestsFromModule(m) +r=unittest.TextTestRunner(stream=sys.stdout,verbosity=2,resultclass=Result).run(suite) +print(json.dumps({'tests':tests,'inclusive_profiles':dict(rows),'failures':len(r.failures),'errors':len(r.errors),'skips':r.skipped,'tests_run':r.testsRun},sort_keys=True)) +if not r.wasSuccessful() or r.testsRun!=10:raise SystemExit(1) diff --git a/research/p104-single-pass-qualification/evidence/profile-runtime/profile_precision.py b/research/p104-single-pass-qualification/evidence/profile-runtime/profile_precision.py new file mode 100644 index 0000000000..9bbde5e14f --- /dev/null +++ b/research/p104-single-pass-qualification/evidence/profile-runtime/profile_precision.py @@ -0,0 +1,35 @@ +"""Observe only complete function calls; run the frozen qualification unchanged.""" +from source import baseline,require +import importlib.util,json,sys,time +from collections import defaultdict +rows=defaultdict(lambda:[0,0.0]) +def observe(obj,name,label): + original=getattr(obj,name) + def wrapped(*args,**kwargs): + start=time.perf_counter() + try:return original(*args,**kwargs) + finally: + row=rows[label];row[0]+=1;row[1]+=time.perf_counter()-start + setattr(obj,name,wrapped) +with baseline() as p: + spec=importlib.util.spec_from_file_location('precision_profile',p/'verify.py');v=importlib.util.module_from_spec(spec);spec.loader.exec_module(v) + load=v.load + def observed_load(name,path): + m=load(name,path) + if name=='frozen_contract': + module=m.module + def observed_module(n,q): + a=module(n,q) + if n=='noisy_precision': + for f in ('ideal','error_trace','reverse_all','reverse_cut','execute'):observe(a,f,'Fraction.contract.'+f) + return a + m.module=observed_module;observe(m,'calculate','Fraction.calculate') + elif name=='frozen_precision': + for f in ('ideal','error_trace','reverse_all'):observe(m,f,'Fraction.extra.'+f) + elif name=='integer_backend': + for f in ('ideal','error_trace','reverse_all'):observe(m.Engine,f,'integer.'+f) + elif name=='explicit_contract':observe(m,'calculate','integer.calculate') + return m + v.load=observed_load + receipt,seconds=v.run('qualify');require(receipt==json.loads((p/'RESULT.json').read_bytes()),'complete frozen profile receipt') + print(json.dumps({'receipt':receipt,'seconds':seconds,'inclusive_function_profiles':dict(rows)},sort_keys=True)) diff --git a/research/p104-single-pass-qualification/evidence/profile-runtime/source.py b/research/p104-single-pass-qualification/evidence/profile-runtime/source.py new file mode 100644 index 0000000000..6e1f036ed0 --- /dev/null +++ b/research/p104-single-pass-qualification/evidence/profile-runtime/source.py @@ -0,0 +1,67 @@ +"""Authenticate the unchanged complete PR5831 export before importing it.""" +from contextlib import contextmanager +from hashlib import sha256 +import json +from pathlib import Path +import tarfile +import tempfile + +HERE = Path(__file__).resolve().parent +BUNDLE_SHA256 = '6ad8d8e0463e8e6ea8d503610c3f9ec38108f16092bc479bc1cb6f48683f6ab6' +SOURCE_HEAD = '7c5eb98e7439d778141d63e801e53d4cd7e1d587' + + +def require(ok, why): + if not ok: + raise ValueError(why) + + +def payload(archive=None): + archive = HERE / 'inputs/PR5831.tar' if archive is None else archive + require(sha256(archive.read_bytes()).hexdigest() == BUNDLE_SHA256, 'Exact PR5831 bundle') + with tarfile.open(archive, 'r:') as stream: + members = stream.getmembers() + require(len(members) == 14 and len({m.name for m in members}) == 14, 'Complete unique baseline bundle') + require(all(m.isfile() and 0 <= m.size <= 8 * 1024**2 for m in members), 'Regular bounded baseline members') + receipt = json.loads(stream.extractfile('.research-export.json').read()) + require(receipt['commit'] == SOURCE_HEAD, 'Exact baseline export head') + rows = {r['path']: r for r in receipt['files']} + require(len(rows) == len(receipt['files']) == 13, 'Complete baseline file census') + require({m.name for m in members} == set(rows) | {'.research-export.json'}, 'Exact baseline member set') + contents = {} + for member in members: + path = Path(member.name) + require(not path.is_absolute() and '..' not in path.parts and path.parts, 'Safe baseline path') + raw = stream.extractfile(member).read() + if member.name in rows: + row = rows[member.name] + require(len(raw) == row['size'] and sha256(raw).hexdigest() == row['sha256'], 'Exact baseline file bytes') + require(row['mode'] in (0o644, 0o755), 'Regular baseline file mode') + contents[member.name] = raw + return contents + + +@contextmanager +def baseline(): + contents = payload() + with tempfile.TemporaryDirectory(prefix='precision-linux-source-') as temporary: + root = Path(temporary) + try: + for name, raw in contents.items(): + path = root / name + path.parent.mkdir(parents=True, exist_ok=True) + path.write_bytes(raw) + path.chmod(0o444) + for path in root.rglob('*'): + if path.is_dir(): + path.chmod(0o555) + before = {str(p.relative_to(root)): [sha256(p.read_bytes()).hexdigest(), p.stat().st_mode & 0o777] + for p in root.rglob('*') if p.is_file()} + yield root / 'research/p104-integer-error-replay' + after = {str(p.relative_to(root)): [sha256(p.read_bytes()).hexdigest(), p.stat().st_mode & 0o777] + for p in root.rglob('*') if p.is_file() and not p.is_symlink()} + require(after == before and not any(p.is_symlink() for p in root.rglob('*')), 'Baseline export unchanged') + finally: + for path in [root, *root.rglob('*')]: + if path.is_dir(): + path.chmod(0o755) diff --git a/research/p104-single-pass-qualification/evidence/registered-O/receipt.json b/research/p104-single-pass-qualification/evidence/registered-O/receipt.json new file mode 100644 index 0000000000..98203ea3d8 --- /dev/null +++ b/research/p104-single-pass-qualification/evidence/registered-O/receipt.json @@ -0,0 +1,25 @@ +{ + "exit": 0, + "label": "registered-O", + "optimized": true, + "platform": "Linux-7.0.0-38-generic-x86_64-with-glibc2.39", + "python": "3.12.3 (main, Aug 31 2026, 10:18:26) [GCC 13.3.0]", + "runner_sha256": "523aca683d41dd67cc08e6d7e3cff7bbd5ae5f43f22b4a446cb6b8c964703680", + "runtime_policy_sha256": "82d21549ee61f2fbb5e4df40d7a2612237040ba607a0a42c3aba9f4c67accdab", + "sampled_process_group_rss_bytes": 121856000, + "source_bytes_and_modes_unchanged": true, + "source_inventory_sha256": "f51d48e42c67a9133e295b1849c576e20c9f0c870881bd79e438626bf4c49f97", + "status": "PASS", + "stderr_bytes": 0, + "stderr_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stdout_bytes": 1282, + "stdout_sha256": "09f7638198857fea399a36e7bd4dd3345314d1880459de7ad7ed75ada62ac526", + "termination": null, + "usage": { + "exit": 0, + "kernel_max_rss_kib": 117548, + "system_seconds": 0.11, + "user_seconds": 38.99 + }, + "wall_seconds": 39.1790381349856 +} diff --git a/research/p104-single-pass-qualification/evidence/registered-O/stderr.txt b/research/p104-single-pass-qualification/evidence/registered-O/stderr.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/research/p104-single-pass-qualification/evidence/registered-O/stdout.txt b/research/p104-single-pass-qualification/evidence/registered-O/stdout.txt new file mode 100644 index 0000000000..3c2a1f47e8 --- /dev/null +++ b/research/p104-single-pass-qualification/evidence/registered-O/stdout.txt @@ -0,0 +1,4 @@ +PASS_PRECISION_LINUX_SOURCE_CONTROLS {"contract": "declared contract edits", "declared_edit": "unique backend seam", "inner_archive": "source hash", "official_export_byte": "Exact PR5831 bundle"} +{"backends": 2, "controls": ["one-use", "closed-call", "missing", "duplicate", "changed-weights", "changed-rounding", "changed-word", "original-malformed-rejection", "propagated-exception", "failed-finish", "failed-take", "fresh-context-not-previous-pass", "aborted-take", "one-use", "closed-call", "missing", "duplicate", "changed-weights", "changed-rounding", "changed-word", "original-malformed-rejection", "propagated-exception", "failed-finish", "failed-take", "fresh-context-not-previous-pass", "aborted-take", "input-mutation"], "events": 5, "status": "PASS_FINITE_FEASIBILITY_ONLY"} +PASS_P104_SINGLE_PASS_QUALIFICATION +{"mode": "qualify", "receipt": {"all_actual_witness_rows_equal": true, "coefficient_scale_bits": 55, "coordinates": 799, "events": 25984, "finite_fixtures": {"cases": 120, "controls": ["nondyadic scalar", "inexact scale division", "nondyadic weight"], "events": 4240}, "guards": {"owned": 22, "prefix": 26, "public": 23}, "source_controls": 6, "source_result_sha256": "cc7739703ed23532d187949c8507d09c13ac4c152e07a930f0087cde0d7a3d98"}, "seconds": 38.819481} diff --git a/research/p104-single-pass-qualification/evidence/registered-O/usage.json b/research/p104-single-pass-qualification/evidence/registered-O/usage.json new file mode 100644 index 0000000000..ce35f59a6e --- /dev/null +++ b/research/p104-single-pass-qualification/evidence/registered-O/usage.json @@ -0,0 +1 @@ +{"user_seconds":38.99,"system_seconds":0.11,"kernel_max_rss_kib":117548,"exit":0} diff --git a/research/p104-single-pass-qualification/evidence/registered-normal/receipt.json b/research/p104-single-pass-qualification/evidence/registered-normal/receipt.json new file mode 100644 index 0000000000..26e907c0d6 --- /dev/null +++ b/research/p104-single-pass-qualification/evidence/registered-normal/receipt.json @@ -0,0 +1,25 @@ +{ + "exit": 0, + "label": "registered-normal", + "optimized": false, + "platform": "Linux-7.0.0-38-generic-x86_64-with-glibc2.39", + "python": "3.12.3 (main, Aug 31 2026, 10:18:26) [GCC 13.3.0]", + "runner_sha256": "523aca683d41dd67cc08e6d7e3cff7bbd5ae5f43f22b4a446cb6b8c964703680", + "runtime_policy_sha256": "82d21549ee61f2fbb5e4df40d7a2612237040ba607a0a42c3aba9f4c67accdab", + "sampled_process_group_rss_bytes": 121618432, + "source_bytes_and_modes_unchanged": true, + "source_inventory_sha256": "f51d48e42c67a9133e295b1849c576e20c9f0c870881bd79e438626bf4c49f97", + "status": "PASS", + "stderr_bytes": 0, + "stderr_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stdout_bytes": 1282, + "stdout_sha256": "213dca818fadca954452dec68866d3f36d3ba85017a847bffb731da14190bc5c", + "termination": null, + "usage": { + "exit": 0, + "kernel_max_rss_kib": 117316, + "system_seconds": 0.09, + "user_seconds": 39.08 + }, + "wall_seconds": 39.24033334100386 +} diff --git a/research/p104-single-pass-qualification/evidence/registered-normal/stderr.txt b/research/p104-single-pass-qualification/evidence/registered-normal/stderr.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/research/p104-single-pass-qualification/evidence/registered-normal/stdout.txt b/research/p104-single-pass-qualification/evidence/registered-normal/stdout.txt new file mode 100644 index 0000000000..708ed05525 --- /dev/null +++ b/research/p104-single-pass-qualification/evidence/registered-normal/stdout.txt @@ -0,0 +1,4 @@ +PASS_PRECISION_LINUX_SOURCE_CONTROLS {"contract": "declared contract edits", "declared_edit": "unique backend seam", "inner_archive": "source hash", "official_export_byte": "Exact PR5831 bundle"} +{"backends": 2, "controls": ["one-use", "closed-call", "missing", "duplicate", "changed-weights", "changed-rounding", "changed-word", "original-malformed-rejection", "propagated-exception", "failed-finish", "failed-take", "fresh-context-not-previous-pass", "aborted-take", "one-use", "closed-call", "missing", "duplicate", "changed-weights", "changed-rounding", "changed-word", "original-malformed-rejection", "propagated-exception", "failed-finish", "failed-take", "fresh-context-not-previous-pass", "aborted-take", "input-mutation"], "events": 5, "status": "PASS_FINITE_FEASIBILITY_ONLY"} +PASS_P104_SINGLE_PASS_QUALIFICATION +{"mode": "qualify", "receipt": {"all_actual_witness_rows_equal": true, "coefficient_scale_bits": 55, "coordinates": 799, "events": 25984, "finite_fixtures": {"cases": 120, "controls": ["nondyadic scalar", "inexact scale division", "nondyadic weight"], "events": 4240}, "guards": {"owned": 22, "prefix": 26, "public": 23}, "source_controls": 6, "source_result_sha256": "cc7739703ed23532d187949c8507d09c13ac4c152e07a930f0087cde0d7a3d98"}, "seconds": 38.898771} diff --git a/research/p104-single-pass-qualification/evidence/registered-normal/usage.json b/research/p104-single-pass-qualification/evidence/registered-normal/usage.json new file mode 100644 index 0000000000..aee0ae9974 --- /dev/null +++ b/research/p104-single-pass-qualification/evidence/registered-normal/usage.json @@ -0,0 +1 @@ +{"user_seconds":39.08,"system_seconds":0.09,"kernel_max_rss_kib":117316,"exit":0} diff --git a/research/p104-single-pass-qualification/finite.py b/research/p104-single-pass-qualification/finite.py new file mode 100644 index 0000000000..2e2addc45b --- /dev/null +++ b/research/p104-single-pass-qualification/finite.py @@ -0,0 +1,49 @@ +"""Pre-construction real-backend feasibility; all checks survive python -O.""" +from copy import deepcopy +import importlib.util +import json +from pathlib import Path +import sys +from source import baseline,require +from observe import Observation +controls=[] +def rejects(label, fn): + try:fn() + except ValueError:controls.append(label) + else:raise ValueError('accepted '+label) +with baseline() as p: + spec=importlib.util.spec_from_file_location('finite_source',p/'verify.py');v=importlib.util.module_from_spec(spec);spec.loader.exec_module(v) + with v.source() as (_,original,ref): + integer=v.load('finite_integer',p/'integer.py') + word=dict(public=1,owned_fields=1,initial=[0],final=[0],frames=[[]],live=[],program=[['INIT',1,0],['COPY',1,0,1,0],['SCALE',1,'1/2',0],['SCALE',1,2,0],['CLEAR',1,0]]) + for backend in (ref,integer.Engine(ref)): + o=Observation(backend,ref.digest,word) + ideal,weights=o.ideal(word);trace,witness=o.error_trace(word,weights,set(ideal['counts'])) + o.finish();got=o.take(word) + require(got['ideal']==backend.ideal(word),'fresh finite ideal') + require(got['error_trace']==backend.error_trace(word,weights,set(ideal['counts'])),'fresh finite trace/witness') + rejects('one-use',lambda:o.take(word));rejects('closed-call',lambda:o.ideal(word)) + o=Observation(backend,ref.digest,word);rejects('missing',o.finish) + ideal,weights=o.ideal(word) + rejects('duplicate',lambda:o.ideal(word)) + changed=deepcopy(weights);changed[0]=(99,1) + rejects('changed-weights',lambda:o.error_trace(word,changed,set(ideal['counts']))) + rejects('changed-rounding',lambda:o.error_trace(word,weights,{'ADD'})) + value=o.error_trace(word,weights,set(ideal['counts']));value[0]['sites']=-1 + o.finish();mutated=deepcopy(word);mutated['program'][2][-2]='1/4' + rejects('changed-word',lambda:o.take(mutated)) + require(o.take(word)['error_trace'][0]['sites']>=0,'snapshot alias isolation') + bad=deepcopy(word);bad['program'][1][2]=1 + o=Observation(backend,ref.digest,word);o.ideal(word) + rejects('original-malformed-rejection',lambda:o.ideal(bad)) + o.error_trace(word,weights,set(ideal['counts']));o.finish();o.take(word) + failed=Observation(backend,ref.digest,bad) + rejects('propagated-exception',lambda:failed.ideal(bad));rejects('failed-finish',failed.finish);rejects('failed-take',lambda:failed.take(bad)) + fresh=Observation(backend,ref.digest,word);rejects('fresh-context-not-previous-pass',lambda:fresh.take(word)) + fresh.abort();rejects('aborted-take',lambda:fresh.take(word)) + class Mutating: + def ideal(self,w):w['public']=9;return ({},[]) + changing=deepcopy(word);o=Observation(Mutating(),ref.digest,changing) + rejects('input-mutation',lambda:o.ideal(changing)) + require(len(controls)==27,'complete finite control census') +print(json.dumps({'status':'PASS_FINITE_FEASIBILITY_ONLY','events':5,'backends':2,'controls':controls},sort_keys=True)) diff --git a/research/p104-single-pass-qualification/guard.py b/research/p104-single-pass-qualification/guard.py new file mode 100644 index 0000000000..33d11befce --- /dev/null +++ b/research/p104-single-pass-qualification/guard.py @@ -0,0 +1,120 @@ +"""Serial bounded Linux measurements; preserve the complete frozen precision contract.""" +import argparse +import fcntl +import hashlib +import json +import os +from pathlib import Path +import platform +import signal +import statistics +import subprocess +import sys +import tempfile +import time + +HERE = Path(__file__).resolve().parent +SOURCE = HERE +CLOSURE = ('source.py','observe.py','finite.py','candidate.py','baseline.py','replay.py','guard.py','benchmark.py','inputs/PR5831.tar') +TIMEOUT = 180 +RSS_CAP = 1024**3 +OUTPUT_CAP = 2*1024**2 +AGGREGATE = 1500 +PREVIOUS_WALL_SECONDS = 113.99438549298793 + +def sha(raw): + return hashlib.sha256(raw).hexdigest() + +def inventory(): + result = {} + for name in CLOSURE: + path = SOURCE / name + if path.is_symlink() or not path.is_file(): + raise ValueError('Regular complete runtime file: ' + name) + result[name] = [sha(path.read_bytes()), path.stat().st_mode & 0o777] + return result + +def group_rss(group): + total = 0 + count = 0 + for p in Path('/proc').iterdir(): + if not p.name.isdigit(): + continue + try: + raw = (p/'stat').read_text() + fields = raw[raw.rfind(')')+2:].split() + if int(fields[2]) == group: + total += int(fields[21])*os.sysconf('SC_PAGE_SIZE') + count += 1 + except (FileNotFoundError, ProcessLookupError, PermissionError): + pass + return total, count + +def run(label, script, optimized=False): + records = HERE/'runs' + records.mkdir(exist_ok=True) + prior = list(records.glob('*/receipt.json')) + spent = PREVIOUS_WALL_SECONDS + sum(json.loads(p.read_bytes())['wall_seconds'] for p in prior) + if spent >= AGGREGATE: + raise ValueError('Aggregate budget consumed') + folder = records/label + folder.mkdir() + before = inventory() + env = os.environ.copy() + for key in ('PYTHONPATH','PYTHONOPTIMIZE','PYTHONINSPECT','PYTHONSTARTUP','PYTHONPYCACHEPREFIX'): + env.pop(key,None) + env.update(PYTHONHASHSEED='0', LC_ALL='C.UTF-8', TZ='UTC') + usage = folder/'usage.json' + with tempfile.TemporaryDirectory(prefix='linux5757-bytecode-') as cache: + command = ['/usr/bin/python3.12', '-B', '-X', 'pycache_prefix='+cache] + if optimized: + command.append('-O') + command.append(str(SOURCE/script)) + timed = ['/usr/bin/time','-f','{"user_seconds":%U,"system_seconds":%S,"kernel_max_rss_kib":%M,"exit":%x}', '-o', str(usage),'--',*command] + start = time.monotonic() + peak = 0 + stop = None + with (folder/'stdout.txt').open('wb') as out, (folder/'stderr.txt').open('wb') as err: + p = subprocess.Popen(timed, cwd=SOURCE, env=env, stdout=out, stderr=err, start_new_session=True) + try: + while p.poll() is None: + rss, _ = group_rss(p.pid) + peak = max(peak,rss) + elapsed = time.monotonic()-start + if rss > RSS_CAP: + stop='sampled_group_rss_cap' + elif elapsed > min(TIMEOUT,AGGREGATE-spent): + stop='wall_or_aggregate_cap' + elif max((folder/'stdout.txt').stat().st_size,(folder/'stderr.txt').stat().st_size)>OUTPUT_CAP: + stop='output_cap' + if stop: + os.killpg(p.pid,signal.SIGKILL) + break + time.sleep(0.05) + code=p.wait() + finally: + try: os.killpg(p.pid,signal.SIGKILL) + except ProcessLookupError: pass + p.wait() + elapsed = time.monotonic()-start + stdout=(folder/'stdout.txt').read_bytes() + stderr=(folder/'stderr.txt').read_bytes() + after=inventory() + measurement=None + if usage.exists(): + try: measurement=json.loads(usage.read_bytes()) + except json.JSONDecodeError: measurement={'raw':usage.read_text()} + receipt={'label':label,'script':script,'optimized':optimized,'wall_seconds':elapsed, + 'exit':code,'termination':stop,'sampled_process_group_rss_bytes':peak, + 'usage':measurement,'stdout_sha256':sha(stdout),'stdout_bytes':len(stdout), + 'stderr_sha256':sha(stderr),'stderr_bytes':len(stderr), + 'source_inventory_sha256':sha(json.dumps(before,sort_keys=True,separators=(',',':')).encode()), + 'source_bytes_and_modes_unchanged':before==after, + 'python':sys.version,'platform':platform.platform(), + 'runner_sha256':sha(Path(__file__).read_bytes()),'runtime_policy_sha256':sha(json.dumps(CLOSURE).encode())} + receipt['status']='PASS' if code==0 and stop is None and not stderr and before==after else 'STOP' + (folder/'receipt.json').write_text(json.dumps(receipt,indent=2,sort_keys=True)+'\n') + print(json.dumps(receipt,sort_keys=True),flush=True) + if receipt['status']!='PASS': + raise SystemExit(1) + return receipt diff --git a/research/p104-single-pass-qualification/observe.py b/research/p104-single-pass-qualification/observe.py new file mode 100644 index 0000000000..d59146ae5a --- /dev/null +++ b/research/p104-single-pass-qualification/observe.py @@ -0,0 +1,72 @@ +"""Single-use observations of two complete, independently computed passes. + +Chris R / Clear1nsight with substantial OpenAI Codex assistance. Apache-2.0. +""" +from copy import deepcopy + + +def need(ok, why): + if not ok: + raise ValueError(why) + + +class Observation: + def __init__(self, backend, digest, word): + self.backend, self.digest = backend, digest + self.word_key = digest(word) + self.values = {} + self.closed = self.failed = self.used = False + + def __getattr__(self, name): + return getattr(self.backend, name) + + def _call(self, name, word, *args): + need(not self.closed and not self.failed, 'observation closed') + actual = self.digest(word) == self.word_key + def input_key(): + normalized = (args[0], sorted(args[1])) if name == 'error_trace' else args + return self.digest((word, normalized)) + before = input_key() + if actual: + need(name not in self.values, 'duplicate actual observation') + if name == 'error_trace': + need('ideal' in self.values, 'missing ideal observation') + ideal, weights = self.values['ideal'][0] + need(self.digest(args[0]) == self.digest(weights), 'changed observation weights') + need(set(args[1]) == set(ideal['counts']), 'changed observation rounding') + try: + value = getattr(self.backend, name)(word, *args) + need(before == input_key(), 'input changed during observation') + except BaseException: + if actual: + self.failed = True + self.values.clear() + raise + if actual: + saved = deepcopy(value) + self.values[name] = (saved, self.digest(saved)) + return value + + def ideal(self, word): + return self._call('ideal', word) + + def error_trace(self, word, weights, rounded): + return self._call('error_trace', word, weights, rounded) + + def finish(self): + need(not self.closed and not self.failed, 'observation closed') + need(set(self.values) == {'ideal', 'error_trace'}, 'missing complete observation') + self.closed = True + + def abort(self): + self.failed = self.closed = True + self.values.clear() + + def take(self, word): + need(self.closed and not self.failed and not self.used, 'observation unavailable') + need(self.digest(word) == self.word_key, 'changed observation word') + need(all(self.digest(value) == key for value, key in self.values.values()), 'observation output drift') + self.used = True + result = {name: value for name, (value, key) in self.values.items()} + self.values.clear() + return result diff --git a/research/p104-single-pass-qualification/replay.py b/research/p104-single-pass-qualification/replay.py new file mode 100644 index 0000000000..aeb9296816 --- /dev/null +++ b/research/p104-single-pass-qualification/replay.py @@ -0,0 +1,31 @@ +"""Run an unchanged complete PR5831 entry point from its authenticated export.""" +import json +import runpy +import sys + +from source import baseline, require + +EXPECTED = { + 'source_result_sha256': 'cc7739703ed23532d187949c8507d09c13ac4c152e07a930f0087cde0d7a3d98', + 'events': 25984, 'coordinates': 799, 'source_controls': 6, + 'guards': {'owned': 22, 'prefix': 26, 'public': 23}, +} + + +def main(): + mode = 'qualify' if not sys.argv[1:] else sys.argv[1].removeprefix('--') + require(len(sys.argv) <= 2 and mode in ('baseline', 'candidate', 'qualify'), 'Exact replay mode') + with baseline() as package: + expected = json.loads((package / 'RESULT.json').read_bytes()) if mode == 'qualify' else EXPECTED + previous = sys.argv + try: + sys.argv = [str(package / 'verify.py'), '--' + mode] + result = runpy.run_path(sys.argv[0], run_name='__main__') + finally: + sys.argv = previous + require(result['mode'] == mode and result['receipt'] == expected, + 'Complete frozen scientific receipt') + + +if __name__ == '__main__': + main() diff --git a/research/p104-single-pass-qualification/source.py b/research/p104-single-pass-qualification/source.py new file mode 100644 index 0000000000..6e1f036ed0 --- /dev/null +++ b/research/p104-single-pass-qualification/source.py @@ -0,0 +1,67 @@ +"""Authenticate the unchanged complete PR5831 export before importing it.""" +from contextlib import contextmanager +from hashlib import sha256 +import json +from pathlib import Path +import tarfile +import tempfile + +HERE = Path(__file__).resolve().parent +BUNDLE_SHA256 = '6ad8d8e0463e8e6ea8d503610c3f9ec38108f16092bc479bc1cb6f48683f6ab6' +SOURCE_HEAD = '7c5eb98e7439d778141d63e801e53d4cd7e1d587' + + +def require(ok, why): + if not ok: + raise ValueError(why) + + +def payload(archive=None): + archive = HERE / 'inputs/PR5831.tar' if archive is None else archive + require(sha256(archive.read_bytes()).hexdigest() == BUNDLE_SHA256, 'Exact PR5831 bundle') + with tarfile.open(archive, 'r:') as stream: + members = stream.getmembers() + require(len(members) == 14 and len({m.name for m in members}) == 14, 'Complete unique baseline bundle') + require(all(m.isfile() and 0 <= m.size <= 8 * 1024**2 for m in members), 'Regular bounded baseline members') + receipt = json.loads(stream.extractfile('.research-export.json').read()) + require(receipt['commit'] == SOURCE_HEAD, 'Exact baseline export head') + rows = {r['path']: r for r in receipt['files']} + require(len(rows) == len(receipt['files']) == 13, 'Complete baseline file census') + require({m.name for m in members} == set(rows) | {'.research-export.json'}, 'Exact baseline member set') + contents = {} + for member in members: + path = Path(member.name) + require(not path.is_absolute() and '..' not in path.parts and path.parts, 'Safe baseline path') + raw = stream.extractfile(member).read() + if member.name in rows: + row = rows[member.name] + require(len(raw) == row['size'] and sha256(raw).hexdigest() == row['sha256'], 'Exact baseline file bytes') + require(row['mode'] in (0o644, 0o755), 'Regular baseline file mode') + contents[member.name] = raw + return contents + + +@contextmanager +def baseline(): + contents = payload() + with tempfile.TemporaryDirectory(prefix='precision-linux-source-') as temporary: + root = Path(temporary) + try: + for name, raw in contents.items(): + path = root / name + path.parent.mkdir(parents=True, exist_ok=True) + path.write_bytes(raw) + path.chmod(0o444) + for path in root.rglob('*'): + if path.is_dir(): + path.chmod(0o555) + before = {str(p.relative_to(root)): [sha256(p.read_bytes()).hexdigest(), p.stat().st_mode & 0o777] + for p in root.rglob('*') if p.is_file()} + yield root / 'research/p104-integer-error-replay' + after = {str(p.relative_to(root)): [sha256(p.read_bytes()).hexdigest(), p.stat().st_mode & 0o777] + for p in root.rglob('*') if p.is_file() and not p.is_symlink()} + require(after == before and not any(p.is_symlink() for p in root.rglob('*')), 'Baseline export unchanged') + finally: + for path in [root, *root.rglob('*')]: + if path.is_dir(): + path.chmod(0o755) diff --git a/research/p104-single-pass-qualification/verify.py b/research/p104-single-pass-qualification/verify.py new file mode 100644 index 0000000000..486c050c25 --- /dev/null +++ b/research/p104-single-pass-qualification/verify.py @@ -0,0 +1,9 @@ +"""Full qualification plus inherited source-custody and new observation controls.""" +import sys +import custody +from candidate import main +from source import require +if __name__=='__main__': + require(len(sys.argv)==1,'No wrapper arguments') + custody.main() + main() From 2a21f5cf7d87f30e0dbbe0f912af0846856f407a Mon Sep 17 00:00:00 2001 From: d3lerium Date: Tue, 27 Oct 2026 16:24:07 +1100 Subject: [PATCH 4/5] Record sealed qualification and balanced complete-stage performance evidence --- .../p104-single-pass-qualification/TASK.json | 4 +- .../VALIDATION.json | 23 +- .../evidence/SEALED-BEFORE.json | 366 ++++++++++++++++++ .../evidence/SEALED-RESULT.json | 8 + .../evidence/sealed-I-O/receipt.json | 26 ++ .../evidence/sealed-I-O/stderr.txt | 0 .../evidence/sealed-I-O/stdout.txt | 4 + .../evidence/sealed-I-O/usage.json | 1 + 8 files changed, 428 insertions(+), 4 deletions(-) create mode 100644 research/p104-single-pass-qualification/evidence/SEALED-BEFORE.json create mode 100644 research/p104-single-pass-qualification/evidence/SEALED-RESULT.json create mode 100644 research/p104-single-pass-qualification/evidence/sealed-I-O/receipt.json create mode 100644 research/p104-single-pass-qualification/evidence/sealed-I-O/stderr.txt create mode 100644 research/p104-single-pass-qualification/evidence/sealed-I-O/stdout.txt create mode 100644 research/p104-single-pass-qualification/evidence/sealed-I-O/usage.json diff --git a/research/p104-single-pass-qualification/TASK.json b/research/p104-single-pass-qualification/TASK.json index 28a35f3db3..a6824f635a 100644 --- a/research/p104-single-pass-qualification/TASK.json +++ b/research/p104-single-pass-qualification/TASK.json @@ -44,8 +44,8 @@ "bottleneck_link": "Faster trustworthy replays increase review throughput and let mechanism candidates be checked sooner.", "stop_rule": "Source, observation, complete receipt, stderr or resource failure stops. No automatic retries. 180 seconds/command,1GiB sampled group RSS,1500 seconds shared cumulative; first pair then all six in B,C,C,B,B,C order must save15% wall and CPU.", "time_budget_minutes": 90, - "outcome": "partial", - "evidence": "COVERAGE.md, evidence/, BENCHMARK-pair.json and BENCHMARK-remaining.json; every measurement retained.", + "outcome": "completed", + "evidence": "PROOF.md, COVERAGE.md, PROFILE.md, BENCHMARK.json, VALIDATION.json and evidence/ preserve 15 bounded passing commands, full raw scientific receipts and the metadata preflight rejection. Normal/O/sealed coverage agrees; exact-head hosted CI remains separate.", "author": "Chris R / Clear1nsight", "ai_assistance": "Substantial OpenAI Codex assistance for source review, execution, tooling and report; no subagents, independent human or proof-kernel acceptance.", "open_questions": [ diff --git a/research/p104-single-pass-qualification/VALIDATION.json b/research/p104-single-pass-qualification/VALIDATION.json index 389240c753..6cca25b79b 100644 --- a/research/p104-single-pass-qualification/VALIDATION.json +++ b/research/p104-single-pass-qualification/VALIDATION.json @@ -1,5 +1,10 @@ { "all_benchmark_runs": 6, + "all_guarded_commands_pass": true, + "benchmark_kernel_max_rss_kib": { + "B": 103912, + "C": 118004 + }, "complete_receipt": { "all_actual_witness_rows_equal": true, "coefficient_scale_bits": 55, @@ -22,11 +27,25 @@ "source_controls": 6, "source_result_sha256": "cc7739703ed23532d187949c8507d09c13ac4c152e07a930f0087cde0d7a3d98" }, - "export": "pending", + "export": { + "archive_sha256": "7601159a7d13797e89efa94499cb0c9b1ce8aa340de2f88207b67b43e46ea03d", + "files_unchanged": 91, + "implementation": "9b8cffa57c09eefba39dc6a4efdc34a15dfc1ebd", + "receipt_equal": true, + "status": "PASS_SEALED_GIT_FREE_QUALIFICATION", + "wall_seconds": 39.24383878399385 + }, + "guarded_commands": 15, + "hosted_ci": "pending exact final publication head", + "implementation_commit": "9b8cffa57c09eefba39dc6a4efdc34a15dfc1ebd", "inherited_custody_controls": 4, "kappa_research": "PAUSED", + "metadata_preflight": "One invalid draft outcome enum rejected and corrected before registered execution; evidence retained. No scientific source/expected result/limit change.", "new_controls": 27, "normal_seconds": 39.24033334100386, "optimized_seconds": 39.1790381349856, - "shared_tests_changed": false + "same_scientific_receipt_everywhere": true, + "shared_tests_changed": false, + "total_local_guarded_wall_seconds": 533.4091301979788, + "unchanged_scientific_runtime_since_benchmark": true } diff --git a/research/p104-single-pass-qualification/evidence/SEALED-BEFORE.json b/research/p104-single-pass-qualification/evidence/SEALED-BEFORE.json new file mode 100644 index 0000000000..4acfb9f342 --- /dev/null +++ b/research/p104-single-pass-qualification/evidence/SEALED-BEFORE.json @@ -0,0 +1,366 @@ +{ + ".research-export.json": [ + "4116e194d81f58071f419ad04fbdf5b04ec659fe4388882a17130166638fa8fa", + 292 + ], + "research/p104-single-pass-qualification/replay.py": [ + "2224b9d5ca0f3e30e672806a3e7c4f18f3c8623995973c9a9608fe5315dbcd39", + 292 + ], + "research/p104-single-pass-qualification/PROFILE.md": [ + "075940156243941b536585d49052580c74a241fa866898eca25d62e2e97db5e0", + 292 + ], + "research/p104-single-pass-qualification/observe.py": [ + "31d39571176d8d690b8f35f0953d4e36c0e26648a63dfc0f2b0713048caa63fd", + 292 + ], + "research/p104-single-pass-qualification/verify.py": [ + "14c458516445e1a27a9c6236f589cb34e214c061f53fd56285d01bc2b47cb852", + 292 + ], + "research/p104-single-pass-qualification/COVERAGE.md": [ + "1aff44f235b4b576165223dc311621e38e8ffcdcbcf3491a9cc7d47805b57141", + 292 + ], + "research/p104-single-pass-qualification/custody.py": [ + "307021ce3b7c5d36f792544657ced02d47ac933ce4bc7c0a34e149ee019b929f", + 292 + ], + "research/p104-single-pass-qualification/guard.py": [ + "523aca683d41dd67cc08e6d7e3cff7bbd5ae5f43f22b4a446cb6b8c964703680", + 292 + ], + "research/p104-single-pass-qualification/BENCHMARK-pair.json": [ + "4dd8d441e9621b6be633b91447c6bf690a99f71b74ca8e65d1baccc342d50856", + 292 + ], + "research/p104-single-pass-qualification/PROOF.md": [ + "2c2230d32f7f922ef0c3e27fd67c0efc59a852e8e661a4b1737efa7b82a1670d", + 292 + ], + "research/p104-single-pass-qualification/RESULT.json": [ + "0e637f19fdbb784af69ef1a42fc6abf1f25eb9805954c394145b6be72827b1f9", + 292 + ], + "research/p104-single-pass-qualification/VALIDATION.json": [ + "a256f761179cdeff0117002fe0c12b15ea6636f7f962f5af4e88f6a7deac9593", + 292 + ], + "research/p104-single-pass-qualification/candidate.py": [ + "00cb0b03c618ddd9ff7ca77764e6c3076ab52125f2b2c09dd71218e8cb037e69", + 292 + ], + "research/p104-single-pass-qualification/SOURCES.json": [ + "9542e777cedf38b50af03b3241c4af225ed6fc84fc49d72c4dd15f72d059d732", + 292 + ], + "research/p104-single-pass-qualification/benchmark.py": [ + "4f9f3f3b22f5926cdb2678ad3654a638dc5b36f11af34c79e8c3ee7cc133f660", + 292 + ], + "research/p104-single-pass-qualification/README.md": [ + "cfa4c677b5f30b1d8ed4db6b8c35057548df71eb533a23007fa588f670b5505b", + 292 + ], + "research/p104-single-pass-qualification/baseline.py": [ + "3683142dfe57c7621fdd38a659145ad3431787bab5ec5f82758a7ffa634b8885", + 292 + ], + "research/p104-single-pass-qualification/.gitignore": [ + "f810730044c8012b0364fd1e80bbbe53b40867d8e2bdf22e6278c3c354fcd011", + 292 + ], + "research/p104-single-pass-qualification/source.py": [ + "573a24349bd2976cde3a7699bcfe4fcc9af26270285403b8e1f53b75a884176c", + 292 + ], + "research/p104-single-pass-qualification/finite.py": [ + "93b6582994b904c486e69c140e1195c551291afd014f2ae240a51fecdc14bbaf", + 292 + ], + "research/p104-single-pass-qualification/BENCHMARK-remaining.json": [ + "a44264a3e24d209f44b888436b6134a99cd4935c81af6dc4b1457201d4a47dbb", + 292 + ], + "research/p104-single-pass-qualification/BENCHMARK.json": [ + "b5cda1660077d6b22b70fdd9ee343deeece974469e704d06741d9361d3e9d088", + 292 + ], + "research/p104-single-pass-qualification/TASK.json": [ + "59de989e4720537da5a96ee997c7a23e5affc0f7eedf91a1f678475207f67a0c", + 292 + ], + "research/p104-single-pass-qualification/VERIFY.json": [ + "2ba6a1bb114599d37b1098d831d55db7575528107ebc19813daf8547ededa61f", + 292 + ], + "research/p104-single-pass-qualification/inputs/PR5831.tar": [ + "6ad8d8e0463e8e6ea8d503610c3f9ec38108f16092bc479bc1cb6f48683f6ab6", + 292 + ], + "research/p104-single-pass-qualification/evidence/HELPER-CLOSURE.json": [ + "b9dd945a09c70cbf78279120478e7e86ce1133ff92281577612972a9ef3fe14f", + 292 + ], + "research/p104-single-pass-qualification/evidence/PLAN.json": [ + "49992b77ca779f56073c44e111f68bb7637b5502ff0fbfc2abadf46c2a2f83c4", + 292 + ], + "research/p104-single-pass-qualification/evidence/METADATA-DRAFT-REJECTION.txt": [ + "8513d5c70659ea47ed73265911a05f2ce308ff0f70ad44adcc028e8f4659ce45", + 292 + ], + "research/p104-single-pass-qualification/evidence/CLAIM.md": [ + "96e20e92bf86110e6bc1cb402b889980bc6bee050042dce0abe08f75904f44b9", + 292 + ], + "research/p104-single-pass-qualification/evidence/FEASIBILITY-PLAN.md": [ + "0ca77208c38f85e12b492bab2a8fd75ad9c197385c9db3dba00b0a859574920b", + 292 + ], + "research/p104-single-pass-qualification/evidence/C1/stdout.txt": [ + "597f01e3e708ab5513242e1867c15d8a33c7c2ebf0d1ed60ae97301e118931fc", + 292 + ], + "research/p104-single-pass-qualification/evidence/C1/stderr.txt": [ + "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + 292 + ], + "research/p104-single-pass-qualification/evidence/C1/usage.json": [ + "9b6379165f83959edf6e28c5c94585d03571a847312b55308c454271e42c72af", + 292 + ], + "research/p104-single-pass-qualification/evidence/C1/receipt.json": [ + "31ff4f65ef5e3ee6b963e767d833ca232186961e12653f416a9472d13f2216ea", + 292 + ], + "research/p104-single-pass-qualification/evidence/finite/stdout.txt": [ + "a572476833d446e9ea4197aa8550854997bdd344fa9fd6e5dc916cb236a46f42", + 292 + ], + "research/p104-single-pass-qualification/evidence/finite/stderr.txt": [ + "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + 292 + ], + "research/p104-single-pass-qualification/evidence/finite/receipt.json": [ + "097d61f8f1a8e8ad4bd73c8929d197050a36f64eb1587ee4d189fac64567f779", + 292 + ], + "research/p104-single-pass-qualification/evidence/finite/usage.json": [ + "0b78a3631487d6c0a9a60befc32ae372a646a4f847c8f53b462e3b7ef7118163", + 292 + ], + "research/p104-single-pass-qualification/evidence/B2/stderr.txt": [ + "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + 292 + ], + "research/p104-single-pass-qualification/evidence/B2/stdout.txt": [ + "5364ed37f332b0dc413139f7b247ad7167f05376ddfed0db163d412444c54e8c", + 292 + ], + "research/p104-single-pass-qualification/evidence/B2/usage.json": [ + "366c89becae08fbf4e15419e888304febe34e9a46fc5f9a3076795140d01465c", + 292 + ], + "research/p104-single-pass-qualification/evidence/B2/receipt.json": [ + "9ccd3ce315716b00e11e2842b0b209feff90700a7ab5075a876d0e1d8c4f065e", + 292 + ], + "research/p104-single-pass-qualification/evidence/registered-O/usage.json": [ + "de7ef20f181b7783f2e3158c0dab96a9022be8ee4e84267e433422950c55b762", + 292 + ], + "research/p104-single-pass-qualification/evidence/registered-O/stderr.txt": [ + "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + 292 + ], + "research/p104-single-pass-qualification/evidence/registered-O/receipt.json": [ + "665bfc1caae8f57b435d2e8ced9ee9e8675b420082df1de56b99ea853dc2c28a", + 292 + ], + "research/p104-single-pass-qualification/evidence/registered-O/stdout.txt": [ + "09f7638198857fea399a36e7bd4dd3345314d1880459de7ad7ed75ada62ac526", + 292 + ], + "research/p104-single-pass-qualification/evidence/registered-normal/stderr.txt": [ + "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + 292 + ], + "research/p104-single-pass-qualification/evidence/registered-normal/stdout.txt": [ + "213dca818fadca954452dec68866d3f36d3ba85017a847bffb731da14190bc5c", + 292 + ], + "research/p104-single-pass-qualification/evidence/registered-normal/usage.json": [ + "bbc6d0af9b6156cdec526a8de6cc121146d4e2f56708d9a35fbfb059f093996d", + 292 + ], + "research/p104-single-pass-qualification/evidence/registered-normal/receipt.json": [ + "414a5c483343ddf3f14e242f5bc34022a89d39aef958621edf9ff68b025d57a7", + 292 + ], + "research/p104-single-pass-qualification/evidence/C2/usage.json": [ + "5bdec9f9cc25870c1aefb2fff6676c320ad6025f84273ce02361b48562e4c091", + 292 + ], + "research/p104-single-pass-qualification/evidence/C2/stderr.txt": [ + "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + 292 + ], + "research/p104-single-pass-qualification/evidence/C2/stdout.txt": [ + "20c06368a4b7b79a23c1b60ecb9662e6fe453c5361aae975f7ca0cbe37cb4655", + 292 + ], + "research/p104-single-pass-qualification/evidence/C2/receipt.json": [ + "3b8ce5e7ab494659d22eb5afae25f6038b30fa385ca8ef5a7f1e35a806588fa6", + 292 + ], + "research/p104-single-pass-qualification/evidence/B1/usage.json": [ + "6727cbc9b32649bf98586ee06ce9558c28ec1e48c6e1ae7ebbb673d9115a54a1", + 292 + ], + "research/p104-single-pass-qualification/evidence/B1/stdout.txt": [ + "d835d0c9eecd0f1ea8ece765700ef3f8e51601f45533a1d5b4c5680fb5e5671a", + 292 + ], + "research/p104-single-pass-qualification/evidence/B1/stderr.txt": [ + "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + 292 + ], + "research/p104-single-pass-qualification/evidence/B1/receipt.json": [ + "2bf7ad6e705de43df4447135602afa98531deabaff4005871a42de32155d8a12", + 292 + ], + "research/p104-single-pass-qualification/evidence/profile-runtime/dispatch.py": [ + "0c728ab8c5e6263a12d73aef6b245a3af1c71c1c7d2fe8ad3638296429f88213", + 292 + ], + "research/p104-single-pass-qualification/evidence/profile-runtime/source.py": [ + "573a24349bd2976cde3a7699bcfe4fcc9af26270285403b8e1f53b75a884176c", + 292 + ], + "research/p104-single-pass-qualification/evidence/profile-runtime/profile_helper.py": [ + "19d831fd8ff5f39934608d7d92ea5dfa070d56c341d3ddb7d79f229de29f4f44", + 292 + ], + "research/p104-single-pass-qualification/evidence/profile-runtime/guard.py": [ + "269fbaf3439c35813a6b979d1f270c43ffc1eee887687683931f28a1906d8a85", + 292 + ], + "research/p104-single-pass-qualification/evidence/profile-runtime/profile_precision.py": [ + "21cacd8212583150c2099f2b2c5e2ec900f884613eb750bfd2fdd083c81bc82b", + 292 + ], + "research/p104-single-pass-qualification/evidence/precision/stderr.txt": [ + "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + 292 + ], + "research/p104-single-pass-qualification/evidence/precision/stdout.txt": [ + "123308d716a5e12b464b1110c719174f8e290d6a890022ea1382cd92ad32e49f", + 292 + ], + "research/p104-single-pass-qualification/evidence/precision/receipt.json": [ + "5e91433748c045b557f9d84df825d70a9ddb08281d18cd0120a8b06324506d47", + 292 + ], + "research/p104-single-pass-qualification/evidence/precision/usage.json": [ + "4ed74072e71318a70cc921d9efcfb418ba32310a40655252ceee73b6adf4bcc0", + 292 + ], + "research/p104-single-pass-qualification/evidence/finite-O/usage.json": [ + "d349c636e8d81e9b2a91117b0610f1840448c0a8bee06eab77f5703a3e078e61", + 292 + ], + "research/p104-single-pass-qualification/evidence/finite-O/stderr.txt": [ + "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + 292 + ], + "research/p104-single-pass-qualification/evidence/finite-O/receipt.json": [ + "5b850742a3c8dd676b34d6294421fa4a9d8bede16c7a005066aedf629ce90383", + 292 + ], + "research/p104-single-pass-qualification/evidence/finite-O/stdout.txt": [ + "a572476833d446e9ea4197aa8550854997bdd344fa9fd6e5dc916cb236a46f42", + 292 + ], + "research/p104-single-pass-qualification/evidence/B3/stderr.txt": [ + "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + 292 + ], + "research/p104-single-pass-qualification/evidence/B3/stdout.txt": [ + "0a4fadf5e8f111853df912f005bafa35bf150f40be39af16e0dde7bb0c6f6de6", + 292 + ], + "research/p104-single-pass-qualification/evidence/B3/usage.json": [ + "4480c3eb194cfed74ac94df6a0677a48aef9598c7cde0a3044c0b185fde4780c", + 292 + ], + "research/p104-single-pass-qualification/evidence/B3/receipt.json": [ + "4f509382012196bfcdfd181c2cd8cdcbceab84ac45e43f591d13972fa7478077", + 292 + ], + "research/p104-single-pass-qualification/evidence/finite-native-set-O/stderr.txt": [ + "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + 292 + ], + "research/p104-single-pass-qualification/evidence/finite-native-set-O/stdout.txt": [ + "a572476833d446e9ea4197aa8550854997bdd344fa9fd6e5dc916cb236a46f42", + 292 + ], + "research/p104-single-pass-qualification/evidence/finite-native-set-O/receipt.json": [ + "e0b41c31b8f53e5d5fb2437d738314c38d5bece206e7f08d563ed9bb6bc66752", + 292 + ], + "research/p104-single-pass-qualification/evidence/finite-native-set-O/usage.json": [ + "f998110a2847a371de08a75d4c7bfecd0002a593125dc8a54b6b89ade12abb12", + 292 + ], + "research/p104-single-pass-qualification/evidence/helper/usage.json": [ + "786aa31a99717fc877dfa4c4f5a6139f5b7dde01cc6636898fd458e87069ebd1", + 292 + ], + "research/p104-single-pass-qualification/evidence/helper/receipt.json": [ + "c1493930e93d996699e8f3543a97dfc2e50fe9c39523882a52c47a27e1ac1eae", + 292 + ], + "research/p104-single-pass-qualification/evidence/helper/stderr.txt": [ + "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + 292 + ], + "research/p104-single-pass-qualification/evidence/helper/stdout.txt": [ + "e25c68dc48c5155b81a9c4097c3c462bd30053276b811f2389f0c8f327fff6bd", + 292 + ], + "research/p104-single-pass-qualification/evidence/finite-native-set/stdout.txt": [ + "a572476833d446e9ea4197aa8550854997bdd344fa9fd6e5dc916cb236a46f42", + 292 + ], + "research/p104-single-pass-qualification/evidence/finite-native-set/stderr.txt": [ + "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + 292 + ], + "research/p104-single-pass-qualification/evidence/finite-native-set/receipt.json": [ + "113399065e79a5c91e9f8cb9f90b864a8fd0d5b058832a271132d104cf43aca8", + 292 + ], + "research/p104-single-pass-qualification/evidence/finite-native-set/usage.json": [ + "515f359cb3fa57f0f854328975f106cf485884fb2a8d1374f1d83cea26ec6640", + 292 + ], + "research/p104-single-pass-qualification/evidence/C3/receipt.json": [ + "a2490ff12b013727f51a7b5e25088f488b011e9806d554d0fa096886d9f59fe0", + 292 + ], + "research/p104-single-pass-qualification/evidence/C3/usage.json": [ + "a1dd1b10d06da58978564be288c2eba6a894a57df0345758f7d8c1dd36006989", + 292 + ], + "research/p104-single-pass-qualification/evidence/C3/stderr.txt": [ + "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + 292 + ], + "research/p104-single-pass-qualification/evidence/C3/stdout.txt": [ + "516780c2b8645a2536280c20ec8885e60b96b0debff5005f91a2ba327fdc0a95", + 292 + ] +} diff --git a/research/p104-single-pass-qualification/evidence/SEALED-RESULT.json b/research/p104-single-pass-qualification/evidence/SEALED-RESULT.json new file mode 100644 index 0000000000..d791243041 --- /dev/null +++ b/research/p104-single-pass-qualification/evidence/SEALED-RESULT.json @@ -0,0 +1,8 @@ +{ + "status": "PASS_SEALED_GIT_FREE_QUALIFICATION", + "files_unchanged": 91, + "receipt_equal": true, + "wall_seconds": 39.24383878399385, + "implementation": "9b8cffa57c09eefba39dc6a4efdc34a15dfc1ebd", + "archive_sha256": "7601159a7d13797e89efa94499cb0c9b1ce8aa340de2f88207b67b43e46ea03d" +} diff --git a/research/p104-single-pass-qualification/evidence/sealed-I-O/receipt.json b/research/p104-single-pass-qualification/evidence/sealed-I-O/receipt.json new file mode 100644 index 0000000000..3fa2b3910a --- /dev/null +++ b/research/p104-single-pass-qualification/evidence/sealed-I-O/receipt.json @@ -0,0 +1,26 @@ +{ + "exit": 0, + "label": "sealed-I-O", + "optimized": true, + "original_local_receipt_sha256": "fcb2e3d79606d445be9778b8113a40b7c045711da8ba0e5f363c3fd798d78c7a", + "platform": "Linux-7.0.0-38-generic-x86_64-with-glibc2.39", + "python": "3.12.3 (main, Aug 31 2026, 10:18:26) [GCC 13.3.0]", + "runner_sha256": "523aca683d41dd67cc08e6d7e3cff7bbd5ae5f43f22b4a446cb6b8c964703680", + "runtime_policy_sha256": "4422a5d258935439d2317429b2298af0d069a47149778c3becdc294d125f5031", + "sampled_process_group_rss_bytes": 121741312, + "source_bytes_and_modes_unchanged": true, + "source_inventory_sha256": "efed43ddf44408346d8953ede8f0c98835820c67c19c4ad79daa633e00fb85b2", + "status": "PASS", + "stderr_bytes": 0, + "stderr_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "stdout_bytes": 1281, + "stdout_sha256": "0af9f2bc019d23c38e7b0a599a4e717955cb99faac22752da836258610ba081c", + "termination": null, + "usage": { + "exit": 0, + "kernel_max_rss_kib": 117436, + "system_seconds": 0.1, + "user_seconds": 39.09 + }, + "wall_seconds": 39.24383878399385 +} diff --git a/research/p104-single-pass-qualification/evidence/sealed-I-O/stderr.txt b/research/p104-single-pass-qualification/evidence/sealed-I-O/stderr.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/research/p104-single-pass-qualification/evidence/sealed-I-O/stdout.txt b/research/p104-single-pass-qualification/evidence/sealed-I-O/stdout.txt new file mode 100644 index 0000000000..3810fa5b05 --- /dev/null +++ b/research/p104-single-pass-qualification/evidence/sealed-I-O/stdout.txt @@ -0,0 +1,4 @@ +PASS_PRECISION_LINUX_SOURCE_CONTROLS {"contract": "declared contract edits", "declared_edit": "unique backend seam", "inner_archive": "source hash", "official_export_byte": "Exact PR5831 bundle"} +{"backends": 2, "controls": ["one-use", "closed-call", "missing", "duplicate", "changed-weights", "changed-rounding", "changed-word", "original-malformed-rejection", "propagated-exception", "failed-finish", "failed-take", "fresh-context-not-previous-pass", "aborted-take", "one-use", "closed-call", "missing", "duplicate", "changed-weights", "changed-rounding", "changed-word", "original-malformed-rejection", "propagated-exception", "failed-finish", "failed-take", "fresh-context-not-previous-pass", "aborted-take", "input-mutation"], "events": 5, "status": "PASS_FINITE_FEASIBILITY_ONLY"} +PASS_P104_SINGLE_PASS_QUALIFICATION +{"mode": "qualify", "receipt": {"all_actual_witness_rows_equal": true, "coefficient_scale_bits": 55, "coordinates": 799, "events": 25984, "finite_fixtures": {"cases": 120, "controls": ["nondyadic scalar", "inexact scale division", "nondyadic weight"], "events": 4240}, "guards": {"owned": 22, "prefix": 26, "public": 23}, "source_controls": 6, "source_result_sha256": "cc7739703ed23532d187949c8507d09c13ac4c152e07a930f0087cde0d7a3d98"}, "seconds": 38.83663} diff --git a/research/p104-single-pass-qualification/evidence/sealed-I-O/usage.json b/research/p104-single-pass-qualification/evidence/sealed-I-O/usage.json new file mode 100644 index 0000000000..577b2318ec --- /dev/null +++ b/research/p104-single-pass-qualification/evidence/sealed-I-O/usage.json @@ -0,0 +1 @@ +{"user_seconds":39.09,"system_seconds":0.10,"kernel_max_rss_kib":117436,"exit":0} From 66fb6c6b8683b37967e9d7f313b3df99a49d2406 Mon Sep 17 00:00:00 2001 From: d3lerium Date: Tue, 27 Oct 2026 16:24:30 +1100 Subject: [PATCH 5/5] Retain complete predecessor notice alongside qualification package --- .../p104-single-pass-qualification/NOTICE | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 research/p104-single-pass-qualification/NOTICE diff --git a/research/p104-single-pass-qualification/NOTICE b/research/p104-single-pass-qualification/NOTICE new file mode 100644 index 0000000000..f33dd1539a --- /dev/null +++ b/research/p104-single-pass-qualification/NOTICE @@ -0,0 +1,30 @@ +Complete single-pass qualification +================================== +New source-bound observation, finite controls, profiling and complete Linux benchmark: Chris R / Clear1nsight, with substantial OpenAI Codex assistance; no subagents or independent human/kernel acceptance. Apache-2.0. Original arithmetic, source contract, expected records and mathematical claims are unchanged. No kappa gain. + +Retained PR5839 NOTICE, verbatim: + +Linux validation of PR5831 +========================== +Exact integer engine, proof, explicit contract adaptation and original qualification: Ali Romman, with substantial OpenAI Codex assistance. Source PR5826/5819, Adam Gall, ywz65, PR2878, Mason Hale/PR5811 and all retained P104/native/compiler lineage keep their attribution and Apache-2.0 terms. Full source archives remain unchanged. + +New Linux source/coverage review, guarded measurements, custody controls, portable reproduction and reporting: Chris R / Clear1nsight, with substantial OpenAI Codex assistance; no subagents or independent human/kernel acceptance. The guard and export-custody pattern follow PR5816/5818/5832. Apache-2.0. No new kappa or supplier admission. + +Retained research/p104-noisy-copy-reset/inputs/caller-NOTICE +Composition of accumulated native updates and two released P104 blocks. +New integration, compatibility checks and complete price: Mason Hale with substantial OpenAI Codex assistance, including separate agent checks. Apache-2.0. No independent human acceptance is claimed. + +The accumulation and retained-source lineage is credited verbatim in vendor/accumulated/NOTICE. The block constructions and composition lineage are credited verbatim in vendor/blocks/NOTICE. These notices and every retained source byte are unchanged. Ali Romman supplied PR5802 and PR5795; Joel Pulikkan/GamingPuzzled supplied the R22 mechanism; Ali Romman supplied the second block PR5796 and the provisional role92 plan. All native/helper/controller/compiler/BIT/analytic credit remains in the retained notices. + +Dugongue (@Dugongue), PR5806 at 20e7289b63d240715aa96006571ae38a46291d97, supplied a concurrent informal proof of the same three-accumulation/two-block baseline join. The fourth role92 realization is additional to that shared composition. + + +Retained research/p104-noisy-copy-reset/inputs/prior-NOTICE +Copyright 2026 Ali Romman. +Prepared with substantial OpenAI Codex assistance in research, proof, code and checks. +Licensed under Apache-2.0. + +Source files are unchanged. See source/NOTICE and ORIGINS.json. +The completed-error method credits Adam Gall, ywz65 and PR2878. +PR5802 and its retained predecessors supply the native word and compiler premises. +No independent scientific acceptance is claimed.