Repository navigation
Releases
v0.3.6
lattice-scan 0.3.6
An AI agent in its own sandbox can now run the host scan and recent, and a run with no terminal no longer leaves the list of installed packages in the home folder. This release changes where and how the tool writes its records. What it looks up, what it compares and what leaves the machine are exactly as in 0.3.5.
Highlights
- No crash without a writable home. With a read-only or missing home folder, the host scan and
recentused to end in a Python traceback (exit 1) the first time they wrote a record. Now the run says on one line that the folder cannot be written and keeps that run's records in a temporary folder, deleted when the run ends. IfLATTICE_SCAN_DIRnames the folder and it cannot be used, the run stops with exit 1 and one line namingLATTICE_SCAN_DIR: a folder you chose is never silently replaced. - A run with no terminal leaves nothing behind. An agent or a cron job with no terminal on standard input or error, and no records folder yet, now writes its records to a temporary folder instead of
~/.lattice-scan.--keep(orLATTICE_SCAN_KEEP=1) keeps them in the default folder. - Private files. Every file in the records folder is now created mode 0600 (it was 0664), and files from earlier runs are tightened on the next run.
- The skill tells a sandboxed agent what to set. Section 2 of the Claude skill now says to set
LATTICE_SCAN_DIRto a folder the agent owns, andLATTICE_API_KEYif the user gave a key.
What changes for you
- A folder that already exists (
~/.lattice-scan, or the older~/.host-scan) and any folder named byLATTICE_SCAN_DIRare used exactly as before. Nothing changes for a person at a terminal. - If you run the host scan from cron or another job with no terminal and relied on the default folder being created, your findings are no longer remembered from one run to the next. Set
LATTICE_SCAN_DIRto a folder you keep, or add--keep. get-keynever uses a temporary folder, because the key must outlive the run.recent,enrichandprojectwrite no host records, as before.
Known limits
- A run whose records went to a temporary folder cannot show an earlier run's findings as
RECORDEDorOPEN; every finding in it is new. That is the point for a sandboxed agent, and a cost for a scheduled job that wants history. - The tool still does not detect incidents or decide whether a host is affected. A match is a candidate for a person to read.
recentlists what was recently added and matches by product name; an empty or all-unmatchresult is not the same as safe. - The host check is tested on Debian-family hosts.
- The package is not listed in OpenAI's directory; submitting it is a separate step that needs OpenAI's review.
Install and verify
- PyPI:
pip install lattice-scan==0.3.6, oruv tool upgrade lattice-scan - Claude Code:
/plugin install lattice-scan --marketplace namiq-ai/lattice-scan - Signed apt repository: https://namiq.io/apt (key fingerprint
C473 6154 4115 8A3E 775C 2EC2 7E61 15F4 0A41 061D, also published at https://namiq.io/lattice/docs). The repository serves a new version only after it is published there; until thenaptstays on the older one. - Assets below:
lattice-scan.pyz,lattice-scan_0.3.6_all.deb, the wheel, the OpenAI plugin package andSHA256SUMS. Check withsha256sum -c SHA256SUMS. - To see the fix:
env -i PATH="$PATH" HOME=/nonexistent python3 lattice-scan.pyz recent --daily -qends without a traceback.
Guide to the command line, the Claude skill and the MCP server: https://namiq.io/lattice/guides/choose-your-channel
v0.3.5
lattice-scan 0.3.5
The OpenAI plugin package names its real publisher, and the open-list wording no longer claims more than the list knows. This release changes the package built for OpenAI's plugin directory and some wording in the tool's help and manual. What the tool does, the Claude skill's text and what leaves the machine are exactly as in 0.3.4.
Highlights
- Publisher: Hung Le. OpenAI requires a plugin to come from a verified person or organisation. The identity verified on the OpenAI account is an individual, so the package's listing (
developerName) and its author now say Hung Le, where 0.3.4 said NamiQ LLC. The website, support, privacy and terms links are still the project's own pages at namiq.io, and the description says that the tool is open source under Apache-2.0 and that the Lattice service it reads is the one at namiq.io. - Wording about the open list. The help for
recent --open, the manual and the 0.3.1 release notes described the open list as covering machines that had not yet been patched. The list cannot know anything about a machine: it says that CISA's due date has passed, and now says exactly that. The feed's own note on namiq.io was corrected the same way, and the same words are kept out of every published text by a test. - No email in the package. The manifests no longer carry an email address; support is the contact page.
- A check for it.
packaging/check_openai_plugin.py, which the release workflow runs, now refuses a package whose listing publisher differs from its author.
Known limits
- The package is not listed in OpenAI's directory. Submitting it needs OpenAI's review, and their upload page has returned an error for this account; nothing here says otherwise.
- The package bundles the
lattice-scanscript. OpenAI's published rules do not say whether bundled scripts are allowed, so the checker reports a warning for it and only OpenAI's review can answer. recentlists what was recently added, and matches by product name. An empty or all-unmatchresult is not the same as safe.- The host check is tested on Debian-family hosts.
Install and verify
- PyPI:
pip install lattice-scan==0.3.5, oruv tool upgrade lattice-scan - Claude Code:
/plugin install lattice-scan --marketplace namiq-ai/lattice-scan - Signed apt repository: https://namiq.io/apt (key fingerprint
C473 6154 4115 8A3E 775C 2EC2 7E61 15F4 0A41 061D, also published at https://namiq.io/lattice/docs) - Assets below:
lattice-scan.pyz,lattice-scan_0.3.5_all.deb, the wheel, the OpenAI plugin package andSHA256SUMS. Check withsha256sum -c SHA256SUMS.
Guide to the command line, the Claude skill and the MCP server: https://namiq.io/lattice/guides/choose-your-channel
v0.3.4
lattice-scan 0.3.4
The OpenAI plugin package, brought in line with OpenAI's published rules. This release changes only the package built for OpenAI's plugin directory. The command-line tool, the Claude skill and what leaves the machine are exactly as in 0.3.3.
Highlights
- Both OpenAI manifests. The package now carries the Codex-format manifest,
.codex-plugin/plugin.json(skills by path,capabilities, starter prompts and the listing underinterface), beside the portableplugin.json. OpenAI's plugin tooling treats the Codex manifest as the required structure. - Icon paths begin with
./. In 0.3.3 the icon and logo paths were writtenassets/icon.png. OpenAI's plugin-creator spec says asset paths are relative and begin with./, so a package built that way was likely to be refused. - A checker, run on every release.
packaging/check_openai_plugin.pychecks the package against what OpenAI publishes (manifest formats, listing limits, https links, asset paths, image size, skill front matter, no hooks, apps or MCP entries, no credentials). The release workflow runs it and stops on an error. It is not OpenAI's own validator, which only runs inside their portal.
Known limits
- The package is not listed in OpenAI's directory. Submitting it needs OpenAI's review, and their upload page has returned an error for this account; nothing here says otherwise.
- The package bundles the
lattice-scanscript. OpenAI's published rules do not say whether bundled scripts are allowed, so the checker reports a warning for it and only OpenAI's review can answer. recentlists what was recently added, and matches by product name. An empty or all-unmatchresult is not the same as safe.- The host check is tested on Debian-family hosts.
Install and verify
- PyPI:
pip install lattice-scan==0.3.4, oruv tool upgrade lattice-scan - Claude Code:
/plugin install lattice-scan --marketplace namiq-ai/lattice-scan - Signed apt repository: https://namiq.io/apt (key fingerprint
C473 6154 4115 8A3E 775C 2EC2 7E61 15F4 0A41 061D, also published at https://namiq.io/lattice/docs) - Assets below:
lattice-scan.pyz,lattice-scan_0.3.4_all.deb, the wheel, the OpenAI plugin package andSHA256SUMS. Check withsha256sum -c SHA256SUMS.
Guide to the command line, the Claude skill and the MCP server: https://namiq.io/lattice/guides/choose-your-channel
v0.3.3
lattice-scan 0.3.3
No arguments runs the daily check, and back-to-back runs stop tripping the keyless limit. This release changes how the tool behaves when you run it with nothing, and how it spaces its calls to Lattice. What leaves the machine is unchanged.
Highlights
lattice-scanwith no arguments now doeslattice-scan recent --daily: it reads the daily list of recent exploited and critical CVEs and checks the likely ones against this host. It used to print "nothing to check". The daily list is the default here because the weekly list is long, and a keyless run that has to look many entries up reaches Lattice's limit.lattice-scan recenton its own is still weekly, and any argument or subcommand does what it names.- Separate runs space themselves out. Without a key Lattice allows 5 calls a minute, counted across everything on the machine. The tool used to space calls only inside one run, so an agent that ran it several times in a row hit
HTTP 429: Too many keyless requestson the sixth call. It now remembers when it last called, in a small file in your cache folder (~/.cache/lattice-scan/pace.json, times only), and waits when it has to, with a line on stderr. - A 429 is waited out. If Lattice still says "retry after N seconds", and N is about a minute or less, the tool waits that long and tries again, twice at most. A longer wait (the hourly or daily limit) still stops the run and lists what was not read, as before.
- One record per finding. Two runs at the same moment used to write the same new finding twice. They now take a lock and write it once.
Changed
- Running
lattice-scanwith nothing used to fail with exit status 2 and a message; it now does the daily check and exits 0 unless Lattice or the list cannot be reached. - A run that has to wait for the keyless limit takes longer than before in exchange for not failing. With a key there is no waiting.
Known limits
recentlists what was recently added, and matches by product name. An empty or all-unmatchresult is not the same as safe.- The hourly (20) and daily (60) keyless allowances still end a run; a key lifts them.
- The host check is tested on Debian-family hosts.
Install and verify
- PyPI:
pip install lattice-scan==0.3.3, oruv tool upgrade lattice-scan - Claude Code:
/plugin install lattice-scan --marketplace namiq-ai/lattice-scan - Signed apt repository: https://namiq.io/apt (key fingerprint
C473 6154 4115 8A3E 775C 2EC2 7E61 15F4 0A41 061D, also published at https://namiq.io/lattice/docs) - Assets below:
lattice-scan.pyz,lattice-scan_0.3.3_all.deb, the wheel, the OpenAI plugin package andSHA256SUMS. Check withsha256sum -c SHA256SUMS.
Guide to the command line, the Claude skill and the MCP server: https://namiq.io/lattice/guides/choose-your-channel
v0.3.2
lattice-scan 0.3.2
The skill reads NamiQ's own notes first. When someone asks Claude or Codex what a CVE means, what to do about it, or whether a fix exists, the skill now points the agent at the notes NamiQ publishes before any outside site. This release changes only the text of the skill. The command-line tool behaves exactly as in 0.3.1, and what leaves the machine is unchanged.
Highlights
- Where the skill sends the agent. A table in the skill lists NamiQ's pages and how to find each: the note for one CVE (through the sitemap, by the lowercase CVE id in the address), today's exploited-in-the-wild watch and daily highlight, all security notes, the month's highlight, the page for a weakness class (CWE), and the analysis report behind a note. They carry their sources and need no key.
- Same rules as before. The skill quotes a note's mitigations and never applies them. It says what the tool printed, as candidates for a person to confirm, and never calls a host vulnerable or safe.
- The OpenAI package attached to this release carries the same skill text, without the key procedure, as before.
Known limits
- Notes exist for the CVEs NamiQ has written about, not for every CVE. When there is none, the skill says so and goes on to outside sources.
recentlists what was recently added, and matches by product name. An empty or all-unmatchresult is not the same as safe.- The host check is tested on Debian-family hosts.
Install and verify
- PyPI:
pip install lattice-scan==0.3.2, oruv tool upgrade lattice-scan - Claude Code:
/plugin install lattice-scan --marketplace namiq-ai/lattice-scan - Signed apt repository: https://namiq.io/apt (key fingerprint
C473 6154 4115 8A3E 775C 2EC2 7E61 15F4 0A41 061D, also published at https://namiq.io/lattice/docs) - Assets below:
lattice-scan.pyz,lattice-scan_0.3.2_all.deb, the wheel, the OpenAI plugin package andSHA256SUMS. Check withsha256sum -c SHA256SUMS.
Guide to the command line, the Claude skill and the MCP server: https://namiq.io/lattice/guides/choose-your-channel
v0.3.1
lattice-scan 0.3.1
recent reads the current list again, and gains the open list. If lattice-scan recent stopped with "the recent-CVE list has schema 'lattice-recent/3'; this lattice-scan reads lattice-recent/2", this release is the one to install. Nothing else changes: what leaves the machine, the table, the other commands and the exit codes are as in 0.3.0.
Highlights
recentreads the list again. namiq.io's list moved from version 2 to version 3, and 0.3.0 accepted only version 2. The tool now reads version 2 and later versions that only add fields. It checks that the period it needs is in the list, so a list that grows does not stop every installed tool. Version 1, or something that is not the list, is still refused, with a request to upgrade.recent --open. The new open list holds exploited CVEs CISA added before the weekly window but within the last 30 days, overdue first. CISA's due date has passed for most of them, which says nothing about any machine. They are checked against the host in the same way as the daily and weekly lists: only the ones that may match are looked up on Lattice.--period openis the same. Weekly is still the default.
Known limits
recentlists what was recently added, and matches by product name. An empty or all-unmatchresult is not the same as safe. For a CVE you know of, use--cve.- The open list needs the list's version 3; on an older list
recent --opensays there is no open list. - The host check is tested on Debian-family hosts.
Install and verify
- PyPI:
pip install lattice-scan==0.3.1, oruv tool upgrade lattice-scan - Signed apt repository: https://namiq.io/apt (key fingerprint
C473 6154 4115 8A3E 775C 2EC2 7E61 15F4 0A41 061D, also published at https://namiq.io/lattice/docs) - Assets below:
lattice-scan.pyz,lattice-scan_0.3.1_all.deb, the wheel, the OpenAI plugin package andSHA256SUMS. Check withsha256sum -c SHA256SUMS.
Guide to the command line, the Claude skill and the MCP server: https://namiq.io/lattice/guides/choose-your-channel
v0.3.0
lattice-scan 0.3.0
A way in when you have no CVE id. Until now the tool and its Claude skill needed a CVE id to start, and an agent asked "is this server exposed?" had none. This release adds three commands and changes the skill to match. It does not change what leaves the machine: package names, versions and the inventory are still never sent.
Highlights
-
lattice-scan recent. Reads namiq.io's daily or weekly list of recent exploited and critical CVEs (--dailyfor the last day or two,--weeklyfor seven days; weekly is the default). It rules out locally every exploited entry this host cannot have, reads only the likely matches from Lattice by exact id, and lists the rest asunmatch. A critical entry that may match isWATCH(not known to be exploited, so Lattice is not asked). With no match it sends nothing to Lattice and says that this is not the same as safe. -
lattice-scan enrich. Give it text that holds CVE ids (anpm auditorpip-auditreport, an advisory, a ticket) on standard input, with--fileor with--cve. Each id is read once and the table says: exploited by CISA's list, since when, patch due, CVSS, ransomware. It does not compare with the host and writes nothing. -
lattice-scan get-key. Requests a Lattice key for a real person who gave their name, position, company and a mailbox they read, and agreed to the beta terms. Nothing is sent without--accept-terms. The key goes to a private file (mode 0600), is never printed, and later runs use it by themselves. The person gets a confirmation email; "not me" withdraws the key. -
Retries. A Lattice request that times out (for example
The handshake operation timed out) or gets 502, 503 or 504 is tried up to three times before the run stops. -
The Claude skill starts with a "which command" table. No id:
recent. Ids in pasted text:enrich. A named id:--cve. A project folder:project. It also says how to ask a person for a key, and that it never asks for one alone. -
For OpenAI. The same skill now runs in OpenAI Codex: it is found in a clone (
.agents/skills/lattice-scan), carriesagents/openai.yaml, and each release attacheslattice-scan-openai-plugin-0.3.0.zip, the package for OpenAI's plugin directory. Its copy of the skill leaves out the key procedure. The package is not listed in the directory until NamiQ submits it for OpenAI's review.
What leaves the machine
recentdownloads a public list from namiq.io. That request carries no CVE id and nothing about the host.- Ids that may match are sent to Lattice one at a time, as before.
get-keysends the name, position, company, email address and purpose you give it, to the key service, and only after--accept-terms.
Changed
- The skill's old rule "do not request a key" is replaced by the procedure in
SKILL.mdsection 5: ask the person, show the terms, get a clear yes, then runget-key. - Exit status 3 now also means
enrichstopped at the limit or read fewer ids than it found.
Known limits
recentlists what was recently added or published. An empty or all-unmatchresult does not mean the host is safe, and a CVE older than the lists is not in them: use--cvefor a CVE you know of.- The local comparison is by product name, as in the host check. It can miss a product installed under an unrelated name, and a match is a candidate for a person to read, not a finding.
- Without a key Lattice allows about 20 reads an hour and 60 a day.
recentstays well under that; a longenrichlist does not, and says which ids it did not read. recentneeds namiq.io's list, schemalattice-recent/2; an older tool cannot read it and an older list cannot be read by this one (the message says to upgrade).- The host check is tested on Debian-family hosts.
Install and verify
- PyPI:
pip install lattice-scan==0.3.0, oruv tool upgrade lattice-scan - Signed apt repository: https://namiq.io/apt (key fingerprint
C473 6154 4115 8A3E 775C 2EC2 7E61 15F4 0A41 061D, also published at https://namiq.io/lattice/docs) - Assets below:
lattice-scan.pyz,lattice-scan_0.3.0_all.deb, the wheel andSHA256SUMS. Check withsha256sum -c SHA256SUMS.
Guide to the command line, the Claude skill and the MCP server: https://namiq.io/lattice/guides/choose-your-channel
v0.2.3
lattice-scan 0.2.3
A narrower result table, so the part that says what matched is not cut off. This release changes only what the host check prints, and the Claude skill's instructions. It does not change which ids are sent to Lattice, what a key can do, or the records on disk.
Highlights
- Shorter table. The header is
EXPLOITandRANSOM; results readCANDIDATE,RECORDED,unmatch,unlisted,skippedandOPEN; columns are two spaces apart;PATCH DUEis the date only; the no-match text isno package, snap, image or kernel matches. An open finding from an earlier run leads with why it matched, then when it was recorded. RANSOMisknownor-.-means CISA has not recorded ransomware use. It does not mean ransomware does not use the CVE.- Narrow terminals keep the match column. If
MATCHED / COMPAREDwould get under 45 characters,LISTED,PRODUCTandCVSSare hidden in turn and a note under the table says so. Piped or redirected output always has every column and never cuts a cell. - The Claude skill explains the table.
SKILL.mdnow describes each column, the progress lines and--quiet, and how to wordRANSOM -andunlisted(never "no ransomware", never "safe").
Changed
- A script that parsed the 0.2.2 table (
EXPLOITED,RANSOMWARE,no match,not listed,OPEN (open),(in 19d)after the due date) must be updated.--json,--csvand exit codes are unchanged. - The progress lines and the project report's own table keep their wording.
Known limits
CANDIDATEis a product-name match for a person to read against the installed version. It is not a finding that the host is vulnerable; a distribution can fix a CVE under an unchanged version number.unlistedmeans only that the CVE is not in the graph's CISA snapshot.- The CVE's own publication date is not shown: Lattice does not return it.
PRODUCTis-for an open finding from an earlier run. - The host check is tested on Debian-family hosts.
Install and verify
- PyPI:
pip install lattice-scan==0.2.3, oruv tool upgrade lattice-scan - Signed apt repository: https://namiq.io/apt (key fingerprint
C473 6154 4115 8A3E 775C 2EC2 7E61 15F4 0A41 061D, also published at https://namiq.io/lattice/docs) - Assets below:
lattice-scan.pyz,lattice-scan_0.2.3_all.deb, the wheel andSHA256SUMS. Check withsha256sum -c SHA256SUMS.
Guide to the command line, the Claude skill and the MCP server: https://namiq.io/lattice/guides/choose-your-channel
v0.2.2
lattice-scan 0.2.2
One result table, with the facts you decide on. This release changes only what the host check prints. It does not change which ids are sent to Lattice, what a key can do, or the records on disk (two fields are added to new findings).
Highlights
- One table.
RESULT BY CVEnow includes any open finding recorded by an earlier run, shown asOPENwith the date and reason it was recorded. The separate "N finding(s) not yet fixed" line is removed, because the table says it. - More columns:
EXPLOITED(CISA lists the CVE as exploited in the wild),CVSS(NVD score),LISTED(date CISA added it),PATCH DUE(CISA's due date, with days left or days late) andRANSOMWARE(known,not recordedor-). - Console-style layout, as in
docker psandkubectl get: upper-case header, no dashed rule, one line per row, cells never wrap. Piped or redirected output keeps the whole text sogrepandawkwork; on a terminal the last column is cut with an ellipsis. A project report with--widthstill holds that width.
Changed
- A script that parsed the old table header (
CISA list, dashed rule, wrapped cells) or the "not yet fixed" line must be updated.--json,--csvand exit codes are unchanged. - New findings store
ransomwareandcvss. Older findings show-in those columns until the CVE is read again.
Known limits
RANSOMWARE: not recordedmeans CISA has not recorded ransomware use. It does not mean ransomware does not use the CVE.EXPLOITED: nomeans only that the CVE is not in the graph's CISA snapshot.- The CVE's own publication date is not shown: Lattice does not return it.
PRODUCTis-for an open finding from an earlier run.- A match is a candidate for a person to read, not a finding. The host check is tested on Debian-family hosts.
Install and verify
- PyPI:
pip install lattice-scan==0.2.2, oruv tool upgrade lattice-scan - Signed apt repository: https://namiq.io/apt (key fingerprint
C473 6154 4115 8A3E 775C 2EC2 7E61 15F4 0A41 061D, also published at https://namiq.io/lattice/docs) - Assets below:
lattice-scan.pyz,lattice-scan_0.2.2_all.deb, the wheel andSHA256SUMS. Check withsha256sum -c SHA256SUMS.
Guide to the command line, the Claude skill and the MCP server: https://namiq.io/lattice/guides/choose-your-channel
v0.2.1
lattice-scan 0.2.1
See what the scan is doing, read the result as a table, and know where the detail is. This release changes what lattice-scan prints and how it judges a package that only looks like the product. It does not change which ids are sent to Lattice or what a key can do.
Highlights
- Progress, on by default. On stderr, one line per step: each part of the host as it is collected (packages and which package manager, snaps, running container image names, kernel) with counts; each project file read with its kind (
Python requirements,JavaScript lockfile,Java Maven file,Docker image fileand so on) and its component count; then for each CVE[n/N], "asking Lattice (only this id is sent)", what CISA lists, what it was compared with, and whether anything matched. Package names and versions are never printed.--quiet(-q) orLATTICE_SCAN_PROGRESS=0turns it off. - A result table. The host check and the console project report print
RESULT BY CVE: the CVE, whether CISA lists it, the product, the result (CANDIDATE,no match,not listed,skipped, or the project verdict) and what matched or was compared.--jsonoutput carries the same rows as acheckedlist per project. - The detail files are named. A
DETAILED RESULT FILESsection says where the full detail is: for the host, the private records folder and what each file holds (findings.jsonl,scan.log,inventory.json,runs.jsonl), with thelist,impactandresolvecommands; for a project, the--csvand--jsonfiles you asked for, or how to ask for one. - A new verdict,
lead. A package that only shares a scope or name with the product (@vitejs/plugin-reactfor Vite), or is its client library (the PyPIminiofor the MinIO server), is alead. Its version is never compared with the product's ranges, it has its own summary column, and it ranks below every real comparison, so it no longer inflates the in-range or undetermined counts.
Changed
- stderr now carries progress lines by default. Standard output keeps its form, with the result table and the detail-files section added to the host check and the console report.
--format csv,--format json, exit codes and the records on disk are unchanged. A script or CI job that expects an empty stderr should pass--quiet. - A JSON result gains
checkedper project, and a finding may carry"verdict": "lead". Code that reads the JSON should accept both.
Known limits
- A match is a candidate for a person to read, not a finding. A distribution can fix a CVE under an unchanged version number, and a lockfile may not be what runs.
- The progress and tables describe what lattice-scan did. They do not mean a host is safe: a CVE that is
not listedis only not listed in the graph's snapshot. - The host check is tested on Debian-family hosts. On rpm and apk hosts the inventory is collected but matching is not tested.
- The project check does not read
composer.json.
Install and verify
- PyPI:
pip install lattice-scan==0.2.1, oruv tool upgrade lattice-scan - Signed apt repository: https://namiq.io/apt (key fingerprint
C473 6154 4115 8A3E 775C 2EC2 7E61 15F4 0A41 061D, also published at https://namiq.io/lattice/docs) - Assets below:
lattice-scan.pyz,lattice-scan_0.2.1_all.deb, the wheel andSHA256SUMS. Check withsha256sum -c SHA256SUMS.
Guide to the command line, the Claude skill and the MCP server: https://namiq.io/lattice/guides/choose-your-channel