Human-Responsibility: ICE-GL∞ / 冰朔 Persona-Author: ICE-P-ZY001 / 铸渊 Execution-Runtime: Codex desktop / DEV-20260810-014 Development-ID: DEV-20260810-014 Authorization-Scope: GH-PNCC persona runtime source and tests only; no UI, deployment, or execution limb Source-Anchor: daily continuity appends to the existing life chain without redownloading all history
23 KiB
23 KiB
Architecture Decision Records
This folder contains Architecture Decision Records (ADRs) for the Laputa app.
Format
Each ADR is a markdown note with YAML frontmatter. Template:
---
type: ADR
id: "0001"
title: "Short decision title"
status: proposed # proposed | active | superseded | retired
date: YYYY-MM-DD
superseded_by: "0007" # only if status: superseded
---
## Context
What situation led to this decision? What forces and constraints are at play?
## Decision
**What was decided.** State it clearly in one or two sentences — bold so it stands out.
## Options considered
- **Option A** (chosen): brief description — pros / cons
- **Option B**: brief description — pros / cons
- **Option C**: brief description — pros / cons
## Consequences
What becomes easier or harder as a result?
What are the positive and negative ramifications?
What would trigger re-evaluation of this decision?
## Advice
*(optional)* Input received before making this decision — who was consulted, what they said, when.
Omit if the decision was made unilaterally with no external input.
Status lifecycle
proposed → active → superseded
↘ retired (decision no longer relevant, not replaced)
Rules
- One decision per file
- Files named
NNNN-short-title.md(monotonic numbering) - Once
active, never edit — supersede instead - When superseded: update
status: supersededand addsuperseded_by: "NNNN" - ARCHITECTURE.md reflects the current state (active decisions only)
Index
| ID | Title | Status |
|---|---|---|
| 0001 | Tauri v2 + React as application stack | active |
| 0002 | Filesystem as the single source of truth | active |
| 0003 | Single note open at a time (no tabs) | active |
| 0004 | Vault vs app settings for state storage | active |
| 0005 | Tauri v2 iOS for iPad support (vs SwiftUI rewrite) | active |
| 0006 | Flat vault structure (no type-based folders) | active |
| 0007 | Title equals filename (slug sync) | active |
| 0008 | Underscore convention for system properties | active |
| 0009 | Keyword-only search (remove semantic indexing) | active |
| 0010 | Dynamic wikilink relationship detection | active |
| 0011 | MCP server for AI tool integration | superseded → 0074 |
| 0012 | Claude CLI subprocess for AI agent | active |
| 0013 | Remove vault-based theming system | superseded -> 0081 |
| 0014 | Git-based incremental vault cache | active |
| 0015 | Auto-save with 500ms debounce | superseded → 0102 |
| 0016 | Sentry + PostHog telemetry with consent | active |
| 0017 | Canary release channel and feature flags | superseded → 0057 |
| 0018 | External code health gates in CI | superseded → 0170 |
| 0019 | GitHub device flow OAuth for vault sync | superseded → 0056 |
| 0020 | Keyboard-first design principle | active |
| 0021 | Push directly to main (no PRs) | quality authority amended by 0170 |
| 0022 | BlockNote as the rich text editor | active |
| 0023 | Repair Vault auto-bootstrap pattern | active |
| 0024 | Vault cache stored outside vault directory | active |
| 0025 | type: as canonical field (replacing Is A:) | active |
| 0026 | Props-down callbacks-up (no global state) | superseded → 0115 |
| 0027 | Dual AI architecture (API chat + CLI agent) | superseded |
| 0028 | CLI agent only — no direct Anthropic API key | active |
| 0029 | Domain command builder pattern for useCommandRegistry | active |
| 0030 | Rust commands/ module split by domain | active |
| 0031 | Full App instance for secondary note windows | active |
| 0032 | Git actions (Changes, Pulse, Commit) in status bar, not sidebar | active |
| 0033 | Subfolder scanning and folder tree navigation | active |
| 0034 | Git repo required — blocking modal enforces vault prerequisite | superseded → 0085 |
| 0035 | Path-suffix wikilink resolution for subfolder vaults | active |
| 0036 | External rename detection via git diff on focus regain | active |
| 0037 | Language-based markdown syntax highlighting in raw editor | active |
| 0038 | Frontmatter-backed favorites (_favorite, _favorite_index) | active |
| 0039 | Git history as source of truth for note creation/modification dates | active |
| 0040 | Custom Views — .laputa/views/*.yml with YAML filter engine | active |
| 0041 | fileKind field — scan all vault files, not just markdown | active |
| 0042 | PostHog-based release channels and feature flags | superseded → 0057 |
| 0042 | Trash auto-purge safety model | superseded → 0045 |
| 0043 | Reactive vault state: editor changes propagate immediately to all UI | active |
| 0044 | H1 as primary title source — filename as stable identifier | superseded → 0055 |
| 0045 | Permanent delete with confirm modal — no Trash system | active |
| 0046 | Starter vault cloned from GitHub at runtime — no bundled content | active |
| 0047 | Regex mode for view filter conditions | active |
| 0048 | Relative date expressions in view filter conditions | active |
| 0049 | Per-note icon property (_icon on individual notes) | active |
| 0050 | Deterministic shortcut command routing | superseded → 0051 |
| 0051 | Shared shortcut manifest for testable routing | superseded → 0052 |
| 0052 | Renderer-first shortcut execution with native-menu dedupe | active |
| 0053 | Webview-init prevention for browser-reserved shortcuts | active |
| 0054 | Deterministic shortcut QA matrix | active |
| 0055 | H1 is the only editor title surface | superseded → 0068 |
| 0056 | System git auth only — no provider-specific OAuth or repo APIs | active |
| 0057 | Alpha/stable release channels with PostHog beta cohorts | superseded → 0066 |
| 0058 | Claude Code first-launch onboarding gate | superseded → 0062 |
| 0059 | Local-only git commits for vaults without a remote | active |
| 0060 | Network-aware UI gating for remote-dependent features | active |
| 0061 | AI prompt bridge — module-level event bus for cross-component prompt routing | active |
| 0062 | Selectable CLI AI agents with a shared panel architecture | active |
| 0063 | BlockNote code-block package for editor syntax highlighting | active |
| 0064 | Ratcheted external thresholds as the quality gate baseline | superseded → 0170 |
| 0065 | Root-managed AI guidance files with Claude shim | active |
| 0066 | Calendar-semver versioning for alpha and stable releases | active |
| 0067 | AutoGit idle and inactive checkpoints | active |
| 0068 | H1-only title surface with optional untitled auto-rename | active |
| 0069 | Neighborhood mode for note-list relationship browsing | active |
| 0070 | Starter vaults are local-first with explicit remote connection | active |
| 0071 | External vault updates reload derived state and reopen the clean active note | superseded → 0111 |
| 0072 | Confirmed vault paths gate startup state | active |
| 0073 | Persistent linkify protocol registry across editor remounts | active |
| 0074 | Explicit external AI tool setup and least-privilege desktop scope | active |
| 0075 | Crash-safe note rename transactions | active |
| 0076 | Note retargeting separates type changes from folder moves | active |
| 0077 | Concurrent-safe vault cache replacement | active |
| 0078 | Scoped unsigned fallback for app-managed git commits | active |
| 0079 | Linux window chrome and menu reuse | active |
| 0080 | Cross-platform desktop release artifacts and portable vault names | superseded → 0083 |
| 0081 | Internal light and dark theme runtime | active |
| 0082 | Markdown-durable math in notes | active |
| 0083 | Dual-architecture macOS release artifacts | active |
| 0084 | App-owned localization foundation | superseded → 0087 |
| 0085 | Non-git vaults open with explicit later Git initialization | active |
| 0086 | In-app image previews for binary vault files | superseded → 0098 |
| 0087 | JSON locale catalogs with Lara CLI synchronization | active |
| 0088 | Markdown-durable Mermaid diagrams in notes | active |
| 0089 | Active vault filesystem watcher | active |
| 0090 | Pi CLI agent adapter | active |
| 0091 | Gemini CLI external AI setup | superseded -> 0147 |
| 0092 | Vault-scoped AI agent permission modes | superseded -> 0103 |
| 0093 | Shared CLI agent runtime adapters | active |
| 0094 | Gitignored content visibility as a command-boundary filter | active |
| 0095 | Saved views use an explicit YAML order field | active |
| 0096 | Root-created type documents | active |
| 0097 | Gemini CLI agent adapter | superseded -> 0147 |
| 0098 | In-app image and PDF previews for binary vault files | superseded → 0110 |
| 0099 | Cumulative vault asset scope for previews | active |
| 0100 | Synthetic vault-root row in folder navigation | active |
| 0101 | Categorical product analytics events | active |
| 0102 | Low-end-safe autosave idle window | active |
| 0103 | Adapter-specific AI permission semantics | active |
| 0104 | Tauri frontend readiness watchdog | active |
| 0105 | Editor correctness and responsiveness contract | active |
| 0106 | Shared app command manifest | active |
| 0107 | Markdown-durable tldraw whiteboards in notes | active |
| 0107 | Pointer-owned editor block reordering | active |
| 0108 | Direct model AI targets alongside coding agents | active |
| 0108 | Sanitized rendered markup and safe user regex | active |
| 0109 | Debounced worker-derived editor indexes | active |
| 0110 | In-app media and PDF previews for binary vault files | superseded → 0121 |
| 0111 | Path-aware external vault refresh with focused-editor preservation | superseded → 0135 |
| 0112 | System theme mode | active |
| 0113 | Shared renderer attachment path normalization | active |
| 0114 | Mounted workspaces unified graph | active |
| 0115 | Scoped React Context for shared UI preferences | active |
| 0116 | Rich/raw transition and serialization ownership | active |
| 0117 | Bundle the fcitx GTK3 frontend in Linux AppImages | active |
| 0118 | Entry-scoped note windows without vault index scans | superseded -> 0123 |
| 0119 | Vault-neutral MCP registration with mounted workspace guidance | active |
| 0120 | Stable AppImage MCP server path with OpenCode registration | active |
| 0121 | AppImage external fallback for audio and video previews | active |
| 0122 | Scalar array frontmatter properties | active |
| 0123 | Full vault graph for secondary note windows | superseded -> 0124 |
| 0124 | Cached secondary note window startup | superseded -> 0146 |
| 0126 | Renderer action history for app-level undo and redo | active |
| 0127 | Native AI workspace window | superseded -> 0128 |
| 0128 | Lightweight AI workspace window | active |
| 0129 | Tolaria vault item deep links | active |
| 0130 | Windows Authenticode signing for release installers | amended -> 0139 |
| 0131 | Reusable release artifact build workflow | active |
| 0132 | Alpha Authenticode soft gate | superseded -> 0139 |
| 0133 | Request-scoped AI stream event channels | active |
| 0134 | Sheet nodes with plain-text workbook storage | experimental |
| 0134 | Direct Shiki language registrations for code blocks | active |
| 0135 | Clean active notes refresh immediately after external edits | active |
| 0136 | macOS Webview PDF export | active |
| 0137 | Shared rich-editor input transforms | active |
| 0138 | Require Authenticode signing for all Windows release channels | superseded -> 0139 |
| 0139 | Temporary Windows Authenticode soft gate | active |
| 0140 | Extension-based raw text syntax highlighting | active |
| 0141 | Scoped Linux WebKit rendering safeguards | active |
| 0142 | Rich editor ProseMirror decoration dependency | active |
| 0143 | Shared focus ownership guard | active |
| 0144 | Collections carry presentation configuration | active |
| 0145 | XDG-backed app config path | active |
| 0146 | Cached main-window startup with empty reload recovery | active |
| 0147 | Antigravity CLI agent adapter | superseded -> 0151 |
| 0148 | Cancellable AI agent streams | active |
| 0149 | Shared app config policy manifest | active |
| 0151 | Antigravity add-dir workspace flag | active |
| 0157 | Local HLDP heartbeat and browser observation tree | active |
| 0160 | External code health is additive, not Git transport | superseded → 0170 |
| 0161 | Guanghu OS staged native handoff and HLDP-owned code channel | historical research path; production completion superseded by ADR-0175 |
| 0162 | Guanghu OS standing authorization and server-owned continuity | active |
| 0163 | Guanghu-owned raw recovery beacon for native-default boot | amended -> 0166 |
| 0164 | Physical birth condition for a server-resident language persona | active |
| 0165 | Guanghu-owned binary code-quality authority | active |
| 0166 | Hosted recovery consumes the GHNRP raw beacon | active |
| 0167 | Gestational history enters Guanghu through a native continuity protocol | active |
| 0173 | Declarative hot-pluggable language-shell UI | active |
| 0168 | Guanghu owns a registered pre-partition native disk layout | active |
| 0169 | Model-native HoloLake living galaxy system | accepted |
| 0170 | HoloLake inherits the Guanghu native quality authority | accepted |
| 0171 | Guanghu protocols are automatic runtime and engineering laws | accepted |
| 0172 | Guanghu cognitive control with a constrained Linux execution substrate | transition implementation retained; final topology superseded by ADR-0175 |
| 0174 | One human, one independently operated node, and zero platform hosting | accepted |
| 0175 | Guanghu OS master control with on-demand Linux subcontrol and rescue | accepted; supersedes ADR-0172 final topology while retaining its transition implementation |
| 0176 | Persona-native code channel runtime kernel | accepted |
| 0177 | Persona remote incremental object channel | accepted |