diff --git a/.doc/ops/CURRENT.md b/.doc/ops/CURRENT.md index 39a1f286..6d175eee 100644 --- a/.doc/ops/CURRENT.md +++ b/.doc/ops/CURRENT.md @@ -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 | diff --git a/.doc/ops/short-term/2026-09-24-jev-dev-shadow-enable.md b/.doc/ops/short-term/2026-09-24-jev-dev-shadow-enable.md new file mode 100644 index 00000000..c00c6c39 --- /dev/null +++ b/.doc/ops/short-term/2026-09-24-jev-dev-shadow-enable.md @@ -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 diff --git a/.doc/status/FEATURE-MATRIX.md b/.doc/status/FEATURE-MATRIX.md index 7b72669b..5c9f00fb 100644 --- a/.doc/status/FEATURE-MATRIX.md +++ b/.doc/status/FEATURE-MATRIX.md @@ -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` | diff --git a/.doc/test-reports/2026-09-24-jev-dev-shadow-enable-test-report.md b/.doc/test-reports/2026-09-24-jev-dev-shadow-enable-test-report.md new file mode 100644 index 00000000..5845ad05 --- /dev/null +++ b/.doc/test-reports/2026-09-24-jev-dev-shadow-enable-test-report.md @@ -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`。 diff --git a/.env.example b/.env.example index f6e79039..9e6cdc8a 100644 --- a/.env.example +++ b/.env.example @@ -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=