Skip to content

Release readiness: merge dev (42 commits, RAG-D3/D4 + V104–V110 + GA continuation + review-fix-01) - #22

Merged
BangShou1st merged 42 commits into
mainfrom
dev
Oct 25, 2026
Merged

BangShou1st merged 42 commits into
mainfrom
dev

Conversation

@BangShou1st

@BangShou1st BangShou1st commented Oct 25, 2026 •

Copy link
Copy Markdown
Owner

Summary

RELEASE-READINESS-01 发布就绪性收敛的受控合并请求,含 PR-22-REVIEW-FIX-01 审查修复。dev 领先 main 42 提交(main 无独有提交,零分叉;以 GitHub main...dev 实时计数为准),内容为 RAG-D3/D4 系列、model-service 系列(含 V104–V110 七个 Flyway 迁移)、GA continuation/协议修复、CI-R1、arch-quality-01/02、文档治理与 Review 5641753298 P1/P2 定向修复。

状态:READY_FOR_MERGE_REVIEW —— 等待人工合并决策,不自动合并;最终合并以最新 HEAD CI 完成为准。

验证证据

  • 本地隔离环境全链路(worktree @ bc1140e,代码 = efbe11a 基线,见 docs/acceptance-evidence/release-readiness-01-20261025/a3-verification.md):
    • testOffline 487/0/0;test 2676/0/41;testDatabaseIntegration 1005/0/41(skips 均为显式 live/external 环境门控)
    • testCrossLanguage 2/0/0;brain pytest 367/0;tools/tests 239/0;前端 typecheck/vitest(987 通过)/build 全绿
    • Flyway 109 迁移(含 V104–V110)在隔离库真实应用全部 success
  • 远端 CI:efbe11a run 40152643427、25902a5 run 40165818065 均 10 job 全绿(历史基线证据)

Review 修复(PR-22-REVIEW-FIX-01,906ee3c)

  • P1 已修复:STRUCTURED 复验降级后,UUID CUSTOM 连接的新 GA Run / 新 Project Agent Run / 直接运行时读取不再凭过期 validated_revision 放行;connectionSettings 新 Run 路径统一要求当前 (org, UUID, config_revision) STRUCTURED=VERIFIED(与激活门禁同源)。冻结绑定路径按设计契约不重复施加能力门禁,语义不变;未采用清除 validated_revision 方案(避免误杀冻结 Run)。
  • P2 已核实勘误:a3-verification.md skipped 分类分项笔误(GaExec 25→23),实测 23+11+1+5+1=41,总数始终正确;测试与执行结果未改动。
  • 本地验证(独立 worktree + 隔离库 spec_agent_p3b_live_pr22fix_20261025 + Fake Provider,红→绿复现):testOffline 489/0/0;test 2680/0/41;testDatabaseIntegration 1007/0/41(新增 4 回归用例;skips 均为显式环境门控)。
  • 证据:docs/acceptance-evidence/pr-22-review-fix-01-20261025/(audit / fix-summary / verification / pr-review / summary)。
  • 修复 HEAD 906ee3c CI:runs 40170687660 / 40170691663 各 10/10 job 全绿;最终 HEAD 13d7e9f(仅 docs 证据回填)CI 以其 run 最终结论为准(历史 10/10 仅为旧基线)。

数据库迁移(V104–V110)

顺序依赖成立;V106 不可变触发器、V108/V109 清洗继承验证标记均为 fail-closed 方向;失败整体回滚;已在隔离库真实应用并通过迁移专项测试(IsolatedMigration/V94V95/V99)。升级提示:V108/V109 后无能力证明的 CUSTOM 连接需重新验证才可激活(预期行为)。

合并核验(merge 时执行,禁 squash)

git rev-parse origin/dev^{tree}   # 合并后 origin/main^{tree} 必须等于此值
git diff --stat origin/main origin/dev   # 必须为空

