Release notes.
What shipped, and when.
Ghost Architect™ ships fast. This page is the official record of what landed in each release, in plain language, with the user-facing change first. For deeper context on individual releases, see the corresponding posts on the blog.
We ship. We listen. We improve. Repeat.
Ghost Architect™ is not a launch-and-forget product. Every version below represents a real response -- to a gap we found, a customer need we heard, or a standard we weren't yet meeting. We hold ourselves to the same bar we set for your codebase. This changelog is not a list of patches. It is a record of a product that takes its own advice.
The free single-user CLI on npm: install it, bring your own Anthropic API key, and every mode runs unlimited. Latest 12.0.0, October 5, 2026.
Ghost Open™ is free for one person
v12.0.0 -- Every single-user feature works for everyone, with no limits, on your own Anthropic API key. All collaboration and paid-tier machinery is removed from the package rather than switched off. Read the announcement.
- +Every mode, unlimited. Question, Chat, Recon, Points of Interest, Blast Radius™, Conflict Detection™, Prompt Triage™, Inheritance Audit, Ghost Brief™, Executive Brief, Commit Forecast™, Fix Forecast. No quotas, tier gates, trial clock or upgrade copy.
- +One context cap for everyone: 200,000 tokens, the highest cap any former tier had.
--max-contextcan still lower it. - +No license key. Activation, trial tokens, license banners and the PDF trial watermark are gone, along with the license commands.
- +Free production use by one person, under a new Additional Use Grant in the Business Source License 1.1.
- -Removed. Team sync, Enterprise commands, Ghost Portal™ and Ghost Mobile™ publishing, project labels and history, the Project Dashboard, Ghost Watcher™ and white-label branding are no longer part of Ghost Open™. Reports always carry Ghost Architect™ branding. Methodology profiles and project names move up to Ghost Architect™ Local 8.
- +One upgrade line. After every saved report, and in the report footer: Ghost Open™ is free for one person. For deeper scans, teams and your own AI model on your own hardware: Ghost Architect™ Local 8 (early access beta): ghostarchitect.dev/beta.html
Delivered by us as a tarball with a published SHA-256 and installed on machines you own; not on npm. The model runs on your hardware. Latest 7.4.42, October 5, 2026. Request the download.
A scan says what it did not read
7.4.42 -- 7.4.42 leaves large data files out of the analysis, names the languages it cannot read, and refuses a model call that would not fit the model's window instead of answering from part of it. A 2 MB JSON fixture is data, not code, and reading it as code spent passes on nothing. Large data files are now left out and named in the report, while the configuration files that matter, such as Magento's di.xml and system.xml, are still read. A model server cuts a prompt that does not fit its window without saying so. Ghost Architect™ Local now refuses such a call with its reason, and builds smaller passes on small windows so none overflows. The manual inside the download is stamped 7.4.42.
figlet moves to its patched release
7.4.41 -- The library that draws the banner at the top of the interactive menu had a published denial-of-service advisory, and 7.4.41 moves to the release that fixes it. The flaw needs an option Ghost Architect™ Local never used, so no install was exposed. We moved anyway, because a known advisory against something we ship should not wait for a reason to matter. The banner looks exactly as before, and the manual inside the download is stamped 7.4.41.
A wrong word stops nothing
7.4.40 -- The command that stands a machine's scans down before an update now refuses any word it does not know, instead of stopping every scan. Before, asking it for help or making a typo stopped the whole queue at once. Now it prints its usage, says nothing was stood down and changes nothing, and stopping scans is always asked for by name. ghost --help also names --install-hub-service, the command the user's manual tells a macOS hub's administrator to run, and the manual inside the download is stamped 7.4.40.
The user's manual comes with Ghost
7.4.39 -- The 7.x user's manual now ships inside the download, as a PDF and as Markdown, in docs/manual. It covers installing, scans and reports, the portal and the Admin Console, the REST API, Ghost Partner™ profiles, scheduled backups and troubleshooting, with a command-line reference and a REST API reference generated from this release. Every release now checks that the manual inside it names the same version, so the manual you open always describes the Ghost Architect™ Local you installed.
Editing a profile keeps its private patterns
7.4.38 -- Changing a Ghost Partner™ profile through the menu's Edit existing profile removed the private patterns it held. They now stay. The profile wizard does not ask about private patterns, and saving an edit wrote a new file from its answers alone, so the patterns that keep a client's names and host names away from the model were removed, along with the profile's version, free text and fields of your own. An edit now keeps everything the wizard does not ask about. If you edited a profile with private patterns in an earlier version, open it and check them, or restore the .yaml.bak saved beside it.
A real finding keeps its rating, and a paused scan carries on
7.4.37 -- Two of Ghost Architect™ Local's checks set aside a finding that was real, and a scan paused by the scheduled backup could stay paused after an update. All three are fixed. A finding that calls a catch silent or empty, where the catch logs the error, now stays in the report rated LOW at most (MEDIUM at most when the catch handles only a narrower kind of error), with the logging line named. A finding about a missing timeout is now checked in the file where the connection is made, not only the file that calls it. Both changes were checked against findings we had verified by hand against the source they came from: no check now sets aside a finding that was real, or rates one below the severity it deserves. A scan the scheduled backup had paused, when an update stood the machine's scans down at the same time, now carries on once the backup is done. A scan a person paused still waits for a person.
Fewer false findings, and seven advisories closed
7.4.36 -- Three kinds of wrong finding are now caught before they reach a report, and an HTTP library Ghost Architect™ Local uses for certificate renewal moves past seven advisories published on September 30. A finding that describes a catch block the code does not have is now set aside with a line saying why. A finding that calls an error silent, when the catch it points to catches every error and logs it, is rated LOW at most and quotes the logging line. A value called a hardcoded secret that is plainly test data, a placeholder named for tests or a value found only in test code, is counted as INFO; a default password that ships in production keeps its rating. Each rule was checked against findings we had verified by hand against the source they came from: none of them sets aside a finding that was real, or rates one below the severity it deserves. axios, used only to renew a Let's Encrypt certificate when the portal is set to use one, moves to 1.20.0. The only server that code talks to is the Let's Encrypt certificate authority, so the exposure was low.
Three new advisories, closed
7.4.35 -- A library Ghost Architect™ Local uses to match file patterns moves past three advisories published on September 29. brace-expansion moves to 2.1.7. The three advisories, two high and one moderate, each describe a way for a crafted pattern to use up the processor or the stack. The patterns Ghost Architect™ Local expands come from its own exclusion presets and your --exclude flags, never from the code it scans, so the exposure was low. This release removes it, and nothing else changes.
A dismissal sticks
7.4.34 -- A finding you dismissed no longer comes back as new when a later scan words it differently. The model behind a scan rarely words the same finding the same way twice. A dismissal was tied to the exact wording, so a dismissed finding could return on the next scan as if nobody had looked at it. It now follows the finding itself: the same claim, about the same file and the same code, keeps the decision you made.
The same finding, on the next scan
7.4.33 -- Findings now keep one identity from scan to scan, and a live route in a folder named Test is no longer treated as test code. Every finding now carries a fingerprint that holds when a later scan rewords it or rates it differently. It is the groundwork for letting your own reviewers teach Ghost Architect Local which findings matter in your code. While checking a scan of a third-party extension against its source, we found two ways a real issue could fall out of a report. A live route in a folder named Test was being judged as test code, and a rejected finding whose rejection named an actual bug was being removed. Both now reach the report.
A public key is public
7.4.32 -- Findings about public keys, timeouts on calls that do not exist, and files that are not in the codebase no longer count against a score. We checked a report on a public .NET library against its source. A public key used to verify license signatures had been rated critical, a missing timeout was reported on a check that makes no network call, and one finding cited a file in a folder where it does not exist. Each of those is now caught by a rule that reads the code. Informational findings no longer carry a cost estimate, and the check that confirms findings in large files now reads its full allowance, aimed at the code the finding names.
Findings are judged by the code they read
7.4.31 -- A finding built from a project's tests instead of its code is listed rather than scored, and the check that confirms a finding now sees the code under test. We checked a report on a public Ruby library line by line. Its three high-severity findings described behaviour the library's own tests assert on purpose, and the analysis had named the functions instead of reading the files that define them. Findings like that are now listed as informational, with a sentence saying what they did not read. When a finding cites only test files, the check that confirms it is shown the file that defines the method it names, and an error handler that explains itself is recognised even when the finding gives no line number. The Scan Queue now shows what a waiting scheduled scan is made of, and a scan paused by an update while writing its report is counted as carried on.
Reports that say exactly what the code says
7.4.30 -- A finding keeps the severity the analysis gave it, a quote written with dots is matched as written, and the check that confirms a finding now sees the lines it is about. We checked a report on a public Swift library against the repository line by line. Its one real issue about the library was set aside, because the finding quoted a line with dots standing for four paths and the confirming check was shown the wrong part of the file. Both are fixed, and the issue now stands. A finding handed to the report as informational came out rated medium, because the model that writes the explanation could change the severity. The severity is now the analysis's own. Findings in test code are described as test-suite issues, and the summary no longer mentions findings that are not there. The Scan Queue's Recently ended list now counts every scan in its window, and a scan paused for an update is counted as carried on instead of listed as ended.
Ghost Architect™ Local scanned itself, and we fixed what it found
7.4.29 -- The model now yields to the rest of a Windows machine, a busy model no longer reads as a dead one, and findings contradicted by the code they name are set aside with the line that answers them. On a Windows machine running its model on the processor, Ollama's model runner took every core for each call and nothing else got a turn: the health check, the portal, email, a remote login. Ghost Local now runs the runner below normal priority. Logins that could not connect in 100 seconds connect in two, and calls are no slower. Our own scan of Ghost Architect Local reported HIGHs that the code it named contradicts: timeouts said to be missing from functions that supply one, empty answers said to pass as success beside code that throws on them. Those are now read against the named code and set aside with the line. Every set-aside finding appears in the appendix, the counts agree everywhere a report states them, and the real issues our scan found in our own code are fixed in this release.
Error handling is read the way it was written
7.4.27 -- A catch that re-throws is not silent, a catch that says why is LOW at most, and a timeout with a default is not missing, in JavaScript, Java, C#, PHP, Python and Ruby. Each of these came from recent open-source scans: a re-throwing catch called a silent swallow, a documented fallback called silent, and a request timeout said to be infinite when every request starts at 30 seconds. Findings like these are now set aside with the line that answers them, or rated LOW with the code's own comment quoted, so a reader can judge it. Python except and Ruby rescue blocks are read the same way as catch blocks.
Monthly licenses that renew themselves
7.4.26 -- Ghost Architect™ Local is now priced by the month, a renewed license installs itself, and ghost --activate does what the license email says. Solo is $80 a month, Small Team $400, Agency $1,000 and Enterprise $2,000, with half off the first month after an evaluation. In the last three days before a monthly license expires, a connected install asks for its renewed license and installs it. Nothing is sent in zero-egress mode. Air-gapped installs get the signed license file with every purchase and renewal email, and install it with ghost --install-license. A lapsed license now has 7 days of grace.
Findings are read more carefully against the code
7.4.25 -- A missing check that is already there is set aside, a finding that says it is not a bug is INFO, and a loose quote of a real line is kept for review, not removed. Each of these came from a recent open-source scan: a parser flagged for checks it already makes, a limitation described as a bug, and a real shell injection removed over a misquoted line. A scan asked for a set number of passes now runs that many in total, even when it is paused for an update partway through. A finding that only touches release or CI tooling, which runs on maintainers' machines rather than users', is now rated MEDIUM at most.
A file a finding never discusses does not decide its rating
7.4.24 -- Findings about example or test code stay at MEDIUM even when they also cite a file they never discuss, and the usage report now counts updates and names versions. A CRITICAL about an example that reads its secret from an encrypted credentials store is now MEDIUM, and a file named tests.c is read as test code. The daily usage report says how many updates paused how many scans, and each project's line names the version of Ghost Architect™ Local that ran it.
A folder named 3rdparty is someone else's code
7.4.23 -- Folders named 3rdparty, 3rd_party or 3rd-party are now treated as copied-in code, like third_party, and their findings stay out of the score. A scan of magic_enum scored a finding against the doctest framework it copies into test/3rdparty. That code belongs to other authors, so it no longer counts against the project.
A CRITICAL names something an attacker can use
7.4.22 -- A finding stays CRITICAL only when it names an exposed secret, injection, an access-control bypass or exposed personal data. Anything else is HIGH at most. The analysis model sometimes rated swallowed errors, missing timeouts and even a colour table CRITICAL. Those findings are now HIGH at most, and each says why and what the model rated it. Across 48 confirmed CRITICALs in recent open-source scans, the 28 about exposed secrets keep their rating and the other 20 become HIGH.
A fix never makes a security control fail open
7.4.21 -- A fix step that would return or log the original value when a sanitiser or security check fails is now marked in the report as one not to follow. When a finding about a sanitiser, validator or authentication check recommends returning or logging the original value on failure, the report says, under that step, to fail closed instead. The finding keeps its rating. A finding that calls a variable or property dead, quoting it inside its own declaration, is now checked against the code, and set aside with the lines that use it.
A lost merge is caught, and a scan that confirmed nothing has no score
7.4.20 -- A merge step that lost every finding is set aside so the passes' findings reach the report, and a scan whose findings were all removed no longer shows a score. On a large scan, a merge step combines the findings of each pass. When its answer has none of the findings it was given, or repeats its own instructions, that answer is set aside and the passes' findings go to the report as they are. A scan whose findings were all removed by source verification now reports no Codebase Health Score on every path, including multi-pass scans started from the queue or the API.
Busy machines read as busy, Bats tests are read, and three more wrong claims are checked
7.4.19 -- The Scan Queue says when a machine is busy with a call. Bash test suites are read, and wrong claims about error handling, unused code and caches are set aside. A machine in the fleet that is too busy running a call to answer a status check now reads as busy with that call, and for how long, rather than as gone. Bats test files are read and counted. A file the model made up is dropped from a finding's list. Findings that call Rust error handling silent, a built-by-name function unused, or a cleared cache never cleared are set aside with the lines that answer them.
Unused and silent-error claims are checked against the code in more languages
7.4.18 -- A finding that calls a qualified name like IncludeMode::Off unused, or a Rust unwrap silent, is now answered by the code it points at. A name written the way Rust, C++ and C# write members is now counted, as plain names already were. A finding the code contradicts is set aside with the lines that answer it. A line ending in unwrap or expect stops the program with the error, so a finding that calls it silent is set aside with that line. Code that does quiet an error is left alone.
Paused scans are not counted as cancelled, duplicate findings are merged, and copied-in code is left out
7.4.17 -- Scans paused for an update no longer count as cancelled, one finding written two ways is listed once, and code copied in from another project is left out and named. The daily report counts only scans that ended, and says separately how many were paused for an update and carried on. A scan someone actually cancels still reads cancelled. Two findings that cite the same files and say the same thing in slightly different words are now one finding. Findings that differ by a name stay separate. A folder that is another project, such as a test framework copied into a tests folder, is left out when the repository says whose it is, and the report's coverage line names it and why.
Findings keep the severity they were given, and each machine is judged by its own speed
7.4.16 -- A severity written as Low, Medium or INFO is now read as written, and a hub that shares work with another machine no longer reports itself slow because of that machine's speed. Before, a severity line written in ordinary case could be missed: it appeared at the start of the finding's text and the finding took its section's severity instead. Any sentence on that line is kept. The inference health check and the pass size it sets now read only the calls a machine answered itself. A machine that really is slow is still reported.
A finding that says nothing is wrong no longer counts, and C, C++ and C# findings are checked against the code
7.4.15 -- A finding whose own text says there is no risk and nothing to do is now listed as INFO, and a C, C++ or C# finding about an allocation the named function never makes is no longer verified. The check that a named function really contains what a finding describes now reads C, C++ and C# definitions and knows memory allocation. A function that allocates, directly or through a wrapper, is confirmed as before. The queue API now says how each scan it lists as completed today ended: completed, cancelled, killed or failed. And the fix-order number the analysis assigns no longer appears inside a finding's text.
Secrets are judged where they are, and connection-string passwords are masked
7.4.14 -- A finding about a hardcoded secret is now rated by the files that actually hold the value it quotes, and a password inside a database connection string is masked before any model reads the file. When every file holding the quoted secret is test, example or development-only configuration, the finding is MEDIUM at most, even if it cites production files for another point. A password in production configuration keeps its rating. A finding whose evidence is only inside a comment or a documentation example is now listed as INFO: it stays in the report and no longer lowers the score. A real secret left in a comment keeps its rating.
Every scan says what it is made of, from the first pass to the finished report
7.4.13 -- The Scan Queue shows each scan's main languages under its project name, and now keeps showing them while the scan writes its report. A scan that had finished its passes lost its languages line when it moved on to writing its report, because the report is written under a new queue entry. That entry now carries the languages of the scan it continues. Scans started from the command line, scheduled scans, the dashboard's project scan and the commit watchers now record their languages too, and a row for another machine's scan carries them. When Ghost cannot be sure which scan a set of files belongs to, it records nothing rather than guess.
Ghost reads Dart, and a secret is found without Ghost's own marks being called secrets
7.4.12 -- Dart source files and Magento templates are now read, anchored and checked like any other language. Code a build tool wrote is still skipped. On the Scan Queue, running scans carry no number and are listed first; the waiting scans are numbered 1, 2, 3 in the order they will start. The Fleet Scan Queue shows each scan's main languages under its project name, and the usage report names the main language of each scan. A peer that has missed its health checks is reported as not answering rather than busy, the recovery email says how long it was quiet, and the completion email links to the scan's own report. Ghost now records whether each value it masks is a vendor key, a generated-looking secret or a short, simple one. Vendor keys and generated-looking secrets are still reported in any file, test files included. A finding whose only evidence is a simple value masked in test or development code is set aside instead of counted as an exposed secret. A finding about test code that names no failure is now listed as INFO: it stays in the report with its evidence and no longer lowers the score. A disabled test, a test that can never fail, a hidden exception or a secret in a test keeps its rating. Xcode test targets count as test code, a linked file is read once, and a scan that was stopped and resumed says so. A finding that calls a catch block empty is set aside when every catch in its file is an expected-exception test, a rethrow or a logged failure, and a finding that quotes a call now points at the line where the call opens.
Ghost reads Rust, and a scan that confirmed nothing has no score
7.4.11 -- Rust source files are now read, anchored and checked like any other language. Before this release a Rust project was scanned without its Rust. Cargo's build output and Cargo.lock are still skipped, and benches/ counts as test code alongside tests/ and examples/. On the Scan Queue, a wait that cannot be estimated now says est. unknown on its row, and the reason is said once under the table instead of on every row. A finding that says a file never uses something, when that file does use it, is now set aside with the lines that use it, and so is one titled "Unused X class" when X is used. Code in a demo folder counts as example code. When verification removes every finding, the closing risk section says so instead of describing what was removed. Times in the scan log no longer read 60 seconds past a minute, and a call another machine answered is counted once, under the model that answered it. A scripted CLI scan that waits in the queue now says where it is in line, and the backup emails name the scans they paused and resumed. A scan whose findings were all removed, or one cut off before it finished, no longer shows 100/100 on any surface. Test fixture keys are no longer mistaken for secrets, a finding in a named function points inside it, and scripted-scan flags without --no-interactive say so. A password in a development-only settings file, such as appsettings.Development.json or .env.development, is now rated like one in test code instead of CRITICAL. A finding that calls a catch block silent is set aside when the catch rethrows or logs the exception, or is the catch of a test that expects the exception; one that says a method is never invoked is set aside when the code calls it. The usage report says "none confirmed" rather than "none found" when a scan raised findings it could not confirm, names how many were set aside or removed, and says which period it covers.
Cleaner reports, a fleet that hands work on sooner, and Unlimited for Enterprise
7.4.10 -- Finding headings now carry the finding's own title, never the template's words or labels like (Batch 2), and a finding the findings file lists once is printed once. A finding now points at the file it is about: code before a README or CHANGELOG, and a file the finding names before one it only lists. A cited path with the wrong directory shows the file Ghost actually read. A finding that calls a function unused, when the code calls it, is set aside with the lines that call it. In a fleet, a peer whose relayed call has just come back is offered the next call at once, instead of looking full until its next health reading. The Scan Queue no longer says a peer is holding nothing while one of this hub's calls is running on it. On a CPU-only machine each call's speed is now compared with what that machine did before at a similar prompt size, so a normal speed for a larger prompt is no longer called slow. The warning says what it was compared with. An Enterprise licence now says Unlimited on the license banner, System Status and the Users page, instead of 10000.
A long code name is no longer mistaken for an AWS secret
7.4.9 -- Ghost hides anything shaped like an AWS secret key before the model reads your code. Some code names have exactly that shape, and Ghost was hiding them too, so the model reported a hardcoded AWS secret that was not there. Ghost now recognises a name made of words, such as Documentation/UndocumentedBooleanMethods or a long test name, and leaves it as written. A real key is still hidden, whether it stands alone or is assigned to a variable.
Severity you can trust, and a backup that pauses the scans
7.4.8 -- Ghost was hiding values like "dummy" and "YOUR_API_KEY" as if they were secrets, then reading the hidden value as proof of a real secret. Those findings came out CRITICAL. Ghost now leaves a placeholder as it is written and still hides anything that could be real. A finding whose every cited file is test or example code is now MEDIUM at most, because that code does not run in production. The finding says what it was first rated and why it was lowered. The severity rubric now says that CRITICAL and HIGH need a production path, that a placeholder is not a secret, and that code which logs an error and returns an error response is reporting it, not swallowing it. The first scan of each project after this update analyses every file again; later scans reuse that work as before. The daily backup now pauses the scans instead of waiting for a quiet machine that may never come. Each scan pauses after the pass it is on, the backup runs, and the scans restart on their own. Every queue screen says "pausing for backup" while it happens. The daily usage report lists each project once, with its findings scan by scan and a count of the attempts that ended early.
A report entry that runs on is stopped in seconds, not minutes
7.4.7 -- When Ghost writes the report, the model writes one entry per finding. On a scan this week it wrote one entry as a single line of more than 52,000 characters of repeated words and kept going for over 11 minutes. Ghost already throws away an entry like that, so the time was wasted. Ghost now stops the model as soon as a line in an entry passes the length it would throw away, writes that entry again on its own, and does the same for any entries the runaway left unwritten. If the rewrite runs on too, the entry is built from the finding's own details instead.
An update no longer throws away the work the model is doing
7.4.6 -- Before an update, Ghost stops the scans on the machine and starts them again afterwards. It now waits for the scan the model is actually working on, whether that is a pass or a merge step, until its answer is saved, and stops the scans that are only waiting in line straight away. On the Scan Queue, Recently ended shows these scans as "stood down" instead of "killed", because they carry on by themselves after the update. The same code is now split into the same passes every time. Files that ranked equally were kept in the order the disk listed them, which changes from run to run, so most saved pass answers went unused on a repeat scan. Equal files are now ordered by their path, and a repeat scan keeps its saved pass size when only the machine's speed setting has changed. The first scan of each project after this update splits its files once more under the new order. When a scan is stopped, the email counts only the saved passes a restart will reuse. And when LLM Status says a model call read less of its prompt than it was sent, it names the scan, the step and the time of that call, and when it stops counting.
A merge or report line that never ends is cleaned up
7.4.5 -- The model writing a merge step or the final report sometimes starts a line and never finishes it, drifting into an endless run of loosely related words. Ghost now keeps such a line only up to its last complete sentence and keeps everything else in the answer. When a line runs past 40,000 characters, Ghost also stops the model there instead of letting it write to the end. On one scan this week that line reached 116,860 characters and took 22 minutes; stopped at 40,000, the same step takes about 9. A line that runs on for a while and then ends is left to finish, because the model often goes back to writing real findings after it.
Reports name the machines that did the work, and a step that repeats itself is stopped
7.4.4 -- When a hub shares a scan's model calls with peer hubs, the report now names every machine that answered and how many calls each took, and the Reports page shows the same under each report that was load balanced. When the model ended a code example with its closing marker at the end of a line, or never closed it, every finding after it was read as code and left out of the report. Ghost now closes such a block where the code evidently ends and counts each repair. On one real report this week, the same model answer now gives 45 findings where it gave 8. Now and then the model writing a merge step or the final report begins writing the same lines over again until it runs out of room, which on a local model can take twenty minutes or more. Ghost now watches those two steps as they are written, stops the model when it has been repeating itself with no new finding, and keeps everything written before the repetition began.
Scans keep their work through an update, and a quiet peer is reported
7.4.3 -- A long scan reads your code in passes and then merges what the passes found, step by step. Finished passes were already saved as they went; the merge steps now are too, so a scan that is stopped and started again reuses the merges it had finished. An administrator can now stand every background scan down for an update with one command. Each scan is written down with the exact request it was started with, including how many passes it asked for, and a scan in the middle of a pass can be given time to save it first. When the portal starts again, the scans carry on in the order they held, reusing their saved passes and merges. A scan somebody paused stays paused, and nobody is emailed that a scan was killed, because it was not. When a peer hub has not answered a health check for 15 minutes, the hub emails its administrators, and it emails again when the peer answers, saying how long it was quiet. A machine that is down and one too busy to answer look the same from the hub, and neither is working for the fleet, so both are reported.
A hub can cap the size of the work it sends each peer
7.4.2 -- When a hub is busy, it hands model calls to its peer hubs, and until now the only size check was whether a peer's model could hold the call. A machine can hold a large call and still be the wrong place for it. A smaller machine given a long call puts every core into it and stops answering, so the hub that sent the work cannot see its progress or reach it for the length of the call. The Fleet page's Load balancing table now has a "Largest prompt sent" setting for each peer. A call whose prompt is larger than that stays on this hub; a smaller one is still sent when the hub is busy. The decision is written to the scan log with both numbers, and the Fleet page says why a call stayed home. Only an administrator can change the setting, and each change is recorded with who made it and what it was before. A peer with no limit set is sent exactly what it was sent before.
A report written from all of its findings
7.4.1 -- When a scan handed its final report off to be written in the background, which is the usual way a hub finishes a scan, the step that fits the findings into the model's context window was never told how large that window is. On a large codebase the report prompt could then be bigger than the model can read, and the model read only part of it: in the case that found this, about a third. The report was written from what it read. That step is now told the window size and fits the findings to it. When a single merged set of findings is still too large, it is shortened only as far as the window needs, with a note at the cut, and the report says so. It is no longer sent back to the model to be merged with nothing, which cost model calls and did not make it smaller.
A merge that repeated itself, and a hub that trusted a fast re-read
7.4.0 -- On a large codebase, Ghost Architect™ Local merges the findings from its passes in steps so each step fits the model's context window. When two merged groups were each too big to go into one prompt together, every step after that sent each group back on its own, got the same group back, and tried again. Nothing was combined, and the scan kept going until someone stopped it: four and a half hours on one scan before this was found. Now a step that cannot combine anything puts every group into one final prompt. A small group goes in whole, and a large one is shortened only as far as the window needs, with a note at the cut. The report says when this happened. A hub that takes work from other hubs estimates how long a call will take before accepting it, from how fast it has recently read prompts. When it was sent the same prompt more than once, the model server answered the repeats almost instantly, because it still held the prompt it had just read. Those repeats counted as fast readings and pulled the estimate down, so the hub accepted a much larger call it then could not finish before its deadline. Each call now records a short fingerprint of its prompt (a digest, not the text), and only the first reading of any prompt counts toward the estimate.
A perfect score for a scan that looked at nothing
7.3.9 -- A scan whose target resolved to zero files, a path that pointed at nothing or a profile that excluded everything, came back as "100/100, Production ready". Nothing had been looked at. A score of 100 says a codebase was measured and found clean, and this one was not measured at all. Such a scan now carries no score, and its report says plainly that no files were provided to analyze and that the path or profile should be checked. The Project Dashboard says the same thing instead of ranking that project at 100, including for scans that ran on another hub and were sent to this one. A scan that was given files and found nothing wrong still scores 100, because that one is a measurement. When a scan has no score (it confirmed none of the findings it raised, it was cut off before it finished, or it was given no files), the report prepared for a client read "Health Score: null/100" followed by "Critical risk, do not proceed without remediation", above a finding count of zero. That is the opposite of what happened. The client report now reads "Health Score: not rated" with one sentence giving the reason, and leaves out the verdict, the trend and the scoring note, since each of those describes a number that is not there. Scored reports are unchanged. Before a finding reaches a report, Ghost Architect™ Local checks the names it cites against the source it cites. That check only recognised a name written as a method call on an object or class, or quoted as code. A plain mention of a function, such as "errors from hash_file() are suppressed", was never checked, so a finding that named the wrong function in plain words went out as though it had been verified. Those names are now checked like any other: a name that is not in the cited code marks the finding unverified. Ordinary words that happen to sit next to a bracket, such as "entries (values ...)" or "file(s)", are not mistaken for function names. 7.3.9 carries everything in 7.3.0, 7.3.1 and 7.3.2 as well.
The Scan Queue named the wrong machine
7.3.2 -- The Scan Queue's "Running on" column is supposed to name the machine whose model is working on a scan right now, and to name a peer hub while a call is out on it. For a POI scan's write-up stage it never did. That stage is registered under its own name so the page can tell it apart from the analysis stage, but every event recorded for the same call, including the line saying which peer it was sent to, is written under the scan's original mode. The lookup asked for the wrong name, found nothing, and the column fell back to naming this hub, even when the line one row up in the same log said the call had gone to the peer. The work really was on the peer; the page reported the silence as "here" instead of "unknown". The lookup now asks for the call's real mode, the one the log was always written under.
The trial notice a paying customer could not get rid of
7.3.1 -- Every portal page carries an evaluation notice, and it decided whether to draw itself by asking whether a trial had ever been started on the install rather than whether the machine is an evaluation now. Installing a licence does not remove that record and nothing else clears it, so from the moment a customer converted, the notice went on telling them at the top of every screen that their evaluation had ended and that a licence would turn everything back on -- on a machine that had one. It fired for every customer who converted, at the moment they started paying, and no restart or upgrade would have cleared it. The notice now asks whether the machine holds a licence before it draws, and any licence silences it, because an expired or unreadable licence is still not an evaluation. It asks by looking for the file rather than by validating it, so that a notice drawn on every request, every poll and every refresh still writes nothing to disk.
A promise we emailed, and the path their CI runs on
7.3.0 -- The trial email promises Recon-only mode when an evaluation lapses, and the product refused every mode including that one; three separate doors carried the same blanket refusal, and a lapsed evaluator read the truth at a terminal and "you never had access" in their CI log. All three ask the entitlement table now. Recon, which counts nothing by design, was reporting "0 findings" on six surfaces, among them one email that also said nothing was counted and a pull request comment claiming no critical or high findings on a branch nothing had examined for defects. Findings from modes with no verifier were filed under the word for doubt: 245 of them across two machines read as doubted inside files whose own set-aside count read zero, and there is a third word now, unchecked. A blast target that resolved to nothing was accepted, queued and scanned for 120 passes, when the product had already written down that it matched no file. The stop button signalled a process this product never started. And two hundred stopped scans left one kill entry between them, because five paths stop a scan and not one of them passed a principal.
A scope that examined nothing, and a note that did arithmetic on the wrong set
7.2.8 -- A scope named by its full path matched nothing and scanned nothing, which produces a clean report that reads exactly like good news; scope entries resolve against the codebase root and against the pinned copy being read now, and the absolute and relative forms select the same files. The first fix for it was not enough, and the entry says so. A conflict scan's coverage note read seventy-seven related out of sixty-one never examined, a subset larger than the set it was drawn from, because one word attached a true count to the wrong population. And a single slow reading used to shrink every scan on the machine and keep it shrunk: the pass-size monitor declines to reach a verdict below three samples now, and too little evidence neither reduces pass size nor clears a reduction already in force.
An accent in your company name, and a green light over a switch that was off
7.2.7 -- An installer answers file carrying an accented company name had never been recorded correctly. The queue API told you where half your queue stood and stayed silent about the rest. And a peer hub showed a green "work is sent" three lines under the sentence saying balancing was switched off.
Names, clocks, and a test that expired while we watched it
7.2.6 -- A log archive was being deleted up to five hours early, every evening. The first log archive an upgraded install writes was invisible to the LLM Status page. The Last Backup panel showed two different days for one file. And the Windows installer no longer hangs when its input is a pipe.
The crash on Q, and the day a log file is named for
7.2.5 -- Pressing Q to leave the Scan Queue no longer kills a Windows console window, and a rotated log file is named for the day it holds, on your clock.
The machine you are sitting at gets to keep working
7.2.4 -- The smallest model on the installer menu was the one that thinks before it answers. A calibration is sized for the machine it measures. The Scan Queue screen speaks ASCII on a Windows console, and its footer says what Q does. And the log viewer no longer runs what it reads.
Everyone signs in, and every line says who did it and where
7.2.3 -- Typing ghost asks who you are. Where the policy requires an authenticator you set one up at sign-in, and a forgotten password is reset by the computer's own administrator. A paid seat is a machine, not a head. And an administrator runs the people from one page.
An upgrade cannot break the install it is replacing
7.2.2 -- A Windows upgrade stops its own services and moves the old copy aside. A slot count the model server may not serve is said out loud. And a built version is not built again.
What the second machine taught the fleet
7.2.1 -- One at a time means one at a time. A call is sized by answers of its own kind, and a peer that has measured itself is not calibrated. Windows services stop cleanly, and a stall cannot empty the stores that let you in. A relay that dies says what killed it, and a peer that is not ready says why. The installers say what happened, and a reinstall keeps what was there.
The fleet counts what it is actually doing
7.2.0 -- A call stays on a free machine. Load balancing has a threshold, and a peer can be benched. A relay is counted, and one that died is said. The stall judge reads the relay's deadline. And a receiver judges a call by the answers it writes.
The deadline that belonged to the wrong machine
7.1.9 -- A peer says how much it can hold, and the sender listens. The deadline follows the machine that will run the call, and a receiver that cannot make that deadline says so in a second. A machine in a fleet can see the fleet's work, and the queue page says where a call went.
The feature that was registered everywhere and worked nowhere
7.1.8 -- Multi-hub load balancing had never sent a single call anywhere, and when it did send one it was handing off work rather than balancing it. A peer that answered in 79 milliseconds and refused the credential was reported as unreachable. Re-pairing two hubs silently did nothing and reported success. And there is a way to remove a peer hub at last.
What a screen would not tell you
7.1.7 -- A Windows hub was never reachable by anything it exists to serve. A stalled scan said so in one place and not the other. The Fleet page could not tell you which machine it meant. A peer hub was the only machine class in the fleet with no speed. And a Scan Queue said the whole fleet was idle while a peer ran at full tilt.
Windows
7.1.6 -- An upgrade no longer deletes your data folder, and the admin device token goes with it. It refuses to take over what is not its own. Unattended installs. And the installer decides its own exit status.
The Linux installer
7.1.5 -- The opt-out that turns off Node installation appears in the installer's own help at last. It had worked since 7.1.3 and was documented in the release notes, but the usage text listed only two of the three flags it accepts, which is the one place an operator would look for it. 7.1.3 and 7.1.4 were built and gated and never published; their entries are kept rather than folded into this one, because a changelog that quietly renumbers its own history is worth less than one with two extra headings in it.
Conflict detection
7.1.4 -- File pairs too large to fit in one context together are examined as the regions that relate them. The codebase index records which function calls which, so a pass can carry the function on each side of a call between two large files instead of carrying neither. Measured on a 348-file codebase: 108 related pairs were out of reach at any number of passes and 32 are now, with the other 76 examined for eight extra passes out of 109. What is still out of reach is named with its reason, per pair.
The Linux installer
7.1.3 -- The installer installs Node.js when the machine has none it can use, ending three cases the same way instead of in three different dead ends. It fetches the pinned version from nodejs.org, verifies it against the published SHASUMS256.txt, and copies into /usr/local: no package manager is run, no repository is added, and no remote script is piped into a shell. If the download cannot be verified, nothing is unpacked and the refusal says so.
The Linux installer
7.1.2 -- The installer proves the service account can run what the systemd units name, and refuses before it writes a unit if it cannot. It resolves the two paths that will go into ExecStart, then executes the interpreter and reads the script as the service account, because a permission bit is not the thing being guarded and executing is what systemd does. This closes a dead end for any machine whose only Node is installed under a home directory, which is every plain nvm install.
The portal
7.1.1 -- The Project Dashboard has a search box and paging, all of it plain links and a form, so the page still works with JavaScript turned off. A search always starts at page one. A page number past the end of the list shows the last page rather than an empty one. And the dashboard tells apart "no projects have been scanned yet", "no project matches what you typed" and "none are assigned to you", which used to be one message.
The product reads the model's own answer
7.1.0 -- A file citation written with a qualifier beside it is kept, path and all. The rule that rejected any token carrying a space or a parenthesis was written to keep a bare version string out of a file list, and it discarded the qualifier and the path together: measured on a real scan, nine findings reached the verifier with no file, so it opened nothing, judged nothing, and set all nine aside. And a finding whose fields arrive on one pipe-joined line keeps them, whichever field the line leads with, where every matcher used to be anchored to the start of the line and lost the file, the severity and the effort at once.
Out of beta: the estate tells the truth about itself
7.0.4 -- The first release after beta. The Fleet page gains an LLM Status tab: the model each machine runs, memory held and available, the context window, decode and prompt-reading speed today against the prior six days, and the model server's live log. The balancer's memory veto reads real records again and each machine's available memory is printed. Time estimates are measured from this machine's own passes and say which basis they used. Every event of a pass names the same total. A compliance row names its scan and tells the project label from the directory. Which scan endings send email is a setting. The archive has a search before its page. Full gate: 537 of 537 smoke tests, 12 of 12 simulation flows, Linux root install green.
Trust the portal's certificate, and reports that say what they could not do
7.0.3 -- The portal tells you how to trust its certificate: a guide, a warning before the first browser opens, and Admin Console prints the fingerprint and the trust commands for your platform. A finding the report writer could not expand stays in the report as the analysis recorded it, and the writer runs on a measured budget instead of a fixed thirty seconds. The usage report no longer prints a token total it never measured. Underneath: the verifier no longer deletes a true finding because its own remediation pattern is present, a report the parser cannot read no longer reports a healthy codebase, a redaction marker corroborates a hardcoded-secret finding instead of refuting it, findings are written to the debug record as they enter verification so a scan can be replayed, and a retry that changes nothing is not retried. 438 of 438 smoke tests, 12 of 12 flows.
Zero egress refuses, and a spoke records who ran the scan
7.0.2 -- Zero-egress mode now refuses a model endpoint that would send source code off the machine, at all three moments it can be reached. A spoke records who ran a scan, which it never did before; the hub records what it serves from an identity it verified itself, and that identity is signed, so editing the cached copy breaks it rather than silently succeeding. 422 of 422 tests, 12 of 12 flows.
The first tarball: a Linux hub install with a service account and two services
7.0.1 -- The first build delivered through the private delivery repository, as a tarball with a published SHA-256 to check before unpacking. The Linux installer provisions a dedicated service account, the data root and two systemd units, portal and scheduler, with the portal on port 3443. Also in this build: a screen-leak fix and a bracketed-paste fix in the interactive shell.
Version 7: the Local line gets its own number
7.0.0 -- Ghost Architect™ Local takes the 7.0 line, and the version the product displays derives from one place, so a release cannot show two numbers.
The first Local build: your model, your hardware, Ed25519 licences
1.0.0 -- The full architecture build. A model-provider abstraction so the product runs on Ollama, vLLM, LM Studio, Jan.ai or any OpenAI-compatible endpoint. Ed25519 is the only licence signature scheme the product signs or verifies, and the key the product trusts is the public half of the key the activation service signs with. Recon reports carry an honest sizing notice instead of a fabricated 100/100 health score; a recon no longer writes a perfect score into a project's trend history or generates a client report for a scan that assessed nothing.
npm update -g ghost-architect-open to pull the current release. Ghost Architect™ Local upgrades by re-running its installer on the new tarball.