alter-runtime 0.3.1__tar.gz → 0.3.2__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (97) hide show
  1. {alter_runtime-0.3.1 → alter_runtime-0.3.2}/PKG-INFO +4 -4
  2. {alter_runtime-0.3.1 → alter_runtime-0.3.2}/README.md +3 -3
  3. {alter_runtime-0.3.1 → alter_runtime-0.3.2}/alter_runtime/atlas/ledger.py +1 -1
  4. {alter_runtime-0.3.1 → alter_runtime-0.3.2}/alter_runtime/daemon.py +2 -2
  5. {alter_runtime-0.3.1 → alter_runtime-0.3.2}/alter_runtime/sdk/__init__.py +3 -3
  6. {alter_runtime-0.3.1 → alter_runtime-0.3.2}/alter_runtime/sdk/client.py +3 -4
  7. {alter_runtime-0.3.1 → alter_runtime-0.3.2}/alter_runtime/services/launchd/com.alter.runtime.plist.in +4 -8
  8. {alter_runtime-0.3.1 → alter_runtime-0.3.2}/alter_runtime/subscribers/ceremony_echo.py +1 -1
  9. {alter_runtime-0.3.1 → alter_runtime-0.3.2}/alter_runtime/subscribers/ebpf.py +1 -2
  10. {alter_runtime-0.3.1 → alter_runtime-0.3.2}/docs/schemas/README.md +4 -4
  11. {alter_runtime-0.3.1 → alter_runtime-0.3.2}/pyproject.toml +2 -2
  12. {alter_runtime-0.3.1 → alter_runtime-0.3.2}/.gitignore +0 -0
  13. {alter_runtime-0.3.1 → alter_runtime-0.3.2}/LICENSE +0 -0
  14. {alter_runtime-0.3.1 → alter_runtime-0.3.2}/alter_runtime/__init__.py +0 -0
  15. {alter_runtime-0.3.1 → alter_runtime-0.3.2}/alter_runtime/adapters/__init__.py +0 -0
  16. {alter_runtime-0.3.1 → alter_runtime-0.3.2}/alter_runtime/adapters/claude_jsonl_watcher.py +0 -0
  17. {alter_runtime-0.3.1 → alter_runtime-0.3.2}/alter_runtime/adapters/git_watcher.py +0 -0
  18. {alter_runtime-0.3.1 → alter_runtime-0.3.2}/alter_runtime/adapters/household/__init__.py +0 -0
  19. {alter_runtime-0.3.1 → alter_runtime-0.3.2}/alter_runtime/adapters/household/_base.py +0 -0
  20. {alter_runtime-0.3.1 → alter_runtime-0.3.2}/alter_runtime/adapters/household/compost/__init__.py +0 -0
  21. {alter_runtime-0.3.1 → alter_runtime-0.3.2}/alter_runtime/adapters/household/compost/adapter.py +0 -0
  22. {alter_runtime-0.3.1 → alter_runtime-0.3.2}/alter_runtime/adapters/household/compost/storage.py +0 -0
  23. {alter_runtime-0.3.1 → alter_runtime-0.3.2}/alter_runtime/adapters/household/compost/tests/__init__.py +0 -0
  24. {alter_runtime-0.3.1 → alter_runtime-0.3.2}/alter_runtime/adapters/household/compost/tests/test_adapter.py +0 -0
  25. {alter_runtime-0.3.1 → alter_runtime-0.3.2}/alter_runtime/adapters/household/compost/tests/test_storage.py +0 -0
  26. {alter_runtime-0.3.1 → alter_runtime-0.3.2}/alter_runtime/adapters/household/compost/tests/test_traits.py +0 -0
  27. {alter_runtime-0.3.1 → alter_runtime-0.3.2}/alter_runtime/adapters/household/compost/traits.py +0 -0
  28. {alter_runtime-0.3.1 → alter_runtime-0.3.2}/alter_runtime/adapters/household/self_hoster/__init__.py +0 -0
  29. {alter_runtime-0.3.1 → alter_runtime-0.3.2}/alter_runtime/adapters/household/self_hoster/adapter.py +0 -0
  30. {alter_runtime-0.3.1 → alter_runtime-0.3.2}/alter_runtime/adapters/household/self_hoster/storage.py +0 -0
  31. {alter_runtime-0.3.1 → alter_runtime-0.3.2}/alter_runtime/adapters/household/self_hoster/tests/__init__.py +0 -0
  32. {alter_runtime-0.3.1 → alter_runtime-0.3.2}/alter_runtime/adapters/household/self_hoster/tests/test_adapter.py +0 -0
  33. {alter_runtime-0.3.1 → alter_runtime-0.3.2}/alter_runtime/adapters/household/self_hoster/tests/test_storage.py +0 -0
  34. {alter_runtime-0.3.1 → alter_runtime-0.3.2}/alter_runtime/adapters/household/self_hoster/tests/test_traits.py +0 -0
  35. {alter_runtime-0.3.1 → alter_runtime-0.3.2}/alter_runtime/adapters/household/self_hoster/traits.py +0 -0
  36. {alter_runtime-0.3.1 → alter_runtime-0.3.2}/alter_runtime/adapters/household/tapo_ecosystem/__init__.py +0 -0
  37. {alter_runtime-0.3.1 → alter_runtime-0.3.2}/alter_runtime/adapters/household/tapo_ecosystem/adapter.py +0 -0
  38. {alter_runtime-0.3.1 → alter_runtime-0.3.2}/alter_runtime/adapters/household/tapo_ecosystem/storage.py +0 -0
  39. {alter_runtime-0.3.1 → alter_runtime-0.3.2}/alter_runtime/adapters/household/tapo_ecosystem/tests/__init__.py +0 -0
  40. {alter_runtime-0.3.1 → alter_runtime-0.3.2}/alter_runtime/adapters/household/tapo_ecosystem/tests/test_adapter.py +0 -0
  41. {alter_runtime-0.3.1 → alter_runtime-0.3.2}/alter_runtime/adapters/household/tapo_ecosystem/tests/test_storage.py +0 -0
  42. {alter_runtime-0.3.1 → alter_runtime-0.3.2}/alter_runtime/adapters/household/tapo_ecosystem/tests/test_traits.py +0 -0
  43. {alter_runtime-0.3.1 → alter_runtime-0.3.2}/alter_runtime/adapters/household/tapo_ecosystem/traits.py +0 -0
  44. {alter_runtime-0.3.1 → alter_runtime-0.3.2}/alter_runtime/adapters/household/workshop_tools/__init__.py +0 -0
  45. {alter_runtime-0.3.1 → alter_runtime-0.3.2}/alter_runtime/adapters/household/workshop_tools/adapter.py +0 -0
  46. {alter_runtime-0.3.1 → alter_runtime-0.3.2}/alter_runtime/adapters/household/workshop_tools/storage.py +0 -0
  47. {alter_runtime-0.3.1 → alter_runtime-0.3.2}/alter_runtime/adapters/household/workshop_tools/tests/__init__.py +0 -0
  48. {alter_runtime-0.3.1 → alter_runtime-0.3.2}/alter_runtime/adapters/household/workshop_tools/tests/test_adapter.py +0 -0
  49. {alter_runtime-0.3.1 → alter_runtime-0.3.2}/alter_runtime/adapters/household/workshop_tools/tests/test_storage.py +0 -0
  50. {alter_runtime-0.3.1 → alter_runtime-0.3.2}/alter_runtime/adapters/household/workshop_tools/tests/test_traits.py +0 -0
  51. {alter_runtime-0.3.1 → alter_runtime-0.3.2}/alter_runtime/adapters/household/workshop_tools/traits.py +0 -0
  52. {alter_runtime-0.3.1 → alter_runtime-0.3.2}/alter_runtime/adapters/worktree_watcher.py +0 -0
  53. {alter_runtime-0.3.1 → alter_runtime-0.3.2}/alter_runtime/atlas/__init__.py +0 -0
  54. {alter_runtime-0.3.1 → alter_runtime-0.3.2}/alter_runtime/atlas/base.py +0 -0
  55. {alter_runtime-0.3.1 → alter_runtime-0.3.2}/alter_runtime/atlas/observations.py +0 -0
  56. {alter_runtime-0.3.1 → alter_runtime-0.3.2}/alter_runtime/atlas/schema.py +0 -0
  57. {alter_runtime-0.3.1 → alter_runtime-0.3.2}/alter_runtime/cap_cache.py +0 -0
  58. {alter_runtime-0.3.1 → alter_runtime-0.3.2}/alter_runtime/cli.py +0 -0
  59. {alter_runtime-0.3.1 → alter_runtime-0.3.2}/alter_runtime/clients/__init__.py +0 -0
  60. {alter_runtime-0.3.1 → alter_runtime-0.3.2}/alter_runtime/clients/token_usage_client.py +0 -0
  61. {alter_runtime-0.3.1 → alter_runtime-0.3.2}/alter_runtime/config.py +0 -0
  62. {alter_runtime-0.3.1 → alter_runtime-0.3.2}/alter_runtime/consent.py +0 -0
  63. {alter_runtime-0.3.1 → alter_runtime-0.3.2}/alter_runtime/floor_loop.py +0 -0
  64. {alter_runtime-0.3.1 → alter_runtime-0.3.2}/alter_runtime/floor_preflight.py +0 -0
  65. {alter_runtime-0.3.1 → alter_runtime-0.3.2}/alter_runtime/http_auth.py +0 -0
  66. {alter_runtime-0.3.1 → alter_runtime-0.3.2}/alter_runtime/notifiers/__init__.py +0 -0
  67. {alter_runtime-0.3.1 → alter_runtime-0.3.2}/alter_runtime/notifiers/desktop.py +0 -0
  68. {alter_runtime-0.3.1 → alter_runtime-0.3.2}/alter_runtime/service_install.py +0 -0
  69. {alter_runtime-0.3.1 → alter_runtime-0.3.2}/alter_runtime/services/__init__.py +0 -0
  70. {alter_runtime-0.3.1 → alter_runtime-0.3.2}/alter_runtime/services/systemd/alter-runtime.service.in +0 -0
  71. {alter_runtime-0.3.1 → alter_runtime-0.3.2}/alter_runtime/services/systemd/cf-access-env.conf.in +0 -0
  72. {alter_runtime-0.3.1 → alter_runtime-0.3.2}/alter_runtime/sockets/__init__.py +0 -0
  73. {alter_runtime-0.3.1 → alter_runtime-0.3.2}/alter_runtime/sockets/dbus.py +0 -0
  74. {alter_runtime-0.3.1 → alter_runtime-0.3.2}/alter_runtime/sockets/unix.py +0 -0
  75. {alter_runtime-0.3.1 → alter_runtime-0.3.2}/alter_runtime/subscribers/__init__.py +0 -0
  76. {alter_runtime-0.3.1 → alter_runtime-0.3.2}/alter_runtime/subscribers/active_sessions_cron_emitter.py +0 -0
  77. {alter_runtime-0.3.1 → alter_runtime-0.3.2}/alter_runtime/subscribers/active_sessions_do_publisher.py +0 -0
  78. {alter_runtime-0.3.1 → alter_runtime-0.3.2}/alter_runtime/subscribers/active_sessions_gc.py +0 -0
  79. {alter_runtime-0.3.1 → alter_runtime-0.3.2}/alter_runtime/subscribers/active_sessions_writer.py +0 -0
  80. {alter_runtime-0.3.1 → alter_runtime-0.3.2}/alter_runtime/subscribers/adapters_writer.py +0 -0
  81. {alter_runtime-0.3.1 → alter_runtime-0.3.2}/alter_runtime/subscribers/agent_frames.py +0 -0
  82. {alter_runtime-0.3.1 → alter_runtime-0.3.2}/alter_runtime/subscribers/bus.py +0 -0
  83. {alter_runtime-0.3.1 → alter_runtime-0.3.2}/alter_runtime/subscribers/cache_writer.py +0 -0
  84. {alter_runtime-0.3.1 → alter_runtime-0.3.2}/alter_runtime/subscribers/do_sse.py +0 -0
  85. {alter_runtime-0.3.1 → alter_runtime-0.3.2}/alter_runtime/subscribers/inbox_writer.py +0 -0
  86. {alter_runtime-0.3.1 → alter_runtime-0.3.2}/alter_runtime/subscribers/mcp_fallback.py +0 -0
  87. {alter_runtime-0.3.1 → alter_runtime-0.3.2}/alter_runtime/subscribers/presence_writer.py +0 -0
  88. {alter_runtime-0.3.1 → alter_runtime-0.3.2}/alter_runtime/subscribers/session_presence.py +0 -0
  89. {alter_runtime-0.3.1 → alter_runtime-0.3.2}/alter_runtime/subscribers/sse.py +0 -0
  90. {alter_runtime-0.3.1 → alter_runtime-0.3.2}/alter_runtime/subscribers/weave_intent_writer.py +0 -0
  91. {alter_runtime-0.3.1 → alter_runtime-0.3.2}/alter_runtime/update_loop.py +0 -0
  92. {alter_runtime-0.3.1 → alter_runtime-0.3.2}/alter_runtime/weave/__init__.py +0 -0
  93. {alter_runtime-0.3.1 → alter_runtime-0.3.2}/alter_runtime/weave/resolver.py +0 -0
  94. {alter_runtime-0.3.1 → alter_runtime-0.3.2}/examples/awesomewm/README.md +0 -0
  95. {alter_runtime-0.3.1 → alter_runtime-0.3.2}/examples/waybar/README.md +0 -0
  96. {alter_runtime-0.3.1 → alter_runtime-0.3.2}/pypi-truealter/README.md +0 -0
  97. {alter_runtime-0.3.1 → alter_runtime-0.3.2}/pypi-truealter/pyproject.toml +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: alter-runtime
