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 f6e5bf91bb The Swift shell's engine bridge, and the Daily Note save it broke
Mixed commit, and worth saying so: the bulk here is in-flight Bastion and
crate work that predates this session. What belongs to the Daily Note work is
the Swift shell.

Noosphere.setNoteBody read the reply with `call', which casts to a dictionary.
`note-body-set' is registered in the keyword convention and answers a BARE
boolean, so the cast failed, the function fell through to `!r.isEmpty' and
returned false after every successful save. ParchmentView.flush reads that as
a failed write and moves to its fallbacks; a Daily Note tile is addressed
`title://' and has no disk twin, so it wrote a rescue file and raised SAVE
FAILED, and save() will not call load() on a failed flush -- and load() is
what sets editing = false. Hence: the words were saved and the tile stayed in
the editor. It now reads the result raw.

CitadelBridge is `window.citadel.call(verb, payload)' lifted out of
EngineTileView so WebFace has it too. A vault web face could previously reach
the engine only through routes hand-written in VaultServer, one case per
question, which made every new question a build of this app. The dead
/country route is removed: the Dossier drawer asks dossier-entity,
country-factbook and dossier-story directly now.

CitadelLink gains raw(), because call() coerces to a dictionary and a verb
answering a bare array or boolean reached the caller as {} -- which is the
same fault, one layer down, that hid the save failure.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015Nm9e1e8qJvJYSUEWd9SjE
2026-09-24 06:13:32 -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 The Swift shell's engine bridge, and the Daily Note save it broke 2026-09-24 06:13:32 -04:00
docs lineage-mass: link [[Architectural Evolution]] (depth-4 fan-out + Conversation stamp) 2026-08-17 04:57:40 -04:00
projects The Swift shell's engine bridge, and the Daily Note save it broke 2026-09-24 06:13:32 -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 The Swift shell's engine bridge, and the Daily Note save it broke 2026-09-24 06:13:32 -04:00
Cargo.lock The Swift shell's engine bridge, and the Daily Note save it broke 2026-09-24 06:13:32 -04:00
Cargo.toml The Swift shell's engine bridge, and the Daily Note save it broke 2026-09-24 06:13:32 -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.