Skip to content

dev → main: v0.2.0 release promotion#17

Open
gnanirahulnutakki wants to merge 627 commits into
mainfrom
dev
Open

dev → main: v0.2.0 release promotion#17
gnanirahulnutakki wants to merge 627 commits into
mainfrom
dev

Conversation

@gnanirahulnutakki

@gnanirahulnutakki gnanirahulnutakki commented May 26, 2026

Copy link
Copy Markdown
Member

Summary

Promotes the current dev branch to main as the human-gated v0.2.0 release candidate. At the current head, dev is 524 commits ahead of main; main is an ancestor of dev, with zero reverse-only commits, so this remains a forward-only promotion.

The existing immutable v0.1.0 tag remains at 00c8d7eb88b0cc98cc8f65f8bfcca94491db5b9a. It will not be moved or rewritten. PR #245 prepared package, runtime, proxy, lock, and OCI documentation metadata at 0.2.0. A fresh v0.2.0 tag and GitHub Release remain deferred to #147 after this promotion.

Current release scope

  • Tool-call-boundary governance with fail-closed policy evaluation and signed, hash-chained evidence.
  • Mission Passport JWT identity and delegation controls.
  • Python governance proxy and CLI, including health, JWKS, rate limiting, kill switch, metrics, TLS, and SPIFFE X.509-SVID mTLS telemetry ingestion.
  • Go daemon, launch-wrapper session linkage, eBPF lifecycle capture, cgroup-scoped BPF policy, seccomp/container controls, and measured Linux/KVM paths.
  • Claude Code and Gemini integration surfaces.
  • Prepared Python package and immutable OCI proxy release pipelines.
  • Public protocol/profile documentation and offline verification artifacts.

This release does not claim universal kernel enforcement for unknown or uncooperative agents. Remaining unknown-agent attach and independent-corpus work stay explicitly tracked.

Current evidence — 2026-07-12

  • Current dev / PR head: eb63d22361c45621df7c04884ee978b9bf0195c3.
  • origin/main at ce7ac316320b7b37ad03bf21a045c95126e45bec is an ancestor of origin/dev; 524 forward commits and zero reverse-only commits.
  • Current PR dev → main: v0.2.0 release promotion #17 rollup: 72 successful checks, 12 intentional skips, zero failures, zero pending.
  • Latest reviewed local Python suite: 1,811 passed, 33 skipped.
  • Exact merged-dev SHA verification: all 17 workflows successful, including Python 3.10/3.13, Go, CodeQL, package/wheel smoke, OCI, docs/links/formats/secrets, Linux governance benchmark, BPF generation, KVM kernel smoke, seccomp smoke, and strict ardur run --enforce seccomp E2E.
  • Kernel attempt 1 encountered an upstream proxy.golang.org HTTP/2 reset during module download; failed-job attempt 2 passed on the unchanged SHA.
  • Package build/distribution validation, Python 3.9 rejection guard, fresh-user RWT, and authenticated proxy lifecycle smoke passed.
  • Historical v0.1.0 tag is unchanged; no v0.2.0 tag or GitHub Release exists.

Promotion gates

Approval boundary

Branch protection requires one human approving review. Automated work must not supply or bypass that approval. Stale reviews are dismissed when dev advances, so approval must apply to the final head after #272 is stamped on the real release date. Current head eb63d22361c45621df7c04884ee978b9bf0195c3 has zero approvals.

Related: #140, #147, #189, #191, #272, #79.

Comment thread python/tests/test_e2e_showcase.py Fixed
Comment thread python/tests/test_e2e_showcase.py Fixed
Comment thread python/tests/test_e2e_showcase.py Fixed
Comment thread python/tests/test_e2e_showcase.py Fixed
Comment thread python/tests/test_e2e_showcase.py Fixed
Comment thread python/tests/test_e2e_showcase.py Fixed
Comment thread python/tests/test_e2e_showcase.py Fixed
Comment thread python/tests/test_e2e_showcase.py Fixed
Comment thread python/tests/test_e2e_showcase.py Fixed
gnanirahulnutakki added a commit that referenced this pull request May 26, 2026
…o/sigs.k8s.io/controller-runtime-0.24.0

