Summary: - Treat /contribute.html and /contribute as first-class SPA routes so GitHub OAuth callback and documented upload links land on the uploader. - Switch the browser uploader from multipart/base64 to raw JSONL POSTs with metadata headers, while keeping JSON file_data and multipart compatibility on the API. - Add static upload-flow gates and Vitest coverage for authenticated upload sanitization, R2 writes, and D1 metadata recording. - Bump plugin and marketplace versions to 3.4.4. Rationale: - The upload path had two breakpoints: documented /contribute.html links rendered the homepage because routing only checked hash, and multipart browser uploads could be stripped by proxy/custom-domain behavior. - Raw JSONL avoids multipart body loss and avoids base64 size/memory bloat for large session files. Tests: - bash evals/test-upload-flow.sh - bash evals/test-release-consistency.sh - npm --prefix landing test -- --run src/test/upload-function.test.ts - static eval suite: governance, feedback auth, heartbeat, integrity guard, issue regressions, Microsoft flavor, platform compat, loop hook, Windows Python hooks, YAML frontmatter - npm --prefix landing run build - ./landing/node_modules/.bin/tsc -p pi/pua/tsconfig.json - git diff --check Co-authored-by: Codex <codex@openai.com>
4.3 KiB
PUA FAQ / Issue Playbook
需不需要总是开启 PUA?
不建议无脑 always-on。推荐按风险分层:
| 场景 | 建议 |
|---|---|
| 普通首轮问答/简单代码 | 不必 always-on,避免噪音 |
| Debug、失败 2 次以上、用户明显不满 | 开启 PUA 或手动触发 |
| 高风险交付、测试/评分/CI/memory 相关 | 开启 PUA + harness governance,按四权分离执行 |
| 项目初期探索 | 使用温和味道或仅用诊断先行/验证闭环 |
核心不是“压力越大越好”,而是把行动、诊断、评分、环境修改分开,并用证据交付。压力只负责防摆烂,不能替代 verifier。
Claude 说这是 prompt injection,怎么办?
从 v3.3.0 起,UserPromptSubmit hook 已做两件事:
- hook 脚本内部过滤关键词;普通首轮请求不再注入。
- 注入文案改为“用户安装的 productivity context”,不再使用强制式
MUST invoke Skill文案。
如果仍遇到拒绝:
- 先确认 Claude Code 版本足够新;
- 使用
/pua:off关闭自动注入,只在需要时手动/pua; - 对调试任务使用诊断先行格式:
[PUA-DIAGNOSIS] 问题是... 证据是... 下一步...; - 如果模型仍拒绝,提供完整 session JSONL,便于复现。
封闭网络 / 内网环境怎么用?
使用 /pua:offline 或手动设置:
{
"offline": true,
"feedback_frequency": 0
}
离线模式会关闭 PUA 自身的反馈问卷、排行榜上报和 session 上传提示;PUA 的本地验证、压力升级、诊断先行仍可使用。
Codex CLI 子命令怎么对应 Claude Code?
Codex 没有 Claude Code 的 /pua:xxx slash command 命名空间时,可以用 $pua-xxx alias:
| Claude Code | Codex CLI |
|---|---|
/pua:on |
$pua-on |
/pua:off |
$pua-off |
/pua:p7 |
$pua-p7 |
/pua:p9 |
$pua-p9 |
/pua:p10 |
$pua-p10 |
/pua:pro |
$pua-pro |
/pua:pua-loop |
$pua-loop |
Pi / Trae 支持状态
pi/pua/:官方轻量 pi extension,提供/pua-on、/pua-off、/pua-status、/pua-reset和会话注入。pi/package/:pi.dev package 版本,包含 extension +skills/pua/SKILL.md,可用pi install ./pi/package本地安装。.trae/skills/:Trae 标准SKILL.md包;trae/保留 Prompt/Rule 复制版和差异说明。- Trae / Pi 都不继承 Claude Code hooks;四权分离 gate 必须通过 Skill 工作规程、外部验证和用户确认落地。
Feedback endpoint 为什么要求更强认证?
从 v3.4.0 起选择 C 方案:
- 匿名评分仍允许写入
/api/feedback,便于低摩擦反馈; - 上传脱敏 session 不再允许匿名
session_dataPOST; - session 文件上传必须走
https://openpua.ai/contribute.html登录后的/api/upload流程。
这是最小权限折中:保留反馈转化率,但把高价值、高隐私的数据入口放到登录态和上传审计链路里。
“下场”这个词为什么改了?
“下场”同时可能表示“亲自动手介入”和“停止工作/退场”,容易让 agent lifecycle 语义混乱。现在统一为:
- start/intervene → “亲自动手” / “亲自介入”;
- stop/release → “释放” / “退场”。
静默 heartbeat 会不会污染对话?
不会。v3.4.3 的活跃用户统计走 SessionStart command hook,不是 skill prompt,也不输出 additionalContext。因此模型上下文里不会出现 heartbeat endpoint、install id 或统计提示。
治理边界:
offline: true、telemetry: false或feedback_frequency: 0会关闭 heartbeat;- 本地只生成随机 install id,Cloudflare D1 只保存 SHA-256 hash;
- 管理页面是
https://openpua.ai/#/admin/heartbeats,需要 GitHub 登录并命中管理员白名单; - hook 有静默测试:即使网络失败,也不能向对话输出任何字节。
上传数据入口打不开或上传失败怎么办?
从 v3.4.4 起,https://openpua.ai/contribute.html 是一等路由:GitHub 登录回跳、登出回跳、README 和 Stop hook 都可以直接使用这个地址,不再依赖 hash route。
上传链路也改为浏览器发送 JSON file_data:前端先把 .jsonl 转成 base64,再 POST 到 /api/upload。服务端仍保留 multipart 兼容,但默认 JSON 路径可以避开部分自定义域名/代理对 multipart body 的剥离问题。