Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 22 additions & 0 deletions ace/application/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -330,6 +330,19 @@
IntelligenceBuilderSessionService,
RegisteredSourceOptionProvider,
)
from ace.application.intelligence_builder_activation import (
BuilderActivationBootstrapOutcome,
BuilderActivationPlanAdmission,
ExactCompiledPackResolver,
IntelligenceBuilderActivationError,
IntelligenceBuilderActivationService,
)
from ace.application.intelligence_builder_activation_contracts import (
BUILDER_ACTIVATION_PLAN_ARTIFACT_VERSION,
BUILDER_ACTIVATION_RECEIPT_ARTIFACT_VERSION,
BuilderActivationPlanArtifactV1,
BuilderActivationReceiptArtifactV1,
)
from ace.application.intelligence_builder_contracts import (
ConnectionEffect,
IntelligenceBuilderSessionRevisionV1,
Expand Down Expand Up @@ -785,6 +798,15 @@
"IMPACT_PROPOSAL_DISPOSITION_DECISION_TYPE",
"IMPACT_PROPOSAL_DISPOSITION_RECORD_KIND",
"IntelligenceBuilderArtifactAdmission",
"BuilderActivationBootstrapOutcome",
"BuilderActivationPlanAdmission",
"BuilderActivationPlanArtifactV1",
"BuilderActivationReceiptArtifactV1",
"BUILDER_ACTIVATION_PLAN_ARTIFACT_VERSION",
"BUILDER_ACTIVATION_RECEIPT_ARTIFACT_VERSION",
"ExactCompiledPackResolver",
"IntelligenceBuilderActivationError",
"IntelligenceBuilderActivationService",
"IntelligenceBuilderSessionAdmission",
"IntelligenceBuilderSessionError",
"IntelligenceBuilderSessionReplayConflict",
Expand Down
3 changes: 1 addition & 2 deletions ace/application/brief_synthesis.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
from typing import Callable, Literal

from ace.application.domain_activation import (
DOMAIN_ACTIVATION_STATE_KIND,
CommittedActivationBinding,
DomainActivationAdmissionError,
DomainActivationAdmissionService,
Expand Down Expand Up @@ -319,7 +318,7 @@ def _activation_precondition(binding: CommittedActivationBinding) -> GovernedSta
revision = binding.prepared_binding.revision
receipt = binding.commit_receipt
return GovernedStateHeadPreconditionV1Alpha1(
state_kind=DOMAIN_ACTIVATION_STATE_KIND,
state_kind=receipt.state_kind,
product_id=revision.spec.product_id,
state_id=str(revision.activation_id),
sequence=revision.revision,
Expand Down
28 changes: 20 additions & 8 deletions ace/application/domain_activation.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,8 @@
bind_prepared_activation,
)

DOMAIN_ACTIVATION_STATE_KIND = "domain_activation"
DOMAIN_ACTIVATION_STATE_KIND = "domain_activation_v1alpha1"
LEGACY_DOMAIN_ACTIVATION_STATE_KIND = "domain_activation"


class DomainActivationAdmissionError(RuntimeError):
Expand Down Expand Up @@ -104,7 +105,6 @@ def _validate_committed_pair(
) -> CommittedDomainActivation:
envelope = _envelope(revision)
expected = {
"state_kind": envelope.state_kind,
"product_id": envelope.product_id,
"state_id": envelope.state_id,
"sequence": envelope.sequence,
Expand All @@ -113,7 +113,10 @@ def _validate_committed_pair(
"prior_revision_id": envelope.prior_revision_id,
}
actual = {name: getattr(receipt, name) for name in expected}
if actual != expected:
if (
receipt.state_kind not in {DOMAIN_ACTIVATION_STATE_KIND, LEGACY_DOMAIN_ACTIVATION_STATE_KIND}
or actual != expected
):
raise DomainActivationAdmissionError("Core commit receipt does not bind the exact activation revision")
return CommittedDomainActivation(revision=revision, commit_receipt=receipt)

Expand Down Expand Up @@ -205,10 +208,16 @@ async def reload(
product_id=product_id,
state_id=activation_id,
)
if head is None:
head = await self.store.load_head(
state_kind=LEGACY_DOMAIN_ACTIVATION_STATE_KIND,
product_id=product_id,
state_id=activation_id,
)
if head is None:
return None
if (
head.state_kind != DOMAIN_ACTIVATION_STATE_KIND
head.state_kind not in {DOMAIN_ACTIVATION_STATE_KIND, LEGACY_DOMAIN_ACTIVATION_STATE_KIND}
or head.product_id != product_id
or head.state_id != activation_id
):
Expand All @@ -226,7 +235,6 @@ async def reload(
expected_envelope = _envelope(revision)
envelope_fields = (
"contract",
"state_kind",
"product_id",
"state_id",
"sequence",
Expand All @@ -236,7 +244,9 @@ async def reload(
"approval_subject_ref",
"payload_contract",
)
if any(getattr(expected_envelope, name) != getattr(envelope, name) for name in envelope_fields):
if envelope.state_kind not in {DOMAIN_ACTIVATION_STATE_KIND, LEGACY_DOMAIN_ACTIVATION_STATE_KIND} or any(
getattr(expected_envelope, name) != getattr(envelope, name) for name in envelope_fields
):
raise DomainActivationAdmissionError("persisted envelope does not match exact activation material")
if (
head.sequence != revision.revision
Expand Down Expand Up @@ -283,7 +293,6 @@ async def load_exact(
raise DomainActivationAdmissionError("historical activation revision failed exact revalidation") from None
envelope_fields = (
"contract",
"state_kind",
"product_id",
"state_id",
"sequence",
Expand All @@ -293,7 +302,9 @@ async def load_exact(
"approval_subject_ref",
"payload_contract",
)
if any(getattr(expected_envelope, name) != getattr(envelope, name) for name in envelope_fields):
if envelope.state_kind not in {DOMAIN_ACTIVATION_STATE_KIND, LEGACY_DOMAIN_ACTIVATION_STATE_KIND} or any(
getattr(expected_envelope, name) != getattr(envelope, name) for name in envelope_fields
):
raise DomainActivationAdmissionError("historical activation envelope changed from exact revision material")
return _validate_committed_pair(revision, receipt)

Expand All @@ -317,6 +328,7 @@ def bind_committed_activation(
"CommittedActivationBinding",
"CommittedDomainActivation",
"DOMAIN_ACTIVATION_STATE_KIND",
"LEGACY_DOMAIN_ACTIVATION_STATE_KIND",
"DomainActivationAdmissionError",
"DomainActivationAdmissionService",
"bind_committed_activation",
Expand Down
28 changes: 20 additions & 8 deletions ace/application/domain_activation_plan.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
from typing import Literal

from ace.application.briefing_agent_contracts import FirstBriefingPreviewV1
from ace.application.domain_activation import DOMAIN_ACTIVATION_STATE_KIND
from ace.application.domain_activation import LEGACY_DOMAIN_ACTIVATION_STATE_KIND
from ace.application.domain_activation_plan_contracts import (
DOMAIN_ACTIVATION_REVISION_V1ALPHA2_VERSION,
ActivationOnboardingHandoffV1Alpha2,
Expand Down Expand Up @@ -48,6 +48,9 @@ class DomainActivationPlanAdmissionError(RuntimeError):
"""Exact-plan activation material failed closed before durable effect."""


DOMAIN_ACTIVATION_PLAN_STATE_KIND = "domain_activation_plan_v1alpha2"


@dataclass(frozen=True, slots=True)
class CommittedDomainActivationPlan:
revision: DomainActivationRevisionV1Alpha2
Expand Down Expand Up @@ -300,7 +303,7 @@ def _envelope(revision: DomainActivationRevisionV1Alpha2) -> GovernedStateRevisi
):
raise DomainActivationPlanAdmissionError("v1alpha2 activation material is missing a derived identity")
return GovernedStateRevisionV1(
state_kind=DOMAIN_ACTIVATION_STATE_KIND,
state_kind=DOMAIN_ACTIVATION_PLAN_STATE_KIND,
product_id=revision.plan.spec.product_id,
state_id=revision.activation_id,
sequence=revision.revision,
Expand All @@ -320,15 +323,16 @@ def _validate_committed_pair(
receipt = _revalidate_commit_receipt(receipt)
envelope = _envelope(revision)
expected = {
"state_kind": envelope.state_kind,
"product_id": envelope.product_id,
"state_id": envelope.state_id,
"sequence": envelope.sequence,
"revision_id": envelope.revision_id,
"material_hash": envelope.material_hash,
"prior_revision_id": envelope.prior_revision_id,
}
if any(getattr(receipt, name) != value for name, value in expected.items()):
if receipt.state_kind not in {DOMAIN_ACTIVATION_PLAN_STATE_KIND, LEGACY_DOMAIN_ACTIVATION_STATE_KIND} or any(
getattr(receipt, name) != value for name, value in expected.items()
):
raise DomainActivationPlanAdmissionError(
"Core commit receipt does not bind the exact v1alpha2 activation revision"
)
Expand Down Expand Up @@ -444,7 +448,6 @@ def _parse_persisted_revision(
expected = _envelope(revision)
fields = (
"contract",
"state_kind",
"product_id",
"state_id",
"sequence",
Expand All @@ -454,7 +457,9 @@ def _parse_persisted_revision(
"approval_subject_ref",
"payload_contract",
)
if any(getattr(expected, name) != getattr(envelope, name) for name in fields):
if envelope.state_kind not in {DOMAIN_ACTIVATION_PLAN_STATE_KIND, LEGACY_DOMAIN_ACTIVATION_STATE_KIND} or any(
getattr(expected, name) != getattr(envelope, name) for name in fields
):
raise DomainActivationPlanAdmissionError("persisted envelope does not match exact v1alpha2 activation material")
return revision

Expand All @@ -471,7 +476,7 @@ async def _current(
revision: DomainActivationRevisionV1Alpha2,
) -> DomainActivationRevisionV1Alpha2 | None:
head = await self.store.load_head(
state_kind=DOMAIN_ACTIVATION_STATE_KIND,
state_kind=DOMAIN_ACTIVATION_PLAN_STATE_KIND,
product_id=revision.plan.spec.product_id,
state_id=str(revision.activation_id),
)
Expand Down Expand Up @@ -669,10 +674,16 @@ async def reload(

activation_id = f"domain_activation:{canonical_hash([product_id, activation_key])[:32]}"
head = await self.store.load_head(
state_kind=DOMAIN_ACTIVATION_STATE_KIND,
state_kind=DOMAIN_ACTIVATION_PLAN_STATE_KIND,
product_id=product_id,
state_id=activation_id,
)
if head is None:
head = await self.store.load_head(
state_kind=LEGACY_DOMAIN_ACTIVATION_STATE_KIND,
product_id=product_id,
state_id=activation_id,
)
if head is None:
return None
envelope = await self.store.load_revision(head.revision_id, product_id=product_id)
Expand All @@ -699,6 +710,7 @@ async def reload(
"CommittedDomainActivationPlan",
"DomainActivationPlanAdmissionError",
"DomainActivationPlanAdmissionService",
"DOMAIN_ACTIVATION_PLAN_STATE_KIND",
"activation_commit_reference",
"prepare_activation_onboarding_handoff",
"validate_activation_commit_reference",
Expand Down
32 changes: 32 additions & 0 deletions ace/application/intelligence_builder.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,10 @@
IntelligenceModelDispositionV1,
IntelligenceModelProposalV1,
)
from ace.application.intelligence_builder_activation_contracts import (
BuilderActivationPlanArtifactV1,
BuilderActivationReceiptArtifactV1,
)
from ace.application.intelligence_builder_contracts import (
ONBOARDING_SESSION_REVISION_VERSION,
ConnectionEffect,
Expand Down Expand Up @@ -57,6 +61,8 @@
| IntelligenceModelProposalV1
| IntelligenceModelDispositionV1
| FirstBriefingPreviewV1
| BuilderActivationPlanArtifactV1
| BuilderActivationReceiptArtifactV1
)
OnboardingArtifactT = TypeVar(
"OnboardingArtifactT",
Expand All @@ -68,6 +74,8 @@
IntelligenceModelProposalV1,
IntelligenceModelDispositionV1,
FirstBriefingPreviewV1,
BuilderActivationPlanArtifactV1,
BuilderActivationReceiptArtifactV1,
)


Expand Down Expand Up @@ -216,6 +224,10 @@ def _artifact_material(artifact: OnboardingArtifact) -> tuple[str, str, datetime
return str(artifact.disposition_id), str(artifact.disposition_digest), artifact.approved_at
if isinstance(artifact, FirstBriefingPreviewV1):
return str(artifact.brief_id), str(artifact.brief_digest), artifact.generated_at
if isinstance(artifact, BuilderActivationPlanArtifactV1):
return str(artifact.artifact_id), str(artifact.artifact_digest), artifact.created_at
if isinstance(artifact, BuilderActivationReceiptArtifactV1):
return str(artifact.artifact_id), str(artifact.artifact_digest), artifact.activated_at
raise TypeError("unsupported onboarding artifact contract")


Expand All @@ -236,6 +248,10 @@ def _artifact_kind(artifact: OnboardingArtifact) -> OnboardingArtifactKind:
return OnboardingArtifactKind.INTELLIGENCE_MODEL_DISPOSITION
if isinstance(artifact, FirstBriefingPreviewV1):
return OnboardingArtifactKind.FIRST_BRIEFING_PREVIEW
if isinstance(artifact, BuilderActivationPlanArtifactV1):
return OnboardingArtifactKind.ACTIVATION_PLAN
if isinstance(artifact, BuilderActivationReceiptArtifactV1):
return OnboardingArtifactKind.ACTIVATION_RECEIPT
raise TypeError("unsupported onboarding artifact contract")


Expand Down Expand Up @@ -305,6 +321,10 @@ async def persist_artifact(
exact = IntelligenceModelDispositionV1.model_validate(artifact.model_dump(mode="python"))
elif isinstance(artifact, FirstBriefingPreviewV1):
exact = FirstBriefingPreviewV1.model_validate(artifact.model_dump(mode="python"))
elif isinstance(artifact, BuilderActivationPlanArtifactV1):
exact = BuilderActivationPlanArtifactV1.model_validate(artifact.model_dump(mode="python"))
elif isinstance(artifact, BuilderActivationReceiptArtifactV1):
exact = BuilderActivationReceiptArtifactV1.model_validate(artifact.model_dump(mode="python"))
else:
raise IntelligenceBuilderSessionError("unsupported onboarding artifact failed closed")
artifact_id, artifact_digest, occurred_at = _artifact_material(exact)
Expand Down Expand Up @@ -540,6 +560,18 @@ async def load_latest(
raise IntelligenceBuilderSessionError("onboarding session history lost exact chain continuity")
return revisions[-1]

async def reload_admission(
self,
revision: IntelligenceBuilderSessionRevisionV1,
) -> IntelligenceBuilderSessionAdmission:
"""Reopen one exact durable session revision and its append receipt."""

validated = IntelligenceBuilderSessionRevisionV1.model_validate(revision.model_dump(mode="python"))
admission = await self._replay(validated)
if admission is None:
raise IntelligenceBuilderSessionError("onboarding revision is not durably admitted")
return admission

async def start(
self,
*,
Expand Down
Loading