Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
npx agentmods add agents/multiplex-term/multiplex/release-and-metadatagit clone --depth 1 https://github.com/multiplex-term/MultiplexWhat it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5 | $0.00000 | $0.02065 |
| Opus 5 | $0.00000 | $0.01033 |
| Sonnet 5 | $0.00000 | $0.00413 |
| Haiku 4.5 | $0.00000 | $0.00206 |
Grade A, and why
release-and-metadata scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured yesterday.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 127 lines — stays where its author put it; the contents beside it link to each section on GitHub.
Release surfaces: app icon, release notes, store metadata
Split from AGENTS.md — read before committing any user-visible change.
ruby Tools/check-metadata.rb is the mechanical half of this document, and
CI's Linux job runs it on every push. It reads
fastlane/testflight-whats-new.txt and fastlane/metadata/, and fails on: a
field over its App Store Connect cap (measured in CHARACTERS — this copy's
dashes and arrows run its byte length several hundred higher), an empty or
missing field, a shared description.txt / release_notes.txt breaking the
platform split, CRLF, control characters, and any non-ASCII glyph not vetted
in Tools/metadata_limits.rb. That last rule is the ⟨…⟩ incident: the
changelog looked right in every editor and App Store Connect refused the
character. The caps live in that one file, required by fastlane/Fastfile
too, so the lane that fails an archive and the job that fails a pull request
can never disagree. Add a glyph to the allowlist only after an upload has
actually accepted it. Localized listings (fastlane/metadata/zh-Hant, ja
— every en-US file mirrored, same caps) are allowed their whole scripts by
Unicode block (MetadataLimits::SCRIPT_RANGES: ideographs, kana, bopomofo,
CJK punctuation, full-width forms) instead of glyph-by-glyph; en-US and
the TestFlight changelog stay glyph-strict, and the changelog stays
English. When en-US copy changes, change the two mirrors in the same PR
(glossary in i18n.md; run zhtw-mcp lint over the zh-Hant files).
- App icon is a hand-authored Icon Composer package (
AppIcon.icon; spec + bake-off inDESIGN.md); icon.json lists groups frontmost-first. Validate headlessly withxcrun actool AppIcon.icon --compile <dir> --platform iphonesimulator --minimum-deployment-target 17.0 --app-icon AppIcon --output-partial-info-plist <dir>/p.plist— zero warnings today; the emitted PNGs are the flattened pre-26 fallbacks. Icon Composer has no visionOS target, soAssets.xcassets/AppIcon.solidimagestackis baked, not hand-drawn:swift Tools/bake-vision-icon.swiftrenders with Icon Composer's ownictooland unblends the layers, verifying the restack recomposites the reference (≤0.5/255). Never edit the three layer PNGs by hand — editAppIcon.iconand re-bake. Keep the artwork SVGs to filled paths — nostroke. Icon Composer's importer closes an open stroked path, and the iOS 26 design generation draws that phantom closing segment as a grey hairline. The V used to be a stroked<polyline>, so a line ran across the M's counter — invisible in Icon Composer's preview, on device, and in every default (generation 27) render, and visible only where the 26 generation is rendered: App Store Connect and the App Store product page. Fixed by outlining the stroke into a fill; caps and the mitered apex are spelled out incarrier.svg. Check both generations when the artwork changes —ictoolinsideIcon Composer.app/Contents/Executablestakes--design-generation 26|27, and a background row through the counter (y≈310, x 400–620 at 1024) must read the fill's ~24/255, not ~108. - The release notes are one content model with two renderings, and the
launch card is priced like the interruption it is (
ReleaseNotespure + tested;WhatsNewViewController/ReleaseLogViewController;ReleaseNotesStore). The card shows up to FOUR changes (a patch release shows what it has — 1.4.1 is three rows on an iPhone), no navigation bar, and ends inside one phone screen; FULL NOTES and Settings ▸ About ▸ What's New both open the full banked record —ReleaseNotes.releases, every release newest first, so a reader updating across two releases misses neither. The card speaks only for the newest release. Bake-off record: the log alone was dismissed at the fold, the card alone left eight changes unread, so each absorbs the other's failure. Load-bearing details:- A missing stamp is not a first run. Every device updating from a
version that never wrote one has
lastSeenVersion == nil, soReleaseNotesGatetakesinstallHasPriorUse(the deck answers it with its locally cached host list) to tell "updated" from "installed today". Reading nil as new silences the notes for exactly the people they are for; reading it as updated shows a changelog to someone meeting the app. Pinned byReleaseNotesTests+DeckWindowUIKitTests. - Once per NOTES release:
ReleaseNotes.versionadvancing at any component reopens the card (1.3 → 1.3.1 did, because 1.3.1 wrote notes of its own); a patch build that leaves the constant alone compares equal and stays silent. Stamped on presentation rather than dismissal (a force-quit mid-animation must not make it recurring), and device-localUserDefaults— updating on iPad must not consume the notice on Vision Pro, so it never rides the synced Host record. ReleaseNotes.versionis the notes' own release, not the bundle's short version: a patch build must not present itself as a release with its own notes.- Entries and highlights are platform-filtered the way
TerminalGuide.entries(for:)is — GLASS never reaches an iPad, keep-alive never a Vision Pro — and each platform's FOURTH card row is whichever change is about it. The card's "also in 1.3" line is DERIVED from the entries no shown highlightcovers, so it can never re-offer something the card just said or miscount the rest. - It rides the deck's presentation queue as its own
PresentationKind, so it waits behind the app-lock veil; it defers whileExternalActionRouter.hasPendingActions(a widget deep link asked for something specific), and it needs real deck width — the compact shell clips its deck pane to zero, and a later layout pass retries. FULL NOTES supersedes the card rather than stacking a second sheet, the same reason the licenses page is its own modal.
- A missing stamp is not a first run. Every device updating from a
version that never wrote one has
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- yesterday First seen · 127 lines · 0 tokens per session scan A 70ad7dc781b0
release-and-metadata is an agent published in the GitHub repository multiplex-term/Multiplex (10 stars, last pushed 5d ago), licensed Apache-2.0. It costs nothing until one of its globs matches a file; then it loads 2,065 tokens. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-31.
Other agents, from other repositories
i18n
Hermex ships one String Catalog, HermesMobile/Resources/Localizable.xcstrings, included in the app, widget, and share-extension targets. Every user-facing literal is already externalized (String(localized:) / LocalizedStringKey), so adding a language is normally translation-only — no Swift edits.
Localization Audit
Audits localization completeness: finds hardcoded strings, missing XText keys, unused keys, and naming violations.
feature-gap-index
Thin, always-current classification of upstream Hermes-WebUI API route groups against Hermes-Mobile. This file replaces an earlier 1,400-line per-endpoint catalog, which mixed durable judgment (priority, defer/skip decisions, safety notes) with volatile detail (exact JSON shapes, handler names) that rotted between…
issue-tracker
Issues and PRDs for this repo live as GitHub issues. Use the gh CLI for issue operations.
layer3-issue-detection
Layer 3 systematically scans ALL entry points from Layer 1 and applies issue detection rules. Unlike Layer 2 (which traces specific flows in depth), Layer 3 does a breadth-first scan to categorize issues across the entire codebase.
layer5-data-wiring
Layer 5 verifies that features use real user data instead of mock/hardcoded values, and that model capabilities are fully wired into the features that need them. While Layers 1-4 audit navigation and UX, Layer 5 audits whether the data flowing through those workflows is genuine.