alter-runtime 0.3.0__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.0 → alter_runtime-0.3.2}/PKG-INFO +6 -6
  2. {alter_runtime-0.3.0 → alter_runtime-0.3.2}/README.md +3 -3
  3. {alter_runtime-0.3.0 → alter_runtime-0.3.2}/alter_runtime/__init__.py +1 -1
  4. {alter_runtime-0.3.0 → alter_runtime-0.3.2}/alter_runtime/adapters/claude_jsonl_watcher.py +1 -1
  5. {alter_runtime-0.3.0 → alter_runtime-0.3.2}/alter_runtime/adapters/household/__init__.py +1 -1
  6. {alter_runtime-0.3.0 → alter_runtime-0.3.2}/alter_runtime/adapters/household/_base.py +1 -1
  7. {alter_runtime-0.3.0 → alter_runtime-0.3.2}/alter_runtime/adapters/household/compost/__init__.py +1 -1
  8. {alter_runtime-0.3.0 → alter_runtime-0.3.2}/alter_runtime/adapters/household/workshop_tools/__init__.py +2 -2
  9. {alter_runtime-0.3.0 → alter_runtime-0.3.2}/alter_runtime/atlas/__init__.py +1 -2
  10. {alter_runtime-0.3.0 → alter_runtime-0.3.2}/alter_runtime/atlas/ledger.py +1 -1
  11. {alter_runtime-0.3.0 → alter_runtime-0.3.2}/alter_runtime/cli.py +1 -2
  12. {alter_runtime-0.3.0 → alter_runtime-0.3.2}/alter_runtime/daemon.py +2 -2
  13. {alter_runtime-0.3.0 → alter_runtime-0.3.2}/alter_runtime/sdk/__init__.py +3 -3
  14. {alter_runtime-0.3.0 → alter_runtime-0.3.2}/alter_runtime/sdk/client.py +4 -5
  15. {alter_runtime-0.3.0 → alter_runtime-0.3.2}/alter_runtime/services/launchd/com.alter.runtime.plist.in +4 -8
  16. {alter_runtime-0.3.0 → alter_runtime-0.3.2}/alter_runtime/services/systemd/alter-runtime.service.in +1 -1
  17. {alter_runtime-0.3.0 → alter_runtime-0.3.2}/alter_runtime/subscribers/ceremony_echo.py +1 -2
  18. {alter_runtime-0.3.0 → alter_runtime-0.3.2}/alter_runtime/subscribers/ebpf.py +1 -2
  19. {alter_runtime-0.3.0 → alter_runtime-0.3.2}/docs/schemas/README.md +4 -4
  20. {alter_runtime-0.3.0 → alter_runtime-0.3.2}/examples/awesomewm/README.md +6 -6
  21. {alter_runtime-0.3.0 → alter_runtime-0.3.2}/pyproject.toml +5 -4
  22. {alter_runtime-0.3.0 → alter_runtime-0.3.2}/.gitignore +0 -0
  23. {alter_runtime-0.3.0 → alter_runtime-0.3.2}/LICENSE +0 -0
  24. {alter_runtime-0.3.0 → alter_runtime-0.3.2}/alter_runtime/adapters/__init__.py +0 -0
  25. {alter_runtime-0.3.0 → alter_runtime-0.3.2}/alter_runtime/adapters/git_watcher.py +0 -0
  26. {alter_runtime-0.3.0 → alter_runtime-0.3.2}/alter_runtime/adapters/household/compost/adapter.py +0 -0
  27. {alter_runtime-0.3.0 → alter_runtime-0.3.2}/alter_runtime/adapters/household/compost/storage.py +0 -0
  28. {alter_runtime-0.3.0 → alter_runtime-0.3.2}/alter_runtime/adapters/household/compost/tests/__init__.py +0 -0
  29. {alter_runtime-0.3.0 → alter_runtime-0.3.2}/alter_runtime/adapters/household/compost/tests/test_adapter.py +0 -0
  30. {alter_runtime-0.3.0 → alter_runtime-0.3.2}/alter_runtime/adapters/household/compost/tests/test_storage.py +0 -0
  31. {alter_runtime-0.3.0 → alter_runtime-0.3.2}/alter_runtime/adapters/household/compost/tests/test_traits.py +0 -0
  32. {alter_runtime-0.3.0 → alter_runtime-0.3.2}/alter_runtime/adapters/household/compost/traits.py +0 -0
  33. {alter_runtime-0.3.0 → alter_runtime-0.3.2}/alter_runtime/adapters/household/self_hoster/__init__.py +0 -0
  34. {alter_runtime-0.3.0 → alter_runtime-0.3.2}/alter_runtime/adapters/household/self_hoster/adapter.py +0 -0
  35. {alter_runtime-0.3.0 → alter_runtime-0.3.2}/alter_runtime/adapters/household/self_hoster/storage.py +0 -0
  36. {alter_runtime-0.3.0 → alter_runtime-0.3.2}/alter_runtime/adapters/household/self_hoster/tests/__init__.py +0 -0
  37. {alter_runtime-0.3.0 → alter_runtime-0.3.2}/alter_runtime/adapters/household/self_hoster/tests/test_adapter.py +0 -0
  38. {alter_runtime-0.3.0 → alter_runtime-0.3.2}/alter_runtime/adapters/household/self_hoster/tests/test_storage.py +0 -0
  39. {alter_runtime-0.3.0 → alter_runtime-0.3.2}/alter_runtime/adapters/household/self_hoster/tests/test_traits.py +0 -0
  40. {alter_runtime-0.3.0 → alter_runtime-0.3.2}/alter_runtime/adapters/household/self_hoster/traits.py +0 -0
  41. {alter_runtime-0.3.0 → alter_runtime-0.3.2}/alter_runtime/adapters/household/tapo_ecosystem/__init__.py +0 -0
  42. {alter_runtime-0.3.0 → alter_runtime-0.3.2}/alter_runtime/adapters/household/tapo_ecosystem/adapter.py +0 -0
  43. {alter_runtime-0.3.0 → alter_runtime-0.3.2}/alter_runtime/adapters/household/tapo_ecosystem/storage.py +0 -0
  44. {alter_runtime-0.3.0 → alter_runtime-0.3.2}/alter_runtime/adapters/household/tapo_ecosystem/tests/__init__.py +0 -0
  45. {alter_runtime-0.3.0 → alter_runtime-0.3.2}/alter_runtime/adapters/household/tapo_ecosystem/tests/test_adapter.py +0 -0
  46. {alter_runtime-0.3.0 → alter_runtime-0.3.2}/alter_runtime/adapters/household/tapo_ecosystem/tests/test_storage.py +0 -0
  47. {alter_runtime-0.3.0 → alter_runtime-0.3.2}/alter_runtime/adapters/household/tapo_ecosystem/tests/test_traits.py +0 -0
  48. {alter_runtime-0.3.0 → alter_runtime-0.3.2}/alter_runtime/adapters/household/tapo_ecosystem/traits.py +0 -0
  49. {alter_runtime-0.3.0 → alter_runtime-0.3.2}/alter_runtime/adapters/household/workshop_tools/adapter.py +0 -0
  50. {alter_runtime-0.3.0 → alter_runtime-0.3.2}/alter_runtime/adapters/household/workshop_tools/storage.py +0 -0
  51. {alter_runtime-0.3.0 → alter_runtime-0.3.2}/alter_runtime/adapters/household/workshop_tools/tests/__init__.py +0 -0
  52. {alter_runtime-0.3.0 → alter_runtime-0.3.2}/alter_runtime/adapters/household/workshop_tools/tests/test_adapter.py +0 -0
  53. {alter_runtime-0.3.0 → alter_runtime-0.3.2}/alter_runtime/adapters/household/workshop_tools/tests/test_storage.py +0 -0
  54. {alter_runtime-0.3.0 → alter_runtime-0.3.2}/alter_runtime/adapters/household/workshop_tools/tests/test_traits.py +0 -0
  55. {alter_runtime-0.3.0 → alter_runtime-0.3.2}/alter_runtime/adapters/household/workshop_tools/traits.py +0 -0
  56. {alter_runtime-0.3.0 → alter_runtime-0.3.2}/alter_runtime/adapters/worktree_watcher.py +0 -0
  57. {alter_runtime-0.3.0 → alter_runtime-0.3.2}/alter_runtime/atlas/base.py +0 -0
  58. {alter_runtime-0.3.0 → alter_runtime-0.3.2}/alter_runtime/atlas/observations.py +0 -0
  59. {alter_runtime-0.3.0 → alter_runtime-0.3.2}/alter_runtime/atlas/schema.py +0 -0
  60. {alter_runtime-0.3.0 → alter_runtime-0.3.2}/alter_runtime/cap_cache.py +0 -0
  61. {alter_runtime-0.3.0 → alter_runtime-0.3.2}/alter_runtime/clients/__init__.py +0 -0
  62. {alter_runtime-0.3.0 → alter_runtime-0.3.2}/alter_runtime/clients/token_usage_client.py +0 -0
  63. {alter_runtime-0.3.0 → alter_runtime-0.3.2}/alter_runtime/config.py +0 -0
  64. {alter_runtime-0.3.0 → alter_runtime-0.3.2}/alter_runtime/consent.py +0 -0
  65. {alter_runtime-0.3.0 → alter_runtime-0.3.2}/alter_runtime/floor_loop.py +0 -0
  66. {alter_runtime-0.3.0 → alter_runtime-0.3.2}/alter_runtime/floor_preflight.py +0 -0
  67. {alter_runtime-0.3.0 → alter_runtime-0.3.2}/alter_runtime/http_auth.py +0 -0
  68. {alter_runtime-0.3.0 → alter_runtime-0.3.2}/alter_runtime/notifiers/__init__.py +0 -0
  69. {alter_runtime-0.3.0 → alter_runtime-0.3.2}/alter_runtime/notifiers/desktop.py +0 -0
  70. {alter_runtime-0.3.0 → alter_runtime-0.3.2}/alter_runtime/service_install.py +0 -0
  71. {alter_runtime-0.3.0 → alter_runtime-0.3.2}/alter_runtime/services/__init__.py +0 -0
  72. {alter_runtime-0.3.0 → alter_runtime-0.3.2}/alter_runtime/services/systemd/cf-access-env.conf.in +0 -0
  73. {alter_runtime-0.3.0 → alter_runtime-0.3.2}/alter_runtime/sockets/__init__.py +0 -0
  74. {alter_runtime-0.3.0 → alter_runtime-0.3.2}/alter_runtime/sockets/dbus.py +0 -0
  75. {alter_runtime-0.3.0 → alter_runtime-0.3.2}/alter_runtime/sockets/unix.py +0 -0
  76. {alter_runtime-0.3.0 → alter_runtime-0.3.2}/alter_runtime/subscribers/__init__.py +0 -0
  77. {alter_runtime-0.3.0 → alter_runtime-0.3.2}/alter_runtime/subscribers/active_sessions_cron_emitter.py +0 -0
  78. {alter_runtime-0.3.0 → alter_runtime-0.3.2}/alter_runtime/subscribers/active_sessions_do_publisher.py +0 -0
  79. {alter_runtime-0.3.0 → alter_runtime-0.3.2}/alter_runtime/subscribers/active_sessions_gc.py +0 -0
  80. {alter_runtime-0.3.0 → alter_runtime-0.3.2}/alter_runtime/subscribers/active_sessions_writer.py +0 -0
  81. {alter_runtime-0.3.0 → alter_runtime-0.3.2}/alter_runtime/subscribers/adapters_writer.py +0 -0
  82. {alter_runtime-0.3.0 → alter_runtime-0.3.2}/alter_runtime/subscribers/agent_frames.py +0 -0
  83. {alter_runtime-0.3.0 → alter_runtime-0.3.2}/alter_runtime/subscribers/bus.py +0 -0
  84. {alter_runtime-0.3.0 → alter_runtime-0.3.2}/alter_runtime/subscribers/cache_writer.py +0 -0
  85. {alter_runtime-0.3.0 → alter_runtime-0.3.2}/alter_runtime/subscribers/do_sse.py +0 -0
  86. {alter_runtime-0.3.0 → alter_runtime-0.3.2}/alter_runtime/subscribers/inbox_writer.py +0 -0
  87. {alter_runtime-0.3.0 → alter_runtime-0.3.2}/alter_runtime/subscribers/mcp_fallback.py +0 -0
  88. {alter_runtime-0.3.0 → alter_runtime-0.3.2}/alter_runtime/subscribers/presence_writer.py +0 -0
  89. {alter_runtime-0.3.0 → alter_runtime-0.3.2}/alter_runtime/subscribers/session_presence.py +0 -0
  90. {alter_runtime-0.3.0 → alter_runtime-0.3.2}/alter_runtime/subscribers/sse.py +0 -0
  91. {alter_runtime-0.3.0 → alter_runtime-0.3.2}/alter_runtime/subscribers/weave_intent_writer.py +0 -0
  92. {alter_runtime-0.3.0 → alter_runtime-0.3.2}/alter_runtime/update_loop.py +0 -0
  93. {alter_runtime-0.3.0 → alter_runtime-0.3.2}/alter_runtime/weave/__init__.py +0 -0
  94. {alter_runtime-0.3.0 → alter_runtime-0.3.2}/alter_runtime/weave/resolver.py +0 -0
  95. {alter_runtime-0.3.0 → alter_runtime-0.3.2}/examples/waybar/README.md +0 -0
  96. {alter_runtime-0.3.0 → alter_runtime-0.3.2}/pypi-truealter/README.md +0 -0
  97. {alter_runtime-0.3.0 → alter_runtime-0.3.2}/pypi-truealter/pyproject.toml +0 -0
@@ -1,11 +1,11 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: alter-runtime
3
- Version: 0.3.0
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
7
- Project-URL: Repository, https://github.com/true-alter/Alter
8
- Project-URL: Bug Tracker, https://github.com/true-alter/Alter/issues
7
+ Project-URL: Repository, https://github.com/true-alter/alter-runtime
8
+ Project-URL: Bug Tracker, https://github.com/true-alter/alter-runtime/issues
9
9
  Author: Blake Morrison
10
10
  Author-email: ALTER Meridian Pty Ltd <hello@truealter.com>
11
11
  License: Apache-2.0
@@ -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
@@ -7,5 +7,5 @@ architectural context.
7
7
 
8
8
  from alter_runtime.sdk.client import AlterClient
9
9
 
10
- __version__ = "0.3.0"
10
+ __version__ = "0.3.1"
11
11
  __all__ = ["AlterClient", "__version__"]
@@ -63,7 +63,7 @@ Decisions
63
63
  - D-IaI-1 (Identity-as-Inference): token usage is a passive aggregate with
64
64
  k=1 (single principal machine). The inferred signal (burn-rate by model)
65
65
  is operational telemetry, NOT psychometric inference - no clause of the
66
- IaI 5-point test is triggered. Return: ops.truealter.com visibility.
66
+ IaI 5-point test is triggered. Return: operator visibility.
67
67
  - HTTP auth: JWT sourced from ``load_session()`` at adapter start, then
68
68
  refreshed per-POST from ``ALTER_RUNTIME_SESSION_JWT`` env var as a
69
69
  fallback. Full auth substrate wiring (ensureFreshSession equivalent) is a
@@ -14,7 +14,7 @@ boundary upward.
14
14
 
15
15
  NOT auto-wired into :mod:`alter_runtime.daemon` startup; activation is a
16
16
  follow-up wave once the stub specs in
17
- ``.repos/internal/02-Technical-Strategy/phase2-wave2-stub-specs-pack-2026-05-27.md``
17
+ the ALTER internal Phase-2 wave-2 stub specs
18
18
  land their implementation pass.
19
19
  """
20
20
 
@@ -1,7 +1,7 @@
1
1
  """Shared base classes for the household adapter family.
2
2
 
3
3
  Two adapter shapes per the Phase-2 cross-pattern catalogue
4
- (``.repos/internal/02-Technical-Strategy/phase2-substrate-cross-pattern-catalogue-2026-05-19.md``):
4
+ (ALTER internal Phase-2 cross-pattern catalogue):
5
5
 
6
6
  * :class:`EventBusSubscriberBase` — subscribes to the in-process
7
7
  :class:`~alter_runtime.subscribers.bus.EventBus` for events the
@@ -5,7 +5,7 @@ devices whose member-attested plate tag is ``"compost"``, and computes
5
5
  a 30-day temperature-curve patience trait (band). Persists to
6
6
  ``~/.local/share/alter-runtime/compost.db`` (mode 600).
7
7
 
8
- Spec: ``.repos/internal/02-Technical-Strategy/compost-substrate-adapter-2026-05-19.md``
8
+ Spec: ALTER internal - compost substrate adapter.
9
9
  """
10
10
 
11
11
  from alter_runtime.adapters.household.compost.adapter import CompostAdapter
@@ -6,8 +6,8 @@ diversity, and cadence band. Persists to
6
6
  ``~/.local/share/alter-runtime/workshop_tools.db`` (mode 600). Emits
7
7
  trait bands only — never raw Wh.
8
8
 
9
- Spec: ``.repos/internal/02-Technical-Strategy/workshop-tool-substrate-adapter-2026-05-19.md``
10
- Stub: ``phase2-wave2-stub-specs-pack-2026-05-27.md`` (Eco-12 line).
9
+ Spec: ALTER internal - workshop-tool substrate adapter.
10
+ Stub: ALTER internal Phase-2 wave-2 stub specs (Eco-12 line).
11
11
  """
12
12
 
13
13
  from alter_runtime.adapters.household.workshop_tools.adapter import (
@@ -6,8 +6,7 @@ content-free 128-dim signature vectors. Content stays local forever; only
6
6
  derivative signature hashes cross the consent boundary, under per-stream
7
7
  Art-6(1)(a) consent.
8
8
 
9
- Spec: .repos/internal/02-Technical-Strategy/substrate-recognition-exploration-2026-04-17.md
10
- Plan: .repos/internal/02-Technical-Strategy/atlas-weekend-build-plan-2026-04-18.md
9
+ Spec + plan: ALTER internal technical-strategy (substrate recognition).
11
10
  DR candidate: D-VLT1 (Drew-gated).
12
11
 
13
12
  Honesty clause (spec §2): signatures are DERIVATIVE, not pseudonymous. A 128-dim
@@ -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
 
@@ -10,8 +10,7 @@ Subcommands:
10
10
  query Query the current materialised view (attunement, warmth, trust tier).
11
11
  ingest Manually ingest a signal (for testing).
12
12
 
13
- Matches the shape of the alter-cli (Node/TS) command handler at
14
- /mnt/personal/Workspaces/alter-cli/src/index.ts:24-79 - simple switch-on-verb,
13
+ Matches the shape of the alter-cli (Node/TS) command handler - a simple switch-on-verb,
15
14
  no external CLI framework dependency (argparse is stdlib).
16
15
  """
17
16
 
@@ -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
@@ -107,7 +106,7 @@ class AlterClient:
107
106
  bearer_token: str | None = None,
108
107
  timeout: float = 30.0,
109
108
  client_name: str = "alter-runtime",
110
- client_version: str = "0.3.0",
109
+ client_version: str = "0.3.1",
111
110
  ) -> None:
112
111
  self.base_url = base_url.rstrip("/")
113
112
  self.api_key = api_key
@@ -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 alter-api.fly.dev 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>
@@ -16,7 +16,7 @@
16
16
 
17
17
  [Unit]
18
18
  Description=~Alter Identity Runtime — local sovereign daemon
19
- Documentation=https://github.com/true-alter/Alter/blob/main/packages/alter-runtime/README.md
19
+ Documentation=https://github.com/true-alter/alter-runtime/blob/main/README.md
20
20
  # We do not require network-online.target because the daemon tolerates
21
21
  # offline starts — it degrades to its local cache and retries the DO
22
22
  # connection with exponential backoff (D-RT9).
@@ -28,9 +28,8 @@ 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
- * .claude/handovers/2026-04-24-alter-myspace-customisation-m2-and-c-spike.md
34
33
  """
35
34
 
36
35
  from __future__ import annotations
@@ -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 (AMCZ-2615626261, FILED
7
- 7 Apr 2026) covers this 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.
@@ -2,7 +2,7 @@
2
2
 
3
3
  Ambient wibar widget + rofi quick-compose for ALTER messaging on Arch / AwesomeWM. Pairs with the existing waybar example for Wayland users; this is the X11 / AwesomeWM equivalent.
4
4
 
5
- Private-dev scope - Blake's machine. Local-only (IaI Clause 1 compliant): the widget reads a daemon-populated cache file, never the network. The compose script only calls the same local MCP endpoint as `.claude/hooks/cc-slash-msg.sh`.
5
+ Private-dev scope. Local-only (IaI Clause 1 compliant): the widget reads a daemon-populated cache file, never the network. The compose script only calls the same local MCP endpoint as `.claude/hooks/cc-slash-msg.sh`.
6
6
 
7
7
  ## Files
8
8
 
@@ -29,7 +29,7 @@ Private-dev scope - Blake's machine. Local-only (IaI Clause 1 compliant): the wi
29
29
  2. Copy `alter-compose.sh` somewhere on `$PATH`, or leave it in-place and reference the absolute path. Mark it executable:
30
30
 
31
31
  ```bash
32
- chmod +x /mnt/personal/Workspaces/alter/.repos/alter-runtime/examples/awesomewm/alter-compose.sh
32
+ chmod +x /path/to/alter-compose.sh
33
33
  ```
34
34
 
35
35
  3. Edit `~/.config/awesome/rc.lua` and add the widget mount + keybinding (snippets below).
@@ -79,14 +79,14 @@ In your `globalkeys` table, add the quick-compose bind (Super+M suggested; pick
79
79
  awful.key(
80
80
  { modkey }, "m",
81
81
  function ()
82
- awful.spawn("/mnt/personal/Workspaces/alter/.repos/alter-runtime/examples/awesomewm/alter-compose.sh")
82
+ awful.spawn("/path/to/alter-compose.sh")
83
83
  end,
84
84
  { description = "compose alter message", group = "alter" }
85
85
  ),
86
86
  awful.key(
87
87
  { modkey, "Shift" }, "m",
88
88
  function ()
89
- awful.spawn("/mnt/personal/Workspaces/alter/.repos/alter-runtime/examples/awesomewm/alter-compose.sh --read")
89
+ awful.spawn("/path/to/alter-compose.sh --read")
90
90
  end,
91
91
  { description = "read alter inbox", group = "alter" }
92
92
  ),
@@ -107,7 +107,7 @@ awful.key(
107
107
  ## Privacy notes (D-MSG10)
108
108
 
109
109
  - The widget reads `~/.cache/alter/inbox.json` only. No network traffic from the widget path.
110
- - `alter-compose.sh` hits only `http://localhost:9092/api/v1/mcp` with the local dev member key - same path the CC `/msg` hook uses. No third-party endpoints, no telemetry.
110
+ - `alter-compose.sh` hits only `http://localhost:9092/api/v1/mcp` with a local dev key - same path the CC `/msg` hook uses. No third-party endpoints, no telemetry.
111
111
  - Read receipts, presence, and typing indicators are intentionally NOT wired. Opening the inbox (`--read`) does not mark messages read server-side; that's an explicit user action left for the inbox UI.
112
112
 
113
113
  ## Configuration
@@ -117,6 +117,6 @@ Both files respect:
117
117
  | Env var | Default | Purpose |
118
118
  |---------|---------|---------|
119
119
  | `ALTER_MESSENGER_API` | `http://localhost:9092/api/v1/mcp` | MCP endpoint for send/inbox calls |
120
- | `ALTER_MESSENGER_KEY` | `alt_dev_blake_msg` | API key header value |
120
+ | `ALTER_MESSENGER_KEY` | `alt_dev_<handle>_msg` | API key header value (dev-only; backend honours `alt_dev_*` keys only when running in development mode) |
121
121
 
122
122
  Override in your `~/.config/awesome/rc.lua` via `awful.spawn.with_shell` if you need a different endpoint for staging.
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "alter-runtime"
7
- version = "0.3.0"
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
  ]
@@ -117,11 +117,12 @@ alter-runtime = "alter_runtime.cli:main"
117
117
  [project.urls]
118
118
  Homepage = "https://truealter.com"
119
119
  Documentation = "https://truealter.com/docs/alter-runtime"
120
- Repository = "https://github.com/true-alter/Alter"
121
- "Bug Tracker" = "https://github.com/true-alter/Alter/issues"
120
+ Repository = "https://github.com/true-alter/alter-runtime"
121
+ "Bug Tracker" = "https://github.com/true-alter/alter-runtime/issues"
122
122
 
123
123
  [tool.hatch.build.targets.wheel]
124
124
  packages = ["alter_runtime"]
125
+ exclude = ["alter_runtime/**/tests", "alter_runtime/**/tests/**"]
125
126
 
126
127
  [tool.hatch.build.targets.wheel.force-include]
127
128
  "alter_runtime/services/systemd/alter-runtime.service.in" = "alter_runtime/services/systemd/alter-runtime.service.in"
File without changes
File without changes