NEXUS CEREBRI / CPIR Explorer
What information does the planner need?
To find 30 minutes for an appointment, Cerebri needs its duration, a search window and the times already occupied. CPIR puts those details, rules and planning permissions into separate fields. A calling application supplies this data; the current planner does not read a sentence.
The new appointment has no assigned time: its time.value is RESOLVED with knowledge MISSING. The duration is KNOWN: 1800 seconds. A missing duration would prevent the search from starting.
This example uses CPIR 0.2. The format also supports temporal source data; older 0.1 requests remain accepted without it. CPIR is still an internal, evolving format. Learned interpretation remains future work.
Where do the details go?
The example describes a new 30-minute appointment and an existing booking from 09:00 to 10:00 UTC. The new appointment has no time yet. Each field tells the planner one part of that problem.
The 30-minute duration and 09:00–12:00 window give 11 starts on this 15-minute grid. The budget is an upper limit; it does not create extra candidates. The empty constraints list does not disable the built-in overlap check.
A CPIR input envelope keeps scope, knowledge, constraints, preferences, policy, capability and declared budget distinct. The same interval endpoints resolve into exact field paths. A planner boundary separates the request from Rust-generated candidate results.
Following explanation depth
Evidence envelope
- Request
request_id - synthetic-request
- Operation
operation - CREATE
- Targets
target_ids - ["new-event"]
- 01 / BOUNDED STATE Scope boundary
scope.time_range- scope.time_range.
start - 09:00 UTC
- scope.time_range.
end - 12:00 UTC
Known busy intervalcontext.objects[1].time.value.knowledge.data- context.objects[1].time.value.knowledge.data.
start - 09:00 UTC
- context.objects[1].time.value.knowledge.data.
end - 10:00 UTC
- Duration
duration.value.knowledge.data - 1800 s
- Grid
granularity - 900 s
- Mutation bound
scope.max_mutations - 3
- scope.time_range.
02 / CONTEXT Knowledge has two coordinates.
KNOWLEDGE ↑ PROCESSING → UNRESOLVEDRESOLVED- MISSING new-eventRESOLVED / MISSING
- KNOWN busyRESOLVED / KNOWN
MISSING is resolved absence of temporal knowledge. The empty UNRESOLVED column is an axis label, not another fixture object.
- MISSING
- 03 / HARD CONSTRAINTS
Constraint cut
constraints- [] · empty array
The region exists; this fixture declares no additional constraints.
- 04 / SOFT PREFERENCES
Preference field
preferences.preferences- [] · empty array
The preference set is present, with no entries in this request.
- 05 / DECLARATIVE RULE PLANE
Policy
policy.snapshotpolicy.policy_set_id- local-test-policy
policy.snapshot.mutation.allowed_actions- CREATE_EVENT · MOVE_EVENT
policy.snapshot.confirmation.all_mutations- true
policy.snapshot.allow_uncertain_duration- false
- 06 / PROPOSAL OPERATION SET
Planning capability
planning_capabilityCREATE_EVENTplanning_capability.mutations[0].object_id- new-event
planning_capability.read/planning_capability.plan- true / true
Policy rules and proposal capability are separate. Neither is execution authority.
- 07 / FINITE SEARCH BOUND
Declared budget
Limits, not observed resource usage.
budget.max_candidates- 256
budget.max_repairs- 0
budget.max_moved_objects- 1
budget.max_depth- 0
CPIR input · raw data
cerebri-core::plan → cerebri-plannerCompile · validate input · bounded searchPlanner result
outcome- Solution
assessment- ProvenOptimal
search_space.evaluated- 11
search_space.exhausted- true
candidates[0]Display coordinate, not a Rust object ID.
candidates[0].proposed.placements[0].range- candidates[0].proposed.placements[0].range.
start - 10:00 UTC
- candidates[0].proposed.placements[0].range.
end - 10:30 UTC
candidates[0].proposed.placements[0].object_id- new-event
Ordering key
Existing comparator dimensions → exact record. Rust order is retained.
- 01preferred distance0
candidates[0].ordering_key.preference_distance_seconds - 02mutation count1
candidates[0].ordering_key.mutation_count - 03shift seconds0
candidates[0].ordering_key.shifted_seconds - 04start2026-10-01T10:00:00Z
candidates[0].ordering_key.start - 05object idnew-event
candidates[0].ordering_key.object_id
Ranking observations
Absent evidence remains null; the ordering projection remains a separate field.
candidates[0].ranking_features.schema_version- {"major":0,"minor":1}
candidates[0].ranking_features.preferred_start_distance_seconds- null
candidates[0].ranking_features.preferred_start_source- null
candidates[0].ranking_features.mutation_count- 1
candidates[0].ranking_features.shift_seconds- 0
conflicts.rejections· entry count- 4 rejected positions
ProposedPlan → separate lifecycle validation → ValidatedPlan. Execution still requires later authorization and preflight.
Result structure → runtime ownershipcerebri-planner → Rust-generated result · raw data
cerebri-planner →Text alternative
A CPIR input envelope keeps scope, knowledge, constraints, preferences, policy, capability and declared budget distinct. The same interval endpoints resolve into exact field paths. A planner boundary separates the request from Rust-generated candidate results.
