Skip to content

Complete Translation correctness and worker lifecycle handling - #483

Merged
binaryfire merged 14 commits into
0.4from
audit/translation-correctness-lifecycle-parity
Aug 7, 2026
Merged

Complete Translation correctness and worker lifecycle handling#483
binaryfire merged 14 commits into
0.4from
audit/translation-correctness-lifecycle-parity

Conversation

@binaryfire

@binaryfire binaryfire commented Aug 7, 2026

Copy link
Copy Markdown
Collaborator

Summary

This pull request completes the Translation package's current Laravel API surface and makes its state ownership explicit for long-lived workers.

The main changes are:

  • Add typed string and array retrieval to the public Translator contract and generated Lang facade.
  • Correct plural-condition parsing, malformed-condition handling, and PHP 8.4 float modulo behavior.
  • Reject unsafe locale paths and invalid JSON structures before they reach translation lookup.
  • Preserve falsey translations, mixed array leaves, and JSON null as the untranslated sentinel.
  • Keep current locale coroutine-local while treating fallback, callbacks, namespaces, and loader paths as boot-time worker configuration.
  • Avoid constructing and dispatching LocaleUpdated when no targeted listener exists.
  • Move framework consumers that require text onto the typed string boundary while retaining array-capable lookups where arrays are valid.
  • Restore precise conditional return metadata for the translation, redirect, session, and view helpers.
  • Replace order-dependent and process-global Translation tests with deterministic coroutine and local fixture ownership.
  • Make localization documentation canonical and keep package READMEs limited to public differences.

Translation values

Translator::get now declares the array-or-string result it already provides. Translator::string and Translator::array offer explicit boundaries for call sites that require one shape, with key-specific errors when configuration contains the wrong type. Fallback accessors are also part of the public contract, so the helper and facade expose the same usable API as the concrete translator.

Array replacements now have one implementation. Strings are replaced recursively, while integer, float, boolean, null, and object leaves remain unchanged. Empty strings, string zero, and empty arrays remain valid translations. A JSON null value keeps its established meaning: the key is untranslated and normal group fallback is attempted.

Framework-owned consumers use the typed string accessor only where their own API requires text. Validation metadata and notification lines remain on the array-capable path.

Selectors and file loading

Plural selectors now use one grammar for extraction and stripping. Supported numeric, signed, decimal, and wildcard ranges remain available. Invalid labels and mismatched delimiters remain literal text instead of matching through PHP coercion. Modulo branches cast only their operands, preserving float exact and range comparisons under PHP 8.4.

FileLoader rejects path separators and exact dot segments before filesystem access while allowing locale names such as en.UTF-8. JSON files must decode to arrays, and each non-null top-level value must be a string or array. Errors name the file and offending key.

Worker and request ownership

Translator and FileLoader remain worker-lifetime services. Loaded definitions are shared immutable data. Current locale remains in coroutine context, so one request cannot change another request's locale. Fallback locale and registration callbacks remain shared boot-time configuration and are documented at their public mutators.

Application locale methods resolve the canonical contracts once. Locale changes no longer imply process-global configuration changes. LocaleUpdated retains its ordering for active listeners, while the no-listener path avoids event allocation and dispatch.

No request-scoped translator, loader lock, watcher, cache invalidation registry, retry path, or compatibility wrapper is introduced.

Package and documentation cleanup

The Translation provider resolves typed dependencies once and uses configuration as the construction seed. The split package no longer declares Container as a direct dependency when it is inherited through the provider parent.

The localization guide documents typed values, effective locale behavior, and the worker-shared fallback boundary in the same task-oriented style as the rest of the framework documentation. Translation and Foundation READMEs contain only the public differences developers need when moving from Laravel.

The root and dogfood test environments require the released ParaTest line compatible with PHPUnit 13.3.

Compatibility

Supported Laravel method names, signatures, named arguments, helper entry points, facade methods, and protected extension points remain compatible. The new accessors are additive.

Behavior changes are limited to invalid or previously inconsistent cases: malformed plural conditions, unsafe locale paths, non-null scalar JSON values outside the declared return contract, and callable forms that could be accepted by the old type but could not register successfully.

Performance

Cached translation reads keep the same filesystem and cache path. Locale validation runs on assignment or load. JSON validation walks a decoded file once. Array recursion runs only for array translations with replacements. Typed accessors add one result check, and the optional event guard removes work when no listener exists.

The change adds no query, network call, lock, retry, polling loop, serialization layer, or unbounded worker state.

