mirror of
https://github.com/meshtastic/Meshtastic-Android.git
synced 2026-06-15 09:19:05 -04:00
27 KiB
27 KiB
Agent Session Context - Meshtastic Android
This is a dated, append-only handover log. Add new entries at the TOP.
Do NOT edit or remove previous entries — stale state claims cause agent confusion.
Format: ## YYYY-MM-DD —
2026-05-21 — Upgraded Chirpy to a fully-personalized Live Diagnostic Node & Mesh Assistant
- Integrated
NodeRepositoryintoGeminiNanoDocAssistant.ktand the Google AI Koin dependency injection module (GoogleAiModule.kt). - Developed a dynamic live-state prompt formatting block within
buildPrompt(...)that queries current hardware model, firmware version, connection status, GPS capability, channel utilization, airtime, battery level/voltage, user profile long/short names, and total registered mesh peer counts & active online peers directly fromNodeRepository's reactive flows. - Injected this live radio diagnostics context dynamically as a system instruction metadata block on every user query. This empowers the on-device model to answer real-time, personalized diagnostic questions (e.g. "what is my battery level?", "how many active nodes are on my mesh right now?") with 100% on-device offline accuracy.
- Tuned context retrieval constraints for the modern
nano-v4-full(Gemini Nano v4) model: expanded the total context budgetMAX_CONTEXT_CHARSfrom 8,000 to 32,000 characters (up to ~12K tokens out of the model's native 32K window), and scaledMAX_PAGE_CHARSto 16,000 characters andMAX_SNIPPET_CHARSto 8,000 characters to supply vastly richer, more detailed, and complete documentation fragments.
2026-05-21 — Activated full on-device token streaming and polished Chirpy's personality instructions
- Upgraded the on-device inference flow inside
GeminiNanoDocAssistant.ktto use Firebase AI SDK's reactivegenerateContentStream(prompt)instead of the blockinggenerateContentinvocation. - Aggregated chunks and emitted incremental
AIDocAssistantResult.Partialstates down the Kotlin Flow, enabling true word-by-word/chunk-by-chunk streaming in the UI for a much more responsive user experience. - Refined the
SYSTEM_INSTRUCTIONpersonality rules for Chirpy to position him as our adorable LoRa radio Node mascot instead of an avian theme, emphasizing high-enthusiasm mesh networking, signal connectivity, battery status, and radio/routing concepts (e.g. "fully charged", "relaying info", "staying connected") while preserving technical precision. - Significantly increased the frequency and flavor of mesh networking, hardware, and radio puns (e.g. "let's relay some knowledge!", "channeling my inner router!", "completely on the same frequency!") to make Chirpy incredibly fun and interactive.
- Overhauled system error messages inside
DocsNavigation.ktand the loading bubble state insideChirpyAssistantSheet.ktto align with the highly-enthusiastic mascot theme (e.g. "routing through the mesh… 📡", "channel is totally congested… 📶", "battery is charging or firmware is still downloading… 🔋").
2026-05-21 — Implemented streaming chat support and Firebase Remote Config integration for Chirpy
- Added
firebase-configdependency to Version Cataloglibs.versions.tomlandandroidApp/build.gradle.kts. - Added the
AIDocAssistantResult.Partialvariant to support intermediate stream updates. - Extended the
AIDocAssistantinterface and implementedanswerStreamin bothKeywordFallbackAssistantandGeminiNanoDocAssistant. - Integrated Firebase Remote Config into
GeminiNanoDocAssistantto dynamically fetch the model name (chirpy_model_name) and system instruction (chirpy_system_instruction) with release-optimized fetch intervals. - Refactored
GeminiNanoDocAssistant.answerto reuseanswerStreamflow under the hood, eliminating duplicate prompting code. - Integrated the streaming flow into the Compose UI layer (
DocsNavigation.kt), appending a placeholder message and updating it in place on each stream emission. - Verified that all unit tests (
:feature:docs:allTests) and static analysis checks (spotlessApply spotlessCheck detekt) pass 100% green.
2026-05-21 — Fixed Chirpy Assistant invalid model name and enhanced failure fallback suggestions
- Fixed a 404/Unknown inference error by updating
GeminiNanoDocAssistant.kt'sMODEL_NAMEfrom"gemini-3.1-flash-lite"to the correct Firebase AI Logic preview name"gemini-3.1-flash-lite-preview". - Overhauled multi-turn hybrid chat seeding: eliminated the redundant and wasteful background
chat.sendMessagenetwork/token call on the first turn. Instead, if the first turn is answered on-device, the session caches the question and answer locally, and starts the subsequent cloud-chat session with these pre-loaded into thestartChat(history = ...)parameter. - Expanded the hybrid model's
looksLikeNoAnswerheuristics to better detect when the on-device model fails or has limited info, allowing seamless fallback to the grounded cloud model. - Polished
DocsNavigation.kt'schirpyResultToMessagesystem error handling to map raw exception/object types (e.g.,DocsAiError.Unknown) to polished, friendly user-facing messages. - Programmed a smart fallback in the UI: if an inference error occurs (e.g. offline, rate limit, or model not found), Chirpy now automatically displays local keyword search results as recommended page chips so the user is never left stranded.
- Verified 100% compliance with Spotless, Detekt, and unit tests (
:feature:docs:allTestsand:androidApp:testGoogleDebugUnitTestare fully green).
2026-05-20 — Decoupled and Isolated Flatpak manifest generation logic to build-logic/flatpak
- Isolated the optimized
GenerateFlatpakSourcesTaskfrom monolithicbuild-logic/conventioninto its own specialized, lightweight:flatpaksubproject underbuild-logic. - Created
:flatpakconfiguration and registered the formal plugin ID"meshtastic.flatpak"implemented byFlatpakConventionPlugininside the default package namespace (perfectly matching project-wide plugin architectures). - Implemented modern, configuration-cache-safe lazy provider directory evaluation for the default Gradle user home cache.
- Cleaned up
:conventionby removing the redundant class and registration imports fromRootConventionPlugin.kt. - Applied the new plugin in the root
build.gradle.ktsusingid("meshtastic.flatpak"). - Verified 100% compliant spotless and detekt formatting checks (
./gradlew spotlessCheck detektis green). - Successfully committed and pushed the branch
fix/flatpak-snapshot-resolutionto remotejamesarichwith properGITHUB_TOKENenvironment bypass. - Consolidated and updated GitHub PR #5542's description to comprehensively document the correctness, performance, and modular isolation of the Flatpak generator.
2026-05-20 — Extracted GenerateFlatpakSourcesTask to precompiled build-logic convention plugin
- Audited the Flatpak build structure and successfully extracted the entire task logic, data classes, and extension helpers from loose script files to a precompiled compiled Kotlin class:
build-logic/convention/src/main/kotlin/org/meshtastic/buildlogic/GenerateFlatpakSourcesTask.kt. - Registered the task directly within
RootConventionPlugin.ktand removed the legacygradle/flatpak.gradle.ktsscript block from the rootbuild.gradle.ktsfile entirely. - Resolved and fixed an implicit Gradle non-serializable property capture inside the lazy property mappings, ensuring full compliance with the Gradle Configuration Cache and restoring successful cache storage with zero errors.
- Validated with complete clean building (
./gradlew clean) and static code analysis (./gradlew spotlessCheck detekt), completing with 100% green passes.
2026-05-20 — Optimized GenerateFlatpakSourcesTask for performance and correctness
- Optimized
GenerateFlatpakSourcesTaskingradle/flatpak.gradle.ktsby implementing single-pass Maven metadata XML pre-indexing (O(1)lookups) and deferred SHA-256 calculation (executing digests only on deduplicated, finalized resources). - Refactored loose map structures into strongly-typed Gradle-compliant internal data classes (
SnapshotVersion,SnapshotMetadata, andFlatpakSourceCandidate) to improve type safety and maintainability. - Verified output correctness: the optimized manifest output
flatpak-sources.jsonis 100% character-for-character identical to the original unoptimized output. - Successfully passed all static analysis and code quality checks with
./gradlew spotlessCheck detekt(100% green).
2026-05-20 — Implemented dynamic Gradle cache SNAPSHOT metadata resolution for Flatpak offline builds
- Overhauled
GenerateFlatpakSourcesTaskingradle/flatpak.gradle.ktsto identify-SNAPSHOTdependencies, parse local cachedmaven-metadata.xmlinresources-2.1, and dynamically map them to remote timestamped snapshot URLs (e.g. Sonatype Snapshots) while preserving their original non-timestamped file names asdest-filename. - Created a pure JDK XML parser within the task to parse the
<snapshotVersions>block from cached XML files. - Verified that compiling the desktopApp and running the flatpak generator task successfully maps snapshot dependencies (such as
org.meshtastic:takpacket-sdk-jvm:0.2.4-SNAPSHOT) to their remote unique snapshot URLs inflatpak-sources.json. - Ran quality and validation checks:
./gradlew spotlessCheck detekt(100% SUCCESSFUL with zero issues).
2026-05-20 — Resolved Flatpak jitpack.io dependency download 404s in sandboxed offline builds
- Modified
GenerateFlatpakSourcesTaskingradle/flatpak.gradle.ktsto dynamically detect dependency groups starting withcom.github.(which are hosted on JitPack). - Configured the generation of
primaryUrlfor these dependencies to resolve directly fromhttps://jitpack.ioand created custom high-availability fallback lists. - Verified that compiling the desktopApp and running the flatpak generator task (
./gradlew :desktopApp:assemble :generateFlatpakSourcesFromCache --no-configuration-cache) successfully produces a valid 10MBflatpak-sources.jsoncontaining correctly mapped JitPack URLs. - Ran quality and validation checks:
./gradlew spotlessCheck detekt(100% SUCCESSFUL with zero issues).
2026-05-20 — Replaced standalone translations landing page with dynamic global header language switcher dropdown
- Deleted redundant standalone page
docs/en/translations.mdand updateddocs/README.mdto reflect layout change. - Completely re-engineered
docs/_includes/language_switcher.htmlto:- Dynamically parse active page paths and locales, matching default English pages with translated variants.
- Bind button text to native active language names (e.g., displaying "Беларуская" instead of hardcoded "English").
- Pre-verify file existence in
site.pagesto only render valid translation links, preventing any 404 errors. - Automatically hide the language switcher on English pages that do not have translations available yet.
- Modified custom CSS styles in
docs/_includes/head_custom.htmlto useright: 0; left: auto;layout alignment, preventing dropdown menu overflows on smaller screens. - Successfully built and verified live documentation pages in the browser using the browser subagent, confirming fully operational dynamic swappers.
- Ran quality and validation checks:
./gradlew generateDocsBundle validateDocsBundle spotlessCheck detekt(100% SUCCESSFUL).
2026-05-20 — Fixed Jekyll documentation site left navigation nesting and sub-page visibility
- Cleaned up redundant and brittle dynamic default scope parent settings in
docs/_config.yml. - Added explicit
parent: User Guidefront-matter fields to all 17 English user guide markdown files underdocs/en/user/. - Added explicit
parent: Developer Guidefront-matter fields to all 9 English developer guide markdown files underdocs/en/developer/. - Run and verified Gradle documentation bundle compilation:
./gradlew generateDocsBundle validateDocsBundle(PASSED: 672 pages). - Validated formatting and static analysis rules:
./gradlew spotlessApply spotlessCheck detekt(100% green). - Successfully completed full baseline compilation checks with
./gradlew assembleDebug.
2026-05-20 — Completely overhauled, simplified, and pushed Flatpak offline source automation
- Completely retired the third-party
flatpak-gradle-generatorplugin and its associated complex configuration and library overrides (removed ~150 lines of boilerplate). - Implemented a native JVM-based custom Gradle task
GenerateFlatpakSourcesTaskinsidegradle/flatpak.gradle.ktswhich walks the post-compilation Gradle cache and generates a perfectly sorted, deduplicatedflatpak-sources.jsonin under 3 seconds. - Integrated high-availability mirror URL generation (Google, Gradle Plugin Portal, GCP Maven Central, and Aliyun Maven repositories) for complete build robustness during Flathub sandboxed offline builds.
- Streamlined CI workflow files
.github/workflows/release.ymland.github/workflows/reusable-check.ymlto call our native Gradle task. - Validated all formatting and static analysis checks using
./gradlew spotlessCheck detekt(100% green). - Committed, successfully pushed the branch
fix/flatpak-sources-automationto remotejamesarich, and updated the PR description on GitHub for PR #5533.
2026-05-20 — Rebased Flatpak Optimization Branch onto upstream/main
- Successfully rebased the working branch
fix/flatpak-sources-automationonto the latest fetchedorigin/main(upstream). - Resolved potential rebase history divergence by preserving only our unique conflict-bypassing override commit and skipping squash-merged commits.
- Updated git submodules to track the new upstream base commit.
- Re-ran all baseline quality and static analysis checks (
spotlessCheck,detekt) and confirmed 100% success. - Validated end-to-end correctness by running
:combineFlatpakSourcesto verify complete and correct generation of the consolidatedflatpak-sources.jsonmanifest with 2,339 unique resources.
2026-05-20 — Overhauled and Bulletproofed Flatpak Source Generation
- Overhauled and streamlined
build-logic/convention/build.gradle.ktsto dynamically query and resolve all 25+ Version Catalog plugin marker coordinates in a type-safe dynamic loop. - Replaced the hardcoded embedded Gradle Kotlin compiler version with dynamic standard library detection:
KotlinVersion.CURRENT.toString(). - Implemented root Gradle consolidator task
:combineFlatpakSourcesusing JVM-native Json Slurper/Output, deduplicating 2222 entries and injecting Google/Aliyun backupmirror-urls. - Streamlined reusable-check and release CI workflows, replacing complex
jqhacks with a simple, single gradle task invocation. - Verified
spotlessCheck,detekt, and end-to-end completely offline package builds (--offline) completed with 100% success.
2026-05-20 — Refactored and polished Flatpak dependency manifests to modern Gradle standards
- Polished the Flatpak generator tasks and convention setup following a comprehensive audit:
- Centralized version definitions to reference the central
libs.versionscatalog (kotlin,koin.plugin, etc.) instead of hardcoded strings. - Documented every single dependency override and compiler-plugin helper with clear, inline comments (
// why: ...). - Cleaned out legacy dependencies and streamlined
core:databaseto only capturekspKotlinJvmProcessorClasspath. - Changed includeConfigurations to use type-safe
setOfinstead oflistOfto align with Gradle'sSetPropertyAPIs.
- Centralized version definitions to reference the central
- Verified that all static analysis checks pass successfully:
./gradlew spotlessCheck detektis 100% green. - Validated end-to-end correctness by successfully compiling the app completely offline (
--offline) and packaging the release UberJar.
2026-05-20 — Fixed Jekyll documentation site build and deployment in CI
- Created
docs/index.htmlto automatically redirect root path requests (/) to the English directory (/en/). - Updated
.github/workflows/docs-deploy.ymlto compile the Jekyll root site using--baseurl /${{ github.event.repository.name }}and setup Ruby with version4.0.4to match project release workflow conventions. - Updated
.github/workflows/docs-release.ymlto compile both versioned and root Jekyll sites, assemble them intobuild/final_site/with Dokka HTML references, configure correct baseurls respectively, and setup Ruby with version4.0.4. - Verified that local Gradle docs tasks (
generateDocsBundle,validateDocsBundle,publishDocsSite) compile successfully and the redirect file is correctly populated in the output.
2026-05-20 — Optimized slow Flatpak CI jobs
- Restrained flatpakGradleGenerator to target only the runtimeClasspath configuration in desktopApp and build-logic:convention modules.
- Updated release.yml and reusable-check.yml to invoke only targeted tasks (:desktopApp:flatpakGradleGenerator and :build-logic:convention:flatpakGradleGenerator) instead of running the task on the root and all subprojects.
- Retained Matrix architecture runner configuration for build validity, as Skiko/Compose Desktop native artifacts are resolved dynamically based on host architecture.
- Cleaned up leftover speed-up workarounds: completely removed the Flatpak Gradle Generator plugin application and tasks from the root project and all other library/feature subprojects (
core:ble,core:common,core:database,core:model,core:navigation,core:proto, andfeature:messaging), including deleting the unusedflatpakKmpAndroidMetaconfiguration fromfeature:messaging. - Verified that local execution of
:desktopApp:flatpakGradleGeneratorruntimeClasspath resolution speed dropped from 46 seconds to 12 seconds, and all Spotless and Detekt linting checks passed.
2026-05-12 — Implemented Apple alignment for docs feature (FR-038)
- Branch:
feat/20260507-161858-app-docs-markdown - Gap analysis against
meshtastic-applecompleted. Implemented 4 alignment items:- Per-page TOC icons via
DocPageIconResolver.ktmappingiconIdtoMeshtasticIcons - New
docs/user/signal-meter.md(RSSI vs SNR, bar-level criteria, LoRa signal concepts) - New
docs/user/units-and-locale.md(automatic metric/imperial viaMetricFormatter) - New
.github/workflows/docs-staleness.yml(advisory PR comments for UI changes without doc updates)
- Per-page TOC icons via
- Added
iconId: String?field toDocPageandKeywordIndexEntrymodels - Updated
DocBundleLoaderwith iconId for all 24 pages plus 2 new entries (signal-meter, units-and-locale) - Updated
DocsBrowserScreento show leading icons in TOC list items - Marked T061-T085 as completed in tasks.md (were implemented in prior session)
- Added Phase 9 (T200-T206) for Apple alignment tasks — all marked complete
- Skipped Apple-only features: watch, carplay, translate, TipKit, SwiftData docs
- Verified:
spotlessApply,detekt,assembleDebug,compileKotlinJvm— all green
2026-05-11 — Migrated feature/intro UI to commonMain
- Moved intro onboarding UI composables and nav graph from
feature/intro/src/androidMain/intofeature/intro/src/commonMain/, adding sharedIntroPermissionsandIntroSettingsNavigatorinterfaces plus a commonintroGraphNavigation 3 extension. - Refactored
AppIntroductionScreeninto a thin Android host that provides Android permission/settings adapters via composition locals, and addedAndroidIntroPermissions,AndroidIntroSettingsNavigator, and JVM desktop no-op stubs. - Verified with
./gradlew spotlessApply :feature:intro:compileKotlinJvm :feature:intro:compileAndroidMain.
2026-05-11 — Added Esp32OtaUpdateHandler common tests
- Created
feature/firmware/src/commonTest/kotlin/org/meshtastic/feature/firmware/ota/Esp32OtaUpdateHandlerTest.kt. - Covered WiFi OTA success flow, download/upload progress reporting, connection-drop error handling, hash rejection, verification timeout, and cancellation propagation.
- Validation note: per task instruction, no Gradle commands were run.
2026-05-11 — Added profile import/export round-trip coverage
- Created
feature/settings/src/commonTest/kotlin/org/meshtastic/feature/settings/radio/ProfileRoundTripTest.kt. - Covered
RadioConfigViewModel.exportProfile()→importProfile()round trips using the realExportProfileUseCaseandImportProfileUseCasewith an in-memoryFileServicetest double. - Added representative, empty, and partially populated
DeviceProfilecases, asserting message equality and stable protobuf bytes across re-export. - Validation note: per task instruction, no Gradle commands were run.
2026-05-11 — Added DirectRadioControllerImpl common tests
- Created
core/service/src/commonTest/kotlin/org/meshtastic/core/service/DirectRadioControllerImplTest.kt. - Covered service-repository flow delegation, send message/send shared contact behavior, remote config request delegation, location stop, and device address updates.
- Validation note:
./gradlew --no-configuration-cache :core:service:allTestsis currently blocked by pre-existing compile failures incore/network(MQTTRepositoryImplunresolvedKEEPALIVE_SECONDS) and downstreamcore/dataunresolvedorg.meshtastic.core.networksymbols.
2026-05-11 — Added DatabaseManager withDb retry host test
- Created
core/database/src/androidHostTest/kotlin/org/meshtastic/core/database/DatabaseManagerWithDbRetryTest.kt. - Covered the concurrent
withDb()retry path by pausing an in-flight query, switching to a new DB, closing the old pool, and asserting the retried query succeeds against the new DB. - Verified with
./gradlew --no-configuration-cache :core:database:spotlessApply :core:database:testAndroidHostTest --tests "org.meshtastic.core.database.DatabaseManagerWithDbRetryTest"and./gradlew --no-configuration-cache :core:database:spotlessCheck :core:database:testAndroidHostTest.
2026-05-11 — Expanded MQTT repository coverage
- Extended
core/network/src/commonTest/kotlin/org/meshtastic/core/network/repository/MQTTRepositoryImplTest.ktwith topic construction, JSON/protobuf decoding, reconnect retry, subscription retry, and connection-state coverage. - Added internal
MqttClientSession/MqttClientSetuptest hook plusupdateConnectionState()incore/network/src/commonMain/kotlin/org/meshtastic/core/network/repository/MQTTRepositoryImpl.ktto exercise repository behavior without a real broker. - Verified with
./gradlew --no-configuration-cache :core:network:allTests.
2026-05-11 — Added RadioConfigViewModel MQTT probe tests
- Extended
feature/settings/src/commonTest/kotlin/org/meshtastic/feature/settings/radio/RadioConfigViewModelTest.ktwith MQTT probe success, timeout, thrown-exception-to-Other, and clear/reset coverage. - Verified with
./gradlew --no-configuration-cache :feature:settings:jvmTest --tests "org.meshtastic.feature.settings.radio.RadioConfigViewModelTest".
2026-05-11 — Added MeshRouterImpl accessor routing tests
- Created
core/data/src/commonTest/kotlin/org/meshtastic/core/data/manager/MeshRouterImplTest.kt. - Covered lazy routing access for action-handler send/request/admin calls, traceroute handler access, and service-action passthrough.
- Verified with
./gradlew --no-configuration-cache :core:data:allTests.
2026-05-11 — Added SettingsViewModel saveDataCsv coverage
- Extended
feature/settings/src/commonTest/kotlin/org/meshtastic/feature/settings/SettingsViewModelTest.ktwithsaveDataCsv writes filtered export via file service. - The new test seeds
FakeNodeRepository+FakeMeshLogRepository, captures theFileService.write()sink with Mokkery, and verifies filtered CSV output from the realExportDataUseCase. - Verified with
./gradlew --no-configuration-cache :feature:settings:jvmTest --tests "org.meshtastic.feature.settings.SettingsViewModelTest"after running:feature:settings:spotlessApply.
2026-05-11 — Added CompassViewModel accuracy edge-case tests
- Extended
feature/node/src/commonTest/kotlin/org/meshtastic/feature/node/compass/CompassViewModelTest.ktwith PDOP-only, HDOP+VDOP, HDOP-only, precision-bits fallback, missing accuracy metadata, zero-distance angular error, and very-small-distance angular error coverage. - Validation note:
:feature:node:allTestsstill fails on the pre-existingMetricsViewModelTest.saveEnvironmentMetricsCSV writes correct dataTurbine timeout in JVM and Android host tests. The new CompassViewModel tests pass in the same run.
2026-05-11 — Added Node domain model tests
- Created
core/model/src/commonTest/kotlin/org/meshtastic/core/model/NodeTest.kt. - Covered
isOnline,distance,bearing,colors,createFallback,getRelayNode,isUnknownUser,validPosition,hasPKC, andmismatchKey. - Validation blockers:
:core:model:allTestscurrently fails on pre-existingDataPacketTestiOS compile errors, and directNodeTestexecution hits an existing class-version mismatch incore:commonhelpers.
2026-05-11 — Added HeartbeatSender transport tests
- Created
core/network/src/commonTest/kotlin/org/meshtastic/core/network/transport/HeartbeatSenderTest.kt. - Covered encoded heartbeat payloads, nonce sequencing, interval-driven scheduling, cancellation, zero-interval behavior, and restart semantics using coroutine virtual time.
- Verified with
./gradlew --console=plain --no-configuration-cache :core:network:allTests.
2026-05-11 — Added BaseMapViewModel waypoint expiration tests
- Extended
feature/map/src/commonTest/kotlin/org/meshtastic/feature/map/BaseMapViewModelTest.kt. - Added coverage for future, boundary (
expire == now), never-expiring (expire == 0), and mixed waypoint filtering. - Verified with
./gradlew --no-daemon --no-configuration-cache :feature:map:spotlessCheck :feature:map:allTests.
2026-05-03 — Switched Gradle GC to G1GC
- Replaced
-XX:+UseZGCwith-XX:+UseG1GCingradle.propertiesto resolve "not supported" error. - Added
-XX:+ParallelRefProcEnabledfor better build performance. - Verified with Gradle sync.
2026-05-02 — CI cost-control PR review fixes
- Applied PR review feedback: encoding fixes in sort-strings.py, NUL-delimited staged-files loop in ai-guardrail.sh, installation instructions added, typo fix in strings.xml, command order fixed in AGENTS.md, narrowed .aiexclude/.gitattributes patterns, allTests added to SKILL.md.
2026-04-XX — Token Mitigation (Phase 1-3)
.copilotignoreand.aiexcludeupdated with stricter ignore rules.AGENTS.mdmodularized to ~3KB base; detailed rules moved to.skills/.scripts/ai-guardrail.shadded to prevent binary/log leaks (installation: see script header).- CI Cost Control skill added at
.skills/ci-cost-control/SKILL.md.
Golden Context (stable across sessions)
- Always check
.skills/compose-ui/strings-index.txtbefore readingstrings.xml. - Run
python3 scripts/sort-strings.pyafter adding strings to keep the index organized. - Always check
gh run listbefore pushing. - Pre-commit hook
scripts/ai-guardrail.shprotects against binary leaks (see script for install).