OceanWayOceanWay
平台与产品内部管理员平台

Run Explorer

OceanWay 内部运行检索、可信时间线、投影完整性与只读诊断界面契约

Run Explorer 是 admin.oceanway.tech 的第一项只读运维能力。它让获得授权的 OceanWay Workforce 从一个稳定 ID 出发,看到当前能够被事实证明的执行边界;它不是日志全文检索器,也不能把缺失事件推断成业务失败。

属性当前结论
产品 Owneroceanway-admin:Workforce Session、Query BFF 与页面体验
数据 Owneroceanway-core Operations 模块:投影、Source Snapshot 完整性记录与私有 Query API
当前状态契约已冻结,页面、Query API 与投影尚未实现
首期范围已纳入当前 Operations Source Query Definition 的准入/Outbox、Accepted Observation、低敏 Gateway 诊断摘要、Billing 经济边界与 Reconciliation Case
明确排除业务写命令、Provider 原始正文/凭据、客户输入输出与 Asset 正文、私有 Ledger 明细及客户 Webhook Body

可靠投递和投影机制见 ADR-030,管理员平台总边界见管理员平台与运维控制面

页面回答的问题

第一版只回答以下问题:

  1. 这个 ID 是否能在当前 Workforce 权限范围内解析到一个 Operation?
  2. Core 是否已接受请求并原子创建 reserved Run 与严格credits | entitlement | money Reservation?
  3. 哪些领域事件已经写入 Outbox、被投递并应用到当前投影版本?
  4. 当前视图的新鲜度、Accepted Observation 可获得范围和最新可信边界是什么?
  5. 哪些后续阶段尚未进入、尚未观测或因投影延迟无法判断?

页面不能仅凭一条 202、一条日志、相近时间或相同模型名称回答“模型已经执行”“费用已经结算”或“请求一定失败”。

检索契约

首期全局检索只接受下列不透明 ID 的精确匹配

查询键首期证据来源说明
requestIdrun.created@2.0 或低敏 Request Attempt Observation首次成功 Admission 是权威关联;准入前失败与幂等重放属于可缺失的运维观察
operationIdEvent Envelope / Run一次逻辑副作用操作的主检索键
correlationIdEvent Envelope / Run连接同一长期业务流程,不表示全局顺序
runIdrun.createdRun 聚合身份
reservationIdwallet.reserved@2.0;v1 仅 Legacy/Partialcredits 预占身份
eventIdOutbox 与 Applied Receipt定位事件及其投递、应用状态
observationIdCore Accepted Observation Source只有 Intake 已接受时才能命中
errorIdError Occurrence 或 Observation只有相应来源已摄取时才能命中

第一版不做 Prompt、输入正文、邮箱、模型名称或模糊文本搜索。后续用户/企业搜索由独立 Support 权限和脱敏索引承载,不能借 Run Explorer 绕过租户范围。

Admin Query BFF 使用 POST /internal/v1/operations/searchPOST /internal/v1/operations/explorerPOST /internal/v1/operations/projection-status 私有查询契约;Grant 通过 POST /internal/v1/workforce/query-grants:issue 交换。POST /internal/v1/operations/observations 是生产服务专用的独立 Intake 写端点,不属于 Admin Query。Search 每次只接受一个受支持类型与长度的精确 ID,并固定 identifierNamespace=domain_fact | accepted_observation | auto;BFF 必须按用户明确选择或 Contracts 的确定性 Type→Namespace 规则构造,不能在 miss 后静默换 Namespace。查询值放在请求体而非 URL 或默认 Access Log 中。请求体中的 Tenant、Workspace 或 Project 只能缩小范围,不能扩大由 Core 签发的 Signed Workforce Grant 决定的范围。

响应显示 negativeProofCapability=complete_source_guard | positive_match_only。首期只有 Canonical Event/Archive Source 的 Operation/Correlation/Run/Reservation/Event ID domain_fact 查询可在完整 Guard 下获得前者;Request/Error/Auto 和尚未把永久 Registry 纳入 Completeness Proof 的 Observation 查询都只允许正向命中。后者 miss 时页面显示“当前无法判定(缺少否定证明)”,不能显示“未找到”。

