feat(dag-2026): port v0.84.1 CR-012 foundation to public - #263
quantamixsol wants to merge 3 commits into
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-22T20:21:49.221688+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 |
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