Skip to content

Commit c9df8f7

Browse files
docs(automation): retarget closed-unmerged #840 and #906 lineage
Point IG-001 and TM-03 at open Draft #1021, and point redaction TM-01/ADR-0009/PRD-08 at open #1031, so the control-plane graph stops treating dead pull requests as active_pr integration paths. Co-authored-by: Seongho Bae <seonghobae@users.noreply.github.com>
1 parent d289615 commit c9df8f7

7 files changed

Lines changed: 20 additions & 15 deletions

File tree

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ Semantic Versioning where the repository publishes a release.
2828

2929
### Fixed
3030

31+
- Reclassified closed-unmerged ContextualWisdomLab/.github#840 and ContextualWisdomLab/.github#906 as `superseded` and pointed `IG-001` / TM-01 / ADR-0009 at the live open successors ContextualWisdomLab/.github#1021 and ContextualWisdomLab/.github#1031.
3132
- Materialized base Python locks only when every package line is an exact SHA-256 pin or a bounded relative `-r`/`--requirement` include. A lone `--require-hashes` directive, a dotted include such as `./lock.txt`, or `-r other-hashes.txt` no longer enters the trusted build context.
3233
- Refused a conflict-scope repository root whose immediate parent is a symbolic link, so a swapped parent cannot redirect the canonical worktree after the last-component check (CWE-367).
3334
- Bounded the Strix quality self-test's deterministic timeout fixtures to 3-second process and 5-second fake-sleep budgets so exact-head policy evidence completes inside the existing job limit without changing production Strix scanner timeouts, providers, credentials, or review semantics.

docs/automation/THREAT_MODEL.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -170,9 +170,9 @@ Paths below are the current concrete control and regression locations. A listed
170170

