Skip to content
Closed
Show file tree
Hide file tree
Changes from 6 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions .github/workflows/hourly-nvidia-nim-review-repair.yml
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ on:
- .github/workflows/github-hourly-review-repair.yml
- .github/workflows/governance-risk-compliance-hourly-review-repair.yml
- .github/workflows/hourly-nvidia-nim-review-repair.yml
- .github/workflows/wardnet-hourly-review-repair.yml
- .github/workflows/nonnest2-hourly-review-repair.yml
- .github/workflows/originweave-hourly-review-repair.yml
- .github/workflows/quarantine-sandbox-hourly-review-repair.yml
Expand All @@ -27,6 +28,7 @@ on:
- tests/test_nonnest2_hourly_review_caller.py
- tests/test_originweave_hourly_review_caller.py
- tests/test_quarantine_sandbox_hourly_review_caller.py
- tests/test_wardnet_hourly_review_caller.py
- tests/test_hourly_autofix_context_quality_gate.py
- tests/test_pr_review_conflict_scope.py
- tests/test_pr_review_conflict_scope_control_files.py
Expand All @@ -51,6 +53,7 @@ on:
- docs/doctoring/nonnest2-hourly-review-caller.md
- docs/doctoring/originweave-hourly-review-caller.md
- docs/doctoring/quarantine-sandbox-hourly-review-caller.md
- docs/doctoring/wardnet-hourly-review-caller.md
push:
paths:
- .github/workflows/pr-review-fix-scheduler.yml
Expand All @@ -63,6 +66,7 @@ on:
- .github/workflows/github-hourly-review-repair.yml
- .github/workflows/governance-risk-compliance-hourly-review-repair.yml
- .github/workflows/hourly-nvidia-nim-review-repair.yml
- .github/workflows/wardnet-hourly-review-repair.yml
- .github/workflows/nonnest2-hourly-review-repair.yml
- .github/workflows/originweave-hourly-review-repair.yml
- .github/workflows/quarantine-sandbox-hourly-review-repair.yml
Expand All @@ -77,6 +81,7 @@ on:
- tests/test_nonnest2_hourly_review_caller.py
- tests/test_originweave_hourly_review_caller.py
- tests/test_quarantine_sandbox_hourly_review_caller.py
- tests/test_wardnet_hourly_review_caller.py
- tests/test_hourly_autofix_context_quality_gate.py
- tests/test_pr_review_conflict_scope.py
- tests/test_pr_review_conflict_scope_control_files.py
Expand All @@ -101,6 +106,7 @@ on:
- docs/doctoring/nonnest2-hourly-review-caller.md
- docs/doctoring/originweave-hourly-review-caller.md
- docs/doctoring/quarantine-sandbox-hourly-review-caller.md
- docs/doctoring/wardnet-hourly-review-caller.md

permissions:
contents: read
Expand Down Expand Up @@ -157,6 +163,7 @@ jobs:
tests/test_nonnest2_hourly_review_caller.py \
tests/test_originweave_hourly_review_caller.py \
tests/test_quarantine_sandbox_hourly_review_caller.py \
tests/test_wardnet_hourly_review_caller.py \
tests/test_pr_review_conflict_scope_control_files.py \
tests/test_hourly_autofix_context_quality_gate.py \
tests/test_pr_review_conflict_scope_git_executable.py \
Expand Down
31 changes: 31 additions & 0 deletions .github/workflows/wardnet-hourly-review-repair.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
name: Wardnet Hourly Review Repair

on:
schedule:
# Minute 7 avoids Clearfolio (23), DiskSage (37), fast-mlsirm (49),
# BandScope (53), naruon (11), Inkspan (47), and orchestrator (17).
- cron: "7 * * * *"
Comment thread
seonghobae marked this conversation as resolved.
Outdated

concurrency:
group: wardnet-hourly-review-repair
# A later heartbeat must not cancel an in-flight SOC RCA or repair.
cancel-in-progress: false

permissions:
contents: read