已知风险(audit P1,合并评审输入)

  • UPDATE_NODE/CONNECT_NODE/CREATE_ROUTE 提案可审批、确认后必失败(Stage B 执行器缺口)
  • 多 Worker 总开关与 ga-recovery 默认关闭;SemanticRanking 影子代码未接线
  • CI 盲区:testNonLive/evalP3ARetrieval/evalLive*/qualifyGaNative*/zenUpstreamContract 无 CI 消费者

人工待办(不阻塞本 PR,阻塞生产发布)

  1. RAG 68 条人工审阅 + 首轮阈值批准(rag-human-review-handoff.md)
  2. DB 中断演练对最终发布 jar 复验(db-outage-recovery-acceptance.md)
  3. 生产切换授权与 RUNBOOK 运维门槛

发布限制

本 PR 合并 = 代码集成就绪;生产发布需上述人工待办关闭并取得 owner 生产切换授权,两种就绪不得混用。不修改 main、不强推、不绕过分支保护;合并模式必须为 merge commit。

BangShou1st and others added 30 commits October 22, 2026 20:34
- F01: enhance RetrievalAcceptanceGateValidator with strict checks on codeHashes, requirementsLockSha256, modelTag, profileId, and numerical ratio ranges [0.0, 1.0]; adjust SharedRetrievalIntegrationTest to validate acceptance gates before creating fixture rows.
- F19: ensure SharedRetrievalIntegrationTest passes raw Top-8 ordered results without premature deduplication to RetrievalQualityScorer; preserve original ranking positions for MRR and pass real forbiddenAliases.
- F05: decouple NEAR_NO_ANSWER diagnostic observations from strict zero-hit requirements while maintaining zero tolerance on stale version and permission isolation leaks.
- Source & Label corrections: restore synthetic document IDs CHK-801 (R00), SEC-802 (R01), PERF-804 (R03); revise R00 chunking text to match chunks.py (target=1200, no overlap, UTF-16 code units); include X-Spec-Agent-Internal-Token in R01 text; restore multi-source queries B041, B043, B045, B046.
- F14 & F22: introduce atomic CAS RetrievalExecutionClaimManager preventing concurrent/repeated candidate claims; track 17 code/migration files in acceptance-freeze.v2.1.json.
- Audit & Tooling: update audit_retrieval_acceptance.py and test suite to support v2.1 candidate and freeze assets; all candidate query execution remains strictly 0 and review status remains PENDING.
… acceptance assets per Sol round 3 review

- Gate Fail-Closed: RetrievalAcceptanceGateValidator strictly enforces candidate/freeze file presence, execution configuration comparison (qwen3-embedding:0.6b, profileId, rrfK=60, maxVectorDistance=0.50, maxItems=8, maxChars=8000), non-null pureNoAnswerZeroHitCorrectness ratio, and non-negative leak counts before any DB fixture or Python process is initialized.
- Atomic First-Run Claim: Wire RetrievalExecutionClaimManager.claimFirstRun into SharedRetrievalIntegrationTest pre-fixture setup; enforce immutable terminal states (COMPLETED_PASS, COMPLETED_FAIL, INTERRUPTED_OR_ERROR) and generate unique runId receipts.
- Single Truth Scorer: Unify top-level report metrics (mrr, recallAt8, multiSourceAllOfCoverage, zeroHitCorrectness, leaks) with RetrievalQualityScorer; verify 8th rank MRR yields strictly 0.125 (1/8).
- v2.2 Acceptance Assets: Generate acceptance-candidate.v2.2.json, acceptance-freeze.v2.2.json, ACCEPTANCE_HUMAN_REVIEW.v2.2.md, and HUMAN_REVIEW_DECISION_CHECKLIST.v2.2.md; eliminate 'bidirectional handshake' wording in R01/B036 in favor of unidirectional X-Spec-Agent-Internal-Token header verification; align review notes for B041, B043, B045, B046.
- 20-File Freeze Tracking: Track all 20 core retrieval, RPC, security, evaluation, migration, and build files + requirements.lock in v2.2 freeze with 0 drift.
- Audit & Tooling: Update audit_retrieval_acceptance.py and test_audit_retrieval_acceptance.py to audit v2.2 asset; official candidate query execution remains strictly 0 and human approval remains PENDING.
A real Gemini State Update rejected every CONFIRMED claim that cited the
answer being processed: the cycle persists that immutable Answer and lists
it in allowedSourceRefs/retrievedContext before the model call, but it is
not lineage yet. The validator now accepts only the current route's own
USER_AUTHORED ANSWER source; external evidence, other routes and
assumption/unresolved memory still cannot confirm.

