diff --git a/SESSION.md b/SESSION.md index f467f7f..652e6a9 100644 --- a/SESSION.md +++ b/SESSION.md @@ -837,11 +837,12 @@ Automation execution-layer PXX remains closed and its known scope stays frozen. - S7/S8 read-only reliability and trader SOP is implemented, deployed, and remote-verified: added `docs/AI_ICT_只读实盘可靠性与交易员SOP_S7S8_2026-05-21_v1.md`, `maintenance_summary.readonly_live_reliability`, and `trader_mode_summary.ops_duty_panel.trader_safe_health`. Trader Cockpit now shows only a trader-safe read-only use conclusion plus recovery action, while System Ops exposes proxy / market freshness / runtime / review packet / REST fallback / stream / news-account diagnostics. Warning states remain analysis-use guidance only and are not trade signals. Validation passed focused unit/static checks, script static checks, full unit discovery (`807` tests), deploy smoke over 11 endpoints, remote ops smoke, readonly live analysis smoke, field smoke, and gstack browser verification on `/trader-mode#system-ops` with no console errors. - S9 Trader Cockpit status copy compression is implemented, deployed, and remote-verified: added `docs/AI_ICT_TraderCockpit状态话术压缩_S9_2026-05-21_v1.md`; `trader_mode_summary.trader_readout` now exposes fixed six-card copy fields `Now / Reason / Wait / Risk / Historical Edge / Boundary`, and the frontend prioritizes those compressed fields before fallback text. `Review Now` now reads as manual review only, `Observe Only` as wait/no-trade, and `Do Not Use` as restore data/runtime first. Chinese Trader Cockpit display now renders the six cards as trader-readable sentences and removes the visible S9 residues `Risk:`, `Wait for FVG`, `Trader Mode changed:`, and raw `sweep -> MSS -> FVG` on `/trader-mode`. Validation passed focused operator/static/docs tests, `node --check`, script static checks, full unit discovery (`807` tests), `git diff --check` with only LF/CRLF warnings, deploy smoke over 11 endpoints, remote ops smoke, readonly live analysis smoke, six-card field smoke, and gstack browser verification with no console errors. Evidence screenshot: `output/playwright/s9-trader-cockpit-six-card-copy-final2-1366x768.png`. - S10 real intraday feedback validation is implemented, deployed, and remote-verified: added `docs/AI_ICT_TraderCockpit真实反馈验证_S10_2026-05-21_v1.md`; used real remote evidence (`operator_feedback_count=3`, recent Candidate `4610` observation with `operator_agreement=unclear`, `paper_ticket_count=0`, `paper_execution_count=0`, `weekly_review_entry_count=0`) to tighten the six-card copy without adding features. `Observe Only` now says the explicit gap (`FVG retrace is not confirmed yet; no trade`), `Wait` says the operator should wait for `trigger-chart FVG retrace confirmation`, `Risk` warns against treating the watch as a signal, and `Historical Edge` is reduced to Study / Review-only language without first-screen PF/DD/expectancy detail. Validation passed focused operator/static/docs tests, `node --check`, script static checks, full unit discovery (`807` tests), `git diff --check` with only LF/CRLF warnings, deploy smoke over 11 endpoints, remote ops smoke, readonly live analysis smoke, six-card field smoke, and gstack browser verification with no console errors. Evidence screenshot: `output/playwright/s10-trader-cockpit-real-feedback-six-card-1366x768.png`. -- Current assisted-analysis next gate: proceed to S11 only: continue real intraday use on `/trader-mode`; if `unclear` appears again, adjust only existing `Reason` / `Wait` / `Risk` wording or hide overly detailed text. Do not add new product features, do not restart external-context/archive/digest long-tail work, do not physically delete S1 deprecated surfaces yet, and keep R2 sample collection honest. Paper ticket / paper execution / weekly review gates still wait for a real executable candidate and cannot be backfilled from blocked candidates. +- S11 real intraday use loop is implemented, deployed, and remote-verified: remote `/trader-mode` showed the S10 six-card conclusion clearly (`FVG retrace is not confirmed yet; no trade`), so the operator recorded a real `No Trade` instead of tuning more copy. This created observation `9237` with `operator_agreement=no_trade` for Candidate `4610`; `operator_feedback_count` increased from `3` to `4`, while `paper_ticket_count=0`, `paper_execution_count=0`, and `weekly_review_entry_count=0` stayed unchanged. A feedback mapping bug was fixed so Trader Cockpit buttons now write `no_trade` and `need_more_evidence` explicitly instead of collapsing both into `unclear`. Validation passed focused tests, `node --check`, deploy smoke over 11 endpoints, remote ops smoke, readonly live analysis smoke, field verification, and gstack browser verification with no console errors. Evidence screenshot: `output/playwright/s11-trader-mode-no-trade-feedback-1366x768.png`. +- Current assisted-analysis next gate: proceed to S12 only: collect one more real `/trader-mode` operator feedback sample to move `operator_feedback_count` from `4/5` to `5/5`; do not tune copy unless the next real feedback is `unclear` or `disagree`. Paper ticket / paper execution / weekly review gates still wait for a real executable candidate and cannot be backfilled from blocked candidates. Do not add new product features, do not restart external-context/archive/digest long-tail work, do not physically delete S1 deprecated surfaces yet, and keep `execution_allowed`, `decision_support_ready`, `real_live_ready`, risk governor, trust bucket, and operator confirmation protocol unchanged. ## Exact Next Step -Use `docs/AI_ICT_实盘辅助分析决策助手ICT主线开发方案_2026-05-21_v1.md`, `docs/AI_ICT_ICT主线概念字典_S2_2026-05-21_v1.md`, `docs/AI_ICT_ReviewNow主线Gate_S3S4_2026-05-21_v1.md`, `docs/AI_ICT_Cockpit链路句与反馈错误分类_S5S6_2026-05-21_v1.md`, `docs/AI_ICT_只读实盘可靠性与交易员SOP_S7S8_2026-05-21_v1.md`, `docs/AI_ICT_TraderCockpit状态话术压缩_S9_2026-05-21_v1.md`, and `docs/AI_ICT_TraderCockpit真实反馈验证_S10_2026-05-21_v1.md` as the active anchors. Continue with S11: use `/trader-mode` in the real intraday loop and collect the next real operator feedback. If the next feedback is still `unclear` or `disagree`, adjust only existing text/hiding rules around `Reason`, `Wait`, and `Risk`; if feedback is clear, stop tuning and wait for a real executable candidate before paper ticket / paper execution evidence. Do not restart external-context/archive/digest long-tail work, do not create order-submission features, do not physically delete S1 deprecated surfaces yet, and do not fabricate R2 paper samples. Keep `execution_allowed`, `decision_support_ready`, `real_live_ready`, risk governor, trust bucket, and operator confirmation protocol unchanged. +Use `docs/AI_ICT_实盘辅助分析决策助手ICT主线开发方案_2026-05-21_v1.md`, `docs/AI_ICT_ICT主线概念字典_S2_2026-05-21_v1.md`, `docs/AI_ICT_ReviewNow主线Gate_S3S4_2026-05-21_v1.md`, `docs/AI_ICT_Cockpit链路句与反馈错误分类_S5S6_2026-05-21_v1.md`, `docs/AI_ICT_只读实盘可靠性与交易员SOP_S7S8_2026-05-21_v1.md`, `docs/AI_ICT_TraderCockpit状态话术压缩_S9_2026-05-21_v1.md`, and `docs/AI_ICT_TraderCockpit真实反馈验证_S10_2026-05-21_v1.md` as the active anchors. Continue with S12: use `/trader-mode` in the real intraday loop and collect the fifth real operator feedback sample. If it is clear (`agree` / `no_trade`), do not tune copy; if it is `unclear` or `disagree`, adjust only existing text/hiding rules around `Reason`, `Wait`, and `Risk`. Do not restart external-context/archive/digest long-tail work, do not create order-submission features, do not physically delete S1 deprecated surfaces yet, and do not fabricate R2 paper samples. Keep `execution_allowed`, `decision_support_ready`, `real_live_ready`, risk governor, trust bucket, and operator confirmation protocol unchanged. ## Validation Commands Used Recently diff --git a/TASKS.md b/TASKS.md index d3c5dce..166d77e 100644 --- a/TASKS.md +++ b/TASKS.md @@ -941,9 +941,10 @@ - [x] S7/S8 read-only live reliability and trader SOP: Trader Cockpit now shows a trader-safe read-only use conclusion / recovery action, System Ops exposes proxy / market freshness / runtime / review packet / REST fallback / stream / news-account diagnostics, and the one-page intraday/backtest/review SOP is documented, deployed, remote-smoked, field-smoked, and gstack browser-verified with no console errors - [x] S9 Trader Cockpit status copy compression: first-screen readout now uses fixed `Now / Reason / Wait / Risk / Historical Edge / Boundary` cards, keeps `Review Now` as manual review only, `Observe Only` as wait/no-trade, and `Do Not Use` as restore data/runtime first without adding features or widening beyond the ICT book mainline; deployed and remote-verified on `/trader-mode` with Chinese six-card wording and no S9 English residue in the checked cards - [x] S10 real intraday feedback validation: used real `operator_agreement=unclear` feedback on Candidate `4610` to tighten the six-card copy; `Observe Only` now names the missing FVG confirmation, `Wait` points to trigger-chart FVG retrace confirmation, `Risk` warns not to treat the watch as a signal, and `Historical Edge` is Study / Review-only without first-screen PF/DD/expectancy detail; deployed and remote/browser verified -- [ ] S11 next gate: continue real `/trader-mode` use and collect the next real operator feedback; if `unclear`/`disagree` recurs, tune only existing `Reason` / `Wait` / `Risk` text or hiding rules, otherwise stop tuning and wait for a real executable candidate before paper ticket / paper execution evidence +- [x] S11 real intraday use loop: `/trader-mode` six-card wording was clear enough to record a real `No Trade`; fixed existing feedback mapping so `No Trade` writes `operator_agreement=no_trade` and `Need More Evidence` writes `need_more_evidence`; remote observation `9237` increased `operator_feedback_count` from `3` to `4` while paper ticket / execution / weekly review stayed at `0` +- [ ] S12 next gate: collect one more real `/trader-mode` operator feedback sample to move `operator_feedback_count` from `4/5` to `5/5`; only tune copy if the feedback is `unclear` or `disagree` - [ ] R2 paper-ticket sample gate is waiting on a real executable candidate; do not fabricate paper tickets from blocked candidates -- [ ] R2 operator feedback sample gate still needs 2 more real feedback samples (`operator_feedback_count=3/5`) +- [ ] R2 operator feedback sample gate still needs 1 more real feedback sample (`operator_feedback_count=4/5`) - [ ] R2 weekly review visible gate still needs a real execution-derived journal/weekly review entry (`weekly_review_entry_count=0`) - [x] R3 OKX sandbox isolated smoke tooling: guarded script and service can call OKX demo submit/query/cancel/query/fills only when `OKX_SANDBOX_SMOKE_EXECUTE=1`; local validation, deploy smoke, and remote ops smoke passed - [ ] R3 sandbox credential permission gate deferred: current phase is assisted analysis / decision support only, so do not request trade-permission credentials or make submit/cancel smoke the next gate diff --git a/docs/AI_ICT_TraderCockpit真实反馈验证_S10_2026-05-21_v1.md b/docs/AI_ICT_TraderCockpit真实反馈验证_S10_2026-05-21_v1.md index 8078bed..fd1d902 100644 --- a/docs/AI_ICT_TraderCockpit真实反馈验证_S10_2026-05-21_v1.md +++ b/docs/AI_ICT_TraderCockpit真实反馈验证_S10_2026-05-21_v1.md @@ -58,3 +58,20 @@ S10 改为更明确的盘中语言: - 如果还有 `unclear`,优先压缩 `Reason` 和 `Wait`。 - 如果出现 `disagree`,优先检查 `Risk` 是否遗漏了交易员看到的关键阻塞。 - 只有出现真实 executable candidate,才能进入 paper ticket / paper execution 样本采集。 + +## 6. S11 真实反馈闭环记录 + +2026-05-21 S11 继续使用远端 `/trader-mode` 主屏: + +- 首屏显示:`Observe Only: FVG retrace is not confirmed yet; no trade.` +- 中文页面显示:`仅观察:FVG 回撤尚未确认;不交易。` +- 交易员动作:记录 `No Trade` +- 写入结果:`operator_agreement=no_trade` +- `operator_feedback_count` 从 `3` 增长到 `4` +- `paper_ticket_count=0` +- `paper_execution_count=0` +- `weekly_review_entry_count=0` + +本轮还修复了一个已有映射问题:`No Trade` 和 `Need More Evidence` 按钮不再都写成 `unclear`,而是分别写入 `no_trade` 与 `need_more_evidence`。这属于现有反馈闭环修正,不是新增交易能力。 + +S11 结论:六卡片在本轮盘中观察里已经能支持明确 `No Trade`,本轮不继续调文案;后续只继续真实反馈采集,不能伪造 paper ticket / paper execution / weekly review 样本。 diff --git a/src/services/readiness/shadow_paper_sample_collection_service.py b/src/services/readiness/shadow_paper_sample_collection_service.py index 50fd9cd..91c41f4 100644 --- a/src/services/readiness/shadow_paper_sample_collection_service.py +++ b/src/services/readiness/shadow_paper_sample_collection_service.py @@ -7,7 +7,14 @@ from src.repositories.shadow_paper_observation_repository import ShadowPaperObse OPERATOR_AGREEMENT_PENDING = "pending" -OPERATOR_AGREEMENT_VALUES = {"agree", "disagree", "unclear", OPERATOR_AGREEMENT_PENDING} +OPERATOR_AGREEMENT_VALUES = { + "agree", + "disagree", + "no_trade", + "need_more_evidence", + "unclear", + OPERATOR_AGREEMENT_PENDING, +} class ShadowPaperSampleCollectionService: diff --git a/src/web/trader_mode.js b/src/web/trader_mode.js index 4278778..506a84e 100644 --- a/src/web/trader_mode.js +++ b/src/web/trader_mode.js @@ -874,7 +874,13 @@ async function recordTraderAction(action) { tags: ['trader-mode', 'quick-note'], }); } else { - const agreement = action === 'agree' ? 'agree' : (action === 'disagree' ? 'disagree' : 'unclear'); + const agreementByAction = { + agree: 'agree', + disagree: 'disagree', + no_trade: 'no_trade', + need_more_evidence: 'need_more_evidence', + }; + const agreement = agreementByAction[action] || 'unclear'; await postJson('/trading/shadow-paper/observe', { instrument_id: instrumentId, timeframe, diff --git a/tests/unit/test_shadow_paper_sample_collection_service.py b/tests/unit/test_shadow_paper_sample_collection_service.py index a226661..ef4bc7e 100644 --- a/tests/unit/test_shadow_paper_sample_collection_service.py +++ b/tests/unit/test_shadow_paper_sample_collection_service.py @@ -58,6 +58,25 @@ class ShadowPaperSampleCollectionServiceTests(unittest.TestCase): self.assertIn("wait_for_executable_candidate_before_paper_ticket", payload["next_collection_actions"]) self.assertNotIn("build_shadow_paper_ticket_for_latest_candidate", payload["next_collection_actions"]) + def test_records_explicit_no_trade_and_need_more_evidence_feedback(self) -> None: + now = datetime(2026, 5, 17, 12, 0, tzinfo=timezone.utc) + for agreement in ["no_trade", "need_more_evidence"]: + with self.subTest(agreement=agreement): + repository = _ObservationRepository(candidate_status="blocked") + service = ShadowPaperSampleCollectionService(repository=repository) + + payload = service.record_daily_observation( + instrument_id=1, + operator_agreement=agreement, + operator_note=f"{agreement} from Trader Cockpit", + runtime_status={"current_blockers": []}, + now=now, + ) + + self.assertEqual(payload["observation_status"], "operator_feedback_recorded") + self.assertEqual(payload["operator_agreement"], agreement) + self.assertEqual(repository.upsert_call["operator_agreement"], agreement) + class _ObservationRepository: def __init__(self, *, candidate_status: str = "executable") -> None: