0.1.1 (2026-03-25)
- add automated field test pipeline (#34) (6d906d6)
- add parse-review-results.py for structured finding extraction (#56) (2083bc7)
- ego-lint: add --show and --report flags for output filtering (#111) (5fc5a6e)
- ego-lint: add .destroy without parentheses detection (R-LIFE-23) (#50) (f9c035b)
- ego-lint: add compat-downgrade for version-aware deprecated API gating (#104) (3e00e6e)
- ego-lint: add D-Bus connectSignal leak detection (R-LIFE-25) (#59) (c54d848)
- ego-lint: add lifecycle leak detection (R-LIFE-21, R-LIFE-22, R-LIFE-24) (#48) (10f6bbd)
- ego-lint: add module-scope mutable state detection (R-LIFE-26) (#60) (9c5d2e3)
- ego-lint: add module-scope prototype mutation detection (R-LIFE-27) (#83) (0d2df8d)
- ego-lint: add notification urgency abuse detection (R-QUAL-36) (#49) (546bd10)
- ego-lint: detect indirect prototype mutation via function calls (#114) (bce145b)
- ego-review: eliminate redundant work by referencing ego-lint findings (787261a)
- ego-field-test: fix IFS collapse and commit-hash fetch failures (f4b480f)
- ego-field-test: indent multi-line expressions in json_extract wrapper (ae650be)
- ego-field-test: resolve imports/no-gtk-in-extension false positives (#128) (8e39d98)
- ego-lint: add missing CSS shell classes to KNOWN_SHELL_CLASSES (#54) (c6c61be)
- ego-lint: add replacement-pattern to R-VER rules for version-compat suppression (#84) (d7051cf)
- ego-lint: add skip-comments to R-LOG-03 to prevent block comment FPs (#132) (f138a43)
- ego-lint: add src/ layout license fallback and UUID-dir skip (#30) (9f616ec)
- ego-lint: add src/ metadata.json fallback for build-system extensions (#24) (145b639)
- ego-lint: add src/schemas/ fallback for non-standard layouts (#80) (4d00563)
- ego-lint: add version-compat suppression and calibrate severities (#69) (5442f13)
- ego-lint: anchor Gdk import pattern to avoid matching GdkPixbuf (#101) (0e07043)
- ego-lint: auto-detect and exclude vendored files from all lint checks (#152) (81d48cd)
- ego-lint: avoid false FAIL when enum-id precedes schema-id in check-schema (#148) (8399589)
- ego-lint: correct R-SLOP-01 provenance post-filter matching (#85) (ff05efb)
- ego-lint: deduplicate prototype-override warnings (#32) (431ad18)
- ego-lint: detect compiled TypeScript and suppress noisy rules (#52) (1b1b5d4)
- ego-lint: downgrade css/shell-class-override from FAIL to WARN (#100) (4aa6f2f)
- ego-lint: downgrade css/shell-class-override from FAIL to WARN (#112) (dc83726)
- ego-lint: downgrade missing LICENSE from FAIL to WARN (#110) (fe0eab7)
- ego-lint: enhance GSettings signal leak detection for helper classes (#87) (21f7390)
- ego-lint: exclude preferences/ dirs from gsettings-signal-leak (#102) (60b15d3)
- ego-lint: exclude service/ daemon code from extension-specific checks (#147) (2962779)
- ego-lint: exclude service/ dir from R-DEPR-06 and R-DEPR-10 (#99) (ed40e47)
- ego-lint: exempt isLocked guard from impossible-state and session-modes checks (#31) (69c6254)
- ego-lint: expand CSS shell-class list from GNOME Shell SCSS source (#57) (311da35)
- ego-lint: expand init/shell-modification and constructor-resources exemptions (#88) (14d0ca3)
- ego-lint: expand R-SLOP-24 guard for system schema identifiers (#139) (1a58b06)
- ego-lint: expand R-SLOP-24 guard for system schemas and multi-line constructors (#135) (27787a6)
- ego-lint: expand R-SLOP-38 guard for domain-specific identifiers (#141) (4aaf615)
- ego-lint: handle async arrow functions and GObject branch in check-init.py (#55) (9d6654a)
- ego-lint: make R-LIFE-25 bare connectSignal always FAIL regardless of disconnectSignal elsewhere (#91) (05523f9)
- ego-lint: narrow R-LIFE-25 auto-cleanup to D-Bus-specific disconnectSignal (#65) (8263cbc)
- ego-lint: propagate strip_comments newline preservation to all scripts (#61) (4178a5a)
- ego-lint: recognize alternative cleanup methods in resource tracking (#130) (bbc0f51)
- ego-lint: recognize array-based signal ID storage in gsettings-signal-leak (#64) (99c89c0)
- ego-lint: recognize full GPL license text in license check (#127) (38cbb59)
- ego-lint: reduce false positives for R-SLOP-35, R-SEC-03, R-SLOP-13 (#123) (860fc0b)
- ego-lint: reduce init-time safety false positives (#21) (e46e2df)
- ego-lint: reduce Media Controls false positives (#23) (7cea626)
- ego-lint: reduce resource-tracking FPs for blur-my-shell (#143) (99c5903)
- ego-lint: reduce resource-tracking/no-destroy-method false positives (#86) (30bbeac)
- ego-lint: reduce signal-balance false positives (#13) (900b133)
- ego-lint: reduce Tiling Shell false positives (#22) (62c5509)
- ego-lint: remove Shell.ActionMode.ALL from hallucinated-API list (#149) (715519f)
- ego-lint: scope init/shell-modification to Extension class constructors (#140) (5e86aa6)
- ego-lint: skip file-structure checks for compiled TypeScript extensions (#103) (f15ddcb)
- ego-lint: skip JSDoc block comments in R-WEB-06 document.* check (#150) (fc10806)
- ego-lint: skip R-LOG-03 in resources/ and detect Promise-returning methods in catch-on-sync (#145) (7d76ee5)
- ego-lint: skip signal callback bodies in constructor init check (#129) (d1fa661)
- ego-lint: split R-SLOP-11 to fix false positive on GLib.source_remove() (#126) (a441201)
- ego-lint: suppress R-QUAL-28 for distinct getSettings() schema arguments (#81) (f8e1da7)
- ego-lint: suppress R-VER46-01/02 for ShellVersion-guarded else branches (#151) (614883e)
- ego-lint: tighten R-SLOP-38 to reduce over-long identifier false positives (#82) (fe88f1b)
- ego-lint: verify R-VER48-02 guard matches Config.PACKAGE_VERSION (#133) (6dfeca1)
- ego-lint: widen R-VER48-02 guard-window for distant version checks (#53) (5ae31e0)
- add ego-review pipeline efficiency design spec (56bcdc3)
- add field test reports for Tiling Shell and Media Controls (#25) (f8b55f7)
- add field-tests/README.md with extension catalog and results (#67) (22fc27c)
- add missing skill labels and fix issue template auto-labels (782c7b4)
- add resource-tracking FP reduction design spec (a7e0a2c)
- ego-field-test: add 03-08 regression report, update baselines and annotations (c5b823e)
- ego-field-test: add version info to README extension catalog and update to 03-08 (bdb4919)
- ego-simulate: Added ESLint errors as rejection reason #23 (weight 5) to the taxonomy — crash-at-runtime bugs from undefined references now score appropriately (#2, PR #5)
- ego-simulate: ego-lint FAIL results now integrate into taxonomy scoring — each unmapped FAIL adds weight 5, WARNs route to Advisory Notes (#3, PR #6)
- ego-review: Added "NOT a signal" exception to ai-slop checklist item #4 —
_destroyed+_initializing(re-entrancy guard) is not the over-engineered state machine anti-pattern (#1, PR #4)
- ego-lint: Version-gated R-WEB-01/02/10/11 (setTimeout/setInterval/clearTimeout/clearInterval) to
max-version: 44— GJS provides native polyfills since GNOME 45 - ego-lint: Extended license check to recognize LICENSE.rst/.md/.txt and COPYING variants
- ego-lint: Downgraded
uuid-matches-dirfrom FAIL to WARN — cloned repos don't match UUID - Moved "How This Was Built" section earlier in README for transparency
- Promoted
scripts/new-rule.shas primary contribution workflow in CONTRIBUTING.md - Added fixture validation checklist and debugging tips to CONTRIBUTING.md
- Separated hara-hachi-bu regression into
tests/run-regression.sh - Named hara-hachi-bu as regression baseline in README
- Strengthened community ownership messaging in README
- Updated stale assertion/fixture counts in docs
- 124 pattern rules in
rules/patterns.yamlcovering web APIs, deprecated APIs, security, import segregation, AI slop detection, GNOME 44–50 migration, and more - 17 structural check scripts (Python/bash) for metadata validation, lifecycle symmetry, resource graph construction, async safety, GObject patterns, preferences validation, schema checks, package validation, disclosure checks, polkit validation, schema usage analysis, and accessibility
- Cross-file resource tracking — builds a resource graph (signals, timeouts, widgets, D-Bus, file monitors, GSettings) and detects orphaned resources
- Version-gated rules — GNOME 44–50 migration rules that only fire when the extension's declared
shell-versionincludes the relevant version - Contributor tooling —
scripts/new-rule.shfor scaffolding rules (with next-ID suggestion),scripts/validate-fixture.shfor fixture validation,scripts/validate-rule.shfor rule testing,apply-patterns.py --validatefor rule file validation - 153 test fixtures with 416 assertions
- CI integration — GitHub Actions and GitLab CI examples in
docs/ci-integration.md
- Removed R-SEC-07 (redundant clipboard check —
quality/clipboard-disclosureis a strict superset) - Consolidated
quality/private-apioutput into a single warning per check instead of up to 6 - Changed verdict to count unique check IDs instead of raw warning lines
- Fixed
quality/gettext-patternfix message (was suggestingthis.gettext(), now suggests ESM import) - Added
deduplicate: trueto R-SEC-20 to reduce noise on multi-file pkexec references
- Added First Contribution Workflow, Where to Find Sources, severity upgrade criteria, and License sections to CONTRIBUTING.md
- Expanded Tier 2 contribution guide with script selection table covering all 13 check scripts
- Broadened PR template to cover non-rule contributions (bug fixes, docs, tooling)
- Added co-maintainer onboarding path to GOVERNANCE.md
- Added Help Wanted subsection to README surfacing self-contained gaps
- Added troubleshooting section to rules/README.md
Rules are grounded in analysis of 9 real EGO reviews, 109 extracted requirements from gjs.guide, GNOME Shell GitLab guideline evolution across versions 44–50, and reverse-engineered patterns from 5 popular approved extensions. 8 unwritten reviewer rules were identified and encoded. Full research: docs/research/.
- Polkit action ID validation not yet implemented (if
pkexecused,.policyfile not verified) - Schema filename validation partial (warns but doesn't block on filename mismatch)
- Module-scope mutable state detection not yet implemented (
Map/Setat module level) - Full gap list: docs/research/gap-analysis.md