Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
801 commits
Select commit Hold shift + click to select a range
8fc03d1
fix(dashboard): visible expand button when sidebar collapsed + dark d…
dshakes Jul 4, 2026
0708098
fix(dashboard): larger, more readable type + dark-default doc consist…
dshakes Jul 4, 2026
92c08a6
Merge pull request #155 from dshakes/fix-sidebar-dark
dshakes Jul 4, 2026
c3b081f
feat(bridges): proactive family event scout — weekly curated scan + b…
dshakes Jul 5, 2026
8ddd64e
fix(loop-agents): fail loudly, deliver outcomes — no more silent zero…
dshakes Jul 5, 2026
9580758
fix(event-scout): strict date order + clean two-line display
dshakes Jul 5, 2026
8b03ce2
Merge pull request #156 from dshakes/feat/event-scout
dshakes Jul 5, 2026
a36bf15
fix(delivery): fan owner self-notes out to BOTH bridges
dshakes Jul 5, 2026
b23ee6b
Merge pull request #157 from dshakes/fix/self-note-both-bridges
dshakes Jul 5, 2026
cb54576
feat(personal): folder-aware doc search + local search_email over App…
dshakes Jul 6, 2026
cb6dd35
fix(personal-docs): deterministic file-over-folder ranking (Linux CI)
dshakes Jul 6, 2026
56d9803
Merge pull request #158 from dshakes/feat/personal-intelligence-mail-…
dshakes Jul 6, 2026
2f305e6
fix(engine,digest): no fabricated child_run output; digest fallback k…
dshakes Jul 6, 2026
3cba22b
feat(attention): LLM-ranked cross-thread Attention Engine in the owne…
dshakes Jul 6, 2026
89e30c0
feat(security): encrypt bridge PII state at rest; egress fail-closed …
dshakes Jul 6, 2026
f2476d6
feat(attention): reactions-as-API one-tap layer, WA Living Brief, /in…
dshakes Jul 6, 2026
de727fa
feat: skill forge (safe self-improvement) + first memory-service test…
dshakes Jul 6, 2026
ae0d774
feat: time-travel recap — "what did I miss" narrative across both bri…
dshakes Jul 6, 2026
e97d5bc
docs(adr): enterprise-GA readiness — SOC 2, SSO/SAML+SCIM, managed no…
dshakes Jul 6, 2026
5366e5b
feat(bridge): plan-preview-confirm bundles + tighter owner-reply brev…
dshakes Jul 6, 2026
ff73cad
feat(authz): per-endpoint scope enforcement (flag-gated, default off)…
dshakes Jul 6, 2026
ca3a9ee
feat(evals): observability slice — failure clustering + quality trend…
dshakes Jul 6, 2026
354c363
fix(imessage): flush send-dedup state on shutdown so a restart doesn'…
dshakes Jul 6, 2026
c520c79
chore(deps): clear cargo-audit advisories blocking the vuln gate (#169)
dshakes Jul 7, 2026
e65c8dd
feat(imessage): read_email tool — read local Apple Mail message bodie…
dshakes Jul 7, 2026
2f8d5d2
fix(bridge): timezone correctness sweep — 3 date bugs found by audit …
dshakes Jul 7, 2026
07dadab
fix(control-plane): timezone-aware cron + budget day boundary (defaul…
dshakes Jul 7, 2026
c998ab7
fix(calendar): all-day events fired bogus 'starts in N min' nudges (t…
dshakes Jul 7, 2026
ac350ca
fix(bridge): never address anyone as 'bava'/'baava' — blanket bot-tel…
dshakes Jul 7, 2026
39c36cc
fix(bridge): contact replies — share benign third-party facts, stop l…
dshakes Jul 8, 2026
9e8e515
feat(bridge): owner-initiated [SEND:...] — assistant sends WA/iMessag…
dshakes Jul 8, 2026
0ef1103
fix(bridge): contact doc-request relay — stop fabricating status, sur…
dshakes Jul 8, 2026
bc0979c
fix(bridge): confirm resolver — 'send' now confirms + can't be hijack…
dshakes Jul 8, 2026
34368b0
feat(bridge): doc-relay — honest file delivery to SMS/RCS + intellige…
dshakes Jul 8, 2026
8740e52
fix(bridge): honest file-send acks — report transport, never claim de…
dshakes Jul 8, 2026
7921be0
feat: secure short-lived link delivery for docs to non-iMessage/Whats…
dshakes Jul 8, 2026
19e791b
fix(control-plane): dl signing falls back to an ephemeral per-process…
dshakes Jul 8, 2026
96decd7
fix(bridge): route file delivery by PROVEN capability, not a lying se…
dshakes Jul 8, 2026
c456197
feat(control-plane): prod-grade doc-link storage — S3/MinIO-backed, s…
dshakes Jul 8, 2026
7d665ef
fix(bridge): doc-relay sent the WRONG document — hard match gate + sm…
dshakes Jul 8, 2026
029e8d0
fix(bridge): review batch — anti-fabrication, per-thread 5-min takeov…
dshakes Jul 8, 2026
f157c7f
feat(bridge): agentic multi-slot pending — reason about which confirm…
dshakes Jul 8, 2026
a563825
fix(bridge): doc-relay never delivered — folder-as-file, link-less si…
dshakes Jul 9, 2026
73550bb
fix(bridge): owner-initiated doc sends never attached a file (docRela…
dshakes Jul 9, 2026
57c61bc
feat(introspect): self-auditing cadence for the live bridges (4x/day)
dshakes Jul 9, 2026
9dacabf
chore(introspect): audit DM threads only, exclude group chats
dshakes Jul 9, 2026
6ebf1c6
fix(introspect): --strict-mcp-config so the audit context isn't blown…
dshakes Jul 9, 2026
c0ea7a6
fix(bridge): iMessage doc send silently failed on async Not-Delivered
dshakes Jul 9, 2026
0245419
fix(bridge): WhatsApp silently dropped concrete replies suppressed twice
dshakes Jul 9, 2026
2f928e3
feat(bridge): confirm doc sends by tapback/emoji (👍 send · 👎 skip)
dshakes Jul 9, 2026
6b637cd
fix(dashboard): kill the login redirect loop (blank screen)
dshakes Jul 9, 2026
e95b7d2
fix(dashboard): prod-grade repair of the login redirect-loop / blank …
dshakes Jul 9, 2026
1303b53
fix(bridge): doc sends stop lying, honor the channel, relay cross-bridge
dshakes Jul 10, 2026
a64e5af
chore(launchd): dashboard wrapper sources ~/.lantern/bridge.env
dshakes Jul 10, 2026
5a543fa
feat(runtime): self-consistency confidence estimator for gated execution
dshakes Jul 10, 2026
7c6d36e
feat(runtime): outcome-calibrated confidence — close the write-only loop
dshakes Jul 10, 2026
141011f
fix(runtime): address review — regret by step, clamp ceiling, bound c…
dshakes Jul 10, 2026
d9ff474
fix(bridge): QR stuck on "Generating QR" — WS token broke browser pai…
dshakes Jul 10, 2026
fedb8c4
fix(dashboard): pairing modal — stepper wraps, instructions stack on …
dshakes Jul 10, 2026
caba2ba
feat(bridge): reasoned owner voice — LLM-inferred style, not 6 magic …
dshakes Jul 10, 2026
4cb4e9c
fix(bridge): address review — throwaway voice session, drop perContac…
dshakes Jul 10, 2026
3b14ef8
feat(bridge): activate the 👎 novel-preference learner (Phase 2b)
dshakes Jul 10, 2026
3a6df81
docs+polish(bridge): 2b review — default-on docs, accurate guard comm…
dshakes Jul 10, 2026
bd359cb
feat(runtime): USCIS/immigration deadline sentinel (Phase 3)
dshakes Jul 10, 2026
10e7c58
feat(bridge): Phase 2c intent-reasoning router in front of the regex …
dshakes Jul 10, 2026
78725c0
fix(bridge): intent-router — no double-ack on disclosure + env docs
dshakes Jul 10, 2026
c351945
chore(launchd): api wrapper sources ~/.lantern/bridge.env
dshakes Jul 10, 2026
6eda953
fix(bridge): owner "where am i" grounds on real phone signal, never g…
dshakes Jul 14, 2026
c7b6de2
fix(bridge): gap-aware transcript — dormant thread stops leaking stal…
dshakes Jul 18, 2026
b29eaa1
fix(bridge): stop self-chat self-echo runaway — circuit breaker + seg…
dshakes Jul 18, 2026
6bd5d7d
fix(bridge): auto-wipe dead creds on WhatsApp loggedOut so Pair again…
dshakes Jul 19, 2026
1151bb4
fix(loop-agent): date-anchor domain-coach briefs + strip LLM meta-echo
dshakes Jul 20, 2026
b34574d
feat(loop-agent): auto-expire commitments 7 days past deadline
dshakes Jul 21, 2026
7734689
docs(adr): 0022 — two-tier agent runtime (shared inline + isolated mi…
dshakes Jul 23, 2026
89a0c03
feat(runtime): in-guest tool runner — exec_tool executes real tools i…
dshakes Jul 23, 2026
52c7fe6
feat(workflow): per-step retry policy — node-declared, journal-visible
dshakes Jul 23, 2026
a5b7b9c
feat(control-plane): service-health sweep — peer probes with owner se…
dshakes Jul 23, 2026
be193f9
feat(control-plane): two-tier run routing — manifest isolation dispat…
dshakes Jul 23, 2026
9c1ac96
docs: agent-runtime architecture doc, interactive SVG diagrams, e2e s…
dshakes Jul 23, 2026
d4a8ab5
feat(observability): OTel runtime metrics — step latency, retries, re…
dshakes Jul 24, 2026
e2fe39d
feat(runtime): microVM-tier durability parity — journal streaming, co…
dshakes Jul 24, 2026
24cbff0
feat(memory): Memory Bank — LLM-distilled long-term memory service (f…
dshakes Jul 24, 2026
2e4da05
feat(streaming): token-delta streaming e2e — provider SSE deltas flow…
dshakes Jul 24, 2026
4e361ad
feat(streaming): SDK/dashboard/widget consume token deltas
dshakes Jul 24, 2026
777708d
feat(cli): agentic self-service loop — onboard, doctor, agent dev
dshakes Jul 24, 2026
7a90127
feat(workflow): park-without-compute — approval waits release the gor…
dshakes Jul 24, 2026
0943b98
feat(runtime): session-scoped microVMs — one VM per interactive sessi…
dshakes Jul 24, 2026
4514f61
docs: world-class runtime diagrams + docs-site runtime section rebuild
dshakes Jul 24, 2026
10dead5
docs(site): sessions-and-memory runtime page + final nav
dshakes Jul 24, 2026
877f9a8
fix(security): bind runtime report run_id to the reporting VM's own run
dshakes Jul 24, 2026
7be4473
docs(site): diagram-first runtime UX + homepage lifecycle showcase + …
dshakes Jul 24, 2026
7a19955
docs(site): YC-style landing, accuracy round 2, unified glow diagram …
dshakes Jul 24, 2026
6f1f3ce
docs(readme): hero banner + one v2 glow theme across all 20 diagrams …
dshakes Jul 24, 2026
9db1f8b
feat(dashboard): flight recorder — run replay over journal_events
dshakes Jul 24, 2026
42dce69
docs(site): finish glow re-theme — six slate-palette diagrams recolor…
dshakes Jul 24, 2026
8fdfabb
docs(site): security page — claim-by-claim audit corrections
dshakes Jul 24, 2026
d160565
feat(runtime): operator validation harnesses + examples validated end…
dshakes Jul 24, 2026
bb42fae
feat(runtime): confidential compute v1 — fail-closed CC placement + a…
dshakes Jul 24, 2026
5585822
docs(readme): status block matches shipped evidence — Phase 5/6 lande…
dshakes Jul 24, 2026
165b5e0
docs(adr): accuracy audit — 6 ADRs updated to match shipped code
dshakes Jul 24, 2026
9100a0f
fix(ga): make/CLI/SDK validation sweep — all gates green
dshakes Jul 24, 2026
440789a
docs(diagrams): loop-arrow fix, verbosity diet, site recolors, runtim…
dshakes Jul 24, 2026
c697642
docs(site): customer-friendly concept layer on every page
dshakes Jul 24, 2026
8309971
docs(site): runtime hero is now the interactive personal-harness-styl…
dshakes Jul 24, 2026
313cb79
fix(ga): close remaining prod gaps — full ci-local green + diagram di…
dshakes Jul 24, 2026
2110910
docs(diagrams): world-class readability pass — reading order + hard w…
dshakes Jul 24, 2026
24b8f23
docs(runtime): production-operations reference — checkpointing, resta…
dshakes Jul 24, 2026
ab48ce9
fix(runtime): reconcile VM state, stop silent no-ops, ground placemen…
dshakes Jul 25, 2026
66876ad
fix(launchd): runtime-manager never self-registered — the origin of t…
dshakes Jul 25, 2026
4899e94
fix(launchd): exec compiled binaries, not `go run` — control-plane + …
dshakes Jul 25, 2026
8d34616
fix(connectors): stop retrying credentials that can never work (#187)
dshakes Jul 25, 2026
9fc6541
feat(secrets): scope the credential key, re-encrypt at rest, self-hea…
dshakes Jul 25, 2026
ddb22a0
fix(dashboard): show when a connector needs re-authorization (#189)
dshakes Jul 25, 2026
393265e
feat(scout): re-surface upcoming events, retry failed batches, show t…
dshakes Jul 25, 2026
9ccda4e
fix(commitments): age out FYI noise and lead with urgency (#191)
dshakes Jul 25, 2026
8c8e13a
feat(jarvis): deliver the morning brief, and make it read the commitm…
dshakes Jul 26, 2026
cc51198
feat(jarvis): two-way morning brief — reply "done 1" to close an item…
dshakes Jul 26, 2026
4a092b5
ci: install compass SDLC workflows + CODEOWNERS
dshakes Jul 27, 2026
2e91736
docs: note the compass gate on PRs (#194)
dshakes Jul 27, 2026
eb0109c
chore(deps): bump google.golang.org/grpc to v1.82.1 (GO-2026-6061)
dshakes Jul 28, 2026
b411b7c
Merge pull request #196 from dshakes/chore/bump-grpc-1.82.1
dshakes Jul 28, 2026
1415b78
feat(sdk-python): deepagents sandbox backend over the microVM runtime
dshakes Jul 28, 2026
3f6fc2a
docs(sdk-python): document the deepagents sandbox backend
dshakes Jul 28, 2026
deb1c4d
Merge pull request #195 from dshakes/feat/deepagents-sandbox-backend
dshakes Jul 28, 2026
d3bb718
feat(runtime): wire exec through to the runtime-manager; verify again…
dshakes Jul 28, 2026
03250d7
fix(runtime): dispatch exec to the VM's own node, not the default man…
dshakes Jul 28, 2026
66c6aad
Merge pull request #197 from dshakes/feat/wire-runtime-exec
dshakes Jul 28, 2026
5df4752
fix(microvm-ci): unbreak the integration test and stop the skip readi…
dshakes Jul 28, 2026
e22f0fd
fix(harness): bridge the kernel cmdline to env so a microVM can actua…
dshakes Jul 29, 2026
8056b5b
fix(harness): mount the per-VM cert drive so the manager channel can …
dshakes Jul 29, 2026
b61f571
feat(runtime): give each microVM a network path to the manager
dshakes Jul 29, 2026
31201e1
chore(harness): fingerprint the loaded mTLS trust material
dshakes Jul 29, 2026
6845220
chore(harness): report the guest entropy source at boot
dshakes Jul 29, 2026
0112e04
style(runtime): rustfmt the VM subnet allocator
dshakes Jul 30, 2026
78e2a3b
Merge pull request #198 from dshakes/fix/microvm-ci-honest-skip
dshakes Jul 30, 2026
c323c1d
fix(microvm-ci): assert the guest came up, not just that Firecracker …
dshakes Jul 30, 2026
ca83b74
Merge pull request #199 from dshakes/fix/microvm-boot-assertion
dshakes Jul 30, 2026
998790f
fix(runtime): stop leaking TAP devices (and their subnets) per VM
dshakes Jul 30, 2026
06641b8
Merge pull request #200 from dshakes/fix/microvm-tap-leak
dshakes Jul 30, 2026
8f59b3b
chore(harness): let rustls explain itself (re-enable its `logging` fe…
dshakes Jul 30, 2026
dddc1d5
fix(harness): verify the manager by name, not by the address it happe…
dshakes Jul 30, 2026
8621e1f
Merge pull request #201 from dshakes/chore/rustls-logging
dshakes Jul 30, 2026
2837e7b
fix(runtime): vend secrets over mTLS — the boot contract now passes e…
dshakes Jul 31, 2026
64f6801
Merge pull request #202 from dshakes/fix/vendsecret-mtls
dshakes Jul 31, 2026
3a5e326
fix(runtime): reclaim TAP devices orphaned by a crashed manager
dshakes Jul 31, 2026
c01fd0e
Merge pull request #203 from dshakes/fix/tap-startup-reconcile
dshakes Jul 31, 2026
e731f7e
feat(microvm): make the in-guest tool path usable and assert it
dshakes Jul 31, 2026
1e63b22
Merge pull request #204 from dshakes/feat/in-guest-tool-path
dshakes Jul 31, 2026
d21be62
ci: gate the exec path on a real container, no KVM required
dshakes Jul 31, 2026
e0e8592
ci: install protoc for the exec e2e job
dshakes Jul 31, 2026
cdb3f78
ci: register the manager as a node before running the exec e2e
dshakes Jul 31, 2026
216a1a8
Merge pull request #205 from dshakes/ci/exec-e2e-gate
dshakes Jul 31, 2026
aa0a753
fix(harness): let boot-args configure logging
dshakes Jul 31, 2026
8ecd21c
fix(harness): do the env bootstrap before the Tokio runtime exists
dshakes Jul 31, 2026
b773d10
Merge pull request #206 from dshakes/fix/boot-args-log-filter
dshakes Jul 31, 2026
cbaf4cf
fix(microvm): reap the manager's whole process group on teardown
dshakes Jul 31, 2026
a7c0ac9
fix(microvm): resolve the manager's process group by handshake, not i…
dshakes Jul 31, 2026
c53d7f4
fix(deps): bump event-listener to 5.4.2 (RUSTSEC-2026-0221)
dshakes Jul 31, 2026
2ec1a09
fix(microvm): stop the VM through the manager before killing it
dshakes Jul 31, 2026
16009f8
fix(microvm): make the VM backstop jailer-aware; kill with --
dshakes Jul 31, 2026
43ca4a9
chore(deps): bump Rust to 1.94 and wasmtime to 46.0.2 (RUSTSEC-2026-0…
dshakes Jul 31, 2026
f8c8fb7
Merge pull request #209 from dshakes/chore/rust-1.94-wasmtime
dshakes Jul 31, 2026
cef7ff4
Merge master (Rust 1.94 + advisory fixes) into fix/itest-manager-cleanup
dshakes Jul 31, 2026
5478754
Merge pull request #207 from dshakes/fix/itest-manager-cleanup
dshakes Jul 31, 2026
21e4ba9
ci: make the cross-audits re-runnable, and stop them looking un-run
dshakes Aug 1, 2026
5639b22
docs(ci): note in the header that the label also re-audits later pushes
dshakes Aug 1, 2026
9cc92b1
docs(ci): match the Gemini header to the Codex one on re-audit behaviour
dshakes Aug 1, 2026
b4716a2
Merge pull request #210 from dshakes/ci/audit-label-gating
dshakes Aug 1, 2026
59e437c
ci: run the Firecracker boot test on hosted runners (grant /dev/kvm)
dshakes Aug 1, 2026
55341ed
ci: install protoc for the microvm job
dshakes Aug 1, 2026
16be089
ci: build the harness outside sudo for the microvm image
dshakes Aug 1, 2026
815ea65
ci: build the runtime-manager outside sudo, and assert VendSecret
dshakes Aug 1, 2026
fb713b3
ci: only grant /dev/kvm on hosted runners (audit finding)
dshakes Aug 2, 2026
f18baed
ci: fix the hosted-runner gate — env context has no RUNNER_ENVIRONMENT
dshakes Aug 2, 2026
b52c24e
Merge pull request #211 from dshakes/ci/kvm-on-hosted-runners
dshakes Aug 2, 2026
8493efe
fix(harness): retry the boot-time secret prefetch
dshakes Aug 2, 2026
c4b1cea
Merge pull request #212 from dshakes/fix/vendsecret-prefetch-retry
dshakes Aug 2, 2026
0f47ef9
feat(workflow-engine): implement child_run steps
dshakes Aug 3, 2026
3dd0de1
fix(workflow-engine): close the child_run races the audit found
dshakes Aug 3, 2026
58b7709
fix(workflow-engine): renew the parent lock across a child run
dshakes Aug 3, 2026
489c0c1
fix(workflow-engine): record a run_locks row for child runs
dshakes Aug 3, 2026
ddbda02
Merge pull request #213 from dshakes/feat/child-run
dshakes Aug 3, 2026
5325b96
fix(workflow-engine): scope database access by tenant (RLS, invariant…
dshakes Aug 3, 2026
b07441b
fix(workflow-engine): don't scope a transaction with a nil run state
dshakes Aug 3, 2026
28eb80c
fix(workflow-engine): give RLS a pool it actually applies to
dshakes Aug 3, 2026
b046357
fix(workflow-engine): actually wire the RLS pool in cmd/server
dshakes Aug 3, 2026
0134353
fix(workflow-engine): stop QueryRun reading other tenants' runs; fail…
dshakes Aug 3, 2026
0fe8a22
fix(workflow-engine): don't mask DB failures as NotFound; scope Execu…
dshakes Aug 3, 2026
253ee2f
fix(workflow-engine): stop re-masking DB errors at the call sites
dshakes Aug 3, 2026
e67b5a4
fix(workflow-engine): grant the RLS role on the tables this service c…
dshakes Aug 3, 2026
e6825c5
fix(workflow-engine): order the RLS grants after the tables they gran…
dshakes Aug 3, 2026
39408c9
fix(workflow-engine): tenant-filter the child-run queries explicitly
dshakes Aug 3, 2026
97d4a63
fix(workflow-engine): tell a cross-tenant ExecuteRun apart from a wro…
dshakes Aug 3, 2026
ad89d7f
fix(workflow-engine): check ownership before subscribing; fix the cla…
dshakes Aug 3, 2026
553c358
fix(workflow-engine): scope the recursive depth walk; ping the RLS pool
dshakes Aug 3, 2026
334c0c7
Merge pull request #214 from dshakes/fix/workflow-engine-rls
dshakes Aug 3, 2026
40286b2
fix(sdlc): port the loop-hardening package from distil
dshakes Aug 3, 2026
a3d6c7a
fix(sdlc): read CI logs with github.token, not the App
dshakes Aug 3, 2026
59a58e8
chore: track GEMINI.md, matching the AGENTS.md symlink
dshakes Aug 3, 2026
21c685b
fix(sdlc): port the loop-hardening package from distil (#215)
dshakes Aug 3, 2026
8fc9db6
Merge pull request #216 from dshakes/chore/track-gemini-symlink
dshakes Aug 4, 2026
df40695
docs+test: correct the replay-cache claim; pin the behaviour
dshakes Aug 4, 2026
7387fd2
Merge pull request #217 from dshakes/fix/replay-cache-claim
dshakes Aug 4, 2026
e4bace7
ci(qa): install the Rust toolchain instead of letting cargo do it mid…
dshakes Aug 5, 2026
996a3be
Merge pull request #218 from dshakes/ci/qa-rust-toolchain
dshakes Aug 5, 2026
5f8a174
feat(infra): define a staging target and an RLS cutover runbook
dshakes Aug 5, 2026
07ac5b2
fix(helm): actually inject the RLS env — the staging values were inert
dshakes Aug 5, 2026
fc8da1e
fix(helm): supply the secrets LANTERN_ENV=staging actually demands
dshakes Aug 5, 2026
25f861c
Merge pull request #219 from dshakes/feat/staging-rls-target
dshakes Aug 5, 2026
f1bb1f3
fix: end four silent outages — infra, dashboard, duplicate sends, Wha…
dshakes Aug 17, 2026
2143023
fix: the self-audit loop has never run — bash 3.2, silent failure, no…
dshakes Aug 17, 2026
fe32099
fix(introspect): a capped run must still leave evidence (#222)
dshakes Aug 17, 2026
764b97b
fix(introspect): an audit must reconcile with open findings, not cont…
dshakes Aug 18, 2026
b3c40f8
fix(bridges): the bot was blind to its own commitments, and killed re…
dshakes Aug 24, 2026
412ff07
fix(imessage): a contact was answered as if he were the owner, with "…
dshakes Aug 24, 2026
2e07799
fix(bridges): a timed mute became a permanent one across a restart (#…
dshakes Aug 25, 2026
16c19db
fix(imessage): a silent drop is indistinguishable from "nobody messag…
dshakes Aug 25, 2026
3a74ce2
fix(imessage): the SMS pre-route branch skipped the outbound audit lo…
dshakes Aug 25, 2026
ecbe203
fix: usage metering never recorded, and the reply path's LLM call was…
dshakes Aug 25, 2026
843151d
fix(bridges): the bot congratulated "them" on the owner's own store (…
dshakes Sep 4, 2026
a08f531
docs(adr): 0024 — a present-tense self-model, reasoned routing, a mea…
dshakes Sep 4, 2026
0466181
fix(bridges): the muted-notice "ladder" fired 204 times for 484 drops…
dshakes Sep 4, 2026
5d263ec
feat(launchd): make deploy-local — a merge is not a deploy, and this …
dshakes Sep 4, 2026
f7fd8d8
docs: draft-and-confirm is OFF by default, on both bridges, and Whats…
dshakes Sep 4, 2026
edd73d0
fix(bridges): a commitment gate — the bot promised a relative money 6…
dshakes Sep 6, 2026
b2fae9c
fix(bridges): a voice-note ack posted in a group one second before th…
dshakes Sep 6, 2026
e8e1df9
fix(bridges): "send chesta" for a number now resolves the number inst…
dshakes Sep 7, 2026
acaf70a
feat(bridges): share a contact's number directly when confident; othe…
dshakes Sep 7, 2026
b4d02a0
feat(bridges): a dated present-tense self-model — the bot finally kno…
dshakes Sep 7, 2026
520c6c9
fix(bridges): the two bot-tells contacts saw most — repeated replies …
dshakes Sep 7, 2026
dee17fb
feat(bridges): an authorship floor set by the owner's own text — voic…
dshakes Sep 7, 2026
7b662e7
feat(bridges): critique-refine against the owner's own messages; clai…
dshakes Sep 7, 2026
d465d91
fix(bridges): the contact reply knows what the assistant already did …
dshakes Sep 7, 2026
99569ec
feat(bridges): one strict, exemplar-grounded third attempt before the…
dshakes Sep 7, 2026
a69faee
feat(bridges): Telugu/Hindi distress no longer reads as neutral — rea…
dshakes Sep 7, 2026
2932d90
feat(imessage): a weak romanized language guess is confirmed by the m…
dshakes Sep 7, 2026
5600cc1
feat: cross-thread recall on the semantic index; a reasoned relations…
dshakes Sep 7, 2026
1cd58d7
fix(bridges): a kinship word is not a name — 'akka' must never resolv…
dshakes Sep 7, 2026
b4dc0c5
fix(bridges): a pause only ever extends — the owner-takeover pause no…
dshakes Sep 7, 2026
60b02cd
fix(bridges): mute means don't SEND, not don't THINK — a muted channe…
dshakes Sep 7, 2026
98fb39a
fix(bridges): grounding gate (hold, never guess) + memorial register …
dshakes Sep 18, 2026
99a3ca1
fix(imessage): the unknown-inbound ingester must not swallow GROUP me…
dshakes Sep 19, 2026
befd02a
fix(imessage): the world model must keep learning on a MUTED channel …
dshakes Sep 19, 2026
31d006c
fix(bridges): a fresh pending draft can't be replaced by a message ty…
dshakes Sep 22, 2026
21b20ec
fix(model-router): require x-lantern-service-token on the gRPC port; …
dshakes Oct 23, 2026
e6e0c00
docs(roadmap): 2026-10 next-gen sandbox + personal harness plan from …
dshakes Oct 23, 2026
0fc1efb
merge: model-router service-token auth (S2)
dshakes Oct 23, 2026
dcc5168
fix(runtime): decode limits/egress/secrets, map microvm isolation, id…
dshakes Oct 23, 2026
f6dbd33
fix(control-plane): run VM schedule key is per-attempt so a recovery …
dshakes Oct 23, 2026
953fcd5
merge: runtime spec plumbing, quota leak, tenant-scoped idempotency, …
dshakes Oct 23, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
12 changes: 11 additions & 1 deletion .claude/settings.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,15 @@
{
"enabledPlugins": {
"frontend-design@claude-plugins-official": true
"frontend-design@claude-plugins-official": true,
"core@compass": true
},
"extraKnownMarketplaces": {
"compass": {
"source": {
"source": "github",
"repo": "dshakes/compass",
"ref": "v0.6.0"
}
}
}
}
109 changes: 109 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -156,6 +156,115 @@
# System-prompt augmentation included in every WhatsApp turn.
#LANTERN_SYSTEM_PROMPT=You are Shekhar's WhatsApp assistant. Be brief.

# ============================================================================
# WHATSAPP BRIDGE — FUTURISTIC FEATURES
# ============================================================================
#
# These tune the "personal assistant" behavior layer on top of the bridge:
#
# Quiet hours: skip auto-reply during sleep hours so contacts don't see
# replies at 3am — biggest bot-tell short of an instant typing indicator.
# Inbound notifications still arrive on your phone normally. Both hours
# are 0..23 (24h). Default: 22..07 (10pm–7am). Set BOTH or neither.
#LANTERN_OWNER_TIMEZONE=America/Los_Angeles
#LANTERN_QUIET_START=22
#LANTERN_QUIET_END=7
#
# Voice notes: inbound voice gets transcribed via Whisper and treated
# as text. Requires OPENAI_API_KEY above. (No outbound voice yet —
# voice cloning needs per-user training; future ENV flag.)
#
# Image understanding: inbound images get described via the vision LLM.
# Routes through /v1/completions so it uses whatever provider keys the
# tenant has configured. No additional setup beyond the LLM keys.

# ============================================================================
# WHATSAPP BRIDGE — STATUS DELIVERY FALLBACKS
# ============================================================================
#
# When WhatsApp's Signal session falls into 'Waiting for this message'
# limbo, the bridge's /lantern responses + /bot confirmations stop
# reaching your phone. Configure ONE OR MORE of the channels below and
# the bridge mirrors every status reply to them. Pick whatever you
# actually use:

# --- Email mirror (universal, recommended) ---
# Routes via your already-configured Gmail connector at /connectors.
# Subject = first line of the reply ("Lantern · 🟢 active"). Throttled
# to one email per unique-text per 30s and skips short reactions.
#LANTERN_OWNER_EMAIL=

# --- Telegram bot mirror ---
#
# When WhatsApp's Signal session is in a stale-key 'Waiting for this
# message' loop, bridge replies still need to reach you on your phone.
# Configure a Telegram bot here and every /lantern reply, /bot
# confirmation, pairing notification, etc. ALSO arrives via Telegram
# instantly with no E2E key issues.
#
# Setup (90 seconds):
# 1. On Telegram, message @BotFather → /newbot → follow prompts
# → paste the bot token below.
# 2. Send your new bot any message ("hi") from your account.
# 3. Get your chat id: open
# https://api.telegram.org/bot<TOKEN>/getUpdates and look for
# result[0].message.chat.id (an integer). Paste below.
#
# Unset = silently disabled; the bridge still tries WhatsApp only.
#LANTERN_OWNER_TELEGRAM_BOT_TOKEN=
#LANTERN_OWNER_TELEGRAM_CHAT_ID=

# ============================================================================
# IMESSAGE BRIDGE (macOS only)
# ============================================================================
#
# Native iMessage bridge — reads ~/Library/Messages/chat.db and sends via
# AppleScript/JXA on Messages.app. Requires:
# 1. macOS host signed into iMessage
# 2. Full Disk Access for the binary that runs `make run-imessage-bridge`
# (System Settings → Privacy & Security → Full Disk Access)
# 3. Automation permission for the same binary, with Messages enabled
# (System Settings → Privacy & Security → Automation → enable Messages)
#
# Start with: make run-imessage-bridge
#
#LANTERN_IMESSAGE_BRIDGE_PORT=3200
#LANTERN_IMESSAGE_BRIDGE_BIND=127.0.0.1
#LANTERN_IMESSAGE_BRIDGE_TOKEN=
#LANTERN_IMESSAGE_BRIDGE_ORIGIN=http://localhost:3001
#
# Your own iMessage handle (phone with +country, or email). The
# control-plane uses this for send-self delivery (Morning Brief etc.).
#LANTERN_IMESSAGE_OWNER_HANDLE=+15551234567
#
# Optional: separate agent name for iMessage vs WhatsApp so style cues
# can differ. Falls back to LANTERN_AGENT_NAME, then "imessage-assistant".
#LANTERN_IMESSAGE_AGENT_NAME=imessage-assistant

# ============================================================================
# PERSONAL DOCS AGENT (macOS only — searches local files via Spotlight)
# ============================================================================
#
# When you text yourself in WhatsApp or iMessage self-chat, the agent
# can search your Mac for files and answer questions. SECURITY: only
# fires for owner-sent messages in self-chat. Path-restricted.
#
# Colon-separated absolute paths the agent is allowed to search.
# Defaults: ~/Documents, ~/Desktop, ~/Library/Mobile Documents/com~apple~CloudDocs
# (iCloud Drive). Override:
#LANTERN_PERSONAL_DOCS_ROOTS=/Users/you/Documents:/Users/you/Notes:/Users/you/Projects
#
# Per-search result cap (default 8).
#LANTERN_PERSONAL_DOCS_MAX_RESULTS=8
#
# Per-read character cap (default 12000 — ~3000 tokens of context).
#LANTERN_PERSONAL_DOCS_MAX_CHARS=12000
#
# Optional: install poppler for full PDF text extraction:
# brew install poppler
# Without it, PDFs fall back to Spotlight-indexed preview text
# (works but limited to ~1000 chars per file).

# ============================================================================
# INFRASTRUCTURE (typically set by docker-compose, not .env.local)
# ============================================================================
Expand Down
10 changes: 10 additions & 0 deletions .github/CODEOWNERS
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
# Copy to .github/CODEOWNERS in your target repo.
# CODEOWNERS + branch protection = the human merge gate the agents cannot bypass.
# Require review from these owners on every PR to a protected branch.

* @dshakes
# Tighten high-blast-radius areas so a human MUST review agent changes there:
/.github/workflows/ @dshakes
/sdlc/ @dshakes
/infra/ @dshakes
/**/migrations/ @dshakes
102 changes: 102 additions & 0 deletions .github/workflows/build-images.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
# build-images — builds, pushes, and cosign-signs the deployable Lantern service images
# that Helm/Terraform reference (ghcr.io/dshakes/lantern/<name>). Runs on push to master
# and on demand (workflow_dispatch). Each image is tagged with the git SHA and `latest`.
#
# Signing is Sigstore KEYLESS (Fulcio short-lived cert + Rekor), identical in trust to
# sign-images.yml — the signing identity IS this workflow file. We sign INLINE here
# (rather than `uses: ./.github/workflows/sign-images.yml`) so we can sign the exact
# pushed DIGEST that build-push-action returns, which is the tamper-proof thing to sign.
#
# Image-name mapping matches what the Helm charts pull (infra/helm/lantern/values.yaml):
# control-plane, gateway, model-router, runtime-manager, runtime-scheduler, web (dashboard).
# Build contexts differ per service:
# - Go (control-plane, runtime-scheduler): context = repo root (Dockerfiles COPY gen/go/).
# - Rust (gateway, model-router, runtime-manager): context = the service dir (COPY . .).
# - dashboard (apps/web): context = apps/web (COPY package*.json ./ then COPY . .).
#
# Action SHAs are pinned (same convention as sdlc-qa.yml / sign-images.yml).
name: "build-images (push + cosign sign)"

on:
push:
branches: [master]
workflow_dispatch:

# Least privilege: read the repo, write packages to ghcr, and mint the OIDC token that
# keyless cosign signing requires. No long-lived secrets.
permissions:
contents: read
packages: write
id-token: write

concurrency:
group: build-images-${{ github.ref }}
cancel-in-progress: false

env:
REGISTRY: ghcr.io
IMAGE_PREFIX: ghcr.io/dshakes/lantern

jobs:
build:
name: build (${{ matrix.image }})
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
include:
- image: control-plane
context: .
file: services/control-plane/Dockerfile
- image: runtime-scheduler
context: .
file: services/runtime-scheduler/Dockerfile
- image: gateway
context: services/gateway
file: services/gateway/Dockerfile
- image: model-router
context: services/model-router
file: services/model-router/Dockerfile
- image: runtime-manager
context: .
file: services/runtime-manager/Dockerfile
- image: web # dashboard — Helm pulls .../lantern/web (apps/web)
context: apps/web
file: apps/web/Dockerfile
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2

- name: Install cosign
uses: sigstore/cosign-installer@7e8b541eb2e61bf99390e1afd4be13a184e9ebc5 # v3.10.1

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@f7ce87c1d6bead3e36075b2ce75da1f6cc28aaca # v3.9.0

- name: Log in to ghcr
uses: docker/login-action@c94ce9fb468520275223c153574b00df6fe4bcc9 # v3.7.0
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: Build and push
id: build
uses: docker/build-push-action@10e90e3645eae34f1e60eeb005ba3a3d33f178e8 # v6.19.2
with:
context: ${{ matrix.context }}
file: ${{ matrix.file }}
push: true
tags: |
${{ env.IMAGE_PREFIX }}/${{ matrix.image }}:${{ github.sha }}
${{ env.IMAGE_PREFIX }}/${{ matrix.image }}:latest
provenance: false
cache-from: type=gha,scope=${{ matrix.image }}
cache-to: type=gha,mode=max,scope=${{ matrix.image }}

# Sign the immutable digest (not a mutable tag) so the signature can't be
# re-pointed at a different image later.
- name: Sign image (keyless)
env:
COSIGN_YES: "true"
DIGEST_REF: ${{ env.IMAGE_PREFIX }}/${{ matrix.image }}@${{ steps.build.outputs.digest }}
run: cosign sign --recursive "$DIGEST_REF"
56 changes: 56 additions & 0 deletions .github/workflows/deploy-docs.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
# Build the docs site (apps/docs) as a static export and deploy to GitHub Pages.
# The site is pure static prose (next.config: output "export"), so this produces
# plain HTML served from Pages — no server, free hosting.
name: "deploy docs (github pages)"

on:
push:
branches: [master]
paths:
- "apps/docs/**"
- ".github/workflows/deploy-docs.yml"
workflow_dispatch: {}

# Pages deploy needs these; least-privilege otherwise.
permissions:
contents: read
pages: write
id-token: write

# One in-flight deploy at a time; don't cancel a running deploy.
concurrency:
group: pages
cancel-in-progress: false

jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
- uses: actions/setup-node@a0853c24544627f65ddf259abe73b1d18a591444 # v5.0.0
with:
node-version: "20"
- name: Install deps
run: cd apps/docs && npm ci
- name: Build static export
env:
# Repo is github.com/dshakes/lantern → Pages at /lantern. Unset for a custom domain.
PAGES_BASE_PATH: /lantern
run: cd apps/docs && npm run build
- name: Disable Jekyll (serve _next/* dirs)
run: touch apps/docs/out/.nojekyll
- name: Upload Pages artifact
uses: actions/upload-pages-artifact@7b1f4a764d45c48632c6b24a0339c27f5614fb0b # v4.0.0
with:
path: apps/docs/out

deploy:
needs: build
runs-on: ubuntu-latest
environment:
name: github-pages
url: ${{ steps.deployment.outputs.page_url }}
steps:
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@d6db90164ac5ed86f2b6aed7e0febac5b3c0c03e # v4.0.5
29 changes: 29 additions & 0 deletions .github/workflows/docs-links.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
# Docs links — PR gate that fails when a Markdown link points at a missing file
# or a non-existent #anchor. Catches doc link-rot (e.g. ADR renumbers, dead
# in-page anchors) before it ships. Pure Node, no install step → fast.
#
# Named job "docs-links" so it can be pinned as a required branch-protection check.

name: "sdlc · docs-links"

on:
pull_request:
types: [opened, synchronize, reopened]

permissions:
contents: read

concurrency:
group: docs-links-${{ github.event.pull_request.number }}
cancel-in-progress: true

jobs:
docs-links:
name: docs-links
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
fetch-depth: 0
- name: Check internal documentation links
run: node scripts/check-docs-links.mjs
Loading