File size: 5,693 Bytes
2e96a4f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2a88270
2d8f274
2e96a4f
 
5ec1901
 
 
 
2e96a4f
 
 
5ec1901
 
 
 
 
2e96a4f
3e3d78c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2e96a4f
 
 
3e3d78c
 
 
 
 
 
 
 
 
 
 
 
 
 
2a88270
 
 
3e3d78c
2a88270
 
 
 
 
 
 
2e96a4f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3f782b5
2e96a4f
 
 
3f782b5
 
 
2a88270
 
 
2d8f274
2e96a4f
 
 
 
 
3e3d78c
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
# PROGRESS β€” Hackathon Task State

Live task tracking. Updated at the end of every work block. Source of truth = this file.

**Started:** 2026-04-23
**Target submission:** 2026-04-25 EOD (2-day sprint)

---

## Pre-flight

- [x] Repo created (`GeoForce-CCHackathon`) + pushed
- [x] `initial/` seeded from ForceX-AI v2-real-transform planning docs
- [x] Hackathon research complete (rules, prizes, Discord, prior winners)
- [x] HACKATHON-PLAN.md v2 (dual-tool pivot) committed
- [x] CLAUDE.md, AGENTS.md, PROGRESS.md scaffolded
- [x] `.claude/` subagents defined (8)
- [x] `.claude/` skills defined (6)
- [x] `.claude/` commands defined (4)
- [x] `.claude/settings.json` β€” model pinned to `claude-opus-4-7`
- [x] Fresh `.venv` + `pyproject.toml`
- [x] `ANTHROPIC_API_KEY` in `.env` (gitignored) + round-trip tested
- [x] `.gitignore` protects secrets
- [~] Registration + Discord acceptance email β€” deferred per user (2026-04-23)

## Day 1 β€” Build both engines

### Morning (3h) β€” COMPLETE 2026-04-23
- [x] Copy `geoforce_cnn_v1.1.pt` to `surrogate/weights/` (248,595 bytes, from ForceX-AI/products/model_registry)
- [x] Port `ReservoirCNN` class + encoding to `surrogate/` (model.py, encoding.py, predict.py)
- [x] `tests/test_surrogate_smoke.py` green β€” 5/5 pass, 1.7s total
- [x] Claude scaffolding discoverable (subagents + skills load; `surrogate-operator.md` corrected to match real v1.1 encoding)

### Afternoon (4h) β€” Agent team builds GeoForce-Solver β€” COMPLETE 2026-04-23
- [x] `solver/properties.py` β€” IAPWS-IF97 wrappers
- [x] `solver/grid.py` β€” 2D vertical section structured grid
- [x] `solver/darcy.py` β€” pressure solver
- [x] `solver/energy.py` β€” heat solver
- [x] `solver/wells.py` β€” source terms
- [x] `solver/coupled.py` β€” implicit backward-Euler
- [x] `solver/benchmarks/theis.py` β€” analytical pressure
- [x] `solver/benchmarks/conduction_1d.py` β€” analytical temperature
- [x] `tests/test_solver_theis.py` passes (<5% error)
- [x] `tests/test_solver_conduction.py` passes (<5% error)

### Evening (2h) β€” CHECKPOINT + wiring β€” COMPLETE 2026-04-23
- [x] **GO/NO-GO checkpoint:** both analytical tests green β†’ GO
- [x] `tools/predict_solver.py` + `tools/predict_surrogate.py`
- [x] `agent/runtime.py` β€” claude-agent-sdk boot
- [x] CLI answers Q1 end-to-end
- [x] Commit + push β€” **milestone: both engines live**

## Day 2 β€” Polish + demo + ship

### Morning (3h) β€” Backend + Streamlit fallback β€” COMPLETE 2026-04-23
- [x] `agent/api.py` β€” FastAPI + SSE (+ `/predict`, + SPA static mount)
- [x] `app/app.py` β€” Streamlit fallback
- [x] `demo/scenarios.yaml` β€” Q1, Q2, Q3
- [x] `tools/monte_carlo.py` + `tools/sensitivity.py`

### Afternoon (4h) β€” React dashboard β€” COMPLETE 2026-04-23
- [x] `dashboard/` scaffold (Vite+TS+zustand)
- [x] `tokens.css` from claude-design-system skill
- [x] Components: Header, QueryInput, ScenarioPicker, AgentTrace, AnswerPanel, FieldPlot, FieldPanel
- [x] `api/client.ts` SSE consumer + `predictFields` helper
- [x] Canvas-based magma heatmap (no plotly β€” bundle stays <160 kB)
- [x] Dry-run 3 scenarios through `/predict` + SSE smoke of `/query`
- [x] `Dockerfile` multi-stage (node build β†’ python runtime, CPU-only torch)

### Evening (3h) β€” Ship
- [ ] Deploy to HF Spaces (Dockerfile space)
- [x] Root `README.md` + ASCII architecture diagram
- [ ] 90s demo video (recorded against React dashboard)
- [ ] `demo/brady_validation.ipynb` (compressed)
- [ ] Tag `v0.1-hackathon` + submit via Cerebral Valley portal

### Stretch (only if all above shipped)
- [ ] `.mcp.json` exposing GeoForce-Solver via MCP
- [ ] Two-phase stub (saturation variable plumbing, no flash)

---

## Fallback Plan (if Day 1 Evening checkpoint fails)

If either analytical-benchmark test fails:
- [ ] Drop `solver/` from critical path
- [ ] Reframe as "Claude Opus 4.7 agent orchestration over deployed surrogate"
- [ ] Keep all Day 2 deliverables intact
- [ ] Still viable for "Best use of Claude Managed Agents" $5K

---

## Decisions Log

| Date | Decision | Source |
|---|---|---|
| 2026-04-23 | 1st-place target, Managed Agents as safety net | user |
| 2026-04-23 | Solver + Surrogate dual-tool | user |
| 2026-04-23 | Solver name = GeoForce-Solver (provisional) | claude |
| 2026-04-23 | Single-phase water (not two-phase) | user approval of pitch |
| 2026-04-23 | NREL Brady for validation cameo | claude proposal |
| 2026-04-23 | Day 1 evening GO/NO-GO trigger | claude proposal |
| 2026-04-23 | Solver renamed TinyTOUGH β†’ GeoForce-Solver | user |
| 2026-04-23 | Two-phase: single-phase for Day 1; optional stub Day 2 evening only if solver green + submitted | user |
| 2026-04-23 | Demo framing: Ulubelu-inspired synthetic (liquid-dominated, on-brand) | user approved claude recommendation |
| 2026-04-23 | Demo UI: React dashboard (primary) + Streamlit (fallback), Claude design language, HF Spaces Dockerfile deploy | user |
| 2026-04-23 | Added 8th subagent: ui-engineer | claude (per user request) |
| 2026-04-23 | Added 5th skill: claude-design-system | claude (per user request) |
| 2026-04-23 | Added 6th skill: tough-reference (deep TOUGH family knowledge from LBNL manuals) | claude (per user request) |

---

## Blocker Log

- **2026-04-23** β€” Solver pressure output for `q1_drill_temperature` and
  `q3_well_placement` reports values ~10Β² MPa after the unit conversion,
  which is physically implausible (reservoir should stay around 15 MPa
  with the small doublet stress). The `/predict` endpoint itself works;
  the issue is either a unit in the solver output dict or boundary
  treatment in `solver.coupled`. Flagged for the reviewer agent before
  the demo video is recorded.