docs: reconcile personal-agent secondbrain apply route

This commit is contained in:
Svrnty
2026-06-14 09:39:12 -04:00
parent 389bd1e89d
commit d19825c3e6
9 changed files with 81 additions and 15 deletions
+40 -1
View File
@@ -199,6 +199,7 @@ def main() -> int:
"PACR-006",
"PACR-007",
"PACR-008",
"PACR-010",
"status: candidate",
"owner: jp",
]:
@@ -331,6 +332,7 @@ def main() -> int:
"contracts/personal-agent-imessage-readonly-contract.json",
"contracts/runtime-compliance-boundary.json",
"contracts/secondbrain-proposal-envelope-contract.json",
"../secondbrain/docs/integration/2026-06-14-secondbrain-personal-agent-imessage-apply-contract.md",
]:
if ref not in refs:
errors.append(f"bluebubbles_binding_reference_missing:{ref}")
@@ -556,6 +558,12 @@ def main() -> int:
!= "../secondbrain/docs/integration/2026-06-14-secondbrain-personal-agent-imessage-intake-contract.md"
):
errors.append("memory_route_imessage_intake_contract_missing")
if (
surface == "imessage.read"
and route.get("secondbrain_apply_contract")
!= "../secondbrain/docs/integration/2026-06-14-secondbrain-personal-agent-imessage-apply-contract.md"
):
errors.append("memory_route_imessage_apply_contract_missing")
allowed = route.get("allowed_effects")
if not isinstance(allowed, list) or "emit_redacted_proposal" not in allowed:
errors.append(f"memory_route_redacted_proposal_not_allowed:{surface}")
@@ -584,12 +592,22 @@ def main() -> int:
apply_policy = memory_route.get("apply_policy", {})
if apply_policy.get("apply_route") != "Secondbrain governed memory write path":
errors.append("memory_route_apply_policy_route_invalid")
if apply_policy.get("apply_route_contract") != "../secondbrain/docs/integration/2026-06-14-secondbrain-personal-agent-imessage-apply-contract.md":
errors.append("memory_route_apply_policy_contract_missing")
if apply_policy.get("governed_apply_route_defined") is not True:
errors.append("memory_route_apply_policy_route_not_defined")
if apply_policy.get("apply_allowed_now") is not False:
errors.append("memory_route_apply_allowed_now")
if apply_policy.get("live_apply_executed") is not False:
errors.append("memory_route_live_apply_executed")
if apply_policy.get("durable_apply_without_approval") is not False:
errors.append("memory_route_apply_without_approval")
if apply_policy.get("requires_secondbrain_validator") != "python3 tools/validate_secondbrain_child.py":
errors.append("memory_route_secondbrain_validator_missing")
if apply_policy.get("focused_secondbrain_gate_command") != "python3 tools/check_secondbrain_personal_agent_imessage_intake.py":
errors.append("memory_route_focused_secondbrain_gate_command_missing")
if apply_policy.get("focused_secondbrain_apply_gate_command") != "python3 tools/check_secondbrain_personal_agent_imessage_apply.py":
errors.append("memory_route_focused_secondbrain_apply_gate_command_missing")
for key in [
"requires_focused_secondbrain_gate",
"requires_human_or_governed_approval",
@@ -618,6 +636,8 @@ def main() -> int:
"../secondbrain/docs/integration/2026-06-09-secondbrain-hermes-runtime-boundary.md",
"../secondbrain/docs/integration/2026-06-14-secondbrain-personal-agent-imessage-intake-contract.md",
"../secondbrain/docs/evidence/2026-06-14-secondbrain-personal-agent-imessage-intake-proof.md",
"../secondbrain/docs/integration/2026-06-14-secondbrain-personal-agent-imessage-apply-contract.md",
"../secondbrain/docs/evidence/2026-06-14-secondbrain-personal-agent-imessage-apply-proof.md",
]:
if ref not in refs:
errors.append(f"memory_route_secondbrain_ref_missing:{ref}")
@@ -636,6 +656,8 @@ def main() -> int:
if field not in forbidden_fields:
errors.append(f"memory_route_forbidden_field_missing:{field}")
remaining_gates = memory_route.get("remaining_gates", {})
if remaining_gates.get("secondbrain_governed_apply_route") != "defined-no-live-apply":
errors.append("memory_route_governed_apply_route_not_defined")
for gate in [
"secondbrain_durable_apply",
"curator_hygiene_apply_review",
@@ -755,8 +777,16 @@ def main() -> int:
errors.append("service_handoff_apply_owner_invalid")
if apply.get("hygiene_owner") != "curator":
errors.append("service_handoff_hygiene_owner_invalid")
if apply.get("apply_route_defined") is not True:
errors.append("service_handoff_apply_route_not_defined")
if apply.get("apply_route_contract") != "../secondbrain/docs/integration/2026-06-14-secondbrain-personal-agent-imessage-apply-contract.md":
errors.append("service_handoff_apply_route_contract_missing")
if apply.get("apply_allowed_now") is not False:
errors.append("service_handoff_apply_allowed_now")
if apply.get("live_apply_executed") is not False:
errors.append("service_handoff_live_apply_executed")
if apply.get("durable_apply_without_approval") is not False:
errors.append("service_handoff_apply_without_approval")
for key in ["requires_proposal_envelope", "requires_approval", "requires_redacted_evidence"]:
if apply.get(key) is not True:
errors.append(f"service_handoff_apply_requirement_missing:{key}")
@@ -770,6 +800,7 @@ def main() -> int:
"docs/contracts/personal-agent-bluebubbles-binding.json",
"docs/contracts/personal-agent-proton-rclone-package.json",
"docs/contracts/personal-agent-secondbrain-proposal-route.json",
"../secondbrain/docs/integration/2026-06-14-secondbrain-personal-agent-imessage-apply-contract.md",
]:
if ref not in source_contracts:
errors.append(f"service_handoff_source_contract_missing:{ref}")
@@ -789,6 +820,8 @@ def main() -> int:
if field not in forbidden_fields:
errors.append(f"service_handoff_forbidden_field_missing:{field}")
remaining_gates = service_handoff.get("remaining_gates", {})
if remaining_gates.get("secondbrain_governed_apply_route") != "defined-no-live-apply":
errors.append("service_handoff_governed_apply_route_not_defined")
for gate in [
"conductor_lane_pickup",
"curator_personal_memory_hygiene_lane_pickup",
@@ -856,6 +889,8 @@ def main() -> int:
errors.append("runtime_snapshot_bluebubbles_validator_not_ok")
if imessage_health.get("read_only_imessage") is not True:
errors.append("runtime_snapshot_imessage_not_readonly")
if imessage_health.get("secondbrain_governed_apply_route") != "defined-no-live-apply":
errors.append("runtime_snapshot_secondbrain_apply_route_not_defined")
if imessage_health.get("package_runtime_claims") is not False:
errors.append("runtime_snapshot_bluebubbles_runtime_claim_overclaimed")
posture = runtime.get("supervisor_posture", {})
@@ -902,6 +937,8 @@ def main() -> int:
if field not in forbidden_fields:
errors.append(f"runtime_snapshot_forbidden_field_missing:{field}")
remaining_gates = runtime.get("remaining_gates", {})
if remaining_gates.get("secondbrain_governed_apply_route") != "defined-no-live-apply":
errors.append("runtime_snapshot_governed_apply_route_not_defined")
for gate in [
"proton_email_gate_repair",
"proton_contacts_gate_repair",
@@ -1040,6 +1077,8 @@ def main() -> int:
if field not in forbidden_fields:
errors.append(f"desktop_exposure_forbidden_field_missing:{field}")
remaining_gates = desktop.get("remaining_gates", {})
if remaining_gates.get("secondbrain_governed_apply_route") != "defined-no-live-apply":
errors.append("desktop_exposure_governed_apply_route_not_defined")
for gate in [
"adapter_lane_pickup",
"desktop_ui_wiring",
@@ -1070,7 +1109,7 @@ def main() -> int:
"active-capability-package",
"Personal-agent BlueBubbles binding",
"Proton/rclone package candidate",
"Personal-agent Secondbrain proposal route",
"Personal-agent Secondbrain proposal/apply route",
"Personal-agent Conductor/Curator service handoff",
"Personal-agent runtime readiness snapshot",
"Personal-agent desktop exposure contract",