Search Response 先以 searchOutcome=matched | not_found | inconclusive 严格区分命中、可证明未找到和无法判定;matched 内的 Item 再返回 operation_linked | observation_only | legacy_run_only 判别联合。Observation 自报的 Tenant/Run/Operation 只是 producer_claimed,不能用于租户授权或生成 operation_linked;只有被 Domain Event 或 Core 可验证 Admission Context 交叉验证为 domain_verified 的关联才能进入 Operation。准入前拒绝或未验证记录只显示职责允许的低敏 Accepted Observation 摘要和“未形成/未验证 Operation”。携带合法 Operation 的 v1 Run 可进入 operation_linked 但必须显示 partial_legacy_event;缺少 Operation 的 v1 只按真实 Run/Event ID 返回 legacy_run_only,不构造假 operationId/correlationId/requestId。只有 operation_linked 可以进入 /explorer;另两种分支均为 explorerCapability=not_applicable。Wallet-first Pending Reservation 在与 Run Event 验证并原子链接前只出现在受限 Projection/Quarantine 状态,不伪装为 Operation。只有 verified + verified_current + complete_for_supported_scope、Identifier 在支持范围且 Grant 足以作否定证明时才显示“未找到”;其余空结果及潜在越权统一显示“当前无法判定”,无权对象与不存在对象保持不可枚举。

Admin BFF 严格 Wire Contract

Admin BFF 必须直接消费并透传 Contracts Package 发布的以下封闭 JSON Schema;字段集、判别联合、命名、unknownProperties=false、摘要算法标签与Cursor不得在BFF中另造“页面版”结构:

OperationsSearchRequest@1 = {
  identifierType=requestId|operationId|correlationId|runId|reservationId|eventId|observationId|errorId
  identifierValue
  identifierNamespace=domain_fact|accepted_observation|auto
  projection={ kind=active }|{ kind=exact; projectionName; projectionVersion }
  matchPage={ cursor?; requestedPageSize? }
  nestedPages[]=sorted_unique {
    operationId; section=billing_boundaries|reconciliation_cases; cursor; requestedPageSize?
  }
}

OperationsSearchResponse@1 =
  { metadata={ state=available; value=OperationsQueryMetadata@1 };
    result=OperationsSearchResult@1 }
  | { metadata={ state=unavailable; reason=projection_unavailable };
      result={ searchOutcome=inconclusive; data=[];
               negativeProofCapability=positive_match_only;
               inconclusiveReason=projection_unavailable } }

OperationsExplorerRequest@1 = {
  operationId
  projection={ kind=active }|{ kind=exact; projectionName; projectionVersion }
  sections={
    admission=include|omit
    billingBoundaries=RequestedSectionPage@1
    reconciliationCases=RequestedSectionPage@1
    timeline=RequestedSectionPage@1
    observations=RequestedSectionPage@1
  }
}

OperationsExplorerResponse@1 =
  { result=available; metadata={ state=available; value=OperationsQueryMetadata@1 };
    summary={ state=available; value=AuthorizedOperationSummary@1 }|{ state=redacted };
    admission={ state=not_requested }|{ state=available; value=AuthorizedAdmissionSnapshotValue@1 }
              |{ state=not_available; reason=partial_legacy_event }|{ state=redacted };
    billingBoundaries=PagedOrRedacted@1<AuthorizedBillingEconomicBoundary@1>;
    reconciliationCases=PagedOrRedacted@1<AuthorizedReconciliationCase@1>;
    timeline=PagedOrRedacted@1<AuthorizedTimelineEntry@1>;
    observations=PagedOrRedacted@1<AcceptedObservationDetails@1> }
  | { result=inconclusive; metadata={ state=available; value=OperationsQueryMetadata@1 };
      reason=not_found_or_not_authorized }
  | { result=inconclusive; metadata={ state=unavailable; reason=projection_unavailable };
      reason=projection_unavailable }

ProjectionStatusRequest@1 = {
  projectionName
  projection={ kind=active }|{ kind=exact; projectionVersion }
  details={ state=not_requested }
          |{ state=requested; detailKind=mandatory_delivery|revision_gap|quarantine|unsupported_schema;
             cursor?; requestedPageSize? }
}

