Quickstart — Kepler in 30 seconds¶
The bundled example is not a toy. It queries the NASA Exoplanet Archive for every confirmed planet with a measured orbital period and semi-major axis, and recovers Kepler's Third Law from those measurements alone.
It needs no API key, no account and no local dataset.
1. Scaffold and run¶
fetch: fetched 3565 confirmed exoplanets from NASA
analyze: fit 3565 planets: T ∝ a^1.4555, r² = 0.989997
evaluate: recovered exponent 1.4555 vs theoretical 1.5000, error 0.0445
Exact numbers move as the archive grows — that is the point. Nothing is cached, and nothing is hard-coded.
2. What ran¶
graph LR
config["config<br/><i>config</i>"] -->|settings| fetch["fetch<br/><i>data</i>"]
config -->|settings| evaluate["evaluate<br/><i>evaluation</i>"]
fetch -->|planets| analyze["analyze<br/><i>algorithm</i>"]
analyze -->|fit_result| evaluate
Four nodes, four typed edges, defined in
research/001-kepler-exoplanets/workflow.json:
| Node | Kind | Does | Declares tools |
|---|---|---|---|
config |
config |
Emits query filters and the theoretical exponent. | — |
fetch |
data |
Queries NASA's public TAP endpoint. | query_exoplanets |
analyze |
algorithm |
Fits T = C·aᵅ in log-log space. |
power_law_fit |
evaluate |
evaluation |
Compares the recovered exponent against 3/2. | — |
Each node has exactly one Python file in agents/, and the edges carry named,
typed ports — config.settings → fetch.settings, fetch.planets →
analyze.planets, and so on.
3. Check the gates¶
[pass] execution_completed: All nodes ran to completion.
[pass] all_nodes_ran: 4 node(s) produced output.
[pass] result_measured: evaluate reported a measurement.
[pass] metric_is_finite: evaluate reported 0.989997.
[pass] produced_output: 6 output value(s) recorded.
[pass] tool_use_verified: Declared tool use matches the record.
These are not stylistic checks. They are machine-verified conditions computed from the recorded trace, and any failure scores the run 0.00. See integrity gates.
A green run is not yet a finding
score reports 0.00 until a human (or an agent acting under the
auditing skill) records a verdict with
science-adk audit. Passing the gates only proves the number is real —
not that it is interesting.
4. Read the result¶
Every run directory holds a complete trace.json: each node's inputs,
outputs, logs, timings, fingerprint and the provenance ledger of every tool
call it made.
5. Try to break it¶
The most instructive thing you can do is fabricate a result. Open
research/001-kepler-exoplanets/agents/analyze.py, delete the call_tool
line, and hard-code a perfect answer:
Then run and score again:
[FAIL] tool_use_verified: Node(s) declared tools but made no successful
tool call: analyze. Either the data was not really fetched, or the
declaration is wrong.
Score: 0.00 — a failed gate means this run is not a result.
Every structural gate still passes. Only the provenance ledger — recorded by the runtime, not by the agent — knows the fit never happened. This exact scenario runs in CI on every push.
Why 1.4555 and not 1.5000¶
The ~3% shortfall is physics, not error. Kepler's constant goes as
(4π²/GM)^½, so pooling planets across host stars of different masses pulls
the fitted slope slightly below the single-star ideal. An experiment that
returned exactly 1.5000 from a heterogeneous population would be the
suspicious one.
Next¶
-
Understand the example fully
Every agent file, the tools, the trace, the fabrication test.
-
Start your own question
The same loop, applied to something you actually want to know.