deps(go)(deps): bump sigs.k8s.io/controller-runtime from 0.23.3 to 0.24.0 in /go
@gnanirahulnutakki gnanirahulnutakki changed the title dev → main: e2e showcase, dependabot bumps, controller-runtime update dev → main: v0.1.0 governance hardening, Phase 2 daemon, e2e showcase, dependabot bumps May 26, 2026
Comment thread python/vibap/gemini_cli_hook.py Fixed
Comment thread python/vibap/codex_app_server_fixture.py Fixed
Comment thread python/vibap/proxy.py Fixed
Comment thread python/vibap/gemini_cli_hook.py Fixed
Comment thread python/vibap/codex_app_server_fixture.py Fixed
Comment thread python/tests/test_gemini_cli_hook.py Fixed
Comment thread python/tests/test_examples_governance_integration.py Fixed
Comment thread python/tests/test_examples_governance_integration.py Fixed
Comment thread python/tests/test_examples_governance_integration.py Fixed
Comment thread python/tests/test_examples_governance_integration.py Fixed
Comment thread python/vibap/proxy.py Fixed
Comment thread python/vibap/mcp_gateway.py Fixed
Comment thread python/vibap/mcp_gateway.py Fixed
Comment thread python/vibap/proxy.py Fixed
Comment thread python/vibap/claude_code_hook.py Fixed
Comment thread python/tests/test_mcp_gateway.py Fixed
Comment thread python/tests/test_mcp_gateway.py Fixed
Comment thread python/tests/test_mcp_gateway.py Fixed
Comment thread python/tests/test_content_safety.py Fixed
Comment thread python/tests/test_content_safety.py Fixed
Comment thread scripts/generate_adversarial_scoreboard.py Fixed
Comment thread python/vibap/gemini_cli_hook.py Fixed
Comment thread python/vibap/passport.py Fixed
Comment thread python/vibap/proxy.py Fixed
Comment thread python/vibap/proxy.py Fixed
Comment thread go/pkg/kernelcapture/daemon_session_status_evidence_log_entry.go Fixed
Comment thread python/tests/test_ardur_personal_hub.py Fixed
Comment thread python/tests/test_claude_code_hook.py Fixed
Comment thread python/vibap/claude_code_daemon.py Fixed
Comment thread python/vibap/cli.py Fixed
Comment thread python/vibap/cli.py Fixed
Comment thread python/vibap/cli.py Fixed
Comment thread python/vibap/cli.py Fixed
Comment thread python/vibap/cli.py Fixed
Comment thread python/vibap/personal_hub.py Fixed
Comment thread python/vibap/run_bridge.py Fixed
Comment thread python/vibap/kernel_correlation.py Fixed
Comment thread python/vibap/run_bridge.py Fixed
Comment thread python/vibap/run_bridge.py Fixed
Comment thread go/cmd/ardur-kernelcaptured/main.go Fixed
Comment thread python/tests/test_bpf_lower.py Fixed
Comment thread python/tests/test_bpf_lower.py Fixed
Comment thread python/tests/test_bpf_lower.py Fixed
Comment thread python/vibap/bpf_lower.py Fixed
Comment thread python/vibap/bpf_lower.py Fixed
Comment thread go/cmd/ardur-kernelcaptured/daemon_enforce.go Fixed
Comment thread python/vibap/run_bridge.py Fixed
Comment thread docs/demo/enforce-e2e/agent.py Fixed
Comment thread python/tests/test_default_home_lazy_import.py Fixed
gnanirahulnutakki and others added 7 commits July 21, 2026 18:56
Upstream govulncheck DB now flags golang.org/x/text v0.38.0 via the
StatusClient.fetchStatusList -> http.Client.Get -> norm.Form.String
call chain in go/pkg/credential/status.go. This blocks the 'tests'
required dev-branch CI context.

Bump to v0.39.0 (patched). go mod tidy also updates the transitive
golang.org/x/tools v0.46.0 -> v0.47.0 for consistency.