ProjectionStatusResponse@1 =
  { result=available; metadata={ state=available; value=OperationsQueryMetadata@1 };
    registry; build;
    runtimeSummary={ state=available; sixCurrentGuardCounts }
                   |{ state=unavailable; reason=no_completed_snapshot|definition_mismatch|guard_unavailable };
    authorizedDetails={ state=not_requested }
                      |{ state=available; detailKind; itemCount; items[]=ProjectionRuntimeDetail@1; nextCursor? }
                      |{ state=redacted } }
  | { result=inconclusive; metadata={ state=available; value=OperationsQueryMetadata@1 };
      reason=not_found_or_not_authorized }
  | { result=inconclusive; metadata={ state=unavailable; reason=projection_unavailable };
      reason=projection_unavailable }

这里的PagedOrRedacted@1<T>只是文档排版缩写,生成Schema中必须展开为not_requested | available{itemCount,items[],nextCursor?} | redacted严格联合,不能成为泛型自由Map。OperationsQueryMetadata@1、Admission、Gateway Observation、Billing Boundary、Case、Timeline与Status Detail全部复用Operations Read Model同名Schema。Mandatory Delivery Detail必须保留deliverySetVersion + deliverySetDefinitionSchemaVersion + deliverySetDefinitionDigestAlgorithmVersion + deliverySetDefinitionDigest。经济边界按其Owner Schema保留真实身份;Case必须使用sourceScope=late_settlement_dimension | billing_finalization_run严格联合:前者完整返回Account/Reservation/Run/Step/Attempt/Dimension、经济身份、Exposure与Applied Fact,后者只返回Account/Reservation/Run/Fence、Identity、Case Request Event、Decision、winning Work/Generation、reasonCode与Finalization Resolution Fact,绝不能伪造Step/Attempt/Dimension/Exposure或压成裸Ref。两分支均完整返回terminalAuthority,权限不足裁剪整个Case。

Search Match按(matchKindOrder, operationId?, runId?, observationId?, summaryId);Explorer Boundary按(eventType,aggregateId,aggregateRevision,eventId),Case按(sourceKindOrder,billingAccountId,billingReservationId,runId,sourceScopeSortKey,caseGeneration,reconciliationCaseRef),其中Dimension分支Scope Key为(runStepId,executionAttemptId,chargeDimensionKey)、Run分支为(billingFinalizationFenceId);Timeline按(canonicalSortAt,entryKindOrder,timelineEntryId)、Observation按(acceptedAt,observationId);Status各Detail使用其Contracts固定键。所有Cursor由Core签名并绑定Endpoint/Section、原请求、Projection/Query Definition、Workforce Principal/Bound Workload、Grant/Tenant/Run/严格Case Source Scope、过滤条件、Page Size和最后排序键;BFF不得解析、续签或跨联合分支/Section/Scope复用。itemCount/returnedCount必须等于数组长度,Next Cursor存在当且仅当同一Scope仍有下一页。

身份与授权

一次查询同时需要两类受信身份:

  • Admin BFF 在本地终止并验证 Host-only Workforce Session;Cookie 与 Session ID 永不离开 Admin Host;
  • BFF 使用面向 Core 的短期 Workload JWT,加由 Workforce IdP/Identity Authorization 唯一签发或交换、绑定 Grant Exchange Audience、Workload 与 Request Digest/Nonce 且一次性消费 JTI 的 Actor Assertion 换取 Grant;
  • 仅由 oceanway-core Authorization/Policy 模块签发的 Signed Workforce Query Grant 证明真实操作员、绑定的呈递 Workload、职责、Action/Field/Resource/Tenant Scope、认证/策略版本、MFA、Case/JIT 上下文与有效期;Admin BFF 和 IdP 不能自行签发,浏览器不能取得 Grant。

Core 同时验证两者,并强制 Grant 的 Workload Binding 匹配当前 JWT Subject;不信任浏览器 Body 自报的 Workforce Principal 或权限。跨组织搜索需要明确职责和 JIT/Case 范围;潜在越权与不存在对象在相同 Grant 下返回不可区分的 inconclusive + authorization_non_disclosure。跨租户、技术证据、Case-scoped 内容和其他敏感查询执行两阶段 Audit fail-closed:query.authorized 与返回前的 query.released | query.not_found | query.inconclusive | query.failed 任一追加失败都不返回数据。普通列表浏览不自动获得客户内容权限。

所有详情响应使用 Cache-Control: private, no-store,不进入 CDN、Service Worker、浏览器持久化或前端 APM 的正文/ID/Grant 采集。Admin Query 使用与未来 Command Gateway 不同的 Workload Principal,并且 Core 侧数据库身份只有批准 View 的只读权限与 Audit Append Procedure。