3
- Version: 0.3.1
3
+ Version: 0.3.2
4
4
  Summary: ~Alter Identity Runtime - local sovereign daemon for the continuous identity field. Subscribes to per-~handle Cloudflare Durable Objects, exposes Unix socket + D-Bus + CLI surfaces, falls back gracefully to direct MCP polling.
5
5
  Project-URL: Homepage, https://truealter.com
6
6
  Project-URL: Documentation, https://truealter.com/docs/alter-runtime
@@ -116,7 +116,7 @@ filing a public issue. Non-security bugs and feature requests: email
116
116
  | 2 | 2b - Subscribers, Unix socket, D-Bus, git watcher | Shipped |
117
117
  | 2 | 2c - systemd + launchd service units | Shipped |
118
118
  | 2 | 2d - First pixel: CC hook + scripts upgrade | Shipped |
119
- | 2 | 2e - eBPF subscriber (Patent M, reference impl in `alter-ebpf`) | Shipped |
119
+ | 2 | 2e - eBPF subscriber (reference impl in `alter-ebpf`) | Shipped |
120
120
  | 3 | 3a - Cross-platform tray surfaces | Planned |
121
121
  | 3 | 3b - Windows Service + `pam_alter` stub | Planned |
122
122
  | 3 | 3c - PyPI release CI + signed binaries | Planned |
