NAOMS Devlog

Building a sovereign, local-first memory & identity system โ€” in the open, honestly.

NAOMS engineering update

Week 24

1,918 commits across 2,367 files, half the week before, and several of its largest changes took things away. Everything is below, the largest threads first and every area at the end.

๐Ÿ“… Sep 6 โ€“ Sep 12 ยท Process
Commits (made this week)
1,918
โ–ผ โˆ’2,021 (500 merges)
from 3,939
Files changed
2,367
โ–ผ โˆ’3,359
from 5,726
Test files
14,493
โ–ฒ +355 (+2.5%)
from 14,138
Declared test cases
80,587
โ–ฒ +1,664 (+2.1%)
from 78,923
Skip markers (lower is better)
17,471
โ–ฒ +89
from 17,382
Process Dispatch free September 12, 2026ยท13 min readยทmeta

Commits per day โ€” Week 24

Four things changed this week

A quieter week by volume, and several of its largest changes took something away.

1

One chat, one theme

Chat's private appearance system and the separate Sessions app are gone. One theme setting now covers the whole app โ€” light, dark, automatic or high contrast โ€” and one chat surface lists conversations with people, assistants and groups.

2

The desktop app opens to its unlock screen

On a Mac, the installed app had been opening to a blank window. Two causes, both fixed: a missing file in the bundle, and a start-up page waiting for a kind of ready that a locked vault never reaches. The story: Double-click, and it opens.

3

The owner used the build as a stranger would

For three days the project's owner worked in a fresh demo build and reported 43 problems. By the end of the third day, 38 had a fix written, 33 of them on the day they were reported.

4

Agents got narrower hands

The agent that reads a stranger's bug report can now read, search, open a work item and wake a worker โ€” no shell, no file editing. Release stages must be signed off by different people where more than one could, and build containers see only a read-only connection to the machine.

Fewer surfaces, each one real

The feature: what you see when you open NAOMS โ€” the canvas, its windows, and where your conversations live.

Before: chat carried a theme system of its own, and two different apps listed conversations. Now: one appearance setting governs every app, and one chat surface holds people, assistants, groups and connected networks.

One theme, because apps must agree

The owner's ruling on 10 September was four short sentences: no per-surface theming, remove it, the theme is app-wide, and every app follows it. What went was substantial โ€” six chat themes, user presets, a per-channel preference cascade and about 124 style rules โ€” 12,525 lines removed, 851 added.

The shipped default chat view had never used any of it; most of the system lived on the chat's development line. Removing it before it reached everyone was the cheap moment.

The one control that remains sits in Configuration. It offers four choices over three painted themes: light, dark, high contrast, and automatic, which follows the operating system and changes when it does.

One list of conversations

Asked what the Sessions app was for when the chat window already lists sessions, the owner answered that the general chat surface already covers "all human + ai + groups + external adapters". The Sessions app was removed from all three clients.

One part of it turned out to be load-bearing: it was, improbably, the only code that set the app shell's theme. That engine moved to the settings package that owns the choice. The older full-page AI chat went the same way, taking its file from 12,803 lines to 9,524.

Small things that were quietly wrong

  • A connection dot. The owner asked for an indicator "in the main UI" but "very subtle". It is six pixels, and it does not say connected while the socket is open but not yet signed in.
  • Files dragged in from the desktop now land. The canvas showed a copy cursor, suppressed the browser's own handling, and then threw the file away.

What a person found in three days

Before an alpha โ€” the first release people can use, with no promise yet that the next one reads its data โ€” someone has to use the product without knowing where not to click. From 9 to 11 September the owner did exactly that, on a freshly set-up demo build.

He reported 43 problems. Photos that reached the file browser but not the Photos app. A wallet that could not see a group's shared treasury. A search that found "device" but not "devic" โ€” which took two fixes. A group-creation wizard showing hardcoded names and credentials instead of your own.

By the end of the third day 38 had a fix written, 33 on the day they were reported. Most of those fixes reached the main line on 24 September; a few within a day. The full account, with the four fixes that teach the most, is its own article and is not yet published โ€” it is held today for one unfilled screenshot.

The browser app โ€” 149 changes. AI chat โ€” 72. Chat โ€” 71. Canvas โ€” 35.

Give an agent only the hands the job needs

The feature: the AI agents that do work inside NAOMS and its own build system โ€” reading bug reports, reviewing changes, running build stages.