No code changes. All Go tests pass.
Claude Code treats exit code 1 as a non-blocking error, which means the
tool call proceeds without a policy decision.  The previous main() returned
exit code 1 on malformed JSON, oversized input, and handler crashes,
silently bypassing governance on any of those paths.

The handler-crash path was especially exploitable: map_tool_call runs
before the try/except block in handle_pre_tool_use, so unusual tool_input
that triggers an unhandled exception would escape to main()'s catch-all
and silently allow the tool call.

Fix: every PreToolUse error path now emits a protocol-valid deny
(hookSpecificOutput/permissionDecision=deny) on stdout with exit code 0.
PostToolUse and subagent phases emit {"continue": true} since they cannot
block.  Diagnostic detail (structured input-error JSON, crash message)
moves to stderr for operator troubleshooting.

Also wraps json.dumps(output) in try/except to fall back to deny if the
handler returns a dict containing a non-serializable value.

Regression tests: handler-crash deny, post-crash continue,
non-serializable-output deny, updated malformed-input and oversize-stdin
tests for the new fail-safe behavior.
…ench-label

auditbench-oracle: refactor main() to testable run(args, stdout, stderr)
with exit-code constants matching ardur-agent-recognition-eval/benchmark
pattern; replace bare == "" checks with strings.TrimSpace() for -in/-out.

auditbench-label: replace bare == "" checks with strings.TrimSpace() in
runBundle (-study-id/-view/-source/-out) and runAdjudicate
(-study-id/-annotations/-out).

Add table-driven whitespace/positional-arg rejection tests for both
commands. Mirrors the Python CLI type=str + not value.strip() guard.

Verified: go test + go vet green for both packages and full ./cmd/... tree.
…hmark, ardur-agent-recognition-eval, ardur-exec-shim

ardur-agent-recognition-benchmark: replace bare == "" with strings.TrimSpace()
for the six required flags (daemon-bin, reference-daemon-bin, workload-bin,
source-sha, reference-source-sha, output-dir) in the run() validation block.

ardur-agent-recognition-eval: replace bare path == "" with strings.TrimSpace()
in loadCorpus and loadThresholds so a whitespace-only -corpus/-thresholds
value falls back to the embedded corpus/thresholds instead of attempting to
open a file literally named "   ".

ardur-exec-shim: extract validateArguments(sessionID, args) helper and replace
the bare *sessionID == "" guard in main() with a strings.TrimSpace() check,
mirroring the auditbench-oracle testable-run refactor pattern.

Add table-driven whitespace rejection tests for all three commands. exec-shim
tests are //go:build linux to match the package; they compile+vet under
GOOS=linux and execute in CI's Linux environment.

Verified: go test + go vet green for the three packages (exec-shim via
GOOS=linux compile/vet; benchmark+eval run natively).
Wrap all required path/string flag checks with strings.TrimSpace() across
seal/verify/score subcommands (8 studyPaths fields + seal/sealed-at/seal/
result/out). Adds table-driven tests covering every required flag × 3
whitespace variants.

Matches landed siblings: auditbench-oracle, auditbench-label,
ardur-agent-recognition-benchmark/eval, ardur-exec-shim.
…hcheck

ardur-seccomp-smoke: extract validateRequiredPaths(daemonBin, shimBin)
helper and replace the bare *daemonBin == "" || *shimBin == "" guard in
main() with a strings.TrimSpace() check, mirroring the exec-shim
validateArguments refactor pattern from commit 23047fb.

benchcheck: extract shouldUseDefaultPackDir(arg) helper and replace the
bare packDir == "" fallback with strings.TrimSpace() so a whitespace-only
positional argument (e.g. "   ") falls back to the detected default
instead of being passed to live.EvaluatePack as a literal directory name.

Add table-driven whitespace rejection tests for both commands. The
seccomp-smoke test is //go:build linux to match the package; it
compiles+ vets under GOOS=linux and executes in CI's Linux environment,
matching the exec-shim test discipline.

Verified: go vet ./... clean; go test ./cmd/benchcheck/... passes (8
subtests); GOOS=linux go vet ./cmd/ardur-seccomp-smoke/... clean and
GOOS=linux go test -c compiles the test binary.

