diff --git a/.github/workflows/cd-staging.yml b/.github/workflows/cd-staging.yml index 55feb84f..c5bd4d4d 100644 --- a/.github/workflows/cd-staging.yml +++ b/.github/workflows/cd-staging.yml @@ -170,6 +170,7 @@ jobs: data_agent/test_chongqing_source_governance.py \ data_agent/test_chongqing_admission_readiness.py \ data_agent/test_chongqing_protected_admission.py \ + data_agent/test_chongqing_protected_admission_workflow.py \ data_agent/test_dolphinscheduler_adapter.py \ data_agent/test_dolphinscheduler_command_consumer.py \ data_agent/test_dolphinscheduler_command_worker.py \ diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 1e347c65..b07e8a3b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -179,6 +179,7 @@ jobs: data_agent/test_chongqing_source_governance.py \ data_agent/test_chongqing_admission_readiness.py \ data_agent/test_chongqing_protected_admission.py \ + data_agent/test_chongqing_protected_admission_workflow.py \ data_agent/test_dolphinscheduler_adapter.py \ data_agent/test_dolphinscheduler_command_consumer.py \ data_agent/test_dolphinscheduler_command_worker.py \ diff --git a/.github/workflows/verify-chongqing-admission.yml b/.github/workflows/verify-chongqing-admission.yml new file mode 100644 index 00000000..0ad80574 --- /dev/null +++ b/.github/workflows/verify-chongqing-admission.yml @@ -0,0 +1,128 @@ +# Evaluates a metadata-only external attestation bundle against the immutable +# M3-31 readiness record. This workflow is read-only and grants no ingestion +# or provider authority. +name: Verify - Chongqing Protected Admission + +on: + workflow_dispatch: + +permissions: + actions: read + attestations: write + contents: read + id-token: write + +concurrency: + group: chongqing-protected-admission + cancel-in-progress: false + +jobs: + verify-chongqing-admission: + name: Evaluate the external admission attestation bundle + if: github.ref == 'refs/heads/main' + runs-on: [self-hosted, linux, gda-admission] + environment: chongqing-admission + timeout-minutes: 20 + + env: + GDA_CHONGQING_READINESS_SHA256: 2f5ae24ab904af0eed18ee7c517ab5c4638cbdf0923c9345b0041af185d25591 + GDA_CHONGQING_READINESS_FILE_SHA256: c595065e152988529ff12e2301d59caebb31d2889658a676c9d1f8239e6f8372 + PYTHONPATH: ${{ github.workspace }}/protected-source + + steps: + - name: Check out the exact protected verifier revision + uses: actions/checkout@v4 + with: + ref: ${{ github.sha }} + path: protected-source + persist-credentials: false + + - name: Set up Python 3.13 + uses: actions/setup-python@v5 + with: + python-version: "3.13" + + - name: Install verifier dependencies + run: | + python -m pip install --upgrade pip + python -m pip install -r protected-source/requirements.txt + + - name: Require protected metadata-only attestation input + env: + GDA_CHONGQING_ADMISSION_PROTECTED: ${{ vars.GDA_CHONGQING_ADMISSION_PROTECTED }} + GDA_CHONGQING_ATTESTATION_BUNDLE_B64: ${{ secrets.GDA_CHONGQING_ATTESTATION_BUNDLE_B64 }} + run: | + set -euo pipefail + if [[ "$GDA_CHONGQING_ADMISSION_PROTECTED" != "true" ]]; then + echo "chongqing-admission environment is not explicitly enabled" >&2 + exit 1 + fi + if [[ -z "$GDA_CHONGQING_ATTESTATION_BUNDLE_B64" ]]; then + echo "protected admission attestation bundle is missing" >&2 + exit 1 + fi + input_root="$RUNNER_TEMP/chongqing-admission-input" + mkdir -p "$input_root" + umask 077 + printf '%s' "$GDA_CHONGQING_ATTESTATION_BUNDLE_B64" | \ + base64 --decode > "$input_root/attestation.json" + python -m json.tool "$input_root/attestation.json" >/dev/null + echo "GDA_CHONGQING_ATTESTATION_PATH=$input_root/attestation.json" >> "$GITHUB_ENV" + + - name: Evaluate the protected admission contract + run: | + set -euo pipefail + mkdir -p chongqing-protected-admission + python -m data_agent.chongqing_protected_admission evaluate \ + --readiness protected-source/docs/evidence/chongqing-admission-readiness-2026-08-17.json \ + --attestation "$GDA_CHONGQING_ATTESTATION_PATH" \ + --output chongqing-protected-admission/report.json + + - name: Verify the report and preserve the no-authority boundary + run: | + set -euo pipefail + python -m data_agent.chongqing_protected_admission verify \ + --input chongqing-protected-admission/report.json + python - <<'PY' + import json + import os + + report = json.load(open("chongqing-protected-admission/report.json")) + assert report["readiness_evidence_sha256"] == os.environ[ + "GDA_CHONGQING_READINESS_SHA256" + ] + assert report["readiness_evidence_file_sha256"] == os.environ[ + "GDA_CHONGQING_READINESS_FILE_SHA256" + ] + assert report["attestation_valid"] is True + assert report["admission_eligible"] is True + assert report["content_admission_authorized"] is False + assert report["source_content_admitted"] is False + assert report["landing_authority_created"] is False + assert report["resource_version_created"] is False + assert report["platform_run_created"] is False + assert report["scheduler_submission_authorized"] is False + assert report["provider_mutation_authorized"] is False + assert report["production_ready"] is False + PY + + - name: Stage the metadata-only attestation bundle + run: | + install -m 0600 \ + "$GDA_CHONGQING_ATTESTATION_PATH" \ + chongqing-protected-admission/attestation.json + + - name: Attest the protected admission evidence + uses: actions/attest-build-provenance@v3 + with: + subject-path: | + chongqing-protected-admission/attestation.json + chongqing-protected-admission/report.json + + - name: Upload the protected admission evidence + uses: actions/upload-artifact@v4 + with: + name: chongqing-protected-admission-${{ github.run_id }} + path: chongqing-protected-admission/ + if-no-files-found: error + retention-days: 90 diff --git a/data_agent/test_chongqing_protected_admission_workflow.py b/data_agent/test_chongqing_protected_admission_workflow.py new file mode 100644 index 00000000..8f1bbf0b --- /dev/null +++ b/data_agent/test_chongqing_protected_admission_workflow.py @@ -0,0 +1,111 @@ +from pathlib import Path + +import yaml + +ROOT = Path(__file__).resolve().parents[1] + + +def test_protected_admission_workflow_is_read_only_and_fail_closed(): + path = ROOT / ".github/workflows/verify-chongqing-admission.yml" + rendered = path.read_text(encoding="utf-8") + workflow = yaml.safe_load(rendered) + job = workflow["jobs"]["verify-chongqing-admission"] + steps = job["steps"] + named = {step.get("name"): index for index, step in enumerate(steps)} + + assert workflow["name"] == "Verify - Chongqing Protected Admission" + assert "workflow_dispatch" in rendered + assert workflow["permissions"] == { + "actions": "read", + "attestations": "write", + "contents": "read", + "id-token": "write", + } + assert job["if"] == "github.ref == 'refs/heads/main'" + assert job["runs-on"] == ["self-hosted", "linux", "gda-admission"] + assert job["environment"] == "chongqing-admission" + assert job["timeout-minutes"] == 20 + assert workflow["concurrency"] == { + "group": "chongqing-protected-admission", + "cancel-in-progress": False, + } + + assert ( + named["Check out the exact protected verifier revision"] + < named["Require protected metadata-only attestation input"] + < named["Evaluate the protected admission contract"] + < named["Verify the report and preserve the no-authority boundary"] + < named["Attest the protected admission evidence"] + < named["Upload the protected admission evidence"] + ) + checkout = steps[named["Check out the exact protected verifier revision"]] + assert checkout["with"] == { + "ref": "${{ github.sha }}", + "path": "protected-source", + "persist-credentials": False, + } + assert job["env"]["PYTHONPATH"] == "${{ github.workspace }}/protected-source" + assert job["env"]["GDA_CHONGQING_READINESS_SHA256"] == ( + "2f5ae24ab904af0eed18ee7c517ab5c4638cbdf0923c9345b0041af185d25591" + ) + assert job["env"]["GDA_CHONGQING_READINESS_FILE_SHA256"] == ( + "c595065e152988529ff12e2301d59caebb31d2889658a676c9d1f8239e6f8372" + ) + + require_input = steps[named["Require protected metadata-only attestation input"]] + assert require_input["env"]["GDA_CHONGQING_ADMISSION_PROTECTED"] == ( + "${{ vars.GDA_CHONGQING_ADMISSION_PROTECTED }}" + ) + assert require_input["env"]["GDA_CHONGQING_ATTESTATION_BUNDLE_B64"] == ( + "${{ secrets.GDA_CHONGQING_ATTESTATION_BUNDLE_B64 }}" + ) + assert "umask 077" in require_input["run"] + assert "base64 --decode" in require_input["run"] + assert "python -m json.tool" in require_input["run"] + + evaluate = steps[named["Evaluate the protected admission contract"]]["run"] + assert "data_agent.chongqing_protected_admission evaluate" in evaluate + assert "chongqing-admission-readiness-2026-08-17.json" in evaluate + assert '--attestation "$GDA_CHONGQING_ATTESTATION_PATH"' in evaluate + assert "--output chongqing-protected-admission/report.json" in evaluate + + verify = steps[ + named["Verify the report and preserve the no-authority boundary"] + ]["run"] + assert "data_agent.chongqing_protected_admission verify" in verify + assert 'report["attestation_valid"] is True' in verify + assert 'report["admission_eligible"] is True' in verify + for claim in ( + "content_admission_authorized", + "source_content_admitted", + "landing_authority_created", + "resource_version_created", + "platform_run_created", + "scheduler_submission_authorized", + "provider_mutation_authorized", + "production_ready", + ): + assert f'report["{claim}"] is False' in verify + + attest = steps[named["Attest the protected admission evidence"]] + assert attest["uses"] == "actions/attest-build-provenance@v3" + assert "chongqing-protected-admission/attestation.json" in attest["with"][ + "subject-path" + ] + assert "chongqing-protected-admission/report.json" in attest["with"][ + "subject-path" + ] + upload = steps[named["Upload the protected admission evidence"]] + assert upload["uses"] == "actions/upload-artifact@v4" + assert upload["with"]["retention-days"] == 90 + assert upload["with"]["if-no-files-found"] == "error" + + for forbidden in ( + "kubectl ", + "helm ", + "terraform ", + "docker ", + "dolphinscheduler", + "provider mutation", + ): + assert forbidden not in rendered.lower() diff --git a/docs/architecture-decisions/adr-080-chongqing-protected-admission-workflow.md b/docs/architecture-decisions/adr-080-chongqing-protected-admission-workflow.md new file mode 100644 index 00000000..1f0b74d6 --- /dev/null +++ b/docs/architecture-decisions/adr-080-chongqing-protected-admission-workflow.md @@ -0,0 +1,83 @@ +# ADR-080: Chongqing protected admission verifier workflow + +**Status**: Accepted + +**Date**: 2026-08-17 + +**Decision owners**: Platform Architecture, Data Platform, Data Governance, Security + +## Context + +M3-32 defines a deterministic intake/evaluate/verify contract for the fifteen +external inputs required by the Chongqing admission readiness record. Running +that evaluator from a developer shell, however, cannot establish protected +verifier identity, environment approval or artifact provenance. The workflow +boundary must be explicit before real attestations can be consumed. + +The boundary must not gain source-payload access, provider credentials, +scheduler permissions or ingestion authority. A successful evidence evaluation +is still only eligibility for a separate admission decision. + +## Options considered + +| Option | Benefit | Limitation | Decision | +|---|---|---|---| +| Evaluate from a developer workstation | Minimal setup | No protected identity, approval or artifact provenance | Rejected | +| Commit an attestation bundle to the repository | Easy CI integration | Makes mutable repository content look authoritative and may expose evidence metadata | Rejected | +| Protected environment workflow consuming a metadata-only secret bundle | Environment approval, exact verifier revision and GitHub provenance; no source access | Requires dedicated runner/environment provisioning and secret rotation | Adopted | + +## Decision + +Adopt `.github/workflows/verify-chongqing-admission.yml` as the M3-33 protected +verifier workflow contract. + +The workflow: + +1. can run only by manual dispatch from `main` in the protected + `chongqing-admission` environment; +2. uses a dedicated `[self-hosted, linux, gda-admission]` runner and checks out + the exact `github.sha` without persisted credentials; +3. accepts only a base64-encoded metadata attestation JSON from the protected + environment secret, writes it with a restrictive umask, and never reads the + Chongqing source payload; +4. binds evaluation to the exact M3-31 logical and file fingerprints; +5. runs the M3-32 evaluator and integrity verifier, requiring + `attestation_valid=true` and `admission_eligible=true` while asserting every + content, Landing, ResourceVersion, PlatformRun, scheduler, provider and + production authority claim remains false; and +6. uses GitHub OIDC provenance to attest the metadata-only input bundle and + report, then uploads them as a bounded-retention artifact. + +The secret is an input transport, not an authority by itself. Environment +reviewers, branch restrictions, runner ownership and secret rotation must be +provisioned before the workflow can produce accepted protected evidence. + +## Authority boundary + +M3-33 contains no connector, source scan, payload copy, Landing creation, +ResourceVersion mutation, PlatformRun creation, scheduler submission or +provider client. The workflow cannot authorize ingestion or production. A +successful report must be consumed by a separate admission decision and +immutable Landing authority workflow that does not yet exist. + +The checked-in workflow and synthetic/static tests prove only the workflow +contract. They do not prove that the protected environment, runner, reviewer +policy, external attestations or production identities exist. + +## Consequences + +**Positive**: real external evidence now has one auditable execution path bound +to an exact verifier revision and provenance artifact. + +**Positive**: environment configuration or evidence gaps fail before any +authority-bearing action is possible. + +**Negative**: AR-2 remains `in_progress`; the dedicated environment and runner +must be provisioned and all fifteen real attestations supplied before the first +protected run. + +## Verification + +```bash +python -m pytest data_agent/test_chongqing_protected_admission_workflow.py -q +``` diff --git a/docs/roadmap.md b/docs/roadmap.md index 41413ca0..f1db2981 100644 --- a/docs/roadmap.md +++ b/docs/roadmap.md @@ -444,6 +444,7 @@ AR-0 Architecture / Schema / Runtime Truth - M3-30 source governance gate:选择 `bishan_land_use_dltb_local` 作为首条地类图斑候选,绑定 M3-28/M3-29 指纹并把 owner、license、retention、access、privacy/sensitivity、标准版本、DataSLO、golden result 八项决策冻结为独立 pending records;完整派生证明、签名决策和 fresh protected attestation 未齐全前不得 content admission。 - M3-31 protected admission readiness contract:绑定 M3-28/M3-29/M3-30 的逻辑与文件 fingerprints,把 6 项 derivation、8 项 governance 和 1 项 protected attestation 固定为 15 个 fail-closed requirements;`admission_eligible=false` 前不得创建 Landing、ResourceVersion、PlatformRun、scheduler submission 或 provider mutation。 - M3-32 protected admission attestation intake:固定外部 attestation 的 M3-31 logical/file fingerprint binding、15 项逐项 SHA-256 证明、受保护 verifier/source binding、24 小时 freshness、七天 validity 上限和八项 no-payload/no-mutation checks;`evaluate` 只产生 fingerprinted readiness report,不创建任何 Landing、ResourceVersion、PlatformRun、scheduler submission 或 provider mutation authority。 +- M3-33 protected admission verifier workflow:只允许从 `main` 手工触发受保护 `chongqing-admission` environment 的专用 verifier runner,消费 metadata-only secret bundle,绑定 exact M3-31 fingerprints,执行 M3-32 evaluate/verify,并以 GitHub OIDC provenance attestation 固定 input/report;workflow 不含 source scan、Landing/ResourceVersion/PlatformRun 创建、scheduler submission 或 provider client,环境/runner/15 项真实 attestation 未 provision 前仍 blocked。 - SourceDefinition、CredentialReference、SourceCapability、SyncDefinition/Version、SyncRun、Cursor/Watermark、SchemaDriftEvent 和 Reconciliation。 - 数据库、对象存储/空间文件、HTTP/STAC 三类代表 source 的连接、凭据、连通、发现、preview、profile 和 owner 登记。 - 全量/增量微批的 Append/Overwrite/Merge 策略,以及至少一个真实 CDC 或事件流 source 通过 Flink 写入版本化 Bronze;覆盖 watermark/offset、checkpoint、迟到/乱序、源端删除、幂等、对账、重放和失败恢复。 @@ -691,7 +692,7 @@ Golden checks 至少覆盖: 3. 冻结 ResourceURN、ResourceVersion、PlatformDefinition/PlatformRun/FrameworkAttemptObservation/Artifact/LineageEvent、SubjectContext 与 storage/table/compute provider 最小合同。 4. 分阶段实现 `gda-metadata-fabric-bridge`:M1 只读 mapping/reconciliation、M2a 本地 foundation/重启连续性、M2b-1 本地三存储恢复、M2b-2 隔离 versioned/Object-Locked repository round-trip、M2b-3 本机双集群 + Kubernetes 外 COMPLIANCE repository + 独立 writer/reader、M2c-1 provider-native metrics、M2c-2 临时 OTel Collector + JSON Exporter 的双周期本地 pipeline、M2c-3 本地单 job scrape 故障检测/配置恢复/完整清理 evidence、M2c-4 绑定 source revision 的 production observability readiness contract,以及 M2d-1 本地 kindnet 跨节点 NetworkPolicy enforcement 已验证;M2c-4 当前仍有 20 项 blockers,M2d-1 也未验证生产 provider policy 或 tenant isolation。下一步完成 source host/cluster 外的生产 bucket、KMS/TLS/workload identity、source-loss recovery 与 RPO/RTO,并批准 metrics backend、retention、OTel/TLS、tenant、alert/SLO/owner 后在受保护环境验证持续采集、存储、查询、真实告警投递、runbook 响应和 provider NetworkPolicy;再推进 OIDC、upgrade/rollback、registry provenance 和 owner/runbook;之后才进入 M3 ingestion/OpenLineage/conformance。 5. 实现 `gda-orchestration-gateway`、DolphinScheduler process/task/schedule/complement/worker-group、Spark/Flink provider task adapter 和故障注入;不再开发新的 lease/queue/scheduler。 -6. M3-28 已冻结全量重庆真实源的 path-free physical/metadata admission baseline,M3-29 已建立 metadata-only extraction provenance gap baseline,M3-30 已选择 `bishan_land_use_dltb_local` 并把八项治理输入固化为 fail-closed pending records,M3-31 已将三层证据统一成 protected admission readiness contract,M3-32 已固定 protected attestation intake/evaluate/verify boundary;下一步取得 15 项外部 attestation 并由受保护 verifier 重新评估,未获批准前不得 content admission。 +6. M3-28 已冻结全量重庆真实源的 path-free physical/metadata admission baseline,M3-29 已建立 metadata-only extraction provenance gap baseline,M3-30 已选择 `bishan_land_use_dltb_local` 并把八项治理输入固化为 fail-closed pending records,M3-31 已将三层证据统一成 protected admission readiness contract,M3-32 已固定 protected attestation intake/evaluate/verify boundary,M3-33 已固定受保护 workflow execution/provenance boundary;下一步 provision 专用 environment/runner 并取得 15 项外部 attestation 后执行首次 protected verification,未获批准前不得 content admission。 7. 冻结 Default Lakehouse、Cloud Managed、Lightweight Integrated profiles;以统一 Run 完成默认 MinIO/Iceberg/Spark/Flink、轻量 PostGIS/DuckDB 和 Azure 代表 adapter 的 conformance smoke。 8. 实现跨 profile 的 Raw -> ODS -> DIM/DWD -> DWS -> ADS 通用生产、质量、发布、回滚和 golden equivalence。 9. 建立 DataProductBlueprint、模型版本和 Visual/SQL/Notebook 共用 definition 的 Build 工作台,打通 preview、test、publish、approval 和 rollback。 @@ -732,7 +733,7 @@ AR-4 parity/control gate 退出前暂停以下主线扩张: |---|---|---| | AR-0 Architecture/Schema/Runtime Truth Freeze | `in_progress` | 全环境 schema/config fingerprint、迁移 fail-closed、事实清单、storage/compute/GIS serving provider profile/capability、ADR-017 benchmark、owner/SLO 和首条数据/服务验收集冻结 | | AR-1 Unified Metadata + Orchestration Control Planes | `in_progress` | controlled gateway、DolphinScheduler adapter、Metadata Fabric M1/M2a/M2b、M2c-1 provider metrics、M2c-2 本地临时 OTel pipeline、M2c-3 本地 scrape failure/recovery、M2c-4 production observability readiness contract 与 M2d-1 本地跨节点 NetworkPolicy enforcement 已验证,生产观测和生产 policy/tenant isolation 仍 blocked;下一证据是 source host/cluster 外的生产 recovery、持久 metrics backend/TLS/tenant/真实 alert delivery/SLO、OIDC、受保护 provider NetworkPolicy、升级回滚/registry provenance,以及受控 ingestion/replay 与无双写验收 | -| AR-2 Source/Ingestion + Geospatial Lakehouse Vertical Slice | `in_progress` | M3-28 admission baseline、M3-29 extraction provenance gap baseline、M3-30 first-candidate governance gate、M3-31 protected admission readiness contract 与 M3-32 protected attestation intake 已完成;checked baseline 仍为 `admission_eligible=false`,下一证据是 15 项外部 attestation、受保护 verifier 复核,随后才可授权 immutable Landing authority、content admission 和 ingestion;最终仍需三类代表源、`DriveTransfer` 云盘客户端、大文件恢复、默认湖仓、轻量存算一体及 Azure 代表 adapter 通过 provider conformance 与 Raw -> ADS 验收 | +| AR-2 Source/Ingestion + Geospatial Lakehouse Vertical Slice | `in_progress` | M3-28 admission baseline、M3-29 extraction provenance gap baseline、M3-30 first-candidate governance gate、M3-31 protected admission readiness、M3-32 attestation intake 与 M3-33 protected verifier workflow contract 已完成;checked baseline 仍为 `admission_eligible=false`,下一证据是专用 environment/runner provisioning、15 项外部 attestation 和首次 protected verifier run,随后才可设计 immutable Landing authority、content admission 和 ingestion;最终仍需三类代表源、`DriveTransfer`、大文件恢复、默认湖仓、轻量存算一体及 Azure 代表 adapter 通过 conformance 与 Raw -> ADS 验收 | | AR-3 Data Product Engineering + Governance Workbench | `planned` | Blueprint、模型、Visual/SQL/Notebook、DataOps CI/CD、质量/安全/审批共用 definition 和产品生命周期 | | AR-4 Asset/GIS Service/Spatial Experience Operations | `planned` | Service Control Plane、Features/Tiles/MVT/COG/STAC/export 及条件 legacy OGC/3D/EDR provider、Gateway/权限/缓存、原子切换/回滚、Discover/Operate/Govern 和无 LLM 多入口通过 conformance/parity/control gate | | AR-5 AgentOps Runtime + UX Uplift | `planned` | DataOps parity/control 通过;Agent bundle eval、deployment、online observation、incident/rollback 和 uplift gate | diff --git a/docs/system-of-record-matrix-2026-07-24.md b/docs/system-of-record-matrix-2026-07-24.md index d0473b3c..e3406970 100644 --- a/docs/system-of-record-matrix-2026-07-24.md +++ b/docs/system-of-record-matrix-2026-07-24.md @@ -2,7 +2,7 @@ 日期:2026-08-17 -阶段:AR-0 `in_progress`;AR-1 gateway、成功终局 evidence gate、DolphinScheduler adapter sandbox POC、Metadata Fabric M1/M2、M2c-4/M2d-2 production readiness contracts、M3-1/M3-2、M3-3 local binding ledger、M3-4 local OpenLineage wire delivery、M3-5 local OpenMetadata bounded identity、M3-6 local Gravitino Basic bounded identity 与 M3-7 production identity readiness contract 已验证;AR-2 M3-28 重庆真实源 metadata-only admission baseline、M3-29 extraction provenance gap baseline、M3-30 first-candidate governance gate 与 M3-31 protected admission readiness contract 已建立,内容准入、Landing authority、生产 provider ingestion、生产观测、生产 policy/tenant isolation、生产 identity attestation 和生产切换仍 `in_progress` +阶段:AR-0 `in_progress`;AR-1 gateway、成功终局 evidence gate、DolphinScheduler adapter sandbox POC、Metadata Fabric M1/M2、M2c-4/M2d-2 production readiness contracts、M3-1/M3-2、M3-3 local binding ledger、M3-4 local OpenLineage wire delivery、M3-5 local OpenMetadata bounded identity、M3-6 local Gravitino Basic bounded identity 与 M3-7 production identity readiness contract 已验证;AR-2 M3-28 重庆真实源 metadata-only admission baseline、M3-29 extraction provenance gap baseline、M3-30 first-candidate governance gate、M3-31 protected admission readiness、M3-32 attestation intake 与 M3-33 protected verifier workflow contract 已建立,内容准入、Landing authority、生产 provider ingestion、生产观测、生产 policy/tenant isolation、生产 identity attestation 和生产切换仍 `in_progress` 适用分支:`main` @@ -21,7 +21,7 @@ | 部署配置策略 | Compose/K8s/进程环境;`platform_truth.CONFIG_SPECS` 定义关键类型与策略;DolphinScheduler worker 有默认零副本、外部 ConfigMap/Secret 驱动的 Kustomize 模板、静态 validator、staging activation preflight 和受保护的单副本 activation admission/workflow | `.env` 仅补默认;脱敏 snapshot、Secret key attestation、未扩容 Deployment、`ready_for_activation` 和未执行的 activation workflow 都是观测/变更能力 | 版本化 DeploymentProfile + secret reference;部署环境始终优先;模板、preflight 或 admission 通过都不等于环境已启用 | Platform/SRE/Security | AR-0,部分实现;worker 激活合同已验证、真实运行待审批 | | 环境发布与晋级 | publisher `31862363442`、protected verifier `31862984294` 与 staging deploy/observe `31863077257` 已将 `main@5fffc85`、GHCR digest、attested release、cluster/namespace identity 和 live revision 绑定;schema/config/runtime/health/rollout 通过,golden slice 缺失使 promotion fail closed | 旧 mainline、feature branch、CI artifact、JSON、离线 report、单独的 staging deployment 或人工批准都不能成为 production 发布权威 | 由受保护 environment 的 DeploymentRevision 绑定 OCI、provenance artifact、release manifest、golden slice 与全部 live verdict | Platform/SRE/Security/Repository Owner | AR-1 真实 staging 已部署 -> golden slice/production exit gates 待完成 | | 后台运行时清单 | `platform_truth.RUNTIME_INVENTORY` 是代码层登记;`gda_control` 已有受控 PlatformRun 写入口;DolphinScheduler adapter、tenant-scoped managed command worker 与受保护的单副本激活边界已有代码和测试,但 worker 尚未在 staging 运行;M2b recovery runner、M2c-1 provider probe、M2c-2 `_OtelPortForward`、M2c-3 failure rehearsal 与 M2d-1 NetworkPolicy rehearsal 均登记为 `local_verification_only`,不是 scheduler、worker、持续监控、生产 policy controller 或状态权威 | AST primitive report、worker status JSON、FrameworkAttemptObservation、DolphinScheduler instance state、本地 recovery/metrics/network-policy evidence | PlatformRun ledger 唯一登记最终状态;framework/provider attempt 只能回报观测;worker status 仅为进程健康投影;本地演练进程与 evidence 不得变成生产控制器、监控后端或 tenant-isolation 权威 | Platform Architecture | AR-1 adapter/worker/activation 合同已验证 -> staging 运行待审批;metadata recovery/metrics/policy runner 仅本地验证 | -| 原始文件/对象 | M3-28 已以 path-free metadata manifest 记录重庆真实源 archive/extracted fingerprints、source groups、asset profiles 与治理 blockers;M3-29 进一步记录 526 exact、6 modified、0 missing、52 additional 的比较及 6 项派生证明缺口;M3-30 已选择首条地类图斑候选并把八项治理决策固定为 pending records;M3-31 将上述三层证据绑定为 15 项 pending admission requirements;`source_content_admitted=false`,因此尚无内容写入权威 | admission/provenance/governance/readiness evidence JSON、archive/extracted comparison、临时上传、下载缓存、预览文件 | 在 15 项外部 attestation 经受保护 verifier 复核并进入正式 authority 后,才可由 immutable Landing object URI + checksum + retention 建立内容权威;本地 scratch 与 checked evidence 均不可替代 Landing | Data Platform | AR-2 `in_progress` | +| 原始文件/对象 | M3-28 已以 path-free metadata manifest 记录重庆真实源 archive/extracted fingerprints、source groups、asset profiles 与治理 blockers;M3-29/M3-30 固定派生证明缺口和首条候选的八项 pending 治理决策;M3-31/M3-32 将其绑定为 15 项 pending requirements 与 protected intake contract;M3-33 已定义 protected verifier workflow,但未 provision 或执行;`source_content_admitted=false`,因此尚无内容写入权威 | admission/provenance/governance/readiness/evaluation/workflow evidence、archive/extracted comparison、临时上传、下载缓存、预览文件 | 在专用 environment/runner 中由 15 项外部 attestation 产生受保护 verifier report,并经独立 admission decision 后,才可由 immutable Landing object URI + checksum + retention 建立内容权威;本地 scratch、checked contract 与 workflow 文件均不可替代 Landing | Data Platform | AR-2 `in_progress` | | 湖仓表与 snapshot | Iceberg/STAC/S3A 有局部实现,尚无通用发布权威 | STAC item、GeoParquet export | Iceberg catalog snapshot 是分析表版本权威;对象是物理内容,STAC 是发现投影 | Data Platform | AR-2 | | 在线空间数据 | PostGIS 业务表是当前编辑/查询事实,部分临时表混入 | Martin MVT、API JSON、导出文件 | 已批准 DataProductVersion 物化到 PostGIS;不能由瓦片或临时表反向定义产品版本 | GIS/Data Platform | AR-2 -> AR-4 | | 数据资产身份与版本 | `gda_control.resource/resource_version` 已实现 identity、hash、predecessor、tenant FK 和幂等 gateway 写入;`agent_data_assets`、`agent_asset_versions` 仍是兼容写路径 | UI catalog、search index、STAC | GDA ledger 管身份与版本绑定;旧行只有在 tenant、authority identity、checksum 和 version evidence 完整时才可形成 eligible plan;OpenMetadata 管治理目录,Gravitino 管技术对象映射 | Metadata Platform | AR-1 gateway 已验证 -> 生产切换待验收 | @@ -67,6 +67,7 @@ 21. M3-30 只允许选择 `bishan_land_use_dltb_local` 作为首条候选并记录 owner、license、retention、access、privacy/sensitivity、标准版本、DataSLO、golden result 八项 pending decisions;`candidate_scope_selected=true` 不等于 `source_governance_approved`,checked governance evidence 不形成 Landing object、ResourceVersion、PlatformRun、scheduler submission、provider mutation、content admission 或 production ingestion 权威,也不得被 rehash 成批准。 22. M3-31 只允许绑定 M3-28/M3-29/M3-30 并记录 6 项 derivation、8 项 governance 与 1 项 protected attestation 的 pending requirements;`admission_eligible=false` 时不形成 Landing object、ResourceVersion、PlatformRun、scheduler submission、provider mutation、content admission 或 production ingestion 权威,readiness evidence 不得被 rehash 成批准。 23. M3-32 只允许受保护 verifier 消费绑定 M3-31 logical/file fingerprints 的外部 attestation;15 项 requirement、八项 no-payload/no-mutation checks、freshness、expiry 和 verifier/source binding 任一缺失即 blocked。完整 attestation 只能使 fingerprinted report 的 `admission_eligible=true`,不创建 Landing object、ResourceVersion、PlatformRun、scheduler submission、provider mutation、content admission 或 production readiness 权威;合成测试 attestation 不计入生产证据。 +24. M3-33 只允许 `main` 上手工触发的受保护 `chongqing-admission` workflow 在专用 runner 中消费 metadata-only secret bundle,绑定 M3-31 exact logical/file fingerprints,执行 M3-32 evaluate/verify 并 attested/upload input/report;workflow 不读取 source payload、不调用 connector/provider/scheduler、不创建 Landing object、ResourceVersion、PlatformRun 或任何 ingestion authority。environment、runner、reviewer policy、secret rotation 与真实 15 项 attestation 未 provision 前,workflow contract 不计入 protected admission evidence。 ## 已建立的 AR-0/AR-1 entry 证据 @@ -103,6 +104,7 @@ - AR-2 M3-30 已建立首条重庆地类图斑 source governance gate:候选为 `bishan_land_use_dltb_local`,evidence SHA 为 `97cf11ab8938c048dce9db903d1a4f30758f208dec6dad1a08b740a4a8fe7b6f`,evidence file SHA 为 `25bc5e2dfc5528f5556e7174f8c99fed7abaf30b9312528f5164c16bdf7cca9a`;证据绑定 M3-28/M3-29 fingerprints,八项治理 decision records 全部为 `pending`,另保留 derivation 与 fresh protected attestation blockers;`candidate_scope_selected=true`、`source_governance_approved=false`、`source_content_admitted=false`、`production_ready=false`。该证据不含 source payload、绝对路径、记录值或 geometry,也不证明任何治理批准、Landing authority、ResourceVersion、Run、scheduler/provider mutation 或生产 ingestion。 - AR-2 M3-31 已建立 protected admission readiness contract:候选为 `bishan_land_use_dltb_local`,evidence SHA 为 `2f5ae24ab904af0eed18ee7c517ab5c4638cbdf0923c9345b0041af185d25591`,evidence file SHA 为 `c595065e152988529ff12e2301d59caebb31d2889658a676c9d1f8239e6f8372`;证据绑定 M3-28/M3-29/M3-30 的逻辑与文件 fingerprints,15 项要求全部为 `missing`,`admission_eligible=false`、`source_content_admitted=false`、`production_ready=false`。该证据只定义未来受保护 verifier 的输入,不含 source payload、绝对路径、记录值或 geometry,也不证明任何 Landing authority、ResourceVersion、Run、scheduler/provider mutation 或生产 ingestion。 - AR-2 M3-32 已建立 protected admission attestation intake/evaluate/verify contract:外部输入必须绑定 M3-31 logical/file fingerprints,逐项提供 15 个 SHA-256 attestation、八项 protected checks、verifier/source binding 和受控 freshness/expiry;checked baseline 的 `readiness_valid=true`、`attestation_valid=false`、`admission_eligible=false`,所有 content/authority/production claims 继续为 `false`。合成完整 attestation 仅覆盖 evaluator 单元测试,不计入真实准入证据。 +- AR-2 M3-33 已建立 protected admission verifier workflow contract:workflow 仅从 `main` 手工触发、绑定专用 environment/runner、以 restrictive umask 解码 metadata-only attestation secret、执行 M3-32 evaluate/verify 并通过 GitHub OIDC provenance attestation 固定 input/report;checked workflow 未执行,专用环境、runner、reviewer policy、secret rotation 与真实 15 项 attestation 均未 provision,不形成 content admission 或生产 authority。 ## 下一验收证据 @@ -111,5 +113,5 @@ - 为受保护 activation 提供真实 ConfigMap snapshot、Secret key attestation、provider identity 和 reviewer approval,随后完成 managed outbox worker/provider callback 单副本实际部署、唯一 worker ID、status/lease 故障恢复和无双写证据; - 首条真实图斑链对 golden slice 的 output hash、独立质量结果/evidence、血缘、发布 revision 和 rollback 演练; - OpenMetadata/Gravitino 的 source host/cluster 外生产 backup account/bucket、KMS/TLS/workload identity、PITR/source-loss recovery、RPO/RTO、OIDC、受保护环境 provider NetworkPolicy/tenant isolation、upgrade/rollback、registry provenance、持续 metrics backend/retention/query、真实 alert delivery/SLO owner/runbook,以及受保护 PolicyDecision/Approval、双 provider 最小权限 ingestion、生产持久 binding、受保护 production OpenLineage receiver、无双写 read-back 和 conformance;M1 fixture、M2 本地 evidence/readiness contracts、M3-1 projection candidate、M3-2 local replay、M3-3 临时 binding ledger、M3-4 loopback delivery、M3-5/M3-6 本地临时 provider identity 与 M3-7 pending profile/合成 attestation 均不计入生产退出门; -- M3-29/M3-30/M3-31/M3-32 的下一证据必须补齐 operator/tool/command、modified/additional manifest、archive-to-working-set attestation、owner/license/retention/access/privacy-sensitivity/standard-version/DataSLO/golden-result 八项签名决策与 fresh protected attestation,并由受保护 verifier 按 M3-32 intake contract 重新计算 admission eligibility;metadata-only admission/provenance/governance/readiness/evaluation evidence 是不可变检查结果,不能被编辑或重解释为内容批准、Landing authority 或 ingestion authorization; +- M3-29/M3-30/M3-31/M3-32/M3-33 的下一证据必须 provision 专用 `chongqing-admission` environment/runner/reviewer/rotation policy,补齐 operator/tool/command、modified/additional manifest、archive-to-working-set attestation、owner/license/retention/access/privacy-sensitivity/standard-version/DataSLO/golden-result 八项签名决策与 fresh protected attestation,并由 M3-33 workflow 按 M3-32 intake contract 重新计算 admission eligibility;metadata-only admission/provenance/governance/readiness/evaluation/workflow evidence 是不可变检查结果,不能被编辑或重解释为内容批准、Landing authority 或 ingestion authorization; - DolphinScheduler/Temporal sandbox 的独立数据库、备份恢复、身份、版本和升级责任证明;DolphinScheduler standalone/H2 不计入此退出门。