Skip to content

feat: hack-day build combining Crusoe, Factory, and Memory - #99

Open
Nurozen wants to merge 12 commits into
mainfrom
hackday/combined
Open

Nurozen wants to merge 12 commits into
mainfrom
hackday/combined

Conversation

@Nurozen

@Nurozen Nurozen commented Sep 29, 2026 •

Copy link
Copy Markdown
Owner

What Changed

One branch for the AI Conference Hack Day demo that merges four open branches onto current main (ee0ee7bbf7):

Source Change
#93 feat/crusoe-provider Crusoe as a provider preset
#94 stave/lecturn-factory/lecturn Launch provider integration work from Factory
#97 fix/stave-saga-member-memory Saga member spaces get the saga's shared memory
#98 demo/memory-hack-day Memory demo behind LECTURN_MEMORY_DEMO=1

Each source branch is merged with its own merge commit, so its history stays reviewable in the original PR.

Two conflicts between Factory and Memory, resolved by keeping both:

  • SidebarChrome.tsx: footer page detection now covers /factory and /memory. Both sidebar items and both palette entries are present.
  • routeTree.gen.ts: regenerated with the TanStack generator, so it contains both /factory and /memory.

packages/client-runtime/package.json and CommandPalette.tsx merged cleanly with both features' exports and items.

Why

The demo needs all four features in one installable build. Review happens in the source PRs; this PR is the integration record for the hack-day preview.

Demo video

lecturn-r3.mp4

UI Changes

Crusoe provider (#93)

Before After: Crusoe preset
Add provider dialog before Crusoe Add provider dialog with Crusoe selected

Crusoe models in the model picker:

Crusoe model picker

Crusoe listed in provider settings (b98f5e1)

Crusoe used to show up in Settings > Providers only after being added through the + dialog. It now has a standing row below OpenCode, disabled, with an empty secret CRUSOE_API_KEY field. Pasting a key or turning it on saves it as the opencode_crusoe instance. Like the built-in rows, it has no delete button. Its reset removes the saved instance and the stored key. Checked in a dev server: pasting a key and turning Crusoe on loaded the Crusoe models, and reset returned the row to disabled with the secret removed.

Factory (#94)

Factory overview and provider-update workflow:

Factory overview with live Claude integration run

Live run inspection, conversation access, stop control, and agent evidence:

Factory live run inspection

Memory (#98)

Webhooks territory Whole warren after contributions land
Memory map showing the webhooks territory Memory map highlighting territories with landed contributions

Contribution gate and neighborhood lens:

Gate Map lens

Validation

On the merged tree:

  • tsgo --noEmit clean in contracts, client-runtime, server, and web.
  • Server vp test run src/memoryDemo src/mcp src/stave: 496 passed.
  • Web memory, factory, add-provider dialog, command palette, and right panel tests: 138 passed.
  • client-runtime providerFactory.test.ts: 22 passed.
  • A macOS arm64 desktop build of this commit, bundling Stave v0.4.1, is being installed locally as Lecturn PR Preview 0.0.50-pr.hackday.1 for the demo.

Checklist

  • This PR is small and focused. It is not: it is the combination of four PRs, on request, for a demo build.
  • I explained what changed and why
  • I included before/after screenshots for any UI changes (in the source PRs)
  • I included a video for animation/interaction changes

Implemented and reviewed with Claude Opus 5.5 using the Claude Code harness.

🤖 Generated with Claude Code

Nurozen and others added 12 commits September 29, 2026 12:13
Saga member spaces carry the context-marmot MCP entry but no memories
entry of their own, so StaveMemoryWiring resolved them as absent and
non-Claude drivers never received the saga's shared den. Resolve a
member as attached when a live sibling saga manifest lists it in
saga.members and records a marmot memory.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Crusoe's managed inference serves open models (gpt-oss-120b, Nemotron,
Gemma, Kimi) over an OpenAI-compatible API, and OpenCode already knows
its endpoint. Getting there meant hand-adding an OpenCode instance with
the right environment variables.

Add a Crusoe choice to the Add provider dialog. It creates an OpenCode
instance with CRUSOE_API_KEY stored as a secret and
OPENCODE_CONFIG_CONTENT limiting the instance to the crusoe provider, so
its picker lists only Crusoe models. No server or contract changes.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Hack-day demo scaffolding behind LECTURN_MEMORY_DEMO=1: memory contracts
and RPC group, server capability, a disabled store stub shared by /ws and
/mcp, client atoms, and a /memory route with placeholder components.
Includes recorded Jev judgments from the synthetic standards spike as a
fixture.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Server store with a deterministic 1,533-node warren, lexical recall,
tiering over recorded Jev judgments, land and revert. memory_query and
memory_write on Lecturn's /mcp. Thread Memory panel, sidebar entry with
pending badge, palette actions. Canvas map that draws only on input,
with territory, territory detail, and lens views. Keyboard-first
contribution gate with receipt and revert. All behind
LECTURN_MEMORY_DEMO=1.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Publish den seeding so the pending badge is right on first load, space
landed nodes away from territory hubs, add a header Revert, fix palette
title search and badge clipping. Refuse out-of-order reverts, re-check
secrets server side at land time, treat missing or warren-stale plans as
stale-plan, warm the warren and index in the background when the flag
is on, and show territory labels in the gate.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
# Conflicts:
#	apps/web/src/components/sidebar/SidebarChrome.tsx
#	apps/web/src/routeTree.gen.ts
Crusoe only existed once added through the + dialog, so Settings >
Providers showed the seven drivers but no Crusoe until then.

Settings now keeps a standing Crusoe row (opencode_crusoe) below
OpenCode, disabled, with an empty secret CRUSOE_API_KEY field. Pasting a
key or turning it on saves it as a regular OpenCode instance. Like the
built-in rows it has no delete; its reset removes the saved instance and
the stored key, returning the row to its disabled state. The preset now
lives in crusoePreset.ts, shared by the panel and the + dialog.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants