added plan
This commit is contained in:
@@ -0,0 +1,284 @@
|
|||||||
|
ChatGPT3:26 PM
|
||||||
|
Rust Phase 0/1 Implementor Specification
|
||||||
|
Objective
|
||||||
|
Build the testing framework first, then the runtime.
|
||||||
|
|
||||||
|
No spell content is accepted until CI proves the system resists collapse into:
|
||||||
|
|
||||||
|
single score
|
||||||
|
single resource
|
||||||
|
single effect axis
|
||||||
|
single executor behavior
|
||||||
|
single rune behavior
|
||||||
|
single hidden damage formula
|
||||||
|
decorative world state
|
||||||
|
Hard CI Gates
|
||||||
|
Minimum per full CI run:
|
||||||
|
|
||||||
|
Generated worlds: 50,000
|
||||||
|
Generated rune programs: 250,000
|
||||||
|
Executions: 1,000,000
|
||||||
|
Perturbations per execution: 10
|
||||||
|
Semantic mutants per run: 500
|
||||||
|
Replay corpus cases: 10,000 minimum
|
||||||
|
Reference/runtime comparison: 100% of executions
|
||||||
|
Fast CI may run 10%, but merge-blocking CI must run full gates.
|
||||||
|
|
||||||
|
Repository Layout
|
||||||
|
crates/
|
||||||
|
world_model/
|
||||||
|
rune_ir/
|
||||||
|
trace_model/
|
||||||
|
generators/
|
||||||
|
reference_runtime/
|
||||||
|
runtime_under_test/
|
||||||
|
collapse_analysis/
|
||||||
|
semantic_mutation/
|
||||||
|
replay_corpus/
|
||||||
|
ci_reports/
|
||||||
|
Implementation order is mandatory:
|
||||||
|
|
||||||
|
1. world_model
|
||||||
|
2. trace_model
|
||||||
|
3. generators
|
||||||
|
4. collapse_analysis
|
||||||
|
5. semantic_mutation
|
||||||
|
6. replay_corpus
|
||||||
|
7. reference_runtime
|
||||||
|
8. runtime_under_test
|
||||||
|
The optimized runtime may not begin before steps 1–7 pass CI.
|
||||||
|
|
||||||
|
World Model
|
||||||
|
pub struct WorldSnapshot {
|
||||||
|
pub id: WorldId,
|
||||||
|
pub turn: u64,
|
||||||
|
pub domains: Vec<DomainState>,
|
||||||
|
pub causal_state: CausalState,
|
||||||
|
pub observation_state: ObservationState,
|
||||||
|
pub execution_state: ExecutionState,
|
||||||
|
pub time_state: TimeState,
|
||||||
|
pub seed: u64,
|
||||||
|
}
|
||||||
|
Minimum domain count:
|
||||||
|
|
||||||
|
8 independent world domains
|
||||||
|
Each domain must expose:
|
||||||
|
|
||||||
|
pub trait WorldDomain {
|
||||||
|
fn domain_id(&self) -> DomainId;
|
||||||
|
fn read_surface(&self) -> ReadSurface;
|
||||||
|
fn write_surface(&self) -> WriteSurface;
|
||||||
|
fn perturbation_axes(&self) -> Vec<PerturbationAxis>;
|
||||||
|
fn fingerprint(&self) -> DomainFingerprint;
|
||||||
|
}
|
||||||
|
Domain acceptance:
|
||||||
|
|
||||||
|
Each domain appears in ≥ 35% of traces.
|
||||||
|
Each domain influences execution in ≥ 20% of corpus.
|
||||||
|
Each domain is mutated by execution in ≥ 20% of corpus.
|
||||||
|
Removing any domain reduces corpus behavioral diversity by ≥ 10%.
|
||||||
|
Merging any two domains loses ≥ 8% predictive accuracy.
|
||||||
|
Rune Program Model
|
||||||
|
pub struct RuneProgram {
|
||||||
|
pub id: ProgramId,
|
||||||
|
pub tokens: Vec<RuneToken>,
|
||||||
|
pub seed: u64,
|
||||||
|
}
|
||||||
|
No rune stream may be rejected as the primary safety path.
|
||||||
|
|
||||||
|
Execution always returns:
|
||||||
|
|
||||||
|
pub struct ResolutionResult {
|
||||||
|
pub delta: WorldDelta,
|
||||||
|
pub trace: ExecutionTrace,
|
||||||
|
pub faults: FaultLog,
|
||||||
|
pub replay: ReplayRecord,
|
||||||
|
}
|
||||||
|
Engine crashes, panics, undefined Rust behavior, or unlogged failures fail CI.
|
||||||
|
|
||||||
|
Trace Model
|
||||||
|
pub struct ExecutionTrace {
|
||||||
|
pub read_graph: DomainAccessGraph,
|
||||||
|
pub write_graph: DomainAccessGraph,
|
||||||
|
pub causal_graph: CausalGraph,
|
||||||
|
pub information_flow: InformationFlowGraph,
|
||||||
|
pub executor_divergence: DivergenceGraph,
|
||||||
|
pub temporal_graph: TemporalGraph,
|
||||||
|
pub perturbation_response: PerturbationResponse,
|
||||||
|
pub behavior_fingerprint: BehaviorFingerprint,
|
||||||
|
}
|
||||||
|
Trace gates:
|
||||||
|
|
||||||
|
Median causal edges per execution: ≥ 24
|
||||||
|
95% of executions causal rank: ≥ 6
|
||||||
|
Median touched domains per execution: ≥ 4
|
||||||
|
95% of executions touched domains: ≥ 3
|
||||||
|
Behavior fingerprint collision rate: < 5%
|
||||||
|
Largest behavior cluster: < 2% of corpus
|
||||||
|
Generator Requirements
|
||||||
|
Generators must reject flat cases.
|
||||||
|
|
||||||
|
pub struct GeneratedCase {
|
||||||
|
pub world: WorldSnapshot,
|
||||||
|
pub program: RuneProgram,
|
||||||
|
pub contexts: Vec<ExecutionContext>,
|
||||||
|
pub contract: SemanticContract,
|
||||||
|
pub perturbations: Vec<PerturbedCase>,
|
||||||
|
}
|
||||||
|
Generated case gates:
|
||||||
|
|
||||||
|
estimated_causal_rank ≥ 6
|
||||||
|
domain_entropy ≥ configured minimum
|
||||||
|
perturbation_axes ≥ 10
|
||||||
|
executor_count ≥ 3
|
||||||
|
future_dependence present within 3 turns
|
||||||
|
nonzero hidden/observed state divergence
|
||||||
|
nonuniform domain fingerprints
|
||||||
|
Semantic Contract
|
||||||
|
pub struct SemanticContract {
|
||||||
|
pub min_causal_rank: usize,
|
||||||
|
pub min_domain_participation: usize,
|
||||||
|
pub min_future_sensitivity: f64,
|
||||||
|
pub min_context_divergence: f64,
|
||||||
|
pub max_compressibility: f64,
|
||||||
|
}
|
||||||
|
Default thresholds:
|
||||||
|
|
||||||
|
min_causal_rank: 6
|
||||||
|
min_domain_participation: 4
|
||||||
|
min_future_sensitivity: 0.50
|
||||||
|
min_context_divergence: 0.40
|
||||||
|
max_compressibility: 0.70
|
||||||
|
A case passes only if measured trace behavior satisfies its contract.
|
||||||
|
|
||||||
|
Metamorphic Testing
|
||||||
|
For every base execution, produce 10 perturbations.
|
||||||
|
|
||||||
|
Perturbations are generated from domain surfaces, not a fixed list.
|
||||||
|
|
||||||
|
pub trait PerturbationAxis {
|
||||||
|
fn apply(&self, world: &WorldSnapshot) -> WorldSnapshot;
|
||||||
|
fn expected_trace_difference(&self) -> TraceDifferenceExpectation;
|
||||||
|
}
|
||||||
|
Metamorphic gates:
|
||||||
|
|
||||||
|
≥ 90% perturbations alter trace
|
||||||
|
≥ 75% perturbations alter world delta
|
||||||
|
≥ 50% perturbations alter state within 3 future turns
|
||||||
|
≤ 5% perturbations may be observationally neutral without explanation
|
||||||
|
Collapse Analysis
|
||||||
|
The framework must attempt compression attacks.
|
||||||
|
|
||||||
|
pub trait CollapseAttack {
|
||||||
|
fn compress(&self, corpus: &BehaviorCorpus) -> CompressedModel;
|
||||||
|
fn report(&self) -> CollapseReport;
|
||||||
|
}
|
||||||
|
Required attack families:
|
||||||
|
|
||||||
|
domain removal
|
||||||
|
domain merging
|
||||||
|
constant folding
|
||||||
|
causal edge deletion
|
||||||
|
state aliasing
|
||||||
|
latent factor modeling
|
||||||
|
behavior clustering
|
||||||
|
surrogate prediction
|
||||||
|
temporal flattening
|
||||||
|
observation flattening
|
||||||
|
executor identity erasure
|
||||||
|
Collapse gates:
|
||||||
|
|
||||||
|
Best 1-factor model predicts < 40%
|
||||||
|
Best 2-factor model predicts < 55%
|
||||||
|
Best 4-factor model predicts < 70%
|
||||||
|
No single domain explains > 30% outcome variance
|
||||||
|
No pair of domains explains > 55%
|
||||||
|
Compressed model loses ≥ 35% trace information
|
||||||
|
If a smaller model predicts above these thresholds, fail CI.
|
||||||
|
|
||||||
|
Semantic Mutation
|
||||||
|
Mutants are generated structurally from the model.
|
||||||
|
|
||||||
|
pub trait SemanticMutator {
|
||||||
|
fn mutate(&self, runtime: RuntimeArtifact) -> RuntimeArtifact;
|
||||||
|
fn expected_detection_reason(&self) -> DetectionClass;
|
||||||
|
}
|
||||||
|
Mutation gates:
|
||||||
|
|
||||||
|
500 semantic mutants minimum
|
||||||
|
0 surviving mutants
|
||||||
|
Every mutant must fail at least one named acceptance gate
|
||||||
|
Survivor report blocks merge
|
||||||
|
A mutant surviving means the tests are invalid, not that the mutant is acceptable.
|
||||||
|
|
||||||
|
Reference Runtime
|
||||||
|
The reference runtime is the executable spec.
|
||||||
|
|
||||||
|
pub trait Runtime {
|
||||||
|
fn resolve(&self, input: ResolutionInput) -> ResolutionResult;
|
||||||
|
}
|
||||||
|
Every execution runs:
|
||||||
|
|
||||||
|
let expected = reference.resolve(input.clone());
|
||||||
|
let actual = runtime_under_test.resolve(input);
|
||||||
|
|
||||||
|
assert_eq!(canonical(expected), canonical(actual));
|
||||||
|
Canonical comparison includes:
|
||||||
|
|
||||||
|
world delta
|
||||||
|
trace
|
||||||
|
faults
|
||||||
|
replay hash
|
||||||
|
future-state hash over 3 turns
|
||||||
|
Replay Corpus
|
||||||
|
Every failure becomes permanent.
|
||||||
|
|
||||||
|
pub struct ReplayCase {
|
||||||
|
pub world_seed: u64,
|
||||||
|
pub program_seed: u64,
|
||||||
|
pub contract_seed: u64,
|
||||||
|
pub perturbation_seed: u64,
|
||||||
|
pub expected_trace_hash: Hash,
|
||||||
|
pub expected_delta_hash: Hash,
|
||||||
|
pub expected_future_hash: Hash,
|
||||||
|
}
|
||||||
|
Replay gates:
|
||||||
|
|
||||||
|
10,000 cases minimum
|
||||||
|
100% deterministic replay
|
||||||
|
0 hash drift unless migration explicitly updates corpus
|
||||||
|
Reports Required Per CI Run
|
||||||
|
Generate machine-readable JSON and human-readable markdown:
|
||||||
|
|
||||||
|
domain_participation_report
|
||||||
|
causal_rank_report
|
||||||
|
compression_resistance_report
|
||||||
|
metamorphic_response_report
|
||||||
|
mutation_survivor_report
|
||||||
|
runtime_equivalence_report
|
||||||
|
replay_report
|
||||||
|
coverage_report
|
||||||
|
Merge blocked unless all reports pass.
|
||||||
|
|
||||||
|
Absolute Rejection Conditions
|
||||||
|
Reject if:
|
||||||
|
|
||||||
|
A smaller model predicts behavior above thresholds.
|
||||||
|
Any domain is decorative.
|
||||||
|
Any domain is read-only or write-only across corpus.
|
||||||
|
Most programs share the same behavior fingerprint.
|
||||||
|
Most outcomes reduce to one numeric axis.
|
||||||
|
Reference/runtime differ.
|
||||||
|
Replay is nondeterministic.
|
||||||
|
Any semantic mutant survives.
|
||||||
|
Trace evidence cannot explain causality.
|
||||||
|
Phase 0/1 Completion
|
||||||
|
Phase 0/1 is complete only when:
|
||||||
|
|
||||||
|
the adversarial framework exists first
|
||||||
|
the reference runtime passes it
|
||||||
|
the optimized runtime matches the reference runtime
|
||||||
|
collapse attacks fail to simplify the universe
|
||||||
|
mutation tests kill every generated simplification
|
||||||
|
generated programs produce diverse, causal, replayable behavior
|
||||||
|
No spell list. No templates. No cosmetic runes. The deliverable is a Rust engine whose tests make a fake universe fail.
|
||||||
Reference in New Issue
Block a user