Skip to content

Commit 03fda7a

Browse files
Pigbibicodex
andcommitted
feat: add converged clean-slate vNext identity allocation
Co-Authored-By: Codex <noreply@openai.com>
1 parent d13dad1 commit 03fda7a

5 files changed

Lines changed: 771 additions & 6 deletions

File tree

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
# QAR clean-slate vNext N1 identity contract
2+
3+
The independent wire namespace is exactly
4+
`qar_vnext.identity_index.v1` with top-level keys `schema_version` and
5+
`entries`. It accepts only `V3_CANONICAL` and `V3_VARIANT`; legacy identity
6+
classes, old index versions, migration and fallback are rejected.
7+
8+
Every public target is cadence-aware:
9+
10+
- canonical: `advisory_report_<as_of>-<cadence>.(json|md)` and
11+
`<as_of>-<cadence>-model-recommendations.html`;
12+
- variant: the same names with
13+
`.variant-<full artifact_integrity_digest>` before the extension;
14+
- manifest uses the matching JSON stem and suffix.
15+
16+
Optional `md` and `manifest` are presence-sensitive: omission means the target
17+
was not requested; a present key must contain a valid basename string. `null`,
18+
empty strings and other types are invalid and cannot be silently dropped by
19+
serialization.
20+
21+
`EXACT_ARTIFACT_REUSE`, `CURRENT_MANDATORY` and `HISTORICAL_RECOVERY` validate
22+
all inputs before lookup. An identical current artifact reuses its immutable
23+
canonical binding; a changed artifact in an occupied period receives a full
24+
artifact-digest variant. Current publication display is separate from stored
25+
identity, while exact reuse requires stored display equality and historical
26+
reuse does not treat display as identity.
27+
28+
This foundation is pure: it performs no filesystem, network, publisher,
29+
build, workflow, Pages, migration or production I/O. The old runtime/index
30+
path is isolated and is not a vNext compatibility mode.

src/quant_advisor_research/publication_plan.py

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
from .period_contract import PeriodContractError, canonical_period_identity
2828
from .publisher import report_content_fingerprint
2929
from .time_contract import TimeContractError, contract_version_for_schema
30+
from .vnext_binding import VNextBindingError, validate_vnext_binding
3031

3132

3233
class PublicationPlanError(ValueError):
@@ -173,6 +174,7 @@ class PublicationEntry:
173174
role: PublicationRole
174175
display_primary: bool
175176
display_order: int
177+
identity_namespace: str = "legacy"
176178

177179
def __post_init__(self) -> None:
178180
_validate_entry(self)
@@ -227,17 +229,24 @@ def _binding_payload(binding: V3IdentityBinding) -> dict[str, object]:
227229
return payload
228230

229231

230-
def _validate_binding(binding: object) -> V3IdentityBinding:
232+
def _validate_binding(binding: object, *, strict_vnext: bool) -> V3IdentityBinding:
231233
if not isinstance(binding, V3IdentityBinding):
232234
raise _error("identity_binding_invalid")
233235
if binding.status != PENDING_ARTIFACT_VALIDATION:
234236
raise _error("identity_binding_invalid")
235-
if binding.identity_class == LEGACY_V2:
237+
if strict_vnext and binding.identity_class == LEGACY_V2:
238+
raise _error("legacy_binding_not_migrated")
239+
if not strict_vnext and binding.identity_class == LEGACY_V2:
236240
raise _error("legacy_binding_not_migrated")
237-
if binding.identity_class not in {V3_CANONICAL, V3_VARIANT}:
238-
raise _error("identity_binding_invalid")
239241
try:
240-
validated = _validate_v3_entry(_binding_payload(binding))
242+
if strict_vnext:
243+
validated = validate_vnext_binding(binding)
244+
else:
245+
if binding.identity_class not in {V3_CANONICAL, V3_VARIANT}:
246+
raise _error("identity_binding_invalid")
247+
validated = _validate_v3_entry(_binding_payload(binding))
248+
except VNextBindingError as exc:
249+
raise _error(exc.code) from None
241250
except (IdentityMetadataError, AttributeError, KeyError, TypeError, ValueError, OverflowError, UnicodeError):
242251
raise _error("identity_binding_invalid") from None
243252
if validated != binding:
@@ -252,9 +261,11 @@ def _validate_entry(entry: PublicationEntry) -> None:
252261
raise _error("candidate_invalid")
253262
if type(entry.role) is not PublicationRole:
254263
raise _error("publication_role_invalid")
264+
if type(entry.identity_namespace) is not str or entry.identity_namespace not in {"legacy", "vnext"}:
265+
raise _error("identity_namespace_invalid")
255266
if type(entry.display_primary) is not bool or type(entry.display_order) is not int or entry.display_order < 0:
256267
raise _error("display_evidence_invalid")
257-
binding = _validate_binding(entry.binding)
268+
binding = _validate_binding(entry.binding, strict_vnext=entry.identity_namespace == "vnext")
258269
candidate = entry.candidate
259270
try:
260271
rebuilt = SelectedCandidate.from_report(
Lines changed: 157 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,157 @@
1+
"""Strict shared validator for the clean-slate vNext identity namespace."""
2+
3+
from __future__ import annotations
4+
5+
import re
6+
7+
from .artifact_integrity import ARTIFACT_INTEGRITY_VERSION
8+
from .identity_lifecycle import FINGERPRINT_VERSION
9+
from .identity_v3 import PENDING_ARTIFACT_VALIDATION, V3_CANONICAL, V3_VARIANT, V3IdentityBinding
10+
from .period_contract import PeriodContractError, canonical_period_identity
11+
from .time_contract import TimeContractError, contract_version_for_schema
12+
13+
14+
class VNextBindingError(ValueError):
15+
"""Stable, sanitized clean-slate binding error."""
16+
17+
def __init__(self, code: str) -> None:
18+
self.code = code
19+
super().__init__(code)
20+
21+
22+
_DATE = r"(?P<as_of>\d{4}-\d{2}-\d{2})"
23+
_DIGEST = r"(?P<digest>[0-9a-f]{64})"
24+
_CADENCE = r"(?P<cadence>daily|weekly|monthly)"
25+
_JSON = re.compile(rf"^advisory_report_{_DATE}-{_CADENCE}(?:\.variant-{_DIGEST})?\.json$")
26+
_HTML = re.compile(rf"^{_DATE}-{_CADENCE}-model-recommendations(?:\.variant-{_DIGEST})?\.html$")
27+
_MD = re.compile(rf"^advisory_report_{_DATE}-{_CADENCE}(?:\.variant-{_DIGEST})?\.md$")
28+
_MANIFEST = re.compile(
29+
rf"^advisory_report_{_DATE}-{_CADENCE}(?:\.variant-{_DIGEST})?\.json\.manifest\.json$"
30+
)
31+
32+
33+
def _error(code: str) -> VNextBindingError:
34+
return VNextBindingError(code)
35+
36+
37+
def binding_payload(binding: V3IdentityBinding) -> dict[str, object]:
38+
payload: dict[str, object] = {
39+
"period_key": binding.period_key,
40+
"as_of": binding.as_of,
41+
"cadence": binding.cadence,
42+
"report_schema_version": binding.report_schema_version,
43+
"contract_version": binding.contract_version,
44+
"semantic_fingerprint_version": binding.semantic_fingerprint_version,
45+
"semantic_digest": binding.semantic_digest,
46+
"artifact_integrity_version": binding.artifact_integrity_version,
47+
"artifact_integrity_digest": binding.artifact_integrity_digest,
48+
"json": binding.json_name,
49+
"html": binding.html_name,
50+
"identity_class": binding.identity_class,
51+
"canonical_identity": binding.canonical_identity,
52+
"display_primary": binding.display_primary,
53+
"display_order": binding.display_order,
54+
}
55+
if binding.markdown_name is not None:
56+
payload["md"] = binding.markdown_name
57+
if binding.manifest_name is not None:
58+
payload["manifest"] = binding.manifest_name
59+
return payload
60+
61+
62+
def _name_digest(name: object, pattern: re.Pattern[str], *, as_of: str, cadence: str) -> str | None:
63+
if type(name) is not str or not name or "/" in name or "\\" in name:
64+
raise _error("identity_name_invalid")
65+
match = pattern.fullmatch(name)
66+
if match is None or match.group("as_of") != as_of or match.group("cadence") != cadence:
67+
raise _error("identity_name_mismatch")
68+
return match.groupdict().get("digest")
69+
70+
71+
def validate_vnext_binding(entry: object) -> V3IdentityBinding:
72+
"""Validate a clean wire entry or binding; no legacy compatibility exists."""
73+
74+
if isinstance(entry, V3IdentityBinding):
75+
if entry.status != PENDING_ARTIFACT_VALIDATION:
76+
raise _error("identity_binding_invalid")
77+
entry = binding_payload(entry)
78+
required = {
79+
"period_key", "as_of", "cadence", "report_schema_version", "contract_version",
80+
"semantic_fingerprint_version", "semantic_digest", "artifact_integrity_version",
81+
"artifact_integrity_digest", "json", "html", "identity_class", "canonical_identity",
82+
"display_primary", "display_order",
83+
}
84+
optional = {"md", "manifest"}
85+
if type(entry) is not dict or not required.issubset(entry) or set(entry) - required - optional:
86+
raise _error("identity_binding_invalid")
87+
as_of = entry["as_of"]
88+
cadence = entry["cadence"]
89+
if type(as_of) is not str or type(cadence) is not str:
90+
raise _error("identity_binding_invalid")
91+
try:
92+
period_key = canonical_period_identity(cadence, as_of).key
93+
except (PeriodContractError, TypeError, ValueError, OverflowError):
94+
raise _error("period_mismatch") from None
95+
if type(entry["period_key"]) is not str or entry["period_key"] != period_key:
96+
raise _error("period_mismatch")
97+
98+
schema = entry["report_schema_version"]
99+
contract = entry["contract_version"]
100+
if type(schema) is not str:
101+
raise _error("invalid_schema_version")
102+
if type(contract) is not str:
103+
raise _error("invalid_contract_version")
104+
try:
105+
expected_contract = contract_version_for_schema(schema)
106+
except (TimeContractError, TypeError, ValueError):
107+
raise _error("invalid_schema_version") from None
108+
if contract != expected_contract:
109+
raise _error("contract_version_mismatch")
110+
111+
if entry["semantic_fingerprint_version"] != FINGERPRINT_VERSION:
112+
raise _error("invalid_fingerprint_version")
113+
semantic_digest = entry["semantic_digest"]
114+
if type(semantic_digest) is not str or re.fullmatch(r"[0-9a-f]{64}", semantic_digest) is None:
115+
raise _error("invalid_semantic_digest")
116+
if entry["artifact_integrity_version"] != ARTIFACT_INTEGRITY_VERSION:
117+
raise _error("invalid_artifact_integrity_version")
118+
artifact_digest = entry["artifact_integrity_digest"]
119+
if type(artifact_digest) is not str or re.fullmatch(r"[0-9a-f]{64}", artifact_digest) is None:
120+
raise _error("invalid_artifact_integrity_digest")
121+
122+
identity_class = entry["identity_class"]
123+
if type(identity_class) is not str or identity_class not in {V3_CANONICAL, V3_VARIANT}:
124+
raise _error("legacy_identity_rejected" if identity_class == "LEGACY_V2" else "invalid_identity_class")
125+
canonical = entry["canonical_identity"]
126+
primary = entry["display_primary"]
127+
order = entry["display_order"]
128+
if type(canonical) is not bool or type(primary) is not bool or type(order) is not int or order < 0:
129+
raise _error("identity_binding_invalid")
130+
if (identity_class == V3_CANONICAL) != canonical:
131+
raise _error("identity_metadata_mismatch")
132+
133+
names = [
134+
(_name_digest(entry["json"], _JSON, as_of=as_of, cadence=cadence), entry["json"]),
135+
(_name_digest(entry["html"], _HTML, as_of=as_of, cadence=cadence), entry["html"]),
136+
]
137+
if "md" in entry and type(entry["md"]) is not str:
138+
raise _error("identity_name_invalid")
139+
if "manifest" in entry and type(entry["manifest"]) is not str:
140+
raise _error("identity_name_invalid")
141+
markdown = entry["md"] if "md" in entry else None
142+
manifest = entry["manifest"] if "manifest" in entry else None
143+
if markdown is not None:
144+
names.append((_name_digest(markdown, _MD, as_of=as_of, cadence=cadence), markdown))
145+
if manifest is not None:
146+
names.append((_name_digest(manifest, _MANIFEST, as_of=as_of, cadence=cadence), manifest))
147+
expected_suffix = None if canonical else artifact_digest
148+
if any(name_digest != expected_suffix for name_digest, _name in names):
149+
raise _error("identity_digest_mismatch")
150+
return V3IdentityBinding(
151+
period_key, as_of, cadence, schema, contract, FINGERPRINT_VERSION, semantic_digest,
152+
ARTIFACT_INTEGRITY_VERSION, artifact_digest, entry["json"], entry["html"], markdown, manifest,
153+
identity_class, canonical, primary, order, PENDING_ARTIFACT_VALIDATION,
154+
)
155+
156+
157+
__all__ = ["VNextBindingError", "binding_payload", "validate_vnext_binding"]

0 commit comments

Comments
 (0)