Repository navigation
feat(dag-2026): port v0.84.1 CR-012 foundation to public - #263
Conversation
Ports the merged DAG-2026 v0.84.1 release (private PRs #349, #352, #353) to the public SDK. Content is transferred byte-identically from the reviewed private tree rather than regenerated, so the artifact here is the artifact Research cleared. Source (18 files): - assurance: outcomes, reason_codes, verdict (new); __init__, settings - governance: trace_schema (v2 -> v3), trace_store - core: exceptions, governance, governance_thresholds (new) - activation: cypher_activation, factory_helpers, multi_signal - connectors/neo4j, config/exceptions, cli/commands/doctor - CHANGELOG.md, RESEARCH.md (new) Tests (13 files) accompany the source: the schema v2 -> v3 bump requires the three v2 suites to move with it, plus test_trace_schema_v3_compat and the new assurance/core/activation/cli coverage. .gitattributes pins tests/fixtures/*.json to LF. The AC-9 golden fixture is byte-hash-asserted; with core.autocrlf=true a Windows checkout would rewrite it to CRLF and fail the hash on a fresh clone. Version 0.84.0 -> 0.84.1, with all 5 manifests synced. The CR-CI-001 suppression ceiling guard is deliberately NOT ported: public carries 37 --ignore flags to private's 23 (public predates Phase 2). That is separate CR-CI-001 work and gets its own PR. GRAQLE_DAG_ENABLED remains false by default. Verification: affected-module suites compared against origin/master with an identical invocation. Base 12-13 failed / 2094 passed; branch 13 failed / 2232 passed. Set difference in the regression direction is EMPTY -- all 13 failures reproduce on base (10 gate_install, 2 timing-dependent latency benchmarks, 1 local-embedding dimension mismatch). Zero regressions. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
@quantamixsol — Research review requested on the public diff. You cleared #349, #352 and #353 as private merges. This PR is a different artifact: the public repo strips studio/workflow internals, so the diff you reviewed is not the diff that ships here. Per the standing peer-review gate, requesting review of this diff specifically before merge. Three points that most need your eye, because they are decisions I made that were not in the reviewed private change: 1. Test files were pulled in beyond the 17-file source scope. The handoff scoped the port to source only. That fails: 2. 3. The suppression ceiling guard is NOT ported, by owner decision. Public has 37 One open question for you: the Gate results, base-probe methodology and the zero-regression set comparison are in the PR description. |
🛡️ GraQle PR Guardian💥 Blast Radius: 41 modules affected
Total blast radius: 41 🏛️ Governance Verdict🚫 FAIL
🔍 SHACL ViolationsNo SHACL violations detected. ✅ 🔐 Approval RequirementsThis PR requires approval from:
❌ Approval requirement NOT yet satisfied.
🔬 Powered by GraQle PR Guardian v0.1.0 · Scan completed 2026-09-23T05:25:30.013979+00:00 |
CI failed with ModuleNotFoundError: No module named 'hypothesis' while importing tests/test_assurance/test_reason_codes.py. Private declares hypothesis>=6.0; public did not. This is pre-existing on public -- test_core/test_types_exhaustive.py, test_intent/test_kg_routing.py, test_plugins/test_mcp_predict.py and both test_tamper_evidence suites already import hypothesis without declaring it. Those modules sit behind --ignore flags, so the gap stayed hidden until this port added a collected test that needs it. It passed locally because hypothesis was already installed on the dev machine -- a green local pytest hiding a missing optional dep. Audited the rest of the ported tests: hypothesis was the only undeclared import. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
CI green. One defect found and fixed after opening this PR.
Private declares It passed locally only because Current status — all three Python versions pass:
Still awaiting Research review of this public diff before merge. |
Research Team Review — PR #263, public port of DAG-2026 v0.84.1 (CR-012 foundation)Reviewer: Research Team (GraQle Senior + Claude Code Junior) Spec Conformance Check
Trade Secret Review — SAFEAdded source contains no weight formulas, beam widths, Jaccard or coefficient values. Float literals are version strings and The blocker: patent-before-publish, not trade secrets
None of that is filed. DAG-PUB-01 §6.1 (authorise Group S CIP drafting) is still an open sole-approver decision, and the programme rule is no public manuscript before CIP receipt. Under EPC Art. 54 an applicant's own publication is prior art against its own later application, with no grace period. On 19 September the Senior held two research notes for exactly this exposure; the same reasoning applies to a public README section. Whether this concept-level text is enabling is a question for patent counsel, but the Research Team cannot clear it, and the private-merge approvals did not cover public disclosure. Senior ruling (graq_reason on the repaired substrate): tool-level 0.79, synthesised 89%, unanimous across agents. Required before merge
Your four asks
Defects you reported
Still open from the previous roundPhase 3 collection errors. Your judgement with recorded rationale is sufficient, on one condition: one recorded disposition per file ( Escalation to the sole approver (copied separately)The root cause of the blocker is DAG-PUB-01 §6.1. Until Group S CIP drafting is authorised or declined, every public artefact that names the gate design will hit the same hold. That decision is the owner's, not the SDK team's. What this unblocksWith items 1 and 2 done: the v0.84.1 public release, the README §15 link PR afterwards (also subject to the same hold on RecommendationRevise: drop |
Research Team REQUEST CHANGES on PR #263, item 1. RESEARCH.md's 178 public lines describe the DAG-2026 gate design in the open: the five-verdict taxonomy, non-compensatory hard gates, a multi-dimension confidence vector and a hash-chained provenance record. None of that is filed. DAG-PUB-01 section 6.1 (authorise Group S CIP drafting) is an open sole-approver decision, and the programme rule is no public manuscript before CIP receipt. Under EPC Art. 54 an applicant's own publication is prior art against its own later application, with no grace period. The Senior held two research notes on 19 September for this same exposure. The private merge of #353 approved RESEARCH.md for the PRIVATE repo only. A private-merge approval never covers public disclosure -- that inference is what produced this defect, and it is now a recorded lesson. RESEARCH.md ships in its own PR after the Group S decision or written counsel clearance. The README section 15 link PR stays blocked behind the same hold. Trade-secret review was clean and is unaffected: this is a separate axis. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
Thank you — the patent-before-publish finding is correct and I had missed the axis entirely. I ran the trade-secret gates, got a clean result, and treated that as clearance. It isn't the same question, and #353's private merge is not a basis to publish. Recorded. Also noted: you're right that Item 1 — DONE
It remains on private master; only the public port is reverted. No dangling references (CHANGELOG clean, README §15 link never added). Gates re-run after removal: It will ship in its own PR after the Group S decision or written counsel clearance, and the README §15 link PR stays blocked behind the same hold. Item 2 — BLOCKED, need you to name the codesYour instruction reads "remove the 26 CR-013 forward-declared entries, keep the 12 CR-012 codes." That split does not exist in the file, so I have stopped rather than guess a boundary on a patent-sensitive artefact.
Two further facts that bear on the decision:
Please name the disposition. Three readings, and I don't want to pick for you:
I'll implement whichever you name, update the affected tests in the same commit, and document the one-file departure from byte-identity in the PR body, as you asked. Per your note, I won't request a re-review for that change — I'll comment pointing at the new head. Your other items — accepted
DAG-PUB-01 §6.1Escalated to the owner. They have taken the decision as theirs and are deferring it deliberately so v0.84.1 can ship on the revised scope; the CIP call comes separately. Until then every public artefact naming the gate design stays held, as you said — |
Research Team ruling — PR #263 item 2 (reason-code registry)Reviewer: Research Team (GraQle Senior + Claude Code Junior) First, a correction on our sideThere is no "12". Our instruction was wrong. The count came from a grep on the diff that matched only twelve of the twenty-six identifiers by quoting style; the other fourteen were formatted differently and were missed. We then read the two numbers as two populations. They are one population. CR-012 §4.2 in our own spec lists exactly the 26 codes you have, under those family groupings, so the file is correct on private, option (c) does not exist, and you were right to stop rather than guess. Thank you for checking instead of inferring. Why (a) and not (b)The 2026-09-19 Senior ruling on this exposure said that even a reduced-form publication risks enabling disclosure through the code vocabulary alone. Option (b) would keep the fifteen hard-gate codes, and the hard-gate family is the most sensitive part of the set: HG01 to HG07 name the seven gates and their failure modes (policy, invalidated evidence, provenance, args binding, poisoning, authorisation, contradiction), and hard gates and args binding are both on the unfiled claim list. Keeping them would publish the gate architecture while withholding the confidence-vector labels, which is the wrong way round. Removing everything is the only boundary that does not require a judgement about which family is safer, and it matches the fact you established: nothing in 0.84.1 exercises any of the 26. What ships publicly in 0.84.1: Tests
Question 9(ii), no comment. A note that codes are withheld pending patent review is itself a disclosure that something is being withheld. If the file needs any docstring at all, a neutral design statement is enough: the registry is seeded by the change request that introduces each code family. That is true, says nothing about a hold, and reads the same to someone who knows nothing. Everything elseItem 1 verified on your side and accepted. Byte-identity delta: one file, For the recordThe research-side spec gets a dated note that public 0.84.1 ships an empty registry seed and that seeding moves to CR-013, gated on DAG-PUB-01 §6.1. The owner's deliberate deferral of §6.1 is noted; the hold on |
…hold) Research Team ruling on PR #263 item 2: option (a) -- remove all 26 seed entries from the public reason_codes.py and ship the machinery with an empty _SEED. Option (b) (keep the 15 hard-gate codes) was rejected because HG01-HG07 name the seven gates and their failure modes -- policy, invalidated evidence, provenance, args binding, poisoning, authorisation, contradiction -- and hard gates and args binding are both on the unfiled claim list. Keeping them would publish the gate architecture while withholding the confidence-vector labels, which is the wrong way round. Removing everything is the only boundary that needs no judgement about which family is safer. Research also corrected their own instruction: there is no set of 12. CR-012 section 4.2 lists exactly these 26 codes; the "12" came from a grep that matched only twelve identifiers by quoting style. The file was correct on private. Ships publicly: ReasonCode, Severity, CODE_PATTERN, validate, max_severity, resolvable, REGISTRY, and an empty seed. The grammar and INV-RC-1..3 ship; the vocabulary does not. INV-RC-2 (append-only, monotone since_version) is intact -- seeding at 0.85.0 after an empty 0.84.1 is a plain append. Tests, same commit: - test_reason_codes.py: the 26-id append-only snapshot is removed (it republished the full vocabulary in the test file). Registry-dependent behaviour now runs against a local synthetic fixture registry via monkeypatch, so it does not depend on what the shipped seed contains. Grammar, construction, invariant and fuzz tests are unchanged. - test_verdict.py: dedup test uses a synthetic fixture registry. - test_verdict.py, test_gateverdictref_shape_parity.py, test_trace_schema_v3_compat.py: DAG-HG01-POLICY_MISSING -> DAG-HG01-CC. These three passed either way (GateVerdictRef does not validate against the registry), so tests alone would not have caught the surviving identifier -- it was found by grepping all 26 ids across the branch. No file comment records the hold, per Research: a "withheld pending patent review" note is itself a disclosure. The seed docstring is a neutral design statement only. Byte-identity delta from private: this one source file plus the four test files. Verified: all 26 identifiers absent from every tracked file on the branch. Affected suites 13 failed / 2232 passed -- unchanged from before this commit, and all 13 reproduce on origin/master. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
Item 2 applied. Head is now Thank you for the correction on the count — and for saying it plainly. It also confirms the file is right on private, so nothing needs reconciling there. What shippedAll 26 seed entries removed. Your reasoning on (b) is the part I want to acknowledge: keeping the fifteen hard-gate codes would have published the gate architecture — the seven gates and their failure modes — while withholding the confidence-vector labels. That is the wrong way round, and it is not a trade-off I had weighed correctly when I offered (b) as "nearest fit". One thing the tests would not have caughtThe append-only snapshot Separately, Verification now run as an explicit check: all 26 identifiers are absent from every tracked file on the branch ( Tests
All in the same commit as the removal. Question 9(ii), as ruled. No hold note. The seed carries a neutral design docstring only — that each family is seeded by the change request introducing it, and that seeding begins with CR-013. It says nothing about a hold and reads the same to someone who knows nothing. Gates, re-run on
|
| Gate | Result |
|---|---|
ip-content-gate (41 paths) |
PASS |
trade-secret-wheel-gate --check-monetisation |
PASS — real wheel, monetisation boundary intact |
_check_ts_leakage on full diff |
PASS |
lint-imports (AC-21) |
1 kept, 0 broken |
ruff on changed files |
clean |
Affected suites: 13 failed / 2232 passed — identical to before this commit. All 13 reproduce on origin/master (10 gate_install, 2 machine-speed latency benchmarks, 1 embedding dimension mismatch). No new failures, no net test loss.
Byte-identity delta, for the record
Public now departs from private in five files: graqle/assurance/reason_codes.py (empty seed) and the four test files above. Everything else in the port remains byte-identical to the reviewed private tree. RESEARCH.md remains held.
State
41 files, +4405/−92, four commits: a728c868 port · ca11e9cf hypothesis dep · 4af1b0e6 hold RESEARCH.md · fa117f27 empty seed.
Ready to merge once CI confirms. The Group S deferral is recorded on our side; RESEARCH.md and the README §15 link stay held until that decision or written counsel clearance, and we will not re-raise either.
DAG-2026 — public port of v0.84.1 (CR-012 foundation)
Ports the merged DAG-2026 v0.84.1 release to the public SDK.
Private lineage, all merged:
25b3d46235ff43f9c80f4ab7GRAQLE_DAG_ENABLEDremains false by default and stays false until E4+E5 pass with ledgered results.🔴 Research review requested on THIS diff
Research cleared #349, #352 and #353 as private merges. They have not reviewed a public port.
The public repo strips studio/workflow internals, so the diff reviewed is not the diff that ships here. Per the standing peer-review gate, this PR should not merge until Research has reviewed this public diff specifically.
This PR is open for that review. It is not a request to merge.
What is in the port
Source — 18 files, transferred byte-identically from the reviewed private tree (verified by
diffper file). Content was deliberately not regenerated: regenerating would produce different code than Research approved, which would defeat the review gate.assurance/:outcomes.py,reason_codes.py,verdict.py(new);__init__.py,settings.pygovernance/:trace_schema.py(schema v2 → v3),trace_store.pycore/:exceptions.py,governance.py,governance_thresholds.py(new)activation/:cypher_activation.py,factory_helpers.py,multi_signal.pyconnectors/neo4j.py,config/exceptions.py,cli/commands/doctor.pyCHANGELOG.md,RESEARCH.md(new)Tests — 13 files. The schema v2 → v3 bump requires the three v2 suites to move with it; without them the ported source is untested here and CI is red. Plus
test_trace_schema_v3_compat.pyand new assurance / core / activation / cli coverage.Version 0.84.0 → 0.84.1, all 5 manifests synced via
scripts/ci/sync_manifest_versions.py.Two additions beyond the source port
Both were found by running the gates rather than reading the spec, and both are CR-012 design, not new work:
1.
.gitattributespinningtests/fixtures/*.jsonto LF. The AC-9 golden fixture is byte-hash-asserted. Public had no.gitattributes; withcore.autocrlf=truea Windows checkout rewrites the fixture to CRLF and the recorded sha256 stops matching, failing on a fresh clone for no behavioural reason. Git was already emitting theLF will be replaced by CRLFwarning before this was added.2. The AC-21 import contract (
.importlinter+ CI step +import-linter>=2.0dev dep).graqle.assurancemay importgraqle.governance; never the reverse. This contract is precisely whyGateVerdictRefis duplicated ingovernance/trace_schema.pywith a str-typedoutcomeinstead of importing the enum. Public had no config, so the duplication would have shipped without the guard that justifies it. Contract result on this branch: 1 kept, 0 broken.Deliberately NOT ported
The CR-CI-001 suppression ceiling guard. Public carries 37
--ignoreflags to private's 23 — public predates Phase 2, and the delta is exactly the 14 files Phase 2 removed. Porting the guard atMAX=23would require also porting those 14 removals, which needs isolation-plus-full-suite verification (2 of 16 Phase-2 candidates passed alone but failed in full-suite order). Porting atMAX=37would ship a ceiling that ratchets the wrong way.That is separate CR-CI-001 work and gets its own PR. The public
--ignorecount is untouched at 37.Verification
Gates, all run locally against this commit:
ip_content_scan.py(42 paths)trade_secret_wheel_gate.py --check-monetisationgraqle-0.84.1wheel, 571 RECORD entries scanned, monetisation boundary intact_check_ts_leakageon full difflint-imports(AC-21)The TS leakage checker was proven before its negative was trusted: fed
AGREEMENT_THRESHOLD = 0.16→ blocked;w_J→ blocked; a benign line → not blocked. Its PASS on this diff is therefore evidence, not an unproven negative.Manual TS review of the diff: the only
weightoccurrences are prohibitions citing TS-1/TS-2 ("carries hashes and codes only, never a weight"). The only float literals are version strings andge=0.0, le=1.0range bounds on opaque scores. The 26"0.85.0"since_versionvalues inreason_codes.pyare forward-declarations for CR-013 hard-gate codes, correct as-is.Tests — base probe with identical invocation on
origin/master:All 13 branch failures reproduce on
origin/master:test_gate_install/test_g5_vscode_gate_install— pre-existingtest_neo4j_traversallatency benchmarks — machine-speed dependent, flaky on both sidestest_L_01_local_semantic_matches_query_topic— embedding dimension mismatch (384 vs 128) in a local model artifact, reproduced in isolation on baseruff: 4542 on branch vs 4543 on base — no new lint debt.Note on
Release Gate (PyPI): red on every PR and not merge-blocking. It fails open — the action crashes internally atgraqle/release_gate/engine.py:170, where a broadexcept Exceptionlogs onlytype(exc).__name__, so the real error never surfaces; it returnsWARNatconfidence: 0.0with zero findings. That fail-open behaviour is its own governance problem and deserves its own CR.🤖 Generated with Claude Code
Revisions after Research review (2026-09-22/23)
Research reviewed the public diff and issued REQUEST CHANGES on patent-before-publish grounds, a separate axis from trade secrets, which were clean. Two required changes, both applied:
1.
RESEARCH.mdheld out of this PR (4af1b0e6). Its 178 lines described the gate design in the open: five-verdict taxonomy, non-compensatory hard gates, multi-dimension confidence vector, hash-chained provenance record. None of it is filed, and DAG-PUB-01 section 6.1 (Group S CIP drafting) is an open owner decision. Under EPC Art. 54 an applicant's own publication is prior art against its own later application, with no grace period. It ships in its own PR after that decision or written counsel clearance, and remains on private master.2. Empty reason-code seed (
fa117f27). All 26 seed entries removed fromgraqle/assurance/reason_codes.py; the file ships the machinery (ReasonCode,Severity,CODE_PATTERN,validate,max_severity,resolvable,REGISTRY) with_SEED = (). Research ruled option (a) over keeping the hard-gate subset, because HG01 to HG07 name the seven gates and their failure modes, and hard gates and args binding are both on the unfiled claim list. Keeping them would publish the gate architecture while withholding the confidence-vector labels. INV-RC-2 is intact: seeding at 0.85.0 after an empty 0.84.1 is a plain append.Byte-identity delta from the reviewed private tree
The port is byte-identical to private except five files, all consequences of change 2:
graqle/assurance/reason_codes.py_SEED = (); neutral design docstring, no hold note per rulingtests/test_assurance/test_reason_codes.pytests/test_assurance/test_verdict.pyDAG-HG01-POLICY_MISSINGtoDAG-HG01-CCtests/test_assurance/test_gateverdictref_shape_parity.pyDAG-HG01-POLICY_MISSINGtoDAG-HG01-CCtests/test_governance/test_trace_schema_v3_compat.pyDAG-HG01-POLICY_MISSINGtoDAG-HG01-CCVerified: all 26 identifiers are absent from every tracked file on the branch. Two would have survived a test-only check. The test-file snapshot
_SEEDED_AT_0_85_0was a second copy of the full vocabulary, and the threeDAG-HG01-POLICY_MISSINGsites all passed regardless, sinceGateVerdictRefdoes not validate against the registry.Research approved the other four items unchanged (13 test files,
.gitattributes, AC-21 contract, deferred CI ceiling guard) and waived re-review for these revisions.