Skip to main content

Event log library with Lamport clocks and systematic error tracking

Project description

spec-kitty-events

Canonical event contracts for Spec Kitty mission state, mission runtime, conformance, and replay.

Version: 3.0.0 | Cutover Contract: 3.0.0 | Python: >=3.10

What Changed In 3.0.0

3.0.0 is a breaking mission-contract cutover release.

  • Mission identity fields are canonicalized to mission_slug, mission_number, and mission_type.
  • Event envelopes require build_id and use the cutover signal schema_version="3.0.0".
  • Live ingestion is fail-closed. There are no runtime compatibility aliases for legacy mission-domain fields.
  • Legacy mission-domain keys and names such as feature_slug, feature_number, mission_key, FeatureCreated, and FeatureClosed are rejected on live paths.

See COMPATIBILITY.md for the exact fail-closed rollout policy.

Installation

From PyPI:

pip install "spec-kitty-events>=3.0.0,<4.0.0"

With conformance validation support:

pip install "spec-kitty-events[conformance]>=3.0.0,<4.0.0"

Development install:

git clone https://github.com/Priivacy-ai/spec-kitty-events.git
cd spec-kitty-events
pip install -e ".[dev,conformance]"

Contract Highlights

  • Event is the canonical top-level envelope.
  • build_id identifies the build that emitted the envelope.
  • node_id identifies the emitting node within that build.
  • schema_version is the on-wire compatibility signal. Live envelopes must use 3.0.0 for this release.
  • StatusTransitionPayload uses mission_slug for mission identity.
  • Mission catalog payloads use mission_slug, mission_number, and mission_type.
  • Mission runtime payloads use mission_type; they do not accept mission_key.

Quick Start

Emit a Canonical Event Envelope

import uuid
from datetime import datetime

from spec_kitty_events import Event

event = Event(
    event_id="01ARZ3NDEKTSV4RRFFQ69G5FAV",
    event_type="WPStatusChanged",
    aggregate_id="mission/WP01",
    payload={
        "mission_slug": "mission-001",
        "wp_id": "WP01",
        "from_lane": "planned",
        "to_lane": "claimed",
        "actor": "ci-bot",
        "execution_mode": "worktree",
    },
    timestamp=datetime.now(),
    build_id="build-2026-04-05",
    node_id="runner-01",
    lamport_clock=1,
    project_uuid=uuid.uuid4(),
    correlation_id="01ARZ3NDEKTSV4RRFFQ69G5FAV",
    schema_version="3.0.0",
)

Validate a Payload Against the Canonical Contract

from spec_kitty_events.conformance import validate_event

payload = {
    "mission_slug": "mission-001",
    "wp_id": "WP01",
    "from_lane": "planned",
    "to_lane": "claimed",
    "actor": "ci-bot",
    "execution_mode": "worktree",
}

result = validate_event(payload, "WPStatusChanged")
assert result.valid

Validate a Full Envelope With Fail-Closed Cutover Checks

from spec_kitty_events.conformance import validate_event

envelope = {
    "event_id": "01ARZ3NDEKTSV4RRFFQ69G5FAV",
    "event_type": "WPStatusChanged",
    "aggregate_id": "mission/WP01",
    "timestamp": "2026-04-05T12:00:00Z",
    "build_id": "build-2026-04-05",
    "node_id": "runner-01",
    "lamport_clock": 1,
    "project_uuid": "12345678-1234-5678-1234-567812345678",
    "correlation_id": "01ARZ3NDEKTSV4RRFFQ69G5FAV",
    "schema_version": "3.0.0",
    "payload": {
        "mission_slug": "mission-001",
        "wp_id": "WP01",
        "from_lane": "planned",
        "to_lane": "claimed",
        "actor": "ci-bot",
        "execution_mode": "worktree",
    },
}

result = validate_event(envelope, "WPStatusChanged", strict=True)
assert result.valid

Schemas And Conformance

  • Committed JSON Schemas are generated from the canonical Pydantic models.
  • Replay streams and golden reducer outputs ship in the package.
  • Conformance validation combines Pydantic validation, committed JSON Schemas, and cutover artifact checks.

Run the drift and conformance gates:

python -m spec_kitty_events.schemas.generate --check
pytest --pyargs spec_kitty_events.conformance -v

Public Guidance

  • Use mission_slug, mission_number, and mission_type in public mission-domain payloads.
  • Use build_id to identify the emitting build and node_id to identify the emitting node.
  • Do not rely on runtime translation of legacy mission-domain fields.
  • Use offline rewrite or migration jobs if you need to transform historical pre-cutover data.

Versioning

This package now publishes the breaking cutover release as 3.0.0.

  • 2.x documentation and mixed-field operation are no longer the public contract.
  • 3.x consumers should treat the cutover artifact and committed fixtures as the authoritative compatibility surface.

License

All rights reserved. This repository is owned by Priivacy AI.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

spec_kitty_events-3.2.0.tar.gz (158.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

spec_kitty_events-3.2.0-py3-none-any.whl (239.9 kB view details)

Uploaded Python 3

File details

Details for the file spec_kitty_events-3.2.0.tar.gz.

File metadata

  • Download URL: spec_kitty_events-3.2.0.tar.gz
  • Upload date:
  • Size: 158.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for spec_kitty_events-3.2.0.tar.gz
Algorithm Hash digest
SHA256 f7bdf0bb941815ce56eee94ecd649d9ddf998aa164dd40cb9c777ac06b13cf6e
MD5 6ba1785d1f34ff4184926e7f3b368451
BLAKE2b-256 48b76f854c59d15d5ae6e87920e01d7a9d320930fafdc54e7804b45629f82ad6

See more details on using hashes here.

Provenance

The following attestation bundles were made for spec_kitty_events-3.2.0.tar.gz:

Publisher: publish-pypi.yml on Priivacy-ai/spec-kitty-events

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file spec_kitty_events-3.2.0-py3-none-any.whl.

File metadata

File hashes

Hashes for spec_kitty_events-3.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 6a7964b4c136b2acc21c4dbdf70833abc9060ee51ef6fa4b2059c2e781933591
MD5 9b6159984a3ed5a45ed2d1d5309bb508
BLAKE2b-256 3f51ea3425ac163b487132020441d94f1bee49008141950b23f7efe2acb8137c

See more details on using hashes here.

Provenance

The following attestation bundles were made for spec_kitty_events-3.2.0-py3-none-any.whl:

Publisher: publish-pypi.yml on Priivacy-ai/spec-kitty-events

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page