# Codex GitHub Action 安全模板

核验日期：2026-07-16

下面的模板只允许手动触发。Codex job 只有读权限，结果保存为 patch artifact，不自动提交、推送或开 PR。

```yaml
name: Codex patch exercise

on:
  workflow_dispatch:
    inputs:
      task:
        description: Scoped task for Codex
        required: true
        type: string

jobs:
  generate_patch:
    runs-on: ubuntu-latest
    permissions:
      contents: read

    steps:
      - name: Checkout requested ref
        uses: actions/checkout@v5
        with:
          fetch-depth: 0
          persist-credentials: false

      - name: Run Codex
        uses: openai/codex-action@v1
        with:
          openai-api-key: ${{ secrets.OPENAI_API_KEY }}
          prompt: |
            Task: ${{ inputs.task }}

            Read AGENTS.md and the relevant implementation before editing.
            Keep changes inside the explicitly named task scope.
            Do not change workflows, credentials, permissions, or production configuration.
            Run the repository's relevant validation commands.
            Report changed files, command results, and anything not verified.

      - name: Create patch artifact
        id: diff
        shell: bash
        run: |
          set -euo pipefail
          mkdir -p artifacts
          git add -N .
          git diff --binary HEAD > artifacts/codex.patch
          git diff --check
          if [ -s artifacts/codex.patch ]; then
            echo "has_patch=true" >> "$GITHUB_OUTPUT"
          else
            echo "has_patch=false" >> "$GITHUB_OUTPUT"
          fi

      - name: Upload patch
        if: steps.diff.outputs.has_patch == 'true'
        uses: actions/upload-artifact@v4
        with:
          name: codex-patch
          path: artifacts/codex.patch
          if-no-files-found: error
          retention-days: 7
```

## 为什么这样分权

- checkout 不保留写凭据。
- Codex job 只有 `contents: read`。
- API key 只作为官方 Action 输入，不设为 job 级环境变量。
- job 只交付 patch，不拥有 push 或 pull-request 写权限。
- 人工下载后先 review 和 `git apply --check`。

## 本地验证 patch

```bash
git switch -c review/codex-patch
git apply --check codex.patch
git apply codex.patch
git status --short
git diff --check
```

然后运行仓库实际 lint、类型检查、测试和构建。不要因 Action 成功就跳过代码审查。

## 可选的第二个 job

如果未来需要自动开 PR，使用独立 job：

- 只接收 patch artifact，不接收 `OPENAI_API_KEY`。
- 在新检出中 `git apply --check`。
- 运行完整验证。
- 只在验证通过后获得 `contents: write` 与 `pull-requests: write`。
- PR 标明由 Codex 生成 patch，要求人工 review。

不要把写权限直接加给 `generate_patch`。

## 接入前检查

- [ ] workflow 仅在预期事件触发。
- [ ] fork PR 无法读取仓库 secrets。
- [ ] prompt 不接受未经约束的命令或路径扩展。
- [ ] setup 与测试步骤不会获得 API key。
- [ ] Codex 改动范围由 AGENTS.md 和 prompt 双重限制。
- [ ] artifact 保留期符合组织政策。
- [ ] 日志不输出 secrets 或敏感源码。
- [ ] `actionlint` 与仓库 CI 通过。
- [ ] 生产仓库启用前完成威胁建模和人工审批。

官方来源：

- https://learn.chatgpt.com/docs/github-action
- https://learn.chatgpt.com/docs/non-interactive-mode
