No description
  • Rust 93.2%
  • Swift 4.4%
  • HTML 0.8%
  • Common Lisp 0.5%
  • QML 0.3%
  • Other 0.5%
Find a file
Nathan Eckenrode 0233de2e6f M36 — the ghost answers where you clicked
Double-click a ghost card on Cmd+2 and a chat opens with her, synchronous, the
same ClaudeSession mechanism T.A.S.K.S.'s own window already proves. Nothing
here asks the tick loop for anything, so it works whether or not af64 runs.

I01 double-click on a ghost card opens her DM, never her note, never a drag.
I02 dpn_ghost_persona builds her system prompt from her own af64_ghost row —
    Vault.persona() was fixed to one note; this generalises it to any of the 64.
I03 GhostDMView, console-skinned, restoring history from png.conversations.
I04 Tile.Content.ghostDM(slug,name) + ghostdm: kind, so a DM tile survives a
    relaunch on the same machinery every other tile already gets.
I05 thumbs under every GHOST turn, never under Nathan's own lines.
I06 dpn_conversation_react — idempotent in SQL (metadata->>'reaction' IS NULL),
    so a turn is recognised once and cannot be farmed. dpn_chat_append and
    dpn_dm_append now return the inserted row id for it to land on.
I07 a turn renders as a NOTE — dpn_lens_render_text puts a spoken line through
    the same lens, so bold is bold and wikilinks open tiles. Avatar left, per
    I74's already-ruled shape. Both surfaces, one component.
I08 emoticons and :shortcodes: resolve to glyphs in the crate, ahead of the
    inline parse. Four tests, including one proving URLs and 09:30 survive.

:orchestrator-attention (+8) and :nathan-recognition (+75) fire for the first
time since they were written. Both are CLAMPED to the ceiling
agent_state_energy_check already enforces — attention paid to a rested ghost
must not fail, it simply has nothing left to add.