可信时间线

每一行时间线都必须标识证据类型:

evidenceKind证据边界说明示例页面表达
domain_fact对该领域状态权威Run 已创建、Reservation 已预占“已发生”,并显示 Owner、Event 与 Revision
operational_observation只证明某服务观察到什么,不是业务终态Edge 拒绝、幂等重放“已接受的观测”,显示 Producer、Accepted At 与窗口健康
operations_runtime证明 Operations 投递、应用与完整性运行状态Delivery/Lease Attempt、Applied Receipt、Checkpoint、Snapshot anti-join、Revision Gap、Quarantine显示 Delivery Set/Projection Version 与验证结果;Checkpoint 不含标量位置
telemetry_reference诊断证据,可采样或过期Trace、结构化日志引用“诊断线索”,不能改变业务状态
derived_summary对已有证据的确定性聚合,不是新事实影响计数、最新可信边界、错误分组显示输入证据和生成时间,不能用于反向改写领域状态

以上是统一 evidenceKind 的完整五值集合,页面、Query DTO 和导出不得使用其他同义值。

Operation Summary 整体只能标为 derived_summary;主体、模型、Manifest、Reservation 等每个展示字段必须保留并可展开其 evidenceKind + sourceRef + sourceSchemaVersion。页面不能因为摘要中含有 Run Domain Fact,就把来自 Observation 或 Operations Runtime 的其他字段一起标成权威事实。

时间线按 evidenceKind 展示 occurredAt? / sourceClaimedObservedAt? / acceptedAt? / derivedAt? 的合法组合;Observation 固定按 (acceptedAt, observationId) 稳定排序。来源声明时间只作为 Timeline 辅助信息,不参与排序、健康窗口、Retention 或 Freshness,也不写入 Summary。Operation Summary 只保存由 Core acceptedAt 聚合的 first_accepted_observation_at/latest_accepted_observation_at

首期时间线可能包括:

API Edge 接收(若 Observation 可用)
→ Core Admission 已接受
→ Run reserved
→ credits Reservation active
→ run.created / wallet.reserved 已写入 Outbox
→ 当前 Mandatory Consumer 已应用
→ Operations Projection 已推进

Gateway、Billing经济边界等只有在严格Event/Accepted Observation与Owner Read均验证后才显示;Provider正文、Asset、客户Webhook及其他尚未纳入当前Source Query Definition的阶段显示“本阶段未接入”或“未观测”,绝不补造成功节点。

详情页结构

1. 可信摘要

  • 当前最新可信边界,例如“已预占,尚未进入 Gateway”;
  • Run/Reservation 当前状态与源 Revision;
  • 投影版本、最近应用/验证时间与新鲜度状态;
  • Source Snapshot anti-join、Revision Gap、Quarantine 和完整性结论;
  • Edge Observation 的 accepted health window;它不等于请求覆盖率。

2. 身份与范围

  • Tenant(Organization 或 Personal Space)、Workspace、可选 Project;
  • Actor 与 Execution Principal;
  • Developer App、Environment、Service Account 与 Developer Credential 的不透明引用;
  • Authorization Decision 引用。

Developer Credential Secret、Digest、Authorization Header、JWT、Session 和完整授权 Payload 永不展示。

3. 模型与执行快照

  • Surface、API Version 与 Operation;
  • Public Model ID;
  • Logical Model、Offering Revision、Deployment 与 Gateway Pool 引用;
  • run.created@2.0 携带的 executionManifestRef / executionManifestSchemaVersion,只显示稳定受控引用与版本,不读取或复制完整 Manifest JSON;v1 明确显示缺失。

Prompt、输入正文、输入 Hash、请求 Fingerprint、Provider Route 与 Provider Credential 不复制到运维投影。

4. 账务预占

  • Billing Account、Reservation、Price Snapshot;
  • 严格credits | entitlement | money BillingValue与准入时active状态;
  • wallet.reserved Event 与 Run 的 Causation 关系。

本期没有 Meter 或 Ledger Settlement 时,页面必须写“尚未进入计量/结算阶段”,不能把预占写成实际扣费。

5. 事件投递

  • Event Type、Schema Version、Event ID、Aggregate/Revision;
  • Outbox 创建、领取尝试、当前 Delivery State;
  • Applied Receipt、Consumer/Projection Version 与 Applied At;
  • Payload Digest 一致性、重试或 Quarantine 的脱敏错误引用。

