@sema-agent/server 7.132.0 → 7.133.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/MIGRATION.md +266 -0
- package/README.md +8 -9
- package/README.zh-CN.md +7 -6
- package/USAGE.md +174 -55
- package/deploy/sema-up/README.md +19 -1
- package/deploy/sema-up/chart/templates/server-v4pro.yaml +5 -2
- package/deploy/sema-up/chart/templates/server.yaml +5 -2
- package/deploy/sema-up/stack/compose.yaml +3 -0
- package/deploy/sema-up/stack/sema-stack-cluster.yaml +4 -2
- package/dist/adoption/plan.d.ts +3 -2
- package/dist/adoption/plan.js +7 -5
- package/dist/adoption/runner.js +3 -10
- package/dist/adoption/sql.d.ts +3 -2
- package/dist/adoption/sql.js +3 -5
- package/dist/adoption/wire.d.ts +4 -1
- package/dist/adoption/wire.js +1 -0
- package/dist/approval-ask-audit-store.d.ts +31 -13
- package/dist/approval-ask-audit-store.js +272 -74
- package/dist/approval-ask-machine.d.ts +15 -0
- package/dist/approval-ask-machine.js +6 -0
- package/dist/approval-ask-retention.d.ts +136 -0
- package/dist/approval-ask-retention.js +102 -0
- package/dist/approval-card.d.ts +79 -19
- package/dist/approval-card.js +44 -13
- package/dist/approval-deny-reasons.d.ts +1 -1
- package/dist/approval.d.ts +9 -0
- package/dist/approval.js +24 -3
- package/dist/audit.d.ts +27 -10
- package/dist/audit.js +12 -16
- package/dist/bake-runner/main.js +3 -2
- package/dist/boot/deferred-sandbox-path-env.js +1 -1
- package/dist/boot/execution-env.js +9 -7
- package/dist/boot/execution-lane.js +11 -0
- package/dist/boot/leader.js +2 -0
- package/dist/boot/memory-boundary.js +2 -2
- package/dist/boot/memory-consolidation.d.ts +5 -4
- package/dist/boot/memory-consolidation.js +7 -6
- package/dist/boot/org-delivery.d.ts +28 -0
- package/dist/boot/org-delivery.js +20 -0
- package/dist/boot/reapers.d.ts +3 -0
- package/dist/boot/reapers.js +21 -1
- package/dist/boot/resolve-spec.d.ts +3 -0
- package/dist/boot/resolve-spec.js +60 -81
- package/dist/boot/runner-deps.js +1 -0
- package/dist/boot/session-faces.d.ts +1 -0
- package/dist/boot/session-faces.js +4 -2
- package/dist/boot/stage-02-web-admin-pull.js +4 -1
- package/dist/boot/stage-06-runners.d.ts +2 -0
- package/dist/boot/stage-06-runners.js +6 -3
- package/dist/boot/stage-07-capability-layer.d.ts +2 -0
- package/dist/boot/stage-07-capability-layer.js +24 -3
- package/dist/boot/stage-08-reapers.d.ts +2 -0
- package/dist/boot/stage-08-reapers.js +2 -2
- package/dist/boot/stage-09-leader.d.ts +3 -0
- package/dist/boot/stage-10-http-server.d.ts +3 -0
- package/dist/boot/stage-10-http-server.js +5 -6
- package/dist/boot/stores.js +2 -2
- package/dist/boot/web-admin.d.ts +4 -0
- package/dist/boot/web-admin.js +151 -63
- package/dist/boot/workflow-orchestration.d.ts +2 -0
- package/dist/boot/workflow-orchestration.js +2 -1
- package/dist/brain.js +8 -3
- package/dist/breaker-key.d.ts +6 -0
- package/dist/breaker-key.js +29 -0
- package/dist/caller-text-echo.d.ts +9 -6
- package/dist/caller-text-echo.js +8 -11
- package/dist/capabilities/center-plugins.d.ts +7 -0
- package/dist/capabilities/center-plugins.js +1 -1
- package/dist/capabilities/composite-members.d.ts +1 -1
- package/dist/capabilities/composite-members.js +1 -1
- package/dist/capabilities/execution-lane.js +2 -2
- package/dist/capabilities/hands-lane.d.ts +21 -0
- package/dist/capabilities/hands-lane.js +10 -0
- package/dist/capabilities/mcp-probe.d.ts +36 -4
- package/dist/capabilities/mcp-probe.js +27 -4
- package/dist/capabilities/scenarios.d.ts +63 -7
- package/dist/capabilities/scenarios.js +39 -7
- package/dist/capability-facts.d.ts +34 -4
- package/dist/capability-facts.js +28 -2
- package/dist/center-config-tier.d.ts +69 -0
- package/dist/center-config-tier.js +42 -0
- package/dist/checkpoint-identity.d.ts +16 -0
- package/dist/checkpoint-identity.js +19 -0
- package/dist/config-catalog.d.ts +17 -10
- package/dist/config-catalog.js +43 -28
- package/dist/config-d-migration.d.ts +3 -1
- package/dist/config-d-migration.js +2 -2
- package/dist/config-dir-trust.d.ts +114 -0
- package/dist/config-dir-trust.js +388 -0
- package/dist/config-invariants.d.ts +18 -5
- package/dist/config-invariants.js +35 -3
- package/dist/config-provider.d.ts +6 -1
- package/dist/config-provider.js +6 -2
- package/dist/config-types.d.ts +71 -14
- package/dist/config-types.js +8 -0
- package/dist/config.d.ts +13 -0
- package/dist/config.js +121 -59
- package/dist/delegated-session-owner.d.ts +185 -0
- package/dist/delegated-session-owner.js +119 -0
- package/dist/device-protocol.d.ts +5 -3
- package/dist/device-protocol.js +1 -1
- package/dist/device-ws-hub.js +21 -2
- package/dist/device-ws-protocol.d.ts +70 -6
- package/dist/device-ws-protocol.js +50 -23
- package/dist/elicitation.js +3 -2
- package/dist/entry-problems.d.ts +34 -0
- package/dist/entry-problems.js +14 -0
- package/dist/execution-lane-caps.d.ts +49 -10
- package/dist/execution-lane-caps.js +43 -4
- package/dist/field-conflict.d.ts +43 -0
- package/dist/field-conflict.js +20 -0
- package/dist/fleet/fleet-bus.d.ts +80 -6
- package/dist/fleet/fleet-bus.js +41 -9
- package/dist/hooks/classic-stations.d.ts +10 -5
- package/dist/hooks/classic-stations.js +4 -4
- package/dist/hooks/command-spawn.d.ts +57 -0
- package/dist/hooks/command-spawn.js +139 -0
- package/dist/hooks/hook-llm.js +2 -2
- package/dist/hooks/hook-runner.d.ts +127 -25
- package/dist/hooks/hook-runner.js +668 -287
- package/dist/hooks/hook-source.d.ts +44 -0
- package/dist/hooks/hook-source.js +40 -0
- package/dist/http/active-run-conflict.d.ts +5 -13
- package/dist/http/active-run-conflict.js +17 -27
- package/dist/http/admission.js +103 -60
- package/dist/http/approval-sweeps.js +55 -18
- package/dist/http/caller-trust.d.ts +77 -0
- package/dist/http/caller-trust.js +143 -0
- package/dist/http/checkpoint-ctx.d.ts +16 -16
- package/dist/http/checkpoint-ctx.js +13 -10
- package/dist/http/claimed-run.d.ts +4 -3
- package/dist/http/device-placement.d.ts +2 -4
- package/dist/http/device-placement.js +2 -1
- package/dist/http/dispatch.js +10 -4
- package/dist/http/durable-run-leg.d.ts +4 -32
- package/dist/http/durable-run-leg.js +34 -10
- package/dist/http/owner-access.d.ts +56 -0
- package/dist/http/owner-access.js +42 -0
- package/dist/http/principal-gate.d.ts +48 -23
- package/dist/http/principal-gate.js +39 -12
- package/dist/http/readiness.d.ts +11 -5
- package/dist/http/readiness.js +10 -3
- package/dist/http/request-guards.d.ts +16 -23
- package/dist/http/request-guards.js +30 -15
- package/dist/http/resume-ctx-read.d.ts +2 -5
- package/dist/http/resume-ctx-read.js +7 -4
- package/dist/http/resume-legs.d.ts +3 -4
- package/dist/http/resume-legs.js +126 -69
- package/dist/http/retired-service-deps.d.ts +43 -0
- package/dist/http/retired-service-deps.js +18 -0
- package/dist/http/route-ctx.d.ts +44 -28
- package/dist/http/route-ctx.js +4 -0
- package/dist/http/route-table.js +2 -0
- package/dist/http/routes/a2a-serve.js +3 -4
- package/dist/http/routes/admin-config-refresh.js +1 -1
- package/dist/http/routes/admin-drain.js +1 -1
- package/dist/http/routes/admin-memory-optout.js +5 -1
- package/dist/http/routes/adoption.js +2 -9
- package/dist/http/routes/approvals-assistant.js +49 -48
- package/dist/http/routes/background.js +3 -2
- package/dist/http/routes/capabilities.js +20 -4
- package/dist/http/routes/config-catalog.d.ts +3 -3
- package/dist/http/routes/config-catalog.js +1 -1
- package/dist/http/routes/devices.js +3 -17
- package/dist/http/routes/diagnostics.js +5 -1
- package/dist/http/routes/images.js +6 -7
- package/dist/http/routes/leader.js +1 -8
- package/dist/http/routes/mcp-reconnect.d.ts +1 -1
- package/dist/http/routes/mcp-reconnect.js +3 -2
- package/dist/http/routes/memory-bundle.js +1 -1
- package/dist/http/routes/memory-compliance.js +1 -1
- package/dist/http/routes/memory-consolidation.js +1 -1
- package/dist/http/routes/memory-origin.js +1 -1
- package/dist/http/routes/memory-policy.d.ts +1 -1
- package/dist/http/routes/memory-policy.js +3 -2
- package/dist/http/routes/notify-wake.js +8 -21
- package/dist/http/routes/observability.js +2 -2
- package/dist/http/routes/principal-inbox.d.ts +39 -0
- package/dist/http/routes/principal-inbox.js +76 -0
- package/dist/http/routes/retention-ops.js +2 -9
- package/dist/http/routes/rules.js +5 -18
- package/dist/http/routes/runs.d.ts +5 -0
- package/dist/http/routes/runs.js +33 -106
- package/dist/http/routes/session-sync.js +15 -28
- package/dist/http/routes/sessions.js +30 -40
- package/dist/http/routes/side-query.js +6 -4
- package/dist/http/routes/tasks.js +50 -14
- package/dist/http/routes/workflows.d.ts +351 -0
- package/dist/http/routes/workflows.js +153 -119
- package/dist/http/send.d.ts +24 -3
- package/dist/http/send.js +14 -2
- package/dist/http/server.d.ts +17 -18
- package/dist/http/server.js +15 -13
- package/dist/http/stored-body-replay.js +17 -4
- package/dist/http/submit-ctx.js +4 -3
- package/dist/http/submit-replay.d.ts +4 -3
- package/dist/http/submit-replay.js +5 -4
- package/dist/http/wire-types.d.ts +10 -7
- package/dist/index.d.ts +1 -1
- package/dist/index.js +0 -1
- package/dist/lane-home-probe.d.ts +78 -9
- package/dist/lane-home-probe.js +78 -12
- package/dist/leader/endpoint.d.ts +4 -1
- package/dist/leader/endpoint.js +11 -10
- package/dist/limit-refusal.d.ts +17 -5
- package/dist/limit-refusal.js +4 -1
- package/dist/mcp-assertion-header.d.ts +31 -10
- package/dist/mcp-assertion-header.js +10 -3
- package/dist/mcp-tool-faces.js +1 -3
- package/dist/memory-project-layer.d.ts +37 -0
- package/dist/memory-project-layer.js +46 -0
- package/dist/memory-scope.d.ts +23 -16
- package/dist/memory-scope.js +24 -8
- package/dist/memory-sync-client.d.ts +27 -13
- package/dist/memory-sync-client.js +107 -18
- package/dist/model-entry-refusal.d.ts +9 -1
- package/dist/model-entry-refusal.js +6 -1
- package/dist/model-plane-face.d.ts +51 -0
- package/dist/model-plane-face.js +24 -0
- package/dist/model-provider.d.ts +5 -0
- package/dist/model-provider.js +4 -2
- package/dist/model-route-endpoint.d.ts +8 -11
- package/dist/model-route-endpoint.js +4 -7
- package/dist/model-route-env.d.ts +22 -0
- package/dist/model-route-env.js +2 -0
- package/dist/model-route-gap.d.ts +60 -30
- package/dist/model-route-gap.js +21 -15
- package/dist/observability/corrupt-read-seat.d.ts +7 -0
- package/dist/observability/corrupt-read-seat.js +9 -0
- package/dist/observability/err-text.d.ts +6 -0
- package/dist/observability/err-text.js +18 -4
- package/dist/observability/fail-open.d.ts +35 -9
- package/dist/observability/fail-open.js +35 -9
- package/dist/observability/metrics.js +1 -0
- package/dist/observability/prompt-manifest.d.ts +3 -17
- package/dist/observability/prompt-manifest.js +45 -42
- package/dist/observability/tool-trace.js +9 -9
- package/dist/operator-ask.d.ts +10 -0
- package/dist/operator-ask.js +3 -0
- package/dist/orchestration/workflow-agent-session-index.d.ts +12 -12
- package/dist/orchestration/workflow-agent-session-index.js +9 -13
- package/dist/orchestration/workflow-completion-inbox.d.ts +42 -15
- package/dist/orchestration/workflow-completion-inbox.js +13 -0
- package/dist/orchestration/workflow-notify-journal.d.ts +13 -32
- package/dist/orchestration/workflow-notify-journal.js +27 -34
- package/dist/orchestration/workflow-park-decision.d.ts +89 -0
- package/dist/orchestration/workflow-park-decision.js +118 -0
- package/dist/org-delivery-gate.d.ts +81 -0
- package/dist/org-delivery-gate.js +59 -0
- package/dist/panel-tool-names.d.ts +23 -0
- package/dist/panel-tool-names.js +8 -0
- package/dist/parked-decide.d.ts +39 -6
- package/dist/parked-decide.js +98 -51
- package/dist/parked-revive-surface.d.ts +9 -2
- package/dist/parked-revive-surface.js +11 -8
- package/dist/permission-rule-list.d.ts +1 -1
- package/dist/permission-rule-list.js +2 -2
- package/dist/plugins/approval-ask-store-file.d.ts +16 -1
- package/dist/plugins/approval-ask-store-file.js +21 -0
- package/dist/plugins/approval-ask-store-memory.d.ts +18 -1
- package/dist/plugins/approval-ask-store-memory.js +34 -2
- package/dist/plugins/approval-ask-store-sql.d.ts +25 -0
- package/dist/plugins/approval-ask-store-sql.js +37 -1
- package/dist/plugins/blob-backend.d.ts +38 -25
- package/dist/plugins/blob-backend.js +29 -19
- package/dist/plugins/breaker-state-sql.d.ts +2 -2
- package/dist/plugins/breaker-state-sql.js +4 -4
- package/dist/plugins/caching-session-store.d.ts +3 -0
- package/dist/plugins/caching-session-store.js +3 -0
- package/dist/plugins/checkpoint-store-sql.d.ts +14 -0
- package/dist/plugins/checkpoint-store-sql.js +20 -2
- package/dist/plugins/file-history-store-sql.d.ts +5 -2
- package/dist/plugins/file-history-store-sql.js +3 -1
- package/dist/plugins/file-run-store.d.ts +5 -13
- package/dist/plugins/file-run-store.js +9 -0
- package/dist/plugins/fork-routing-session-store.d.ts +9 -1
- package/dist/plugins/fork-routing-session-store.js +12 -1
- package/dist/plugins/host-platform.d.ts +2 -0
- package/dist/plugins/host-platform.js +2 -1
- package/dist/plugins/local-checkpoint-store.d.ts +2 -0
- package/dist/plugins/local-checkpoint-store.js +6 -1
- package/dist/plugins/local-session-store.d.ts +1 -1
- package/dist/plugins/local-session-window.d.ts +39 -0
- package/dist/plugins/local-session-window.js +54 -0
- package/dist/plugins/mailbox-recipient-lifecycle.d.ts +3 -2
- package/dist/plugins/mailbox-store-sql.d.ts +30 -48
- package/dist/plugins/mailbox-store-sql.js +77 -52
- package/dist/plugins/memory-embedder-fingerprint.js +2 -1
- package/dist/plugins/memory-run-store.d.ts +5 -13
- package/dist/plugins/memory-run-store.js +8 -0
- package/dist/plugins/one-time-migrations.d.ts +110 -5
- package/dist/plugins/one-time-migrations.js +320 -8
- package/dist/plugins/org-delivery-quota-store.d.ts +123 -0
- package/dist/plugins/org-delivery-quota-store.js +228 -0
- package/dist/plugins/pg-pool.js +39 -7
- package/dist/plugins/pg-session-storage.d.ts +17 -4
- package/dist/plugins/pg-session-storage.js +29 -6
- package/dist/plugins/remote-env-adb.d.ts +6 -12
- package/dist/plugins/remote-env-adb.js +12 -2
- package/dist/plugins/remote-env-k8s.d.ts +8 -12
- package/dist/plugins/remote-env-k8s.js +23 -5
- package/dist/plugins/remote-env-local-docker.d.ts +10 -15
- package/dist/plugins/remote-env-local-docker.js +12 -9
- package/dist/plugins/remote-env-ssh.d.ts +10 -16
- package/dist/plugins/remote-env-ssh.js +17 -11
- package/dist/plugins/run-store-sql.d.ts +16 -14
- package/dist/plugins/run-store-sql.js +22 -2
- package/dist/plugins/schema-indexes.js +2 -0
- package/dist/plugins/send-user-file.js +2 -2
- package/dist/plugins/session-epoch-anchor.d.ts +32 -6
- package/dist/plugins/session-epoch-anchor.js +2 -3
- package/dist/plugins/session-store.d.ts +18 -8
- package/dist/plugins/session-store.js +15 -4
- package/dist/plugins/sql-driver.d.ts +74 -11
- package/dist/plugins/sql-driver.js +210 -12
- package/dist/plugins/sql-errors.d.ts +23 -0
- package/dist/plugins/sql-errors.js +21 -0
- package/dist/plugins/store-backend.d.ts +36 -1
- package/dist/plugins/store-backend.js +40 -14
- package/dist/plugins/store-contracts.d.ts +42 -0
- package/dist/plugins/store-contracts.js +1 -0
- package/dist/plugins/tidb-pool.d.ts +6 -1
- package/dist/plugins/tidb-pool.js +44 -10
- package/dist/plugins/tidb-session-storage.d.ts +3 -2
- package/dist/plugins/tidb-session-storage.js +2 -2
- package/dist/plugins/tidb-session-store.d.ts +24 -4
- package/dist/plugins/tidb-session-store.js +28 -4
- package/dist/plugins/workflow-journal-store-sql.d.ts +73 -19
- package/dist/plugins/workflow-journal-store-sql.js +19 -6
- package/dist/plugins/workflow-run-store-sql.d.ts +30 -8
- package/dist/plugins/workflow-run-store-sql.js +50 -9
- package/dist/posture-source.d.ts +18 -10
- package/dist/posture-source.js +4 -1
- package/dist/project-identity.d.ts +45 -6
- package/dist/project-identity.js +162 -8
- package/dist/project-layer-key.d.ts +28 -0
- package/dist/project-layer-key.js +29 -0
- package/dist/question.js +3 -2
- package/dist/read-deny-entry.d.ts +25 -0
- package/dist/read-deny-entry.js +12 -0
- package/dist/read-face-posture.d.ts +37 -11
- package/dist/read-face-posture.js +32 -3
- package/dist/request-key-closure.d.ts +7 -0
- package/dist/request-key-closure.js +9 -1
- package/dist/request-value-closure.d.ts +5 -0
- package/dist/request-value-closure.js +11 -3
- package/dist/rule-entry-list.d.ts +26 -2
- package/dist/rule-entry-list.js +72 -12
- package/dist/rules-consent.js +3 -4
- package/dist/run-acceptance.d.ts +19 -3
- package/dist/run-acceptance.js +13 -1
- package/dist/run-local.js +36 -6
- package/dist/runs.d.ts +10 -9
- package/dist/runs.js +21 -3
- package/dist/runtime-caps-resolver.d.ts +16 -6
- package/dist/runtime-caps-resolver.js +18 -5
- package/dist/sandbox-pkg-source.d.ts +19 -1
- package/dist/sandbox-pkg-source.js +29 -7
- package/dist/security.d.ts +87 -9
- package/dist/security.js +52 -9
- package/dist/session-error-wire.d.ts +19 -2
- package/dist/session-error-wire.js +5 -1
- package/dist/session-titled-frame.d.ts +33 -0
- package/dist/session-titled-frame.js +4 -0
- package/dist/session-titler.d.ts +9 -1
- package/dist/session-titler.js +15 -4
- package/dist/spec-fields.js +21 -2
- package/dist/sql-engine-posture.d.ts +3 -1
- package/dist/task-cwd.d.ts +1 -1
- package/dist/task-mcp.d.ts +3 -3
- package/dist/task-mcp.js +7 -66
- package/dist/task-settings.d.ts +89 -88
- package/dist/task-settings.js +71 -63
- package/dist/text-bidi.d.ts +0 -4
- package/dist/text-bidi.js +1 -3
- package/dist/tighten-only-seats.d.ts +150 -0
- package/dist/tighten-only-seats.js +196 -0
- package/dist/tool-approval.d.ts +303 -87
- package/dist/tool-approval.js +623 -239
- package/dist/trace/core-keyset-guard.d.ts +104 -22
- package/dist/trace/exit-seat.d.ts +28 -0
- package/dist/trace/exit-seat.js +76 -0
- package/dist/trace/ledger-events.d.ts +3 -2
- package/dist/trace/project.d.ts +80 -12
- package/dist/trace/project.js +41 -28
- package/dist/trace/projection-table.d.ts +100 -0
- package/dist/trace/projection-table.js +130 -0
- package/dist/trace/redact.d.ts +54 -0
- package/dist/trace/redact.js +778 -152
- package/dist/trace/self-minted-wire.d.ts +345 -1
- package/dist/trace/self-minted-wire.js +117 -1
- package/dist/trace/wire-projection-faces.d.ts +298 -2
- package/dist/trace/wire-projection-faces.js +154 -13
- package/dist/url-refusal.js +2 -0
- package/dist/web-admin-client/apply-effective.d.ts +12 -0
- package/dist/web-admin-client/apply-effective.js +56 -5
- package/dist/web-admin-client/facade.d.ts +1 -1
- package/dist/web-admin-client/facade.js +1 -1
- package/dist/web-admin-client/read-face.js +5 -9
- package/dist/web-admin-client/skills-mcp.js +4 -5
- package/docs/DEVICE-EXECUTOR-PROTOCOL.md +57 -9
- package/package.json +7 -3
|
@@ -1,11 +1,33 @@
|
|
|
1
|
-
import { type ModelRouteEndpointVerdict, type ModelRouteGapBreach } from "./model-route-endpoint.js";
|
|
2
1
|
/**
|
|
3
|
-
*
|
|
4
|
-
*
|
|
2
|
+
* **env 模型路由读数的唯一读口**:`readModelRouteEnv(env)`、env 腿的条目表 `envLaneTable`,与车道值级端口 `laneAndEndpointFor`。
|
|
3
|
+
*
|
|
4
|
+
* ## 形(一只读口、一处调用)
|
|
5
|
+
* 「env 里哪几把键是模型路由、空串 = 未设、provider 的显式 / 推断 / 缺省、env 腿铸哪几个条目槽」的读法只在这里:
|
|
6
|
+
* · {@link readModelRouteEnv}:`parseModelDomain`(`config.ts`,起服铸 `ServiceConfig` 的路由字段)吃它的读数(`process.env` 与测试快照是同一个入参位);
|
|
7
|
+
* · {@link envLaneTable}:env 腿的条目名与键序(`parseModelDomain` 铸真 `Model` 表经它);
|
|
8
|
+
* · {@link laneAndEndpointFor}:值级端口 —— 「这只模型在这张路由表上走哪条车道、这条车道的端点 / 凭据取哪一对 env 键」。车道只经 `brainLaneFor`
|
|
9
|
+
* (core `brainLaneOf` 对路由表的答案)取,键名取 {@link MODEL_ROUTE_ENV_KEYS};**只交键名不交值**。
|
|
10
|
+
* 路由判据本身(「将要服务的那张表里每条 openai 兼容路由是否解析得到端点」)不在这里:唯一属主是 `model-route-endpoint.ts` 的 `judgeModelRouteEndpoint`,
|
|
11
|
+
* 起服段与 `GET /v1/models.modelPlane` 经 `judgeServedModelRoute` 问它 —— 它们判的是**将要服务的那张表**(env 表或目录表),不是本文件读出的 env 视图。
|
|
12
|
+
*
|
|
13
|
+
* ## 对外
|
|
14
|
+
* 本模块的精选再导出是子路径 `@sema-agent/server/model-route-env`(`src/model-route-env.ts`):引擎 core 是 BYOM(只吃调用方给的路由表,不读这些键),
|
|
15
|
+
* 别仓要在引擎起之前回答「走哪条车道、端点 / 凭据取哪一对键」,读这一只,不各抄一份键名与车道判。
|
|
16
|
+
*
|
|
17
|
+
* ## 纯
|
|
18
|
+
* 不读 `process.env`、不读文件、不枚举快照 —— 只按 {@link MODEL_ROUTE_ENV_KEYS} 点名取值(依赖闭包里没有 `node:*` / `process`,
|
|
19
|
+
* `test/model-route-env-reading.test.ts` 钉)。同入同出;返回值是新对象。provider 词域外的值在这里按引擎派发的口径读作网关腿(`brainLaneFor`:域外词的路由表里没有那个键 ⇒ 引擎路由器落网关 fallback),不在此拒(域外拒启是 `model-provider-word` 那条不变量的事)。
|
|
20
|
+
*/
|
|
21
|
+
import { type ModelBrainLane } from "./model-provider.js";
|
|
22
|
+
/**
|
|
23
|
+
* 路由读数读的九把 env 键(**闭表**;{@link readModelRouteEnv} 只碰这几把,测试用代理钉「读集 ⊆ 本表」)。
|
|
24
|
+
* 配置目录的 D1 对账门把 {@link readModelRouteEnv} 的调用当作这九把键的读点(`test/config-catalog.test.ts` 的 `DELEGATED_ENV_READERS`,键集取本表,不手抄);
|
|
25
|
+
* 表与配置目录的 `modelPlane` 域同源(`test/model-route-env-port.test.ts` 对拍:表里每把键是目录的一行、目录里该域的端点 / 凭据行都在表里)。
|
|
5
26
|
*/
|
|
6
27
|
export declare const MODEL_ROUTE_ENV_KEYS: {
|
|
7
28
|
readonly gatewayBaseUrl: "MODEL_GATEWAY_BASEURL";
|
|
8
29
|
readonly gatewayFallbackUrls: "MODEL_GATEWAY_FALLBACK_URLS";
|
|
30
|
+
readonly gatewayApiKey: "MODEL_API_KEY";
|
|
9
31
|
readonly provider: "MODEL_PROVIDER";
|
|
10
32
|
readonly mainId: "MODEL_ID";
|
|
11
33
|
readonly cheapId: "MODEL_CHEAP_ID";
|
|
@@ -36,6 +58,12 @@ export interface ModelRouteEnvReading {
|
|
|
36
58
|
readonly gatewayBaseUrl: string | undefined;
|
|
37
59
|
/** `MODEL_GATEWAY_FALLBACK_URLS` 逐项 trim、丢空项。 */
|
|
38
60
|
readonly gatewayFallbackUrls: string[];
|
|
61
|
+
/**
|
|
62
|
+
* `MODEL_API_KEY`(网关腿的部署级凭据):**原样**读 —— 与其余各把不同,空串**不**折成未设。brain 装配以**真值**判这把凭据发不发(空串部署一个凭据字节都不发),
|
|
63
|
+
* 起服铸的 `ServiceConfig.gatewayApiKey` 逐字保留空串(compose 的 `${VAR:-}` 模板与空 Secret 挂载天天产它);读数改折叠会改变那一位。
|
|
64
|
+
* 它只与网关端点配对(没有 {@link gatewayBaseUrl} 就不装载),配对由消费方判。
|
|
65
|
+
*/
|
|
66
|
+
readonly gatewayApiKey: string | undefined;
|
|
39
67
|
/** `ANTHROPIC_API_KEY` / `ANTHROPIC_AUTH_TOKEN` / `ANTHROPIC_BASE_URL`:空串 = 未设,别名各自独立(一个空别名不遮蔽另一个)。 */
|
|
40
68
|
readonly anthropicApiKey: string | undefined;
|
|
41
69
|
readonly anthropicAuthToken: string | undefined;
|
|
@@ -59,7 +87,7 @@ export interface ModelRouteEnvReading {
|
|
|
59
87
|
export declare const csvOf: (raw: string | undefined) => string[];
|
|
60
88
|
/**
|
|
61
89
|
* **env 模型路由读数的唯一读口**(纯:按 {@link MODEL_ROUTE_ENV_KEYS} 点名取值,不读 `process.env`,不枚举入参)。
|
|
62
|
-
* `parseModelDomain`(起服铸 `ServiceConfig`)
|
|
90
|
+
* `parseModelDomain`(起服铸 `ServiceConfig`)吃它的读数。
|
|
63
91
|
*/
|
|
64
92
|
export declare function readModelRouteEnv(env: ModelRouteEnv): ModelRouteEnvReading;
|
|
65
93
|
/**
|
|
@@ -69,36 +97,38 @@ export declare function readModelRouteEnv(env: ModelRouteEnv): ModelRouteEnvRead
|
|
|
69
97
|
export declare function envLaneTable<M extends {
|
|
70
98
|
readonly id: string;
|
|
71
99
|
}>(mainId: string, main: M, cheap: M | undefined): Record<string, M>;
|
|
72
|
-
/**
|
|
73
|
-
export
|
|
100
|
+
/** 键表里的一把 env 键的名字(闭集字面量并集:加键 / 改名 ⇒ 消费方的穷举处编译红)。 */
|
|
101
|
+
export type ModelRouteEnvName = (typeof MODEL_ROUTE_ENV_KEYS)[keyof typeof MODEL_ROUTE_ENV_KEYS];
|
|
102
|
+
/** {@link laneAndEndpointFor} 问的那只模型:只读它的 route 词 `provider`(`Model` / 目录条目 / `{ provider }` 都结构满足)。 */
|
|
103
|
+
export interface ModelRouteSubject {
|
|
104
|
+
readonly provider?: string | undefined;
|
|
105
|
+
}
|
|
106
|
+
/** {@link laneAndEndpointFor} 的答案:**键名**与在场性,不含任何 env 值。 */
|
|
107
|
+
export interface LaneAndEndpoint {
|
|
108
|
+
/** 这只模型在这张路由表上落哪条 brain 腿(引擎路由器对同一只表的答案)。 */
|
|
109
|
+
readonly lane: ModelBrainLane;
|
|
110
|
+
/** 这条腿的端点那把 env 键:网关腿 `MODEL_GATEWAY_BASEURL`、anthropic 腿 `ANTHROPIC_BASE_URL`。值由调用方自己从 env 取。 */
|
|
111
|
+
readonly endpointEnvName: ModelRouteEnvName;
|
|
112
|
+
/**
|
|
113
|
+
* 这把端点键在 env 里声明了吗(缺席 / 空串 / 纯空白都是未设 —— 与引擎装配选请求根是同一把尺)。网关腿**没有出厂缺省端点**:未声明 = 这条腿此刻没有端点;
|
|
114
|
+
* anthropic 腿未声明 = 请求根落引擎的 Anthropic 官方缺省根。
|
|
115
|
+
*/
|
|
116
|
+
readonly endpointDeclared: boolean;
|
|
74
117
|
/**
|
|
75
|
-
* env
|
|
76
|
-
* `
|
|
77
|
-
*
|
|
118
|
+
* 这条腿此刻真会带上的凭据那把 env 键;没有会装载的凭据 ⇒ `undefined`。
|
|
119
|
+
* · anthropic 腿:`ANTHROPIC_AUTH_TOKEN` 压过 `ANTHROPIC_API_KEY`(引擎装配同序),空串别名不遮蔽另一把;
|
|
120
|
+
* · 网关腿:`MODEL_API_KEY`,**只在端点声明时**(凭据只与网关自己的根配对;没有网关就不装载),空串 = 没有凭据(keyless 部署)。
|
|
78
121
|
*/
|
|
79
|
-
readonly
|
|
122
|
+
readonly apiKeyEnvName: ModelRouteEnvName | undefined;
|
|
80
123
|
}
|
|
81
124
|
/**
|
|
82
|
-
*
|
|
83
|
-
*
|
|
84
|
-
*
|
|
85
|
-
*
|
|
86
|
-
|
|
87
|
-
export type ModelRouteGapReading = {
|
|
88
|
-
readonly gap: "none";
|
|
89
|
-
} | {
|
|
90
|
-
[G in ModelRouteGapBreach]: {
|
|
91
|
-
readonly gap: G;
|
|
92
|
-
readonly code: ModelRouteEndpointVerdict["code"];
|
|
93
|
-
readonly reason: string;
|
|
94
|
-
};
|
|
95
|
-
}[ModelRouteGapBreach];
|
|
96
|
-
/**
|
|
97
|
-
* **起服前可调的模型路由缺口纯判官**(与起服判官判 env 表时同一实现、同一句拒因;包根导出)。答的是 **env 腿**:没有目录在管时,这份 env 起不起得来
|
|
98
|
-
* (目录在场时起服以目录为准,见文件头注)。
|
|
125
|
+
* **车道值级端口**:这只模型在这张路由表上走哪条车道,这条车道的端点 / 凭据取 env 的哪一对键。
|
|
126
|
+
*
|
|
127
|
+
* 车道 = `brainLaneFor(model.provider, routes)` —— core `brainLaneOf` 对路由表的答案(引擎路由器对每个请求问的那一只),不另写一份合取;
|
|
128
|
+
* 键名 = {@link MODEL_ROUTE_ENV_KEYS}。`routes` 是 core 路由表的原型(`Object.hasOwn(routes, 词)` 的表;`anthropic` 键在场 ⇔ anthropic 路由装上)。
|
|
129
|
+
* **只交键名不交值**:凭据与端点的值调用方自己从 env 取,本函数的答案里没有任何 env 值。
|
|
99
130
|
*
|
|
100
|
-
*
|
|
101
|
-
* @returns 三词之一;有缺口时带 `code` 与 `reason`(见 {@link ModelRouteGapReading})。
|
|
131
|
+
* 纯:不读 `process.env`,只按键表点名取值、不枚举入参。路由表里有本部署从不装的键(表在 `mountRoutes` 之外铸)⇒ 抛(`brainLaneFor` 的响亮臂),不折网关。
|
|
102
132
|
*/
|
|
103
|
-
export declare function
|
|
133
|
+
export declare function laneAndEndpointFor(env: ModelRouteEnv, model: ModelRouteSubject, routes: Readonly<Record<string, unknown>>): LaneAndEndpoint;
|
|
104
134
|
//# sourceMappingURL=model-route-gap.d.ts.map
|
package/dist/model-route-gap.js
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
|
+
import { brainLaneFor, declaredRootUrl } from "./model-provider.js";
|
|
1
2
|
import { DEFAULT_MODEL_REF } from "./model-select.js";
|
|
2
|
-
import { judgeModelRouteEndpoint } from "./model-route-endpoint.js";
|
|
3
3
|
export const MODEL_ROUTE_ENV_KEYS = {
|
|
4
4
|
gatewayBaseUrl: "MODEL_GATEWAY_BASEURL",
|
|
5
5
|
gatewayFallbackUrls: "MODEL_GATEWAY_FALLBACK_URLS",
|
|
6
|
+
gatewayApiKey: "MODEL_API_KEY",
|
|
6
7
|
provider: "MODEL_PROVIDER",
|
|
7
8
|
mainId: "MODEL_ID",
|
|
8
9
|
cheapId: "MODEL_CHEAP_ID",
|
|
@@ -38,6 +39,7 @@ export function readModelRouteEnv(env) {
|
|
|
38
39
|
return {
|
|
39
40
|
gatewayBaseUrl: declaredValue(env[K.gatewayBaseUrl]),
|
|
40
41
|
gatewayFallbackUrls: csvOf(env[K.gatewayFallbackUrls]),
|
|
42
|
+
gatewayApiKey: env[K.gatewayApiKey],
|
|
41
43
|
anthropicApiKey,
|
|
42
44
|
anthropicAuthToken,
|
|
43
45
|
anthropicBaseUrl,
|
|
@@ -62,19 +64,23 @@ export function envLaneTable(mainId, main, cheap) {
|
|
|
62
64
|
table[cheap.id] = cheap;
|
|
63
65
|
return table;
|
|
64
66
|
}
|
|
65
|
-
export function
|
|
66
|
-
const
|
|
67
|
-
const
|
|
68
|
-
const
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
67
|
+
export function laneAndEndpointFor(env, model, routes) {
|
|
68
|
+
const K = MODEL_ROUTE_ENV_KEYS;
|
|
69
|
+
const reading = readModelRouteEnv(env);
|
|
70
|
+
const lane = brainLaneFor(model.provider, routes);
|
|
71
|
+
switch (lane) {
|
|
72
|
+
case "anthropic":
|
|
73
|
+
return {
|
|
74
|
+
lane,
|
|
75
|
+
endpointEnvName: K.anthropicBaseUrl,
|
|
76
|
+
endpointDeclared: declaredRootUrl(reading.anthropicBaseUrl) !== undefined,
|
|
77
|
+
apiKeyEnvName: reading.anthropicAuthToken !== undefined ? K.anthropicAuthToken : reading.anthropicApiKey !== undefined ? K.anthropicApiKey : undefined,
|
|
78
|
+
};
|
|
79
|
+
case "gateway": {
|
|
80
|
+
const endpointDeclared = declaredRootUrl(reading.gatewayBaseUrl) !== undefined;
|
|
81
|
+
const credentialLoaded = endpointDeclared && reading.gatewayApiKey !== undefined && reading.gatewayApiKey !== "";
|
|
82
|
+
return { lane, endpointEnvName: K.gatewayBaseUrl, endpointDeclared, apiKeyEnvName: credentialLoaded ? K.gatewayApiKey : undefined };
|
|
83
|
+
}
|
|
84
|
+
}
|
|
79
85
|
}
|
|
80
86
|
//# sourceMappingURL=model-route-gap.js.map
|
|
@@ -120,6 +120,13 @@ export declare const JSONL_REPLAY_SEATS: {
|
|
|
120
120
|
readonly note: "S-582 fail-closed: an unreadable consume/release line would resurrect a claimed import ticket as unclaimed (one human consent redeemed twice). The face refuses every read and write until a person inspects the file.";
|
|
121
121
|
readonly remedy: "the permission-rule lane is fail-closed until a person inspects the file (moving it aside restarts the lane with an empty log)";
|
|
122
122
|
};
|
|
123
|
+
readonly "workflow-park-decisions": {
|
|
124
|
+
readonly direction: "fail-closed";
|
|
125
|
+
readonly event: "workflow_park_decisions_corrupt_read";
|
|
126
|
+
readonly face: "workflow park decision ledger";
|
|
127
|
+
readonly note: string;
|
|
128
|
+
readonly remedy: string;
|
|
129
|
+
};
|
|
123
130
|
readonly "approval-ask-journal": {
|
|
124
131
|
readonly direction: "fail-open";
|
|
125
132
|
readonly tag: "server.approval-ask-journal.corrupt-record-skipped";
|
|
@@ -126,6 +126,15 @@ export const JSONL_REPLAY_SEATS = {
|
|
|
126
126
|
note: "S-582 fail-closed: an unreadable consume/release line would resurrect a claimed import ticket as unclaimed (one human consent redeemed twice). The face refuses every read and write until a person inspects the file.",
|
|
127
127
|
remedy: RULE_LANE_REMEDY,
|
|
128
128
|
},
|
|
129
|
+
"workflow-park-decisions": {
|
|
130
|
+
direction: "fail-closed",
|
|
131
|
+
event: "workflow_park_decisions_corrupt_read",
|
|
132
|
+
face: "workflow park decision ledger",
|
|
133
|
+
note: "fail-closed: an unreadable line may be the decision that REPLACED an earlier one for the same approval — replaying the rest would bring the replaced decision back and hand it to the engine on the session's next run. " +
|
|
134
|
+
"Every decide on a workflow child's approval is refused until a person inspects the file; a run start reads the ledger as holding no decisions (counted under server.workflow-park-decision.store-unreadable) and starts without them.",
|
|
135
|
+
remedy: "deciding workflow child approvals on this deployment is refused until a person inspects the file (runs keep starting, without the held decisions). Moving it aside drops every held decision in it — " +
|
|
136
|
+
"the approvals they answered stay pending and can be decided again — so it is safe to move aside and restart",
|
|
137
|
+
},
|
|
129
138
|
"approval-ask-journal": { direction: "fail-open", tag: "server.approval-ask-journal.corrupt-record-skipped" },
|
|
130
139
|
"run-store": { direction: "fail-open", tag: "server.run-store.corrupt-record-skipped" },
|
|
131
140
|
"resume-anchor": { direction: "fail-open", tag: "server.resume-anchor.corrupt-record-skipped" },
|
|
@@ -3,4 +3,10 @@
|
|
|
3
3
|
* 或 `Error` 实例的 message getter 返回带会抛 length getter 的非字符串——裸写 `e instanceof Error ? e.message : String(e)`
|
|
4
4
|
* 在 catch 里自己抛,外层 catch 吞掉 setTerminal ⇒ run 卡 running、claim 悬挂到 reaper。这里**不抛、恒返字符串**。 */
|
|
5
5
|
export declare function errorText(e: unknown): string;
|
|
6
|
+
/**
|
|
7
|
+
* 运维日志里一个错误的**类名**(`err.name`;非 Error 抛出物取 `typeof`)—— 日志只带类名、不带消息原文({@link errorText} 是原文那一只):
|
|
8
|
+
* 投递口 / 库连接上抛出的错误,消息可能带对端文本或库侧文本,类名足够回答「是哪一类故障」,原文留给抛出处自己的错误路径。
|
|
9
|
+
* `name` 的 getter 抛、或它交回的不是字符串(拼进模板串会抛的 Symbol 等)⇒ `<unreadable>`。
|
|
10
|
+
*/
|
|
11
|
+
export declare function errorKindOf(err: unknown): string;
|
|
6
12
|
//# sourceMappingURL=err-text.d.ts.map
|
|
@@ -1,10 +1,24 @@
|
|
|
1
|
-
|
|
1
|
+
const KIND_UNREADABLE = "<unreadable>";
|
|
2
|
+
function readOr(read, marker) {
|
|
2
3
|
try {
|
|
3
|
-
|
|
4
|
-
return typeof m === "string" ? m : String(m);
|
|
4
|
+
return read();
|
|
5
5
|
}
|
|
6
6
|
catch {
|
|
7
|
-
return
|
|
7
|
+
return marker;
|
|
8
8
|
}
|
|
9
9
|
}
|
|
10
|
+
export function errorText(e) {
|
|
11
|
+
return readOr(() => {
|
|
12
|
+
const m = e instanceof Error ? e.message : e;
|
|
13
|
+
return typeof m === "string" ? m : String(m);
|
|
14
|
+
}, "<unprintable>");
|
|
15
|
+
}
|
|
16
|
+
export function errorKindOf(err) {
|
|
17
|
+
return readOr(() => {
|
|
18
|
+
if (!(err instanceof Error))
|
|
19
|
+
return typeof err;
|
|
20
|
+
const name = err.name;
|
|
21
|
+
return typeof name === "string" ? name : KIND_UNREADABLE;
|
|
22
|
+
}, KIND_UNREADABLE);
|
|
23
|
+
}
|
|
10
24
|
//# sourceMappingURL=err-text.js.map
|
|
@@ -47,13 +47,17 @@ export declare const FAIL_OPEN_TAGS: {
|
|
|
47
47
|
readonly cls: "P-DEBT";
|
|
48
48
|
readonly note: "core 7.51.0 #1718 提货(`boot/memory-consolidation.ts` `createOperatorValveWriteJudge`):运维手动整理阀门的写判官座已是引擎的那一只构造器,但三层没喂 —— 人的持久规则层(阀门没有「库属于谁」的来源,无 principal / 不声明 local-owner)、部署的调用方策略层(`APPROVAL_REQUIRE` / `APPROVAL_DENY` / `AUTONOMY` / 敏感路径守卫集是每任务现合成的活配置、无部署级单例;敏感路径层另需引擎豁免根入参,宿主构造器输入没有这一位)、项目根(项目层 scope 键是任务根的单向散列,反推不出)。每被问一次(早问库目录一次 + 每个产物一次)记一次。放行的最坏后果 = 运维手动整理时,一条点名记忆库路径的人的持久规则或部署写策略(例如 `APPROVAL_DENY=Write`)拦不住这一轮折叠(与 7.128.x 逐字同;只是判官不再是代答);自动整理腿走引擎腿自己的判官,不在本 tag 射程。收口 = 三层各自有了来源(人:「读谁的桶」裁定;策略:一份设计 + 向 core 请托引擎豁免根入参;根:无来源则永久缺席并改写本债)那一版,本 tag 删。";
|
|
49
49
|
};
|
|
50
|
-
readonly "server.workflow-park-index.sync-failed": {
|
|
51
|
-
readonly cls: "P-DEBT";
|
|
52
|
-
readonly note: "S-185 车CM(codex r1-F2 [high],验真后登记):workflow 出身 park 的 join 索引(`workflow_agent_session` / local 账本)在**一次成功的 run 写之后**同步失败 ⇒ 该次同步被吞,重试要等这条 run 的**下一次**写。而 park 恰好常常是这条 run 的**最后**一次写(park = run 终局 `failed`)⇒ 那条 park 可能永久 join 不到。**多数情形**是诚实 miss:这张卡没有别的指针 ⇒ `/decide` 结构性退回本批之前的行为(409 `conflict.resume_context_unavailable`),不误配、不伪造、不放行,丢的是「人能不能把这条批准送出去」这个能力。**7.118.0 起不止于此**:路由把指针候选当持有者的全集读,并有分叉门(两条同代次持有者 ⇒ 409 `decide.workflow_park_forked`);同一张卡上一枚**竞争**指针没写上(本臂的写失败,或写记录与写指针之间进程崩溃 —— 后者不经本臂、不计数)⇒ 分叉被判成唯一持有者 ⇒ 决定投给幸存的那一支(它确实持有这张卡,但另一支同样站在上面,引擎把这种形交给消费方拒)。归 P 类的理由:缺指针决定**车道选择**(缺行 ⇒ 选中 legacy 腿),且能让分叉门失效;归 DEBT 的理由是真正的解要一条**按子代 checkpoint 键的耐久决议回执 + 重启期回填**(与 codex r1-F3 同一件欠账,另车),分叉门失效那一形另有设计票。计数非零 = 有 park 可能决不掉、或这张卡的分叉门可能失效,运维要按 detail 里的 runId 去查那条 run 的续跑链。";
|
|
53
|
-
};
|
|
54
50
|
readonly "server.workflow-park-index.parks-unreadable": {
|
|
55
51
|
readonly cls: "F";
|
|
56
|
-
readonly note: "S-1173(`workflow-notify-journal.ts` 的 `
|
|
52
|
+
readonly note: "S-1173(`workflow-notify-journal.ts` 的 `ensurePointersFor`,park 指针的唯一写点):workflow run 记录的 `parks[]` **读不出**(在场却不是列表 / 某条目身份位或持有者两位形坏;读者 = `workflow-agent-session-index.ts` 的 `readRunParks`,整档成败制)⇒ 这一份指针投影派生不出来 ⇒ 写者这次**不写**指针,记录照写(已写过的指针只增不删,原样留着)。修前这一臂静默 `return`。**`parks` 缺席不进这一臂**:那是引擎契约里的合法形(更早引擎写的记录 / 准入没走完的续跑记录),读者答 `[]`(没有条目),没有要写的指针,不计。与指针**写**失败分家:写失败 ⇒ 记录写抛、记录不落(指针先于记录,不 fail-open);本臂没有丢任何一枚已写的指针 —— 读不出的是**记录本身**,引擎对条目形坏的记录整条拒续跑(`park_binding_broken`),读口对已有指针的 run 据记录响亮拒(`unproven/unreadable`),所以要的是查那条记录为什么读不出(投影把它写坏 / 手改)。放行的最坏后果:这条 run 首写就读不出时没有指针 ⇒ 这张卡没有别的指针时 `/decide` 落 legacy 腿、409 响亮拒,方向 fail-closed,不误配、不放行任何东西;例外 —— 同一张卡上另一支的指针在时分叉门判不出、决定投给那一支(引擎从不写坏形,要这一支在首写之前就被写坏);derived cache 没更新、真源读口自带响亮拒 ⇒ F 类。detail = `runId=`;计数非零 = 有记录的 `parks[]` 读不出,按 runId 去查记录。";
|
|
53
|
+
};
|
|
54
|
+
readonly "server.workflow-park-decision.card-unreadable": {
|
|
55
|
+
readonly cls: "F";
|
|
56
|
+
readonly note: "起跑读者(`parked-decide.ts` 的 `heldWorkflowParkDecisions`,每一只起跑器开跑前一次)读某条已受理的 workflow 子代决定所属的那张卡时 checkpoint 店抛 ⇒ 这一跑**不带**这条决定,行留着给下一跑。放行的最坏后果:这一跑里宿主若续跑那条 workflow run,子代按同一个 token 再停驻一次(卡仍 pending,决定仍在,下一跑照带)—— 方向是少交付一次,不是错交付:这一读失败不代表引擎随后那一读也失败,而引擎对「卡已不 pending、却拿到一条决定」的序数会当确认结算,所以读不出时绝不照供。计数持续非零 = checkpoint 店对这张卡读不出(库故障 / 行坏 / 写者版本更新),按 detail 的 `runId=`(受理那一刻的持有者)去查。detail = `runId=<留存锚> err=<原句,经记录器脱敏>`。";
|
|
57
|
+
};
|
|
58
|
+
readonly "server.workflow-park-decision.store-unreadable": {
|
|
59
|
+
readonly cls: "F";
|
|
60
|
+
readonly note: "起跑读者(`parked-decide.ts` 的 `heldWorkflowParkDecisions`,每一只起跑器开跑前一次)读这个会话的 workflow 子代决定行时**决定店抛**(local 账本中间一行读不出 ⇒ 闸合上;SQL 这个会话的某一行 `outcome` 坏体 ⇒ 行读者拒)⇒ 与同一读者读卡失败那一臂同律:这一店当「没有可供的行」,这一跑只带调用方带来的那一份(`/decide` 的投递跑带着刚受理的那一条),起跑照常。放行的最坏后果:这个会话里已受理、还没被引擎用掉的决定这一跑都不带 —— 宿主若续跑那条 workflow run,子代按同一个 token 再停驻一次,卡仍 pending、可再决;方向是少交付,不是错交付(读不出的那一行可能正是**取代**了旧决定的那一笔,所以绝不跳过坏行照供其余)。决定的写口与按 token 读(`/decide` 的回执幂等判)照旧带码拒 —— 账本修好之前决不掉 workflow 子代卡,但不再连带拒掉每一跑(修前:local 上整台部署、SQL 上该会话的每一只起跑器都拒)。计数持续非零 = 决定店读不出,local 按披露 `workflow_park_decisions_corrupt_read` 去看账本文件,SQL 按 detail 的会话去查那几行。detail = `hostSessionId=<宿主会话> err=<原句,经记录器脱敏>`。";
|
|
57
61
|
};
|
|
58
62
|
readonly "server.trace.gate-outcome-defective": {
|
|
59
63
|
readonly cls: "F";
|
|
@@ -179,6 +183,10 @@ export declare const FAIL_OPEN_TAGS: {
|
|
|
179
183
|
readonly cls: "F";
|
|
180
184
|
readonly note: "S-700(`plugins/checkpoint-store-sql.ts` 的 `readParkRowFactsCell`):运维待批队列(`GET /v1/approvals` / `/stream`)的某一行,`checkpoint` 列里寄存行的 **`pendingAction` 子树**(NP-3 / 7.100.0 起引擎内只取这一棵、整只快照不出库;只为 park 行事实 `requiresRealApproval` / `ruleOffersAbsence` / `mandated`(S-663 二段,core #1079)/ `mandate`(S-721)/ `origin`(S-755)而读 —— 事实位的真源是 `approval-card.ts` 的 `ParkRowFacts`)**在场却不是一只对象**(JSON `null` 字面 / 串 / 数 —— 手改 / 迁移脚本改过)。子树**缺席**(SQL NULL:成员不在,或整只文档不是对象 —— 后者 `get()` 照旧拒;MariaDB 文本承载上的非 JSON 字节同样答 SQL NULL)⇒ 事实缺席、不计数。放行的最坏后果 = **这一行**的 park 行事实(`ParkRowFacts` 各位)缺席(展示/分诊材料;core 定性 display metadata,resume 的带子读 gate 自己的位),队列其余部分照常 —— 而这一行本来就 resume 不了(`get()` 对同一格拒)。不放行的代价是整只 `rows.map` 抛出 ⇒ 一行坏 blob 打掉整个租户的队列(列表 500、SSE 心跳照常而队列永远空),与同一 `rows.map` 里 `rule_suggestions` / `risk_descriptor` 两格同族同判。故 F 类;tag 与那两格**分开计**(哪一格在坏要读得出来)。计数非零 = 这一行的 decide 同样读不动(`get()` 对同一格拒),去按 session 查那一行。 **第二座 `member=gate`**(`readParkGateCell`:同一列的 **`gate` 子树**在场却不是一只对象 —— 队列行的卡词与到期两条腿的分法都读它):读不出 = 门上无卡,队列行不带卡词,**到期改道** —— core `facetOf` 读「无卡 = 不是一问」为 `A`,所以一张本该到期**作废**的问答行改走 SLA **拒扫腿**(模型拿到一次「拒」而不是整条 run 作废);改道后的续跑 `get()` 对同一份坏 blob 响亮拒(拒扫腿每拍一条失败),行留停驻、由 `terminal_at_ms` 兜底收割 —— 所以最坏后果**不是**「只少展示」,是一张问答行的到期去向变了、最长挂到绝对上限。放行仍对:不放行的代价与 pendingAction 座同(一行坏 blob 打掉整个租户的队列与到期读腿)。计数 detail = `member=gate` 时,去按 session 查那一行的 `checkpoint.gate`。";
|
|
181
185
|
};
|
|
186
|
+
readonly "server.approvals.durable-row-checkpoint-id-missing": {
|
|
187
|
+
readonly cls: "F";
|
|
188
|
+
readonly note: "7.133.0(`checkpoint-identity.ts` 的 `durableRowIdentity`;两只店的 `listPending` + `/v1/assistant/inbox` handler):三处 durable 读面(运维队列行 `GET /v1/approvals` 与 `/v1/approvals/stream` 的 `pending` 帧;停驻收件 `GET /v1/assistant/inbox` 的行)读到一行停驻门**没有可用的 `checkpointId`** ⇒ 这一行**照列、`checkpointId` 键缺席**(消费方按「这一行没有可 join 的身份」处理)。detail = `face=<approvals-queue|assistant-inbox> why=<absent|untrusted>`:`absent` = 行上没有这一格(core 5.42.0 之前停驻的老行 —— core 明写不回填);`untrusted` = 在场却没过信任边界(非串 / 空串 / 超长 / 含 resume token —— 数据污染;没过边界的值不上 wire)。放行(列、键缺席)的最坏后果 = 消费方对这一行做不了跨面 join(三面对账少一行)—— 行本身、决断口(`/v1/approvals/:sessionId/decide`,按会话)、到期收割都照常。不放行有两种形:整只拒的代价是一行老 / 坏行打掉整个租户的队列(列表 500、SSE 心跳照常而队列永远停在旧帧);把这一行藏起来的代价更糟 —— 人看不到要批的东西(审批面上的 fail-open,方向反了)。故 F 类;必须留痕(两种成因从此可分)。计数非零 = 有老 / 坏行在飞(列着、没身份);`/stream` 每 3s 一拍重读,同一行每拍计一次(量值 = 行 × 拍数,在场才是信号)。";
|
|
189
|
+
};
|
|
182
190
|
readonly "server.approvals.queue-row-gate-kind-missing": {
|
|
183
191
|
readonly cls: "F";
|
|
184
192
|
readonly note: "S-1681(`plugins/checkpoint-store-sql.ts` 的 `queueRowGateKind`,7.132.0;SQL 与 local 两只孪生的 `listPending` 同调这一只判官):运维待批队列(`GET /v1/approvals` / `/stream`)读到一行 pending 的门型(SQL 孪生:`checkpoint.gate_kind` 列;local 孪生:快照上的门)是 NULL 或不是 core 登记的门型 ⇒ 这一行**不列**。按构造不可达:每次停驻都把门型反范式进这一列,一次性迁移 M21 把没有它的存量行从门子树补齐(读不出登记门型的置 expired)。放行(不列、队列其余照常)的最坏后果 = 一行谁也决不了的行不出现在队列上 —— 它本来就不可决:每一条决断口按门型绑定取行(`gate_kind IN (…)`),证不出门型就不当它是这道门;不放行(整只拒)的代价是一行坏行打掉整个租户的队列(列表 500、SSE 心跳照常而队列永远停在旧帧)。也不按缺键投出去:消费方按 `gateKind` 路由、缺键即 fail-closed,队列行的契约是 `gateKind` 恒在场。故 F 类;计数非零 = 写腿或手改出了错,`SELECT session_id FROM checkpoint WHERE status = 'pending' AND gate_kind IS NULL` 查那一行(置 expired 或删会话)。";
|
|
@@ -287,9 +295,9 @@ export declare const FAIL_OPEN_TAGS: {
|
|
|
287
295
|
readonly cls: "P-DEBT";
|
|
288
296
|
readonly note: "#296(A-052.2,clay 裁定 C-R21):`REMOTE_EXEC=ssh` 且**两只主机密钥旋钮都缺席**(`SSH_HOST_FINGERPRINT` / `SSH_KNOWN_HOSTS`)⇒ 本次连接接受**任何**主机密钥,等价 `ssh -o StrictHostKeyChecking=no`。放行的最坏后果:一次中间人拿到这条会话的**全部命令、全部产物、以及 agent 在那台机器上的全部动作**(私钥仍在控制面手里、拿不走,design/61 §5 #2)。⇒ 保护型欠账,不是体验回退。**方向是裁定的、不是遗漏**:本 lane 的既有部署形是「AI 编排批量部署到一批 SSH 可达的机器」,那些机器的指纹通常不在任何 known_hosts 里,默认拒连 = 一次静默的可用性断裂;C-R21 裁「在场即严格,缺席即响亮」。补偿三件:①**每连接**一条 `ssh_host_key_unverified` warn(不是每进程一次 —— 一条长期裸连的 lane 必须在每条连接上都看得见);②本计数(遥测里「有多少条连接是裸连」是一个可观测的数,曲线应当只降不升);③两旋钮任一在场即**严格校验、不符拒连**(拒因带两半指纹 + `ssh-keyscan` 指路)。终局 = 部署把旋钮配上(那时本计数归零);旋钮不配而想收紧的部署级开关(「无旋钮即拒启」)是下一件,不在 C-R21 射程。";
|
|
289
297
|
};
|
|
290
|
-
readonly "server.approval.park-
|
|
298
|
+
readonly "server.approval.park-redemption-cap-refused": {
|
|
291
299
|
readonly cls: "F";
|
|
292
|
-
readonly note: "#343(黑板 [5100] Q3)
|
|
300
|
+
readonly note: "#329 / #343(黑板 [5100] Q3):停驻行迟到决议的**受理回执表**(本副本对「200 丢包后重试」的幂等承诺 + 重叠请求的单飞句柄;键 = 行的键 askId,只在一次赎回真开飞时开格;容量帽只数受理之后留下的回执,在飞的单飞句柄永不被逐)**拒留一张回执**。放行的最坏后果 = 这**一次**受理(照旧生效)没有本副本的回执可依:200 丢包后的重试会再进一次赎回腿、拿到那条腿的 409(那张 checkpoint 已被消费)而不是幂等 200 回放(终局恒由赎回腿的 gate CAS 定,不会错兑也不会双兑);迟到受理本身、`GET /v1/approvals` 列表与 `/v1/approvals/:sessionId/decide` 一个字节不动 ⇒ F 类。为什么方向是「拒新」而不是 FIFO 挤最旧:那个形让**甲的用量决定乙的可用性**(已鉴权租户量产受理即可把别家回执挤出,merge-rescan 744 confirmed 的同一病形)。必须留痕:「表被别人打满」与「这一次本来就没有回执」在 wire 上同形。detail 带 owner(判「压力来自谁」的第一手线索)。臂只有一条:全局回执帽满、本 principal 未到子帽、表里没有过期回执可收 ⇒ 拒留(detail 带 owner)。本 principal 到了子帽的常态臂逐自己最旧的一张回执(量产者自伤,设计内有界表纪律),不走本 tag;在飞的单飞句柄不占帽、永不被逐。";
|
|
293
301
|
};
|
|
294
302
|
readonly "server.approvals.stale-echoed-token-unreadable": {
|
|
295
303
|
readonly cls: "F";
|
|
@@ -325,7 +333,7 @@ export declare const FAIL_OPEN_TAGS: {
|
|
|
325
333
|
};
|
|
326
334
|
readonly "server.run-terminal.redact-threw": {
|
|
327
335
|
readonly cls: "F";
|
|
328
|
-
readonly note: "三个发射座(errorMessage 终态文案 / 诊断文本 diag / 工件 artifact,probe 前缀判别;普查 56 行;补丁头 patch-head 那座随 7.83.0 / S-113 的 redactPatchHead 一并退役):S-105 最终轮 [medium]:终态 errorMessage/blockedReason/remoteEnvFailures[].message 脱敏抛出(RangeError:关键字/前缀臂那一形由 S-219 的 atLeast 铸点闭掉;JSON 秘密字段臂的转义对循环与 PEM 栅栏臂的标签交替循环由 S-265 换成手写线性扫描器闭掉 —— 已知形全部闭掉,本臂留作结构性兜底,计数恒零是证据、不归零即新形)⇒ 落固定占位 «redacted:oversized»——绝不落原文(安全轴 fail-closed),也绝不阻断终态翻转与 claim 释放(可用性)。方向刻意:一条超大错误体不得把 run 卡在 running。";
|
|
336
|
+
readonly note: "三个发射座(errorMessage 终态文案 / 诊断文本 diag / 工件 artifact,probe 前缀判别;普查 56 行;补丁头 patch-head 那座随 7.83.0 / S-113 的 redactPatchHead 一并退役)+ 出口座(S-485 / RH-1:`trace/exit-seat.ts` 的 `seatText`,probe 前缀 `seat=<座表行>`;trace 帧自由文本位上抛 ⇒ 这一位换同一枚占位、投影不抛):S-105 最终轮 [medium]:终态 errorMessage/blockedReason/remoteEnvFailures[].message 脱敏抛出(RangeError:关键字/前缀臂那一形由 S-219 的 atLeast 铸点闭掉;JSON 秘密字段臂的转义对循环与 PEM 栅栏臂的标签交替循环由 S-265 换成手写线性扫描器闭掉 —— 已知形全部闭掉,本臂留作结构性兜底,计数恒零是证据、不归零即新形)⇒ 落固定占位 «redacted:oversized»——绝不落原文(安全轴 fail-closed),也绝不阻断终态翻转与 claim 释放(可用性)。方向刻意:一条超大错误体不得把 run 卡在 running。";
|
|
329
337
|
};
|
|
330
338
|
readonly "server.run-terminal.provider-echo-shaped": {
|
|
331
339
|
readonly cls: "F";
|
|
@@ -391,6 +399,10 @@ export declare const FAIL_OPEN_TAGS: {
|
|
|
391
399
|
readonly cls: "F";
|
|
392
400
|
readonly note: "S-582(`plugins/send-file-ledger.ts`,local 车道的发文件账本):一条账行读不出形(`42` / 缺 id·scope·objectKey 三元组 / 中间半截 JSON)⇒ 跳过它继续。最坏后果 = 那条已签发的链接在它租户的列表里**看不见**(对象本身没动;账本本来就不存 URL)。治理面少一行是可见性损失,不是放行 ⇒ F;但它恰是治理面要看的那一类事实,所以必须留痕 —— 修前零披露。";
|
|
393
401
|
};
|
|
402
|
+
readonly "server.approval-ask-audit.rotate-dir-fsync-failed": {
|
|
403
|
+
readonly cls: "F";
|
|
404
|
+
readonly note: "S-322(`approval-ask-audit-store.ts` `rotateOlderThan`,审批账本留存律的审计账半场):轮转把留下的行原字节写进暂存文件(core `writeThenLink`:数据已 fsync)并 `rename` 盖上之后,目录 fsync 失败。换文件**已经落定且可见**、内存索引与 `crashConverged` 读面已经跟上,所以不回滚(也回滚不了)、读数照交。放行的最坏后果:掉电后目录项可能还指旧账本 ⇒ 删掉的行回来(下一拍再删,无害),轮转之后追加、在下一次目录落盘之前掉电的行可能丢(与 `append-failed` 同类后果:痕迹缺几条,审批结算不受影响)。与 core 原子写对目录 fsync 的尽力而为同一姿态(core 吞掉),这里改为留痕。审计店不开门、不改任何审批结算 ⇒ F。";
|
|
405
|
+
};
|
|
394
406
|
readonly "server.approval-ask-audit.corrupt-record-skipped": {
|
|
395
407
|
readonly cls: "F";
|
|
396
408
|
readonly note: "S-967(`approval-ask-audit-store.ts`,local 车道 File ask 审计店的 boot 重放;登记名 `approval-ask-audit`):账本**中间**一行读不出形(`42` / 数组 / 缺键 / 词表外 `kind`·`outcome`·`orphanState` / 半截 JSON;撕尾不走本 tag)⇒ 跳过它继续。最坏后果按行种:丢 `ask` ⇒ 那只孤儿在崩溃收敛读面缺席(无身份可列);丢 `settle` ⇒ 该组按 pending 臂收(审批门在执行之前 ⇒ 若这条 settle 其实是 `allowed` 且工具已执行,`resumeSafe:true` 是错的 —— 与头注「双故障窗」同族);丢 `leg_closed` ⇒ decided 臂多收一行(保守方向);丢 `crash_converged` ⇒ 下一次 boot 重收(幂等);丢 `interrupted_by_shutdown` / `late_settle` ⇒ 成因注退回 `crashed_before_park` / 少一行取证。审计店不开门、不改任何审批结算 ⇒ F。修前:重放坏行只计入 `convergeCrashedAsks().corruptLines`(boot 日志一个数),**无逐条披露、无 tag**。";
|
|
@@ -501,7 +513,21 @@ export declare const FAIL_OPEN_TAGS: {
|
|
|
501
513
|
};
|
|
502
514
|
readonly "server.sql.packet-cap-unread": {
|
|
503
515
|
readonly cls: "F";
|
|
504
|
-
readonly note: "MySQL 协议连接初始化读不出语句级包墙(`plugins/sql-driver.ts` `readMaxAllowedPacket`,InnoDB 与 TiDB 同一处初始化;detail = `assumed=<字节> engine=<tidb|innodb> <读不出的原因>`):会话变量 `@@max_allowed_packet` 不认识 / 读它的查询失败 / 读到的不是正整数 ⇒
|
|
516
|
+
readonly note: "MySQL 协议连接初始化读不出语句级包墙(`plugins/sql-driver.ts` `readMaxAllowedPacket`,InnoDB 与 TiDB 同一处初始化;detail = `assumed=<字节> engine=<tidb|innodb> <读不出的原因>`):会话变量 `@@max_allowed_packet` 不认识 / 读它的查询失败 / 读到的不是正整数 ⇒ 按该服务器族的文档缺省当**这条连接**的包墙(`SqlEngineFacts.maxPacketBytes`,随连接保存;tidb 67108864,innodb 取 MariaDB 与 MySQL 8 两个缺省里小的 16777216),在这条连接上写的 SQL 快照 blob 的缺省帽据它扣语句余量(1 KiB)再折半(文本协议 2× 膨胀)后与单行墙取小。每条池连接初始化各记一次。放行的最坏后果:库的真包墙比落点小(DBA 调小而没读到)⇒ 缺省帽放进了装不进一条语句的 blob,库在写的那一刻以 `ER_NET_PACKET_TOO_LARGE` 拒,快照 blob 写走各自既有的失败面(店的 never-throw 结果形折成 502);比落点大(调大而没读到)⇒ 缺省帽多拒(413 `blob_too_large_for_sql`,出路 = 显式旋钮 `SNAPSHOT_BLOB_SQL_MAX_BYTES` 或配对象存储)。不是门、不是凭据、不改任何裁决;计数非零 = 去看库账号能不能读 `@@max_allowed_packet`(普通账号都读得到,读不出多半是代理 / 中间件拦了这句)。";
|
|
517
|
+
};
|
|
518
|
+
readonly "server.sql.packet-wall-log-unwritten": {
|
|
519
|
+
readonly cls: "F";
|
|
520
|
+
readonly note: "包墙连接自愈的运维日志写不出(`plugins/sql-driver.ts` `warnPacketWall`,blob 判官借出口 `connectJudged` 的两行日志共用这一只出口:旧连接被换掉的 `sql_connection_packet_wall_stale`、全局包墙查询失败的 `sql_connection_packet_wall_global_unread`;detail = `event=<事件名> err=<日志汇抛出的错误类名>`):logger 抛(日志汇坏了 / 传输断了)⇒ 那一行没写出去,判决与连接处置不动 —— 旧连接已销毁在先、写照常重判,拒照旧是 413。放行的最坏后果 = 运维少看到一行诊断:一条过时连接被换掉、或全局包墙读不出这件事没有日志痕迹(判决本身不变,413 的帽照样由那条连接的包墙折算)。不放行的代价是把一次本该是 413(或照常重判后成功)的写变成日志汇故障的 500,并且若销毁在日志之后还会漏连接。故 F 类;登记口不经那只坏掉的 logger(计数 + stderr 契约行 + 探针),所以「日志丢了」本身仍可见。计数非零 = 去看这台副本的日志汇(stdout/stderr 传输)为什么抛。";
|
|
521
|
+
};
|
|
522
|
+
readonly "server.config-dir-trust.kubelet-volume-node-side-unverifiable": {
|
|
523
|
+
readonly cls: "R";
|
|
524
|
+
readonly ruling: "C-R658";
|
|
525
|
+
readonly bound: "残余写者只有节点特权方(节点 root、GID 0 的进程、被授予该 kubelet 卷目录读写 hostPath 的另一只 pod):它们的权限都由节点管理方授予,本 pod 内取不到,也看不见";
|
|
526
|
+
readonly note: "本地配置源 `config.d` 读之前的目录信任判官(`config-dir-trust.ts` `projectedVolumeRoot`)认了一只 kubelet ConfigMap 卷的卷根(卷根 0777 是 kubelet 包卷的磁盘 emptyDir 的模式):卷根下只有原子写者的链接农场、走路径看见的那一只挂载恰挂在这里且只读、来源(mountinfo 第 4 格)是 kubelet configMap 卷目录的整形,且来源在本进程挂载命名空间里没有可写露出(同一文件系统的可写挂载把来源映射到的路径、走那条路径看见的正是那只挂载 —— 有一处即拒 `exposed`,走不到这里;容器里通常一条都没有)。判不了的两半:来源在节点那一侧的祖先目录(kubelet 的数据目录)不在本命名空间里,本进程看不见它们的属主与模式 —— 认它靠的是「kubelet 把数据目录建成 root:root 0750,本 pod 看不见的写者都是节点管理方授予了权限的节点特权方」这一节点侧事实;另一个超级块转出同一批字节的露出(overlay 的 lower / upper 层、FUSE、网络盘)也不在视野里,同记本标签(在本命名空间建这种挂载要 root)。每次认(起服一次 + 每拍一次)记一次。归 R:方向 = 认(不拒启),上界(结构式)= 残余写者只有节点特权方(节点 root、GID 0 的进程、被授予该 kubelet 卷目录读写 hostPath 的另一只 pod):它们的权限都由节点管理方授予,本 pod 内取不到,也看不见。放行的最坏后果 = 这一类残余写者(节点特权方)在判与读之间换掉 `..data`,让本服务读到它写的 `mcp.json`、以本服务的身份起其中的命令 —— 这类写者的权限不是 pod 内的进程自己取得到的,要节点管理方先授予。照拒会让每个以 ConfigMap 卷挂配置的 k8s 部署升级即拒启(出路只剩 `subPath` 逐文件挂)。计数长期保留(它数的是有界放行实际发生了多少次,不期望归零),非零 = 这台部署以 ConfigMap 卷挂配置。detail = `volume=<卷根物理路径> source=<来源路径>`。";
|
|
527
|
+
};
|
|
528
|
+
readonly "server.config-dir-trust.win32-owner-mode-unverifiable": {
|
|
529
|
+
readonly cls: "P-DEBT";
|
|
530
|
+
readonly note: "S-163(`config-dir-trust.ts` `judgeWin32`,本地配置源 `config.d` 读之前的目录信任判官在 win32 上的那一半):Node 在 win32 上 `uid` 恒 0、模式位是只读属性的投影 ⇒ 「属主 ∈ {本服务用户, root, CONFIG_LOCAL_OWNER_UID}」与「不得组 / 他人可写」两判不可做;结构判(常规文件 / 16 MiB 上界 / 链接成环)照做。每一次读照常进行(起服一次 + 每拍一次)记一次。放行的最坏后果 = 一台多用户 Windows 机器上,别的本机用户若能写这台服务的 `config.d`(缺省的用户目录 ACL 不允许),改一份 `mcp.json` 就能让本服务以它的身份起命令 —— 与 7.132.x 逐字同。照 POSIX 拒启会让每个 Windows 本机引擎(含 cli 起的)升级即起不来,而让 cli 替用户设豁免键是中间层替部署者设安全旋钮。收口 = 有了 ACL 判据或一次裁定(改 R 或改拒启)那一版,本 tag 删或改类。detail = `config.d=<物理路径>`。";
|
|
505
531
|
};
|
|
506
532
|
};
|
|
507
533
|
/** 词表键推导的闭集类型——未登记的 tag 传不进 {@link recordFailOpen}(编译期拒)。 */
|
|
@@ -28,13 +28,17 @@ export const FAIL_OPEN_TAGS = {
|
|
|
28
28
|
cls: "P-DEBT",
|
|
29
29
|
note: "core 7.51.0 #1718 提货(`boot/memory-consolidation.ts` `createOperatorValveWriteJudge`):运维手动整理阀门的写判官座已是引擎的那一只构造器,但三层没喂 —— 人的持久规则层(阀门没有「库属于谁」的来源,无 principal / 不声明 local-owner)、部署的调用方策略层(`APPROVAL_REQUIRE` / `APPROVAL_DENY` / `AUTONOMY` / 敏感路径守卫集是每任务现合成的活配置、无部署级单例;敏感路径层另需引擎豁免根入参,宿主构造器输入没有这一位)、项目根(项目层 scope 键是任务根的单向散列,反推不出)。每被问一次(早问库目录一次 + 每个产物一次)记一次。放行的最坏后果 = 运维手动整理时,一条点名记忆库路径的人的持久规则或部署写策略(例如 `APPROVAL_DENY=Write`)拦不住这一轮折叠(与 7.128.x 逐字同;只是判官不再是代答);自动整理腿走引擎腿自己的判官,不在本 tag 射程。收口 = 三层各自有了来源(人:「读谁的桶」裁定;策略:一份设计 + 向 core 请托引擎豁免根入参;根:无来源则永久缺席并改写本债)那一版,本 tag 删。",
|
|
30
30
|
},
|
|
31
|
-
"server.workflow-park-index.sync-failed": {
|
|
32
|
-
cls: "P-DEBT",
|
|
33
|
-
note: "S-185 车CM(codex r1-F2 [high],验真后登记):workflow 出身 park 的 join 索引(`workflow_agent_session` / local 账本)在**一次成功的 run 写之后**同步失败 ⇒ 该次同步被吞,重试要等这条 run 的**下一次**写。而 park 恰好常常是这条 run 的**最后**一次写(park = run 终局 `failed`)⇒ 那条 park 可能永久 join 不到。**多数情形**是诚实 miss:这张卡没有别的指针 ⇒ `/decide` 结构性退回本批之前的行为(409 `conflict.resume_context_unavailable`),不误配、不伪造、不放行,丢的是「人能不能把这条批准送出去」这个能力。**7.118.0 起不止于此**:路由把指针候选当持有者的全集读,并有分叉门(两条同代次持有者 ⇒ 409 `decide.workflow_park_forked`);同一张卡上一枚**竞争**指针没写上(本臂的写失败,或写记录与写指针之间进程崩溃 —— 后者不经本臂、不计数)⇒ 分叉被判成唯一持有者 ⇒ 决定投给幸存的那一支(它确实持有这张卡,但另一支同样站在上面,引擎把这种形交给消费方拒)。归 P 类的理由:缺指针决定**车道选择**(缺行 ⇒ 选中 legacy 腿),且能让分叉门失效;归 DEBT 的理由是真正的解要一条**按子代 checkpoint 键的耐久决议回执 + 重启期回填**(与 codex r1-F3 同一件欠账,另车),分叉门失效那一形另有设计票。计数非零 = 有 park 可能决不掉、或这张卡的分叉门可能失效,运维要按 detail 里的 runId 去查那条 run 的续跑链。",
|
|
34
|
-
},
|
|
35
31
|
"server.workflow-park-index.parks-unreadable": {
|
|
36
32
|
cls: "F",
|
|
37
|
-
note: "S-1173(`workflow-notify-journal.ts` 的 `
|
|
33
|
+
note: "S-1173(`workflow-notify-journal.ts` 的 `ensurePointersFor`,park 指针的唯一写点):workflow run 记录的 `parks[]` **读不出**(在场却不是列表 / 某条目身份位或持有者两位形坏;读者 = `workflow-agent-session-index.ts` 的 `readRunParks`,整档成败制)⇒ 这一份指针投影派生不出来 ⇒ 写者这次**不写**指针,记录照写(已写过的指针只增不删,原样留着)。修前这一臂静默 `return`。**`parks` 缺席不进这一臂**:那是引擎契约里的合法形(更早引擎写的记录 / 准入没走完的续跑记录),读者答 `[]`(没有条目),没有要写的指针,不计。与指针**写**失败分家:写失败 ⇒ 记录写抛、记录不落(指针先于记录,不 fail-open);本臂没有丢任何一枚已写的指针 —— 读不出的是**记录本身**,引擎对条目形坏的记录整条拒续跑(`park_binding_broken`),读口对已有指针的 run 据记录响亮拒(`unproven/unreadable`),所以要的是查那条记录为什么读不出(投影把它写坏 / 手改)。放行的最坏后果:这条 run 首写就读不出时没有指针 ⇒ 这张卡没有别的指针时 `/decide` 落 legacy 腿、409 响亮拒,方向 fail-closed,不误配、不放行任何东西;例外 —— 同一张卡上另一支的指针在时分叉门判不出、决定投给那一支(引擎从不写坏形,要这一支在首写之前就被写坏);derived cache 没更新、真源读口自带响亮拒 ⇒ F 类。detail = `runId=`;计数非零 = 有记录的 `parks[]` 读不出,按 runId 去查记录。",
|
|
34
|
+
},
|
|
35
|
+
"server.workflow-park-decision.card-unreadable": {
|
|
36
|
+
cls: "F",
|
|
37
|
+
note: "起跑读者(`parked-decide.ts` 的 `heldWorkflowParkDecisions`,每一只起跑器开跑前一次)读某条已受理的 workflow 子代决定所属的那张卡时 checkpoint 店抛 ⇒ 这一跑**不带**这条决定,行留着给下一跑。放行的最坏后果:这一跑里宿主若续跑那条 workflow run,子代按同一个 token 再停驻一次(卡仍 pending,决定仍在,下一跑照带)—— 方向是少交付一次,不是错交付:这一读失败不代表引擎随后那一读也失败,而引擎对「卡已不 pending、却拿到一条决定」的序数会当确认结算,所以读不出时绝不照供。计数持续非零 = checkpoint 店对这张卡读不出(库故障 / 行坏 / 写者版本更新),按 detail 的 `runId=`(受理那一刻的持有者)去查。detail = `runId=<留存锚> err=<原句,经记录器脱敏>`。",
|
|
38
|
+
},
|
|
39
|
+
"server.workflow-park-decision.store-unreadable": {
|
|
40
|
+
cls: "F",
|
|
41
|
+
note: "起跑读者(`parked-decide.ts` 的 `heldWorkflowParkDecisions`,每一只起跑器开跑前一次)读这个会话的 workflow 子代决定行时**决定店抛**(local 账本中间一行读不出 ⇒ 闸合上;SQL 这个会话的某一行 `outcome` 坏体 ⇒ 行读者拒)⇒ 与同一读者读卡失败那一臂同律:这一店当「没有可供的行」,这一跑只带调用方带来的那一份(`/decide` 的投递跑带着刚受理的那一条),起跑照常。放行的最坏后果:这个会话里已受理、还没被引擎用掉的决定这一跑都不带 —— 宿主若续跑那条 workflow run,子代按同一个 token 再停驻一次,卡仍 pending、可再决;方向是少交付,不是错交付(读不出的那一行可能正是**取代**了旧决定的那一笔,所以绝不跳过坏行照供其余)。决定的写口与按 token 读(`/decide` 的回执幂等判)照旧带码拒 —— 账本修好之前决不掉 workflow 子代卡,但不再连带拒掉每一跑(修前:local 上整台部署、SQL 上该会话的每一只起跑器都拒)。计数持续非零 = 决定店读不出,local 按披露 `workflow_park_decisions_corrupt_read` 去看账本文件,SQL 按 detail 的会话去查那几行。detail = `hostSessionId=<宿主会话> err=<原句,经记录器脱敏>`。",
|
|
38
42
|
},
|
|
39
43
|
"server.trace.gate-outcome-defective": {
|
|
40
44
|
cls: "F",
|
|
@@ -160,6 +164,10 @@ export const FAIL_OPEN_TAGS = {
|
|
|
160
164
|
cls: "F",
|
|
161
165
|
note: "S-700(`plugins/checkpoint-store-sql.ts` 的 `readParkRowFactsCell`):运维待批队列(`GET /v1/approvals` / `/stream`)的某一行,`checkpoint` 列里寄存行的 **`pendingAction` 子树**(NP-3 / 7.100.0 起引擎内只取这一棵、整只快照不出库;只为 park 行事实 `requiresRealApproval` / `ruleOffersAbsence` / `mandated`(S-663 二段,core #1079)/ `mandate`(S-721)/ `origin`(S-755)而读 —— 事实位的真源是 `approval-card.ts` 的 `ParkRowFacts`)**在场却不是一只对象**(JSON `null` 字面 / 串 / 数 —— 手改 / 迁移脚本改过)。子树**缺席**(SQL NULL:成员不在,或整只文档不是对象 —— 后者 `get()` 照旧拒;MariaDB 文本承载上的非 JSON 字节同样答 SQL NULL)⇒ 事实缺席、不计数。放行的最坏后果 = **这一行**的 park 行事实(`ParkRowFacts` 各位)缺席(展示/分诊材料;core 定性 display metadata,resume 的带子读 gate 自己的位),队列其余部分照常 —— 而这一行本来就 resume 不了(`get()` 对同一格拒)。不放行的代价是整只 `rows.map` 抛出 ⇒ 一行坏 blob 打掉整个租户的队列(列表 500、SSE 心跳照常而队列永远空),与同一 `rows.map` 里 `rule_suggestions` / `risk_descriptor` 两格同族同判。故 F 类;tag 与那两格**分开计**(哪一格在坏要读得出来)。计数非零 = 这一行的 decide 同样读不动(`get()` 对同一格拒),去按 session 查那一行。 **第二座 `member=gate`**(`readParkGateCell`:同一列的 **`gate` 子树**在场却不是一只对象 —— 队列行的卡词与到期两条腿的分法都读它):读不出 = 门上无卡,队列行不带卡词,**到期改道** —— core `facetOf` 读「无卡 = 不是一问」为 `A`,所以一张本该到期**作废**的问答行改走 SLA **拒扫腿**(模型拿到一次「拒」而不是整条 run 作废);改道后的续跑 `get()` 对同一份坏 blob 响亮拒(拒扫腿每拍一条失败),行留停驻、由 `terminal_at_ms` 兜底收割 —— 所以最坏后果**不是**「只少展示」,是一张问答行的到期去向变了、最长挂到绝对上限。放行仍对:不放行的代价与 pendingAction 座同(一行坏 blob 打掉整个租户的队列与到期读腿)。计数 detail = `member=gate` 时,去按 session 查那一行的 `checkpoint.gate`。",
|
|
162
166
|
},
|
|
167
|
+
"server.approvals.durable-row-checkpoint-id-missing": {
|
|
168
|
+
cls: "F",
|
|
169
|
+
note: "7.133.0(`checkpoint-identity.ts` 的 `durableRowIdentity`;两只店的 `listPending` + `/v1/assistant/inbox` handler):三处 durable 读面(运维队列行 `GET /v1/approvals` 与 `/v1/approvals/stream` 的 `pending` 帧;停驻收件 `GET /v1/assistant/inbox` 的行)读到一行停驻门**没有可用的 `checkpointId`** ⇒ 这一行**照列、`checkpointId` 键缺席**(消费方按「这一行没有可 join 的身份」处理)。detail = `face=<approvals-queue|assistant-inbox> why=<absent|untrusted>`:`absent` = 行上没有这一格(core 5.42.0 之前停驻的老行 —— core 明写不回填);`untrusted` = 在场却没过信任边界(非串 / 空串 / 超长 / 含 resume token —— 数据污染;没过边界的值不上 wire)。放行(列、键缺席)的最坏后果 = 消费方对这一行做不了跨面 join(三面对账少一行)—— 行本身、决断口(`/v1/approvals/:sessionId/decide`,按会话)、到期收割都照常。不放行有两种形:整只拒的代价是一行老 / 坏行打掉整个租户的队列(列表 500、SSE 心跳照常而队列永远停在旧帧);把这一行藏起来的代价更糟 —— 人看不到要批的东西(审批面上的 fail-open,方向反了)。故 F 类;必须留痕(两种成因从此可分)。计数非零 = 有老 / 坏行在飞(列着、没身份);`/stream` 每 3s 一拍重读,同一行每拍计一次(量值 = 行 × 拍数,在场才是信号)。",
|
|
170
|
+
},
|
|
163
171
|
"server.approvals.queue-row-gate-kind-missing": {
|
|
164
172
|
cls: "F",
|
|
165
173
|
note: "S-1681(`plugins/checkpoint-store-sql.ts` 的 `queueRowGateKind`,7.132.0;SQL 与 local 两只孪生的 `listPending` 同调这一只判官):运维待批队列(`GET /v1/approvals` / `/stream`)读到一行 pending 的门型(SQL 孪生:`checkpoint.gate_kind` 列;local 孪生:快照上的门)是 NULL 或不是 core 登记的门型 ⇒ 这一行**不列**。按构造不可达:每次停驻都把门型反范式进这一列,一次性迁移 M21 把没有它的存量行从门子树补齐(读不出登记门型的置 expired)。放行(不列、队列其余照常)的最坏后果 = 一行谁也决不了的行不出现在队列上 —— 它本来就不可决:每一条决断口按门型绑定取行(`gate_kind IN (…)`),证不出门型就不当它是这道门;不放行(整只拒)的代价是一行坏行打掉整个租户的队列(列表 500、SSE 心跳照常而队列永远停在旧帧)。也不按缺键投出去:消费方按 `gateKind` 路由、缺键即 fail-closed,队列行的契约是 `gateKind` 恒在场。故 F 类;计数非零 = 写腿或手改出了错,`SELECT session_id FROM checkpoint WHERE status = 'pending' AND gate_kind IS NULL` 查那一行(置 expired 或删会话)。",
|
|
@@ -268,9 +276,9 @@ export const FAIL_OPEN_TAGS = {
|
|
|
268
276
|
cls: "P-DEBT",
|
|
269
277
|
note: "#296(A-052.2,clay 裁定 C-R21):`REMOTE_EXEC=ssh` 且**两只主机密钥旋钮都缺席**(`SSH_HOST_FINGERPRINT` / `SSH_KNOWN_HOSTS`)⇒ 本次连接接受**任何**主机密钥,等价 `ssh -o StrictHostKeyChecking=no`。放行的最坏后果:一次中间人拿到这条会话的**全部命令、全部产物、以及 agent 在那台机器上的全部动作**(私钥仍在控制面手里、拿不走,design/61 §5 #2)。⇒ 保护型欠账,不是体验回退。**方向是裁定的、不是遗漏**:本 lane 的既有部署形是「AI 编排批量部署到一批 SSH 可达的机器」,那些机器的指纹通常不在任何 known_hosts 里,默认拒连 = 一次静默的可用性断裂;C-R21 裁「在场即严格,缺席即响亮」。补偿三件:①**每连接**一条 `ssh_host_key_unverified` warn(不是每进程一次 —— 一条长期裸连的 lane 必须在每条连接上都看得见);②本计数(遥测里「有多少条连接是裸连」是一个可观测的数,曲线应当只降不升);③两旋钮任一在场即**严格校验、不符拒连**(拒因带两半指纹 + `ssh-keyscan` 指路)。终局 = 部署把旋钮配上(那时本计数归零);旋钮不配而想收紧的部署级开关(「无旋钮即拒启」)是下一件,不在 C-R21 射程。",
|
|
270
278
|
},
|
|
271
|
-
"server.approval.park-
|
|
279
|
+
"server.approval.park-redemption-cap-refused": {
|
|
272
280
|
cls: "F",
|
|
273
|
-
note: "#343(黑板 [5100] Q3)
|
|
281
|
+
note: "#329 / #343(黑板 [5100] Q3):停驻行迟到决议的**受理回执表**(本副本对「200 丢包后重试」的幂等承诺 + 重叠请求的单飞句柄;键 = 行的键 askId,只在一次赎回真开飞时开格;容量帽只数受理之后留下的回执,在飞的单飞句柄永不被逐)**拒留一张回执**。放行的最坏后果 = 这**一次**受理(照旧生效)没有本副本的回执可依:200 丢包后的重试会再进一次赎回腿、拿到那条腿的 409(那张 checkpoint 已被消费)而不是幂等 200 回放(终局恒由赎回腿的 gate CAS 定,不会错兑也不会双兑);迟到受理本身、`GET /v1/approvals` 列表与 `/v1/approvals/:sessionId/decide` 一个字节不动 ⇒ F 类。为什么方向是「拒新」而不是 FIFO 挤最旧:那个形让**甲的用量决定乙的可用性**(已鉴权租户量产受理即可把别家回执挤出,merge-rescan 744 confirmed 的同一病形)。必须留痕:「表被别人打满」与「这一次本来就没有回执」在 wire 上同形。detail 带 owner(判「压力来自谁」的第一手线索)。臂只有一条:全局回执帽满、本 principal 未到子帽、表里没有过期回执可收 ⇒ 拒留(detail 带 owner)。本 principal 到了子帽的常态臂逐自己最旧的一张回执(量产者自伤,设计内有界表纪律),不走本 tag;在飞的单飞句柄不占帽、永不被逐。",
|
|
274
282
|
},
|
|
275
283
|
"server.approvals.stale-echoed-token-unreadable": {
|
|
276
284
|
cls: "F",
|
|
@@ -306,7 +314,7 @@ export const FAIL_OPEN_TAGS = {
|
|
|
306
314
|
},
|
|
307
315
|
"server.run-terminal.redact-threw": {
|
|
308
316
|
cls: "F",
|
|
309
|
-
note: "三个发射座(errorMessage 终态文案 / 诊断文本 diag / 工件 artifact,probe 前缀判别;普查 56 行;补丁头 patch-head 那座随 7.83.0 / S-113 的 redactPatchHead 一并退役):S-105 最终轮 [medium]:终态 errorMessage/blockedReason/remoteEnvFailures[].message 脱敏抛出(RangeError:关键字/前缀臂那一形由 S-219 的 atLeast 铸点闭掉;JSON 秘密字段臂的转义对循环与 PEM 栅栏臂的标签交替循环由 S-265 换成手写线性扫描器闭掉 —— 已知形全部闭掉,本臂留作结构性兜底,计数恒零是证据、不归零即新形)⇒ 落固定占位 «redacted:oversized»——绝不落原文(安全轴 fail-closed),也绝不阻断终态翻转与 claim 释放(可用性)。方向刻意:一条超大错误体不得把 run 卡在 running。",
|
|
317
|
+
note: "三个发射座(errorMessage 终态文案 / 诊断文本 diag / 工件 artifact,probe 前缀判别;普查 56 行;补丁头 patch-head 那座随 7.83.0 / S-113 的 redactPatchHead 一并退役)+ 出口座(S-485 / RH-1:`trace/exit-seat.ts` 的 `seatText`,probe 前缀 `seat=<座表行>`;trace 帧自由文本位上抛 ⇒ 这一位换同一枚占位、投影不抛):S-105 最终轮 [medium]:终态 errorMessage/blockedReason/remoteEnvFailures[].message 脱敏抛出(RangeError:关键字/前缀臂那一形由 S-219 的 atLeast 铸点闭掉;JSON 秘密字段臂的转义对循环与 PEM 栅栏臂的标签交替循环由 S-265 换成手写线性扫描器闭掉 —— 已知形全部闭掉,本臂留作结构性兜底,计数恒零是证据、不归零即新形)⇒ 落固定占位 «redacted:oversized»——绝不落原文(安全轴 fail-closed),也绝不阻断终态翻转与 claim 释放(可用性)。方向刻意:一条超大错误体不得把 run 卡在 running。",
|
|
310
318
|
},
|
|
311
319
|
"server.run-terminal.provider-echo-shaped": {
|
|
312
320
|
cls: "F",
|
|
@@ -351,6 +359,10 @@ export const FAIL_OPEN_TAGS = {
|
|
|
351
359
|
cls: "F",
|
|
352
360
|
note: "S-582(`plugins/send-file-ledger.ts`,local 车道的发文件账本):一条账行读不出形(`42` / 缺 id·scope·objectKey 三元组 / 中间半截 JSON)⇒ 跳过它继续。最坏后果 = 那条已签发的链接在它租户的列表里**看不见**(对象本身没动;账本本来就不存 URL)。治理面少一行是可见性损失,不是放行 ⇒ F;但它恰是治理面要看的那一类事实,所以必须留痕 —— 修前零披露。",
|
|
353
361
|
},
|
|
362
|
+
"server.approval-ask-audit.rotate-dir-fsync-failed": {
|
|
363
|
+
cls: "F",
|
|
364
|
+
note: "S-322(`approval-ask-audit-store.ts` `rotateOlderThan`,审批账本留存律的审计账半场):轮转把留下的行原字节写进暂存文件(core `writeThenLink`:数据已 fsync)并 `rename` 盖上之后,目录 fsync 失败。换文件**已经落定且可见**、内存索引与 `crashConverged` 读面已经跟上,所以不回滚(也回滚不了)、读数照交。放行的最坏后果:掉电后目录项可能还指旧账本 ⇒ 删掉的行回来(下一拍再删,无害),轮转之后追加、在下一次目录落盘之前掉电的行可能丢(与 `append-failed` 同类后果:痕迹缺几条,审批结算不受影响)。与 core 原子写对目录 fsync 的尽力而为同一姿态(core 吞掉),这里改为留痕。审计店不开门、不改任何审批结算 ⇒ F。",
|
|
365
|
+
},
|
|
354
366
|
"server.approval-ask-audit.corrupt-record-skipped": {
|
|
355
367
|
cls: "F",
|
|
356
368
|
note: "S-967(`approval-ask-audit-store.ts`,local 车道 File ask 审计店的 boot 重放;登记名 `approval-ask-audit`):账本**中间**一行读不出形(`42` / 数组 / 缺键 / 词表外 `kind`·`outcome`·`orphanState` / 半截 JSON;撕尾不走本 tag)⇒ 跳过它继续。最坏后果按行种:丢 `ask` ⇒ 那只孤儿在崩溃收敛读面缺席(无身份可列);丢 `settle` ⇒ 该组按 pending 臂收(审批门在执行之前 ⇒ 若这条 settle 其实是 `allowed` 且工具已执行,`resumeSafe:true` 是错的 —— 与头注「双故障窗」同族);丢 `leg_closed` ⇒ decided 臂多收一行(保守方向);丢 `crash_converged` ⇒ 下一次 boot 重收(幂等);丢 `interrupted_by_shutdown` / `late_settle` ⇒ 成因注退回 `crashed_before_park` / 少一行取证。审计店不开门、不改任何审批结算 ⇒ F。修前:重放坏行只计入 `convergeCrashedAsks().corruptLines`(boot 日志一个数),**无逐条披露、无 tag**。",
|
|
@@ -461,7 +473,21 @@ export const FAIL_OPEN_TAGS = {
|
|
|
461
473
|
},
|
|
462
474
|
"server.sql.packet-cap-unread": {
|
|
463
475
|
cls: "F",
|
|
464
|
-
note: "MySQL 协议连接初始化读不出语句级包墙(`plugins/sql-driver.ts` `readMaxAllowedPacket`,InnoDB 与 TiDB 同一处初始化;detail = `assumed=<字节> engine=<tidb|innodb> <读不出的原因>`):会话变量 `@@max_allowed_packet` 不认识 / 读它的查询失败 / 读到的不是正整数 ⇒
|
|
476
|
+
note: "MySQL 协议连接初始化读不出语句级包墙(`plugins/sql-driver.ts` `readMaxAllowedPacket`,InnoDB 与 TiDB 同一处初始化;detail = `assumed=<字节> engine=<tidb|innodb> <读不出的原因>`):会话变量 `@@max_allowed_packet` 不认识 / 读它的查询失败 / 读到的不是正整数 ⇒ 按该服务器族的文档缺省当**这条连接**的包墙(`SqlEngineFacts.maxPacketBytes`,随连接保存;tidb 67108864,innodb 取 MariaDB 与 MySQL 8 两个缺省里小的 16777216),在这条连接上写的 SQL 快照 blob 的缺省帽据它扣语句余量(1 KiB)再折半(文本协议 2× 膨胀)后与单行墙取小。每条池连接初始化各记一次。放行的最坏后果:库的真包墙比落点小(DBA 调小而没读到)⇒ 缺省帽放进了装不进一条语句的 blob,库在写的那一刻以 `ER_NET_PACKET_TOO_LARGE` 拒,快照 blob 写走各自既有的失败面(店的 never-throw 结果形折成 502);比落点大(调大而没读到)⇒ 缺省帽多拒(413 `blob_too_large_for_sql`,出路 = 显式旋钮 `SNAPSHOT_BLOB_SQL_MAX_BYTES` 或配对象存储)。不是门、不是凭据、不改任何裁决;计数非零 = 去看库账号能不能读 `@@max_allowed_packet`(普通账号都读得到,读不出多半是代理 / 中间件拦了这句)。",
|
|
477
|
+
},
|
|
478
|
+
"server.sql.packet-wall-log-unwritten": {
|
|
479
|
+
cls: "F",
|
|
480
|
+
note: "包墙连接自愈的运维日志写不出(`plugins/sql-driver.ts` `warnPacketWall`,blob 判官借出口 `connectJudged` 的两行日志共用这一只出口:旧连接被换掉的 `sql_connection_packet_wall_stale`、全局包墙查询失败的 `sql_connection_packet_wall_global_unread`;detail = `event=<事件名> err=<日志汇抛出的错误类名>`):logger 抛(日志汇坏了 / 传输断了)⇒ 那一行没写出去,判决与连接处置不动 —— 旧连接已销毁在先、写照常重判,拒照旧是 413。放行的最坏后果 = 运维少看到一行诊断:一条过时连接被换掉、或全局包墙读不出这件事没有日志痕迹(判决本身不变,413 的帽照样由那条连接的包墙折算)。不放行的代价是把一次本该是 413(或照常重判后成功)的写变成日志汇故障的 500,并且若销毁在日志之后还会漏连接。故 F 类;登记口不经那只坏掉的 logger(计数 + stderr 契约行 + 探针),所以「日志丢了」本身仍可见。计数非零 = 去看这台副本的日志汇(stdout/stderr 传输)为什么抛。",
|
|
481
|
+
},
|
|
482
|
+
"server.config-dir-trust.kubelet-volume-node-side-unverifiable": {
|
|
483
|
+
cls: "R",
|
|
484
|
+
ruling: "C-R658",
|
|
485
|
+
bound: "残余写者只有节点特权方(节点 root、GID 0 的进程、被授予该 kubelet 卷目录读写 hostPath 的另一只 pod):它们的权限都由节点管理方授予,本 pod 内取不到,也看不见",
|
|
486
|
+
note: "本地配置源 `config.d` 读之前的目录信任判官(`config-dir-trust.ts` `projectedVolumeRoot`)认了一只 kubelet ConfigMap 卷的卷根(卷根 0777 是 kubelet 包卷的磁盘 emptyDir 的模式):卷根下只有原子写者的链接农场、走路径看见的那一只挂载恰挂在这里且只读、来源(mountinfo 第 4 格)是 kubelet configMap 卷目录的整形,且来源在本进程挂载命名空间里没有可写露出(同一文件系统的可写挂载把来源映射到的路径、走那条路径看见的正是那只挂载 —— 有一处即拒 `exposed`,走不到这里;容器里通常一条都没有)。判不了的两半:来源在节点那一侧的祖先目录(kubelet 的数据目录)不在本命名空间里,本进程看不见它们的属主与模式 —— 认它靠的是「kubelet 把数据目录建成 root:root 0750,本 pod 看不见的写者都是节点管理方授予了权限的节点特权方」这一节点侧事实;另一个超级块转出同一批字节的露出(overlay 的 lower / upper 层、FUSE、网络盘)也不在视野里,同记本标签(在本命名空间建这种挂载要 root)。每次认(起服一次 + 每拍一次)记一次。归 R:方向 = 认(不拒启),上界(结构式)= 残余写者只有节点特权方(节点 root、GID 0 的进程、被授予该 kubelet 卷目录读写 hostPath 的另一只 pod):它们的权限都由节点管理方授予,本 pod 内取不到,也看不见。放行的最坏后果 = 这一类残余写者(节点特权方)在判与读之间换掉 `..data`,让本服务读到它写的 `mcp.json`、以本服务的身份起其中的命令 —— 这类写者的权限不是 pod 内的进程自己取得到的,要节点管理方先授予。照拒会让每个以 ConfigMap 卷挂配置的 k8s 部署升级即拒启(出路只剩 `subPath` 逐文件挂)。计数长期保留(它数的是有界放行实际发生了多少次,不期望归零),非零 = 这台部署以 ConfigMap 卷挂配置。detail = `volume=<卷根物理路径> source=<来源路径>`。",
|
|
487
|
+
},
|
|
488
|
+
"server.config-dir-trust.win32-owner-mode-unverifiable": {
|
|
489
|
+
cls: "P-DEBT",
|
|
490
|
+
note: "S-163(`config-dir-trust.ts` `judgeWin32`,本地配置源 `config.d` 读之前的目录信任判官在 win32 上的那一半):Node 在 win32 上 `uid` 恒 0、模式位是只读属性的投影 ⇒ 「属主 ∈ {本服务用户, root, CONFIG_LOCAL_OWNER_UID}」与「不得组 / 他人可写」两判不可做;结构判(常规文件 / 16 MiB 上界 / 链接成环)照做。每一次读照常进行(起服一次 + 每拍一次)记一次。放行的最坏后果 = 一台多用户 Windows 机器上,别的本机用户若能写这台服务的 `config.d`(缺省的用户目录 ACL 不允许),改一份 `mcp.json` 就能让本服务以它的身份起命令 —— 与 7.132.x 逐字同。照 POSIX 拒启会让每个 Windows 本机引擎(含 cli 起的)升级即起不来,而让 cli 替用户设豁免键是中间层替部署者设安全旋钮。收口 = 有了 ACL 判据或一次裁定(改 R 或改拒启)那一版,本 tag 删或改类。detail = `config.d=<物理路径>`。",
|
|
465
491
|
},
|
|
466
492
|
};
|
|
467
493
|
export function failOpenTagForDroppedFrame(frameType) {
|
|
@@ -236,6 +236,7 @@ export function createMetrics() {
|
|
|
236
236
|
m.counter("limit_ceiling_after_answer_total", "Runs where a walltime/turns ceiling fired AFTER the run had already answered (engine 7.13.0: these end completed with NO limits.* code). Dual of budget_exceeded_total, but NOT over the same population: this one is minted on the deps-level notice sink so it sees EVERY engine run (background children, delegated/nested legs, leader lanes); budget_exceeded_total is incremented only by the HTTP submit legs finalizeTaskResult, i.e. top-level HTTP-submitted runs. Sum them only within that narrower population; see the forwarder comment, by origin");
|
|
237
237
|
m.counter("cost_quota_rejected_total", "Tasks refused because the principal is over its cumulative cost quota");
|
|
238
238
|
m.counter("deny_sweep_resume_blocked_total", "SLA deny-sweep resumes the resume leg refused (every attempt; the deny_sweep_resume_blocked warn is logged once per row and refusal)");
|
|
239
|
+
m.counter("deny_sweep_policy_blocked_expired_total", "approvals the SLA deny-sweep expired because the resume leg refused them for an admission-policy reason (resume_blocked_by_policy: the stored request is refused in this version for good, so the model-continuing deny cannot be delivered; counted once per card, only when this sweep won the settle)");
|
|
239
240
|
m.counter("submit_ctx_run_release_failed_total", "Submissions whose resume-input write failed AND whose just-claimed run could not be released, by step (terminal|idem_key); the session stays held until REAP_RUN_STALE_SEC (one submit_ctx_run_release_failed warn per failure)");
|
|
240
241
|
m.counter("deny_sweep_list_failed_total", "SLA deny-sweep ticks whose read of the expired approvals failed (that tick denies nothing; one deny_sweep_list_failed warn per failure)");
|
|
241
242
|
m.counter("degraded_total", "Tasks degraded to a cheaper model (1.40), by reason (budget/rate_limit/breaker_open)");
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { TraceEvent } from "@sema-agent/core";
|
|
2
|
+
import { WIRE_PROJECTION_FACES } from "../trace/wire-projection-faces.js";
|
|
2
3
|
/**
|
|
3
4
|
* 引擎的清单帧 `prompt.assembled`(引擎 7.52.0 起 `version: 3`):这条腿的提示**是哪一份**(`identity` + 它的选择器值 `selectors`)、
|
|
4
5
|
* 由哪些块与段组成、每一段的文本从哪里来(`chain`,被取代的 overlay 另在 `superseded`)。只有 id / 尺寸 / 摘要,没有提示正文。
|
|
@@ -7,7 +8,7 @@ export type PromptAssembledEvent = Extract<TraceEvent, {
|
|
|
7
8
|
kind: "prompt.assembled";
|
|
8
9
|
}>;
|
|
9
10
|
/** 帧上**不上行**的键。唯一一簿在 `trace/wire-projection-faces.ts` 的 `prompt_manifest` 行(逐键理由在那里);这里只做类型查询。 */
|
|
10
|
-
type NotOnTheRow = (typeof
|
|
11
|
+
type NotOnTheRow = (typeof WIRE_PROJECTION_FACES)["prompt_manifest"]["excluded"][number];
|
|
11
12
|
/** 引擎的型,**词读成开集串**:投影判形,不判词表(档名、激活方式、来源类、渲染器……每一张词表的属主都是引擎,新词原样过境)。 */
|
|
12
13
|
type OpenWords<T> = T extends string ? string : T extends readonly (infer U)[] ? OpenWords<U>[] : T extends object ? {
|
|
13
14
|
[K in keyof T]: OpenWords<T[K]>;
|
|
@@ -23,24 +24,9 @@ export type PromptManifestRecord = {
|
|
|
23
24
|
export type PromptManifestInput = {
|
|
24
25
|
readonly [K in keyof PromptAssembledEvent]?: unknown;
|
|
25
26
|
};
|
|
26
|
-
/** 读一个值:读得出 ⇒ 值;读不出 ⇒ `undefined`;可选成员缺席 ⇒ {@link ABSENT}(不铸、不计)。 */
|
|
27
|
-
type Read<V> = (v: unknown) => V | undefined;
|
|
28
|
-
declare const ABSENT: unique symbol;
|
|
29
|
-
/** 可选格的记号:只有 {@link optional} 铸得出带它的读器 —— 一只裸读器的回值型是可选格回值型的子型,单靠回值型拦不住它。 */
|
|
30
|
-
declare const OPTIONAL_CELL: unique symbol;
|
|
31
|
-
type OptionalRead<V> = Read<V | typeof ABSENT> & {
|
|
32
|
-
readonly [OPTIONAL_CELL]: true;
|
|
33
|
-
};
|
|
34
|
-
/**
|
|
35
|
-
* 每张读表按引擎型的**每一个键**写一格(`-?`:可选键也必须有格,引擎给哪一层加成员 ⇒ 这里编译红);可选键的格必须经 {@link optional} —— 格型要求
|
|
36
|
-
* {@link OPTIONAL_CELL} 记号,裸读器写进可选键 ⇒ 编译红(否则缺席的成员被裸读器读成「读不出」,整句被丢)。
|
|
37
|
-
*/
|
|
38
|
-
export type ReadTable<T> = {
|
|
39
|
-
[K in keyof T]-?: undefined extends T[K] ? OptionalRead<Exclude<T[K], undefined>> : Read<T[K]>;
|
|
40
|
-
};
|
|
41
27
|
/**
|
|
42
28
|
* 把一帧 `prompt.assembled` 读成耐久行(记录时白名单:tracer 同步、无 IO,未来的引擎键不随帧上行)。
|
|
43
|
-
*
|
|
29
|
+
* 规则一句:**只挑登记表声明的键,逐层判形;在场却读不出 ⇒ 计一次 `server.trace.projection-input-malformed` 并丢;缺席从不计数**。
|
|
44
30
|
* 词原样过境(不判词表);`identity` 是这条腿的提示身份的唯一读法 —— 本仓不另铸第二种(v2 的 `constitution` 随引擎退役)。
|
|
45
31
|
*/
|
|
46
32
|
export declare function promptManifestRecordOf(e: PromptManifestInput): PromptManifestRecord;
|