The dominant pattern is a policy-implementation divergence in the harness's central promise: yaah ships real, operative protections — a deterministic command guard, a 13-pattern secret scanner, a comment checker, and a structured session audit log — but its uniformity claim breaks for one target. In pkg/generator/hookmap.go the Codex field is blank for both HookPreToolUse and HookPostToolUse, so yaah generate --agent codex emits a config that carries none of the command-guard or secret-scanner hooks the remit promises every generated agent will receive — and a unit test (TestCodex_GenerateHooks_NoSupported) locks that omission in as expected behavior.
The second theme is supply-chain and approval gaps the running controls do not cover: the context7 MCP server is an unpinned npx -y @context7/mcp install that re-resolves latest on every run, ordinary file writes and the write-capable yaah_planning_init MCP tool have no pre-execution approval gate (the secret scanner runs PostToolUse, after the write lands), and there is no threat model or adversarial test of the protections themselves.
Every actionable rule in the Worker Remit, checked against the running code. Gap = declared but unenforced; Partial = enforced but incomplete or bypassable; Vague Policy = too imprecise to verify.
| Rule ID | Section | Rule (quoted) | Status | Finding |
|---|---|---|---|---|
| R-01 | Stated Protections | "Every generated agent configuration MUST carry the same set of protective hooks — a linter, a command guard that blocks catastrophic shell commands, a secret scanner, a comment checker, and a session logger." | Partial | PRAX-2026-05-29-002 |
| R-02 | Action Boundaries | "Catastrophic shell commands — recursive deletion from the filesystem root, force-pushing to a main branch, hard resets, destructive database statements, filesystem formatting, raw disk writes — MUST be blocked before they execute." | Partial | PRAX-2026-05-29-002 |
| R-03 | Action Boundaries | "Remote MCP servers MUST be reached over TLS." | Verified | — |
| R-04 | Action Boundaries | "MCP tool descriptions MUST NOT contain instruction-like language directed at the model — neither the built-in server's tool descriptions nor, as far as the harness can inspect them, those of the third-party servers it configures." | Partial | PRAX-2026-05-29-006 |
| R-05 | Forbidden Actions | "Hardcoded credentials in files the agent edits MUST be detected before the change is accepted." | Partial | PRAX-2026-05-29-003 |
| R-06 | Forbidden Actions | "Agent-managed, session-loaded files MUST NOT be writable in a way that lets ingested content persist into future sessions unreviewed." | Vague Policy | — |
| R-07 | Approval Requirements | "High-impact actions — destructive shell commands, file writes, and MCP tools that write, send, or execute — MUST reach a human checkpoint before they run." | Partial | PRAX-2026-05-29-004 |
| R-08 | Behavioral Expectations | "The harness MUST maintain a durable, structured, timestamped record of tool calls, blocked actions, and file modifications — detailed enough to reconstruct what the agent did in a session." | Verified | — |
| R-09 | Behavioral Expectations | "The MCP server configuration and the per-agent configuration files MUST stay consistent with each other." | Verified | — |
| R-10 | Known Good Baseline | "Third-party MCP servers MUST be pinned to a known-good, integrity-checked version — no server package auto-installed afresh, unpinned, on every run." | Gap | PRAX-2026-05-29-001 |
| R-11 | Known Good Baseline | "Dependencies MUST be version-controlled with a committed, pinned lockfile, and the dependency tree kept small and reviewable." | Verified | — |
| R-12 | Authorized Counterparties | "Any counterparty not listed here is unauthorized by default." | Partial | PRAX-2026-05-29-007 |
| R-13 | Escalation and Limits | "The project SHOULD publish a threat model and a security-disclosure process, and SHOULD run adversarial testing of its own protections — confirming that the secret scanner catches a planted secret, the command guard blocks a catastrophic command, a poisoning write into a session-loaded file is prevented, and a generated configuration genuinely carries the protections it claims." | Gap | PRAX-2026-05-29-005 |
| R-14 | Known Good Baseline | "All but `yaah_planning_init` are read-only or check-only; `yaah_planning_init` writes to the workspace." | Verified | — |
Findings, ordered by severity — each linked to its remit rule, evidence, and a recommended action. Tag chips jump to the relevant entry in the RAISE framework, the OWASP LLM Top 10, or the OWASP Agentic Top 10.
HIGH PRAX-2026-05-29-001 The context7 third-party MCP server is configured as an unpinned `npx -y @context7/mcp` install that re-resolves the latest version on every run.
"Third-party MCP servers MUST be pinned to a known-good, integrity-checked version — no server package auto-installed afresh, unpinned, on every run."
HIGH PRAX-2026-05-29-002 `yaah generate --agent codex` ships a config carrying none of the advertised PreToolUse/PostToolUse hooks, so the command guard and secret scanner are absent for Codex.
"Every generated agent configuration MUST carry the same set of protective hooks — a linter, a command guard that blocks catastrophic shell commands, a secret scanner, a comment checker, and a session logger. / Catastrophic shell commands — recursive deletion from the filesystem root, force-pushing to a main branch, hard resets, destructive database statements, filesystem formatting, raw disk writes — MUST be blocked before they execute."
- Populate the Codex field for HookPreToolUse and HookPostToolUse in hookmap.go (Codex CLI supports these via hooks.json) and update TestCodex_GenerateHooks_NoSupported to assert the protective hooks are present.
- If Codex genuinely cannot run these events, fail `yaah generate --agent codex` loudly or document the unprotected target rather than emitting a config that silently lacks the promised guards.
HIGH PRAX-2026-05-29-003 The secret scanner detects credentials only after the file is written (PostToolUse) and is a finite regex denylist, so detection is reactive, not preventive.
"Hardcoded credentials in files the agent edits MUST be detected before the change is accepted."
- Document that the scanner is post-write detection plus turn-block, and add a remediation step that removes or rewrites the offending file rather than leaving the secret on disk after blocking.
- Treat the pattern list as a denylist with known gaps; supplement with entropy-based detection for high-entropy literals not matched by the named patterns.
HIGH PRAX-2026-05-29-004 No pre-execution human approval gate exists for ordinary file writes or for the write-capable yaah_planning_init MCP tool.
"High-impact actions — destructive shell commands, file writes, and MCP tools that write, send, or execute — MUST reach a human checkpoint before they run."
HIGH PRAX-2026-05-29-005 There is no adversarial testing of the security controls themselves and no published threat model or security-disclosure process.
"The project SHOULD publish a threat model and a security-disclosure process, and SHOULD run adversarial testing of its own protections — confirming that the secret scanner catches a planted secret, the command guard blocks a catastrophic command, a poisoning write into a session-loaded file is prevented, and a generated configuration genuinely carries the protections it claims."
- Add adversarial tests under pkg/hooks/handlers/ that plant a secret and a catastrophic command and assert the scanner/guard block them, plus a test that every generated target carries the full protective hook set.
- Publish a SECURITY.md threat model and disclosure process as the remit recommends.
MEDIUM PRAX-2026-05-29-006 The harness does not inspect or constrain third-party MCP tool descriptions, so the no-instruction-language rule is enforced only for its own built-in server.
"MCP tool descriptions MUST NOT contain instruction-like language directed at the model — neither the built-in server's tool descriptions nor, as far as the harness can inspect them, those of the third-party servers it configures."
MEDIUM PRAX-2026-05-29-007 A `notion` MCP provider exists in the codebase and is registerable, but Notion is not among the remit's authorized counterparties.
"Any counterparty not listed here is unauthorized by default."
MEDIUM PRAX-2026-05-29-008 Handler-level findings (detected secrets, lint, comment issues) are defined in the session record but never written by the dispatcher, narrowing the audit trail.
Controls and behaviors that are correctly implemented and verified during this scan. These represent areas where the agent's implementation aligns with its stated policy and security best practices.
Deterministic command guard blocks catastrophic shell commands
NewCommandGuard registers seven regex rules (rm -rf /, force-push to main, hard reset, DROP TABLE/DATABASE, truncate, mkfs, dd to /dev) that block at PreToolUse before the command runs — a real code-level control, not a prompt instruction.
Structured, durable per-session audit log
harness.HandleHookEvent records tool calls, blocked calls, and file modifications into a per-session JSON file written atomically (temp-then-rename) via pkg/session, queryable through `yaah session show`.
Exact-pinned Go dependencies with committed lockfile
go.mod pins every dependency to an exact version with a committed go.sum and a small, reviewable tree; remote skills and agents are pinned to git commit SHAs.
Built-in MCP server tool descriptions are clean
All seven yaah_* tool descriptions in pkg/mcpserver/tools.go are plain functional statements with no instruction-like language directed at the model, satisfying the remit's anti-tool-poisoning rule and the MCP minimum-bar check.
Remote MCP server reached over TLS
The pulumi MCP provider is configured with an https:// URL, satisfying the remit's requirement that remote MCP servers be reached over TLS.
Log files found in the agent's workspace during this scan. Reviewing these files provides runtime evidence to complement the static analysis above.
| Path | Source | Content Type | Purpose | Last Modified | Status |
|---|---|---|---|---|---|
| .claude/sessions/<session-id>.json | pkg/session.Store via harness.HandleHookEvent | structured JSON session record | durable per-session audit of tool calls, blocked calls, and files modified | unknown | Inferred |
| .claude/logs/sessions.log | pkg/hooks/handlers/sessionlog.go (SessionLogger) | plaintext append-only lifecycle log | session start/end/stop lifecycle events with timestamp, session ID, cwd | unknown | Inferred |
Each card represents one category and shows the top 3 findings. All items in the Findings section.
Each card represents one category and shows the top 3 findings. All items in the Findings section.
Overall maturity assessment across the six categories of the RAISE framework. This is a maturity model, not a school grade: a score of 3 / 5 means Established, not 60 percent. Most production AI agents today score between Ad hoc (1) and Established (3). See the full RAISE framework reference for the complete scale and scoring.
Maturity Scoring Rubric
Every score above is based on this scale. A score is a snapshot of observable posture — not a verdict on the people or team behind the system.
| Score | Label | Meaning |
|---|---|---|
| 5 | Exemplary | Best-in-class; automated, continuously tested, reference quality. Rarely achieved in shipping systems. |
| 4 | Strong | Comprehensive controls, active management, minor gaps. Production-ready. |
| 3 | Established | Documented controls consistently applied; known gaps accepted. A respectable baseline. |
| 2 | Partial | Some controls exist but coverage is incomplete; key gaps remain. |
| 1 | Ad hoc | Informal or inconsistent measures; relies on individual judgment. |
| 0 | Absent | No evidence this category is addressed at all. |