Adds an opt-in Model Service V2-Live acceptance that drives a real Gemini
Custom connection through CHAT/STRUCTURED/NATIVE_TOOLS, a real project
Agent answer cycle and a real GA native tool round trip, plus capability
invalidation, revalidation and delete isolation.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Root causes of the failing run 39951411922, each fixed at its origin
rather than at the symptom:

- e2e/provider-screenshots.spec.ts still drove the removed built-in
  OpenRouter card, and the Custom flow it exercised had been replaced by
  the "+" dialog. Migrated to the current UI: two built-ins, arbitrary
  Custom connections created/edited/switched/deleted, multiple coexisting
  connections, and an explicit assertion that no built-in OpenRouter
  entry exists. OpenRouter survives only as an ordinary Custom example.

- Two GA tests rebound to "OPENROUTER", which ModelProvider no longer
  contains. GaExecutionStore validates the provider before the state
  fence, so the tests threw IllegalArgumentException and never reached
  the immutability assertions they exist to prove. Fixtures now rebind to
  KILO: legal, and genuinely different from the frozen OPENCODE_ZEN. No
  production behaviour changed.

- C16CrossProcessWorkerAcceptanceTest switched the database-wide
  runtime_execution_mode row to PER_TASK, then its teardown threw on
  DELETE FROM retrieval_index_generations: retrieval_scope_grants holds
  an index_generation FK with no ON DELETE action. The mode rollback sat
  after that statement, so the row stayed PER_TASK and 20 later contexts
  were refused by ExecutionModeAdmission, cascading into 171 more via the
  poisoned context cache. Grants are now deleted first, TOUCHED is
  snapshotted and cleared before deletion, and the mode rollback moved to
  finally so it cannot depend on cleanup succeeding. The production
  admission guard is untouched; the same latent teardown omission is
  corrected in the two sibling tests.

- IsolatedMigrationAcceptanceTest scenario D named its synthetic failure
  migration V104, colliding with the shipped V104, so Flyway refused with
  "more than one migration with version 104" and the scenario proved
  nothing about rollback. Moved to V110, and the scenario now applies the
  whole shipped chain and asserts history is unchanged relative to its
  own baseline.

- LegacyModelConnectionMigrator copied the old singleton's
  validated_revision/validated_at. V108 scrubs such rows once at upgrade,
  but the migrator is an ApplicationRunner that imports after Flyway on
  every start, so later imports were never scrubbed and could be
  activated with zero capability proof. Import no longer inherits
  validated state; V109 scrubs already-imported rows that lack a current
  revision STRUCTURED=VERIFIED proof; requireActivatable additionally
  demands that proof, so no path can activate without a current one.
  Credentials, endpoints, models and revisions are untouched.

Verified on a purpose-built isolated database (never the dev or shared
test database): test 2585/0 failed/41 skipped, testDatabaseIntegration
980/0 failed/41 skipped, frontend unit 987 passed, typecheck and build
clean, Playwright 92 passed/4 skipped/0 failed. Every skip is an explicit
environment opt-in. No live provider was called.

Co-Authored-By: Claude Code <noreply@anthropic.com>
… tools

Project Agent: bridge ModelOutputContract.JsonObject through a versioned host
JSON envelope (anthropic-json-envelope.v1) on the official GA field
output_config.format; strict unwrap validates completed stop reasons, a
single json string field, duplicate keys, trailing tokens, unicode and size
bounds, and returns only the normalized inner object - the envelope is never
a decision output and malformed shapes fail closed without fallback.

