Repository navigation
v0.18.0
Added
-
Six boxes on the shelf that are identified and not designed:
security_review,machine_learning,seo_aeo,browser_tests,
message_broker,event_stream. Pending, asstripeandspecddare — a manifest
whosepending?/0is true, so the catalog lists them, the console
counts them under Not done andaddrefuses them — and each with
the two papers such a box can honestly have: aNEED.md, which the
catalog test asks of every cartridge, and a README that says what the
box is expected to bring and, under Open, what its design has to
settle before a line of installer is written. NoDESIGN.md, no
version, no test: there is nothing yet for them to be about.That made a second kind of pending visible, and the console was
saying one thing of both. Designed, not built was its line for
every box that is not done, true ofspecdd, whose design is
written, and false of these six the moment they appeared — and of
stripe, as it turns out, which has had a need and no design all
along. A pending box is now read as one of two stages:
designed when it carries aDESIGN.md, identified when its
need is all there is.ConsoleWeb.Cartridges.not_done/1reads it off
the papers on the mount, the way the Manual reads them, so no
manifest declares it and nothing has to be flipped: writing the
design is what moves the box. The chip's title, the reason the Files
screen is dark and the sentence that stands in for a missing summary,
on the box and in the shelf's list, all say it from that one place.They are named for the need and not for the tool, the rule
db_admin
andtest_doublesalready follow, because the tool is the part most
likely to become an option:message_brokerstarts from RabbitMQ and
event_streamfrom Kafka, each with Broadway in the project, and
either may offer another server the waydb_adminoffers four
admins.security_reviewis a review of the project against the
OWASP Top 10's current edition, kept as a file of the repository,
with the checks a machine can run (Sobelow,mix deps.audit,
mix hex.audit) behind one task to shorten it — the review is the
box, the tools are what speed it up.machine_learningis a model
served from inside the application with Nx — Bumblebee to load it, an
Nx.Servingin the supervision tree — where the usual answer is a
second service in another language.seo_aeois the one named by
its discipline, because that is the name the need goes by: what the
application emits so a search engine and an answer engine find and
quote its pages — metadata, sitemap, crawling rules, structured data
— with the answer-engine half as options the reader chooses, since
that half is young andllms.txtis a proposal, not a standard.
browser_testsis tests that drive the application through a real
browser — Playwright as a service of the workspace under a profile
upnever starts, the wayk6is — for what only a browser does: a
hook, an upload, a full navigation. The two messaging services go
aftermonitoringin the registry and the other four before the
services;
both services are expected to takemessaging, a role the vocabulary
has had since it was written and no box has used.More candidates were listed the same day (a notebook on the running
node, background jobs, tracing, type checks) and deliberately not
made boxes: choosing them and drawing where each one ends is analysis
that has not been done, and a shelf with more boxes pending than
built would read as a promise. The README names the eight pending
ones, by stage, in a tableassets/readme/build.pywrites from the
catalog. -
The Changes paper can throw the changes away, not only commit
them. The paper said what a dirty tree costs —addandeject
both want a clean one — and offered one way out of it: the commit.
The reader who had decided their changes were not worth keeping had
to leave the console for a terminal, which is the one thing the
console is for.wb.sh discardis the other way out: the tracked
files back to HEAD and the untracked ones gone, exactly what the
commit would have taken, and nothing git ignores —deps/and
_build/are the container's work, and throwing them away would cost
a recompile to undo nothing. It is the verbundo_failed_insert
already ran for an insert that failed, named and given to the reader.
The console keeps its side of the house:Console.Gitstill only
reads, the button runs the verb as a job, and the job waits for the
reader's word first, likedeleteandprune.The two live in the one card, whose foot now reads down and presses
across — the Deployments card's shape (2026-09-26) — each line the
danger card's three-cell grid: the command taking the width, the verb
at the right edge on--verb, the note under the command, where what
it says is what that command takes. Which cost Commit the row it had
been keeping to itself, with the button at the left and thewb.sh
line nowhere but in its title, and gained it the shape every other
box that runs a command already had. Discard went through a danger
card of its own under the files first, the waydeletesits apart on
the Deploy tab: one dirty tree is one thing, and what can become of it
is a choice between two, not two boxes. What that card's red edge
said, the button says, filled asdeleteis: in this house the fill
is what the verb costs and not how often it is pressed —ejectis
outlined because the cartridge can go back in, and this, like
delete, cannot be taken back. The note is under it, and the word it
asks for comes before it runs. Asking, the note takes the row, so the
card does not move under the hand at the moment it decides, and its
two buttons carrytype="button": a button with no type inside a form
is a submit, and the card is the commit's form, so bare they confirmed
the discard and committed behind it — the author saw it. In the danger
card they had stood in asection, where there was nothing to submit.
Updated
-
The README is a tour, read in order. It was an operating manual
in the order the commands were written; it is now written so that
every section only uses what an earlier one explained. It opens on
the two things the workbench is — a development environment that
asks the host for nothing but Docker, and a knowledge base of the
ecosystem kept as cartridges — and on what that is good for; then the
workbench and its workspace, the cartridges as a concept and as a
shelf, the console screen by screen with a capture of each, writing a
cartridge, and why it is shaped like this, with what each decision
costs. The captures are on the dark ground and come from one session
on a real workspace (assets/readme/console/); the legend of the
rail's plates is drawn from the console's own stylesheets
(assets/readme/legend.html).Two tables are not written by hand: the shelf, one cartridge to a row
with its cover, version, summary and papers, and the pending boxes
with their stage and need.assets/readme/build.pywrites both from
./wb.sh catalog --json --brief, between markers, and cuts the
covers' thumbnails. CI holds the README to them:build.py --check
writes nothing, compares the tables the catalog would give with the
ones the page has and looks for every thumbnail, off the package's
ownmix workbench.catalogand with no Docker, so a cartridge added
or versioned without writing them again fails the run and says how
to mend it. The file is Markdown with two tags, each for what
Markdown cannot say — an<img>for a width or a side, a<br>for a
second line inside a table's cell — and says so to markdownlint.What it claims was measured or read, and it says where it was not: it
has been run on Linux, and macOS and Windows are still to try. On
Linux it names the native Engine, with the one measurement behind it
(2026-10-04, one run each on the same machine: the workbench's image
from scratch in 143 s on the Engine and 837 s on Docker Desktop;
compiling, testing and inserting a cartridge the same on both). What
I would do differently is a sentence for now, to grow as the
decisions are tested. The draft's two predecessors
(README2.md,README3.md) and the two captures only the old page
used are gone. -
The two package READMEs say what is there.
igniter/README.md
still tookhealth_endpointfor its reference, kept templates inside
the cartridge's directory and Elixir assets under an.assetsuffix,
listed five Mix tasks of eleven and named one cartridge as not done:
it now draws the package as it is —health_probethe reference,
everything that is not code underpriv/features/<feature>/, the
file modules, the three suites that stand over the cartridges' own
tests.console/README.mdnames the seven screens and the modules
that came after its table was written (Docker, Terminals, Installers,
Nodes, Hex, Themes, Services, Doors, Reports), and speaks of the mock
in the past. -
The rail opens 500px wide. 380px was the width the rail was born
with, and the papers it now carries — the Record's address face, the
cartridge in hand, the tables — were all read in a rail the reader had
to drag wider first. The default is what they would have dragged it
to; the bounds, the memory per browser and the grip's double-click
reset are unchanged, so a reader who already has a width keeps it.
Fixed
-
CI is green again, and it had not been since 2026-09-29. Two
things, neither of them in the code under test. The console's
Dialyzer step failed every run with ten calls to functions of
WorkbenchIgniterit called missing: the console carries the package
as a path dependency, the lock file says nothing of one, and dialyxir
takes its cached PLT for current as long as the lock is — so every
function the package grew after that PLT was built did not exist to
it. The step runs with--force-check, which looks at the modules
themselves (half a minute); the same flag is in the commands the
README andCLAUDE.mdgive. Andgrown_vs_born_test.exstimed out
on three runs of eight: it grows a project order by order on every
core, a desk has twelve and the runner a handful, and ExUnit's minute
was not always enough. The two tests take ten. -
The drawer's Manual reads the new README whole. Three things
stood between that page and the console, and the README found all
three the day it was written. The renderer leaves raw HTML out, so
the covers of the shelf and the lines inside its cells were gone:
Console.Papers.house_tags/1takes the README's two tags out before
the page is rendered and writes them back after, and what it writes
is not what it read — the source when it is a picture under
assets/, a width in digits, a side, thealtescaped; an
onerror, astyleor a source anywhere else is not copied. For the
workbench's README alone: a cartridge's papers never pass through it,
and nothing turns the renderer's escaping off. A heading's anchor was
written as itsid, and the README has a Deployments and a Logs,
as the page does (the rail's table, the logs' pane): two elements
with one id. The anchor isdata-anchornow, which is what the
booklet's hook looks for, so a paper is free to name its sections
anything. And a heading with an ampersand reached the index twice
escaped, THE WORKBENCH & ITS WORKSPACE, with an id no link
written for GitHub could land on: the index and the anchor take the
heading's words as written. -
The ash cartridge queues
mishka_chelekomfirst, and/sign-in
has its styles back. The author found the Ash sign-in page unstyled
on_001(2026-10-03) — no blue on the buttons. Tailwind 4 scans
only whatapp.cssnames, and the
@source "../../deps/ash_authentication_phoenix"that
ash_authentication_phoenix's installer writes was not there: 18 of
the page's 70 classes had no rule in the compiled stylesheet. Ejecting
and re-inserting the cartridge reproduced it, and the cause is
mishka_chelekom0.0.9, which readsapp.cssoff the disk and writes
it back whole — and Igniter flushes nothing to disk until a run ends,
so it was writing back the file as it stood before the command, over
everything the installers before it had put there. Nothing of ours and
nothing of Ash's:ash_authentication_phoenixhad patched the source
and said so. The cartridge now queuesmishka_chelekomfirst, where
there is nothing for it to drop and every installer after it stacks on
its write. Marked WORKAROUND wherever it shows, to remove when the
installer reads the source; the issue is drafted at
ISSUE-mishka_chelekom-app-css.mdand not filed yet, so the link is
a TODO in the four places that carry it. ash v0.9.0. -
The Deploy tab's three cards stand the same distance apart. The
author saw the gap over Deployments wider than the gap over Danger
(2026-10-03). The stack's spacing is written once per card, as the
following card'smargin-top: 14px— but New Project also carried a
margin-bottom: 18pxof its own, and adjacent margins collapse to
the larger of the two, so the first gap came out 18px and the second
14px. The margin-bottom goes; the only margin New Project keeps is
the gap inside it. There is no spacing scale inassets/design/to
hang this on — the design system holds colour, roles and type — so
the rule stays where the other two are, inconsole.css. Measured
in the browser: 18/14 before, 14/14 after. -
A long insert subject no longer stretches the Files screen. The
author found the cartridge detail's Files screen scrolling sideways
when the commit's subject was long (2026-10-03). The subject's cell
and the file paths both carried an ellipsis and neither ever reached
it:.installis a grid, and its implicitautocolumn sizes to
max-content, so the column grew to whatever the longest line asked
for and took the screen with it —ash's insert, whose subject
carries every option it was given, is 365 characters, and the column
came out 3061px wide inside a drawer of 1088. The column is
minmax(0,1fr)now, and each row shortens its own way: a path to the
ellipsis it already had, and the subject, which is the one cell whose
length nothing bounds, over as many lines as it needs, so it is read
whole rather than cut. Its title is dropped with the cut — a tooltip
repeating what is already in view is noise. In the heading that names
an insert's own sheet,Files · sha subject, the subject moves into
thesmallthe screen already had for a reading off the machine:
mono, lower case, soft ink. 365 characters of condensed uppercase
over four lines were a shout. Measured against the author's console
on_001.