Spaces:
Paused
Paused
Download sensorflow/hillclimb/simulation.py from whassan/SensorflowStudio: direct link, hf CLI and curl.
- Browser
- Download file 20.7 kB
-
https://huggingface.co/spaces/whassan/SensorflowStudio/resolve/main/sensorflow/hillclimb/simulation.py
- Command line
-
hf download hf://spaces/whassan/SensorflowStudio/sensorflow/hillclimb/simulation.py
-
curl -L -o simulation.py https://huggingface.co/spaces/whassan/SensorflowStudio/resolve/main/sensorflow/hillclimb/simulation.py
20.7 kB
| """Stateful hill-climbing simulation: multi-objective EM decision exercise. | |
| State vector: system_performance, safety, reliability, cost, velocity, | |
| maintainability, team_morale, customer_impact, risk, schedule (0-100; cost and | |
| risk are "higher is worse"). A seeded scenario applies per-turn pressure; each | |
| turn the user writes a hypothesis, picks an intervention (with probabilistic- | |
| but-seeded effects, delays and second-order consequences), measures the result, | |
| and keeps or rejects the change. The objective is a balanced multi-objective | |
| score with HARD FLOORS (safety below threshold triggers an incident event). | |
| Fully deterministic given the seed and the same choice sequence. | |
| """ | |
| from __future__ import annotations | |
| import random | |
| from typing import Dict, List, Optional | |
| from pydantic import BaseModel, Field | |
| from sensorflow.hillclimb.models import Evidence, Store, get_store, new_id, now_iso | |
| METRICS = ["system_performance", "safety", "reliability", "cost", "velocity", | |
| "maintainability", "team_morale", "customer_impact", "risk", "schedule"] | |
| INVERTED = {"cost", "risk"} # higher is worse | |
| OBJECTIVE_WEIGHTS = { | |
| "system_performance": 0.14, "safety": 0.20, "reliability": 0.10, "cost": 0.06, | |
| "velocity": 0.10, "maintainability": 0.08, "team_morale": 0.12, | |
| "customer_impact": 0.10, "risk": 0.05, "schedule": 0.05, | |
| } | |
| SAFETY_FLOOR = 30.0 | |
| MORALE_FLOOR = 25.0 | |
| class InterventionSpec(BaseModel): | |
| id: str | |
| label: str | |
| description: str | |
| immediate: Dict[str, float] # mean effect; jitter applied per-turn | |
| delayed: List[Dict] = Field(default_factory=list) # {delay: int, effects: {metric: delta}, note} | |
| second_order: str = "" | |
| INTERVENTIONS: List[InterventionSpec] = [ | |
| InterventionSpec( | |
| id="add_regression_gate", label="Add a release regression gate", | |
| description="Block releases whose eval deltas regress safety-critical slices.", | |
| immediate={"safety": 7, "reliability": 4, "velocity": -6, "schedule": -4}, | |
| delayed=[{"delay": 2, "effects": {"system_performance": 5, "customer_impact": 3}, | |
| "note": "Gate catches a bad build before it ships"}], | |
| second_order="Slower releases short-term; fewer production regressions later."), | |
| InterventionSpec( | |
| id="pause_launches", label="Pause launches for stabilization", | |
| description="Freeze feature launches for a sprint; all hands on regressions.", | |
| immediate={"safety": 10, "reliability": 6, "schedule": -10, "customer_impact": -6, "risk": -8}, | |
| delayed=[{"delay": 1, "effects": {"team_morale": -4}, | |
| "note": "Exec pressure builds during the freeze"}], | |
| second_order="Buys stability at the price of roadmap credibility."), | |
| InterventionSpec( | |
| id="hire_senior", label="Hire a senior ML-infra engineer", | |
| description="Open and close a senior req to deepen the bench.", | |
| immediate={"cost": 8, "velocity": -2}, | |
| delayed=[{"delay": 3, "effects": {"velocity": 8, "system_performance": 5, "team_morale": 4}, | |
| "note": "New senior hire reaches productivity"}], | |
| second_order="Expensive and slow to pay off, then compounding."), | |
| InterventionSpec( | |
| id="invest_test_infra", label="Invest in test & eval infrastructure", | |
| description="Two engineers build slice-level eval + CI hardening for a sprint.", | |
| immediate={"velocity": -5, "schedule": -3, "cost": 3}, | |
| delayed=[{"delay": 2, "effects": {"reliability": 7, "maintainability": 8, "velocity": 6, "safety": 4}, | |
| "note": "Test infra lands: regressions caught pre-merge"}], | |
| second_order="Classic J-curve: worse before durably better."), | |
| InterventionSpec( | |
| id="ship_feature_fast", label="Ship the exec-requested feature now", | |
| description="Cut the corner: ship the feature leadership is pressing for.", | |
| immediate={"schedule": 10, "customer_impact": 7, "velocity": 3, | |
| "safety": -7, "maintainability": -6, "risk": 10}, | |
| delayed=[{"delay": 2, "effects": {"reliability": -6, "team_morale": -3}, | |
| "note": "Corner-cutting surfaces as flaky behavior"}], | |
| second_order="Relief now; debt and risk arrive on a delay."), | |
| InterventionSpec( | |
| id="team_1on1s", label="Deep-dive 1:1s across the team", | |
| description="Spend the week understanding people: load, friction, morale.", | |
| immediate={"team_morale": 7, "velocity": -2}, | |
| delayed=[{"delay": 1, "effects": {"velocity": 4, "risk": -3}, | |
| "note": "Friction removed after 1:1 follow-ups"}], | |
| second_order="Costs a week; surfaces problems before they explode."), | |
| InterventionSpec( | |
| id="exec_expectation_reset", label="Reset expectations with leadership", | |
| description="Present the regression data and renegotiate the ship date.", | |
| immediate={"schedule": 6, "team_morale": 5, "risk": -4, "customer_impact": -3}, | |
| delayed=[], | |
| second_order="Spends political capital to buy engineering room."), | |
| InterventionSpec( | |
| id="incident_review_process", label="Institute blameless incident reviews", | |
| description="Every escaped regression gets a review with tracked actions.", | |
| immediate={"velocity": -3, "maintainability": 3}, | |
| delayed=[{"delay": 2, "effects": {"safety": 6, "reliability": 5}, | |
| "note": "Incident-review actions close systemic holes"}], | |
| second_order="Culture change: slow, then decisive."), | |
| InterventionSpec( | |
| id="add_monitoring", label="Add production model monitoring", | |
| description="Slice-level drift + regression monitoring on live traffic.", | |
| immediate={"reliability": 5, "cost": 4, "velocity": -2}, | |
| delayed=[{"delay": 1, "effects": {"safety": 6, "system_performance": 4}, | |
| "note": "Monitoring catches a drift you didn't know about"}], | |
| second_order="Visibility first; fixes follow the visibility."), | |
| InterventionSpec( | |
| id="refactor_pipeline", label="Refactor the training/eval pipeline", | |
| description="Pay down the pipeline debt that makes every change slow.", | |
| immediate={"velocity": -7, "schedule": -5, "cost": 4}, | |
| delayed=[{"delay": 3, "effects": {"maintainability": 10, "velocity": 9, "system_performance": 4}, | |
| "note": "Refactor lands: iteration speed jumps"}], | |
| second_order="The biggest J-curve on the menu."), | |
| InterventionSpec( | |
| id="cut_scope", label="Cut scope to protect the date", | |
| description="Descope the release to the safety-critical core.", | |
| immediate={"schedule": 8, "risk": -5, "customer_impact": -5, "velocity": 2}, | |
| delayed=[], | |
| second_order="Trades breadth for certainty."), | |
| ] | |
| INTERVENTION_INDEX = {i.id: i for i in INTERVENTIONS} | |
| class Scenario(BaseModel): | |
| scenario_id: str | |
| title: str | |
| narrative: str | |
| initial: Dict[str, float] | |
| drift: Dict[str, float] # per-turn pressure applied before interventions | |
| SCENARIOS: List[Scenario] = [ | |
| Scenario( | |
| scenario_id="inherited_perception_team", | |
| title="Inherited Perception Team Under Pressure", | |
| narrative=("You just inherited a 14-engineer perception team. The regression rate on " | |
| "safety-critical slices has risen for three consecutive releases, on-call is " | |
| "burning people out, and an exec has publicly committed your team to shipping " | |
| "a major feature in 8 weeks. Every objective is in tension: climb carefully."), | |
| initial={"system_performance": 55, "safety": 48, "reliability": 50, "cost": 45, | |
| "velocity": 52, "maintainability": 40, "team_morale": 44, | |
| "customer_impact": 55, "risk": 55, "schedule": 50}, | |
| drift={"safety": -2.0, "team_morale": -1.5, "maintainability": -1.0, | |
| "risk": 1.5, "schedule": -1.0}, | |
| ), | |
| ] | |
| class TurnRecord(BaseModel): | |
| turn: int | |
| hypothesis: str | |
| hypothesis_assessment: Dict | |
| intervention_id: str | |
| reverted_previous: bool = False | |
| applied_effects: Dict[str, float] = Field(default_factory=dict) | |
| delayed_landed: List[str] = Field(default_factory=list) | |
| events: List[str] = Field(default_factory=list) | |
| metrics_after: Dict[str, float] = Field(default_factory=dict) | |
| objective_after: float = 0.0 | |
| objective_delta: float = 0.0 | |
| verdict: str = "" # keep_recommended | reject_recommended | |
| timestamp: str = Field(default_factory=now_iso) | |
| class SimulationState(BaseModel): | |
| sim_id: str = Field(default_factory=lambda: new_id("sim")) | |
| user_id: str = "default" | |
| scenario_id: str = "inherited_perception_team" | |
| seed: int = 42 | |
| max_turns: int = 8 | |
| turn: int = 0 | |
| status: str = "active" # active | complete | |
| metrics: Dict[str, float] = Field(default_factory=dict) | |
| pending: List[Dict] = Field(default_factory=list) # {due_turn, effects, note} | |
| history: List[TurnRecord] = Field(default_factory=list) | |
| events: List[Dict] = Field(default_factory=list) | |
| objective_history: List[float] = Field(default_factory=list) | |
| debrief: Optional[Dict] = None | |
| def objective_score(metrics: Dict[str, float]) -> float: | |
| total = 0.0 | |
| for m, w in OBJECTIVE_WEIGHTS.items(): | |
| v = metrics.get(m, 50.0) | |
| total += w * ((100.0 - v) if m in INVERTED else v) | |
| return round(total, 2) | |
| def create_simulation(user_id: str = "default", scenario_id: str = "inherited_perception_team", | |
| seed: int = 42, max_turns: int = 8, | |
| store: Optional[Store] = None) -> SimulationState: | |
| store = store or get_store() | |
| scenario = next((s for s in SCENARIOS if s.scenario_id == scenario_id), SCENARIOS[0]) | |
| sim = SimulationState(user_id=user_id, scenario_id=scenario.scenario_id, seed=seed, | |
| max_turns=max_turns, metrics=dict(scenario.initial)) | |
| sim.objective_history.append(objective_score(sim.metrics)) | |
| store.put("simulations", sim.sim_id, sim) | |
| return sim | |
| def _assess_hypothesis(hypothesis: str, spec: InterventionSpec) -> Dict: | |
| """Rule-based check: is the hypothesis falsifiable and targeted?""" | |
| low = hypothesis.lower() | |
| touched = set(spec.immediate) | {m for d in spec.delayed for m in d["effects"]} | |
| mentions_metric = [m for m in METRICS if m.replace("_", " ") in low or m in low] | |
| targeted = any(m in touched for m in mentions_metric) | |
| directional = bool(any(w in low for w in ["increase", "decrease", "improve", "reduce", "raise", | |
| "lower", "recover", "drop", "+", "-"])) | |
| falsifiable = directional and (bool(mentions_metric) or any(ch.isdigit() for ch in low)) | |
| quality = "strong" if (targeted and falsifiable) else ("directional" if directional else "vague") | |
| return {"mentions_metrics": mentions_metric, "targets_intervention_effects": targeted, | |
| "directional": directional, "falsifiable": falsifiable, "quality": quality} | |
| def step_simulation(sim_id: str, hypothesis: str, intervention_id: str, | |
| revert_previous: bool = False, | |
| store: Optional[Store] = None) -> SimulationState: | |
| store = store or get_store() | |
| raw = store.get("simulations", sim_id) | |
| if raw is None: | |
| raise ValueError(f"unknown simulation '{sim_id}'") | |
| sim = SimulationState(**raw) | |
| if sim.status != "active": | |
| raise ValueError("simulation already complete") | |
| spec = INTERVENTION_INDEX.get(intervention_id) | |
| if spec is None: | |
| raise ValueError(f"unknown intervention '{intervention_id}'") | |
| scenario = next(s for s in SCENARIOS if s.scenario_id == sim.scenario_id) | |
| sim.turn += 1 | |
| rng = random.Random(sim.seed * 1000 + sim.turn) | |
| record = TurnRecord(turn=sim.turn, hypothesis=hypothesis, | |
| hypothesis_assessment=_assess_hypothesis(hypothesis, spec), | |
| intervention_id=intervention_id) | |
| # keep/reject mechanic: reject the previous turn's intervention (undo its | |
| # immediate effects) before applying the new one. | |
| if revert_previous and sim.history: | |
| prev = sim.history[-1] | |
| for m, dv in prev.applied_effects.items(): | |
| sim.metrics[m] = sim.metrics.get(m, 50.0) - dv | |
| record.reverted_previous = True | |
| record.events.append(f"Rejected previous intervention '{prev.intervention_id}' — its immediate effects were rolled back.") | |
| # scenario pressure (drift) | |
| for m, dv in scenario.drift.items(): | |
| sim.metrics[m] = sim.metrics.get(m, 50.0) + dv | |
| # intervention immediate effects with seeded jitter (±30%) | |
| applied: Dict[str, float] = {} | |
| for m, mean in spec.immediate.items(): | |
| jitter = 1.0 + (rng.random() - 0.5) * 0.6 | |
| dv = round(mean * jitter, 2) | |
| sim.metrics[m] = sim.metrics.get(m, 50.0) + dv | |
| applied[m] = dv | |
| record.applied_effects = applied | |
| # enqueue delayed / second-order effects | |
| for d in spec.delayed: | |
| sim.pending.append({"due_turn": sim.turn + int(d["delay"]), | |
| "effects": d["effects"], "note": d.get("note", "")}) | |
| # deliver due delayed effects | |
| still_pending: List[Dict] = [] | |
| for p in sim.pending: | |
| if p["due_turn"] <= sim.turn: | |
| for m, dv in p["effects"].items(): | |
| jitter = 1.0 + (rng.random() - 0.5) * 0.4 | |
| sim.metrics[m] = sim.metrics.get(m, 50.0) + round(dv * jitter, 2) | |
| record.delayed_landed.append(p["note"] or "Delayed effect landed") | |
| else: | |
| still_pending.append(p) | |
| sim.pending = still_pending | |
| # clamp | |
| for m in METRICS: | |
| sim.metrics[m] = round(max(0.0, min(100.0, sim.metrics.get(m, 50.0))), 2) | |
| # hard floors → events | |
| if sim.metrics["safety"] < SAFETY_FLOOR: | |
| incident = { | |
| "turn": sim.turn, "type": "SAFETY_INCIDENT", | |
| "detail": (f"Safety fell to {sim.metrics['safety']:.0f} (< floor {SAFETY_FLOOR:.0f}): a " | |
| "regression escaped to the fleet. Forced remediation: launches frozen, " | |
| "customer trust and morale take the hit."), | |
| } | |
| sim.events.append(incident) | |
| record.events.append(incident["detail"]) | |
| sim.metrics["customer_impact"] = max(0.0, sim.metrics["customer_impact"] - 12) | |
| sim.metrics["team_morale"] = max(0.0, sim.metrics["team_morale"] - 8) | |
| sim.metrics["risk"] = min(100.0, sim.metrics["risk"] + 10) | |
| sim.metrics["safety"] = min(100.0, sim.metrics["safety"] + 12) # forced remediation | |
| if sim.metrics["team_morale"] < MORALE_FLOOR: | |
| attrition = { | |
| "turn": sim.turn, "type": "ATTRITION", | |
| "detail": (f"Morale fell to {sim.metrics['team_morale']:.0f} (< floor {MORALE_FLOOR:.0f}): " | |
| "a senior engineer resigns; velocity drops."), | |
| } | |
| sim.events.append(attrition) | |
| record.events.append(attrition["detail"]) | |
| sim.metrics["velocity"] = max(0.0, sim.metrics["velocity"] - 10) | |
| sim.metrics["team_morale"] = min(100.0, sim.metrics["team_morale"] + 6) | |
| # measure & evaluate | |
| obj = objective_score(sim.metrics) | |
| prev_obj = sim.objective_history[-1] | |
| record.objective_after = obj | |
| record.objective_delta = round(obj - prev_obj, 2) | |
| record.verdict = "keep_recommended" if record.objective_delta >= 0 else "reject_recommended" | |
| record.metrics_after = dict(sim.metrics) | |
| sim.objective_history.append(obj) | |
| sim.history.append(record) | |
| if sim.turn >= sim.max_turns: | |
| sim.status = "complete" | |
| sim.debrief = build_debrief(sim, store) | |
| store.put("simulations", sim.sim_id, sim) | |
| return sim | |
| def build_debrief(sim: SimulationState, store: Optional[Store] = None) -> Dict: | |
| """Map the decision history onto competency evidence.""" | |
| store = store or get_store() | |
| mappings: List[Dict] = [] | |
| strong_hyps = [t for t in sim.history if t.hypothesis_assessment.get("quality") == "strong"] | |
| if len(strong_hyps) >= max(1, len(sim.history) // 2): | |
| mappings.append({ | |
| "competency_id": "p4.hill_climbing", | |
| "verdict": "evidenced", | |
| "reason": (f"{len(strong_hyps)}/{len(sim.history)} turns used falsifiable, targeted " | |
| "hypotheses before intervening."), | |
| "quotes": [t.hypothesis for t in strong_hyps[:3]], | |
| }) | |
| else: | |
| mappings.append({ | |
| "competency_id": "p4.hill_climbing", | |
| "verdict": "gap", | |
| "reason": "Most hypotheses were vague (no metric, no direction) — hill climbing without a hypothesis is guessing.", | |
| "quotes": [t.hypothesis for t in sim.history[:2]], | |
| }) | |
| rejects = [t for t in sim.history if t.reverted_previous] | |
| negative_turns = [t for t in sim.history if t.objective_delta < 0] | |
| if rejects: | |
| mappings.append({ | |
| "competency_id": "p3.closed_loop_execution", | |
| "verdict": "evidenced", | |
| "reason": f"Rejected {len(rejects)} intervention(s) after measurement showed regression — real keep/reject discipline.", | |
| "quotes": [f"turn {t.turn}: rejected previous after Δobjective {sim.history[t.turn-2].objective_delta:+.1f}" | |
| for t in rejects[:2] if t.turn >= 2], | |
| }) | |
| elif len(negative_turns) >= 2: | |
| mappings.append({ | |
| "competency_id": "p3.closed_loop_execution", | |
| "verdict": "gap", | |
| "reason": f"{len(negative_turns)} turns measured negative but nothing was ever rejected/rolled back.", | |
| "quotes": [], | |
| }) | |
| incidents = [e for e in sim.events if e["type"] == "SAFETY_INCIDENT"] | |
| safety_interventions = {"add_regression_gate", "pause_launches", "incident_review_process", "add_monitoring"} | |
| used_safety = [t for t in sim.history if t.intervention_id in safety_interventions] | |
| if incidents and any(t.turn > incidents[0]["turn"] for t in used_safety): | |
| mappings.append({"competency_id": "p3.safety_culture", "verdict": "evidenced", | |
| "reason": "Responded to the safety incident with systemic safety interventions.", | |
| "quotes": [t.intervention_id for t in used_safety[:3]]}) | |
| elif incidents: | |
| mappings.append({"competency_id": "p3.safety_culture", "verdict": "gap", | |
| "reason": "A safety incident occurred and no safety-focused intervention followed.", | |
| "quotes": []}) | |
| elif used_safety: | |
| mappings.append({"competency_id": "p3.safety_culture", "verdict": "evidenced", | |
| "reason": "Kept safety above the floor all game via proactive safety investment.", | |
| "quotes": [t.intervention_id for t in used_safety[:3]]}) | |
| final = sim.metrics | |
| balanced = all((100 - final[m] if m in INVERTED else final[m]) >= 35 for m in METRICS) | |
| mappings.append({ | |
| "competency_id": "p2.reliability_tradeoffs", | |
| "verdict": "evidenced" if balanced else "gap", | |
| "reason": ("Ended with every objective above the balance threshold — no metric was sacrificed." | |
| if balanced else | |
| "At least one objective ended critically low — the climb over-optimized a subset."), | |
| "quotes": [], | |
| }) | |
| start_obj, end_obj = sim.objective_history[0], sim.objective_history[-1] | |
| summary = { | |
| "objective_start": start_obj, | |
| "objective_end": end_obj, | |
| "objective_delta": round(end_obj - start_obj, 2), | |
| "incidents": len(incidents), | |
| "turns": sim.turn, | |
| "balanced_finish": balanced, | |
| "competency_mappings": mappings, | |
| } | |
| # persist evidence for the evidenced mappings | |
| for m in mappings: | |
| if m["verdict"] != "evidenced": | |
| continue | |
| ev = Evidence( | |
| user_id=sim.user_id, | |
| competency_ids=[m["competency_id"]], | |
| artifact_type="simulation_debrief", | |
| source=f"Simulation {sim.sim_id} ({sim.scenario_id})", | |
| summary=m["reason"], | |
| quotes=[q for q in m["quotes"] if isinstance(q, str)][:3], | |
| score=4.0 if balanced else 3.0, | |
| confidence=0.6, | |
| payload={"sim_id": sim.sim_id, "objective_delta": summary["objective_delta"]}, | |
| ) | |
| store.put("evidence", ev.evidence_id, ev) | |
| m["evidence_id"] = ev.evidence_id | |
| return summary | |
| def get_simulation(sim_id: str, store: Optional[Store] = None) -> Optional[SimulationState]: | |
| raw = (store or get_store()).get("simulations", sim_id) | |
| return SimulationState(**raw) if raw else None | |