@@ -183,7 +183,7 @@ alter-runtime stop
183
183
  - Git commits, branch switches, pushes (via `watchdog` on `.git/refs/heads/`)
184
184
  - CC hook events (forwarded from `.claude/hooks/*.sh`)
185
185
  - Shell command invocations (opt-in)
186
- - eBPF kernel attestations (shipped; reference impl in `alter-ebpf`, Patent M)
186
+ - eBPF kernel attestations (shipped; reference impl in `alter-ebpf`)
187
187
 
188
188
  5. **Maintains a local cache** of your last-known-good field state so the first-paint
189
189
  tilde warmth renders in <1 second, even offline. Per IFA's Five OS-Native Properties,
@@ -203,7 +203,7 @@ alter-runtime/
203
203
  │ ├── cli.py # argparse entrypoint: init|start|stop|status|query|ingest|daemon
204
204
  │ ├── sdk/
205
205
  │ │ ├── __init__.py
206
- │ │ └── client.py # AlterClient (lifted from backend/openclaw-skill)
206
+ │ │ └── client.py # AlterClient (async identity MCP client)
207
207
  │ ├── subscribers/ # (Wave 2)
208
208
  │ │ ├── do_sse.py # primary - subscribes to handle-alter DO SSE
209
209
  │ │ └── mcp_fallback.py # fallback - polls api.truealter.com/api/v1/mcp