Global Assistant: new AnthropicGaNativeTransport + GaAnthropicMessagesAdapter
provide the native tool_use/tool_result two-round protocol (ids preserved
verbatim, results merged into one following user message, tool_choice mapped
to none/auto/any with disable_parallel_tool_use). Text-then-tool_use is the
only supported mixed shape; text after tool_use and thinking blocks
accompanying executable calls are rejected at parse time before any ToolCall
is released. Thinking material never reaches responses, ledgers, wire or
checkpoints; no Anthropic sidecar is introduced.

Qualification: CHAT/STRUCTURED/NATIVE_TOOLS now probe Anthropic connections
through the same (org, UUID, revision, capability) records; the activation
gate still requires STRUCTURED=VERIFIED. Legacy single registrations may
TEXT_CHAT but never inherit native qualification.

Tests: strict FakeAnthropicMessagesProvider (inbound protocol assertions),
adapter/transport/routing/resolver unit tests, database end-to-end suites
for both agents plus a full qualification flow. Local regression: test
2654/0/41, testDatabaseIntegration 1005/0/41, python 344, tools 239,
cross-language green, frontend green. LIVE_NOT_RUN.
…review gaps

Cross-stage review of MS-C1/C2/C3 found the Chat Completions native tool
qualification probe still ran a hand-rolled HTTP path while Responses and
Anthropic already used their production transports. probeNativeTools now
routes all three formats through the same native transports the GA
execution uses (frozen binding checks, stream:false shape, safety
diagnostics), verified live against the Gemini OpenAI-compatible endpoint
(4 requests, free tier, three capabilities VERIFIED).

Also: legacy Custom maskedKey no longer echoes keys of 4 chars or fewer
(aligned with ModelProvidersService), and the Anthropic protocol adapter
merges every system message into the top-level system field instead of
silently demoting the 2nd+ to user messages.
…ity matrix

Independent review across MS-C1/C2/C3, three fixed defects (P1 probe
transport unification, P2 short-key masking, P2 system merge), the
reusable protocol compatibility matrix, full local regression counts,
and a 4-request live verification of the repaired probe path against
the Gemini OpenAI-compatible endpoint. Anthropic official endpoint
remains LIVE_NOT_RUN (no credential available).
…rt path

R1-A: the legacy Custom status boundary trusted the persisted masked_suffix
column, so a weak-masking-era row (api key of 4 chars or fewer stored verbatim
as its own suffix) disclosed the whole key as "••••abcd". status() and the
key-rotation-free save path now rederive the mask from the actual key, so
short historical keys surface null, long keys keep the last four chars only,
unchanged saves neither rewrite the row nor bump configRevision, and any
content-changing save rewrites the persisted suffix to the safe value. A
9-case suite drives old-shaped rows through the real status()/save()
boundary, including JSON serialization assertions.

R1-B: the stream:false assertion could not distinguish the pre-fix bypass
probe from the production transports. CompatibilityProbeService now creates
its three probe transports through package-private factory methods (the
production implementations unchanged), and the harness test verifies via spy
that each protocol's probe drives its own production transport factory
exactly twice (both rounds) and never the others. Differential verification:
temporarily restoring the F-1 bypass branch fails the new assertion
(newChatCompletionsTransport wanted 2, was 0) while stream:false stays green,
proving the old assertion had no discriminating power.
…key masking primitives

Cluster 1 - GA response contract validation:
The three protocol adapters (GaChatCompletionsAdapter, GaAnthropicMessagesAdapter,
GaResponsesAdapter) each carried a byte-identical implementation of the same
safety invariants (tool_choice consistency, catalog-authorized tool names, no
replayed tool call ids), two of them with zero test coverage. The rule now has
a single owner in the contract layer (GaResponseContractValidator); all three
adapters delegate with their public API unchanged and the six transport
call sites untouched. GaNativeModelBroker's authoritative re-check calls the
contract layer directly, removing the only assistant.api -> model.provider
reference, and a new ArchUnit guard (red first against the pre-fix broker,
green after) keeps that boundary enforced. Rejection-path tests now cover the
shared implementation directly, closing the Anthropic/Responses coverage gap.

Cluster 2 - Model Settings redundancy and key masking:
Removed the redundant selectedModel comparison inside ModelProvidersService.update
(recorded by MS-CROSS; pure boolean simplification). The key-masking primitives
previously maintained four times (suffix, with Kilo/OpenCode returning empty
string for short keys while the others returned null) plus duplicated hasKey and
equalsNullable helpers now live in ApiKeyMasking with the MS-CROSS-R1 semantics
(short keys yield null). The empty-string-to-null storage change is proven
externally equivalent at every read point (both masks normalize blank/null) and
locked by the existing Kilo/LegacyShortKeyMasking suites; intentionally different
mask formats and the origin guards are left as-is.

Behavior equivalence is locked by the existing suites (testOffline 487/0,
full test 2676, testDatabaseIntegration 1005/0 on an isolated database,
testCrossLanguage 2/0, evalBFast 166/0, ArchUnit 65/0, Python pytest 344/0,
frontend typecheck/unit/build) plus 11 new protective tests. Evidence under
docs/acceptance-evidence/arch-quality-01-20261025/. LIVE_NOT_RUN.
Remote CI run 40125288536 for deeca2c completed 10/10 SUCCESS (all jobs:
contracts-static, backend-independent, brain, validation-mode, frontend,
backend, e2e, eval-baseline, cross-language, validation-summary), matching
the a30de0c baseline. Final verdict: ARCH_QUALITY_01_PASS.
…col version sources

簇 A:ContractDiagnostic 与安全提取原语收敛到 contracts/diagnostics.py,
state_update/artifact 引擎失败路径补齐结构化诊断并去除异常文本中的
模型输出嵌入;簇 B:WAIT dependencyRef 判定收敛为
wait_payload_matches_contract 单一原语,生产拒绝与信封自检共享;
簇 C:GA 协议版本字面量以 Final 常量单一来源化,/health 公告、事件
发送与 broker 请求全部引用常量。异常类名、HTTP 状态码与机器码
词汇表不变,Java 错误映射不受影响。
- RUNBOOK 默认引擎段落:默认值已是 langchain-ga.v1/python-rag.v1,
  java-legacy.v1 已删除;回滚段补回滚目标限定
- C16_WAIT_V4.md 与 v2/README.md:真实数据库/跨进程/E2E 验收已由
  c16-real-integration-20261021 在隔离环境完成,回写事实对应关系
- C16_RETRIEVAL_READINESS_ADAPTER.md:状态行与发布门槛段按真实集成
  证据更新,首版 NOT RUN 断言按原文保留为历史

历史证据与冻结资产未改动;adapter delivery.md 的 Superseded 标注
位于未跟踪 WIP 目录内,随该目录由 owner 处置。
- A0 文档真实性修复差异清单(a0-doc-fact-fixes)
- A1 RAG 68 条人工审批交接清单(rag-human-review-handoff)
- A2 dev→main PR 就绪检查与 tree-hash 核验方案(pr-readiness)
- A3 全链路验证结果与 CI 证据(a3-verification)
- A4 DB 中断恢复验收清单(db-outage-recovery-acceptance)
- 最终裁决 READY_FOR_MERGE_REVIEW(summary):代码集成就绪,
  生产发布就绪否,人工待办分列

@BangShou1st BangShou1st left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

对 PR #22(HEAD 25902a55b226b8e32e49534278222d3fbfa4f321)的只读集成审查。结论:暂不建议合并,需处理下列门禁不一致;没有执行 merge、未修改代码或 WIP。

[P1] 已激活 UUID CUSTOM 连接在复验失败后,仍可被新 GA Run 接纳。

复核调用链:

  1. ModelConnectionCapabilities.verify() 在探测失败时,把当前 revision 的 STRUCTURED 状态 UPSERT 为 TEMPORARILY_UNAVAILABLE。
  2. ModelProvidersService.validate() 仅在 STRUCTURED=VERIFIED 时调用 markValidated,但失败时没有清除历史 validated_revision。
  3. CustomProviderSettingsService.connectionSettings() 只检查 row.validated(),没有检查相同 org/UUID/revision 下的 STRUCTURED=VERIFIED。
  4. GaExecutionModelTargetResolver.resolveCustom(true, selectedId) 为新 Run 调用 requireRuntimeSettings(selectedId) 并返回 Ready;项目推理 ActiveModelTargetService 亦经此路径。与此同时,ModelProvidersService.requireActivatable() 已明确要求当前 STRUCTURED proof。于是出现“激活门禁拒绝/运行时或新 GA 准备阶段放行”的分歧。

建议:把当前修订号的 STRUCTURED=VERIFIED 检查落实在 UUID 连接的准备/运行时解析边界,或在复验降级时原子地清除相应的历史 validated 标记,并增加回归:先 VERIFIED+activate,再模拟 provider 复验失败,确认新 GA Run 和 Agent 解析 fail-closed;同时保留已冻结 Run 的设计语义,避免无意改变既有执行。相关位置:backend/src/main/java/com/specagent/modelsettings/{ModelConnectionCapabilities.java,ModelProvidersService.java,CustomProviderSettingsService.java}、backend/src/main/java/com/specagent/assistant/runtime/GaExecutionModelTargetResolver.java。

[P2] 评审元数据待同步。 PR 描述仍写 38 commits,但 GitHub 当前 main...dev 是 40 ahead / 0 behind、354 files;efbe11a..25902a5 两次变更仅 docs/证据。最终合并前需锁定 PR head 和 main base SHA 后再核验 tree-hash。另 a3-verification.md 中 skipped 分类标注数量相加为 43(25+11+1+5+1),与实际报告的 41 不符,请核对具体计数,不改变原始测试事实。

CI 范围: 40152643427 的 10 job 为 success(旧代码 HEAD efbe11a);当前 PR HEAD 的 40165818065 在本次审查时仍执行中(backend/brain/frontend/cross-language/eval-baseline 等已 success,e2e 仍在跑)。不能在当前 HEAD 的必需检查最终完成前授权合并。

V104–V110 迁移的脚本级依赖、约束与提交范围已抽查,未见明确 P0;RAG 人审与 DB 中断演练仍为生产发布阻断,不可用此次 review 代签。请在修复或书面确认 P1 的设计意图、回归证据齐备且 PR HEAD 检查完成后重新裁决合并。

Copy link
Copy Markdown
Owner Author

补充 PR #22 审查状态(同一 HEAD 25902a55b226b8e32e49534278222d3fbfa4f321):刚刚复核 GitHub Actions Run 40165818065,现已 completed / success,10/10 jobs success,含 e2e 与 validation-summary。先前 review 中“当前 HEAD CI 进行中”的时点信息已解除。代码层 P1(STRUCTURED 复验降级后的 UUID CUSTOM 运行时门禁不一致)仍待处理或提供可复核的反证,因此继续建议暂缓合并;这与 CI 绿灯不矛盾。

PR #22 Review 5641753298 P1:同一 config_revision 下复验失败把 STRUCTURED
降级为 TEMPORARILY_UNAVAILABLE,但历史 validated_revision 不清除;运行时
新 Run 准入(requireRuntimeSettings()/requireRuntimeSettings(UUID) ->
connectionSettings(id, null))此前仅凭过期 validated 标志放行,与激活门禁
requireActivatable()(要求当前 STRUCTURED=VERIFIED)结论分歧。

修复:connectionSettings 在 revision == null(新 Run 路径)统一要求当前
(org, UUID, config_revision) 的 STRUCTURED=VERIFIED——与激活门禁同一权威
能力来源;revision != null 的冻结绑定路径按设计契约不重复施加能力门禁,
降级不误杀已合法冻结的 Run;不采用清除 validated_revision 的方案。

回归:三个测试类新增 4 用例(降级后新 GA Run 与 Project Agent Run 拒绝、
直接读取不绕门禁、冻结语义不变、恢复准入、身份/org/revision 不继承、
NATIVE_TOOLS 不替代 STRUCTURED、无凭据泄漏);修复前红灯复现,修复后全绿。

P2:a3-verification.md skipped 分类勘误(GaExec 25->23,分项和 41 与总数一致)。

本地验证(隔离库+Fake Provider):testOffline 489/0/0;test 2680/0/41;
testDatabaseIntegration 1007/0/41(skips 均为显式环境门控)。

