Reviews¶
Date: Jun 7, 2026 Version: 0.6.1 Commit: 70e4714 Failed
Resolution status (→ v0.6.2). The review failed on one error — the standalone runtime's
<style>element (runtime.ts:32). It is now fixed at the source (the runtime injects CSS via a constructable stylesheet,adoptedStyleSheets), so the review no longer fails. v0.6.1 had EXCLUDEDruntime.ts/dev-bridge.tsfrom our local recreation as "false positives" — but the bot scans them, so the exclusion only hid the failure (Lesson 18). The recreation is now bot-faithful (npm run lint:obsidianscans all ofsrc/, mirrors the bot's severities → 0 errors, 11 documented warnings). Everything else below is a warning/recommendation that does not fail the review and is kept by deliberate decision (Decision 26). Status per item is inlined below. Registry: Decision 29, Change 37, Feature 39, Lesson 18 (CHANGELOG.md / issues.md).
Releases¶
- Pass: The
main.jsrelease asset has a verified GitHub artifact attestation. - Pass: The
styles.cssrelease asset has a verified GitHub artifact attestation.
Network requests¶
- Pass: No suspicious network patterns found.
Behavior¶
- Recommendation: Vault Enumeration: Enumerates all files in the vault (
vault.getFiles,getMarkdownFiles, etc.). Gives the plugin access to every file path in the vault. - ⚠️ Kept (justified, Decision 26). Backs the F26 Replace-image fuzzy picker — a
FuzzySuggestModalneeds the full image-candidate set up front; already filtered to image extensions; no narrower public API. Not a review-failing item. - Pass: Vault Read: Reads individual vault files via the Obsidian API (
vault.read,vault.cachedRead) - Pass: Vault Write: Creates or modifies vault files via the Obsidian API (
vault.modify,vault.create, etc.)
Source code¶
- Error: Creating and attaching "style" elements is not allowed. For loading CSS, use a "styles.css" file instead, which Obsidian loads for you.
- src/runtime.ts:32
- ✅ Fixed (Change 37). The standalone runtime (
lie-runtime.js, a foreign-page bundle with no Obsidian-loaded stylesheet) no longer doescreateElement("style"); it injects vianew CSSStyleSheet()+document.adoptedStyleSheets— the rule-clean equivalent. This was the ONLY error and the only thing failing the review. Guarded bytests/unit/runtime-style-injection.test.ts+lint:obsidiannow scanningruntime.ts. - Warning: Use 'activeDocument' instead of 'document' for popout window compatibility.
- src/anchored-submenu.ts:93, … (≈97 sites across many files)
- ⚠️ Deferred → Feature 39 (Decision 29). Warning-level (does not fail the review); converting every
document/windowtoactiveDocument/activeWindowis large, cross-cutting, popout-only churn with real regression risk. Tracked as the popout-support feature, kept off in the gate by deliberate decision (not suppression). - Warning: Do not import Node.js builtin module "net"
- src/dev-bridge.ts:2
- ⚠️ False positive, kept (Decision 25/29). Dev-only CDP relay; the single caller is behind
if (__LIE_DEV__), so the whole module + itsnetimport is tree-shaken out of production. Never ships inmain.js. Now scanned by the gate and surfaced as a documented warning. - Warning: Use '.instanceOf(HTMLImageElement)' / '.instanceOf(Element)' / '.instanceOf(Document)' instead of 'instanceof …' for cross-window safe type checking.
- src/runtime.ts:41, 42, 44
- ⚠️ False positive, kept (Decision 25/29). The
.instanceOf()helper is an Obsidian API;runtime.tsimports noobsidian(it's the framework-free off-Obsidian bundle), so the helper does not exist there. Rawinstanceofis correct. Warning-level. Now surfaced as a documented warning. - Warning:
setWarningis deprecated. UsesetDestructive()/setDestructive().setCta(). - src/settings.ts:55, 283
- ⚠️ Kept (Decision 26). Replacement is 1.13.0-only;
minAppVersionis 1.12.7. Warning-level. - Warning:
displayis deprecated. Since 1.13.0. UsegetSettingDefinitionsinstead. - src/settings.ts:240, 269, 307, 367
- ⚠️ Kept (Decision 26).
getSettingDefinitionsis 1.13.0-only;display()is the officially-sanctioned <1.13.0 fallback atminAppVersion1.12.7. Warning-level.
CSS lint¶
- Warning: Avoid !important — override styles by increasing selector specificity or using CSS variables instead.
- styles.css:176, 344, 345, 377, 385, 413, 451, 524
- ⚠️ Kept (justified, Decision 26). Each overrides Obsidian-core / dynamically-gated rules (the crop
contain:nonebeating app.csscontain:paint !important, the tall-float cap, the dismissed reveal). Audited; the one removable defensive!importantwas already dropped in Change 36. Warning-level. - Warning: Avoid :has — it can cause significant performance issues due to broad selector invalidation.
- styles.css:192, 193, 194, 195, 198, 199, 274, 275, 276, 277, 342, 343, 384, 385
- ⚠️ Kept (justified, Decision 26/28). Alignment/float/reveal must style a flow-participant ANCESTOR from a marker on a DESCENDANT (the embed / Obsidian's own
.cm-line/.cm-formatting) — the only CSS-only mechanism (AD5 forbids reactive JS). The removable:haswere dropped in Change 36; the runtime is:has-free. Warning-level.
Dependencies¶
- Pass: No vulnerable dependencies found.