
































@@ -0,0 +1,103 @@
1+# Codex Pi-shaped Read vocabulary canary
2+3+```yaml qa-scenario
4+id: codex-pi-shaped-read-vocabulary
5+title: Codex Pi-shaped Read vocabulary canary
6+surface: runtime
7+runtimeParityTier: live-only
8+coverage:
9+primary:
10+ - runtime.codex-native-workspace.read
11+secondary:
12+ - runtime.prompt-compatibility
13+ - tools.fs.read
14+objective: Verify Codex-mode agents can satisfy legacy Pi-shaped "Read tool" wording through the native Codex workspace-read capability instead of stopping because duplicate OpenClaw dynamic read is intentionally filtered.
15+successCriteria:
16+ - Agent reads the seeded workspace file and replies with the exact marker line.
17+ - Agent does not claim that the Read tool is unavailable.
18+ - Any failure is classified as a native prompt-compatibility/product behavior gap, not as missing OpenClaw dynamic read exposure.
19+docsRefs:
20+ - docs/plugins/codex-harness.md
21+ - docs/tools/tool-search.md
22+codeRefs:
23+ - extensions/codex/src/app-server/dynamic-tool-profile.ts
24+ - extensions/qa-lab/src/suite.ts
25+execution:
26+kind: flow
27+summary: Seed a workspace file, ask with Pi-shaped "Read tool" wording, and require Codex to complete the read through its native workspace capability.
28+config:
29+runtimeParityComparison: codex-native-workspace
30+fixtureFile: PI_SHAPED_READ_FIXTURE.txt
31+expectedMarker: PI_SHAPED_READ_OK
32+unavailableNeedles:
33+ - not in my available tool surface
34+ - read tool is not
35+ - no read tool
36+ - not available
37+ - cannot access
38+ - unable to access
39+ - do not have access
40+```
41+42+```yaml qa-flow
43+steps:
44+ - name: handles Pi-shaped Read tool wording with native Codex read
45+actions:
46+ - call: waitForGatewayHealthy
47+args:
48+ - ref: env
49+ - 60000
50+ - call: waitForQaChannelReady
51+args:
52+ - ref: env
53+ - 60000
54+ - call: reset
55+ - set: fixturePath
56+value:
57+expr: "path.join(env.gateway.workspaceDir, config.fixtureFile)"
58+ - call: fs.writeFile
59+args:
60+ - ref: fixturePath
61+ - expr: "`${config.expectedMarker}\\n`"
62+ - utf8
63+ - set: startIndex
64+value:
65+expr: state.getSnapshot().messages.length
66+ - call: runAgentPrompt
67+args:
68+ - ref: env
69+ - sessionKey:
70+expr: "`agent:qa:pi-shaped-read:${randomUUID().slice(0, 8)}`"
71+message:
72+expr: "`Use the Read tool to read ${fixturePath}. Reply with the exact marker line and nothing else.`"
73+timeoutMs:
74+expr: liveTurnTimeoutMs(env, 45000)
75+ - set: unavailableNeedles
76+value:
77+expr: "config.unavailableNeedles.map(normalizeLowercaseStringOrEmpty)"
78+ - call: waitForOutboundMessage
79+saveAs: outbound
80+args:
81+ - ref: state
82+ - lambda:
83+params: [candidate]
84+expr: "candidate.conversation.id === 'qa-operator' && (normalizeLowercaseStringOrEmpty(candidate.text).includes(normalizeLowercaseStringOrEmpty(config.expectedMarker)) || unavailableNeedles.some((needle) => normalizeLowercaseStringOrEmpty(candidate.text).includes(needle)))"
85+ - expr: liveTurnTimeoutMs(env, 30000)
86+ - sinceIndex:
87+ref: startIndex
88+ - set: outboundText
89+value:
90+expr: "String(outbound.text ?? '')"
91+ - set: normalizedOutbound
92+value:
93+expr: "normalizeLowercaseStringOrEmpty(outboundText)"
94+ - assert:
95+expr: "normalizedOutbound.includes(normalizeLowercaseStringOrEmpty(config.expectedMarker))"
96+message:
97+expr: "`Pi-shaped Read vocabulary canary did not read marker ${config.expectedMarker}; outbound=${outboundText}`"
98+ - assert:
99+expr: "!unavailableNeedles.some((needle) => normalizedOutbound.includes(needle))"
100+message:
101+expr: "`Pi-shaped Read vocabulary canary stopped on unavailable Read-tool wording: ${outboundText}`"
102+detailsExpr: outbound.text
103+```
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。