diff --git a/.agents/README.md b/.agents/README.md index 4df6ecd6..6344e251 100644 --- a/.agents/README.md +++ b/.agents/README.md @@ -20,17 +20,17 @@ Editor rules (if present under `.cursor/rules/`): ## Layout -| Path | Purpose | -| --- | --- | -| [overview.md](overview.md) | Project brief and invariants | -| [module-ownership.md](module-ownership.md) | Domain to manager / HTTP / WS / tests map | -| [conventions/reticulum-zen.md](conventions/reticulum-zen.md) | Zen of Reticulum hard gates | -| [conventions/core.md](conventions/core.md) | Always-on standards | -| [conventions/frontend.md](conventions/frontend.md) | Vue UI | -| [conventions/backend.md](conventions/backend.md) | Python / HTTP / SQLite | -| [conventions/path-jail.md](conventions/path-jail.md) | Local FS APIs: jail, symlinks, tests | -| [conventions/android.md](conventions/android.md) | Android WebView bridge | -| [conventions/tests.md](conventions/tests.md) | Test placement, oracles, verification | +| Path | Purpose | +| ------------------------------------------------------------ | ----------------------------------------- | +| [overview.md](overview.md) | Project brief and invariants | +| [module-ownership.md](module-ownership.md) | Domain to manager / HTTP / WS / tests map | +| [conventions/reticulum-zen.md](conventions/reticulum-zen.md) | Zen of Reticulum hard gates | +| [conventions/core.md](conventions/core.md) | Always-on standards | +| [conventions/frontend.md](conventions/frontend.md) | Vue UI | +| [conventions/backend.md](conventions/backend.md) | Python / HTTP / SQLite | +| [conventions/path-jail.md](conventions/path-jail.md) | Local FS APIs: jail, symlinks, tests | +| [conventions/android.md](conventions/android.md) | Android WebView bridge | +| [conventions/tests.md](conventions/tests.md) | Test placement, oracles, verification | ## Skills @@ -40,69 +40,69 @@ Each skill is `.agents/skills//SKILL.md` with YAML frontmatter (`name` mat Copied from [realrossmanngroup/no_ai_slop_writing_rules](https://github.com/realrossmanngroup/no_ai_slop_writing_rules). Load `no-ai-slop` for every prose pass. Load `rossmann-voice` only when the user asks for that voice. -| Skill | Use when | -| --- | --- | -| [no-ai-slop](skills/no-ai-slop/SKILL.md) | Writing or editing prose. Banned patterns and WRONG/RIGHT fixes. Rules: [references/rules.md](skills/no-ai-slop/references/rules.md). | -| [rossmann-voice](skills/rossmann-voice/SKILL.md) | User asked for Louis Rossmann's voice (claim-then-proof, contractions, testable numbers). | +| Skill | Use when | +| ------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------- | +| [no-ai-slop](skills/no-ai-slop/SKILL.md) | Writing or editing prose. Banned patterns and WRONG/RIGHT fixes. Rules: [references/rules.md](skills/no-ai-slop/references/rules.md). | +| [rossmann-voice](skills/rossmann-voice/SKILL.md) | User asked for Louis Rossmann's voice (claim-then-proof, contractions, testable numbers). | ### Reticulum Philosophy: [Zen of Reticulum](https://reticulum.network/manual/zen.html). Site: [reticulum.network](https://reticulum.network/). -| Skill | Use when | -| --- | --- | -| [reticulum-design-gates](skills/reticulum-design-gates/SKILL.md) | Mesh design review against Zen gates | -| [reticulum-stack](skills/reticulum-stack/SKILL.md) | Identities, destination hashes, aspects, announces, paths, links | -| [reticulum-interfaces](skills/reticulum-interfaces/SKILL.md) | Interface config, RNode/TCP/AutoInterface, medium-agnostic app code | -| [rns-link-api](skills/rns-link-api/SKILL.md) | Generic RNS Link WebSocket / plugin transport | -| [lxmf-messaging](skills/lxmf-messaging/SKILL.md) | LXMF send/receive, stamps, propagation, attachments | -| [lxst-telephony](skills/lxst-telephony/SKILL.md) | LXST calls, audio WS, telephony managers | -| [rrc-relay-chat](skills/rrc-relay-chat/SKILL.md) | Relay Chat hubs, rooms, +k keys, moderation | -| [rns-filesync](skills/rns-filesync/SKILL.md) | RNS FileSync shares, announces, sync-root jail | -| [nomad-pages](skills/nomad-pages/SKILL.md) | NomadNet browser, Mesh Server page nodes, Micron | -| [privacy-mode-clearnet](skills/privacy-mode-clearnet/SKILL.md) | Privacy mode vs outbound HTTP. Mesh traffic stays up. | +| Skill | Use when | +| ---------------------------------------------------------------- | ------------------------------------------------------------------- | +| [reticulum-design-gates](skills/reticulum-design-gates/SKILL.md) | Mesh design review against Zen gates | +| [reticulum-stack](skills/reticulum-stack/SKILL.md) | Identities, destination hashes, aspects, announces, paths, links | +| [reticulum-interfaces](skills/reticulum-interfaces/SKILL.md) | Interface config, RNode/TCP/AutoInterface, medium-agnostic app code | +| [rns-link-api](skills/rns-link-api/SKILL.md) | Generic RNS Link WebSocket / plugin transport | +| [lxmf-messaging](skills/lxmf-messaging/SKILL.md) | LXMF send/receive, stamps, propagation, attachments | +| [lxst-telephony](skills/lxst-telephony/SKILL.md) | LXST calls, audio WS, telephony managers | +| [rrc-relay-chat](skills/rrc-relay-chat/SKILL.md) | Relay Chat hubs, rooms, +k keys, moderation | +| [rns-filesync](skills/rns-filesync/SKILL.md) | RNS FileSync shares, announces, sync-root jail | +| [nomad-pages](skills/nomad-pages/SKILL.md) | NomadNet browser, Mesh Server page nodes, Micron | +| [privacy-mode-clearnet](skills/privacy-mode-clearnet/SKILL.md) | Privacy mode vs outbound HTTP. Mesh traffic stays up. | ### UI and wiring -| Skill | Use when | -| --- | --- | -| [page-toast-tests](skills/page-toast-tests/SKILL.md) | New pages, toasts, i18n, tests | -| [contribution-registries](skills/contribution-registries/SKILL.md) | Nav, tools, commands, settings search, WS event wiring | -| [vue-mega-page-split](skills/vue-mega-page-split/SKILL.md) | Extract Vue mega-pages into internal/sections/helpers | -| [meshchat-orchestration-split](skills/meshchat-orchestration-split/SKILL.md) | Extract HTTP/WS from meshchat.py, multi-file scanners | +| Skill | Use when | +| ---------------------------------------------------------------------------- | ------------------------------------------------------ | +| [page-toast-tests](skills/page-toast-tests/SKILL.md) | New pages, toasts, i18n, tests | +| [contribution-registries](skills/contribution-registries/SKILL.md) | Nav, tools, commands, settings search, WS event wiring | +| [vue-mega-page-split](skills/vue-mega-page-split/SKILL.md) | Extract Vue mega-pages into internal/sections/helpers | +| [meshchat-orchestration-split](skills/meshchat-orchestration-split/SKILL.md) | Extract HTTP/WS from meshchat.py, multi-file scanners | ### Identity and data -| Skill | Use when | -| --- | --- | -| [identity-restore](skills/identity-restore/SKILL.md) | Identity key vs database zip restore | -| [identity-switch-teardown](skills/identity-switch-teardown/SKILL.md) | Live identity switch without cross-identity leaks | -| [database-migrations-backups](skills/database-migrations-backups/SKILL.md) | Schema bumps, backups, snapshots, restore safety | -| [landlock-sqlite](skills/landlock-sqlite/SKILL.md) | Landlock + SQLite, subprocess/user-local CLI probes | +| Skill | Use when | +| -------------------------------------------------------------------------- | --------------------------------------------------- | +| [identity-restore](skills/identity-restore/SKILL.md) | Identity key vs database zip restore | +| [identity-switch-teardown](skills/identity-switch-teardown/SKILL.md) | Live identity switch without cross-identity leaks | +| [database-migrations-backups](skills/database-migrations-backups/SKILL.md) | Schema bumps, backups, snapshots, restore safety | +| [landlock-sqlite](skills/landlock-sqlite/SKILL.md) | Landlock + SQLite, subprocess/user-local CLI probes | ### Security and plugins -| Skill | Use when | -| --- | --- | -| [auth-csrf-ws-security](skills/auth-csrf-ws-security/SKILL.md) | CSRF, auth, WS mutator denylist | -| [path-jail-local-fs](skills/path-jail-local-fs/SKILL.md) | Local file browse/upload/delete path jails | +| Skill | Use when | +| ------------------------------------------------------------------ | ------------------------------------------- | +| [auth-csrf-ws-security](skills/auth-csrf-ws-security/SKILL.md) | CSRF, auth, WS mutator denylist | +| [path-jail-local-fs](skills/path-jail-local-fs/SKILL.md) | Local file browse/upload/delete path jails | | [plugin-install-security](skills/plugin-install-security/SKILL.md) | Plugin install, RSG, permissions, integrity | ### Platforms and boot -| Skill | Use when | -| --- | --- | -| [deferred-network-startup](skills/deferred-network-startup/SKILL.md) | HTTP-up vs RNS-ready, status, 503s, RNS panic | +| Skill | Use when | +| ---------------------------------------------------------------------- | --------------------------------------------- | +| [deferred-network-startup](skills/deferred-network-startup/SKILL.md) | HTTP-up vs RNS-ready, status, 503s, RNS panic | | [electron-frozen-packaging](skills/electron-frozen-packaging/SKILL.md) | Frozen desktop spawn, loading, crash recovery | -| [android-webview-bridge](skills/android-webview-bridge/SKILL.md) | Android chooser MIME, storage, WebView nav | +| [android-webview-bridge](skills/android-webview-bridge/SKILL.md) | Android chooser MIME, storage, WebView nav | ### Verification -| Skill | Use when | -| --- | --- | -| [test-loop](skills/test-loop/SKILL.md) | Focused verification without hung shells | -| [test-oracles](skills/test-oracles/SKILL.md) | Property/fuzz oracles: accept/reject, not soft fuzz | -| [exploratory-testing](skills/exploratory-testing/SKILL.md) | Adversarial exploration with hypotheses | +| Skill | Use when | +| ---------------------------------------------------------- | --------------------------------------------------- | +| [test-loop](skills/test-loop/SKILL.md) | Focused verification without hung shells | +| [test-oracles](skills/test-oracles/SKILL.md) | Property/fuzz oracles: accept/reject, not soft fuzz | +| [exploratory-testing](skills/exploratory-testing/SKILL.md) | Adversarial exploration with hypotheses | ## Product docs (users) diff --git a/.agents/overview.md b/.agents/overview.md index c3ac5022..13ad9e5e 100644 --- a/.agents/overview.md +++ b/.agents/overview.md @@ -67,24 +67,24 @@ Critical lifecycle facts: ## Repository layout -| Path | Role | -| --------------------------------- | ------------------------------------------- | -| `meshchatx/meshchat.py` | Orchestration, CLI, lifecycle entry | -| `meshchatx/src/backend/http/` | HTTP middleware, route modules, WS dispatch | -| `meshchatx/src/backend/` | Managers, DB, security, Landlock, plugins | -| `.agents/module-ownership.md` | Domain to manager/HTTP/WS/tests map | -| `meshchatx/src/frontend/` | Vue 3 UI, locales, registries, helpers | -| `meshchatx/public/` | Built frontend assets consumed at runtime | -| `electron/` | Desktop shell around local HTTPS backend | -| `android/` | WebView + Chaquopy Python bridge | -| `tests/backend/` | pytest | -| `tests/frontend/` | vitest | -| `tests/e2e/` | Playwright | -| `docs/en/` | In-app / shipped English docs | -| `vendor/` | Vendored deps (LXMFy, RNS FileSync) | -| `Taskfile.yml` | Preferred command entrypoints | -| `.agents/` | Agent guidance (this tree) | -| `AGENTS.md` | Short pointer to `.agents/` | +| Path | Role | +| ----------------------------- | ------------------------------------------- | +| `meshchatx/meshchat.py` | Orchestration, CLI, lifecycle entry | +| `meshchatx/src/backend/http/` | HTTP middleware, route modules, WS dispatch | +| `meshchatx/src/backend/` | Managers, DB, security, Landlock, plugins | +| `.agents/module-ownership.md` | Domain to manager/HTTP/WS/tests map | +| `meshchatx/src/frontend/` | Vue 3 UI, locales, registries, helpers | +| `meshchatx/public/` | Built frontend assets consumed at runtime | +| `electron/` | Desktop shell around local HTTPS backend | +| `android/` | WebView + Chaquopy Python bridge | +| `tests/backend/` | pytest | +| `tests/frontend/` | vitest | +| `tests/e2e/` | Playwright | +| `docs/en/` | In-app / shipped English docs | +| `vendor/` | Vendored deps (LXMFy, RNS FileSync) | +| `Taskfile.yml` | Preferred command entrypoints | +| `.agents/` | Agent guidance (this tree) | +| `AGENTS.md` | Short pointer to `.agents/` | Business rules belong in backend managers under `meshchatx/src/backend/`. Keep `meshchat.py` focused on transport and lifecycle when possible. diff --git a/.agents/skills/landlock-sqlite/SKILL.md b/.agents/skills/landlock-sqlite/SKILL.md index 0a16c354..9a6ad684 100644 --- a/.agents/skills/landlock-sqlite/SKILL.md +++ b/.agents/skills/landlock-sqlite/SKILL.md @@ -49,8 +49,42 @@ Landlock / Windows AppContainer + SQLite conversation-load failures (temp_store, - `_collect_read_roots()` includes user-local CLI roots when present (`landlock_sandbox._collect_user_local_cli_roots`) - `_collect_rw_roots()` includes `~/.local/share/argos-translate` when present +- `_collect_read_roots()` includes `/sys` so pyserial can `open()` USB `idVendor`/`product` (stat alone is not enough) +- `apply_landlock_sandbox(extra_read_roots=...)` covers Sideband `command_plugins_path` when that dir exists at process start - New external-tool integrations: add roots and a probe in `tests/backend/test_landlock_integration_surfaces.py` +## Serial ports and RNode (Linux Landlock) + +### Symptoms + +- Add Interface serial dropdown is empty with an RNode plugged in +- `/api/v1/comports` returns 500 +- Logs show `TypeError: int() can't convert non-string with explicit base` + +### Root cause + +pyserial `list_ports_linux.SysFS` stats `/sys/class/tty//device` (Landlock allows this without a `/sys` rule), then `open()`s `idVendor`. That open fails, `read_line` returns None, and `int(None, 16)` raises. The comports route used to let that exception become HTTP 500. + +### Required behavior + +- `/sys` is a Landlock read root +- `list_serial_comports()` catches TypeError/ValueError/OSError and globs USB-like nodes (`ttyUSB`, `ttyACM`, `ttyAMA`, `rfcomm`) +- Probe: `test_landlock_allows_sysfs_tty_and_pyserial_comports` + +## Custom interfaces, executable pages, plugins + +In-tree copies already sit on Landlock roots: + +- Custom RNS modules: `/interfaces` (RW) +- Mesh Server executable pages: `/identities//page_nodes/.../pages` (RW). Probe: `test_landlock_executable_page_script_spawn` +- MeshChatX plugins: `/plugins` (RW). Probe: `test_landlock_loads_python_plugin_from_storage` + +These still fail under Landlock, by design: + +- `location_cmd` or PipeInterface `command` whose binary is outside `/usr`, `~/.local/bin`, storage, and the Reticulum config dir (example: `~/bin/gps.sh`) +- Sideband `command_plugins_path` that did not exist yet when the process started (Landlock cannot add roots later). Restart after setting the path. +- Executable page scripts that write under `$HOME` or exec `/opt/...` + ## Windows counterpart - Module: `meshchatx/src/backend/appcontainer_sandbox.py` @@ -73,6 +107,8 @@ For live stress, run Landlock in a **subprocess** (sandbox applies once per proc - `meshchatx/src/backend/database/__init__.py` - `meshchatx/src/backend/memory_pressure.py` - `meshchatx/src/backend/landlock_sandbox.py` +- `meshchatx/src/backend/serial_comports.py` +- `meshchatx/src/backend/appcontainer_sandbox.py` - `meshchatx/src/backend/appcontainer_sandbox.py` - `meshchatx/src/backend/appcontainer_launcher.py` - `meshchatx/src/backend/seccomp_sandbox.py` (syscall denylist after Landlock) diff --git a/.agents/skills/no-ai-slop/SKILL.md b/.agents/skills/no-ai-slop/SKILL.md index 1ba99f20..02c65424 100644 --- a/.agents/skills/no-ai-slop/SKILL.md +++ b/.agents/skills/no-ai-slop/SKILL.md @@ -33,17 +33,17 @@ A sentence that asserts importance without a detail says nothing. End every clai Three sections built from the same template read as machine output, even when each fact is true. Vary paragraph count, sentence rhythm, and how each section opens. - WRONG (three sections, identical shape): - ``` - In [year], [party] did [thing]. This affected [number] people. [Party] responded by [action]. - In [year], [party] did [thing]. This affected [number] people. [Party] responded by [action]. - In [year], [party] did [thing]. This affected [number] people. [Party] responded by [action]. - ``` + ``` + In [year], [party] did [thing]. This affected [number] people. [Party] responded by [action]. + In [year], [party] did [thing]. This affected [number] people. [Party] responded by [action]. + In [year], [party] did [thing]. This affected [number] people. [Party] responded by [action]. + ``` - RIGHT (vary the shape): - ``` - Section one: a detailed narrative with timeline and context across two paragraphs. - Section two: a two-sentence summary, because the event is thinly documented. - Section three: opens with the party's stated justification, then the contradicting evidence. - ``` + ``` + Section one: a detailed narrative with timeline and context across two paragraphs. + Section two: a two-sentence summary, because the event is thinly documented. + Section three: opens with the party's stated justification, then the contradicting evidence. + ``` ## Rule 11: No filler phrases diff --git a/.agents/skills/no-ai-slop/references/ai-writing-detection.md b/.agents/skills/no-ai-slop/references/ai-writing-detection.md index 29fb6d91..d92c976c 100644 --- a/.agents/skills/no-ai-slop/references/ai-writing-detection.md +++ b/.agents/skills/no-ai-slop/references/ai-writing-detection.md @@ -7,6 +7,7 @@ Sources: Grammarly (2025), Microsoft 365 Life Hacks (2025), GPTHuman (2025), Wal --- ## Contents + - Em Dashes: The Primary AI Tell - Overused Verbs - Overused Adjectives @@ -29,20 +30,23 @@ Sources: Grammarly (2025), Microsoft 365 Life Hacks (2025), GPTHuman (2025), Wal Em dashes are longer than hyphens (-) and are used for emphasis, interruptions, or parenthetical information. While they have legitimate uses in writing, AI models drastically overuse them. ### Why Em Dashes Signal AI Writing + - AI models were trained on edited books, academic papers, and style guides where em dashes appear frequently - AI uses em dashes as a shortcut for sentence variety instead of commas, colons, or parentheses - Most human writers rarely use em dashes because they don't exist as a standard keyboard key - The overuse is so consistent that it has become the unofficial signature of ChatGPT writing ### What To Do Instead -| Instead of | Use | -|------------|-----| -| The results—which were surprising—showed... | The results, which were surprising, showed... | -| This approach—unlike traditional methods—allows... | This approach, unlike traditional methods, allows... | -| The study found—as expected—that... | The study found, as expected, that... | + +| Instead of | Use | +| ---------------------------------------------------------- | ------------------------------------------------------------ | +| The results—which were surprising—showed... | The results, which were surprising, showed... | +| This approach—unlike traditional methods—allows... | This approach, unlike traditional methods, allows... | +| The study found—as expected—that... | The study found, as expected, that... | | Communication skills—both written and verbal—are essential | Communication skills (both written and verbal) are essential | ### Guidelines + - Use commas for most parenthetical information - Use colons to introduce explanations or lists - Use parentheses for supplementary information @@ -53,78 +57,80 @@ Em dashes are longer than hyphens (-) and are used for emphasis, interruptions, ## Overused Verbs -| Avoid | Use Instead | -|-------|-------------| +| Avoid | Use Instead | +| ------------ | -------------------------------------- | | delve (into) | explore, examine, investigate, look at | -| leverage | use, apply, draw on | -| optimise | improve, refine, enhance | -| utilise | use | -| facilitate | help, enable, support | -| foster | encourage, support, develop, nurture | -| bolster | strengthen, support, reinforce | -| underscore | emphasise, highlight, stress | -| unveil | reveal, show, introduce, present | -| navigate | manage, handle, work through | -| streamline | simplify, make more efficient | -| enhance | improve, strengthen | -| endeavour | try, attempt, effort | -| ascertain | find out, determine, establish | -| elucidate | explain, clarify, make clear | +| leverage | use, apply, draw on | +| optimise | improve, refine, enhance | +| utilise | use | +| facilitate | help, enable, support | +| foster | encourage, support, develop, nurture | +| bolster | strengthen, support, reinforce | +| underscore | emphasise, highlight, stress | +| unveil | reveal, show, introduce, present | +| navigate | manage, handle, work through | +| streamline | simplify, make more efficient | +| enhance | improve, strengthen | +| endeavour | try, attempt, effort | +| ascertain | find out, determine, establish | +| elucidate | explain, clarify, make clear | --- ## Overused Adjectives -| Avoid | Use Instead | -|-------|-------------| -| robust | strong, reliable, thorough, solid | -| comprehensive | complete, thorough, full, detailed | -| pivotal | key, critical, central, important | -| crucial | important, key, essential, critical | -| vital | important, essential, necessary | -| transformative | significant, important, major | -| cutting-edge | new, advanced, recent, modern | -| groundbreaking | new, original, significant | -| innovative | new, original, creative | -| seamless | smooth, easy, effortless | -| intricate | complex, detailed, complicated | -| nuanced | subtle, complex, detailed | -| multifaceted | complex, varied, diverse | -| holistic | complete, whole, comprehensive | +| Avoid | Use Instead | +| -------------- | ----------------------------------- | +| robust | strong, reliable, thorough, solid | +| comprehensive | complete, thorough, full, detailed | +| pivotal | key, critical, central, important | +| crucial | important, key, essential, critical | +| vital | important, essential, necessary | +| transformative | significant, important, major | +| cutting-edge | new, advanced, recent, modern | +| groundbreaking | new, original, significant | +| innovative | new, original, creative | +| seamless | smooth, easy, effortless | +| intricate | complex, detailed, complicated | +| nuanced | subtle, complex, detailed | +| multifaceted | complex, varied, diverse | +| holistic | complete, whole, comprehensive | ### Overused Metaphorical Nouns (2025-2026) + AI models use these nouns metaphorically to inject false gravitas. Literal uses are fine. -| Avoid (metaphorical) | Acceptable (literal) | -|-------|-------------| -| tapestry ("a tapestry of regulations") | tapestry (actual woven fabric) | -| symphony ("a symphony of features") | symphony (actual musical composition) | -| beacon ("a beacon of hope") | beacon (actual light or signal device) | -| realm ("in the realm of cybersecurity") | realm (actual kingdom or territory) | +| Avoid (metaphorical) | Acceptable (literal) | +| --------------------------------------- | ---------------------------------------------------------------- | +| tapestry ("a tapestry of regulations") | tapestry (actual woven fabric) | +| symphony ("a symphony of features") | symphony (actual musical composition) | +| beacon ("a beacon of hope") | beacon (actual light or signal device) | +| realm ("in the realm of cybersecurity") | realm (actual kingdom or territory) | | testament ("a testament to innovation") | testament (actual legal document, e.g., last will and testament) | --- ## Overused Transitions and Connectors -| Avoid | Use Instead | -|-------|-------------| -| furthermore | also, in addition, and | -| moreover | also, and, besides | -| notwithstanding | despite, even so, still | -| that being said | however, but, still | -| at its core | essentially, fundamentally, basically | -| to put it simply | in short, simply put | -| it is worth noting that | note that, importantly | -| in the realm of | in, within, regarding | -| in the landscape of | in, within | -| in today's [anything] | currently, now, today | +| Avoid | Use Instead | +| ----------------------- | ------------------------------------- | +| furthermore | also, in addition, and | +| moreover | also, and, besides | +| notwithstanding | despite, even so, still | +| that being said | however, but, still | +| at its core | essentially, fundamentally, basically | +| to put it simply | in short, simply put | +| it is worth noting that | note that, importantly | +| in the realm of | in, within, regarding | +| in the landscape of | in, within | +| in today's [anything] | currently, now, today | --- ## Phrases That Signal AI Writing ### Opening Phrases to Avoid + - "In today's fast-paced world..." - "In today's digital age..." - "In an era of..." @@ -135,6 +141,7 @@ AI models use these nouns metaphorically to inject false gravitas. Literal uses - "Imagine a world where..." ### Transitional Phrases to Avoid + - "That being said..." - "With that in mind..." - "It's worth mentioning that..." @@ -144,6 +151,7 @@ AI models use these nouns metaphorically to inject false gravitas. Literal uses - "This begs the question..." ### Concluding Phrases to Avoid + - "In conclusion..." - "To sum up..." - "By [doing X], you can [achieve Y]..." @@ -152,6 +160,7 @@ AI models use these nouns metaphorically to inject false gravitas. Literal uses - "At the end of the day..." ### Structural Patterns to Avoid + - "Whether you're a [X], [Y], or [Z]..." (listing three examples after "whether") - "It's not just [X], it's also [Y]..." - "Think of [X] as [elaborate metaphor]..." @@ -159,7 +168,9 @@ AI models use these nouns metaphorically to inject false gravitas. Literal uses - Contrasting parallelisms: "It's not X. It's Y." or "It's not about X, it's about Y." More than two of these in a 500-word block is a high-confidence AI indicator. ### Inflated Symbolism Phrases (2025-2026 AI Tells) + These multi-word phrases appear hundreds of times more frequently in AI-generated text than in human baselines (corpus analysis, isgpt.org 2025): + - "provide a valuable insight" (468x more frequent in AI text) - "left an indelible mark" (317x) - "play a significant role in shaping" (207x) @@ -179,14 +190,14 @@ AI-generated content frequently uses narrative, dramatic, or clickbait heading s ### Banned Heading Structures -| Pattern | Bad Example | Good Replacement | -|---------|-------------|------------------| -| "The [Concept] Trap" | "The Initialization Trap" | "Import vs. Initialize: DDF Metadata Destruction Risk" | -| "The [Adjective] [Noun]" drama | "The Hidden Danger" | "Firmware Corruption After Sudden Power Loss" | -| "The [Noun] [Dramatic Noun]" | "The Silent Killer" | "Gradual Bad Sector Growth on Aging Platters" | -| "Why [Action] [Dramatic Verb] [Object]" | "Why Rebuilding Destroys Everything" | "How Forced Rebuilds Overwrite Parity on Degraded Arrays" | -| "[Noun]: The [Adjective] [Noun]" | "Encryption: The Hidden Trap" | "Hardware AES-256 Encryption on WD Passport Bridge Boards" | -| "The [Noun] You [Emotion Verb]" | "The Risk You Overlook" | "Unmonitored SMART Threshold Warnings" | +| Pattern | Bad Example | Good Replacement | +| --------------------------------------- | ------------------------------------ | ---------------------------------------------------------- | +| "The [Concept] Trap" | "The Initialization Trap" | "Import vs. Initialize: DDF Metadata Destruction Risk" | +| "The [Adjective] [Noun]" drama | "The Hidden Danger" | "Firmware Corruption After Sudden Power Loss" | +| "The [Noun] [Dramatic Noun]" | "The Silent Killer" | "Gradual Bad Sector Growth on Aging Platters" | +| "Why [Action] [Dramatic Verb] [Object]" | "Why Rebuilding Destroys Everything" | "How Forced Rebuilds Overwrite Parity on Degraded Arrays" | +| "[Noun]: The [Adjective] [Noun]" | "Encryption: The Hidden Trap" | "Hardware AES-256 Encryption on WD Passport Bridge Boards" | +| "The [Noun] You [Emotion Verb]" | "The Risk You Overlook" | "Unmonitored SMART Threshold Warnings" | ### How to Self-Check Headings @@ -228,20 +239,20 @@ These words often add nothing to meaning. Remove them or find specific alternati ## Academic-Specific AI Tells -| Avoid | Use Instead | -|-------|-------------| -| shed light on | clarify, explain, reveal | -| pave the way for | enable, allow, make possible | -| a myriad of | many, numerous, various | -| a plethora of | many, numerous, several | -| paramount | very important, essential, critical | -| pertaining to | about, regarding, concerning | -| prior to | before | -| subsequent to | after | -| in light of | because of, given, considering | -| with respect to | about, regarding, for | -| in terms of | regarding, for, about | -| the fact that | that (or rewrite sentence) | +| Avoid | Use Instead | +| ---------------- | ----------------------------------- | +| shed light on | clarify, explain, reveal | +| pave the way for | enable, allow, make possible | +| a myriad of | many, numerous, various | +| a plethora of | many, numerous, several | +| paramount | very important, essential, critical | +| pertaining to | about, regarding, concerning | +| prior to | before | +| subsequent to | after | +| in light of | because of, given, considering | +| with respect to | about, regarding, for | +| in terms of | regarding, for, about | +| the fact that | that (or rewrite sentence) | --- @@ -249,13 +260,13 @@ These words often add nothing to meaning. Remove them or find specific alternati When AI generates wikitext, it sometimes hallucinates citation markup from its training data. These are 100% confidence indicators of unedited AI output: -| Artifact | Origin | -|----------|--------| -| `oaicite` | OpenAI ChatGPT citation placeholder | -| `contentReference` | OpenAI internal reference tag | -| `grok_card` | xAI Grok citation tag | -| `attributableIndex` | AI attribution tracking artifact | -| `turn0search0` | ChatGPT search result placeholder | +| Artifact | Origin | +| ------------------- | ----------------------------------- | +| `oaicite` | OpenAI ChatGPT citation placeholder | +| `contentReference` | OpenAI internal reference tag | +| `grok_card` | xAI Grok citation tag | +| `attributableIndex` | AI attribution tracking artifact | +| `turn0search0` | ChatGPT search result placeholder | Any occurrence of these strings in wikitext means the text was pasted from an AI tool without editing. Zero tolerance. @@ -266,17 +277,20 @@ Any occurrence of these strings in wikitext means the text was pasted from an AI AI models hedge 4-7x more than human writers (ACL 2024 study, 12,000 technical documents). Because models are trained to avoid stating hallucinations as facts, they default to blanket hedging even for established facts. ### Hedging Markers + **Epistemic modals** (45% of AI hedges): may, might, could, potentially **Cognitive verbs** (25%): I think, I believe, it seems, it appears **Adverbs of limitation** (20%): probably, generally, usually, arguably, likely **Explicit uncertainty markers**: unclear, remains to be seen, further research is needed ### Thresholds + - **Per-paragraph:** More than 3 hedging instances in a single paragraph warrants scrutiny - **Per-1000-words:** More than 8 hedging markers per 1,000 words in declarative sections (Background, History, Timeline) indicates AI generation. These sections state established facts. - **Appropriate hedging:** Sections discussing pending legislation, ongoing litigation, or genuinely disputed facts should hedge. Do not flag hedging in those contexts. ### AI Hedging Phrases to Flag + - "It is worth noting that..." - "It should be noted that..." - "One could argue that..." @@ -285,6 +299,7 @@ AI models hedge 4-7x more than human writers (ACL 2024 study, 12,000 technical d - "It is widely acknowledged that..." ### Human vs. AI Hedging + Humans hedge contextually, grounding uncertainty in specific evidence: "The FTC's 2024 enforcement data suggests a 12% increase." AI hedges with blanket qualifiers on established facts: "It is widely acknowledged that repair restrictions may potentially impact consumers." --- @@ -294,29 +309,40 @@ Humans hedge contextually, grounding uncertainty in specific evidence: "The FTC' Beyond lexical tells, AI text exhibits measurable structural uniformity that human writing does not. ### Paragraph Length Uniformity + AI aims for visual symmetry. Paragraphs tend toward identical sentence counts (typically 3-4 sentences each). Human writing varies paragraph length based on sub-topic complexity. + - **Threshold:** If all paragraphs in a section are within 15% of each other in word count, the section is likely AI-generated. - **Exception:** Bulleted lists, tables, and template fields are structurally uniform by design. ### Sentence Length Uniformity (Burstiness) + Human writing alternates between short, punchy sentences and long, clause-heavy ones. AI sentences cluster uniformly around 15-20 words. + - **Threshold:** If a 500-word block contains no sentences under 8 words or over 30 words, it lacks human burstiness. - **Human baseline:** Human text exhibits 3+ distinct syntactic patterns per 100 words. AI text shows 1.5 or fewer. ### Transition Density + AI over-relies on transition words and adverbial clauses to maintain flow between paragraphs. + - **Threshold:** If more than 30% of paragraphs in an article begin with a transition word or adverbial clause, the text is structurally artificial. ### Opening-Word Repetition + Three or more consecutive paragraphs starting with the same word or phrase pattern indicates mechanical generation. Vary opening words. ### Segmental Entropy + AI maintains flat stylistic consistency from introduction through conclusion. Human writers naturally vary pacing, complexity, and sentence structure between sections. + - **Threshold:** Calculate sentence length variance separately for the introduction, body, and conclusion. If variance differs by less than 10% across all three segments, the text was likely generated as a single pass by AI. - **Why this matters:** Human introductions tend to be tighter and more declarative. Human body sections are denser with longer sentences. Human conclusions shift register. AI maintains a monotone throughout. ### Contrasting Parallelism Overuse + 2025-era models overuse sequential contrasting structures to simulate punchy emphasis: + - "It's not X, it's Y." - "It's not about X, it's about Y." - "The issue isn't X. The issue is Y." @@ -329,12 +355,14 @@ AI maintains flat stylistic consistency from introduction through conclusion. Hu Different AI model families produce distinct stylistic fingerprints based on their training and RLHF tuning. ### GPT-4o / GPT-4.5 (OpenAI) + - Heavy use of bullet-point formatting and structured lists - Staccato short-sentence contrasting: "It's not X. It's Y." used to simulate punchy copy - Rhetorical colon abuse: "Here's the thing:", "Think about it:", "The bottom line:", "The reality:" - Over-structures arguments into numbered steps ### Claude 3.5 / Claude 4 (Anthropic) + - Better sentence length variation than GPT, but still exhibits flat segmental entropy - Overly polite and conciliatory transitions: "It's worth considering that", "To be fair", "That said" - Leans toward poetic and metaphorical prose with words like "nuanced," "complexities" @@ -342,6 +370,7 @@ Different AI model families produce distinct stylistic fingerprints based on the - Tends toward diplomatic hedging even when stating documented facts ### Common Across All Models + - Uniform paragraph lengths - Predictable section ordering (Background > Details > Impact > Response) - Citation clustering at paragraph ends rather than distributed throughout sentences @@ -352,18 +381,24 @@ Different AI model families produce distinct stylistic fingerprints based on the ## False Positive Prevention ### Exclusion Zones + Lexical scans must NOT flag text inside: + - Direct quotes (`"..."`) from cited sources - Titles, names, and other verbatim values taken from a source - Code, configuration, or markup that is being shown as an example ### Context-Aware Severity + If a banned word appears immediately adjacent to specific named entities (proper nouns, statute numbers, dates, dollar amounts), it is more likely being used with technical meaning than as AI filler. Reduce flag severity. + - **Higher severity:** "a comprehensive examination of the issues" (abstract nouns, no specifics) - **Lower severity:** "comprehensive audit by the FTC in 2024" (specific entity, specific date) ### Metaphorical vs. Literal Distinction + These words require bigram context checking. Only flag metaphorical uses: + - ecosystem: "Apple's software ecosystem" (OK) vs. "the repair ecosystem" (flag) - landscape: "Arizona landscape" (OK) vs. "the regulatory landscape" (flag) - navigate: "navigate the website" (OK) vs. "navigate the regulatory process" (flag) diff --git a/.agents/skills/nomad-pages/SKILL.md b/.agents/skills/nomad-pages/SKILL.md index 612febf7..58930da7 100644 --- a/.agents/skills/nomad-pages/SKILL.md +++ b/.agents/skills/nomad-pages/SKILL.md @@ -31,12 +31,12 @@ Page-node files are a path jail. Follow `path-jail-local-fs`. The Mesh Server re ## Formats -| Extension | Role | -| --- | --- | -| `.mu` | Micron markup (NomadNet default) | -| `.md` | Markdown | -| `.txt` | Plain text | -| HTML | Sanitised. Do not widen the sanitiser to run scripts. | +| Extension | Role | +| --------- | ----------------------------------------------------- | +| `.mu` | Micron markup (NomadNet default) | +| `.md` | Markdown | +| `.txt` | Plain text | +| HTML | Sanitised. Do not widen the sanitiser to run scripts. | Announce display names parse through `parse_nomadnetwork_node_display_name`. Store toggles: `announce_store_nomadnetwork_node` in `announce_manager.py`. diff --git a/.agents/skills/reticulum-interfaces/SKILL.md b/.agents/skills/reticulum-interfaces/SKILL.md index 6ee62556..665df19f 100644 --- a/.agents/skills/reticulum-interfaces/SKILL.md +++ b/.agents/skills/reticulum-interfaces/SKILL.md @@ -30,6 +30,7 @@ Packet size and delay belong in protocol design (stamps, attachments, RNCP, PTT) ## HTTP and UI - Routes: `meshchatx/src/backend/http/routes/interfaces.py` +- Serial listing: `meshchatx/src/backend/serial_comports.py` (`GET /api/v1/comports`). Landlock must allow `/sys` or pyserial raises TypeError on USB `idVendor`. - UI: `meshchatx/src/frontend/components/interfaces/` - Ownership: `.agents/module-ownership.md` (Interfaces row) diff --git a/.agents/skills/reticulum-stack/SKILL.md b/.agents/skills/reticulum-stack/SKILL.md index 7e78785b..a03f4218 100644 --- a/.agents/skills/reticulum-stack/SKILL.md +++ b/.agents/skills/reticulum-stack/SKILL.md @@ -42,13 +42,13 @@ Address peers as destination hash + aspect. Do not store `host:port` as the mesh Aspects MeshChatX already uses: -| Aspect | Meaning | -| --- | --- | -| `lxmf.delivery` | LXMF mail | -| `lxmf.propagation` | Propagation node | -| `lxst.telephony` | LXST calls | +| Aspect | Meaning | +| ------------------- | -------------------- | +| `lxmf.delivery` | LXMF mail | +| `lxmf.propagation` | Propagation node | +| `lxst.telephony` | LXST calls | | `nomadnetwork.node` | NomadNet page server | -| `rrc.hub` | Relay Chat hub | +| `rrc.hub` | Relay Chat hub | Custom apps get their own aspect (example from design gates: `mcx-bugs-v1`). Do not overload `lxmf.delivery` for non-mail traffic. RNS Link API aspects are dot-separated app name plus sub-aspects (example `microrn.mgmt`). diff --git a/.agents/skills/rns-filesync/SKILL.md b/.agents/skills/rns-filesync/SKILL.md index 7b7e0649..5aad8a61 100644 --- a/.agents/skills/rns-filesync/SKILL.md +++ b/.agents/skills/rns-filesync/SKILL.md @@ -19,7 +19,7 @@ Reference resolve helper: `rns_filesync_handler.py` (`_resolve_manager_path`). ## Hard rules -1. Jail CRUD to the configured `sync_directory` only. The folder picker that *chooses* a sync root is a different, looser jail (identity storage with reserved tops blocked). Do not reuse the picker jail for tree/upload/delete. +1. Jail CRUD to the configured `sync_directory` only. The folder picker that _chooses_ a sync root is a different, looser jail (identity storage with reserved tops blocked). Do not reuse the picker jail for tree/upload/delete. 2. Skip and refuse mutation of protocol sidecars (`.rns-filesync*`, `.rns-xfer*`). 3. `announce_interval` must be an integer `>= 10` seconds. Invalid values return `{"ok": False, "error": ...}` rather than throwing 500. 4. Upload cap for in-app manager uploads is `MANAGER_UPLOAD_MAX_BYTES` (64 MiB). That cap is the local control plane, not a mesh payload budget. @@ -28,13 +28,13 @@ Reference resolve helper: `rns_filesync_handler.py` (`_resolve_manager_path`). ## Key files -| Area | Path | -| --- | --- | -| Handler | `meshchatx/src/backend/rns_filesync_handler.py` | -| HTTP | `meshchatx/src/backend/http/routes/filesync.py` | -| Vendored service | `vendor/rns_filesync/` | -| UI | `meshchatx/src/frontend/components/filesync/` | -| Oracle tests | `tests/backend/test_rns_filesync_security.py`, `tests/backend/test_path_jail_oracles.py` | +| Area | Path | +| ---------------- | ---------------------------------------------------------------------------------------- | +| Handler | `meshchatx/src/backend/rns_filesync_handler.py` | +| HTTP | `meshchatx/src/backend/http/routes/filesync.py` | +| Vendored service | `vendor/rns_filesync/` | +| UI | `meshchatx/src/frontend/components/filesync/` | +| Oracle tests | `tests/backend/test_rns_filesync_security.py`, `tests/backend/test_path_jail_oracles.py` | ## Verification diff --git a/.agents/skills/rossmann-voice/SKILL.md b/.agents/skills/rossmann-voice/SKILL.md index 09465ef2..ed8be1e4 100644 --- a/.agents/skills/rossmann-voice/SKILL.md +++ b/.agents/skills/rossmann-voice/SKILL.md @@ -14,40 +14,40 @@ The writing is identifiable because every claim carries a testable number. Dolla ## Sentence-Level Rules 1. **Ground every claim in a testable number.** Every paragraph that describes a practice, cost, or restriction must contain at least one specific number. (Corpus: 32.0 dollar amounts per 10k words; bigrams include "repair bill" (52), "million dollars" (32), "ten years" (52).) - - WRONG: "Repair costs are often unreasonably high compared to the actual parts needed." - - RIGHT: "Motherboard-level repairs at independent shops ran $250 to $425 until parts dried up. Donor boards now cost $200 to $400 per unit." + - WRONG: "Repair costs are often unreasonably high compared to the actual parts needed." + - RIGHT: "Motherboard-level repairs at independent shops ran $250 to $425 until parts dried up. Donor boards now cost $200 to $400 per unit." 2. **Name the component, the supplier, and the price.** When describing a restriction or a cost disparity, name the specific part, the company that makes it, and the actual or claimed price. (Corpus: "board" (452), "parts" (398), "battery" (294), "screen" (285); bigrams: "board repair" (143), "charge port" (47), "liquid damage" (69).) - - WRONG: "A common issue with these laptops is a power delivery problem." - - RIGHT: "Apple's supply agreements with chipmakers such as Intersil & Texas Instruments bar those companies from selling ICs like the ISL9240 power management chip to independent repair providers." + - WRONG: "A common issue with these laptops is a power delivery problem." + - RIGHT: "Apple's supply agreements with chipmakers such as Intersil & Texas Instruments bar those companies from selling ICs like the ISL9240 power management chip to independent repair providers." 3. **Frame restrictions as concrete operations, not abstract policy.** Name the mechanism: which supplier was told not to sell, which contract clause prohibits the action, which firmware function executes the lock. (Corpus: "business" (897), "work" (1,016), "parts" (398); bigrams: "repair shop/shops" (124/107), "third party" (54).) - - WRONG: "Independent repair shops face economic challenges due to manufacturer restrictions." - - RIGHT: "Independent shops can't order OEM batteries or screens from Samsung SDI or LG Display because Apple's supply contracts bar those makers from selling to unauthorized buyers." + - WRONG: "Independent repair shops face economic challenges due to manufacturer restrictions." + - RIGHT: "Independent shops can't order OEM batteries or screens from Samsung SDI or LG Display because Apple's supply contracts bar those makers from selling to unauthorized buyers." 4. **Maintain high sentence-length variance.** Mix sentences of 4 to 10 words with sentences of 25 to 36 words. Do not write three consecutive sentences of similar length. (Corpus: mean 18.34 words, median 15, std dev 15.27; p10=4.0, p90=36.0; 10.8% of sentences are fragments under 5 words.) - - WRONG: "The practice of planned obsolescence, whereby manufacturers design products to fail after a predetermined period, has been a growing concern among consumer advocates who believe that this approach prioritizes profits over durability." - - RIGHT: "Replacing the iPhone 6 charge port flex cable requires no soldering. The repair takes five minutes. Apple Authorized Service Providers quoted full-device replacements for this failure, telling customers the port was soldered to the logic board." + - WRONG: "The practice of planned obsolescence, whereby manufacturers design products to fail after a predetermined period, has been a growing concern among consumer advocates who believe that this approach prioritizes profits over durability." + - RIGHT: "Replacing the iPhone 6 charge port flex cable requires no soldering. The repair takes five minutes. Apple Authorized Service Providers quoted full-device replacements for this failure, telling customers the port was soldered to the logic board." 5. **Use contractions by default; expand for emphasis.** Use "can't", "doesn't", "isn't" in standard prose. Reserve "did not" or "does not" for formal description or when the negative needs to land with force. (Corpus: contraction rate 83.6%, stable at 77 to 89% across years.) - - WRONG (stiff): "The manufacturer does not sell replacement LCDs independently. The buyer does not have the option to purchase only the panel." - - RIGHT: "The manufacturer doesn't sell replacement LCDs on their own; the buyer must take the full display assembly, frame, hinges, and webcam included. Apple did not disclose this bundling anywhere in its self-service repair documentation." + - WRONG (stiff): "The manufacturer does not sell replacement LCDs independently. The buyer does not have the option to purchase only the panel." + - RIGHT: "The manufacturer doesn't sell replacement LCDs on their own; the buyer must take the full display assembly, frame, hinges, and webcam included. Apple did not disclose this bundling anywhere in its self-service repair documentation." 6. **Quantify expertise through volume, not adjectives.** Do not call someone "experienced" or "skilled". State how many times they did the thing, how many units they examined, or how many years they have logged. (Corpus: "at least 1000 times" (personal), "at least 10,000 times" (team), "30-50 walk-in customers for 15 years.") - - WRONG: "A skilled technician can perform this repair efficiently." - - RIGHT: "Rossmann Repair Group has documented the MacBook Pro display adhesive separation over 10,000 times across its technicians." + - WRONG: "A skilled technician can perform this repair efficiently." + - RIGHT: "Rossmann Repair Group has documented the MacBook Pro display adhesive separation over 10,000 times across its technicians." 7. **Weave specifics into the sentence flow.** Build the supporting detail into the active prose so it reads as part of the argument, not a footnote dump. (Corpus: legal-citation density roughly doubled from 8.8/10k words in 2016 to 20+/10k in 2020-2025.) - - WRONG: "The Magnuson-Moss Warranty Act protects consumers." - - RIGHT: "The Magnuson-Moss Warranty Act (15 U.S.C. ch. 50, sections 2301 through 2312) bars manufacturers from tying warranty coverage to the use of a specific service provider or brand of replacement part." + - WRONG: "The Magnuson-Moss Warranty Act protects consumers." + - RIGHT: "The Magnuson-Moss Warranty Act (15 U.S.C. ch. 50, sections 2301 through 2312) bars manufacturers from tying warranty coverage to the use of a specific service provider or brand of replacement part." 8. **Use exact identifiers.** Do not write "copyright law" when you mean "17 U.S.C. section 1201". Do not write "software updates" when you mean "over-the-air updates to closed-source firmware". The specific name is always stronger than the category. - - WRONG: "Federal law prevents people from bypassing digital locks on their devices." - - RIGHT: "17 U.S.C. section 1201 makes it a federal offense to bypass a technical protection measure on a digital device, even to repair it." + - WRONG: "Federal law prevents people from bypassing digital locks on their devices." + - RIGHT: "17 U.S.C. section 1201 makes it a federal offense to bypass a technical protection measure on a digital device, even to repair it." 9. **Use "&" instead of "and".** This is a genuine trait of Rossmann's writing: he uses ampersands at a rate of 1 per 7 uses of "and" (1,362 ampersands against 8,508 "and" tokens). Use "&" as the default conjunction in new prose. Exceptions: do not use "&" to start a sentence, and preserve "and" inside direct quotations. - - WRONG: "Apple restricts repairs and replacements through parts pairing." - - RIGHT: "Apple restricts repairs & replacements through parts pairing." + - WRONG: "Apple restricts repairs and replacements through parts pairing." + - RIGHT: "Apple restricts repairs & replacements through parts pairing." ## Paragraph Structure Rules @@ -66,12 +66,14 @@ The writing is identifiable because every claim carries a testable number. Dolla LLMs revert to "average internet tone" over long outputs, producing progressively smoother, more generic prose. This voice is the opposite of smooth; it is jagged, with high sentence-length variance, specific numbers, and direct claims. Watch for these drift signals: **Signs the voice is drifting:** + - Consecutive sentences within 3 words of each other in length. The voice should alternate short and punchy with long and analytical. - Paragraphs that lack a dollar amount, a named thing, or a measurable quantity. The voice averages one per 200 words. - Contractions disappearing. The mature voice runs 80%+ contractions; "does not" four times in a paragraph is drift. - Opening sentences that set context instead of making a claim. "There are several factors..." is drift; "Apple charges $1,200 for..." is the voice. **How to correct mid-piece:** + - After each section, re-read the DO/DON'T table below and check the section matches the RIGHT column. - Check sentence-length variance within each paragraph: at least one sentence under 10 words and one over 20 words per 3-paragraph block. - If a passage could appear on any generic site, it has drifted. Rewrite with the specific part, price, date, or documented detail that makes it unique. @@ -98,24 +100,25 @@ Rossmann argues using a **Claim-Mechanism-Reality** structure. This is data-conf Use plain, mechanical language. These substitutions trade vague terms for precise ones: -| Instead of | Use | -|---|---| -| device ecosystem | product line | -| consumer-facing | sold to consumers | -| end-of-life (euphemism) | discontinued support for | +| Instead of | Use | +| --------------------------------- | --------------------------------------------------------------------------- | +| device ecosystem | product line | +| consumer-facing | sold to consumers | +| end-of-life (euphemism) | discontinued support for | | intellectual property protections | copyright restrictions, patent claims, or trade secret claims (be specific) | -| aftermarket components | third-party parts, or non-OEM parts | -| unauthorized repair | independent repair | -| tamper-proof | designed to prevent owner access | -| brick (casual) | render non-functional | -| void your warranty | condition warranty coverage on | -| take action | file suit, issue a cease-and-desist, lobby against (be specific) | -| stakeholders | name them: owners, repair shops, manufacturers, legislators | -| safety concerns | name the specific claimed hazard | -| experienced technician | state the repair count or years of operation | -| many issues / various problems | state the count or name the specific issues | +| aftermarket components | third-party parts, or non-OEM parts | +| unauthorized repair | independent repair | +| tamper-proof | designed to prevent owner access | +| brick (casual) | render non-functional | +| void your warranty | condition warranty coverage on | +| take action | file suit, issue a cease-and-desist, lobby against (be specific) | +| stakeholders | name them: owners, repair shops, manufacturers, legislators | +| safety concerns | name the specific claimed hazard | +| experienced technician | state the repair count or years of operation | +| many issues / various problems | state the count or name the specific issues | **Rossmann-characteristic vocabulary (from corpus top content words):** + - Repair domain: "repair" (1,879), "board" (452), "parts" (398), "battery" (294), "screen" (285) - Business domain: "business" (897), "money" (793), "customer/customers" (395/450), "store" (381) - Use "physical property" when discussing ownership rights (not "device" or "product") @@ -136,37 +139,37 @@ Some genuine Rossmann traits do not transfer to clean third-person prose. Each h ## DO / DON'T Quick Reference -| Instead of (generic/AI) | Write (Rossmann voice) | -|---|---| -| Apple limits repairs to ensure user safety and security. | Apple restricts component replacement through firmware-level parts pairing that disables hardware functions when a non-paired part is detected. | -| Repair costs are unreasonably high. | Apple quoted $755 for a backlight repair on a 2018 MacBook Pro. The failed part was a 50-cent filter. | -| Software updates can cause older devices to slow down. | Apple released iOS 10.2.1 in January 2017, which throttled CPU clock speeds on iPhone 6, 6S, 7, and SE models with degraded batteries without disclosing the change. | -| The company faced criticism for its repair policies. | Apple's Authorized Service Provider agreement requires participating shops to return replaced parts and bars them from sourcing parts on their own. | -| Independent repair shops face many challenges. | Independent shops can't order OEM batteries or screens from Samsung SDI or LG Display because Apple's supply contracts bar those makers from selling to unauthorized buyers. | -| Component-level repair is cheaper than board replacement. | Replacing the failed ISL9240 chip costs $4 in parts & 45 minutes of labor. Apple quoted $1,200 for a logic board replacement on the same machine. | -| Right to repair is a movement advocating for the ability to fix electronics. | Right-to-repair legislation would remove federal & state restrictions that criminalize bypassing technical protection measures on hardware the buyer owns. | -| Courts have said people can record public officials. | In *Borreca v. Fasi*, 369 F. Supp. 906 (D. Haw. 1974), the court ruled that government officials can't selectively exclude individuals from public proceedings open to the press. | -| Manufacturers use software to prevent independent repair. | Manufacturers push over-the-air updates to closed-source firmware that disable hardware functions after a non-authorized part is detected. | -| The warranty was voided unfairly. | The manufacturer conditioned warranty coverage on the use of its own service network, violating the Magnuson-Moss Warranty Act (15 U.S.C. sections 2301 through 2312). | -| A skilled technician can perform this repair efficiently. | Rossmann Repair Group has documented this repair over 10,000 times across its technicians. It takes five minutes with no soldering. | -| The FTC is looking into changing rules regarding warranties. | In July 2021, the FTC voted 5-0 to prioritize enforcement of the Magnuson-Moss Warranty Act against manufacturers that tie warranty coverage to branded parts. | -| Companies should be more transparent about their practices. | Apple didn't disclose that iOS 10.2.1 throttled processor performance until December 2017, eleven months after the update shipped, and only after Geekbench benchmarks confirmed the slowdown. | -| Lobbyists often influence government policy on tech issues. | Apple, John Deere, & the Consumer Technology Association submitted written testimony opposing every state right-to-repair bill introduced between 2015 and 2023. | -| "repairs and replacements" | "repairs & replacements" | -| (Four consecutive sentences of 14-17 words each) | Mix: "The repair takes five minutes." (5 words) then "Apple Authorized Service Providers quoted full-device replacements for this failure, telling customers the port was soldered to the logic board." (21 words) | +| Instead of (generic/AI) | Write (Rossmann voice) | +| ---------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| Apple limits repairs to ensure user safety and security. | Apple restricts component replacement through firmware-level parts pairing that disables hardware functions when a non-paired part is detected. | +| Repair costs are unreasonably high. | Apple quoted $755 for a backlight repair on a 2018 MacBook Pro. The failed part was a 50-cent filter. | +| Software updates can cause older devices to slow down. | Apple released iOS 10.2.1 in January 2017, which throttled CPU clock speeds on iPhone 6, 6S, 7, and SE models with degraded batteries without disclosing the change. | +| The company faced criticism for its repair policies. | Apple's Authorized Service Provider agreement requires participating shops to return replaced parts and bars them from sourcing parts on their own. | +| Independent repair shops face many challenges. | Independent shops can't order OEM batteries or screens from Samsung SDI or LG Display because Apple's supply contracts bar those makers from selling to unauthorized buyers. | +| Component-level repair is cheaper than board replacement. | Replacing the failed ISL9240 chip costs $4 in parts & 45 minutes of labor. Apple quoted $1,200 for a logic board replacement on the same machine. | +| Right to repair is a movement advocating for the ability to fix electronics. | Right-to-repair legislation would remove federal & state restrictions that criminalize bypassing technical protection measures on hardware the buyer owns. | +| Courts have said people can record public officials. | In _Borreca v. Fasi_, 369 F. Supp. 906 (D. Haw. 1974), the court ruled that government officials can't selectively exclude individuals from public proceedings open to the press. | +| Manufacturers use software to prevent independent repair. | Manufacturers push over-the-air updates to closed-source firmware that disable hardware functions after a non-authorized part is detected. | +| The warranty was voided unfairly. | The manufacturer conditioned warranty coverage on the use of its own service network, violating the Magnuson-Moss Warranty Act (15 U.S.C. sections 2301 through 2312). | +| A skilled technician can perform this repair efficiently. | Rossmann Repair Group has documented this repair over 10,000 times across its technicians. It takes five minutes with no soldering. | +| The FTC is looking into changing rules regarding warranties. | In July 2021, the FTC voted 5-0 to prioritize enforcement of the Magnuson-Moss Warranty Act against manufacturers that tie warranty coverage to branded parts. | +| Companies should be more transparent about their practices. | Apple didn't disclose that iOS 10.2.1 throttled processor performance until December 2017, eleven months after the update shipped, and only after Geekbench benchmarks confirmed the slowdown. | +| Lobbyists often influence government policy on tech issues. | Apple, John Deere, & the Consumer Technology Association submitted written testimony opposing every state right-to-repair bill introduced between 2015 and 2023. | +| "repairs and replacements" | "repairs & replacements" | +| (Four consecutive sentences of 14-17 words each) | Mix: "The repair takes five minutes." (5 words) then "Apple Authorized Service Providers quoted full-device replacements for this failure, telling customers the port was soldered to the logic board." (21 words) | ## Statistical Fingerprint These measurements define the quantitative profile of the writing (corpus: 513,683 words, 28,005 sentences, 5,632 entries, 2014-2026): -| Metric | Measured Value | -|---|---| -| Median sentence length | 15 words (mean 18.34, std dev 15.27) | -| Dollar amount density | 32.0 per 10,000 words (about 1 dollar figure every 312 words) | +| Metric | Measured Value | +| ---------------------------- | -------------------------------------------------------------------- | +| Median sentence length | 15 words (mean 18.34, std dev 15.27) | +| Dollar amount density | 32.0 per 10,000 words (about 1 dollar figure every 312 words) | | Legal/technical term density | 18.4 per 10,000 words (doubled from 8.8 in 2016 to 20+ in 2020-2025) | -| Contraction rate | 83.6% (stable at 77 to 89% across all years) | -| Question-to-statement ratio | 4.3% overall; 2.2% in the mature voice (2024-2026) | -| Average paragraph length | 2.1 sentences (median 2.0) | -| Quote-response frequency | 21.5% of entries (1,212 of 5,632) use interleaved quote blocks | +| Contraction rate | 83.6% (stable at 77 to 89% across all years) | +| Question-to-statement ratio | 4.3% overall; 2.2% in the mature voice (2024-2026) | +| Average paragraph length | 2.1 sentences (median 2.0) | +| Quote-response frequency | 21.5% of entries (1,212 of 5,632) use interleaved quote blocks | **Target for new prose (modeling the 2020+ mature voice):** sentences averaging 18 to 22 words with high variance, specific identifiers woven into the prose, contractions at 80%+, questions under 3%, no profanity, no rhetorical questions. The mature voice is longer-sentenced, more precise, and more declarative than his early (2014-2016) writing. diff --git a/meshchatx.rsm b/meshchatx.rsm index e0cbdcab..0a3abc6b 100644 Binary files a/meshchatx.rsm and b/meshchatx.rsm differ