Skip to content

symfonic.platform.edge_curation

edge_curation

Verified, pre-audited edge deletion over the native graph service.

EdgeCurationService

EdgeCurationService(edges, *, sink=None)
Source code in src/symfonic/platform/edge_curation.py
def __init__(self, edges, *, sink=None):
    self._edges = edges
    self._sink = sink

delete_many async

delete_many(principal, edge_ids)

Audit every intent first, then retain the legacy attempted-call count.

Source code in src/symfonic/platform/edge_curation.py
async def delete_many(self, principal, edge_ids):
    """Audit every intent first, then retain the legacy attempted-call count."""
    self._edges.ensure_available()
    if (self._sink is None or isinstance(self._sink, NullAuditSink)
            or not callable(getattr(self._sink, "emit", None))):
        raise AuditSinkError("edge deletion requires an explicitly configured audit sink")
    audit = AuditSeam(self._sink)

    def event(edge_id, outcome):
        return AuditRecord(
            action="bulk_delete_edge", outcome=outcome,
            principal_id=principal.principal_id, scope_key=principal.scope.scope_key,
            resource_type="memory_edge", resource_id=edge_id,
            metadata={"tenant_id": principal.scope.tenant_id},
        )

    for edge_id in edge_ids:
        await audit.record(event(edge_id, "initiated"), destructive=True)
    deleted = 0
    for edge_id in edge_ids:
        try:
            await self._edges.delete(memory_scope(principal.scope), edge_id)
        except Exception:  # noqa: BLE001 - preserve legacy per-ID continuation
            logger.warning("Bulk edge deletion failed for one ID")
            await audit.record(event(edge_id, "failed"))
        else:
            deleted += 1
            await audit.record(event(edge_id, "completed"))
    return {"deleted": deleted}