published_at 在 PostgreSQL 首期只表示当前 Mandatory Delivery Set 已确认,不表示所有未来消费者均已处理。

完整性与空状态

页面必须将以下情况分开:

情况展示语义
有命中matched,只返回 Grant 允许的非空判别 Item
已验证当前、已支持范围完整且授权足以作否定证明not_found;空列表,且不把结论扩展到未支持源领域
无完成 Snapshot、Guard 不可用、Stale/Gap/Pending、范围未支持或潜在越权inconclusive;显示“当前无法判定”,不把空列表伪装成不存在
v1 带合法 Operation可进入详情但为 Partial:缺少 Request/Access/Model 等自包含字段
v1 缺少 Operationlegacy_run_only 受限摘要,不生成假 Operation,也不进入 Explorer
尚无完成 Snapshot / Guard 不可用verificationState=unverified,Snapshot/Integrity 显式为空,不显示绿色完整结论
Outbox 有事件、投影尚未应用投影延迟,并显示 Event、Delivery 与 Receipt 状态
Revision Gap数据不完整,停止声称该聚合已连续投影
Edge Observation 缺失未观测;不代表该 HTTP 尝试没有发生
Telemetry 无命中无诊断线索;不代表业务事实不存在
后续领域尚未接入本阶段未实现,而不是“成功”或“失败”

每个详情响应都携带同一个严格OperationsQueryMetadata@1projectionNameprojectionVersiongeneratedAt、可空时间的freshnessverificationStateprojectionCompletenesssnapshotCurrency、可并存的limitations[]、逐阶段sectionSupport以及observationEvidencefreshness.status必须逐字等于snapshotCurrencyverified_current|stale要求非空lastVerifiedAt且等于本次currentGuard.evaluatedAtunverified固定freshness.status=unknown + lastVerifiedAt=nullverificationState=verified时要求非空completenessAsOf + integrity@2snapshotProof显示历史Snapshot的Event/Accepted Observation Set Digest/Count/Receipt Anti-join、Mandatory Delivery Definition Set Digest/Definition Count与按授权返回的完整排序Definition四元组成员、逐坐标Definition绑定/状态Set Digest/Count/Non-terminal Count、Gap、Quarantine、Unsupported Schema与Semantic Check,currentGuard独立显示本次查询的相同现场输入、equal|changed与版本化Guard Digest。同一Snapshot可以跨Definition切换,页面不能用当前Registry中的单一Definition覆盖历史集合。顶层完整性只依据Current Guard,不能压成一个总Missing Count或拿旧Proof冒充当前。unverified时必须显示completenessAsOf=null + integrity=null + snapshotCurrency=unknown + projectionCompleteness=unknown + verificationReasonruntimeSummary同时只能是Unavailable而不能填零。具体Definition成员/Missing/Gap/Quarantine/Schema/失败参数只在Grant允许相应Tenant/Resource/Field时显示。旧v1的partial_legacy_event与尚未接入阶段的not_yet_supported进入limitations[]/sectionSupport,不得被单值状态吞掉。

Snapshot 只证明 completenessAsOf;Query 必须在一个只读一致性事务内,把当前全部证明输入和 Snapshot Manifest 精确比较。全部不变才显示 verified + verified_current;存在完成且定义可比的 Snapshot、Guard 确认变化时显示 verified + stale,确定 Gap 对应 partial_source_gap,无确定 Gap 对应 unknown,Stale 不得显示 Complete。没有完成 Snapshot、定义不可比或 Guard 无法执行/比较时显示 unverified + unknown 及明确原因。页面不能沿用旧绿色结论,也不返回或展示全局递增位置、标量水位等虚假完整性指标。阈值来自部署配置、SLO 和容量验证,页面不内置拍脑袋的固定秒数。

首期交互

第一版仅允许:

  • 复制允许公开或内部共享的稳定 ID;
  • 在权限允许时打开受控 Trace/Log 引用;
  • 查看投影/投递状态与脱敏失败原因;
  • 生成不持久化的 Incident/Reconciliation 预填跳转链接或复制证据引用;本期不创建 Case 记录,也不执行处置。

不提供重试、强制成功、改状态、释放 Reservation、重放 Event、编辑账本或任意 SQL/HTTP 工具。写能力必须等 Admin Command Gateway 的职责分离、影响预览、审批、幂等和 Audit 独立验收。