jobs:
dispatch-review-repair:
permissions:
contents: read
id-token: write
Comment thread
seonghobae marked this conversation as resolved.
uses: ./.github/workflows/pr-review-fix-scheduler.yml
with:
target_repository: ContextualWisdomLab/wardnet
Comment thread
seonghobae marked this conversation as resolved.
base_branch: main
max_prs: "50"
max_dispatches: "1"
retry_hours: "2"
secrets:
PR_REVIEW_MERGE_TOKEN: ${{ secrets.PR_REVIEW_MERGE_TOKEN }}
OPENCODE_APPROVE_TOKEN: ${{ secrets.OPENCODE_APPROVE_TOKEN }}
Comment thread
seonghobae marked this conversation as resolved.
1 change: 1 addition & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
> **Agents: read the master context FIRST.** Before any work, read [`docs/CWL-MASTER-CONTEXT.md`](docs/CWL-MASTER-CONTEXT.md) (mission · naruon-as-platform + inter-component UML · cross-cutting disciplines · conventions · roadmap · current state), the live **GitHub Project #1** <https://github.com/orgs/ContextualWisdomLab/projects/1> (work/roadmap source of truth), the full spec **ContextualWisdomLab/naruon#974**, and operate the Project per [`docs/agent-github-project-protocol.md`](docs/agent-github-project-protocol.md). The repo/Project — not any private agent memory — is the source of truth.

Materialize accepts only exact SHA-256 pins or a bounded relative `-r` include (no `.`/`..`); a lone `--require-hashes` directive is not trust evidence. See [`docs/doctoring/hourly-nvidia-nim-autofix.md`](docs/doctoring/hourly-nvidia-nim-autofix.md).
Wardnet's AI-SOC hourly caller scans `ContextualWisdomLab/wardnet` `main` via the product-neutral NVIDIA NIM scheduler (`NVIDIA_NIM_API_KEY` stays on the worker; never `COPILOT_GITHUB_TOKEN`). See [`docs/doctoring/wardnet-hourly-review-caller.md`](docs/doctoring/wardnet-hourly-review-caller.md).
Conflict-scope roots fail closed when the immediate parent directory is a symbolic link.
OriginWeave hourly NVIDIA NIM repair is a thin caller at minute 10. See [`docs/doctoring/originweave-hourly-review-caller.md`](docs/doctoring/originweave-hourly-review-caller.md).
nonnest2 hourly NVIDIA NIM repair is a thin caller at minute 16. See [`docs/doctoring/nonnest2-hourly-review-caller.md`](docs/doctoring/nonnest2-hourly-review-caller.md).
Expand Down
2 changes: 2 additions & 0 deletions ARCHITECTURE.md
Original file line number Diff line number Diff line change
Expand Up @@ -147,5 +147,7 @@ trusted `uv` exporter is downloaded from the literal GitHub Releases URL for
— current increment's repair-worker decision and APA 7th citations.
- [`docs/doctoring/fast-mlsirm-hourly-review-caller.md`](docs/doctoring/fast-mlsirm-hourly-review-caller.md)
— product-specific psychometric repair heartbeat and scientific gates.
- [`docs/doctoring/wardnet-hourly-review-caller.md`](docs/doctoring/wardnet-hourly-review-caller.md)
— Wardnet AI-SOC hourly NVIDIA NIM repair heartbeat.
- [`docs/doctoring/exact-artifact-sbom-attestation.md`](docs/doctoring/exact-artifact-sbom-attestation.md)
— current increment's attestation decision and APA 7th citations.
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ Semantic Versioning where the repository publishes a release.
- Added a dedicated Clearfolio hourly caller that invokes the product-neutral central scheduler with the exact repository, protected base branch, one-dispatch budget, one-hour retry floor, single-flight concurrency, and only the established scheduler credentials.
- Added a dedicated DiskSage hourly caller that invokes the same product-neutral RCA and remediation-feasibility scheduler with an exact repository target, one-dispatch budget, two-hour same-head retry floor, non-cancelling single-flight heartbeat, and explicit established scheduler credentials.
- Added a dedicated fast-mlsirm hourly caller that preserves Rust-owned psychometric arithmetic while dispatching at most one exact-head, root-cause-driven repair with a two-hour same-head retry floor.
- Added a dedicated Wardnet hourly caller that scans `ContextualWisdomLab/wardnet` `main` at minute 7 with one dispatch, a two-hour same-head retry floor, job-scoped `id-token: write` for the OpenCode OIDC fallback, and only the established scheduler credentials so AI-SOC pull requests receive NVIDIA NIM repair.

### Changed

Expand All @@ -26,6 +27,7 @@ Semantic Versioning where the repository publishes a release.
- Run the bounded Clearfolio PR review-feedback repair caller at minute 23 of every hour while keeping the shared scheduler free of product-specific timers and repository names for modular reuse by naruon, contextual-orchestrator, Inkspan, and other CWL services.
- Run the bounded DiskSage repair heartbeat at minute 37 of every hour, dispatch no more than one exact-head repair, and wait two hours before redispatching an unchanged head so legitimate OpenCode or NVIDIA NIM latency does not create duplicate writers.
- Run the bounded fast-mlsirm repair heartbeat at minute 49 of every hour with one-dispatch scope and a two-hour same-head floor, without weakening true-parameter recovery, CPU/GPU parity, skipped-test, or Rust-ownership gates.
- Run the bounded Wardnet AI-SOC repair heartbeat at minute 7 of every hour against protected `main`, dispatching at most one exact-head repair and waiting two hours before redispatching an unchanged head.
- Use NVIDIA NIM `mistralai/mistral-small-4-119b-2603` with explicit high reasoning for scheduled repair and `nvidia/nemotron-3-nano-30b-a3b` for bounded helper work instead of GitHub Models in the write-capable autofix worker.
- Apply one NUL-delimited exact-path and complete pre/post-worktree verification contract to both ordinary review repair and merge-conflict repair rather than relying on a visible post-model diff for the ordinary path.

Expand Down
2 changes: 2 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,8 @@ Details: `docs/pr-review-and-merge-procedure.md` and `PR_GOVERNANCE_AUDIT.md`.
- `docs/` — master context, Project protocol, `org-required-workflow-rollout.md`,
`scorecard-governance.md`, SBOM inventory. Doctoring records live under
`docs/doctoring/`. [`ARCHITECTURE.md`](ARCHITECTURE.md) is the control-plane
diagram for review, hourly NVIDIA NIM repair, and merge trust boundaries.
Wardnet's AI-SOC caller is `wardnet-hourly-review-repair.yml` (minute 7, `main`).
Comment thread
seonghobae marked this conversation as resolved.
Outdated
diagram for review, hourly NVIDIA NIM repair, exact-artifact SBOM attestation,
and merge trust boundaries.
- `.jules/` — recorded performance (`bolt.md`) and security (`sentinel.md`) learnings from past work
Expand Down
19 changes: 19 additions & 0 deletions docs/automation/hourly-review-repair.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ engine**.

- `clearfolio-hourly-review-repair.yml` owns Clearfolio's heartbeat at minute 23
of every hour.
- `wardnet-hourly-review-repair.yml` owns Wardnet's AI-SOC heartbeat at minute 7
of every hour.
- `pr-review-fix-scheduler.yml` is the reusable, product-neutral scheduler
module. It has no product-specific timer and can be called by naruon,
contextual-orchestrator, Inkspan, or another CWL service with an explicit
Expand Down Expand Up @@ -34,6 +36,23 @@ The scheduled heartbeat is `23 * * * *`. Repository-scoped concurrency and
`cancel-in-progress: true` ensure that a superseded Clearfolio queue scan does
not overlap its successor. At most one repair dispatch is created per run.

## Wardnet execution contract

The Wardnet caller provides the following immutable operating parameters:

```yaml
target_repository: ContextualWisdomLab/wardnet
base_branch: main
max_prs: "50"
max_dispatches: "1"
retry_hours: "2"
```

The scheduled heartbeat is `7 * * * *`. The caller job grants `id-token: write`
so the reusable NVIDIA NIM scheduler can mint its OpenCode App fallback from
GitHub OIDC. It does not receive or forward `NVIDIA_NIM_API_KEY` and never
introduces `COPILOT_GITHUB_TOKEN`.

The caller passes only the established `PR_REVIEW_MERGE_TOKEN` and
`OPENCODE_APPROVE_TOKEN` scheduler credentials. It does not receive or forward
`NVIDIA_NIM_API_KEY`; the model credential is scoped exclusively to the two
Expand Down
130 changes: 130 additions & 0 deletions docs/doctoring/wardnet-hourly-review-caller.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,130 @@
# Wardnet hourly review-repair caller