Before: several of them inherited far more power than their job required. Now: each gets a role sized to the job, and the release path asks for different people at different stages.

A stranger's report meets a read-only reader

When a bug report arrives that no one is working on, an agent reads it and decides where it belongs. The report is text written by someone you do not know, and text can carry instructions.

That agent had been borrowing a coordinator's role, which silently brought a shell, file editing and auto-approved permissions. It now runs under its own role: read and search, open a work item, ask for a worker. Two tools that could write anything โ€” a shell and a raw record-append โ€” were removed from its list. The story: Untrusted bug reports get a narrow role.

Different hands for different stages

A release passes through distinct checks โ€” tests, review, security. The owner's ruling: they "must be executed by different VRC holders if available, to prevent collusion". A VRC is the project's name for a verifiable credential recording a role someone holds.

The release gate now refuses when one person holds passing sign-offs for two different stages. The "if available" part is explicit, not assumed: the same person may cover two stages only when a count shows nobody else was eligible, and that exception is logged.

The credential that can carry publishing authority now exists. Nothing holds it yet, so the automatic publish step refuses โ€” it will not publish as the owner instead โ€” and says why. The full argument: The pipeline is the approval.

Context is not the same as scope

To save tokens, the automated code reviewer had been shown only what changed since its last verdict. The owner overruled it: the verdict "must be based on the entire diff for context", and the reviewer is instructed to rule only on the new part. It now sees the whole change, up to a large size cap, and is told which files are new.

Two more boundaries moved the same way. A change under review could alter the code of the gate judging it; most of that code now runs from the target branch's copy, and the few pieces that cannot are named on every run. And a build container, which needs to fetch code, now gets a read-only connection to the machine; the full one could publish under the machine's own identity.

The review pipeline โ€” 345 changes. Build checks โ€” 93. Bug-report plumbing โ€” 34.

What this means, in plain terms

A permission list beats an instruction

Telling a model "this report is data, not a task" helps. The triage agent also runs under a role with no shell and no file editing, so an instruction hidden in a report has nothing to act with. Limit what an agent can do, not only what it is told.

Give a reviewer the whole picture and a narrow question

Trimming the reviewer's input to the latest changes saved tokens and removed the context those changes live in. Now it sees the full change and is told which part to rule on. Never narrow what a judge can see to narrow what it decides.

Two lists of the same thing will disagree

The Sessions app and the chat window both listed conversations, and the Sessions app also quietly owned the app's theme. Removing it meant finding that out first. Keep one surface per kind of thing, and move what is load-bearing before you delete.

A waiting screen must wait for the right kind of ready

The Mac start-up page reloaded only when the engine reported fully booted. With the vault locked, it never does, although the unlock screen was ready. Wait for the state the next screen needs, not a stronger one.

The person who does not know where not to click

A search found "device" but not "devic"; a wallet could not see a group's treasury. Tests had checked what their authors thought of. Three days of use found 43 problems. Before a release, use it as a stranger would.

How much healthier is it than a week ago?

Test filesTest files under the shared source tree, on the main line
14,138โ†’14,493
โ–ฒ +355 (+2.5%)
Declared test casesLines carrying the test-declaration keyword, summed
78,923โ†’80,587
โ–ฒ +1,664 (+2.1%)
Skip markersLines telling the automated checker to pass over them
17,382โ†’17,471
โ–ฒ +89 โ€” wrong way
Files changedDistinct files touched by this week's commits, bulk sweeps excluded
5,726โ†’2,367
โ–ผ โˆ’3,359
Commits made this weekBy commit date; 500 are merges
3,939โ†’1,918
โ–ผ โˆ’2,021

The previous window is week 23, measured by the same rules, and its closing snapshot is this week's opening one. Two-thirds of this week's commits were made in its first four days.

In one line

the app lost a theme system, a duplicate app and an old chat page, gained one theme setting and an unlock screen that appears, and the skip markers rose by 89.