Verification

  • Full formatter, PHPStan, parallel component suite, Testbench package mode, and dogfood checks through composer fix.
  • Focused Translation and integration suites, including random-order integration coverage.
  • Affected Foundation, Auth, and Validation suites.
  • Generated facade drift verification.
  • Static contract and conditional-helper type probes.
  • Fresh unlocked dogfood dependency resolution on ParaTest with PHPUnit 13.3.
  • Final diff and documentation consistency checks.

Summary by CodeRabbit

  • New Features

    • Added typed translation access for string and array values.
    • Improved locale fallback controls and isolated locale behavior during concurrent requests.
    • Added stronger pluralization support for decimal and negative values.
  • Bug Fixes

    • Improved validation of locale names and JSON translation files.
    • Prevented invalid translation values from being loaded.
    • Updated authentication emails to reliably display translated subjects and action labels.
  • Documentation

    • Clarified locale lifecycle, fallback configuration, typed translations, and framework differences.
  • Tests

    • Expanded coverage for translation, locale isolation, pluralization, JSON validation, and notification text.

Use one numeric grammar for extracting and stripping plural conditions so paired delimiters and supported range forms cannot drift apart. Preserve malformed conditions as literal text instead of selecting them through PHP coercion.\n\nKeep floating-point values for exact and range comparisons while casting only modulo operands required by PHP 8.4. Expand the selector matrix to cover decimals, signed ranges, wildcard endpoints, mismatched delimiters, and the real modulo path.
Reject path separators and exact dot segments before any translation filesystem access while retaining valid dot-bearing locale names. Validate JSON roots and top-level values with file and key context, preserving null as the untranslated sentinel and arrays as supported values.\n\nComplete loader namespace-map metadata, remove redundant promoted-property assignment, and add direct coverage for invalid locales, JSON diagnostics, numeric array keys, and null values.
Expose string, array, and fallback accessors through the public contract and generated Lang facade. Make get return its real array-or-string domain, route choice and translated strings through the typed boundary, and keep request locale validation eager.\n\nCentralize replacements for nested array translations without coercing mixed leaves. Preserve falsey values and null fallback behavior, reject unsupported stringable registrations immediately, and document worker-shared mutators at their public boundaries. Add regression coverage for typed values, mixed arrays, fallback state, callable registration, locale paths, and FileLoader-backed null sentinels.
Route framework call sites that promise text through the Translator string accessor so array-valued configuration fails at the translation boundary with a key-specific error. Keep bulk validation metadata and notification lines on the array-capable get path where arrays remain supported.\n\nCover FormRequest, validation messages, password-reset mail, and verification mail without duplicating the Translator wrong-type matrix at every consumer.
Resolve the canonical Translator and event dispatcher contracts once when reading or changing locale state. Keep current locale request-local and fallback locale on the shared Translator instead of mutating process-global configuration.\n\nGuard LocaleUpdated construction and dispatch behind targeted listener detection while preserving mutation order for active listeners. Add ordered listener and no-listener coverage together with assertions that configuration remains the worker boot seed.
Run locale and missing-key interleavings through the repository coroutine test harness with deliberate yields and propagated task results. Prove concurrent locale changes remain isolated and missing-key suppression cannot hide a sibling callback.\n\nReplace process-global integration fixture communication with local captured state, remove redundant shared cleanup, and complete current test typing and Hypervel-owned fixture prose.
Resolve configuration, filesystem, and loader dependencies through their canonical typed services during provider construction. Read configuration once, rely on the shipped defaults, and avoid duplicate promoted-property assignment.\n\nRemove Translation's false direct Container requirement while retaining the dependency through its provider parent. This keeps split-package metadata aligned with the classes the package uses directly.
Describe the conditional results of translation, redirect, session, and view helpers so static analysis narrows supported calls to their real return types. Replace the session helper's information-free Store annotation with the SessionManager, value, and null branches it actually returns.\n\nNormalize the touched redirect types and the existing CookieJar annotation to imported short names. These changes improve caller inference without changing any executable helper branch.
Document typed translation retrieval with direct string and array examples, including the wrong-type failure behavior. Explain that application locale configuration seeds each worker, current locale changes apply to the active request, and fallback changes belong at application boot.\n\nKeep the package READMEs thin while recording the public Laravel differences for coroutine-local locale state, worker-shared fallback state, and JSON value validation.
Raise the root and dogfood ParaTest floor to the first released version that supports and requires PHPUnit 13.3. This keeps unlocked package resolution on a compatible runner pair without narrowing PHPUnit or carrying a temporary vendor patch.\n\nThe change affects development and test execution only; runtime package dependencies are unchanged.
State the PHP language rule directly: constructors and destructors cannot declare return types. This prevents the repository's full-typing convention from being applied to syntax PHP rejects while leaving every other typing requirement unchanged.
Capture the final Translation architecture, verified findings, public API decisions, worker and coroutine ownership, implementation boundaries, and performance accounting. Record the exact regression strategy and checkpoint gates so future maintenance can distinguish intentional Hypervel behavior from stale parity drift.\n\nThe plan also documents the rejected machinery: no request-scoped translator, loader lock, watcher, compatibility wrapper, parser object, or duplicate replacement path.
Close the Translation package checklist and route its completed cross-package findings to Contracts, Foundation, Auth, Validation, Support, Routing, Session, and View. Record the final implementation, verification, public differences, hot-path accounting, rejected complexity, and review result in the companion ledger.\n\nUpdate the durable Pagination owner route now that the translated helper type is complete, while preserving dated detail plans as historical design records.
@coderabbitai