@@ -48,7 +48,7 @@ filing a public issue. Non-security bugs and feature requests: email
48
48
  | 2 | 2b - Subscribers, Unix socket, D-Bus, git watcher | Shipped |
49
49
  | 2 | 2c - systemd + launchd service units | Shipped |
50
50
  | 2 | 2d - First pixel: CC hook + scripts upgrade | Shipped |
51
- | 2 | 2e - eBPF subscriber (Patent M, reference impl in `alter-ebpf`) | Shipped |
51
+ | 2 | 2e - eBPF subscriber (reference impl in `alter-ebpf`) | Shipped |
52
52
  | 3 | 3a - Cross-platform tray surfaces | Planned |
53
53
  | 3 | 3b - Windows Service + `pam_alter` stub | Planned |
54
54
  | 3 | 3c - PyPI release CI + signed binaries | Planned |
@@ -115,7 +115,7 @@ alter-runtime stop
115
115
  - Git commits, branch switches, pushes (via `watchdog` on `.git/refs/heads/`)
116
116
  - CC hook events (forwarded from `.claude/hooks/*.sh`)
117
117
  - Shell command invocations (opt-in)
118
- - eBPF kernel attestations (shipped; reference impl in `alter-ebpf`, Patent M)
118
+ - eBPF kernel attestations (shipped; reference impl in `alter-ebpf`)
119
119
 
120
120
  5. **Maintains a local cache** of your last-known-good field state so the first-paint
121
121
  tilde warmth renders in <1 second, even offline. Per IFA's Five OS-Native Properties,
@@ -135,7 +135,7 @@ alter-runtime/
135
135
  │ ├── cli.py # argparse entrypoint: init|start|stop|status|query|ingest|daemon
136
136
  │ ├── sdk/
137
137
  │ │ ├── __init__.py
138
- │ │ └── client.py # AlterClient (lifted from backend/openclaw-skill)
138
+ │ │ └── client.py # AlterClient (async identity MCP client)
139
139
  │ ├── subscribers/ # (Wave 2)
140
140
  │ │ ├── do_sse.py # primary - subscribes to handle-alter DO SSE
141
141
  │ │ └── mcp_fallback.py # fallback - polls api.truealter.com/api/v1/mcp
@@ -11,7 +11,7 @@ Honesty clause - this ledger is a SOFT SIGNAL, not a cryptographic audit.
11
11
  Per substrate spec §4.3: the egress-capable parent daemon writes this ledger.
12
12
  When the parent daemon is the attacker, the ledger is an honest-witness weakness
13
13
  - the daemon can simply omit or rewrite entries. Meaningful external auditing
14
- arrives when ``alter-ebpf`` (Patent M) ships on-user-device and can witness
14
+ arrives when ``alter-ebpf`` ships on-user-device and can witness
15
15
  ``bprm_check_security`` + network syscalls sourced from the daemon UID from
16
16
  outside the daemon's control boundary.
17
17
 
@@ -373,7 +373,7 @@ async def run_daemon(config: DaemonConfig | None = None) -> None:
373
373
  # state" file with a 72 h expiry. Shell-greeting consumers
374
374
  # (alter-cli `alter room`, future menu greeting) read that
375
375
  # file and render the echo iff still within the window.
376
- # Per proposed-D-CUST-1 surface 21 (alter-internal #140).
376
+ # Per proposed-D-CUST-1 surface 21.
377
377
  ceremony = CeremonyEchoWriter(config, session)
378
378
  supervisor.register(ceremony)
379
379
  event_bus.subscribe("identity.frame", ceremony.handle_raw_frame)
@@ -484,7 +484,7 @@ async def run_daemon(config: DaemonConfig | None = None) -> None:
484
484
 
485
485
  supervisor.register(ClaudeJsonlWatcher(config, event_bus))
486
486
 
487
- # --- Kernel attestation (Wave 5b, Patent M) -----------------------
487
+ # --- Kernel attestation (Wave 5b) ---------------------------------
488
488
  # The eBPF subscriber spawns the Rust ``alter-ebpf`` loader and
489
489
  # republishes its exec stream onto ``kernel.attest.exec`` and
490
490
  # ``local.signal``. It silently disables itself on hosts where the
@@ -1,8 +1,8 @@
1
1
  """alter_runtime.sdk - Python SDK for ALTER's identity MCP server.
2
2
 
3
- Exports ``AlterClient``, the async HTTP client lifted from
4
- ``backend/openclaw-skill/alter_bot/mcp_client.py`` and renamed for the
5
- distribution layer (D-RT5 - the PyPI package is ``alter-runtime``, not
3
+ Exports ``AlterClient``, the async HTTP client for ALTER's identity MCP
4
+ server, packaged for the distribution layer (D-RT5 - the PyPI package is
5
+ ``alter-runtime``, not
6
6
  ``alter-identity``, because the TypeScript npm package ``@alter/identity``
7
7
  already claims that name).
8
8
  """
@@ -1,10 +1,9 @@
1
1
  """AlterClient - async JSON-RPC 2.0 client for ALTER's identity MCP server.
2
2
 
3
- Ported from ``backend/openclaw-skill/alter_bot/mcp_client.py`` with two changes:
3
+ Adapted from ALTER's internal MCP client with two changes:
4
4
 
5
- 1. **Class renamed** from ``AlterMCPClient`` to ``AlterClient`` to match the
6
- public SDK surface described in the plan and D-RT5. The original class
7
- remains in the backend for internal tooling.
5
+ 1. **Class renamed** to ``AlterClient`` to match the public SDK surface
6
+ described in the plan and D-RT5.
8
7
 
9
8
  2. **Dual-source discovery** - ``AlterClient.auto_discover()`` first tries
10
9
  to reach the local daemon's Unix socket (once Wave 2 ships it) and falls
@@ -65,14 +65,10 @@
65
65
  and LowPriorityIO further drops disk-IO priority so the daemon never
66
66
  starves a foreground IDE / build that the operator is actively using.
67
67
 
68
- Pentest 2026-04-26 (MEDIUM) follow-up: ship a sandbox-exec profile
69
- next to this template that constrains filesystem writes to
70
- ~/Library/Application Support/alter, ~/Library/Caches/alter and
71
- ~/Library/Logs/alter-runtime, denies all network listening sockets
72
- except the Unix socket under Application Support, and uses
73
- ``allow-with-prompt`` for outbound HTTPS to api.truealter.com only.
74
- Tracked at alter-runtime#sandbox-profile (TODO; out of scope for
75
- this PR — the plist itself is the security floor pre-sandbox). -->
68
+ TODO(sandbox-profile): ship a sandbox-exec profile alongside this
69
+ template to further constrain the daemon's runtime surface. Tracked
70
+ at alter-runtime#sandbox-profile out of scope here; the plist is
71
+ the pre-sandbox security floor. -->
76
72
  <key>ProcessType</key>
77
73
  <string>Background</string>
78
74
  <key>LowPriorityIO</key>
@@ -28,7 +28,7 @@ daemon supervisor. Like InboxWriter, the supervisor will restart on
28
28
  :meth:`run` exceptions but :meth:`handle_event` only ever logs and returns.
29
29
 
30
30
  Refs:
31
- * proposed-D-CUST-1 (alter-internal #140) - surface 21 (ceremony echo)
31
+ * proposed-D-CUST-1 - surface 21 (ceremony echo)
32
32
  * embedded-messenger/05-design-synthesis.md - content_type taxonomy
33
33
  """
34
34
 
@@ -3,8 +3,7 @@
3
3
  The Rust ``alter-ebpf`` binary (subcrate ``packages/alter-ebpf``) is the
4
4
  userspace half of a BPF LSM program that observes ``bprm_check_security``
5
5
  and emits one ``alter1``-shaped JSON envelope per line to stdout for every
6
- exec on a uid the operator opted in to. Patent M (filed 2026) covers this
7
- kernel-adjacent attestation surface.
6
+ exec on a uid the operator opted in to.
8
7
 
9
8
  This subscriber is the bridge between that binary and the in-process
10
9
  :class:`EventBus`. It:
@@ -19,7 +19,7 @@ Canonical schemas for files the daemon writes under `~/.local/share/alter-runtim
19
19
  - **Field naming** - `snake_case` throughout.
20
20
  - **Timestamps** - ISO 8601 UTC with `Z` suffix (e.g. `2026-05-12T14:23:00Z`).
21
21
  - **Identity** - `handle` matches `^~[a-z0-9_-]+$`.
22
- - **Provenance** - every record carries `provenance_class` from the canonical 6-value enum in `backend/app/services/consent/provenance.py`. D-OBS-1 / D-ATLAS-1 stream classes (e.g. `passive_local_document`) are valid where the StreamProvenanceClass enum at `backend/app/services/consent/gateway.py` permits.
22
+ - **Provenance** - every record carries `provenance_class` from the canonical 6-value provenance enum. D-OBS-1 / D-ATLAS-1 stream classes (e.g. `passive_local_document`) are valid where the StreamProvenanceClass enum at `the consent gateway` permits.
23
23
  - **Consent** - every record carries `consent_tier` ∈ {1, 2, 3, 4} per D109 (`L1_MANUAL` / `L2_CATEGORY` / `L3_MANAGED` / `L4_AUTONOMOUS`).
24
24
  - **Append-only** - never edit or delete records. Amend forward via `supersedes_id` chain when supported.
25
25
  - **Versioning** - `version` is the producer-assigned monotonic dedup key; readers ignore older `version` values for the same `id`.
@@ -29,15 +29,15 @@ Canonical schemas for files the daemon writes under `~/.local/share/alter-runtim
29
29
 
30
30
  ## Wire envelope alignment
31
31
 
32
- JSONL records mirror what arrives on the per-handle Durable Object SSE stream (`mcp.truealter.com/events/{handle}/stream`). The DO event envelope is defined at `cloudflare/workers/shared/src/types.ts`; the backend ingest envelope is at `backend/app/services/identity_events/producer.py:96–146`. When local clients (alter-cli, widget, Android) originate a state change, they emit an `IngestEnvelope` to `/api/v1/org-alter/ingest`; the DO fans it back out on the SSE stream; the daemon writes it to the appropriate JSONL.
32
+ JSONL records mirror what arrives on the per-handle Durable Object SSE stream (`mcp.truealter.com/events/{handle}/stream`). The DO event envelope is defined at `the DO worker shared types`; the backend ingest envelope is defined by the identity-events producer. When local clients (alter-cli, widget, Android) originate a state change, they emit an `IngestEnvelope` to `/api/v1/org-alter/ingest`; the DO fans it back out on the SSE stream; the daemon writes it to the appropriate JSONL.
33
33
 
34
34
  ## SignalKind extensions
35
35
 
36
- `cloudflare/workers/shared/src/types.ts` `SignalKind` union must include `presence_set`, `session_started`, `session_heartbeat`, `session_ended`, `adapter_status` for the DO to route these events.
36
+ `the DO worker shared types` `SignalKind` union must include `presence_set`, `session_started`, `session_heartbeat`, `session_ended`, `adapter_status` for the DO to route these events.
37
37
 
38
38
  ## Identity-as-Inference compliance
39
39
 
40
- Every record passes the consent gateway at `backend/app/services/consent/gateway.py` against its `(QueryCategory × StreamProvenanceClass)` tuple. The five AGAINST-clauses (Session 51, 2026-04-13) apply:
40
+ Every record passes the consent gateway at `the consent gateway` against its `(QueryCategory × StreamProvenanceClass)` tuple. The five AGAINST-clauses (Session 51, 2026-04-13) apply:
41
41
 
42
42
  1. Active state changes (`presence.jsonl`, `session_started`) → `provenance_class=active_declaration` or `active_composition`; server-side projection OK.
43
43
  2. Per-record `provenance_class` declared. No record lands without it.
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "alter-runtime"
7
- version = "0.3.1"
7
+ version = "0.3.2"
8
8
  description = "~Alter Identity Runtime - local sovereign daemon for the continuous identity field. Subscribes to per-~handle Cloudflare Durable Objects, exposes Unix socket + D-Bus + CLI surfaces, falls back gracefully to direct MCP polling."
9
9
  readme = "README.md"
10
10
  license = { text = "Apache-2.0" }
@@ -85,7 +85,7 @@ slack = [
85
85
  "slack-bolt>=1.18.0",
86
86
  ]
87
87
  ebpf = [
88
- # Wave 5+ - kernel-adjacent attestation per Patent M. The Rust subcrate
88
+ # Wave 5+ - kernel-adjacent attestation. The Rust subcrate
89
89
  # will be called out to from the Python core when this extra is installed.
90
90
  "bcc>=0.29.0; sys_platform == 'linux'",
91
91
  ]
File without changes
File without changes