首期验收

  • 精确输入首次成功 requestIdoperationIdcorrelationIdrunIdreservationIdeventId 能收敛到同一 Operation 详情;observationIderrorId 和准入前 requestId 在相应 Accepted Source 存在时按 associationTrust 返回正确分支。v1 有 Operation/无 Operation 分别得到 operation_linked + partial_legacy_eventlegacy_run_only;错标 Tenant/Run 不污染 Operation,未验证 Claim 不被 Tenant-scoped Grant 命中。测试必须拒绝非法 Type/Namespace、空 matched、非空 not_found/inconclusivenot_found + positive_match_onlynot_found + 非 verified_current/complete;Request/Error/Auto/首期 Observation 的 miss 为 inconclusive + negative_proof_unavailable,Snapshot/Guard/范围不足或潜在越权同样得到不可枚举的 inconclusive
  • 重复和乱序投递不会产生重复节点;Revision Gap 明确可见。
  • claimed time 与 acceptedAt 反序、位于未来或跨过 Retention 边界时,Observation 顺序、Summary 首次/最近时间、健康窗口、Retention 与 Freshness 都保持由 acceptedAt 决定;claimed time 只显示在 Timeline,相同 acceptedAtobservationId 稳定排序。
  • run.created@1.0limitations[] 显示 partial_legacy_event,不从 Core 业务表或日志猜补缺失字段;它可以同时拥有独立的 projectionCompleteness=partial_source_gap
  • 投影延迟、Observation 缺失、Telemetry 缺失与业务不存在使用不同状态。
  • 跨租户查询不泄露对象存在性;Actor Assertion 的唯一 Issuer、Audience、Workload/Request Binding 与一次性 JTI 消费均验证,只有 Core 能签发 Workforce Grant,敏感查询 Audit fail-closed。
  • Host-only Session 不离开 Admin BFF;Grant 绑定呈递 Workload,响应不缓存且不被前端遥测采集。
  • 页面没有 Prompt、输入正文、Secret/Credential Digest、Request Fingerprint、JWT、完整 Manifest 或 Provider 私有路由。integrity@2 的 Snapshot/Guard Source Digest 属于独立受控完整性分类:普通页面只显示校验状态与截断标识,只有 Grant 明确包含 operations.integrity.digest:read 才能复制完整值;它不得被当作 Credential、输入或 Provider Payload 摘要。
  • 时间线只推进到当前已验证的最远权威边界:没有后续证据时准确停在reserved;存在严格Accepted Gateway诊断或Billing经济边界时按其证据类型显示,仍不得把Observation冒充执行/结算事实,Asset等未接入阶段保持not_yet_supported
  • 所有页面均显示 Projection Version、新鲜度、verificationState + snapshotCurrency + projectionCompleteness + limitations[] + sectionSupport 和 accepted health windows;freshness.status == snapshotCurrency,Verified的lastVerifiedAt == currentGuard.evaluatedAt,Unverified的lastVerifiedAt=nullverified 才显示非空 completenessAsOf + integrity@2.snapshotProof/currentGuardunverified 显示空值与原因。完整/裁剪/无 Snapshot DTO 通过 Schema round-trip 和越权明细负测,Freshness/Currency错配、验证时间缺失/错绑也必须拒绝。测试覆盖 Snapshot 完整但 Current Guard 出现 Gap、Snapshot 有 Gap但 Current Guard 已修复、pending→ack、Gap/Quarantine 修复后先 Stale/Unknown、再由新 Snapshot 收敛,并统一使用五值 evidenceKind,后者不冒充 Edge 请求全集。
  • Search/Explorer/Projection Status的Request/Response Golden、Canonical Bytes与生成类型和Core逐字节一致;未知字段、联合分支混合、Count与数组不等、Action Count错配、Mandatory Delivery Definition四元组裁剪、跨Definition Snapshot成员/坐标丢失、经济边界缺runStepId或跨Step重绑全部拒绝。Cursor错Endpoint/Section/Scope/Projection/Grant、过期或篡改必须fail closed且不泄露下一页/对象存在性;无Current Guard不得返回Runtime Count。BFF不得重塑、默认补值或把Redaction裁成半联合。
  • 页面和 Query BFF 全部只读,公网 PUBLIC_ADMISSION_MODE 继续保持关闭。

On this page