AND THE AMOUNTS LEFT THE CODE. png.energy_reward holds them, seeded from
energy.lisp's +energy-rewards+; the image reads it through energy-reward and
the crate joins it in SQL. Neither side carries a number. Adding a reward is a
row, not an edit on two sides.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MB5nZBA1FAao2XWqkwMJz2
2026-08-31 11:09:44 -04:00
.foundry lineage-mass: link [[Architectural Evolution]] (depth-4 fan-out + Conversation stamp) 2026-08-17 04:57:40 -04:00
.qwen/skills/auto-skill-stagecraft Espionage BUG-001 (1/3): soft-wrap the Hero paint — Paragraph::wrap(trim:false), the same wrap the dpn-locus scroll geometry already assumes; TDD test long_lines_soft_wrap_instead_of_clipping (.lor + .md) 2026-07-10 19:31:04 -04:00
.understand-anything adr: 0024 — one machine, many I/O devices 2026-08-01 12:28:04 -04:00
_external/rustcash dragonpunkos: three parallel shells; Schouwburg gets the note it never had 2026-08-24 17:14:39 -04:00
bootstrap wip 2026-06-27 18:11:10: README.md BlastDragon.ttf innatescript.ttf bootstrap.sh launch-dragonpunk.sh card-frame.rs 2026-06-27 18:11:10 -04:00
crates M36 — the ghost answers where you clicked 2026-08-31 11:09:44 -04:00
docs lineage-mass: link [[Architectural Evolution]] (depth-4 fan-out + Conversation stamp) 2026-08-17 04:57:40 -04:00
projects M36 — the ghost answers where you clicked 2026-08-31 11:09:44 -04:00
specs lineage-mass: link [[Architectural Evolution]] (depth-4 fan-out + Conversation stamp) 2026-08-17 04:57:40 -04:00
.gitignore schouwburg: move into the workspace at projects/schouwburg 2026-08-19 18:13:14 -04:00
Bastion.md lineage: backlink to [[Architectural Evolution]] (earn the #2 graph mass) 2026-08-17 04:48:53 -04:00
Cargo.lock dragonpunkos: three parallel shells; Schouwburg gets the note it never had 2026-08-24 17:14:39 -04:00
Cargo.toml hoard: the fourth face — ledger over a C ABI, exact decimals end to end 2026-08-20 16:34:01 -04:00
DragonpunkOS.md dragonpunkos: three parallel shells; Schouwburg gets the note it never had 2026-08-24 17:14:39 -04:00
JOURNAL.md M27: session-boundary journal breadcrumb (milestone shipped, M28 queued) 2026-06-01 18:10:14 -04:00
LICENSE License under AGPL-3.0 (house license for all projects) 2026-06-17 00:26:53 -04:00
META-HARNESS.md Add META-HARNESS.md — Citadel·Bastion·Fortress cross-substrate contract 2026-05-21 06:40:26 -04:00
README.md M15-I04: define env secret references 2026-05-28 00:30:19 -04:00
The Foundry.md dragonpunkos: three parallel shells; Schouwburg gets the note it never had 2026-08-24 17:14:39 -04:00

Bastion

Bastion is a portable whole-computer TUI workspace.

It is inspired by the shape of dpn-tui-next and the opinionated module model of Citadel, but it is intended to be a new portable application rather than a port of either project.

Vision

Bastion treats the computer as the workspace, not a single vault or a single project. A Bastion process is the same on every machine it runs on; the machine-specific wiring lives in ~/.config/bastion/ and is kept separate from the portable ~/Settings/*.md documents that describe the user's intent.

The core shell owns layout, focus, navigation, key handling, settings loading, and plugin lifecycle. Everything domain-specific — file browsers, editors, viewers, agent harnesses, project diagnostics — enters through the plugin contract. Plugins are first-party Rust crates compiled into the bastion binary, not dynamically loaded extensions. The same binary runs everywhere.

Current Slice

  • Citadel-style terminal UI built with Rust and Ratatui: Calendar over browser on the left, full-height Hero in the center, settings/plugins on the right.
  • LHSB: custom filesystem browser with create, read/open, rename, and trash commands.
  • Hero: scrollable selected file preview with syntax highlighting.
  • RHSB: built-in status/settings panel plus plugin panes.
  • Plugin API workspace with compiled-in Rust plugin crates.
  • RHSB clock and calendar plugins for portable time/date surfaces.
  • ~/Settings discovery for Markdown settings documents with type: "[[Settings]]" frontmatter and body fenced config blocks.
  • DPN-aligned terminal chrome using void/smoke/bone with cyan, magenta, purple, gold, and crimson accents.

LHSB Commands

  • Ctrl-Space / Ctrl-P: open the command palette.
  • Tab / Shift-Tab: move focus between Calendar, LHSB, Hero, and RHSB.
  • Enter: open selected directory or read the selected file into Hero preview.
  • n: create a file under the current LHSB directory.
  • N: create a directory under the current LHSB directory.
  • u: rename the selected entry.
  • Shift-D: move the selected entry to the platform trash after typing its name.
  • Backspace / Left: move to parent directory.
  • .: toggle hidden files.
  • r: refresh.

Command Palette

  • Command ids use <scope>:<action> form, for example lhsb:create-file and calendar:focus.
  • The palette shows command titles, shortcut hints, descriptions, and ids.
  • Adding commands is documented in docs/commands.md.

Hero Commands

  • e: toggle Hero preview/edit mode when Hero is focused.
  • j/k, Up/Down, PageUp/PageDown, Home/End: scroll Hero preview when Hero is focused.
  • Ctrl-S: save the current Hero edit buffer.
  • Esc: leave Hero edit mode or cancel an active prompt.

RHSB Plugin Commands

  • Calendar: h/l or left/right move one day, j/k or up/down move one week, [/] move one month, {/} move one year, T jumps to today, and Enter emits a selected-date event. The selected date persists in ~/.config/bastion/calendar.toml; week_start = "saturday" and other weekday names control header order. Week labels use the first configured week-start day of the year as W01, and ~/Settings/calendar.md can point Bastion at local daily notes for date navigation. Full notes live in docs/widgets/calendar.md.
  • Clock: renders local time plus up to three IANA timezones configured in ~/.config/bastion/clock.toml; supports 12h/24h display, optional seconds, and configurable accent color. Full notes live in docs/widgets/clock.md.

Create and rename prompts reject paths that leave the current LHSB directory. Delete uses trash semantics instead of direct removal.

Direction

Bastion treats the computer as the workspace. It should be able to move between machines while keeping machine-specific wiring separate from portable settings.

  • ~/Settings/*.md contains human-editable settings and control documents: frontmatter classifies the note, body fences configure the app.
  • ~/.config/bastion/ is reserved for local runtime configuration, caches, and plugin install state.
  • .env and other gitignored local files hold secrets and machine-local credentials; ~/Settings should reference environment variable names, not secret values. Use uppercase environment variable names, normally under YAML keys ending in _env.
  • Plugins declare panels, commands, file handlers, resource viewers, and settings schemas through explicit manifests and Rust trait implementations.
  • Plugins are compiled-in Rust crates. There is no dynamic plugin loading at runtime. Adding a plugin is a build-time concern, not an admin-time concern.
  • Plugin authoring notes live in docs/PLUGINS.md.

Roadmap

Phases are narrative groupings. Each phase decomposes into one or more Forgejo Milestones (in specs/Milestones/), each of which decomposes into Issues. The phases below describe shape and intent; the per-Milestone specs describe what ships.

Phase 1 — Foundation (in progress)

The portable framework. Everything that makes Bastion a working TUI workspace before any noosphere-specific wiring, machine-specific wiring, or external data sources enter. The framework must be complete enough that Phase 2+ work is strictly additive — no Phase 1 piece should require rework when Phase 2 lands.

Forgejo Milestones in specs/Milestones/:

  • M1-Pane-Focus-And-Switching.md
  • M2-Hero-Edit-Mode.md
  • M3-Command-Dispatcher-And-Palette.md
  • M4-Plugin-Trait-Contracts.md
  • M5-Refactor-Builtins-To-Plugins.md
  • M6-Calendar-Widget.md
  • M7-Clock-Widget.md

Phase 2 — Noosphere Integration

Bastion becomes useful as a noosphere editor. Markdown-aware Hero, wikilink resolution, daily-note opener, calendar wired to the Temporal/ cascade, doc indexer. This is where Bastion stops being a generic TUI workspace and starts being Nathan's noosphere editor on the Mac Studio.

Phase 3 — Federation

~/Settings/*.md synchronises across machines via a git remote (Forgejo by default). Machine-local state in ~/.config/bastion/ stays local. A Bastion running on the Mac Studio and a Bastion running on the laptop share portable intent without overwriting each other's local wiring. This is what makes the "portable whole-computer workspace" claim true.

Phase 4 — Agent Surfaces

Right-sidebar panels for Claudian, Nova, and Hermes. Chronicle viewer (addressable-mailbox view over master_chronicle.conversations). Thin REPL pane for agent-shape interactions. Demonstrates that the plugin model can host agent surfaces, not just file/edit tooling.

Team

Role Ghost
Owner NathanEckenrode
Spec author Claudian (laptop)
Builder Nova (Mac Studio)
Reviewer Claudian (laptop)

The workflow rotation follows the T.A.S.K.S. doctrine: 🜔 spec → ☤/☿ implement → 🜔 verify. For Bastion specifically: Claudian writes the spec, Nova builds and tests against it, Claudian verifies completion before close.

Project Board

Forgejo Milestones + Issues at forgejo.eckenrodemuziekopname.com/n8k99/bastion/milestones. The board is the source of truth for what is/isn't done; the spec .md files in specs/Milestones/ carry the longer-form objective + success criteria for each Milestone.

Repository

Primary remote: forgejo.eckenrodemuziekopname.com/n8k99/bastion.

Codeberg may become a public mirror once the project is further along.

Notes

The 4-tier spec model used by Citadel and Innatescript (Project > Milestone > Goal > Issue) is collapsed here to 3 tiers (README > Milestone > Issue) to match Forgejo's native primitives. The Project template content is absorbed into this README; the Goal layer is gone; what we used to call Goals are now Forgejo Milestones.