merge: candidate jev-dev-shadow-on into local_dev

This commit is contained in:
weichen
2026-09-23 17:48:17 +00:00
5 changed files with 102 additions and 1 deletions
+1
View File
@@ -18,6 +18,7 @@
| owner | task | branch | worktree | mutex | status |
|---|---|---|---|---|---|
| Cursor | jev-dev-shadow-on-2026-09-24 | feature/jev-dev-shadow-on-2026-09-24 | .worktrees/jev-dev-shadow-on-2026-09-24 | env:dev+jevdecide | done |
| Cursor | jev-product-closeout-2026-09-24 | feature/jev-product-closeout-2026-09-24 | .worktrees/jev-product-closeout-2026-09-24 | jevdecide+coordinator | done |
| Cursor | jev-product-shadow-2026-09-24 | feature/jev-product-shadow-2026-09-24 | .worktrees/jev-product-shadow-2026-09-24 | jevdecide+coordinator | done |
| Cursor | jev-mcp-docs-done-2026-09-24 | feature/jev-mcp-docs-done-2026-09-24 | .worktrees/jev-mcp-docs-done-2026-09-24 | jev-mcp+docs | done |
@@ -0,0 +1,36 @@
---
status: done
write_scope: configs/.env.dev(local),env:dev,.doc
mutex: env:dev+jevdecide
base_dev_sha: d8214a09
review_state: self-reviewed
integration_state: docs_only
deployment: local_dev_shadow_on
cleanup: pending
remote_sync: not_pushed
owner: Cursor
task_id: jev-dev-shadow-on-2026-09-24
---
# local_dev 启用 jev-service(shadow)
## 目标
在运行中的 `local_dev` 打开产品侧 `JEV_DECIDE_MODE=shadow`,对接本机 jev-service,不改 compose 默认(仍 `off`),不放量 `assist`。
## 做法
1. `configs/.env.dev`(gitignore)写入:
- `JEV_DECIDE_MODE=shadow`
- `JEV_BASE_URL=http://172.17.0.1:8767`(容器经 docker0 网桥访问宿主机;`host.docker.internal` 本机不可达)
- `JEV_API_KEY` 自 `~/.secrets/jev/api.key` 注入(不入库)
2. `agentctl with --resource env:dev` → `./scripts/env-service.sh dev rebuild`(旧镜像无 jevdecide 接线,仅 recreate 不够)
3. 验证见 [启用报告](../../test-reports/2026-09-24-jev-dev-shadow-enable-test-report.md)
## 回退
将 `configs/.env.dev` 中 `JEV_DECIDE_MODE=off`(或删 JEV_*)后 `env-service.sh dev` recreate/restart app。
## 非目标
- 不改 compose 默认、不推远端、不晋升 test/main、不启用 assist
+1 -1
View File
@@ -49,7 +49,7 @@
| record_id | 模块 | 声明范围 | 状态 | 发布关系 | 证据 | 剩余工作 / 关闭条件 | mutex |
|------|----------|------|----------|------|---------------------|-------|-------|
| jevdecide-shadow | jev 产品决策 shadow | jevdecide 客户端 + coordinator realtime/ProfileTask shadow;默认 JEV_DECIDE_MODE=off;assist 代码就绪未放量 | partial | deferred_enhancement | [报告](../test-reports/2026-09-24-jev-product-shadow-test-report.md);[short-term](../ops/short-term/2026-09-24-jev-product-shadow.md) | 关闭条件:线上 shadow 浸泡≥200 真实轮 + 用户授权 assist;intent/risk 决策点另立任务。本行不升 done | `jevdecide` |
| jevdecide-shadow | jev 产品决策 shadow | jevdecide 客户端 + coordinator realtime/ProfileTask shadow;compose 默认 off;**local_dev 已开 shadow**(`configs/.env.dev`,容器经 172.17.0.1:8767);assist 未放量 | partial | deferred_enhancement | [产品报告](../test-reports/2026-09-24-jev-product-shadow-test-report.md);[启用报告](../test-reports/2026-09-24-jev-dev-shadow-enable-test-report.md);[启用短文](../ops/short-term/2026-09-24-jev-dev-shadow-enable.md) | 关闭条件:真实轮浸泡≥200 + 用户授权 assist;intent/risk 另立任务。本行不升 done | `jevdecide` |
| chat-semantic-replace | 语义摘要 REPLACE | 以 shadow 叙事可选替换 served deterministic Narrative(fail-closed 灰度) | deferred | deferred_enhancement | [Wave5 X-2](../ops/short-term/2026-09-18-wave5-deadcode-decisions.md);[pu6](../ops/long-term/2026-09-16-pu6-semantic-summary-contract.md);[summary_flags](../../internal/ctxmgr/summary_flags.go) | 关闭条件:用户独立授权 + fail-closed 灰度设计;`SEMANTIC_SUMMARY_REPLACE` 当前密封不接线。本行不自动升 done | `chat` |
| gov-agent-worktree | Agent worktree 治理自动化 | 主目录保护、任务 worktree、机器认领、候选集成、dev 部署与安全清理 | partial | non_blocker | [方案](../remediation/2026-09-21-agent-workflow-governance-plan.md);[L1 验收](../test-reports/2026-09-21-agent-governance-test-report.md);[W1-B macOS](../ops/short-term/2026-09-22-agentctl-macos.md);[W4](../ops/short-term/2026-09-22-governance-automation.md);residual `modular-decouple-residual-2026-09-23` | L1 与 macOS `with/docs apply/validate/integrate` 已合入。W4 landed:durable queue + 完整 docs projection apply(行/整文 CAS)+ deploy/recover 真实收据闭环 + Darwin cwd 可见性测试。仍 deferred:PI 源码镜像 compose、跨机隔离、automation/w4 实现收敛。本行不升 done | `agent-workflow-governance` |
| intent-l1 | 意图识别 L1 | 18 类 Intent、三分支消解、写/只读分流、双标签 `DOC_BUSY`、intent 纯依赖边界 | done | non_blocker | [intent-recognition](../system-design/intent-recognition/);[工作流作用域](../test-reports/2026-09-21-intent-workflow-scoping-test-report.md);[审计](../audit/2026-09-13-conversation-intent-runtime-state.md);[报告](../test-reports/2026-09-13-conversation-intent-runtime-state-test-report.md);[双标签](../test-reports/assets/2026-09-15-conversation-intent-dual-tab/live.json);[U1](../test-reports/2026-09-15-multi-intent-u1-contracts-test-report.md)–[U3](../test-reports/2026-09-15-multi-intent-u3-intentflow-pg-test-report.md) | **边界 before**:含 U9–U12 叙事混入 → **after**:U9–U12 迁至「多意图扩面」行。关闭:纯依赖边界回归即重开 | `intent` |
@@ -0,0 +1,62 @@
# local_dev jev-service shadow 启用 测试报告
## 一、 测试背景 (Background)
产品侧 jevdecide 已合入 `local_dev@d8214a09`,compose 默认 `JEV_DECIDE_MODE=off`。本任务在运行中的 dev 环境打开 shadow,验证容器可达本机 jev-service 且 realtime/ProfileTask shadow 日志落盘。
## 二、 测试目标 (Test Objectives)
- app 进程 `JEV_DECIDE_MODE=shadow` 且启动日志 `jevdecide wired`
- 容器内 `POST /v1/decide` HTTP 200 且返回非空 answers
- 真实 chat「今天上海天气怎么样」产生 `jevdecide realtime shadow` / `profile shadow`,agree=true
- 回退路径明确(改 env 即可);不启用 assist
## 三、 测试方案与环境 (Test Plan & Environment)
- OS:Linux;环境:`shuimu-agent-app-dev`;jev-service:`127.0.0.1:8767`(容器侧 `172.17.0.1:8767`)
- 层级:运维启用验收(非产品 PI 全链路门禁复测)
- **全量 `go test ./...`:NOT REQUIRED**(依据 PROJECT §8 / worktree 规范:纯环境开关与文档;产品门禁已在 [jev-product-shadow 报告](./2026-09-24-jev-product-shadow-test-report.md))
## 四、 预期结果 (Expected Results)
| 用例 | 预期 |
|------|------|
| 启动接线 | `msg="jevdecide wired" mode=shadow endpoint=http://172.17.0.1:8767` |
| 容器 decide | HTTP 200,`answers.realtime` 含 choice/confidence |
| chat 天气 | realtime shadow agree;profile shadow 有日志 |
## 五、 实际测试结果与判定 (Actual Results & Evaluation)
### 5.1 启动接线
- **输入**:`env-service.sh dev rebuild` 后 `docker logs … \| grep jevdecide`
- **实际输出**:`time=2026-09-23T17:46:24.393Z level=INFO msg="jevdecide wired" mode=shadow endpoint=http://172.17.0.1:8767`
- **判定**:PASS
- **耗时**:rebuild ~20s;healthy 后即见日志
### 5.2 容器内 decide
- **输入**:app 容器内 `curl` → `$JEV_BASE_URL/v1/decide`(Bearer=$JEV_API_KEY;context=今天上海天气怎么样;noul realtime)
- **实际输出**:HTTP 200;`choice=yes confidence≈0.998`
- **判定**:PASS
- **耗时**:~0.4s
### 5.3 真实 chat shadow
- **输入**:`POST /api/v1/chat` message=`今天上海天气怎么样` session=`jev-shadow-enable-probe`
- **实际输出(日志)**:
- `jevdecide realtime shadow mode=shadow rule=true jev=true confidence=0.997951 margin=0.99590182 agree=true`
- `jevdecide profile shadow mode=shadow rule_bucket=low jev_bucket=low … agree=true`
- **业务回复**:天气问答正常(fail-open / shadow 不改规则路径语义)
- **判定**:PASS
- **耗时**:chat 端到端 ~15s
## 六、 自动化测试套件汇总 (Test Suite Execution)
NOT REQUIRED(运维启用;产品评测/soak 见既有 shadow 报告)。本报告不记产品测试 PASS。
## 七、 测试结论与后续优化建议 (Conclusion & Next Steps)
- **local_dev shadow 已启用且端到端可观测**。
- 回退:`configs/.env.dev` → `JEV_DECIDE_MODE=off` 后 recreate app。
- 后续:真实轮浸泡计数;用户单独授权后再开 `assist`。compose 默认保持 `off`。
+2
View File
@@ -113,6 +113,8 @@ INTENT_V2_DECISION=false
INTENT_V2_DECISION_TIER=none
# jev-service typed decide (product shadow/assist; default off)
# local_dev enable: set JEV_DECIDE_MODE=shadow in configs/.env.dev (gitignored) + rebuild app.
# From Docker app → host jev: use http://172.17.0.1:8767 (host.docker.internal may be unreachable).
JEV_DECIDE_MODE=off
JEV_BASE_URL=http://127.0.0.1:8767
JEV_API_KEY=