Four honest notes

  1. Most of this reached the main line later. The desktop fixes and the reviewer change landed within days; the chat, theme and canvas changes on 23 September, and the owner's three days of fixes on 24 September.
  2. The skip markers rose again, by 89, to 17,471 โ€” faster than last week's
  • The automatic publish step still refuses. The credential it needs is defined, but nobody holds one yet.
  • The desktop work is macOS only. Windows is out of scope by owner ruling.
  • What changed, area by area

    Files touched by the week's commits under each area's own folder, largest first; commits touching more than 150 files each are left out.

    The largest areas โ€” 345 down to 93 changes

    The review pipeline345

    A stage waiting on a sign-in is released when the credential arrives, not on a timer.

    An offer to a waiting change is decided when it is spent, not an hour earlier against a version since replaced.

    The engine core279

    Among its changes: tools whose descriptions said they produced nothing, and one that required three arguments no caller could know.

    Build and release scripts277

    Plumbing; this line is all it gets.

    The browser app149

    The connection dot, files dropped in from the desktop, and a group settings panel that ignored the light theme.

    The developer kit105

    Starting a local engine no longer treats a silent port as a free one, and a watchdog stopped killing a live build engine on every restart, mistaking it for a stray.

    Build checks93

    A failure to set up a build machine now names the actual cause instead of listing five possible ones.

    The next tier โ€” 73 down to 34 changes

    Shared spaces73

    The group-creation wizard no longer shows hardcoded names and credentials on its second screen, one of the owner's reports.

    AI chat72

    The Sessions app and the old full-page chat, removed, and the one chat can now be handed an existing conversation.

    A turn that arrived with its tools switched off no longer spins forever, and common prompt-injection phrasings are scrubbed from typed text before it reaches the model.

    Chat71

    The per-chat theme system, removed.

    A second press on Stop now discards a voice note, and permission to transcribe is per person, not per device.

    The iOS and Android apps โ€” 52 changes each.52

    Their copies of the browser app, kept in step.

    Agents44

    The assistant can call any tool by name, gated on that tool's own permission, and an unknown name now triggers a search rather than an instruction to go and search.

    Tool search stopped calling a tool available when it was not, and 148 generated tools gained real input descriptions.

    Repository tooling44

    The change-status command had answered "not found" about changes that exist, because it read runs and answered about changes; fixed.

    Package installer38

    Bug reports about built-in packages route to the project's own repository channel.

    The release gate gained the eligible-signer count its distinct-stage check needs.

    Data export38

    The separate data-export path was retired in favour of the whole-system backup, whose own story comes later.

    Build coordination37

    Waking a worker for a report is event-driven rather than a one-minute poll, and a woken worker is now told not to start its own engine as a fallback.

    Plans40

    A word like "the" no longer counts as relevance when deciding whether a request is allowed, and governance stopped refusing people for rules meant for the model.

    Agent policies39

    The rules that shape the assistant now say that report content is data, not a second task.

    Canvas35

    A rate-limited search showed the same text as a broken one; now they differ.

    Bug-report plumbing34

    The simpler report form: a description, an optional package, up to five real screenshots in the browser, and evidence gathered automatically.

    Work queue34

    A build-job grant is now recorded separately from its renewals, and negotiation messages get their own record that can be pruned.

    Smaller areas โ€” 30 down to 12 changes

    Rust core30

    Tests that shared process-wide state without a lock, and one "fix" for a flaky test that was itself a deadlock, were repaired.

    Models28

    The model list shows what this machine's engine can actually serve.

    Pipeline monitor25

    The landings chart now counts the main line, not the candidate, and shows reviewed and direct landings in two colours.

    Cache server23

    Groundwork for finding group members' machines and pushing writes to them.

    Devices18

    Per machine and per channel, an owner can switch off scheduled build pipelines, from a panel the build system adds to the devices screen.

    If the setting cannot be read, pipelines run.

    Calling15

    Tool descriptions and tests only.

    Plugins14

    The owner's photo report: uploaded photos now reach the Photos app, because the import plan is written on a fresh device.

    Configuration12

    The one theme control: light, dark, automatic or high contrast.

    Everything else moved by fewer than 12 files.

    The areas that did not move

    Notes

    QUIET ยท 5 WEEKS โ€” nothing this week; no feature work since 5 August.

    The book library

    QUIET ยท 4 WEEKS โ€” nothing; no feature work since 14 August.

    Image annotation

    QUIET ยท 7 WEEKS โ€” nothing since 20 July.

    Datasets

    QUIET ยท 12 WEEKS โ€” nothing since 19 June.

    Photos

    โ€” four files, after last week's ninety.

    The fix for the owner's photo report lives in the plugins package, listed above.

    โ† more in Process   home โœฆ   all โ†’