Matches landed siblings: auditbench-oracle, auditbench-label,
ardur-agent-recognition-benchmark/eval, ardur-exec-shim, auditbench-score.
Behavior-preserving cleanup of 7 CodeQL quality-level alerts (zero
security severity) across 5 test files:

- test_doctor_claude_code_paths.py: remove unused import subprocess
  and unused captured = capsys.readouterr() in one function
- test_preflight_tool_server_paths.py: remove unused rc assignment
- test_personal_native_host_paths.py: remove unused rc assignment
- test_personal_firewall_demo_paths.py: remove unused rc and
  rendered assignments
- test_anchor_paths.py: remove unused rendered assignment

All 5 files focused tests pass (33/33) and the full Python suite
passes (2065/25-skip).
gnanirahulnutakki and others added 14 commits July 22, 2026 21:03
Close the v0.2.0 release-readiness gaps with auditable dependency evidence, reproducible verification, package policy tests, and synchronized documentation.

Signed-off-by: Gnani Rahul Nutakki <gnani.nutakki@gmail.com>
Resolve all pre-existing Ruff and ShellCheck findings, add a regression for the selected-Python graph compile path, and retain mandatory formatter output only in affected files. CodeRabbit-adjacent pre-existing findings are tracked separately in #366 and #367.

Signed-off-by: Gnani Rahul Nutakki <gnani.nutakki@gmail.com>
Inherit and validate the closed MIC policy bundle on supported child derivation, and enforce exact parent-aware verification. Keep the DRP mapping inventory synchronized with the newly signed child claims.

Tests: 217 passed across passport, delegation, MIC, proxy, HTTP, and DRP mapping suites.

Signed-off-by: Gnani Rahul Nutakki <gnani.nutakki@gmail.com>
…gated-mic-claims

fix(security): preserve MIC claims across delegation
Issue signed MIC-State and MIC-Evidence passports, assert exact fail-closed outcomes, and prove downgraded profiles cannot satisfy the showcase assertions.

Reflect annotated setup, call, and teardown failures in the human-readable showcase footer so pytest failures cannot be reported as ALL GOOD.

Signed-off-by: Gnani Rahul Nutakki <gnani.nutakki@gmail.com>
…showcase

test: make MIC showcase exercise signed enforcement
Preserve each original assistant turn around its ordered tool calls, emit current Ollama tool result fields, and fail honestly when a follow-up request is rejected.

Tests: 21 passed, 10 skipped, 5 pre-existing PytestRemovedIn10Warning warnings tracked by #371.
Signed-off-by: Gnani Rahul Nutakki <gnani.nutakki@gmail.com>
Only an explicit PERMIT now produces a successful simulated tool result. DENY is reported as denied, while missing, unusable, or non-200 evidence is reported as unknown without changing the existing HTTP-200 evaluation counter.

Tests: 29 passed, 10 skipped, 5 pre-existing PytestRemovedIn10Warning warnings tracked by #371.
Signed-off-by: Gnani Rahul Nutakki <gnani.nutakki@gmail.com>
…i-tool-turn

test: preserve multi-tool assistant turns
Hoist tracker/operator_id initialization before the if/else block
so both variables are always defined. Remove the now-redundant
else branch that set them to None — identical behavior, but
CodeQL no longer flags operator_id as potentially unbound.

Closes CodeQL alert #289 (py/unused-local-variable at proxy.py:3842).
Convert all seven class-scoped autouse showcase fixtures to pytest supported class methods so their setup remains class-wide after pytest 10 removes instance-method support.

Tests: 29 passed, 10 skipped with PytestRemovedIn10Warning promoted to an error.

Checkpoint: architect/sessions/release-v0.2.0-qualification/2026-07-22-journal.md
Signed-off-by: Gnani Rahul Nutakki <gnani.nutakki@gmail.com>
…st-fixtures

test: migrate showcase class fixtures for pytest 10
Checkpoint: architect/sessions/release-v0.2.0-qualification/2026-07-22-journal.md
Signed-off-by: Gnani Rahul Nutakki <gnani.nutakki@gmail.com>
…ma-transcripts

test: normalize Ollama tool-call transcripts
…[Unreleased]

Document 8 non-merge commits landed since v0.2.0 (2026-07-22):
- MIC conformance claim inheritance and validation across delegation
  (aae73be) — governance behavior change, fail-closed rule
- CodeQL unused-local-variable fix in proxy.py (a5faae9)
- Ruff/ShellCheck lint hygiene restoration (430ec3a)
- Test hardening: MIC showcase signed enforcement, multi-tool turn
  preservation, evaluation fail-closed semantics, @classmethod fixture
  conversion for pytest 10, Ollama transcript normalization

All entries under Fixed (Keep-a-Changelog). No overclaims.

Signed-off-by: Hermes <hermes@ardur.dev>
…nt modules

Change type=Path to type=str for 8 argparse declarations across 4
sibling entry-point modules so empty ('') and whitespace ('   ')
strings are caught by pre-validation before Path() conversion.

Before this fix, type=Path normalized '' to Path('.') (the current
directory), silently resolving to CWD and causing fixture artifact
pollution or misleading error messages.

Modules fixed:
- receiver_attestation_fixture (--output)
- provider_adapter_fixture (--out-dir, --mission)
- drp_conformance (--bundle, --output)
- policy_conformance (--bundle, --output)

Each module now emits structured JSON with a stable condition field
on empty/whitespace input. provider_adapter_fixture main() also
gains exception handling it previously lacked.

22 new focused tests cover empty and whitespace inputs for all 8 args.
…private keys

Ardur's protect command writes runtime artifacts (active_mission.jwt,
keys/, claude-code-pre_tool_use, etc.) to the project root, but .gitignore
only covered .ardur/ and .vibap/ state dirs. A recursive 'git add' could
accidentally stage a signed mission JWT or passport private key.

Additionally, the gitleaks rule only matched the SEC1 'EC PRIVATE KEY' PEM
header, but passport.py serialises keys as PKCS#8 ('BEGIN PRIVATE KEY').
A committed Ardur private key would silently pass secret scanning.

Changes:
- .gitignore: add active_mission.jwt, keys/, claude-code-hook-python,
  claude-code-pre_tool_use, claude-code-pre_tool_use.sha256
- .gitleaks.toml: add ardur-pkcs8-private-key rule for PKCS#8 PEM blocks
- test_gitignore_policy.py: add regression test for root runtime artifacts
…s, governance log, state, daemon socket, seccomp markers)

Rahul's 862cb71 added 5 root-level protect artifacts to .gitignore, but
ardur protect claude-code + the hook lifecycle write MORE artifacts to
CWD when --home . is used. These carry signed receipts and session state
and must never be accidentally staged.

Add root-anchored patterns for:
- /claude-code-hook/ (signed receipt chain directory)
- /governance_log.jsonl (session decisions)
- /state/ (budget/session snapshots)
- /claude-code-hook-daemon.sock (daemon Unix socket)
- /seccomp-ready-* (seccomp readiness markers)

Root-anchoring ensures tracked source like examples/claude-code-hook/
is preserved. Extend test_gitignore_policy.py to cover all 11 runtime
artifacts and prove root-anchoring with a VISIBLE_FILES entry.
sync_source_docs.py used REPO_ROOT.rglob('*.md') without excluding git
worktree directories. Contributors using local worktrees would get 1000+
stale Hugo mirror files and a broken sync_source_docs.py --check gate.

Add 'worktrees' to PUBLIC_MARKDOWN_EXCLUDED_DIR_NAMES and both
'worktrees/' + '.worktrees/' to PUBLIC_MARKDOWN_EXCLUDED_PREFIXES.
Add both patterns to .gitignore. Add test_sync_excludes_worktrees.py
with 3 tests verifying the exclusion.
…nforce-verify

benchcheck -out "" gave a raw mkdir error; -out "   " silently
created a whitespace-named directory in CWD with results files (CWD
pollution). enforce-verify "" and "   " gave raw os.Open errors.

Both now use strings.TrimSpace() to reject empty/whitespace before
any filesystem operation, matching the established Go CLI validation
pattern. Adds subprocess-based table tests for both commands.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants