Skip to content

v0.18.0

Choose a tag to compare

@JosePamplona JosePamplona released this 05 Oct 17:43
· 52 commits to main since this release

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, as stripe and specdd are — a manifest
    whose pending?/0 is true, so the catalog lists them, the console
    counts them under Not done and add refuses them — and each with
    the two papers such a box can honestly have: a NEED.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. No DESIGN.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 of specdd, 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 a DESIGN.md, identified when its
    need is all there is. ConsoleWeb.Cartridges.not_done/1 reads 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
    and test_doubles already follow, because the tool is the part most
    likely to become an option: message_broker starts from RabbitMQ and
    event_stream from Kafka, each with Broadway in the project, and
    either may offer another server the way db_admin offers four
    admins. security_review is 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_learning is a model
    served from inside the application with Nx — Bumblebee to load it, an
    Nx.Serving in the supervision tree — where the usual answer is a
    second service in another language. seo_aeo is 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 and llms.txt is a proposal, not a standard.
    browser_tests is tests that drive the application through a real
    browser — Playwright as a service of the workspace under a profile
    up never starts, the way k6 is — for what only a browser does: a
    hook, an upload, a full navigation. The two messaging services go
    after monitoring in the registry and the other four before the
    services;
    both services are expected to take messaging, 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 table assets/readme/build.py writes from the
    catalog.

  • The Changes paper can throw the changes away, not only commit
    them.
    The paper said what a dirty tree costs — add and eject
    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 discard is 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 verb undo_failed_insert
    already ran for an insert that failed, named and given to the reader.
    The console keeps its side of the house: Console.Git still only
    reads, the button runs the verb as a job, and the job waits for the
    reader's word first, like delete and prune.

    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 the wb.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 way delete sits 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 as delete is: in this house the fill
    is what the verb costs and not how often it is pressed — eject is
    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 carry type="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 a section, 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.py writes 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
    own mix workbench.catalog and 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 took health_endpoint for its reference, kept templates inside
    the cartridge's directory and Elixir assets under an .asset suffix,
    listed five Mix tasks of eleven and named one cartridge as not done:
    it now draws the package as it is — health_probe the reference,
    everything that is not code under priv/features/<feature>/, the
    file modules, the three suites that stand over the cartridges' own
    tests. console/README.md names 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
    WorkbenchIgniter it 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 and CLAUDE.md give. And grown_vs_born_test.exs timed 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/1 takes 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, the alt escaped; an
    onerror, a style or 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 its id, 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 is data-anchor now, 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_chelekom first, 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 what app.css names, 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_chelekom 0.0.9, which reads app.css off 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_phoenix had patched the source
    and said so. The cartridge now queues mishka_chelekom first, 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.md and 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's margin-top: 14px — but New Project also carried a
    margin-bottom: 18px of 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 in assets/design/ to
    hang this on — the design system holds colour, roles and type — so
    the rule stays where the other two are, in console.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: .install is a grid, and its implicit auto column 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
    the small the 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.