拓冰建站拓冰建站
首页 / 资讯中心 / 正文

Friend 后端 Canonical Memory 的 Firestore IAM 与服务账号部署门禁:从 emulator 验证到生产只读证明的完整实践

Friend 后端 Canonical Memory 的 Firestore IAM 与服务账号部署门禁从 emulator 验证到生产只读证明的完整实践【免费下载链接】FriendAI that sees your screen, listens to your conversations and tells you what to do项目地址: https://gitcode.com/GitHub_Trending/fr/Friend本文以仓库中的 memory_firestore_iam_deployment.md 为核心脉络系统讲解 Friend 后端 Canonical Memory规范记忆在 Firestore 上的服务器所有权server-owned边界、服务账号最小权限模型、部署前检查清单、本地 Firebase Emulator 验证门禁以及围绕 memory vector repair outbox worker 展开的 Cloud Run/Tasks/Scheduler 执行契约、遥测契约与 OIDC/IAM/Pinecone 只读证明工具。读完本文你将掌握如何确认 Firestore Security Rules 拒绝客户端直连受保护记忆路径、如何以 fail-closed 方式部署一个默认关闭的 outbox worker、如何用只读证明脚本在不改动任何生产资源的前提下收集 IAM 证据并理解回滚时为何必须保留双格式读取器。前提与边界说明本文描述的本地 emulator 门禁已在仓库中落地但它不是云端 IAM 验证也未声称生产 IAM 已被检查或修改。文档原文明确写道它只是把 canonical-memory 生产写门禁的假设显式化直到能在真实 Firebase 项目中验证为止。全文所有“提案proposed”“未应用not yet applied”字样均以仓库当前状态为准。一、边界Canonical Memory 是服务器所有的 Firestore 状态Canonical-memory 的 Firestore 状态由服务端持有。后端使用 Firebase Admin SDK / Google Cloud Firestore Admin SDK以后端服务账号身份读写 canonical memory 集合移动端、桌面端、Web、第三方与 MCP 客户端不得使用 Firebase 客户端 SDK 直接访问这些集合。产品级访问必须走后端 API由服务端派生经过认证的 UID、rollout 状态、访问策略与 archive/默认可见性客户端 SDK零写入canonical memory 集合。这一边界在仓库根目录的 firestore.rules 中有直接实现证据match /users/{uid}/{collectionId}/{document**} { allow read, create, update, delete: if false; } match /{document**} { allow read, write: if false; }即受保护记忆路径对客户端一律 denyAdmin SDK 通过 IAM 绕过客户端规则规则只约束客户端 SDK。文档列出的受保护路径完整清单如下均可由 memory_collections.py 中的MemoryCollections路径助手印证users/{uid}/memory_items/{memory_id} users/{uid}/memory_operations/{operation_id} users/{uid}/memory_ledger_reopens/{source_memory_id} users/{uid}/memory_outbox/{event_id} users/{uid}/memory_control/{doc_id} users/{uid}/memory_control/app_key_memory_grants users/{uid}/memory_state/{doc_id} users/{uid}/memory_commits/{commit_id} users/{uid}/memory_evidence/{evidence_id} mcp_api_keys/{key_id}其中memory_control/app_key_memory_grants应用/密钥记忆授权与mcp_api_keys/{key_id}MCP API 密钥清单属于纯服务端所有权数据客户端既不能自读也不能篡改 MCP 密钥的app_id/scopes字段。二、所需服务账号与最小权限least privilege部署后的后端服务账号是唯一被期望变更 canonical-memory Firestore 状态的主体权限应遵循最小化原则在生产项目上授予roles/datastore.userFirestore 文档读写除非部署证据证明存在更窄的自定义角色且被持续维护不要为 canonical-memory 写门禁授予宽泛的 owner/editor 角色不要向客户端分发服务账号密钥生产优先使用 workload identity / 平台托管凭据本地开发仅在可信的开发/服务器机器上使用SERVICE_ACCOUNT_JSON在可行时将 vector/search/outbox 消费端凭据分离避免某个被攻破的消费端绕过 Long-term apply 事务。三、生产 IAM 之前的 Dev-Cloud 证明universal memory 部署要求先在专用的非生产 Firebase/GCP 项目中证明云端 IAM详见 universal-memory-operations.md。Dev-cloud 证明必须使用已部署的分支后端修订版及其真实运行时身份使用开发凭据的本地后端只能作为补充不能通过 dev-cloud 门禁。Dev-cloud IAM 验收要求显式给出 dev 项目 ID、项目编号、database ID、运行时服务账号唯一 ID硬停止hard-stop检查遇到已知生产项目 ID/编号立即中止拒绝隐式默认项目运行时身份读取权限足以完成 memory GET且无Firestore 数据写权限为合成 control/head/projection 文档准备独立的 fixture 写入身份提供包含继承授权inherited grants的有效 IAM 证据在可行处提供不安全/运行时写路径的拒绝证据。dev-cloud 通过GO之后生产 IAM 仍是仅生产环境的最终激活阻塞项生产激活必须验证生产运行时身份与有效 IAM但不应把生产当作首个启用路径的证明环境。四、生产部署检查清单在生产启用 universal memory 写入之前逐项确认确认firebase.json、firestore.rules、firestore.indexes.json已部署到目标 Firebase 项目确认后端以预期服务账号运行、Firestore 访问范围不超所需并将 IAM 证据记录在 rollout ticket 或部署变更中确认客户端直连仍被 Firestore Security Rules 拒绝——真实验证可用前的静态守卫是pytest tests/unit/test_memory_firestore_security_rules.py -q当前仓库中对应的测试文件为 test_firestore_security_rules.py 与 test_firestore_iam_deployment_doc.py确认后端写路径仍使用原子 apply 适配器 操作日志operation journal不要引入直接产品写入旁路保持全局部署就绪声明显式化证明前MEMORY_MODEoff证明后MEMORY_MODEread——这是部署开关而非用户选择器确认账号删除/源墓碑生成围栏fence与 universal 双格式回滚读取器已就绪再启用全局 intake。五、本地 Firebase Emulator 验证门禁本地 emulator 验证已针对 memory vector repair/purge outbox 写入器、客户端规则拒绝与事务性租约争用完成接线对应三个 npm 脚本见仓库根 package.jsonnpm run test:memory-vector-repair-outbox:emulator npm run test:memory-vector-repair-outbox-rules:emulator npm run test:memory-vector-repair-outbox-lease:emulator前置条件Firebase CLIfirebase/firebase-toolsJava 运行时javaemulator 依赖仓库根执行过npm installnode_modules缺失时后端 Python 依赖含google-cloud-firestore。该门禁在本地能证明后端/Admin 上下文的写入器在users/{uid}/memory_outbox/{record_id}持久化确定性vector_repair_purge记录写入器实现见 memory_vector_repair_outbox.py 的write_vector_repair_purge_outbox_records对同一 stale-vector 观察重复写入执行幂等的.set(...)落到同一稳定文档、同一record_id/idempotency_key新记录保持 pending 重试契约statuspending、attempt_count0、last_errornull写失败不会被write_vector_repair_purge_outbox_records(...)静默吞掉异常会传播给调用方用于路由/worker 遥测与重试/死信处理登录客户端 SDK 对memory_outbox及其他受保护记忆集合的直读/建/改/删被 Firestore Security Rules 拒绝后端/Admin SDK 通过 IAM 绕过客户端规则lease_vector_repair_purge_outbox_records(...)通过 Firestore 事务重读/更新语义认领到期 pending 记录客户端支持事务时8 个并发本地 emulator 租约尝试争用同一 pendingusers/{uid}/memory_outbox/{record_id}文档恰好产生一个返回认领与一份in_progress租约所有者/时间戳证明该记录的“至多一个 worker 执行”本地事务争用契约。该门禁不能证明任何真实 Firebase 项目中的生产云 IAM/服务账号绑定或已部署 Security RulesPinecone 删除/修复行为、墓碑优先级、重复 stale-vector 清理、重试/死信 worker 或中心低基数遥测共享ns2隔离或 vector benchmark/切换就绪。六、memory vector repair outbox 执行契约单次 tick第一个显式的调度器/租约所有者接缝是run_vector_repair_outbox_worker_tick(...)实现在 memory_vector_repair_outbox_worker.py。它是为 Cloud Run Jobs、Cloud Scheduler → Cloud Run/Tasks 或其他服务端调度器设计的有界单次 tick 契约且未在本仓库注册到任何生产调度器。契约要点服务端调用方从控制平面/env 配置构造VectorRepairOutboxWorkerTickConfig。默认enabledfalse因此 worker 默认 fail-closed除非部署者显式启用才认领记录源码中配置类默认值即enabledFalse, limit25, lease_seconds300, max_attempts3调用方提供后端/Admin Firestore 客户端、目标uid、稳定worker_id/租约所有者身份、有界limit、lease_seconds、max_attemptstick 通过lease_vector_repair_purge_outbox_records(...)从users/{uid}/memory_outbox/*认领到期 pendingvector_repair_purge记录把存储文档标记为in_progress并写入lease_owner、leased_at、locked_at、lease_expires_at对应源码中的_lease_patch。认领逻辑先查statuspending available_at now再查statusin_progress lease_expires_at now的过期租约逐文档在事务内重读并仅在仍 pending/可认领时更新以此保证并发契约已认领记录传给process_vector_repair_purge_outbox_records(...)只注入依赖权威条目加载器、Pinecone 形状的向量删除器、Pinecone 形状的向量修复器、Firestore ack 写入器。动作决策_decide_delete_or_repair遵循墓碑优先级权威条目缺失、reason命中删除原因集合、或条目带 deleted/tombstoned/purged 状态时走 delete否则 repairack/重试/死信补丁通过ack_vector_repair_purge_outbox_record(...)应用重试退避基于 durable_queue.py 的decide_attempt/QueuePolicy默认max_attempts3超限进入dead_letter。返回摘要确定性强、低基数友好enabled、worker_id、uid、leased_count、processed_count、skipped_count、failed_count、ack_failed_count、actions、errors同批次重复的idempotency_key记录通过既有 worker 幂等接缝保持“至多一个适配器副作用”租约争用由本地 emulator 夹具验证过的事务重读/更新契约保护。七、默认关闭的 Cloud Run/Tasks 包装契约vector_repair_outbox_worker_entrypoint.py 是该 tick 的已入库 Cloud Run/Tasks 包装契约同时暴露 CLI 冒烟路径与极简 ASGI HTTP shimPOST /memory-vector-repair-outbox-worker/tick刻意保持 fake 可注入且不创建 Cloud Tasks、Cloud Scheduler、Cloud Run Jobs、Firebase emulator 进程或 Pinecone 客户端。包装行为只读取显式服务端 env/config当MEMORY_VECTOR_REPAIR_OUTBOX_WORKER_ENABLED缺失、为空或为false时 fail-closed/no-op打印一条确定性 JSON 摘要不认领任何记录畸形布尔、启用时缺失uid/worker_id、非正数值边界均视为配置拒绝打印config_validfalse的确定性 JSON 摘要并以非零码退出不进入 tick启用且注入生产安全依赖后恰好调用一次run_vector_repair_outbox_worker_tick(...)作用于一个显式 uid 与稳定租约所有者——没有无界生产扫描也没有客户端提供的任意 uid 执行打印/返回一个适合 Cloud Run/Tasks 日志的 JSON 对象单元测试覆盖禁用 no-op、畸形配置拒绝、必需 uid/租约所有者拒绝、启用 fake tick 摘要、worker/action 失败摘要、依赖解析器调用、缺失依赖配置拒绝在租约前、HTTP shim 禁用 no-op、HTTP shim 配置/依赖拒绝、HTTP shim fake 启用 tick、无调度器入队副作用生产依赖解析要求PINECONE_API_KEY、PINECONE_INDEX_NAME、OPENAI_API_KEYAdmin Firestore 由database._client.db构造权威users/{uid}/memory_items/{memory_id}加载为MemoryItemPineconeindex.delete/index.upsert与utils.llm.clients.embeddings.embed_query通过显式ns2适配器接缝包装适配器见 memory_vector_repair_pinecone_adapter.pyVECTOR_REPAIR_PINECONE_NAMESPACE ns2。禁用态 CLI 冒烟命令python3 backend/scripts/vector_repair_outbox_worker_entrypoint.py提案中的尚未应用Cloud Run 服务命令形态uvicorn scripts.vector_repair_outbox_worker_entrypoint:app --host 0.0.0.0 --port 8080提案中的环境变量契约尚未启用来自部署契约 YAML memory_vector_repair_outbox_cloud_deployment_contract.yamlMEMORY_VECTOR_REPAIR_OUTBOX_WORKER_ENABLEDfalse # 默认/fail-closed仅字面量 true 启用 MEMORY_VECTOR_REPAIR_OUTBOX_UIDserver-owned uid shard # 仅启用时必需无无界扫描 MEMORY_VECTOR_REPAIR_OUTBOX_WORKER_ID稳定 service/region/revision 租约所有者 # 仅启用时必需 MEMORY_VECTOR_REPAIR_OUTBOX_LIMIT小正整数默认 25 MEMORY_VECTOR_REPAIR_OUTBOX_LEASE_SECONDS正整数默认 300 MEMORY_VECTOR_REPAIR_OUTBOX_MAX_ATTEMPTS正整数默认 3 PINECONE_API_KEYworker 密钥仅启用时必需 PINECONE_INDEX_NAMEworker 索引仅启用时必需 OPENAI_API_KEYembedding provider 密钥仅启用时必需 VECTOR_REPAIR_PINECONE_NAMESPACEns2提案中的 Cloud Run/Tasks 部署形态尚未应用service: memory-vector-repair-outbox-worker trigger: Cloud Scheduler 或 Cloud Tasks HTTP POST /memory-vector-repair-outbox-worker/tick默认禁用OIDC 在 Cloud Run IAM/平台层认证 identity: 专用后端 worker 服务账号Firestore Admin/Datastore User 对 users/*/memory_outbox 读写、对权威 memory item 状态只读Pinecone 凭据仅限 ns2 兼容的向量 delete/upsert config/env: 上述包装 envMEMORY_VECTOR_REPAIR_OUTBOX_WORKER_ENABLEDfalse 直到生产门禁通过 input: 显式 uid shard/列表来源必须服务端所有无客户端提供的任意 uid 执行 output/telemetry: 单调计数器 leased/processed/skipped/failed/ack_failed/actiondelete|repair/retry/dead_letter/backlog_count/oldest_pending_age/duration仅限有界标签对 dead_letter 增长、ack 失败、Pinecone/重试失败率、调度器饥饿、stale-vector 积压年龄告警 auth: Cloud Run IAMroles/run.invoker Scheduler/Tasks OIDC serviceAccountEmail/audience应用 shim 刻意不实现应用级 bearer token八、memory vector repair outbox 中央遥测与告警契约memory_vector_repair_outbox_telemetry.py 定义该 worker 的中央 fake 可注入遥测接缝把一次确定性 tick 摘要加上可选 backlog/时长输入转换为低基数 metric/event 载荷交给注入的 emitter。这只是代码接缝与告警契约未由本仓库接入生产 Prometheus/OpenTelemetry/Cloud Monitoring。启用前的遥测契约metrics: vector_repair_outbox_worker_records_total{worker_component,statusleased|processed|skipped|failed} vector_repair_outbox_worker_action_total{worker_component,actiondelete|repair} vector_repair_outbox_worker_retry_total{worker_component,reason} vector_repair_outbox_worker_dead_letter_total{worker_component,reason} vector_repair_outbox_worker_ack_failure_total{worker_component,reason} vector_repair_outbox_worker_backlog_count{worker_component,statuspending|dead_letter} vector_repair_outbox_worker_oldest_pending_age_seconds{worker_component,statuspending} vector_repair_outbox_worker_duration_ms{worker_component,statustick} events: vector_repair_outbox_worker_dead_letter vector_repair_outbox_worker_ack_failure allowed labels only: worker_component, status, action, reason, event_type forbidden labels/fields: uid, worker_id, vector_id, memory_id, record_id, idempotency_key, raw error text源码层面对“禁传标识符”的强制体现在_sanitize_payload/_bounded_label载荷标签只保留白名单键其余一律剔除。遥测发射失败被记录为遥测失败failed_count/errors而不会向上抛出从而不掩盖 worker 的清理/ack 结果——这正对应“遥测异常不得改变 delete/repair/ack 结果”的通过标准。启用前必须在真实指标后端实现的告警门dead_letter_count 0任一 uid shard持续 15 分钟page 并暂停启用/扩展ack_failed_count 05 分钟page因为 Pinecone 可能已变更而 Firestore ack 状态不明确failed_count / leased_count 0.1015 分钟warn 0.2515 分钟page 并禁用 worker 扩展oldest_pending_age_seconds 3600warn 21600page 并阻止切换leased_count 0且pending backlog_count 030 分钟warn 调度器/IAM/租约饥饿。通过/失败标准通过 中央 sink 收到仅含白名单标签的单调计数器/事件且 dead letter、ack 失败、重试尖峰比例、调度器饥饿、最老 pending 积压均有告警策略失败 任一 metric/event 标签包含 uid/worker_id/vector_id/memory_id/record_id/idempotency_key/原始错误文本或 worker 可在看板与告警策略就绪前被启用或遥测异常改变 delete/repair/ack 结果。九、Cloud Run/Tasks/Scheduler 静态部署契约与 OIDC/IAM 只读证明memory_vector_repair_outbox_cloud_deployment_contract.yaml 是该 worker 的已入库、默认禁用部署契约工件静态就绪/证明物不是已应用部署。它刻意保持Cloud RunMEMORY_VECTOR_REPAIR_OUTBOX_WORKER_ENABLED默认falseCloud Schedulerstate: PAUSED默认暂停Cloud Run invoker IAM 必选run.googleapis.com/invoker-iam-disabled: false且限制 ingressinternal-and-cloud-load-balancing、minScale0/maxScale1、gen2 执行环境、containerConcurrency1、timeoutSeconds900OIDCserviceAccountEmail与audience匹配目标 worker tick URI对roles/run.invoker、roles/cloudtasks.enqueuer、roles/iam.serviceAccountTokenCreator、roles/datastore.user或更窄的自维护 Firestore 自定义角色的显式服务账号/IAM 证明目标Cloud Tasks 单发one-at-a-time分发带maxAttempts/maxRetryDuration上限与死信路由占位仅服务端所有 uid-shard 占位客户端不得选择任意 uid 执行供后续用gcloud/Firebase 对目标项目执行的显式证明命令与通过/失败标准。配套的 vector_repair_outbox_oidc_iam_proof.py 是 Cloud Run/Tasks/Scheduler OIDC/IAM 切片的安全只读证明运行器。不带--execute时打印NOT_RUNJSON 就绪清单内含精确的gcloud run services describe、gcloud run services get-iam-policy、gcloud scheduler jobs describe、gcloud tasks queues describe、gcloud projects get-iam-policy、gcloud iam service-accounts get-iam-policy命令带--execute时只运行这些白名单只读 describe/get-iam-policy 命令然后检查 worker env 仍为禁用、Scheduler 仍暂停、OIDCserviceAccountEmail/audience与契约一致、无公开 Run invoker 绑定、所需 worker/scheduler IAM 绑定存在。gcloud、项目、region、服务、job、队列、认证或 IAM 资源缺失时诚实失败。就绪性注意可执行触发面已通过POST /memory-vector-repair-outbox-worker/tick匹配预期 HTTP/OIDC Cloud Run/Tasks 形态但 OIDC 仍由 Cloud Run IAM/平台配置而非本地测试凭据强制。在本地切片中gcloud未安装/不在 PATH、未配置目标项目/region因此证明运行器仅以NOT_RUN/前置条件失败模式运行未创建或宣称任何 Cloud Run 服务、Cloud Tasks 队列、Cloud Scheduler job、IAM 绑定、已部署规则验证、生产 Firestore IAM 证明或 Pinecone 操作。十、生产 Firestore IAM 与已部署 Security Rules 证明运行器firestore_rules_iam_proof.py 是面向生产 Firestore IAM 与 memory vector repair outbox 路径上已部署 Security Rules 的安全只读就绪/证明运行器默认盘点精确的生产验证命令仅当显式传入--execute时运行只读命令python3 backend/scripts/firestore_rules_iam_proof.py python3 backend/scripts/firestore_rules_iam_proof.py --project PROJECT_ID --execute只读盘点命令gcloud firestore databases describe (default) --project PROJECT_ID --formatjson gcloud projects get-iam-policy PROJECT_ID --formatjson gcloud iam service-accounts get-iam-policy WORKER_SA --project PROJECT_ID --formatjson gcloud iam service-accounts get-iam-policy BACKEND_SA --project PROJECT_ID --formatjson firebase firestore:rules:get --project PROJECT_ID真实 PASS/FAIL 证明的前置条件已认证的gcloudCLI、已认证的 Firebase CLI、目标 Firebase/GCP 项目、已部署的 Firestore 数据库、已部署的 Security Rules 版本、预期的 Admin worker/后端服务账号名。缺少前置条件时运行器输出statusNOT_RUN并列出缺失项——这是就绪工件而非生产证据。运行器的通过/失败标准含显式客户端拒绝检查client_denial.memory_outbox已部署规则拒绝客户端对users/{uid}/memory_outbox/{record_id}的读/建/改/删client_denial.app_key_memory_grants已部署规则拒绝客户端对users/{uid}/memory_control/app_key_memory_grants的读/建/改/删app/key 记忆授权保持服务端/Admin 所有mcp_api_key_inventory已部署规则/IAM 证明把mcp_api_keys/{key_id}作为 Admin-only MCP API 密钥清单客户端不能自读或变更 MCP 密钥app_id/scopesworker_firestore_iamAdmin worker 服务账号有 Firestore 读写 IAMroles/datastore.user或更窄自定义角色且无 owner/editor 角色memory_control.server_ownedusers/{uid}/memory_control/state保持服务端/Admin 所有包括vector_repair_outbox_enabled门app_key_grants.server_ownedusers/{uid}/memory_control/app_key_memory_grants保持服务端/Admin 所有app/key 客户端不能自助授权no_client_vector_repair_enablement已部署规则下客户端无法启用vector_repair_outbox_enabledno_broad_public_access项目与服务账号 IAM 无allUsers/allAuthenticatedUsers公开访问。运行器防变更无firebase deploy、无gcloud firestore databases update、无 IAMset-iam-policy、无 IAM 绑定变更不部署规则、不改 IAM、不写 outbox 文档、不调用 Pinecone。即使 PASS也只是这些路径的 Firestore IAM/已部署规则证据不是生产批准也不关闭 Pinecone 重复 stale 物理 ID 清理、共享ns2隔离、重试/死信遥测或 benchmark 门禁。十一、Pinecone repair / 共享 ns2 验证就绪运行器pinecone_repair_validation_readiness.py 是 Oracle P0-4 仍要求的真实 Pinecone 验证的安全默认就绪工件。默认模式仅盘点并打印statusNOT_RUN绝不删除、upsert、查询或变更 Pineconepython3 backend/scripts/pinecone_repair_validation_readiness.py未来的真实一次性验证运行必须显式以凭据与安全标志把关。运行器要求PINECONE_API_KEY、PINECONE_INDEX_NAME、PINECONE_INDEX_HOST、非ns2的一次性命名空间、长memory-proof-...一次性向量 ID 前缀、前缀精确确认以及任何未来 execute 模式变更前的显式变更确认python3 backend/scripts/pinecone_repair_validation_readiness.py \ --execute \ --allow-throwaway-mutation \ --test-namespace memory-proof-throwaway-namespace \ --throwaway-prefix memory-proof-ticket- \ --confirm-throwaway-prefix memory-proof-ticket- \ --shared-ns2-readonly后续真实 Pinecone 证明的通过/失败标准duplicate_stale_physical_ids确认的一次性前缀下重复 stale 物理 ID 全部被删除或修复验证后无残留 stale 重复tombstone_precedence_delete缺失/已删除/墓碑化/已清除的权威条目对每个匹配一次性向量选择 delete 而非 repairlive_stale_item_repair_upsertlive stale 条目恰好产生一次带当前 projection/account-generation 元数据的 repair/upsertretry_dead_letter_behavior注入或观察到的 Pinecone delete/upsert 失败产生重试补丁达最大尝试次数后进入dead_letterack 失败单独计数shared_ns2_isolation本运行器对共享ns2仅做只读盘点证据必须证明 legacy 向量未被触碰、legacy 查询排除 memory schema 记录、且在生产 memoryns2插入前保留基线 legacy 召回legacy_vectors_not_touched不允许宽泛删除/更新变更验证必须限定在确认的一次性测试命名空间与前缀内绝不触碰共享ns2。当前本地输出只是诚实的就绪/非宣称工件本地环境未记录 Pinecone 目标配置因此不宣称任何真实重复 stale 物理 ID 删除/修复、墓碑优先级、重试/死信行为或共享ns2隔离证明。这不是生产批准。十二、在生产启用该契约前剩余的门禁对目标项目运行python3 backend/scripts/vector_repair_outbox_oidc_iam_proof.py --project PROJECT_ID --region REGION --execute并附上精确 JSON 输出然后才可取消暂停 Scheduler 或启用 worker对目标 Firebase 项目运行python3 backend/scripts/firestore_rules_iam_proof.py --project PROJECT_ID --execute并附上精确 JSON 输出然后才可启用vector_repair_outbox_enabled或 worker生产安全的 uid 分片/积压发现与 worker 身份所有权模型在ns2命名空间中用重复 stale 物理 ID 与墓碑优先级做真实 Pinecone delete/upsert 验证重试/退避/死信中央遥测与告警共享ns2隔离证据legacy 查询排除 memory schema 记录或做出独立命名空间/过滤决策。十三、回滚注意事项持久化读转写回滚必须使用对账后的 memory 派生兼容投影不得暴露 stale 向量或复活已删除记忆持久 canonical 写入后禁止退回 legacy-only 读取器否则 canonical 创建的记忆会消失——必须保留 universal 双格式读取器部署若 IAM 或 Security Rules 错误用全局事件控制停止 canonical intake/维护修复并重新部署规则/IAM 后再重试写入同一全局回滚中把就绪声明设回MEMORY_MODEoff绝不把选定 UID 重新路由到 legacy 写入器。十四、当前可用的验证静态检查仅限本地cd backend pytest tests/unit/test_memory_firestore_security_rules.py tests/unit/test_memory_firestore_iam_deployment_doc.py -qCloud IAM 与已部署 Security Rules 仍是未来门禁直到获得生产项目访问权限。本地 Firebase Emulator 验证npm run test:memory-vector-repair-outbox:emulator npm run test:memory-vector-repair-outbox-rules:emulator npm run test:memory-vector-repair-outbox-lease:emulator cd backend pytest tests/unit/test_memory_firestore_security_rules.py tests/unit/test_memory_firestore_iam_deployment_doc.py tests/unit/test_memory_vector_repair_outbox_emulator_harness.py -q值得注意的实现细节文档中以test_memory_firestore_security_rules.py/test_memory_firestore_iam_deployment_doc.py引用的静态守卫测试在当前仓库中对应的实际文件是 test_firestore_security_rules.py 与 test_firestore_iam_deployment_doc.py而 memory_vector_repair_outbox.py 的写入器源码statuspending、attempt_count0的新记录契约、memory_vector_repair_outbox_worker.py 的 tick/租约/处理实现、以及 memory_vector_repair_outbox_telemetry.py 的低基数标签强制逻辑共同构成上述全部契约的代码级依据。整条链路的设计意图始终一致默认禁用、fail-closed、只读证明、先 emulator 后 dev-cloud 再生产任何一步的证据缺失都只产出NOT_RUN就绪工件而不会变成生产批准。【免费下载链接】FriendAI that sees your screen, listens to your conversations and tells you what to do项目地址: https://gitcode.com/GitHub_Trending/fr/Friend创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门