证据:docs/acceptance-evidence/pr-22-review-fix-01-20261025/
@BangShou1st

Copy link
Copy Markdown
Owner Author

PR-22-REVIEW-FIX-01 — 对 Review 5641753298 的逐项回应(commit 906ee3c,仅此一个修复提交,fast-forward 推送)

[P1] STRUCTURED 资格降级后运行时门禁放行 —— 复核成立,已修复。

  • 复核:三条新 Run 入口(GaExecutionPreparation → resolveActive() → resolveCustom(true, selectedId)、RoutingModelInferenceGateway 未绑定 Run → ActiveModelTargetService.activeTarget()、CustomInferenceGateway.resolve())全部收敛于 CustomProviderSettingsService.connectionSettings(id, null),而它此前只查过期 row.validated();激活门禁 requireActivatable() 另要求当前 STRUCTURED 证明 —— 分歧属实。
  • 修复(采纳您建议的第一方案,边界统一资格检查):connectionSettings 在 revision == null(新 Run 准入)要求当前 (org, UUID, config_revision) STRUCTURED=VERIFIED,与激活门禁同一权威能力行;不新增平行状态源。
  • 刻意未采用"复验降级时原子清除 validated_revision":requireFrozen 的设计契约(同一文件 javadoc)明确冻结 Run 不重复施加验证门禁,而冻结路径依赖 row.validated();清除标记会把已合法冻结的 Run 误杀为绑定失配。回归中专门断言了"降级后冻结引用继续、revision 漂移仍失败关闭"。
  • 回归(隔离库 + FakeModelProvider,修复前红灯复现 → 修复后全绿):新 GA Run 拒绝、新 Project Agent Run 拒绝且零供应商请求、直接 requireRuntimeSettings()/(UUID) 读取不绕门禁、恢复 VERIFIED 后合法准入、不同 org/UUID/revision 不继承资格、冻结语义不变、NATIVE_TOOLS 证明不替代 STRUCTURED、失败消息不含密钥。共 4 个新用例分布在 ModelConnectionsOfflineTest / ModelConnectionsIntegrationTest / GaExecutionModelTargetResolverTest。
  • wire 契约:拒绝路径沿用既有 GA_MODEL_BINDING_MISMATCH(与"未验证连接"现状一致),GA 准备阶段既有 catch 终态化为 GA_MODEL_NOT_CONFIGURED,未新增/改变 HTTP 状态码与机器码。

[P2] 评审元数据 —— 已核实并勘误。

  • 重跑全量并对 JUnit XML 逐类统计:GaExecutionCoordinatorIntegrationTest 实测 23(原文误写 25;含一个 4 参数 fault-injection 用例的展开),23+11+1+5+1=41,与申报总数一致;总数从来正确,错在分项。skip 性质描述无误。
  • a3-verification.md 已就地勘误(附勘误注,未改测试与执行事实);PR 描述提交数已按实时数据更新(41)。历史证据(efbe11a run 40152643427、25902a5 run 40165818065)保留为基线。

CI:新 HEAD 906ee3c 的 runs 40170687660 / 40170691663 执行中,合并裁决以其最终结论为准。本地隔离验证:testOffline 489/0/0、test 2680/0/41、testDatabaseIntegration 1007/0/41。证据目录:docs/acceptance-evidence/pr-22-review-fix-01-20261025/。

未执行 merge;RAG 人审与 DB 中断演练等生产发布阻断事项不变。

@BangShou1st

Copy link
Copy Markdown
Owner Author

PR-22-REVIEW-FIX-01 最终状态

  • 最终 HEAD 13d7e9f(= 906ee3c 修复 + docs 证据回填)CI:runs 40171823825 / 40171827974 均 10/10 job success(backend / brain / frontend / e2e / cross-language / eval-baseline / contracts-static / validation-mode / backend-independent / validation-summary)。
  • 修复 HEAD 906ee3c CI:runs 40170687660 / 40170691663 各 10/10 success(见上一条回应评论)。
  • 裁决:READY_FOR_MERGE_DECISION(docs/acceptance-evidence/pr-22-review-fix-01-20261025/summary.md),等待 owner 合并授权。合并模式 merge commit(禁 squash),合并前执行 PR 描述中的 tree-hash 核验。
  • 生产发布阻断事项不变:RAG 68 条人工审阅 + 首轮阈值批准、DB 中断演练对最终发布 jar 复验、生产切换授权。