171171
| Threat | Exact control source | Exact regression evidence | Closure boundary | Current maturity |
172172
|---|---|---|---|---|
173-
| TM-01 | `scripts/ci/redact_sensitive_log.py`; `scripts/ci/sandboxed_verify.py`; `scripts/ci/sandboxed_web_e2e.py` | `tests/test_sandboxed_verify.py`; `tests/test_sandboxed_web_e2e.py`; `tests/test_opencode_security_boundaries.py` | [PR #888](https://github.com/ContextualWisdomLab/.github/pull/888) is closed unmerged as `superseded` incident evidence after reachable-history re-contamination; clean-history integration and consumer proof are proposed by Draft [PR #906](https://github.com/ContextualWisdomLab/.github/pull/906). | `active_pr` |
173+
| TM-01 | `scripts/ci/redact_sensitive_log.py`; `scripts/ci/sandboxed_verify.py`; `scripts/ci/sandboxed_web_e2e.py` | `tests/test_sandboxed_verify.py`; `tests/test_sandboxed_web_e2e.py`; `tests/test_opencode_security_boundaries.py` | [PR #888](https://github.com/ContextualWisdomLab/.github/pull/888) and Draft [PR #906](https://github.com/ContextualWisdomLab/.github/pull/906) are closed unmerged as `superseded` incident evidence; current open integration and consumer proof are proposed by [PR #1031](https://github.com/ContextualWisdomLab/.github/pull/1031). Do not merge overlapping [PR #929](https://github.com/ContextualWisdomLab/.github/pull/929) in parallel. | `active_pr` |
174174
| TM-02 | `.github/workflows/deploy-pages.yml`; `docs/automation/SECURITY.md` | `tests/test_automation_documentation_contract.py` | Documentation detects known debt; explicit workflow-call secret declarations and a runtime negative contract remain open. | `accepted_architecture` |
175-
| TM-03 | `.github/workflows/agent-mention-router.yml`; `.github/workflows/opencode-review-dispatch.yml`; `scripts/ci/agent_mention_router.py`; `scripts/ci/agent_mention_sweep.py` | `tests/test_agent_mention_complete_payload_binding.py`; `tests/test_agent_mention_idempotency.py`; `tests/test_agent_mention_workflow_contract.py`; `tests/test_opencode_security_boundaries.py` | Named router/wrapper controls exist; end-to-end strict snapshot preservation remains proposed by PR #840. | `active_pr` |
175+
| TM-03 | `.github/workflows/agent-mention-router.yml`; `.github/workflows/opencode-review-dispatch.yml`; `scripts/ci/agent_mention_router.py`; `scripts/ci/agent_mention_sweep.py` | `tests/test_agent_mention_complete_payload_binding.py`; `tests/test_agent_mention_idempotency.py`; `tests/test_agent_mention_workflow_contract.py`; `tests/test_opencode_security_boundaries.py` | Named router/wrapper controls exist; end-to-end strict snapshot preservation remains proposed by Draft [PR #1021](https://github.com/ContextualWisdomLab/.github/pull/1021), the bounded successor to closed-unmerged [PR #840](https://github.com/ContextualWisdomLab/.github/pull/840). | `active_pr` |
176176
| TM-04 | `scripts/ci/pr_head_replay_guard.py`; `scripts/ci/pr_review_merge_scheduler.py` | `tests/test_pr_head_replay_guard.py`; `tests/test_pr_review_merge_scheduler.py` | Enforcement still depends on current live ruleset configuration. | `implemented_on_protected_main` |
177177
| TM-05 | `scripts/ci/pr_review_merge_scheduler.py`; `scripts/ci/opencode_existing_approval_gate.py`; `scripts/ci/noema_review_gate.py` | `tests/test_pr_review_merge_scheduler.py`; `tests/test_opencode_existing_approval_gate.py`; `tests/test_noema_review_gate.py` | The software enforces eligibility; human reviewer capacity remains external governance work. | `implemented_on_protected_main` |
178178
| TM-06 | `.github/workflows/opencode-review.yml`; `.github/workflows/opencode-review-dispatch.yml`; `.github/workflows/security-scan.yml` | `tests/test_opencode_security_boundaries.py`; `tests/test_review_execution_contracts.py`; `tests/test_required_workflow_queue_contract.py` | Covered entrypoints are protected; every new entrypoint must join the inventory. | `implemented_on_protected_main` |

docs/automation/TRACEABILITY.md

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# Requirements and evidence traceability
22

33
Status: living authoritative matrix
4-
Last reviewed: 2026-08-10
4+
Last reviewed: 2026-08-16
55

66
Canonical maturity states are defined in [DOCUMENTATION_AUDIT.md](DOCUMENTATION_AUDIT.md): `implemented_on_protected_main`, `active_pr`, `accepted_architecture`, `planned`, `research_only`, `superseded`, and `out_of_scope`. Every maturity cell contains exactly one canonical state; explanatory qualifiers belong in the evidence or closure columns. A row marked `implemented_on_protected_main` still requires fresh exact-head evidence for each later change; a row marked `active_pr` is never shipped truth.
77

@@ -19,7 +19,7 @@ Repository locators below are literal paths with no globs. External canaries and
1919
| `PRD-05` writer lease | `TRD-WRITE-01`, ADR-0001 | `scripts/ci/pr_review_merge_scheduler.py`; `.github/workflows/pr-review-autofix.yml`; `docs/automation/CONTINUATION_RUNBOOK.md` | `tests/test_pr_review_merge_scheduler.py`; `tests/test_pr_review_fix_scheduler.py` | live branch/head observation plus expected-head GitHub response | active branch writer / immediately before mutation | `accepted_architecture` |
2020
| `PRD-06` work conservation | `TRD-RUN-01`, ADR-0007 | `.github/workflows/pr-review-merge-scheduler.yml`; `AGENTS.md`; `docs/automation/CONTINUATION_RUNBOOK.md`; `docs/automation/UML.md` | `tests/test_required_workflow_queue_contract.py`; `tests/test_automation_documentation_contract.py`; `tests/test_automation_historical_loop_supersession_contract.py`; external continuation receipt | queue sweep plus `USER_REDIRECTION_INCIDENT` same invocation recovery; when two safe lanes exist at least two materially distinct actions with a non-documentation action when available; otherwise two fresh whole-queue sweeps before exit | automation operator / after every meta action and before run exit | `accepted_architecture` |
2121
| `PRD-07` RCA + feasible remedy | `TRD-RETRY-01`, ADR-0003 | `ci-review-prompt.md`; `code-reviewer-prompt.md`; `docs/automation/RUNBOOK.md` | `tests/test_adversarial_evidence.py`; `tests/test_opencode_adversarial_receipts.py`; `tests/test_automation_documentation_contract.py` | source-backed finding/RCA, `remediation_candidate` evidence, exact-head repair and protected recovery receipt | incident owner / before closure | `accepted_architecture` |
22-
| `PRD-08` safe diagnostic redaction | `TRD-LOG-01`, ADR-0009 | `scripts/ci/redact_sensitive_log.py`; `scripts/ci/sandboxed_verify.py`; `scripts/ci/sandboxed_web_e2e.py` | `tests/test_opencode_security_boundaries.py`; `tests/test_sandboxed_verify.py`; `tests/test_sandboxed_web_e2e.py` | exact-head redaction checks, then protected-main/consumer result markers | sandbox owners / Draft clean-history successor #906 + protected consumer canary | `active_pr` |
22+
| `PRD-08` safe diagnostic redaction | `TRD-LOG-01`, ADR-0009 | `scripts/ci/redact_sensitive_log.py`; `scripts/ci/sandboxed_verify.py`; `scripts/ci/sandboxed_web_e2e.py` | `tests/test_opencode_security_boundaries.py`; `tests/test_sandboxed_verify.py`; `tests/test_sandboxed_web_e2e.py` | exact-head redaction checks, then protected-main/consumer result markers | sandbox owners / current open successor #1031 + protected consumer canary | `active_pr` |
2323
| `PRD-09` documentation graph | `TRD-IF-01`, ADR-0007/0008 | `docs/automation/DOCUMENTATION_AUDIT.md`; `docs/automation/README.md`; `docs/automation/EVENT_CONTRACTS.md`; `ARCHITECTURE.md` | `tests/test_automation_documentation_contract.py`; `tests/test_pr_governance_audit_contract.py`; `tests/test_automation_historical_loop_supersession_contract.py` | documentation contract, link/diagram/standards audit, `git diff --check`, reviewer approval | architecture maintainers / current canonical documentation PR | `active_pr` |
2424
| `PRD-10` protected-main acceptance | `TRD-REV-01`, ADR-0006 | `.github/workflows/opencode-review.yml`; `.github/workflows/pr-review-merge-scheduler.yml`; `docs/automation/RUNBOOK.md` | `tests/test_required_workflow_queue_contract.py`; `tests/test_pr_review_merge_scheduler.py`; real-consumer canary receipt | protected commit, workflow source, scenario, negative control, rollback receipt | service owner / after protected integration | `accepted_architecture` |
2525
| `PRD-11` thin modular consumers | `TRD-IF-01`, ADR-0008/0012/0014 | `.github/workflows/opencode-review.yml`; `.github/workflows/noema-review.yml`; `.github/workflows/strix.yml`; `.github/workflows/pr-review-fix-scheduler.yml`; `.github/workflows/deploy-pages.yml` | `tests/test_required_workflow_queue_contract.py`; `tests/test_central_required_workflow_ruleset_audit.py`; `tests/test_automation_documentation_contract.py` | ruleset source/ref plus positive/negative consumer run | interface owners / before breaking change | `accepted_architecture` |
@@ -48,9 +48,11 @@ Repository locators below are literal paths with no globs. External canaries and
4848
- `ContextualWisdomLab/.github#841` is closed/unmerged historical origin evidence. It established the disclosure concern but mixed unrelated scope; it is `superseded` as an integration path.
4949
- `ContextualWisdomLab/.github#842` is closed/unmerged historical RED→GREEN and exhaustive-boundary evidence. Its final blobs removed current-source defects but its reachable PR history retained secret-shaped test fixtures that kept Secret Scan red; it is `superseded` as an integration path.
5050
- `ContextualWisdomLab/.github#888` is closed/unmerged `superseded` incident evidence. It initially replayed the final ten #842 blobs without predecessor fixture history, but a later committed credential-shaped fixture made its reachable range fail Secret Scan again.
51-
- `ContextualWisdomLab/.github#906` is the Draft `active_pr` clean-history successor from protected main. It carries the corrected final ten blobs and includes the direct Docker/Podman login repair; bounded wrapper recursion is tracked by [Issue #907](https://github.com/ContextualWisdomLab/.github/issues/907), while atomic multiline/duplicate-key JSON redaction is tracked by [Issue #908](https://github.com/ContextualWisdomLab/.github/issues/908). Its exact-head checks, reviews, and threads must be re-fetched at every decision; predecessor or queued evidence is non-authorizing.
51+
- `ContextualWisdomLab/.github#906` is closed/unmerged `superseded`. It was a Draft clean-history successor and is no longer an open integration path.
52+
- `ContextualWisdomLab/.github#929` is an overlapping open predecessor for atomic JSON layout. Do not merge it in parallel with its successor.
53+
- `ContextualWisdomLab/.github#1031` is the current open `active_pr` successor. It carries the sandbox redaction repair, wrapper/command redaction evidence, and the Actions group-marker JSON layout fix for [Issue #908](https://github.com/ContextualWisdomLab/.github/issues/908). Bounded wrapper recursion remains [Issue #907](https://github.com/ContextualWisdomLab/.github/issues/907). Its exact-head checks, reviews, and threads must be re-fetched at every decision; predecessor or queued evidence is non-authorizing.
5254
- Output-memory and service-file quotas remain a separate `planned` resource-safety requirement. Redaction completion must not be reported as resource-exhaustion closure.
53-
- Every #906 head change invalidates predecessor test counts, coverage counts, reviews, and run IDs. Protected-main/consumer synthetic credential canaries are required before operational closure.
55+
- Every #1031 head change invalidates predecessor test counts, coverage counts, reviews, and run IDs. Protected-main/consumer synthetic credential canaries are required before operational closure.
5456

5557
## 4. Whole-conversation and documentation governance traceability
5658

@@ -82,7 +84,7 @@ An issue records planned work; it does not implement the work it describes. An o
8284

8385
| Gap | Live object | Current boundary and required closure | Maturity |
8486
|---|---|---|---|
85-
| `IG-001` dispatch snapshot preservation | [PR #840](https://github.com/ContextualWisdomLab/.github/pull/840) | The active PR proposes an end-to-end versioned envelope, live-base binding, and review-only route; protected-main consumer acceptance remains required. | `active_pr` |
87+
| `IG-001` dispatch snapshot preservation | [PR #1021](https://github.com/ContextualWisdomLab/.github/pull/1021) | Draft [PR #1021](https://github.com/ContextualWisdomLab/.github/pull/1021) is the bounded successor to closed-unmerged [PR #840](https://github.com/ContextualWisdomLab/.github/pull/840). It proposes an end-to-end versioned envelope, live-base binding, and review-only route; protected-main consumer acceptance remains required. | `active_pr` |
8688
| `IG-002` counted independent reviewer | [Issue #772](https://github.com/ContextualWisdomLab/.github/issues/772) | Tracks planned implementation of a non-author human reviewer path that GitHub counts. | `planned` |
8789
| `IG-003` external-head convergence | [Issue #889](https://github.com/ContextualWisdomLab/.github/issues/889) | Tracks planned implementation of one safe review-or-reject contract across privileged entrypoints. | `planned` |
8890
| `IG-004` cross-workflow writer fencing | [Issue #890](https://github.com/ContextualWisdomLab/.github/issues/890) | Tracks planned implementation of a shared repository/branch lease, TTL, heartbeat, takeover, and fencing. | `planned` |

docs/automation/TRD.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -233,7 +233,7 @@ type and maturity are mapped in [TRACEABILITY.md](TRACEABILITY.md).
233233

234234
| ID | Audited protected-main behavior | Required closure |
235235
|---|---|---|
236-
| `IG-001` | Mention wrappers bind a claim, but the complete downstream review path does not yet preserve every versioned field, live-base observation, and review-only policy through authoritative publication. | Integrate and accept [PR #840](https://github.com/ContextualWisdomLab/.github/pull/840). |
236+
| `IG-001` | Mention wrappers bind a claim, but the complete downstream review path does not yet preserve every versioned field, live-base observation, and review-only policy through authoritative publication. | Integrate and accept Draft [PR #1021](https://github.com/ContextualWisdomLab/.github/pull/1021), the bounded successor to closed-unmerged [PR #840](https://github.com/ContextualWisdomLab/.github/pull/840). |
237237
| `IG-002` | Bot/model identities remain advisory; a counted qualifying independent non-author human approval is still externally required. | Establish the governance path in [Issue #772](https://github.com/ContextualWisdomLab/.github/issues/772). |
238238
| `IG-003` | Privileged targeted scheduler, OpenCode, and Strix paths reject external heads while older policy prose described them as reviewable. | Align every entrypoint under [Issue #889](https://github.com/ContextualWisdomLab/.github/issues/889). |
239239
| `IG-004` | Per-workflow concurrency, invocation claims, and expected-head guards exist, but there is no shared owner/TTL/heartbeat/fencing record across branch-mutating workflows. | Implement [Issue #890](https://github.com/ContextualWisdomLab/.github/issues/890). |

docs/automation/adr/0009-sandbox-evidence-redaction-boundary.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
# ADR-0009: Redact the complete sandbox evidence boundary while preserving diagnosis
22

3-
Status: Accepted; Draft [PR #906](https://github.com/ContextualWisdomLab/.github/pull/906) is the active integration path; [PR #888](https://github.com/ContextualWisdomLab/.github/pull/888) is closed unmerged as superseded incident evidence
3+
Status: Accepted; [PR #1031](https://github.com/ContextualWisdomLab/.github/pull/1031) is the current open integration path; Draft [PR #906](https://github.com/ContextualWisdomLab/.github/pull/906) and [PR #888](https://github.com/ContextualWisdomLab/.github/pull/888) are closed unmerged as superseded incident evidence
44
Date: 2026-08-09
55
Decision owners: CWL security and CI maintainers
66

77
## Context
88

99
`sandboxed_verify.py` and `sandboxed_web_e2e.py` execute proof commands and publish completed output, timeout payloads, exceptions, backend/frontend service tails, command metadata, and structured result JSON. Applying redaction to only some print calls leaves credentials reachable through JSON, terminal/Unicode evasion, nested commands, explicit allowed environment values, or stream/result boundaries. Over-broad pattern matching can instead erase benign keys and the diagnostics needed to fix CI.
1010

11-
`ContextualWisdomLab/.github#841` identified the disclosure class but mixed an unrelated SSRF slice and missed publication paths. It was closed unmerged. Its first broad successor was also closed unmerged because secret-shaped fixtures remained in reachable history. [PR #888](https://github.com/ContextualWisdomLab/.github/pull/888) was the clean-history replacement, but a later committed credential-shaped fixture recontaminated its reachable history; it was closed unmerged and remains superseded incident evidence. Draft [PR #906](https://github.com/ContextualWisdomLab/.github/pull/906) is the current clean-history active replacement and preserves all predecessors as historical evidence.
11+
`ContextualWisdomLab/.github#841` identified the disclosure class but mixed an unrelated SSRF slice and missed publication paths. It was closed unmerged. Its first broad successor was also closed unmerged because secret-shaped fixtures remained in reachable history. [PR #888](https://github.com/ContextualWisdomLab/.github/pull/888) was the clean-history replacement, but a later committed credential-shaped fixture recontaminated its reachable history; it was closed unmerged and remains superseded incident evidence. Draft [PR #906](https://github.com/ContextualWisdomLab/.github/pull/906) is also closed unmerged `superseded`. [PR #1031](https://github.com/ContextualWisdomLab/.github/pull/1031) is the current open successor; do not merge overlapping [PR #929](https://github.com/ContextualWisdomLab/.github/pull/929) in parallel.
1212

1313
## Decision drivers
1414

@@ -62,7 +62,7 @@ This reduces credential disclosure and log-injection risk while preserving audit
6262

6363
## Migration and rollback
6464

65-
Integrate Draft [PR #906](https://github.com/ContextualWisdomLab/.github/pull/906) through normal protection after it becomes review-ready, then run a synthetic credential fixture from protected main and an affected consumer. Update the PR body, doctoring, and CHANGELOG with only final exact-head numbers. If regression requires rollback, disable the affected evidence publication or revert to a reviewed fail-closed no-output path; do not restore a known disclosure path.
65+
Integrate [PR #1031](https://github.com/ContextualWisdomLab/.github/pull/1031) through normal protection after current-head gates and qualifying review pass, then run a synthetic credential fixture from protected main and an affected consumer. Update the PR body, doctoring, and CHANGELOG with only final exact-head numbers. If regression requires rollback, disable the affected evidence publication or revert to a reviewed fail-closed no-output path; do not restore a known disclosure path.
6666

6767
## Supersession conditions
6868

0 commit comments

Comments
 (0)