On this page
Preview, stage, and govern structural change๏
Prerequisites: research, codegen, and
structural admission. Begin with the existing version's residency,
source, and impact. research_preview can combine a candidate analysis with the
selected frame's codegen verdict before any candidate is bound.
The foresight example checks that preview leaves research heads unchanged and the original pricing object still returns its original result. A malformed candidate returns parse information that the caller can inspect.
Staging is not promotion๏
bind_inactive places a candidate into the existing SpellIndex while the selected
member remains unchanged. Expert 17 asserts the member set, unchanged selection,
and unchanged resolved result.
The runtime's promoting verb is notch_spell, which accepts a Spell object. The
saved public staging lesson deliberately stops before hand-driving that operation:
its demonstrated lookup by the parked ID returns the currently active member.
Do not substitute a private-map access or claim that this lesson performs a full swap.
The README's notch sketch assumes those version objects are already held.
Keep history and code reconciliation distinct๏
An anchored research lane starts empty. A clean join checks its relation to the receiver's current tip. A forced join records explicit supersede; it does not merge source code. Compose and evaluate the candidate first, then record the chosen outcome through the applicable public operation.
Archive hides a lane from the active view while retaining its history. It is not runtime object disposal. Keep deliberate version retirement and application cleanup separate from lane organization.
The workflow in code๏
These are the core steps from the saved example. Use its complete linked script for all class definitions and setup.
1def main() -> None:
2 # 1. RECORD AND CUSTODY FIRST. A world built before these are live is
3 # a world neither of them ever saw.
4 crystallizer = md.Crystallizer()
5 crystallizer.activate(
6 md.CrystallizerConfigurationBuilder().with_defaults().activate(),
7 )
8 research = md.MutationResearch()
9 research_configuration = research.create_configuration()
10 research_configuration.with_defaults().activate()
11 research.activate(research_configuration)
12 assert crystallizer.activated and research.activated
13 print("custody recording:", crystallizer.activated,
14 " research live:", research.activated)
15
16 # 2. NOW build the world. The bind auto-records because research was
17 # already up - had we activated afterwards, nothing would have
18 # been recorded and no foresight would have been possible.
19 # A RECORDED WORLD MUST BE BORN CONFIGURED. With custody active, a
20 # dynamic conjure REFUSES if any bind ran before the configuration
21 # was finalized - the profile record and default bootstrap would
22 # otherwise durably persist binds made against unsettled config.
23 spellbook_configuration = (
24 md.SpellbookConfiguration(FRAME).with_defaults().finalize()
25 )
26 book = md.Spellbook(aetheric_frame=FRAME,
27 configuration=spellbook_configuration)
28 # AND THE FRAME POSTURE GOES BEFORE THE BIND TOO, for a DIFFERENT
29 # reason: a plain bind only auto-records `if self._is_dynamic_posture()`,
30 # which reads the FRAME configuration and is answerable before conjure.
31 # Bind into a not-yet-dynamic frame and the spell is never declared -
32 # no residency, no foresight, and no error either, because research
33 # bookkeeping never gates a bind.
34 book.configure_aether_frame(
35 system_state="dynamic",
36 disposal=None,
37 disposal_method_names=None,
38 rift_enabled=True,
39 ai_native=True,
40 )
41 spell_id = book.bind(
42 spell=PriceRule, existence="unique", permissions="create",
43 binding_name="foresight-rule",
44 )
45 conduit = book.conjure(name="foresight-root")
46 live = conduit.meld(spell=PriceRule, binding_name="foresight-rule")
47 assert live.apply(4) == 40
48 print()
49 print("world up; PriceRule.apply(4) ->", live.apply(4))
50 print("spell_id:", spell_id[:12], "...")
51
52 # 3. A codegen room pointed at it.
53 nexus = md.Nexus()
54 system_configuration = nexus.create_configuration()
55 system_configuration.with_rift_creation_enabled(True)
56 system_configuration.with_allowed_target_frame_names([FRAME])
57 nexus.activate(system_configuration)
58 rift_configuration = nexus.create_rift_configuration()
59 rift_configuration.with_space_type("codegen")
60 rift = nexus.create_rift(configuration=rift_configuration,
61 rift_name="foresight")
62 rift.mark_active()
63 rift.create_frame_link(FRAME)
64 commands = rift.space.command_system
65
66 # 4. WHAT DOES THE EXISTING VERSION TOUCH, RIGHT NOW?
67 # `spell_id` is KEYWORD-ONLY here, and so is `module_name` - the verb
68 # answers about exactly ONE center per call, so it will not let you
69 # pass a bare identifier and leave which-kind-of-center to inference.
70 radius = commands.research_impact(spell_id=spell_id)
71 print()
72 print("research_impact(existing) -> keys:", sorted(radius)[:6], "...")
73 print(" the CURRENT blast radius, joined with research residency")
74
75 # 5. THE FORESIGHT CALL. Snapshot the record first so we can prove
76 # the preview did not touch it.
77 heads_before = commands.research_heads()
78
79 preview = commands.research_preview(
80 CANDIDATE,
81 against_spell_id=spell_id,
82 frame_name=FRAME,
83 )
84 for key in ("candidate_sha256", "module_name", "parse_error",
85 "defines", "import_roots", "diff", "impact",
86 "against_spell_id"):
87 assert key in preview, key
88 print()
89 print("research_preview ->", len(preview), "keys")
90 print(" parse_error :", preview["parse_error"])
91 print(" defines :", preview["defines"])
92 print(" import_roots:", preview["import_roots"] or "(none)")
93 print(" candidate :", str(preview["candidate_sha256"])[:12], "...")
94 print(" against :", str(preview["against_spell_id"])[:12], "...")
95 assert preview["parse_error"] is None
96 assert preview["against_spell_id"] == spell_id
97 print(" it read the candidate's AST - a class defined, no imports -")
98 print(" diffed it against the version it would replace, and priced")
99 print(" the replacement, all without running a line")
100
101 # 6. AND THE ROOM'S VERDICT CAME ALONG, because frame_name was given.
102 print()
103 print("frame_name folded the permission question in:")
104 print(" 'may I' and 'what would happen' answered in ONE call")
105
106 # 7. THE PROOF. Nothing executed, bound, or recorded.
107 heads_after = commands.research_heads()
108 assert heads_after == heads_before, (
109 "research_preview must not move the record - it is foresight, "
110 "not a dry-run that half-commits"
111 )
112 still = conduit.meld(spell=PriceRule, binding_name="foresight-rule")
113 assert still.apply(4) == 40
114 print("record heads: IDENTICAL before and after the preview")
115 print("live object : still the old rule ->", still.apply(4))
116 print(" 'nothing executes, binds, or records' - checked, not trusted")
117
118 # 8. A CANDIDATE THAT DOES NOT PARSE STILL ANSWERS.
119 broken = commands.research_preview(BROKEN, frame_name=FRAME)
120 assert broken["parse_error"] is not None
121 print()
122 print("a candidate that does not parse ->")
123 print(" parse_error:", str(broken["parse_error"])[:60])
124 print(" same payload shape, populated honestly. An agent's generator")
125 print(" emits garbage sometimes, and a foresight tool that raised on")
126 print(" garbage would fail exactly when it is most needed")
127
128 print()
129 print("ask what it WOULD do, then decide - and the asking is free")
130 print("activate record and custody BEFORE you build, or there is")
131 print("nothing to have foresight about")
Runnable examples๏
Asking what code would do before running it โ Expert 22
Notch swapping a live object โ Expert 17
Branching the record and joining back โ Expert 23
Codegen create modify iterate โ Expert 26