diff --git a/.github/workflows/igraph-live-proof.yml b/.github/workflows/igraph-live-proof.yml index b742d6c..9fc61a2 100644 --- a/.github/workflows/igraph-live-proof.yml +++ b/.github/workflows/igraph-live-proof.yml @@ -147,18 +147,26 @@ jobs: for attempt in $(seq 1 36); do status="$(curl -sS --max-time 120 -o /tmp/discover.json -w '%{http_code}' "$IGRAPH_URL/v1/discover?query=%2A" || true)" echo "Discovery attempt $attempt returned HTTP $status" - if [ "$status" = "200" ] && jq -e '.live == true and ((.candidates | length) > 0)' /tmp/discover.json >/dev/null 2>&1; then + if [ "$status" = "200" ] && jq -e ' + .live == true and + ((.candidates | length) > 0) and + (any(.candidates[]; (.downstream_count // 0) > 0)) + ' /tmp/discover.json >/dev/null 2>&1; then break fi if [ "$attempt" = "36" ]; then - echo "Live discovery did not return any dataset candidates" + echo "Live discovery did not return a dataset with loaded lineage" cat /tmp/discover.json || true exit 1 fi sleep 5 done cat /tmp/discover.json - jq -e '.live == true and (.candidates | length) > 0' /tmp/discover.json + jq -e ' + .live == true and + (.candidates | length) > 0 and + (any(.candidates[]; (.downstream_count // 0) > 0)) + ' /tmp/discover.json URN="$(jq -r '.candidates | max_by(.downstream_count) | .urn' /tmp/discover.json)" test -n "$URN" test "$URN" != "null" diff --git a/docs/DEVPOST_SUBMISSION.md b/docs/DEVPOST_SUBMISSION.md index e058081..9942be4 100644 --- a/docs/DEVPOST_SUBMISSION.md +++ b/docs/DEVPOST_SUBMISSION.md @@ -14,34 +14,38 @@ the Pact, target, artifact hash, expiry, and one-shot invocation limit before an executor is reached. A Change Receipt records the decision, executor evidence, validation states, and optional DataHub custom-property/Document write-back. -## What to show in the video - -1. Run the deterministic authority-drift endpoint: the same rename request is - allowed to stage in an isolated context and blocked in a PII/dashboard/ML - context. -2. Analyze `orders.customer_id` and show the signed Pact, SQL migration hash, and - `require_approval` decision. -3. Attempt a tampered Pact or `target=production`; show `executor_invoked=false`. -4. Approve an in-scope staging artifact once; show the simulator receipt and the - second-attempt replay denial. -5. In live mode, show that a GMS timeout returns `context_unavailable` rather than - silently using fixture metadata. +## What the recorded proof demonstrates + +1. Live DataHub context is available and discovery returns 10 candidates. +2. The `addresses` context binds 28 downstream assets into a signed Impact Pact + with a high consequence score of 55/100. +3. A tampered Pact is denied before executor invocation. +4. An expired Pact is rejected as `pact_stale` before executor invocation. +5. Unavailable live context fails closed as `context_unavailable` / HTTP 503; + iGraph does not substitute fixture metadata. + +The 10-second video is a silent, deterministic vector reconstruction of the +control-room visual language, populated from the recorded proof artifact. It is +labeled as a reconstruction and does not claim a production deployment, real +database mutation, or DataHub write-back. ## Built with - DataHub OSS / DataHub SDK - DataHub Agent Context Kit (`datahub-agent-context`) - FastAPI, Pydantic, and Python -- DataHub showcase-ecommerce datapack for the live demo +- DataHub showcase-ecommerce datapack for the live proof ## Links to include -- Public source repository: `https://github.com/Jaydearcadian/iGraph` -- Demo endpoint: `GET /v1/experiments/authority-drift` +- Public source repository: `https://github.com/etvjay/iGraph` +- Live proof run: `https://github.com/etvjay/iGraph/actions/runs/31479477960` +- Live proof artifact: `https://github.com/etvjay/iGraph/actions/runs/31479477960/artifacts/9096775884` - Reproducible request: [`examples/change-request.json`](../examples/change-request.json) +- Video asset: `igraph-demo-candidate.mp4` from the accompanying demo package ## Honest scope The built-in executor is a reversible staging simulator. Production deployment, -real database mutation, public repository visibility, and the final hosted video -remain submission/deployment steps outside this code-only patch. +real database mutation, and DataHub write-back remain outside this proof. The +live proof keeps `IGRAPH_ENABLE_WRITEBACK=false`. \ No newline at end of file diff --git a/docs/LIVE_PROOF.md b/docs/LIVE_PROOF.md new file mode 100644 index 0000000..d62835a --- /dev/null +++ b/docs/LIVE_PROOF.md @@ -0,0 +1,32 @@ +# iGraph live proof + +This page records the public GitHub Actions proof for the merged iGraph code. + +## Merged code + +- Repository: https://github.com/etvjay/iGraph +- Main commit: `0136cef2fa556d79f7565999f77cfc92c0a66d42` +- Pull request: https://github.com/etvjay/iGraph/pull/2 +- Post-merge CI: https://github.com/etvjay/iGraph/actions/runs/31618368233 + +## Recorded live results + +The live-proof workflow ran against DataHub OSS and produced these results: + +- `/health`: `context_mode=live`, `datahub_configured=true`, write-back disabled. +- `/v1/discover`: 10 live candidates; the top candidate is `addresses` with + 22 downstream assets and risk score 55. +- `/v1/analyze`: live `addresses` context with 28 downstream assets, complete + retrieval, high risk 55/100, and signed Pact `igp_ce855182f9dc`. +- Tampered Pact: `deny`, `executor_invoked=false`. +- Expired Pact: `pact_stale`, `executor_invoked=false`. +- Missing live context: `context_unavailable` / HTTP 503, with no fixture fallback. + +Download the complete workflow artifact from the successful proof run: +https://github.com/etvjay/iGraph/actions/runs/31479477960/artifacts/9096775884 + +## Claim boundary + +This proves live reads, discovery, Pact signing, enforcement denial, expiry +rejection, and fail-closed behavior. It does not prove production deployment, +real database mutation, DataHub write-back, or a deployed public video. \ No newline at end of file