검토 기준일: **2026-08-17**

## Decision

ContextualWisdomLab operates one protected hourly caller for
`ContextualWisdomLab/wardnet` (wardnet.io — WAF / IDS / AI SOC / software LB /
APIM). The caller runs at minute 7, delegates to the product-neutral central
review-fix scheduler, inspects at most 50 open pull requests targeting
protected `main`, and dispatches at most one bounded repair per heartbeat.

A paying buyer of the AI SOC would feel live wardnet pull requests stalling
while hourly NVIDIA NIM repair scanned only Clearfolio, DiskSage, and
fast-mlsirm. Live heads such as ContextualWisdomLab/wardnet#76 (adaptive
orchestrator default) and #72 (externally provisioned admin secret) target
`main` and never enter those other callers.

The caller does not implement review or mutation logic itself. Wardnet remains
standalone; naruon and noema consume its SOC verdicts without owning its
runtime. Privileged automation stays in `ContextualWisdomLab/.github`.

## Root-cause analysis and remediation feasibility

The reusable worker performs exact-head root-cause analysis and tests
remediation feasibility before it edits. The reusable worker must:

1. Refetch the exact live head, base, reviews, checks, changed paths, and
writer state.
2. Establish the causal chain rather than repeat the terminal symptom.
3. Enumerate materially distinct minimal remedies.
4. Reject remedies that lack writer authority, cross sealed paths, require
unavailable credentials or protected-setting changes, violate stack order,
cannot be verified, or do not alter the diagnosed cause.
5. Dispatch at most one feasible repair. Otherwise leave the tree unchanged.

A queued or pending check remains a merge blocker but is not itself a code
finding. The independent non-author approval remains an external authorization
gate and is never synthesized by the repair worker. The worker cannot approve,
merge, release, resolve review findings by inference, change protection, or
manufacture passing checks.

## Cadence and concurrency

The caller uses a single concurrency group and `cancel-in-progress: false`.
This preserves an in-flight bounded RCA instead of discarding SOC evidence when
the next hourly heartbeat arrives. The reusable scheduler cancels only its own
superseded short queue scan.

The caller sets a **two-hour same-head retry floor**. Central OpenCode and
NVIDIA NIM work, plus wardnet's adaptive-orchestration analysis, can
legitimately approach two hours. An hourly redispatch of the same unchanged
head would create duplicate writer pressure rather than faster remediation.

GitHub scheduled workflows can be delayed under load and execute only from the
default branch. The cron expression is a heartbeat, not a real-time SLA.

## Credential and model boundary

The caller keeps workflow `GITHUB_TOKEN` at `contents: read` and grants the
reusable job `id-token: write` so the central scheduler can mint the OpenCode
GitHub App token from GitHub OIDC when the mapped PAT is absent (GitHub,
n.d.-c). It maps only `PR_REVIEW_MERGE_TOKEN` and `OPENCODE_APPROVE_TOKEN`.
It never uses `secrets: inherit`, receives `NVIDIA_NIM_API_KEY`, or introduces
`COPILOT_GITHUB_TOKEN`. CWE-250 forbids executing the caller with write or
model privileges it does not need (MITRE, 2026).

Model execution remains inside the central worker. The model credential is the
GitHub Secret `NVIDIA_NIM_API_KEY`; the caller does not receive or forward it.

Before protected-main activation, the repository variable
`OPENCODE_REPOSITORY_DISPATCH_TARGETS` must contain the exact
`ContextualWisdomLab/wardnet` target. Missing or mismatched configuration
fails before mutation credential materialization.

## Security, standalone operation, and modularity

The caller adds no wardnet runtime dependency, database object, network
endpoint, tenant authority, or product credential. Wardnet continues to run as
a standalone AI SOC. Naruon, noema, and other CWL services may consume wardnet
verdicts, but they cannot weaken its local validation, protected-branch,
exact-head, approval, or security gates.

## Verification and rollback

Machine-checkable contracts require the exact target/base, minute 7 cadence,
non-cancelling single-flight group, one dispatch, two-hour retry floor,
explicit secret mapping, read-only contents plus job-scoped `id-token: write`,
focused path-filter coverage, and absence of model or Copilot credentials.
Independent `pull_request`, `push`, and `compileall` path blocks must each
name the caller, doctoring, or contract they own.

