docs: reconcile personal-agent secondbrain apply route
This commit is contained in:
@@ -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",
|
||||
|
||||
Reference in New Issue
Block a user