Harness foundation: INTENT, ADR-001, architecture, prototype adoption

- INTENT.md: three-layer model (blueprint/instance/harness), single
  shared runtime, never-become boundaries
- ADR-001 (accepted): DEC-2026-002 resolution — one harness repo for
  all projects; instances are declarative state in consuming repos
- docs/architecture.md: components, contracts (manifest, tool
  profiles, completion events, credential lanes), deployment shape
- agent_harness/: executor-worker prototype adopted and renamed
  (6/6 tests green); HARNESS-WP-0001 initial workplan (7 tasks)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
tegwick 2026-07-17 23:35:27 +02:00
parent 87ae78c56a
commit cfc1b75157
18 changed files with 1204 additions and 1 deletions

39
agent_harness/persona.py Normal file
View file

@ -0,0 +1,39 @@
"""Persona orientation via kaizen-agentic (ADR-005 prepare step).
The ADR-005 contract for a scheduled run is `kaizen-agentic schedule
prepare <agent>` executed against the target repo: it bundles the agent
prompt, project memory, metrics summary, and repo pointers from local
`.kaizen/` state — offline-safe, no hub required. The worker treats the
bundle as orientation text prepended to the task prompt.
Falls back to an empty bundle when the CLI or the repo's schedule state is
absent, so a task can still run persona-less (logged in run metadata).
"""
from __future__ import annotations
import subprocess
from pathlib import Path
def load_persona_bundle(agent: str, target_repo: Path, timeout: int = 60) -> tuple[str, str]:
"""Return (bundle_text, source) where source is 'prepare' or 'none'."""
try:
result = subprocess.run(
[
"kaizen-agentic",
"schedule",
"prepare",
agent,
"--target",
str(target_repo),
],
capture_output=True,
text=True,
timeout=timeout,
)
except (FileNotFoundError, subprocess.TimeoutExpired):
return "", "none"
if result.returncode != 0 or not result.stdout.strip():
return "", "none"
return result.stdout, "prepare"