After source integration, closure requires a scheduled or manual
protected-main consumer run proving the exact wardnet repository and `main`
base. Source checks alone are not protected-main operational acceptance.
Merge still requires zero unresolved valid findings and a qualifying
independent non-author approval.

Rollback removes the wardnet caller, its focused test, doctoring, and central
path-filter/documentation entries. It must not remove scheduler dispatch
validation or affect independent product callers.

## APA 7th references

GitHub, Inc. (n.d.-a). *Events that trigger workflows*. GitHub Docs. Retrieved
August 17, 2026, from
https://docs.github.com/en/actions/reference/workflows-and-actions/events-that-trigger-workflows#schedule

GitHub, Inc. (n.d.-b). *Reuse workflows*. GitHub Docs. Retrieved August 17,
2026, from
https://docs.github.com/en/actions/how-tos/sharing-automations/reuse-workflows

GitHub, Inc. (n.d.-c). *Automatic token authentication*. GitHub Docs.
Retrieved August 17, 2026, from
https://docs.github.com/en/actions/security-for-github-actions/security-guides/automatic-token-authentication#permissions-for-the-github_token

MITRE. (2026). *CWE-250: Execution with unnecessary privileges*.
https://cwe.mitre.org/data/definitions/250.html

National Institute of Standards and Technology. (2022). *Secure software
development framework (SSDF) version 1.1: Recommendations for mitigating the
risk of software vulnerabilities* (NIST Special Publication 800-218).
https://doi.org/10.6028/NIST.SP.800-218

NVIDIA. (n.d.). *NVIDIA NIM for large language models documentation*.
Retrieved August 17, 2026, from
https://docs.nvidia.com/nim/large-language-models/latest/

OpenCode. (n.d.). *OpenCode documentation*. Retrieved August 17, 2026, from
https://opencode.ai/docs/
6 changes: 3 additions & 3 deletions requirements-pip-audit-ci-hashes.txt
Original file line number Diff line number Diff line change
Expand Up @@ -213,9 +213,9 @@ packaging==26.2 \
# via
# pip-audit
# pip-requirements-parser
pip==26.1.2 \
--hash=sha256:382ff9f685ee3bc25864f820aa50505825f10f5458ffff07e30a6d96e5715cab \
--hash=sha256:f49cd134c61cf2fd75e0ce2676db03e4054504a5a4986d00f8299ae632dc4605
pip==26.2.1 \
--hash=sha256:71138adf1f4ca900cdb7d289c21b7494329f2332b6d85f0e1c42108c0384ed3e \
--hash=sha256:f6ad667e89a1fe78046c8f13232b247200f5258d7828f3f7883d660878e0813f
# via pip-api
pip-api==0.0.34 \
--hash=sha256:8b2d7d7c37f2447373aa2cf8b1f60a2f2b27a84e1e9e0294a3f6ef10eb3ba6bb \
Expand Down
5 changes: 3 additions & 2 deletions tests/test_hourly_scheduler_runtime_budget.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
REUSABLE = Path(".github/workflows/pr-review-fix-scheduler.yml")
CLEARFOLIO = Path(".github/workflows/clearfolio-hourly-review-repair.yml")
DISKSAGE = Path(".github/workflows/disksage-hourly-review-repair.yml")
WARDNET = Path(".github/workflows/wardnet-hourly-review-repair.yml")
QUALITY = Path(".github/workflows/hourly-nvidia-nim-review-repair.yml")


Expand All @@ -25,8 +26,8 @@ def test_queue_scanner_has_a_bounded_superseding_runtime() -> None:


def test_product_callers_do_not_cancel_an_in_flight_rca() -> None:
"""Clearfolio and DiskSage preserve the non-cancelling product lease."""
for caller_path in (CLEARFOLIO, DISKSAGE):
"""Clearfolio, DiskSage, and Wardnet preserve the non-cancelling product lease."""
for caller_path in (CLEARFOLIO, DISKSAGE, WARDNET):
caller = _read(caller_path)
assert "cancel-in-progress: false" in caller
assert "cancel-in-progress: true" not in caller
Expand Down
Loading
Loading