@BangShou1st BangShou1st changed the title Release readiness: merge dev (38 commits, RAG-D3/D4 + model-service V104–V110 + GA continuation + arch-quality) — awaiting human merge decision Release readiness: merge dev (42 commits, RAG-D3/D4 + model-service V104–V110 + GA continuation + arch-quality) — approved for integration Oct 25, 2026
@BangShou1st BangShou1st changed the title Release readiness: merge dev (42 commits, RAG-D3/D4 + model-service V104–V110 + GA continuation + arch-quality) — approved for integration Release readiness: merge dev (42 commits, RAG-D3/D4 + V104–V110 + GA continuation) — BLOCKED by main linear-history rule Oct 25, 2026

Copy link
Copy Markdown
Owner Author

PR #22 受控合并尝试结果:BLOCKED(未合并)

  • 授权的合并方式:merge commit,明确禁止 squash/rebase、强推或绕过保护规则。
  • 尝试前已核验:base 742870d6c143d75ce7ab4cc331947932aa0aea47,head 13d7e9ff2d8c0e520650776370047e8889c90a1e;main...dev 42 ahead / 0 behind;两个最终 HEAD CI Run 40171823825、40171827974 均 10/10 success。
  • 预合并 dev tree SHA:53a957ad45e060f51e06e3449c350648241e8b30。
  • 用 GitHub PR Merge API 发起 merge_method=merge 并传入 expected_head_sha,返回 HTTP 405: "Merge commits are not allowed on this repository."
  • 根因:仓库整体 allow_merge_commit=true,但生效的 Protect main ruleset #25617746 含 required_linear_history,与 merge-commit 要求冲突。规则详情: https://github.com/BangShou1st/spec-agent/rules/25617746
  • 失败后确认 PR 仍 open、merged=false,main/dev 的 HEAD 均未移动。未使用 squash/rebase、未修改 ruleset、未绕过分支保护。
  • 后续需仓库 owner 决定是否移除/调整 required_linear_history,使 merge commit 与分支规则一致,然后在新的合并尝试前复核 HEAD/CI/规则,再执行 merge 并验证最终 main tree 与上述 dev tree 相等。

代码集成因规则配置冲突阻断;生产发布继续被 RAG 人审、最终发布 jar DB outage 验收和生产切换授权阻断。

@BangShou1st
BangShou1st merged commit 7e69cda into main Oct 25, 2026
20 checks passed
@BangShou1st BangShou1st changed the title Release readiness: merge dev (42 commits, RAG-D3/D4 + V104–V110 + GA continuation) — BLOCKED by main linear-history rule Release readiness: merge dev (42 commits, RAG-D3/D4 + V104–V110 + GA continuation + review-fix-01) Oct 25, 2026
@BangShou1st

Copy link
Copy Markdown
Owner Author

PR #22 已合并(merge commit 7e69cda)——阻断解除记录

  • 经 owner 授权,仓库规则集 "Protect main"(id 25617746)移除 required_linear_history 一项;deletion、non_fast_forward、pull_request(merge/squash/rebase 方法、0 approvals、未署名变更需额外批准)、required_status_checks(validation-summary/backend/frontend/brain)全部原样保留。API PUT 于 2026-10-25 执行,前后规则清单已在会话记录中留档。
  • 合并方式:merge commit(禁 squash 要求遵守);合并时 HEAD 13d7e9f CI 双 run 10/10 success。
  • 核验:git rev-parse origin/main^{tree} = origin/dev^{tree} = 53a957a;git diff --stat origin/main origin/dev 为空;dev 相对 main 0 ahead(main 仅多出合并提交自身 7e69cda)。
  • 生产发布阻断不变:RAG 68 条人审+首轮阈值批准、DB 中断演练复验、生产切换授权。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant