generated from coulomb/repo-seed
Implement WP-0022 audit trail and WP-0023 INTENT–SCOPE closeout
Add unified metadata-only audit.jsonl with secret-material guard, instrument sign/access/worker paths, and expose warden activity CLI. Surface broker hint when VAULT_TOKEN is unset, refresh INTENT/SCOPE docs, and add production integration checklists plus catalog lane promotion playbook.
This commit is contained in:
@@ -329,15 +329,44 @@ def execute_plan(plan: WorkerPlan, hub: HubClient, *, topic_id: Optional[str] =
|
||||
return out
|
||||
|
||||
|
||||
def _record_worker_audit(
|
||||
state_dir: Path, *, action: str, target: str, outcome: str = "ok", **extra: object
|
||||
) -> None:
|
||||
try:
|
||||
from warden.audit import record_event
|
||||
|
||||
record_event(
|
||||
state_dir,
|
||||
kind="worker",
|
||||
action=action,
|
||||
subject=WORKER_AGENT,
|
||||
target=target,
|
||||
outcome=outcome,
|
||||
source="worker",
|
||||
**extra,
|
||||
)
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
|
||||
def execute_plans(plans: List[WorkerPlan], hub: HubClient, *, topic_id: Optional[str] = None) -> str:
|
||||
"""FULL-AUTO: execute every plan's safe actions and return an audit summary."""
|
||||
state_dir = default_state_dir()
|
||||
lines: List[str] = []
|
||||
for p in plans:
|
||||
results = execute_plan(p, hub, topic_id=topic_id)
|
||||
lines.append(f"{p.from_agent}: {p.subject} ({p.message_id})")
|
||||
for r in results:
|
||||
lines.append(f" · {r}")
|
||||
return "\n".join(lines) if lines else "inbox empty — nothing to execute."
|
||||
summary = "\n".join(lines) if lines else "inbox empty — nothing to execute."
|
||||
_record_worker_audit(
|
||||
state_dir,
|
||||
action="tick_full_auto",
|
||||
target="state-hub-inbox",
|
||||
messages=len(plans),
|
||||
escalated=sum(1 for p in plans if p.escalated),
|
||||
)
|
||||
return summary
|
||||
|
||||
|
||||
# --- conservative tier (default for --execute): triage + draft, never auto-send ----------
|
||||
@@ -429,6 +458,12 @@ def approve_draft(
|
||||
hub.mark_read(message_id)
|
||||
drafts.pop(message_id, None)
|
||||
save_drafts(state_dir, drafts)
|
||||
_record_worker_audit(
|
||||
state_dir,
|
||||
action="approve_send",
|
||||
target=message_id,
|
||||
to_agent=d["to_agent"],
|
||||
)
|
||||
return f"sent reply to {d['to_agent']} ({d['subject']}) and marked read."
|
||||
|
||||
|
||||
@@ -514,6 +549,13 @@ def run_conservative(
|
||||
except Exception: # noqa: BLE001 — a note failure must not lose the digest
|
||||
pass
|
||||
save_seen(state_dir, seen | {p.message_id for p in new})
|
||||
_record_worker_audit(
|
||||
state_dir,
|
||||
action="tick_conservative",
|
||||
target="state-hub-inbox",
|
||||
messages=len(new),
|
||||
escalated=n_esc,
|
||||
)
|
||||
return digest
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user