You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
plan(v3-migration): §2.3 — defer the Canon:Custom flip (operator)
Operator decision (2026-06-26): the classid half-order flip
[custom(hi):canon(lo)] -> [canon(hi):custom(lo)] is deferred. It happens only
after (1) Phase 1 is complete AND (2) OSINT + FMA + CPIC are all re-encoded to
V3 shape (current custom:canon convention + high-u16 0x1000_xxxx gen marker;
OSINT done #613, FMA-V3 + CPIC-V3/Genetics-slot still to mint), then flipped
once, atomically, across the whole V3 set.
Forcing reason recorded in new §2.3: the flip reinterprets routing on every
classid (post-flip classid_concept_domain reads the HIGH u16), so a half-flipped
corpus mis-routes by construction — the I-LEGACY-API-FEATURE-GATED failure mode
(one accessor, two silent semantics by state). So the flip must be a single
coordinated reorder over a known-complete V3 set, never trickled in per consumer.
facet_mint's facet_classid stays a parameter (bakes in no half-order), so brick 2
is unaffected by the deferral. §7 Canon:Custom paragraph + brick-1 row updated to
"DEFERRED (§2.3)"; no shipped classid touched. Board: LATEST_STATE operator-
decision note prepended.
Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01TANd15SECEb1Gm4cpaRVD9
The classid half-order flip `[custom(hi):canon(lo)] → [canon(hi):custom(lo)]` is **deferred — not done now.** Operator (2026-06-26): the flip happens **only after** (1) Phase 1 is complete AND (2) **OSINT + FMA + CPIC are all re-encoded to V3 shape** (current `custom:canon` convention + high-u16 `0x1000_xxxx` gen marker — OSINT done #613; FMA-V3 + CPIC-V3/Genetics-slot still to mint), then **flipped once, atomically, over the whole V3 set.** Forcing reason (recorded `soa-value-tenant-migration-v2.md` §2.3): the flip reinterprets *routing* on every classid (post-flip `classid_concept_domain` reads the HIGH u16), so a half-flipped corpus mis-routes — the `I-LEGACY-API-FEATURE-GATED` failure mode — and must be a single coordinated reorder over a known-complete set. `facet_mint`'s `facet_classid` stays a parameter (bakes in no half-order), so brick 2 is unaffected by the deferral. Recorded in plan §2.3 (new) + §7 + brick-1 row; no shipped classid touched.
16
+
13
17
## 2026-06-26 — IN PR (`claude/serene-mayer-1a09he`) — V3 migration plan absorbs the AST-as-address arc (§7 — the self-programming payoff)
14
18
15
19
`soa-value-tenant-migration-v2.md` gains **§7** — the *application* the two-phase V3 sequencing exists to serve, folding the now-merged #616 ("what" + V3 alignment) / #617 ("why") arc into the plan as first-class roadmap. **§0–§6 stay operator-locked and untouched.** §7 records: (1) the one-line why — once identity is V3 (Phase 1) + tenants are the V3-shaped contained facet (Phase 2), a transcode source's structural AST **IS its address**, so minting an ERP collapses to *importing* OGIT class primitives + wiring classaction pointers (the low-code platform **self-programs** at assembler cost, vs re-transcoding ~500K LOC/consumer); (2) the arc IS this plan's `(part_of:is_a)` structure axis made literal — the shipped `FacetCascade` read as `hi_chain`=part_of/`lo_chain`=is_a is the "shadow the V3 key casts" §1 already names, downstream of BOTH phases; (3) the brick chain mapped onto the phases — **brick 1** (slot alloc) LOCKED by shipped `FacetCascade`, **brick 2** (`facet_mint` rank-minter) BUILT (`360fc720`), **brick 3** (MedCare `ruff_csharp_spo`→mint→SoA→`typeHierarchy` probe, MedCareV2 oracle) PENDING = the single CONJECTURE→FINDING gate; (4) **Canon:Custom is ONE lock shared with §2.2** — the minter's `facet_classid` is a parameter, so resolving canon(hi):custom(lo) settles both the Phase-1 classid entries and the minter's row-0 ordering in one decision. Arc stays `[S]`→`[H]` CONJECTURE; gate F-code via brick 3. Header pointer added; cross-refs extended (ast doc, `facet_mint`, ruff #29).
(so the prefix sorts by **shared concept**, not render skin) is **deferred — do not
159
+
flip now.** It happens **only after** BOTH:
160
+
161
+
1.**Phase 1 is complete**, AND
162
+
2.**OSINT + FMA + CPIC are all re-encoded to V3 shape** (under the *current*
163
+
`custom:canon` convention + the high-u16 `0x1000_xxxx` gen marker — OSINT done
164
+
#613; FMA-V3 + CPIC-V3 still to mint, incl. CPIC's Genetics-domain slot).
165
+
166
+
When that set is complete, **flip once, atomically, across the whole V3 set.**
167
+
168
+
**Why deferred, not done piecemeal (the forcing reason).** The flip is a *routing*
169
+
reinterpretation of **every** classid: post-flip, `classid_concept_domain` reads
170
+
the **HIGH** u16 instead of the low. So a half-flipped corpus — some entries
171
+
`custom:canon`, some `canon:custom` — mis-routes by construction: the *same*
172
+
`as u16 >> 8` read yields a different domain depending on which convention an
173
+
entry was minted under. That is precisely the `I-LEGACY-API-FEATURE-GATED` failure
174
+
mode (one accessor, two silent semantics by state), so the flip MUST be a single
175
+
coordinated reorder over a **known-complete** V3 set — never trickled in per
176
+
consumer. Mint all of OSINT/FMA/CPIC in the *current* convention first; flip them
177
+
together last.
178
+
179
+
**Until the flip:** the shipped `0x1000_0700`-shaped (`custom:canon`) entries
180
+
stand; `facet_mint`'s `facet_classid` (row 0) stays a **parameter** that bakes in
181
+
no half-order, so brick 2 is unaffected by the deferral (it never commits to a
182
+
convention). When the flip lands it is a layout reinterpretation → it carries the
183
+
same version-gate + field-isolation discipline (`I-LEGACY-API-FEATURE-GATED`) that
184
+
gates every reclaim in this plan.
185
+
155
186
## 3. Phase 2 — V3-shaped value tenants (value-side; = the harvest)
156
187
157
188
This is what `-v1-harvest.md` inventoried. With the address already V3:
@@ -248,17 +279,21 @@ treatment in the knowledge doc):
248
279
249
280
| brick | what | phase tie | status |
250
281
|---|---|---|---|
251
-
|**1 — slot allocation**| the 6-pair / 12-slot layout | = Phase-2's contained facet (`FacetCascade`) |**LOCKED (shipped #613/#614)** — only the classid half-order (Canon:Custom, below + §2.2) stays open, orthogonal to per-tier packing |
282
+
|**1 — slot allocation**| the 6-pair / 12-slot layout | = Phase-2's contained facet (`FacetCascade`) |**LOCKED (shipped #613/#614)** — the classid half-order (Canon:Custom) is **DEFERRED** (§2.3 — flipped after Phase-1 + OSINT/FMA/CPIC are all V3), orthogonal to per-tier packing |
252
283
|**2 — rank-minter**| SPO graph → `(po_rank, ia_rank)` per tier → `FacetCascade`| the **producer** of Phase-2 facets |**BUILT 2026-06-26** — `contract::facet_mint` (commit `360fc720`); `mint_facets(&[NodeDecl], facet_classid)`; exact + roundtrip-lossless; producer-agnostic `NodeDecl` (ruff C++ + Roslyn C# `ruff_csharp_spo`, ruff #29); 8 tests green |
253
284
|**3 — MedCare probe**|`ruff_csharp_spo` harvest → mint → SoA → `typeHierarchy`/`definition`, MedCareV2 oracle | the F-gate over both phases on a real corpus |**PENDING** — the single step that promotes the arc + the 2 MB/10× headline CONJECTURE → FINDING |
254
285
255
-
**Canon:Custom is ONE lock shared with §2.2, not two.** The minter's `facet_classid`
256
-
(row 0) is a *parameter* — it bakes in no half-order — so brick 2 is unblocked. But
257
-
the classid `(part_of:is_a)` ordering is the SAME open decision §2.2 carries on the
258
-
V3 classid entries: the shipped `0x1000_0700` is custom(hi):canon(lo); the
259
-
operator's Canon:Custom correction flips it to canon(hi):custom(lo) so the prefix
260
-
sorts by shared concept, not render skin. Resolving Canon:Custom settles BOTH the
261
-
Phase-1 classid entries (§2.2) AND the minter's row-0 ordering in one decision.
286
+
**Canon:Custom is ONE lock shared with §2.2/§2.3 — and it is now DEFERRED.** The
287
+
minter's `facet_classid` (row 0) is a *parameter* — it bakes in no half-order — so
288
+
brick 2 is unblocked regardless. The classid `(part_of:is_a)` ordering is the SAME
289
+
decision §2.2 carries on the V3 classid entries: the shipped `0x1000_0700` is
290
+
custom(hi):canon(lo); the operator's Canon:Custom correction flips it to
291
+
canon(hi):custom(lo) so the prefix sorts by shared concept, not render skin. **Per
292
+
§2.3 (operator, 2026-06-26) the flip is deferred** until Phase 1 is complete AND
293
+
OSINT + FMA + CPIC are all re-encoded to V3, then done **atomically** across the
294
+
whole set (a piecemeal flip mis-routes — `I-LEGACY-API-FEATURE-GATED`). Resolving it
295
+
then settles BOTH the Phase-1 classid entries (§2.2) AND the minter's row-0 ordering
296
+
in one move.
262
297
263
298
**Grade / gate.** The arc is **`[S]`→`[H]`** (CONJECTURE; the carrier + mechanism
264
299
are shipped, the economic claim is unmeasured); gate **F-code** via the brick-3
0 commit comments