Grounding & Provenance¶
Simulations are only as credible as the numbers they are built from. SocioVerse makes provenance a first-class artifact: every load-bearing value in a study can be traced to a source, a proxy, or an openly declared assumption.
Looking for the events service or the persona pool?
External data services moved to their own page: External Capabilities.
The grounding sidecar¶
Every study carries grounding/grounding.json: a ledger of
- facts — with sources, gathered by real-world search when the study is
initialized (a search always runs at
/sv-init); - implementation references — the modeling literature or prior systems a design choice leans on;
- declared assumptions — everything load-bearing that could not be sourced.
Each entry has a basis: sourced, proxy, or assumed. The build stages
consult and extend the ledger; the rule of the workflow is:
Ground before you invent. A load-bearing environment or population value cites a fact id or an assumption id. What can't be sourced is declared — never silently invented.
/sv-report renders the ledger as the report's data basis & references
section, so a reader sees the evidence base next to the results. The sidecar
rides along automatically with forks and version snapshots.
Document shape¶
| key | contents |
|---|---|
facts |
id, claim, value, basis, via (how it was obtained: web_search, event_service, provider), source url + accessed date |
implementation_refs |
the paper or prior system a mechanism copies, and what was copied |
assumptions |
id, what is assumed, why it could not be sourced, how sensitive the result is to it |
method_notes |
free text about how this study was grounded — including the fork decision below |
The helper the workflow uses is skills.sv_grounding (merge(...),
method_notes=...); see the
workflow helpers reference for the API.
Provenance, not runtime validation
Grounding is documentation with teeth-at-review-time, not a runtime constraint: the engine does not check your constants against the ledger. The contract is social and reviewable — every number is citable, and reviewers can see which basis each one rests on.
Forking: an explicit re-grounding decision¶
A Path-A fork copies the source study's grounding.json along with everything
else. It does not silently inherit that grounding as still-valid. Before
touching the fork's artifacts, /sv-init asks one question — do the fork's
deltas need external data the inherited grounding doesn't already cover? —
and commits to one of two answers:
| decision | when | what happens |
|---|---|---|
| search | the delta introduces a new real-world claim (new region, period, shock magnitude, policy) | a fresh search runs; new facts/refs are added by id; inherited entries that still apply stay |
| inherit | a pure parameter variant — every delta stays inside the range the source already anchored | no new search; the inherited entries the deltas touch are re-checked and merged by id |
Either way the choice is recorded in the sidecar's method_notes, with its
reason:
from skills import sv_grounding
sv_grounding.merge(
"studies/chicago_sez",
method_notes="fork re-grounding: searched — 一次性 +20% 冲击幅度需真实调价案例支撑",
)
# or: method_notes="fork re-grounding: inherited — 纯参数变体,锚点沿用源研究"
The dashboard's references card surfaces this, so a reader can tell whether a
fork re-searched or leaned on its parent — and why. The judgment is never
skipped silently; for a deliberately stylized study the honest note is
method_notes="stylized", not invented facts.
One principle ties it together¶
The runtime loop never fetches. Everything external is materialized at build time, with provenance recorded in the grounding sidecar. Runs are therefore self-contained: no network surprises mid-simulation, and every input a run saw is on disk, versioned with the study.
See also¶
- External Capabilities — the services that produce grounded facts, and how to work without them
- Iterate & report — how the ledger becomes the report's last section
- Workflow helpers reference —
sv_grounding