coderabbitai Bot commented Aug 7, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@binaryfire, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 18 minutes

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: c3c87ee5-fad1-40d8-ad8e-e33bc2f97d56

📥 Commits

Reviewing files that changed from the base of the PR and between 74ed96b and 7b795d6.

📒 Files selected for processing (4)
  • docs/plans/2026-07-12-0915-framework-coroutine-state-lifecycle-audit-ledger.md
  • docs/plans/2026-08-06-0925-translation-correctness-current-parity-and-worker-lifecycles.md
  • src/translation/src/Translator.php
  • tests/Translation/TranslationTranslatorTest.php
📝 Walkthrough

Walkthrough

Translation now has typed accessors, stricter locale and JSON validation, updated pluralization, worker and coroutine lifecycle rules, contract-based framework wiring, migrated string consumers, expanded tests, and updated documentation and audit records.

Changes

Translation correctness

Layer / File(s) Summary
Audit, plan, and project support
AGENTS.md, composer.json, dogfood/..., docs/plans/..., src/boost/docs/localization.md, src/translation/README.md, src/translation/composer.json
Updated PHP guidance, ParaTest constraints, Translation plans, audit records, package documentation, and localization documentation.
Translation contracts and core behavior
src/contracts/src/Translation/*, src/translation/src/*
Added typed translation accessors and fallback controls. Added locale and JSON validation. Updated replacement handling, stringable registration, provider resolution, and plural-selector parsing.
Framework wiring and typed consumers
src/foundation/src/*, src/auth/src/Notifications/*, src/validation/src/*, src/support/src/Facades/Lang.php
Updated locale operations to use contracts and conditional events. Migrated string-only lookups to string(). Updated helper and facade metadata.
Translation and framework verification
tests/Auth/*, tests/Foundation/*, tests/Integration/Translation/*, tests/Translation/*, tests/Validation/*
Added coverage for typed values, JSON and locale validation, pluralization, coroutine isolation, fallback behavior, locale events, notifications, and updated translator mocks.

Estimated code review effort: 4 (Complex) | ~60 minutes

Sequence Diagram(s)

sequenceDiagram
  participant Application
  participant Translator
  participant FileLoader
  participant Dispatcher
  Application->>Translator: set current or fallback locale
  Translator->>FileLoader: load validated translation data
  FileLoader-->>Translator: return validated values
  Application->>Dispatcher: check and dispatch LocaleUpdated
  Translator-->>Application: return typed translation value
Loading

Possibly related PRs

Suggested reviewers: albertcht

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 37.43% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly summarizes the PR's main changes to Translation correctness and worker lifecycle behavior.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches 💡 1
📝 Generate docstrings 💡
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch audit/translation-correctness-lifecycle-parity

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@greptile-apps

greptile-apps Bot commented Aug 7, 2026

Copy link
Copy Markdown

Greptile Summary

The PR expands Translation’s typed API and corrects translation selection, loading, coroutine-local locale ownership, framework consumers, documentation, and regression coverage.

  • Adds typed string and array translation boundaries across contracts, implementations, helpers, and the Lang facade.
  • Hardens plural selection, locale paths, JSON translation structures, falsey values, and fallback behavior.
  • Clarifies worker-shared versus coroutine-local state and updates affected Auth, Foundation, and Validation consumers.
  • Updates Translation documentation and focused test coverage.

Confidence Score: 4/5

The PR is not yet safe to merge because the intended root ParaTest update is absent from the lockfile used by reproducible installs.

The root manifest requests ParaTest ^7.24, but the unchanged lockfile means locked dependency installation does not realize that update and leaves the previously reported Composer workflow issue outstanding.

Files Needing Attention: composer.json and composer.lock

Important Files Changed

Filename Overview
src/translation/src/Translator.php Adds typed translation retrieval, preserves valid falsey and mixed translation values, and isolates the effective locale through coroutine context.
src/translation/src/FileLoader.php Adds locale-path validation and enforces the declared structure of decoded JSON translation files.
src/translation/src/MessageSelector.php Consolidates plural-condition parsing and stripping while preserving float comparisons on PHP 8.4.
src/foundation/src/Application.php Resolves canonical translation and event contracts and avoids constructing locale events when no targeted listener exists.
src/contracts/src/Translation/Translator.php Expands the public translation contract with typed value and fallback accessors.
src/foundation/src/helpers.php Restores conditional helper return metadata for translation and other framework helper boundaries.
composer.json Raises the root ParaTest development constraint to the line intended for PHPUnit 13.3 compatibility.

Reviews (2): Last reviewed commit: "fix(translation): preserve keyed empty a..." | Re-trigger Greptile

Comment thread composer.json

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@src/foundation/src/helpers.php`:
- Around line 1021-1022: The conditional return annotation for view() does not
match its func_num_args() === 0 behavior. Update the view() annotation to
distinguish omitted arguments from an explicitly passed null, or change the
implementation’s branch to use is_null($view) if explicit null should return
ViewFactory; ensure the declared return types match the actual behavior.

In `@src/translation/src/Translator.php`:
- Around line 250-254: Update the value check in Translator::get so an empty
array is preserved as a valid translation and passed to makeReplacements, rather
than treated as missing. Keep the existing handling for strings, non-empty
arrays, and null or unsupported values unchanged.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 2269f49c-f2b1-452a-84ce-3cf591a80a0e

📥 Commits

Reviewing files that changed from the base of the PR and between 8adc603 and 74ed96b.

📒 Files selected for processing (35)
  • AGENTS.md
  • composer.json
  • docs/plans/2026-07-12-0900-framework-coroutine-state-lifecycle-audit.md
  • docs/plans/2026-07-12-0915-framework-coroutine-state-lifecycle-audit-ledger.md
  • docs/plans/2026-08-06-0925-translation-correctness-current-parity-and-worker-lifecycles.md
  • dogfood/testbench-package/composer.json
  • src/auth/src/Notifications/ResetPassword.php
  • src/auth/src/Notifications/VerifyEmail.php
  • src/boost/docs/localization.md
  • src/contracts/src/Translation/Loader.php
  • src/contracts/src/Translation/Translator.php
  • src/foundation/README.md
  • src/foundation/src/Application.php
  • src/foundation/src/Http/FormRequest.php
  • src/foundation/src/helpers.php
  • src/support/src/Facades/Lang.php
  • src/translation/README.md
  • src/translation/composer.json
  • src/translation/src/ArrayLoader.php
  • src/translation/src/FileLoader.php
  • src/translation/src/MessageSelector.php
  • src/translation/src/PotentiallyTranslatedString.php
  • src/translation/src/TranslationServiceProvider.php
  • src/translation/src/Translator.php
  • src/validation/src/Concerns/FormatsMessages.php
  • src/validation/src/ValidationException.php
  • tests/Auth/VerifyEmailNotificationTest.php
  • tests/Foundation/FoundationApplicationTest.php
  • tests/Foundation/FoundationFormRequestTest.php
  • tests/Integration/Translation/TranslatorTest.php
  • tests/Translation/CoroutineIsolationTest.php
  • tests/Translation/TranslationFileLoaderTest.php
  • tests/Translation/TranslationMessageSelectorTest.php
  • tests/Translation/TranslationTranslatorTest.php
  • tests/Validation/ValidationValidatorTest.php

Comment thread src/foundation/src/helpers.php
Comment thread src/translation/src/Translator.php Outdated
Treat an explicitly keyed empty PHP array as a real translation value instead of falling through to another locale. Keep empty loader results for whole-group lookups as missing so sentence-style keys and absent groups retain their existing behavior.

Add a two-sided regression covering get, has, the typed array accessor, fallback suppression, and missing groups. Update the detailed plan and completed audit ledger so the array contract and its string-only consumer consequence are recorded accurately.
@binaryfire

Copy link
Copy Markdown
Collaborator Author

@coderabbitai @greptile-apps Follow-up complete.

  • Fixed explicitly keyed empty PHP arrays so they remain real translation values and do not fall through to another locale. The implementation still treats empty loader results for whole groups as missing, avoiding the regression in the broader suggested condition.
  • Kept the view() conditional annotation. PHPDoc cannot represent argument presence, and changing the runtime branch would diverge from Laravel to support an explicit-null call that already fails at the native view factory boundary.
  • Confirmed the ParaTest constraint was updated through composer require. The root lockfile is intentionally ignored, and the local lock resolves the expected ParaTest and PHPUnit versions.
  • No change for the generic docstring-coverage warning. The repository deliberately does not require docblocks on test methods or routine classes, and the changed source follows its documentation conventions.

The focused Translation coverage is green, the changed source passes formatting and static-analysis checks, and the final diff is clean.

@greptile-apps

greptile-apps Bot commented Aug 7, 2026

Copy link
Copy Markdown

Thanks for the thorough follow-up — all four points are well-reasoned and the explanations are sound.

  • Empty keyed arrays as valid translations: The distinction between an explicitly keyed empty array (a real but empty translation value) and an empty group result (loader miss) is the right boundary. Keeping those two cases separate avoids the broader regression you identified.
  • view() conditional annotation: Agreed — PHPDoc can't express argument-presence conditions, and matching Laravel's runtime behavior takes precedence over annotating a call pattern that the native factory rejects anyway.
  • ParaTest constraint: Root lockfile being intentionally ignored is a reasonable policy for a monorepo/worker setup; local lock resolving the expected versions is sufficient verification.
  • Docstring coverage: Consistent with a repo policy that doesn't require docblocks on test methods or routine classes — no action needed.

Nothing outstanding from my side. The PR looks good to merge.

@coderabbitai

coderabbitai Bot commented Aug 7, 2026

Copy link
Copy Markdown

Tip

For best results, initiate chat on the files or code changes.

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

printf '%s\n' '=== PR diff: relevant files ==='
git diff --unified=40 HEAD^ HEAD -- \
  src/translation/src/Translator.php \
  tests/Translation/TranslationTranslatorTest.php \
  src/foundation/src/helpers.php \
  composer.json \
  dogfood/testbench-package/composer.json \
  dogfood/testbench-package/composer.lock || true

printf '%s\n' '=== Translator outline ==='
ast-grep outline src/translation/src/Translator.php --items all --view expanded || true

printf '%s\n' '=== Empty-array / loader-result handling ==='
rg -n -C 8 -P '\b(empty|is_array|load|fallback|getLine|parseKey)\b' \
  src/translation/src/Translator.php \
  tests/Translation/TranslationTranslatorTest.php || true

printf '%s\n' '=== view helper documentation and implementation ==='
rg -n -C 10 -P 'function\s+view\s*\(|`@return`.*(View|Factory|mixed)' \
  src/foundation/src/helpers.php || true

printf '%s\n' '=== ParaTest constraints and available local lockfile entries ==='
rg -n -C 2 -P '"brianium/paratest"|"phpunit/phpunit"' \
  composer.json \
  dogfood/testbench-package/composer.json \
  dogfood/testbench-package/composer.lock || true

Length of output: 91098


@binaryfire Confirmed the empty-array fix in Translator::getLine().

The new condition preserves explicitly keyed empty arrays. It still treats an empty group as missing. The regression test covers both cases and prevents fallback for the keyed empty array.

The view() annotation remains correct for the supported runtime branches. I withdraw that concern.

Both Composer manifests now require brianium/paratest ^7.24. The local lockfile is unavailable in this checkout, so I could not independently verify its resolved package versions.

I also withdraw the generic docstring concern. The changed code follows the repository documentation convention.


✏️ Learnings added
Learnt from: binaryfire
URL: https://github.com/hypervel/components/pull/483

Timestamp: 2026-08-07T15:29:57.424Z
Learning: In this PHP repository, routine classes and PHPUnit test methods do not require docblocks. Reviews must assess documentation against the existing source documentation conventions instead of requiring generic docblock coverage.

Learnt from: binaryfire
URL: https://github.com/hypervel/components/pull/483

Timestamp: 2026-08-07T15:29:57.424Z
Learning: In `src/foundation/src/helpers.php`, `view()` intentionally returns `ViewFactory` only when called with no arguments, using `func_num_args() === 0`. Its PHPDoc conditional return annotation uses `$view is null` because PHPDoc cannot represent argument presence. Do not change the runtime branch to support `view(null)`, because the native view factory rejects that call and Laravel behavior must remain compatible.

Note: Learnings are effective only in the context of similar code segments. To apply general coding guidelines, please configure review instructions. You can manage existing learnings in the app.


If you found this review helpful, would you consider giving us a shout-out on X?

Thank you for using CodeRabbit!

You are interacting with an AI system.

@binaryfire
binaryfire merged commit 8881b43 into 0.4 Aug 7, 2026
38 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant