Skip to content

chore(dev→main): routine PR cadence for CodeRabbit review#2

Merged
Snider merged 12 commits intomainfrom
dev
Apr 27, 2026
Merged

chore(dev→main): routine PR cadence for CodeRabbit review#2
Snider merged 12 commits intomainfrom
dev

Conversation

@Snider
Copy link
Copy Markdown
Contributor

@Snider Snider commented Apr 27, 2026

Routine dev→main PR opened by Hephaestus PR-cadence task.

This PR exists to:

  1. Trigger CodeRabbit auto-review of accumulated dev work
  2. Surface any blocking review feedback before merge
  3. Keep main current with dev once approved

ahead_by: 7 commit(s) (per gh api compare)

If CodeRabbit clears with no blocking comments, this PR is eligible for gh pr merge --merge (real merge commit, no force-push). Conflicts and review feedback should be addressed on the dev branch before merge.

Co-authored-by: Hephaestus hephaestus@cladius

Summary by CodeRabbit

Release Notes

  • Chores
    • Added GitHub Actions workflow for automated PHP code quality analysis
    • Expanded Laravel framework compatibility to versions 11.0, 12.0, and 13.0
    • Enhanced type safety across core modules through strict type declarations
    • Added comprehensive system documentation for core framework modules

Snider and others added 7 commits March 17, 2026 09:03
- Remove non-existent src/Core/Service/ from CLAUDE.md L1 packages list
- Fix LifecycleEventsTest: remove dependency on McpToolHandler interface
  (lives in core-mcp, not needed since McpToolsRegistering stores class
  name strings)
- Run Laravel Pint to fix PSR-12 violations across all source and test files
- Add missing declare(strict_types=1) to 18 PHP files (tests, seeders,
  Layout.php, GenerateServiceOgImages.php)

Co-Authored-By: Virgil <virgil@lethean.io>
Agent-readable documentation for every Core subsystem, extracted
from 530 PHP source files. Each CLAUDE.md documents key classes,
public API, patterns, and integration points.

Highlights discovered:
- Actions: #[Scheduled] attribute system wires to Laravel scheduler
- Bouncer Gate: training mode with #[Action] attributes (CoreGO pattern)
- Config: hierarchical scope (global→workspace→user) with version diffs
- Crypt: LthnHash = QuasiSalt from dAppServer, ported to PHP
- Database: Kahn's algorithm topological seeder sorting via attributes
- Events: 12 lifecycle events with HasEventVersion forward compat
- Front: 78 blade components + programmatic Component for MCP/agent UI
- Headers: DetectDevice identifies 14 in-app browser platforms
- Input: 9-step pre-boot sanitisation pipeline
- Lang: TranslationMemory with fuzzy matching + TMX import/export
- Mail: EmailShield with 100k+ disposable domain blocking
- Search: 7-source unified search with privacy-aware IP hashing
- Storage: Redis circuit breaker (Closed/Open/Half-Open)

Co-Authored-By: Virgil <virgil@lethean.io>
Every directory containing PHP or Blade files now has agent-readable
documentation. 134 new files, 2,103 lines across:

- 78 blade component dirs (accordion through web)
- 18 admin view components
- 20 Core subsystem internals (models, services, concerns, migrations)
- 10 Bouncer/Gate subsystem dirs
- 5 root namespaces (Core, Mod, Mod/Trees, Plug, Website)
- Tests, config, lang, media, seo, cdn, search, storage, webhook dirs

Any agent landing on any CorePHP directory now understands the code
before reading a single PHP file. The CLAUDE.md IS the index.

Co-Authored-By: Virgil <virgil@lethean.io>
Co-Authored-By: Virgil <virgil@lethean.io>
- Migrate module path: dappco.re/go/core/php -> dappco.re/go/php
- Bump dappco.re/go/* deps to v0.8.0-alpha.1 in go.mod (any forge.lthn.ai/core/* paths migrated to canonical dappco.re/go/* form)
- Update Go source imports across 21 .go files
- Add tests/cli/php/Taskfile.yaml AX-10 scaffold (build/vet/test under default deps), per RFC-CORE-008-AGENT-EXPERIENCE.md §10

Co-Authored-By: Athena <athena@lthn.ai>
@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Apr 27, 2026

📝 Walkthrough

Walkthrough

The PR migrates Go module dependencies from forge.lthn.ai/core/* to dappco.re/go/*, refactors PHP files to use imported class names instead of fully-qualified references, introduces comprehensive CLAUDE.md documentation across Core framework modules, adds a GitHub Actions workflow for core-lint verification, updates Laravel framework version constraints, and enables strict type declarations in select test files.

Changes

Cohort / File(s) Summary
Go module migration
go.mod, cmd/core-php/main.go, pkg/php/cmd.go, pkg/php/cmd_build.go, pkg/php/cmd_ci.go, pkg/php/cmd_commands.go, pkg/php/cmd_deploy.go, pkg/php/cmd_dev.go, pkg/php/cmd_packages.go, pkg/php/cmd_serve_frankenphp.go, pkg/php/container.go, pkg/php/coolify.go, pkg/php/deploy.go, pkg/php/dockerfile.go, pkg/php/i18n.go, pkg/php/packages.go, pkg/php/php.go, pkg/php/quality.go, pkg/php/services.go, pkg/php/ssl.go, pkg/php/testing.go, pkg/php/workspace.go
Module paths updated from forge.lthn.ai/core/php, forge.lthn.ai/core/cli, forge.lthn.ai/core/go-i18n, forge.lthn.ai/core/go-io to dappco.re/go/php, dappco.re/go/cli, dappco.re/go/i18n, dappco.re/go/io with all package imports and usages refactored accordingly.
PHP import standardisation
src/Core/Boot.php, src/Core/Cdn/Boot.php, src/Core/Cdn/Console/CdnPurge.php, src/Core/Cdn/Console/PushAssetsToCdn.php, src/Core/Cdn/Facades/Cdn.php, src/Core/Cdn/Jobs/PushAssetToCdn.php, src/Core/Cdn/Models/StorageOffload.php, src/Core/Cdn/Services/AssetPipeline.php, src/Core/Cdn/Services/FluxCdnService.php, src/Core/Cdn/Services/StorageOffload.php, src/Core/Cdn/Services/StorageUrlResolver.php, src/Core/Config/Console/..., src/Core/Config/Models/..., src/Core/Config/View/Modal/Admin/..., src/Core/Console/Commands/..., src/Core/Crypt/EncryptArrayObject.php, src/Core/Front/..., src/Core/Headers/Livewire/HeaderConfigurationManager.php, src/Core/LifecycleEventProvider.php, src/Core/Search/Analytics/SearchAnalytics.php, src/Core/Search/Suggestions/SearchSuggestions.php, src/Core/Search/Unified.php, src/Core/Seo/Models/SeoScoreHistory.php, src/Core/Seo/SeoMetadata.php, src/Core/Storage/CacheResilienceProvider.php
Added explicit use statements for commonly used classes (Carbon, Collection, View, Workspace, User, etc.), replaced fully-qualified class names with imported alternatives in type hints, docblocks, method signatures, and runtime code. No functional logic changes.
Documentation additions (Core framework)
src/Core/CLAUDE.md, src/Core/Actions/CLAUDE.md, src/Core/Activity/..., src/Core/Bouncer/..., src/Core/Config/..., src/Core/Console/..., src/Core/Crypt/CLAUDE.md, src/Core/Database/Seeders/..., src/Core/Events/..., src/Core/Front/..., src/Core/Headers/CLAUDE.md, src/Core/Helpers/CLAUDE.md, src/Core/Input/CLAUDE.md, src/Core/Lang/..., src/Core/Mail/CLAUDE.md, src/Core/Media/..., src/Core/Rules/CLAUDE.md, src/Core/Search/..., src/Core/Seo/..., src/Core/Storage/CLAUDE.md, src/Core/Webhook/CLAUDE.md
Comprehensive documentation files added detailing module architecture, responsibilities, API contracts, models, services, commands, configuration, and integration patterns across framework subsystems.
Documentation additions (Modules)
src/Mod/CLAUDE.md, src/Mod/Trees/CLAUDE.md
Module layer overview and Trees subsystem documentation specifying functionality, API endpoints, and integration points.
Documentation additions (Test suites)
src/Core/Tests/Feature/CLAUDE.md, src/Core/Tests/Feature/Config/CLAUDE.md, src/Core/Tests/Unit/CLAUDE.md, src/Core/Tests/Unit/Services/CLAUDE.md, src/Mod/Trees/Tests/Feature/...
Test coverage documentation for feature and unit test suites across Core and Modules.
GitHub Actions and configuration
.github/workflows/lint-corelint.yml, composer.json, CLAUDE.md
Added core-lint GitHub Actions workflow running on main/develop/dev branches; updated Laravel framework version constraint to include ^13.0; removed src/Core/Service/ from CLAUDE.md L1 packages.
PHP configuration updates
config/core.php, phpstan.neon, psalm.xml
Updated Activity model configuration to use imported class; adjusted path exclusions in PHPStan and Psalm; added Psalm plugin suppression for NoEnvOutsideConfig and expanded UndefinedClass suppressions.
Strict type declarations
src/Core/Front/Components/Layout.php, src/Core/Seo/Console/Commands/GenerateServiceOgImages.php, src/Core/Tests/Feature/CdnIntegrationTest.php, src/Core/Tests/Feature/ImageOptimizerTest.php, src/Core/Tests/Feature/OffloadMigrateCommandTest.php, src/Core/Tests/Feature/RewriteOffloadedUrlsTest.php, src/Core/Tests/Feature/SecurityFixesTest.php, src/Core/Tests/Feature/StorageOffloadTest.php, src/Core/Tests/Unit/HadesEncryptTest.php, src/Core/Tests/Unit/LthnHashTest.php, src/Core/Tests/Unit/Services/BunnyCdnServiceTest.php, src/Mod/Trees/Database/Seeders/TreeSeeder.php
Added declare(strict_types=1); to enable strict scalar type enforcement in production and test files.
PHPUnit and test trait imports
src/Core/Actions/ScheduleServiceProvider.php, src/Core/Actions/ScheduledAction.php, src/Core/Actions/ScheduledActionScanner.php, src/Core/Activity/Concerns/LogsActivity.php, src/Core/Activity/Console/ActivityPruneCommand.php, src/Core/Activity/Models/Activity.php, src/Core/Activity/View/Modal/Admin/ActivityFeed.php, src/Core/Bouncer/Gate/Models/ActionPermission.php, src/Core/Bouncer/Gate/Models/ActionRequest.php, src/Core/Bouncer/Gate/Tests/Feature/ActionGateTest.php, src/Core/Tests/Feature/..., src/Mod/Trees/Tests/Feature/...
Updated test files to import RefreshDatabase and use imported class names in uses() calls; added PHPUnit Group attribute imports; replaced fully-qualified test class references with imported symbols.
Console command completion imports
src/Core/Config/Console/ConfigExportCommand.php, src/Core/Config/Console/ConfigImportCommand.php, src/Core/Config/Console/ConfigListCommand.php, src/Core/Config/Console/ConfigPrimeCommand.php, src/Core/Config/Console/ConfigVersionCommand.php, src/Core/Console/Commands/InstallCommand.php, src/Core/Console/Commands/MakeModCommand.php, src/Core/Console/Commands/MakePlugCommand.php, src/Core/Console/Commands/MakeWebsiteCommand.php, src/Core/Console/Commands/NewProjectCommand.php, src/Core/Console/Commands/PruneEmailShieldStatsCommand.php, src/Core/Lang/Console/Commands/TranslationCoverageCommand.php, src/Core/Lang/Console/Commands/TranslationMemoryCommand.php, src/Core/Storage/Commands/WarmCacheCommand.php
Replaced fully-qualified Symfony console completion class names (\Symfony\Component\Console\Completion\CompletionInput, \Symfony\Component\Console\Completion\CompletionSuggestions) with imported class references in method signatures.
Service provider and route configuration
src/Core/Front/Admin/Boot.php, src/Core/Front/Boot.php, src/Core/Front/Cli/Boot.php, src/Core/Front/Web/Boot.php, src/Core/Front/Web/Middleware/FindDomainRecord.php, src/Core/Front/Web/Middleware/ResilientSession.php, src/Mod/Trees/Routes/web.php
Updated middleware and service provider configurations to use imported class names and constants instead of fully-qualified references.
Component rendering and modal updates
src/Core/Front/Admin/View/Components/..., src/Mod/Trees/View/Modal/Web/Index.php
Updated all admin component render() method return type hints from fully-qualified \Illuminate\Contracts\View\View to imported View alias.
Miscellaneous refactorings
src/Core/Front/Admin/AdminMenuRegistry.php, src/Core/Tests/Feature/AdminComponentsTest.php, src/Core/Tests/Feature/AdminRouteSmokeTest.php, src/Core/Tests/Feature/CoreComponentsTest.php, src/Core/Tests/Feature/DatabaseMigrationTest.php, src/Core/Tests/Feature/EmailShieldTest.php, src/Core/Tests/Feature/ErrorPagesTest.php, src/Core/Tests/Feature/MailConfigurationTest.php, src/Core/Tests/Feature/ModuleScannerIntegrationTest.php, src/Core/Tests/Feature/SecurityHeadersTest.php, src/Core/Webhook/CronTrigger.php
Minor import additions and fully-qualified class reference replacements throughout test utilities and support code; code style normalisation in URL construction.

@Snider
Copy link
Copy Markdown
Contributor Author

Snider commented Apr 27, 2026

@coderabbitai review

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Apr 27, 2026

✅ Actions performed

Review triggered.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

Snider and others added 5 commits April 27, 2026 15:54
…ess pending Service module

PHPStan + Psalm CI both failed at config-load on #2 because
src/Core/Service/Tests doesn't exist. Removed that exclude entry from both
configs.

Knock-on: BunnyStorageService implements Core\Service\Contracts\HealthCheckable
which lives in a not-yet-built Core\Service module. PHPStan flagged it via
non-ignorable interface.notFound, Psalm via MissingDependency. Excluded the
file from PHPStan and added directory-scoped MissingDependency suppression to
Psalm covering src/Core/Cdn until the Service module lands.

Also added Front\Client\Boot to the UndefinedClass suppression list (pending
Front\Client frontage subpackage).

Local verification:
  vendor/bin/phpstan analyse --no-progress    → No errors
  vendor/bin/psalm --no-progress              → No errors found
  composer test                                → 245 tests pass

Tracked under core/lint RFC migration: plans/code/core/lint/RFC.md

Co-Authored-By: Cladius Maximus <claude@anthropic.com>
Adds .github/workflows/lint-corelint.yml as a parity workflow for the
core-lint orchestrator. Runs side-by-side with the existing
static-analysis.yml jobs so PHPStan + Psalm output can be diffed between
the native runners and the core-lint adapters across at least one merge
cycle.

The pilot is non-blocking (continue-on-error: true) — if core-lint fails
the PR is not gated. Native jobs remain authoritative until parity is
confirmed.

Spec: plans/code/core/lint/RFC.md §5.4 (PHP adapter table),
§7.2 (GitHub Actions integration)

Co-Authored-By: Cladius Maximus <claude@anthropic.com>
The Psalm Laravel plugin emits NoEnvOutsideConfig for every env() call
outside config/ — 176 instances in src/Core/config.php alone. PHPStan
already ignores the equivalent identifier
(larastan.noEnvCallsOutsideOfConfig) via phpstan.neon.

Locally Psalm doesn't load the plugin's runtime check (works via the
plugin's bootstrap file at composer install time on Linux runners), so
the failure only surfaces in CI. Suppress at the issue-handler level
matching the existing PHPStan exemption.

Co-Authored-By: Cladius Maximus <claude@anthropic.com>
Bare <NoEnvOutsideConfig> failed Psalm's XML schema validation
("Element ...: This element is not expected."). Plugin-registered
issues need the <PluginIssue name="..."> wrapper.

Confirmed locally: vendor/bin/psalm --no-progress → 0 exit.

Co-Authored-By: Cladius Maximus <claude@anthropic.com>
CI Psalm reports 6 UndefinedClass errors for Illuminate\Foundation\Auth\User
even though laravel/framework provides it. Local Psalm resolves it via
the workspace autoloader; CI runner doesn't. Add to the existing
UndefinedClass suppression list alongside other framework-resolved
classes.

Co-Authored-By: Cladius Maximus <claude@anthropic.com>
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 12

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
src/Core/Cdn/Services/StorageOffload.php (1)

48-57: ⚠️ Potential issue | 🟠 Major

Update StorageOffload to use ConfigService for configuration.

StorageOffload reads configuration via Laravel's config() helper, which relies on .env files. Other CDN services (BunnyCdnService, BunnyStorageService) use ConfigService dependency injection to access DB-backed configuration. For consistency and to follow the established pattern across the CDN module, refactor the constructor to inject ConfigService and read offload settings via $this->config->get() instead.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/Core/Cdn/Services/StorageOffload.php` around lines 48 - 57, The
StorageOffload constructor currently uses the global config() helper; change the
constructor to accept a ConfigService (e.g., add ConfigService $config
parameter, assign $this->config = $config) and replace each
config('offload.xxx') call with $this->config->get('offload.xxx') while
preserving the existing default fallbacks for disk ('hetzner-public'), enabled
(false), keep_local (true), and cache.enabled (false), and still set the
properties disk, enabled, keepLocal, cdnUrl, maxFileSize, allowedExtensions, and
cacheEnabled accordingly.
🧹 Nitpick comments (18)
src/Core/Webhook/CronTrigger.php (1)

46-46: Formatting change looks fine; consider URL-encoding the key.

The compact concatenation style is acceptable. However, $key is appended directly without urlencode(). If the key contains reserved characters (&, =, #, etc.), the URL could be malformed or unintentionally modified.

Additionally, if $endpoint already contains a query string (e.g., /hook?foo=bar), the resulting URL would have two ? characters.

♻️ Suggested improvement for safer URL construction
-                $url = $baseUrl.$endpoint.'?key='.$key;
+                $separator = str_contains($endpoint, '?') ? '&' : '?';
+                $url = $baseUrl.$endpoint.$separator.'key='.urlencode($key);
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/Core/Webhook/CronTrigger.php` at line 46, The current concatenation of
$baseUrl, $endpoint and '?key='.$key in CronTrigger.php can produce malformed
URLs; update the $url construction to URL-encode the key and choose the correct
separator depending on whether $endpoint already contains a query string:
compute a separator = (strpos($endpoint, '?') !== false) ? '&' : '?' and append
separator.'key='.rawurlencode($key) (or urlencode if preferred) when building
$url so $baseUrl, $endpoint, and $key are combined safely.
src/Core/Bouncer/Migrations/CLAUDE.md (1)

1-10: LGTM!

The documentation accurately describes the Bouncer migration's purpose. The early timestamp convention ensures these security-related tables exist before application migrations run.

Minor style note: Consider hyphenating "rate-limiting" when used as a compound adjective (e.g., "rate-limiting configuration"), though this is optional for documentation.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/Core/Bouncer/Migrations/CLAUDE.md` around lines 1 - 10, Update the
documentation in src/Core/Bouncer/Migrations/CLAUDE.md to hyphenate
"rate-limiting" when used as a compound adjective (change "rate limiting
configuration" to "rate-limiting configuration") so the table entry for
`0001_01_01_000001_create_bouncer_tables.php` reads "Creates core bouncer tables
for IP/domain blocklisting, redirect rules, and rate-limiting configuration."
src/Core/Front/Stdio/CLAUDE.md (1)

7-7: Minor grammar nit: consider adding a comma after "Currently".

The sentence would read more clearly as: "Currently, a placeholder with empty command registration..."

This is a minor stylistic suggestion and can be addressed at your discretion.

📝 Suggested fix
-- **Boot.php** -- ServiceProvider for stdin/stdout transport. Handles non-HTTP contexts: Artisan commands, MCP stdio transport (agents connecting via pipes), and interactive CLI tools. Currently a placeholder with empty command registration -- core CLI commands will be registered here. No HTTP middleware -- this is a different transport entirely.
+- **Boot.php** -- ServiceProvider for stdin/stdout transport. Handles non-HTTP contexts: Artisan commands, MCP stdio transport (agents connecting via pipes), and interactive CLI tools. Currently, a placeholder with empty command registration -- core CLI commands will be registered here. No HTTP middleware -- this is a different transport entirely.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/Core/Front/Stdio/CLAUDE.md` at line 7, Update the sentence in CLAUDE.md
that describes Boot.php to insert a comma after "Currently" so it reads
"Currently, a placeholder with empty command registration -- core CLI commands
will be registered here." Locate and edit the line mentioning "Boot.php" and the
clause "Currently a placeholder with empty command registration" and add the
comma to improve readability.
src/Core/Front/Components/View/Blade/file-item/CLAUDE.md (1)

1-7: LGTM with minor text suggestion.

Clear documentation for the file-item subcomponents. Consider adding a comma after "Typically" on line 7 for improved readability:

Typically**,** renders an X icon button...

📝 Optional punctuation fix
-**remove.blade.php** -- Remove/delete button for a file item. Typically renders an X icon button to remove a file from an upload list or file manager.
+**remove.blade.php** -- Remove/delete button for a file item. Typically, renders an X icon button to remove a file from an upload list or file manager.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/Core/Front/Components/View/Blade/file-item/CLAUDE.md` around lines 1 - 7,
Update the CLAUDE.md documentation sentence in the Blade/file-item section by
adding a comma after the word "Typically" so the line reading "Typically renders
an X icon button..." becomes "Typically, renders an X icon button..."; locate
the sentence describing remove.blade.php in CLAUDE.md and insert the comma to
improve readability.
src/Core/Search/Boot.php (1)

14-14: Subtle pattern: importing a potentially non-existent class for aliasing.

The use App\Services\Search\UnifiedSearchService import is safe because PHP use statements and ::class resolution don't trigger autoloading. However, this pattern may be confusing to future maintainers who might expect the imported class to exist.

Consider adding a brief comment explaining the alias purpose:

+// Legacy namespace alias (may not exist yet)
 use App\Services\Search\UnifiedSearchService;

That said, the implementation is functionally correct and the backward-compatibility aliasing works as intended.

Also applies to: 76-77

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/Core/Search/Boot.php` at line 14, The import of
App\Services\Search\UnifiedSearchService is intentionally used for
backward-compatibility aliasing but can confuse readers; update
src/Core/Search/Boot.php by adding a short inline comment next to the `use
App\Services\Search\UnifiedSearchService;` statement (and the similar import
around the area referenced at lines 76-77) explaining that the import is only
for aliasing/compatibility and that PHP `use`/`::class` won't trigger
autoloading—this clarifies intent for future maintainers without changing
behavior.
src/Core/Seo/Analytics/CLAUDE.md (1)

5-7: Consider adding file extension for consistency.

The file reference SeoScoreTrend lacks the .php extension. Other CLAUDE.md files in the codebase (e.g., src/Core/Lang/en_GB/CLAUDE.md) include file extensions in their tables for clarity.

✏️ Suggested fix
 | File | Purpose |
 |------|---------|
-| `SeoScoreTrend` | Tracks SEO scores over time to show improvement or regression trends. Reads from `SeoScoreHistory` model. Provides daily, weekly, and monthly aggregation. |
+| `SeoScoreTrend.php` | Tracks SEO scores over time to show improvement or regression trends. Reads from `SeoScoreHistory` model. Provides daily, weekly, and monthly aggregation. |
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/Core/Seo/Analytics/CLAUDE.md` around lines 5 - 7, Update the CLAUDE.md
table entry for SeoScoreTrend to include the file extension by changing the
reference from `SeoScoreTrend` to `SeoScoreTrend.php`; ensure the description
still references the SeoScoreHistory model and the daily/weekly/monthly
aggregation text remains unchanged so the table matches the project's convention
of including file extensions.
pkg/php/container.go (1)

383-386: Stale module path reference in comment.

The comment on line 384 still references forge.lthn.ai/core/go/pkg/container, which is inconsistent with the module path migration to dappco.re/go/*.

✏️ Suggested fix
 	// Try to load from container package templates
-	// This would integrate with forge.lthn.ai/core/go/pkg/container
+	// This would integrate with dappco.re/go/container
 	return "", cli.Err("template not found: %s", name)
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@pkg/php/container.go` around lines 383 - 386, Update the stale comment that
references the old module path `forge.lthn.ai/core/go/pkg/container` to the new
module path `dappco.re/go/pkg/container` in the function returning cli.Err (the
block that returns "", cli.Err("template not found: %s", name)); locate the
comment immediately above that return and replace the old path string so the
comment accurately reflects the migrated module location.
src/Core/Bouncer/Gate/CLAUDE.md (1)

16-18: Add language identifier to fenced code block.

The integration flow diagram should specify a language identifier for consistency with markdown best practices. Since this is a text diagram, use text or plaintext.

📝 Suggested fix
-```
+```text
 Request -> ActionGateMiddleware -> ActionGateService::check() -> ActionPermission (allowed/denied) -> Controller
</details>

<details>
<summary>🤖 Prompt for AI Agents</summary>

Verify each finding against the current code and only fix it if needed.

In @src/Core/Bouncer/Gate/CLAUDE.md around lines 16 - 18, The fenced code block
showing the integration flow lacks a language identifier; update the block to
include a language tag (e.g., use "text" or "plaintext") so Markdown renders it
consistently—locate the flow line containing "Request -> ActionGateMiddleware ->
ActionGateService::check() -> ActionPermission (allowed/denied) -> Controller"
and change the opening fence from totext (or ```plaintext).


</details>

</blockquote></details>
<details>
<summary>src/Core/Activity/Concerns/LogsActivity.php (1)</summary><blockquote>

`50-52`: **Redundant `logOnlyDirty()` call.**

`logOnlyDirty()` is called conditionally on line 51, then unconditionally again on line 70, which overrides any intention behind the conditional check.

<details>
<summary>♻️ Suggested fix</summary>

```diff
     // Configure which events to log
     $events = $this->getActivityLogEvents();
-    $options->logOnlyDirty();

     // Set custom description generator
```
</details>




Also applies to: 70-70

<details>
<summary>🤖 Prompt for AI Agents</summary>

```
Verify each finding against the current code and only fix it if needed.

In `@src/Core/Activity/Concerns/LogsActivity.php` around lines 50 - 52, The code
in LogsActivity.php redundantly calls $options->logOnlyDirty(): once guarded by
shouldLogOnlyDirty() and again unconditionally later, which nullifies the
conditional; remove the unconditional call (the second $options->logOnlyDirty())
or change it to be executed only when shouldLogOnlyDirty() returns true so that
shouldLogOnlyDirty() controls whether logOnlyDirty() is applied; search for the
$options->logOnlyDirty() usage in the LogsActivity trait/class to update the
redundant invocation.
```

</details>

</blockquote></details>
<details>
<summary>src/Core/Cdn/Boot.php (1)</summary><blockquote>

`14-17`: **Disambiguate legacy aliases to reduce namespace shadowing.**  
This works, but importing legacy `App\...` classes as short names (`Cdn`, `HasCdnUrls`, etc.) makes the `class_alias` source/target direction harder to parse at a glance.

<details>
<summary>♻️ Optional readability refactor</summary>

```diff
-use App\Facades\Cdn;
+use App\Facades\Cdn as LegacyCdnFacade;
...
-        if (! class_exists(Cdn::class)) {
-            class_alias(Facades\Cdn::class, Cdn::class);
+        if (! class_exists(LegacyCdnFacade::class)) {
+            class_alias(Facades\Cdn::class, LegacyCdnFacade::class);
         }
```
</details>




Also applies to: 134-150

<details>
<summary>🤖 Prompt for AI Agents</summary>

```
Verify each finding against the current code and only fix it if needed.

In `@src/Core/Cdn/Boot.php` around lines 14 - 17, Imports like Cdn and HasCdnUrls
shadow legacy class names and make class_alias usage hard to read; change the
use statements to explicit aliased names (e.g., import App\Facades\Cdn as
LegacyCdnFacade or similar, and App\Traits\HasCdnUrls as LegacyHasCdnUrls) and
update any class_alias calls (and references in Boot::boot or wherever
class_alias is used) to use these aliased identifiers so the source/target
direction is unambiguous; apply the same renaming pattern to the other affected
imports/aliases around the later block that currently contains similar App\...
imports (the block around the existing RewriteOffloadedUrls, PushAssetToCdn, and
the 134-150 region).
```

</details>

</blockquote></details>
<details>
<summary>src/Core/Lang/Console/Commands/CLAUDE.md (1)</summary><blockquote>

`1-11`: **Documentation looks good overall.**

The table clearly documents the two translation CLI commands and their purposes. One minor wording suggestion: "CLI interface" on line 8 is slightly redundant since CLI already means "Command Line Interface". Consider simplifying to just "CLI" or "command-line interface".


<details>
<summary>📝 Suggested wording fix</summary>

```diff
-| `TranslationMemoryCommand` | CLI interface for managing translation memory — view statistics, browse entries, import/export TMX files, fuzzy match queries. |
+| `TranslationMemoryCommand` | CLI for managing translation memory — view statistics, browse entries, import/export TMX files, fuzzy match queries. |
```
</details>

<details>
<summary>🤖 Prompt for AI Agents</summary>

```
Verify each finding against the current code and only fix it if needed.

In `@src/Core/Lang/Console/Commands/CLAUDE.md` around lines 1 - 11, Update the
wording for the TranslationMemoryCommand description to remove the redundant
phrase "CLI interface": edit the README entry for TranslationMemoryCommand in
CLAUDE.md and replace "CLI interface for managing translation memory — view
statistics, browse entries, import/export TMX files, fuzzy match queries." with
a concise alternative such as "CLI for managing translation memory — view
statistics, browse entries, import/export TMX files, fuzzy match queries." (or
"command-line interface" if you prefer); ensure the rest of the sentence and
punctuation remain unchanged.
```

</details>

</blockquote></details>
<details>
<summary>src/Core/Storage/CLAUDE.md (1)</summary><blockquote>

`27-33`: **Add a language specifier to the fenced code block.**

The ASCII diagram code block lacks a language identifier. Use `text` or `plaintext` to satisfy markdown linting while preserving the diagram format.



<details>
<summary>Suggested fix</summary>

```diff
-```
+```text
 get("key")
   |
   v
 [Memory/Array] -- miss --> [Redis] -- miss --> [Database]
      60s TTL                 1h TTL              24h TTL
 ```
```
</details>

<details>
<summary>🤖 Prompt for AI Agents</summary>

Verify each finding against the current code and only fix it if needed.

In @src/Core/Storage/CLAUDE.md around lines 27 - 33, The fenced ASCII diagram
block starting with get("key") should include a language specifier (e.g., text
or plaintext) to satisfy markdown linting; update the triple-backtick fence that
wraps the diagram (the block containing get("key") and the [Memory/Array] --
miss --> [Redis] -- miss --> [Database] lines) to start with ```text so the
diagram remains unchanged but the linter recognizes the block.


</details>

</blockquote></details>
<details>
<summary>src/Core/Events/CLAUDE.md (1)</summary><blockquote>

`9-9`: **Minor grammar improvement.**

Consider rephrasing for clarity: "listened events" reads awkwardly.



<details>
<summary>Suggested fix</summary>

```diff
-This is the **core of the module loading architecture**. Modules are never instantiated until their listened events fire.
+This is the **core of the module loading architecture**. Modules are never instantiated until their subscribed events fire.
```
</details>

<details>
<summary>🤖 Prompt for AI Agents</summary>

```
Verify each finding against the current code and only fix it if needed.

In `@src/Core/Events/CLAUDE.md` at line 9, The sentence "Modules are never
instantiated until their listened events fire." is awkward; update the wording
in src/Core/Events/CLAUDE.md to a clearer phrasing such as "Modules are never
instantiated until the events they listen for fire" or "Modules are only
instantiated when the events they listen for are emitted" by replacing that
exact sentence to improve readability.
```

</details>

</blockquote></details>
<details>
<summary>src/Mod/CLAUDE.md (1)</summary><blockquote>

`13-31`: **Add language specifier to fenced code block.**

The directory structure code block lacks a language identifier. Adding `text` or `plaintext` improves rendering consistency.

<details>
<summary>📝 Suggested fix</summary>

```diff
-```
+```text
 Mod/
   {ModuleName}/
```
</details>

<details>
<summary>🤖 Prompt for AI Agents</summary>

Verify each finding against the current code and only fix it if needed.

In @src/Mod/CLAUDE.md around lines 13 - 31, The fenced code block in CLAUDE.md
that shows the module directory structure lacks a language specifier; update the
block delimiter from to a language-tagged fence (e.g.,text or

block in src/Mod/CLAUDE.md and change the opening fence to include the language
specifier for the snippet.
src/Core/Webhook/CLAUDE.md (1)

18-29: Add language specifier to fenced code block.

The request flow diagram lacks a language identifier. Adding text or plaintext improves rendering.

📝 Suggested fix
-```
+```text
 POST /api/webhooks/{source}
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/Core/Webhook/CLAUDE.md` around lines 18 - 29, The fenced code block in
src/Core/Webhook/CLAUDE.md lacks a language specifier which can impair
rendering; update the markdown block that documents the POST
/api/webhooks/{source} flow (the block showing WebhookController::handle(),
app("webhook.verifier.{$source}"), config("webhook.secrets.{$source}"),
WebhookCall record creation, and dispatch of WebhookReceived) by adding a
language tag such as text or plaintext after the opening backticks (e.g.,
replace ``` with ```text) so the diagram renders correctly.
src/Mod/Trees/CLAUDE.md (1)

30-38: Consider adding a language specifier to the planting flow diagram.

The fenced code block showing the planting flow lacks a language specifier, which triggers a markdownlint warning.

📝 Suggested fix
 ## Planting Flow
 
-```
+```text
 Agent referral visit (/ref/{provider}/{model})
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/Mod/Trees/CLAUDE.md` around lines 30 - 38, The fenced code block
containing the planting flow diagram (starting with "Agent referral visit
(/ref/{provider}/{model})") is missing a language specifier and triggers
markdownlint; update that fenced block to include a language tag (e.g., text)
after the opening backticks so the block becomes ```text ... ``` to silence the
lint warning and preserve formatting.
src/Core/CLAUDE.md (1)

47-59: Consider adding a language specifier to the lifecycle events table header.

The fenced code block section header at line 47 lacks a language specifier, which triggers a markdownlint warning. While this is minor, adding a language hint improves rendering in some Markdown viewers.

📝 Suggested fix
-## Lifecycle Events (fire* methods)
+## Lifecycle Events (`fire*` methods)

Alternatively, this is acceptable as-is since the content is a table, not code.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/Core/CLAUDE.md` around lines 47 - 59, Add a language specifier to the
fenced code block that contains the "## Lifecycle Events (fire* methods)" table
so markdownlint stops warning; locate the fenced block around that table (the
section headed "Lifecycle Events (fire* methods)") and change the opening fence
from ``` to a language-tagged fence such as ```markdown or ```md (or another
appropriate language like ```text) so the table's code block has an explicit
language.
src/Core/Media/CLAUDE.md (1)

7-7: Add a language identifier to the fenced code block.

The directory structure code block is missing a language identifier. Consider using text or plaintext to satisfy markdown linters.

-```
+```text
 Media/
   Abstracts/          MediaConversion base class, Image abstract
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@src/Core/Media/CLAUDE.md` at line 7, Update the fenced code block in
src/Core/Media/CLAUDE.md that contains the directory listing starting with
"Media/" and "Abstracts/" so the opening backticks include a language identifier
(e.g., change "```" to "```text" or "```plaintext") to satisfy markdown linters;
ensure the rest of the block remains unchanged.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@cmd/core-php/main.go`:
- Around line 6-8: The import "dappco.re/go/cli/pkg/cli" was added but go.sum
lacks the module checksums; run the Go module tooling to regenerate checksums
(e.g., run go mod download or go build in the module root) so go.sum is updated
with entries for dappco.re/go/cli (v0.8.0-alpha.1), then stage and commit the
updated go.sum file.

In `@composer.json`:
- Line 21: Update the CI and local test matrix to include Laravel 13 and run the
full test suite against it, focusing on areas likely affected by major-version
changes (bootstrapping, middleware, service providers, and any framework-facing
APIs); if failures appear, modify the affected symbols or files (e.g., service
provider registration, middleware signatures, calls interacting with the
Illuminate container, or any usages tied to "laravel/framework":
"^11.0|^12.0|^13.0") to restore compatibility, add targeted unit/integration
tests for the breaking behaviors, and only merge the ^13.0 composer constraint
once all CI jobs and manual verification pass.

In `@go.mod`:
- Around line 14-27: Remove the duplicate module entries in the require block:
delete the second occurrences of dappco.re/go/i18n v0.8.0-alpha.1 and
dappco.re/go/io v0.8.0-alpha.1 so each module only appears once in go.mod; after
deduping, run go mod tidy to refresh dependencies and address the reported
404/unrecognised import-path errors (resolve or replace the failing dappco.re
module paths or update their versions as needed).

In `@psalm.xml`:
- Around line 77-82: Narrow the MissingDependency suppression: replace the broad
<MissingDependency> entry that targets the entire src/Core/Cdn directory with a
suppression scoped only to the specific file that legitimately depends on
Core\Service — the BunnyStorageService class/file (where HealthCheckable and
HealthCheckResult are imported). Update the <directory name="src/Core/Cdn" />
element to a <file name=".../BunnyStorageService.php" /> (or equivalent
file-scoped element) so only BunnyStorageService.php is suppressed for
MissingDependency, leaving other files in the CDN module uncovered by this
suppression.
- Around line 22-29: Replace the broad PluginIssue suppression for
NoEnvOutsideConfig that currently targets the entire src directory with
file-level suppressions only for the known offenders: add <file
name="src/Core/Bouncer/BouncerMiddleware.php" /> and a <directory
name="src/Core/Tests/Feature" /> (or individual <file> entries for each test
file) under the PluginIssue block so Psalm only ignores env() calls in those
locations; include a comment or attribute linking each suppression to a tracking
ticket (e.g., TICKET-1234) that will remediate or justify the usage and ensure
the PluginIssue tag still references name="NoEnvOutsideConfig".

In `@src/Core/Console/CLAUDE.md`:
- Around line 24-25: Update the documentation table to use the actual Artisan
command signatures instead of descriptions: replace the Signature cell for
PruneEmailShieldStatsCommand with "emailshield:prune" and for
ScheduleSyncCommand with "core:schedule-sync"; ensure the rows referencing
PruneEmailShieldStatsCommand and ScheduleSyncCommand in CLAUDE.md reflect these
exact signatures so they match the command class names.

In `@src/Core/Front/Admin/Blade/layouts/CLAUDE.md`:
- Line 10: Update the inaccurate sidebar width note in the CLAUDE.md layout:
replace the sentence "Responsive: sidebar hidden on mobile, 20px collapsed /
64px expanded on desktop." with the correct Tailwind spacing or pixel values
that match the classes used (ml-20 → 5rem / 80px and ml-64 → 16rem / 256px),
e.g., state "Responsive: sidebar hidden on mobile, 80px collapsed / 256px
expanded (ml-20 / ml-64)" so the doc matches the actual classes.

In `@src/Core/Front/Admin/Contracts/CLAUDE.md`:
- Line 13: Update the documented menu-group allowlist in CLAUDE.md to include
the missing `agents` group so implementations have the correct enum of groups;
change the pipe-separated list (`dashboard | workspaces | services | settings |
admin`) to include `agents` (e.g., `dashboard | agents | workspaces | services |
settings | admin`) so the documented allowlist matches the required groups used
by the provider implementations.

In `@src/Core/Front/Components/View/Blade/command/CLAUDE.md`:
- Line 3: Replace the nonstandard spelling "sub-components" with "subcomponents"
in the Markdown heading/text that currently reads "Command palette (Cmd+K)
sub-components." (the CLAUDE.md command palette line) so the file uses the
standard single-word form; simply edit that sentence to "Command palette (Cmd+K)
subcomponents."

In `@src/Core/Front/Services/CLAUDE.md`:
- Line 15: The example calls isStrictContentPlatform($ua) with an undefined $ua;
assign the request User-Agent into $ua before that call (e.g. extract via the
incoming request header or $_SERVER['HTTP_USER_AGENT']) so the variable is
defined, then pass $ua to isStrictContentPlatform; place the assignment
immediately above the if to ensure $ua is available for subsequent checks and
any logging or branching that uses it.

In `@src/Core/Helpers/Rules/CLAUDE.md`:
- Around line 9-13: The usage snippet for HexRule is currently merged into one
invalid PHP line; update the documentation so the two examples are separate
valid PHP array entries: show one entry for 'colour' using new HexRule() and a
second entry for 'colour' using new HexRule(forceFull: true), each terminated
properly and optionally add brief comments describing that HexRule() accepts
`#rgb` and `#rrggbb` while HexRule(forceFull: true) requires full `#rrggbb`; reference
the HexRule class name in the doc so readers can locate the rule.

In `@src/Core/Seo/CLAUDE.md`:
- Line 19: The table entry uses the incorrect service name
ServiceOgImageService; change it to OgImageService and ensure consistency by
renaming the symbol ServiceOgImageService to OgImageService everywhere it
appears (class/file names, exports, imports, and tests), update any references
(constructor injections, type annotations, and DI mappings) to use
OgImageService, and run the build/tests to catch remaining broken imports.

---

Outside diff comments:
In `@src/Core/Cdn/Services/StorageOffload.php`:
- Around line 48-57: The StorageOffload constructor currently uses the global
config() helper; change the constructor to accept a ConfigService (e.g., add
ConfigService $config parameter, assign $this->config = $config) and replace
each config('offload.xxx') call with $this->config->get('offload.xxx') while
preserving the existing default fallbacks for disk ('hetzner-public'), enabled
(false), keep_local (true), and cache.enabled (false), and still set the
properties disk, enabled, keepLocal, cdnUrl, maxFileSize, allowedExtensions, and
cacheEnabled accordingly.

---

Nitpick comments:
In `@pkg/php/container.go`:
- Around line 383-386: Update the stale comment that references the old module
path `forge.lthn.ai/core/go/pkg/container` to the new module path
`dappco.re/go/pkg/container` in the function returning cli.Err (the block that
returns "", cli.Err("template not found: %s", name)); locate the comment
immediately above that return and replace the old path string so the comment
accurately reflects the migrated module location.

In `@src/Core/Activity/Concerns/LogsActivity.php`:
- Around line 50-52: The code in LogsActivity.php redundantly calls
$options->logOnlyDirty(): once guarded by shouldLogOnlyDirty() and again
unconditionally later, which nullifies the conditional; remove the unconditional
call (the second $options->logOnlyDirty()) or change it to be executed only when
shouldLogOnlyDirty() returns true so that shouldLogOnlyDirty() controls whether
logOnlyDirty() is applied; search for the $options->logOnlyDirty() usage in the
LogsActivity trait/class to update the redundant invocation.

In `@src/Core/Bouncer/Gate/CLAUDE.md`:
- Around line 16-18: The fenced code block showing the integration flow lacks a
language identifier; update the block to include a language tag (e.g., use
"text" or "plaintext") so Markdown renders it consistently—locate the flow line
containing "Request -> ActionGateMiddleware -> ActionGateService::check() ->
ActionPermission (allowed/denied) -> Controller" and change the opening fence
from ``` to ```text (or ```plaintext).

In `@src/Core/Bouncer/Migrations/CLAUDE.md`:
- Around line 1-10: Update the documentation in
src/Core/Bouncer/Migrations/CLAUDE.md to hyphenate "rate-limiting" when used as
a compound adjective (change "rate limiting configuration" to "rate-limiting
configuration") so the table entry for
`0001_01_01_000001_create_bouncer_tables.php` reads "Creates core bouncer tables
for IP/domain blocklisting, redirect rules, and rate-limiting configuration."

In `@src/Core/Cdn/Boot.php`:
- Around line 14-17: Imports like Cdn and HasCdnUrls shadow legacy class names
and make class_alias usage hard to read; change the use statements to explicit
aliased names (e.g., import App\Facades\Cdn as LegacyCdnFacade or similar, and
App\Traits\HasCdnUrls as LegacyHasCdnUrls) and update any class_alias calls (and
references in Boot::boot or wherever class_alias is used) to use these aliased
identifiers so the source/target direction is unambiguous; apply the same
renaming pattern to the other affected imports/aliases around the later block
that currently contains similar App\... imports (the block around the existing
RewriteOffloadedUrls, PushAssetToCdn, and the 134-150 region).

In `@src/Core/CLAUDE.md`:
- Around line 47-59: Add a language specifier to the fenced code block that
contains the "## Lifecycle Events (fire* methods)" table so markdownlint stops
warning; locate the fenced block around that table (the section headed
"Lifecycle Events (fire* methods)") and change the opening fence from ``` to a
language-tagged fence such as ```markdown or ```md (or another appropriate
language like ```text) so the table's code block has an explicit language.

In `@src/Core/Events/CLAUDE.md`:
- Line 9: The sentence "Modules are never instantiated until their listened
events fire." is awkward; update the wording in src/Core/Events/CLAUDE.md to a
clearer phrasing such as "Modules are never instantiated until the events they
listen for fire" or "Modules are only instantiated when the events they listen
for are emitted" by replacing that exact sentence to improve readability.

In `@src/Core/Front/Components/View/Blade/file-item/CLAUDE.md`:
- Around line 1-7: Update the CLAUDE.md documentation sentence in the
Blade/file-item section by adding a comma after the word "Typically" so the line
reading "Typically renders an X icon button..." becomes "Typically, renders an X
icon button..."; locate the sentence describing remove.blade.php in CLAUDE.md
and insert the comma to improve readability.

In `@src/Core/Front/Stdio/CLAUDE.md`:
- Line 7: Update the sentence in CLAUDE.md that describes Boot.php to insert a
comma after "Currently" so it reads "Currently, a placeholder with empty command
registration -- core CLI commands will be registered here." Locate and edit the
line mentioning "Boot.php" and the clause "Currently a placeholder with empty
command registration" and add the comma to improve readability.

In `@src/Core/Lang/Console/Commands/CLAUDE.md`:
- Around line 1-11: Update the wording for the TranslationMemoryCommand
description to remove the redundant phrase "CLI interface": edit the README
entry for TranslationMemoryCommand in CLAUDE.md and replace "CLI interface for
managing translation memory — view statistics, browse entries, import/export TMX
files, fuzzy match queries." with a concise alternative such as "CLI for
managing translation memory — view statistics, browse entries, import/export TMX
files, fuzzy match queries." (or "command-line interface" if you prefer); ensure
the rest of the sentence and punctuation remain unchanged.

In `@src/Core/Media/CLAUDE.md`:
- Line 7: Update the fenced code block in src/Core/Media/CLAUDE.md that contains
the directory listing starting with "Media/" and "Abstracts/" so the opening
backticks include a language identifier (e.g., change "```" to "```text" or
"```plaintext") to satisfy markdown linters; ensure the rest of the block
remains unchanged.

In `@src/Core/Search/Boot.php`:
- Line 14: The import of App\Services\Search\UnifiedSearchService is
intentionally used for backward-compatibility aliasing but can confuse readers;
update src/Core/Search/Boot.php by adding a short inline comment next to the
`use App\Services\Search\UnifiedSearchService;` statement (and the similar
import around the area referenced at lines 76-77) explaining that the import is
only for aliasing/compatibility and that PHP `use`/`::class` won't trigger
autoloading—this clarifies intent for future maintainers without changing
behavior.

In `@src/Core/Seo/Analytics/CLAUDE.md`:
- Around line 5-7: Update the CLAUDE.md table entry for SeoScoreTrend to include
the file extension by changing the reference from `SeoScoreTrend` to
`SeoScoreTrend.php`; ensure the description still references the SeoScoreHistory
model and the daily/weekly/monthly aggregation text remains unchanged so the
table matches the project's convention of including file extensions.

In `@src/Core/Storage/CLAUDE.md`:
- Around line 27-33: The fenced ASCII diagram block starting with get("key")
should include a language specifier (e.g., text or plaintext) to satisfy
markdown linting; update the triple-backtick fence that wraps the diagram (the
block containing get("key") and the [Memory/Array] -- miss --> [Redis] -- miss
--> [Database] lines) to start with ```text so the diagram remains unchanged but
the linter recognizes the block.

In `@src/Core/Webhook/CLAUDE.md`:
- Around line 18-29: The fenced code block in src/Core/Webhook/CLAUDE.md lacks a
language specifier which can impair rendering; update the markdown block that
documents the POST /api/webhooks/{source} flow (the block showing
WebhookController::handle(), app("webhook.verifier.{$source}"),
config("webhook.secrets.{$source}"), WebhookCall record creation, and dispatch
of WebhookReceived) by adding a language tag such as text or plaintext after the
opening backticks (e.g., replace ``` with ```text) so the diagram renders
correctly.

In `@src/Core/Webhook/CronTrigger.php`:
- Line 46: The current concatenation of $baseUrl, $endpoint and '?key='.$key in
CronTrigger.php can produce malformed URLs; update the $url construction to
URL-encode the key and choose the correct separator depending on whether
$endpoint already contains a query string: compute a separator =
(strpos($endpoint, '?') !== false) ? '&' : '?' and append
separator.'key='.rawurlencode($key) (or urlencode if preferred) when building
$url so $baseUrl, $endpoint, and $key are combined safely.

In `@src/Mod/CLAUDE.md`:
- Around line 13-31: The fenced code block in CLAUDE.md that shows the module
directory structure lacks a language specifier; update the block delimiter from
``` to a language-tagged fence (e.g., ```text or ```plaintext) so the snippet
renders consistently—locate the directory tree block in src/Mod/CLAUDE.md and
change the opening fence to include the language specifier for the snippet.

In `@src/Mod/Trees/CLAUDE.md`:
- Around line 30-38: The fenced code block containing the planting flow diagram
(starting with "Agent referral visit (/ref/{provider}/{model})") is missing a
language specifier and triggers markdownlint; update that fenced block to
include a language tag (e.g., text) after the opening backticks so the block
becomes ```text ... ``` to silence the lint warning and preserve formatting.
🪄 Autofix (Beta)

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: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 6d540af1-90d3-43d4-b8f8-753e061f3dbe

📥 Commits

Reviewing files that changed from the base of the PR and between be304e7 and 342e8ca.

📒 Files selected for processing (300)
  • .github/workflows/lint-corelint.yml
  • CLAUDE.md
  • cmd/core-php/main.go
  • composer.json
  • config/core.php
  • go.mod
  • phpstan.neon
  • pkg/php/cmd.go
  • pkg/php/cmd_build.go
  • pkg/php/cmd_ci.go
  • pkg/php/cmd_commands.go
  • pkg/php/cmd_deploy.go
  • pkg/php/cmd_dev.go
  • pkg/php/cmd_packages.go
  • pkg/php/cmd_serve_frankenphp.go
  • pkg/php/container.go
  • pkg/php/coolify.go
  • pkg/php/deploy.go
  • pkg/php/dockerfile.go
  • pkg/php/i18n.go
  • pkg/php/packages.go
  • pkg/php/php.go
  • pkg/php/quality.go
  • pkg/php/services.go
  • pkg/php/ssl.go
  • pkg/php/testing.go
  • pkg/php/workspace.go
  • psalm.xml
  • src/Core/Actions/CLAUDE.md
  • src/Core/Actions/ScheduleServiceProvider.php
  • src/Core/Actions/ScheduledAction.php
  • src/Core/Actions/ScheduledActionScanner.php
  • src/Core/Activity/CLAUDE.md
  • src/Core/Activity/Concerns/CLAUDE.md
  • src/Core/Activity/Concerns/LogsActivity.php
  • src/Core/Activity/Console/ActivityPruneCommand.php
  • src/Core/Activity/Console/CLAUDE.md
  • src/Core/Activity/Models/Activity.php
  • src/Core/Activity/Models/CLAUDE.md
  • src/Core/Activity/Scopes/CLAUDE.md
  • src/Core/Activity/Services/CLAUDE.md
  • src/Core/Activity/View/Blade/admin/CLAUDE.md
  • src/Core/Activity/View/Modal/Admin/ActivityFeed.php
  • src/Core/Activity/View/Modal/Admin/CLAUDE.md
  • src/Core/Boot.php
  • src/Core/Bouncer/CLAUDE.md
  • src/Core/Bouncer/Database/Seeders/CLAUDE.md
  • src/Core/Bouncer/Gate/Attributes/CLAUDE.md
  • src/Core/Bouncer/Gate/CLAUDE.md
  • src/Core/Bouncer/Gate/Migrations/CLAUDE.md
  • src/Core/Bouncer/Gate/Models/ActionPermission.php
  • src/Core/Bouncer/Gate/Models/ActionRequest.php
  • src/Core/Bouncer/Gate/Models/CLAUDE.md
  • src/Core/Bouncer/Gate/Tests/Feature/ActionGateTest.php
  • src/Core/Bouncer/Gate/Tests/Feature/CLAUDE.md
  • src/Core/Bouncer/Gate/Tests/Unit/CLAUDE.md
  • src/Core/Bouncer/Migrations/CLAUDE.md
  • src/Core/Bouncer/Tests/Unit/CLAUDE.md
  • src/Core/CLAUDE.md
  • src/Core/Cdn/Boot.php
  • src/Core/Cdn/CLAUDE.md
  • src/Core/Cdn/Console/CLAUDE.md
  • src/Core/Cdn/Console/CdnPurge.php
  • src/Core/Cdn/Console/PushAssetsToCdn.php
  • src/Core/Cdn/Facades/CLAUDE.md
  • src/Core/Cdn/Facades/Cdn.php
  • src/Core/Cdn/Jobs/CLAUDE.md
  • src/Core/Cdn/Jobs/PushAssetToCdn.php
  • src/Core/Cdn/Middleware/CLAUDE.md
  • src/Core/Cdn/Models/CLAUDE.md
  • src/Core/Cdn/Models/StorageOffload.php
  • src/Core/Cdn/Services/AssetPipeline.php
  • src/Core/Cdn/Services/CLAUDE.md
  • src/Core/Cdn/Services/FluxCdnService.php
  • src/Core/Cdn/Services/StorageOffload.php
  • src/Core/Cdn/Services/StorageUrlResolver.php
  • src/Core/Cdn/Traits/CLAUDE.md
  • src/Core/Config/CLAUDE.md
  • src/Core/Config/Console/CLAUDE.md
  • src/Core/Config/Console/ConfigExportCommand.php
  • src/Core/Config/Console/ConfigImportCommand.php
  • src/Core/Config/Console/ConfigListCommand.php
  • src/Core/Config/Console/ConfigPrimeCommand.php
  • src/Core/Config/Console/ConfigVersionCommand.php
  • src/Core/Config/Contracts/CLAUDE.md
  • src/Core/Config/Contracts/ConfigProvider.php
  • src/Core/Config/Database/Seeders/CLAUDE.md
  • src/Core/Config/Enums/CLAUDE.md
  • src/Core/Config/Events/CLAUDE.md
  • src/Core/Config/Migrations/CLAUDE.md
  • src/Core/Config/Models/CLAUDE.md
  • src/Core/Config/Models/Channel.php
  • src/Core/Config/Models/ConfigKey.php
  • src/Core/Config/Models/ConfigProfile.php
  • src/Core/Config/Models/ConfigResolved.php
  • src/Core/Config/Models/ConfigValue.php
  • src/Core/Config/Models/ConfigVersion.php
  • src/Core/Config/Routes/CLAUDE.md
  • src/Core/Config/Tests/Feature/CLAUDE.md
  • src/Core/Config/Tests/Feature/ConfigServiceTest.php
  • src/Core/Config/View/Blade/admin/CLAUDE.md
  • src/Core/Config/View/Modal/Admin/CLAUDE.md
  • src/Core/Config/View/Modal/Admin/ConfigPanel.php
  • src/Core/Config/View/Modal/Admin/WorkspaceConfig.php
  • src/Core/Console/CLAUDE.md
  • src/Core/Console/Commands/CLAUDE.md
  • src/Core/Console/Commands/InstallCommand.php
  • src/Core/Console/Commands/MakeModCommand.php
  • src/Core/Console/Commands/MakePlugCommand.php
  • src/Core/Console/Commands/MakeWebsiteCommand.php
  • src/Core/Console/Commands/NewProjectCommand.php
  • src/Core/Console/Commands/PruneEmailShieldStatsCommand.php
  • src/Core/Crypt/CLAUDE.md
  • src/Core/Crypt/EncryptArrayObject.php
  • src/Core/Database/Seeders/Attributes/CLAUDE.md
  • src/Core/Database/Seeders/CLAUDE.md
  • src/Core/Database/Seeders/Exceptions/CLAUDE.md
  • src/Core/Events/CLAUDE.md
  • src/Core/Events/Concerns/CLAUDE.md
  • src/Core/Front/Admin/AdminMenuRegistry.php
  • src/Core/Front/Admin/Blade/components/CLAUDE.md
  • src/Core/Front/Admin/Blade/components/tabs/CLAUDE.md
  • src/Core/Front/Admin/Blade/layouts/CLAUDE.md
  • src/Core/Front/Admin/Boot.php
  • src/Core/Front/Admin/CLAUDE.md
  • src/Core/Front/Admin/Concerns/CLAUDE.md
  • src/Core/Front/Admin/Contracts/CLAUDE.md
  • src/Core/Front/Admin/Support/CLAUDE.md
  • src/Core/Front/Admin/Validation/CLAUDE.md
  • src/Core/Front/Admin/View/Components/ActivityFeed.php
  • src/Core/Front/Admin/View/Components/ActivityLog.php
  • src/Core/Front/Admin/View/Components/Alert.php
  • src/Core/Front/Admin/View/Components/CLAUDE.md
  • src/Core/Front/Admin/View/Components/CardGrid.php
  • src/Core/Front/Admin/View/Components/ClearFilters.php
  • src/Core/Front/Admin/View/Components/DataTable.php
  • src/Core/Front/Admin/View/Components/EditableTable.php
  • src/Core/Front/Admin/View/Components/Filter.php
  • src/Core/Front/Admin/View/Components/FilterBar.php
  • src/Core/Front/Admin/View/Components/LinkGrid.php
  • src/Core/Front/Admin/View/Components/ManagerTable.php
  • src/Core/Front/Admin/View/Components/Metrics.php
  • src/Core/Front/Admin/View/Components/ProgressList.php
  • src/Core/Front/Admin/View/Components/Search.php
  • src/Core/Front/Admin/View/Components/ServiceCard.php
  • src/Core/Front/Admin/View/Components/Sidemenu.php
  • src/Core/Front/Admin/View/Components/Stats.php
  • src/Core/Front/Admin/View/Components/StatusCards.php
  • src/Core/Front/Boot.php
  • src/Core/Front/CLAUDE.md
  • src/Core/Front/Cli/Boot.php
  • src/Core/Front/Cli/CLAUDE.md
  • src/Core/Front/Components/CLAUDE.md
  • src/Core/Front/Components/Layout.php
  • src/Core/Front/Components/View/Blade/CLAUDE.md
  • src/Core/Front/Components/View/Blade/accordion/CLAUDE.md
  • src/Core/Front/Components/View/Blade/autocomplete/CLAUDE.md
  • src/Core/Front/Components/View/Blade/button/CLAUDE.md
  • src/Core/Front/Components/View/Blade/callout/CLAUDE.md
  • src/Core/Front/Components/View/Blade/chart/CLAUDE.md
  • src/Core/Front/Components/View/Blade/chart/axis/CLAUDE.md
  • src/Core/Front/Components/View/Blade/chart/tooltip/CLAUDE.md
  • src/Core/Front/Components/View/Blade/checkbox/CLAUDE.md
  • src/Core/Front/Components/View/Blade/command/CLAUDE.md
  • src/Core/Front/Components/View/Blade/components/satellite/CLAUDE.md
  • src/Core/Front/Components/View/Blade/date-picker/CLAUDE.md
  • src/Core/Front/Components/View/Blade/editor/CLAUDE.md
  • src/Core/Front/Components/View/Blade/errors/CLAUDE.md
  • src/Core/Front/Components/View/Blade/examples/CLAUDE.md
  • src/Core/Front/Components/View/Blade/file-item/CLAUDE.md
  • src/Core/Front/Components/View/Blade/file-upload/CLAUDE.md
  • src/Core/Front/Components/View/Blade/forms/CLAUDE.md
  • src/Core/Front/Components/View/Blade/icon/CLAUDE.md
  • src/Core/Front/Components/View/Blade/input/CLAUDE.md
  • src/Core/Front/Components/View/Blade/input/group/CLAUDE.md
  • src/Core/Front/Components/View/Blade/kanban/CLAUDE.md
  • src/Core/Front/Components/View/Blade/kanban/column/CLAUDE.md
  • src/Core/Front/Components/View/Blade/layout/CLAUDE.md
  • src/Core/Front/Components/View/Blade/layouts/CLAUDE.md
  • src/Core/Front/Components/View/Blade/layouts/partials/CLAUDE.md
  • src/Core/Front/Components/View/Blade/menu/CLAUDE.md
  • src/Core/Front/Components/View/Blade/navbar/CLAUDE.md
  • src/Core/Front/Components/View/Blade/navlist/CLAUDE.md
  • src/Core/Front/Components/View/Blade/pillbox/CLAUDE.md
  • src/Core/Front/Components/View/Blade/radio/CLAUDE.md
  • src/Core/Front/Components/View/Blade/select/CLAUDE.md
  • src/Core/Front/Components/View/Blade/slider/CLAUDE.md
  • src/Core/Front/Components/View/Blade/tab/CLAUDE.md
  • src/Core/Front/Components/View/Blade/table/CLAUDE.md
  • src/Core/Front/Components/View/Blade/web/CLAUDE.md
  • src/Core/Front/Services/CLAUDE.md
  • src/Core/Front/Stdio/CLAUDE.md
  • src/Core/Front/Tests/Unit/CLAUDE.md
  • src/Core/Front/Web/Blade/components/CLAUDE.md
  • src/Core/Front/Web/Blade/layouts/CLAUDE.md
  • src/Core/Front/Web/Boot.php
  • src/Core/Front/Web/CLAUDE.md
  • src/Core/Front/Web/Middleware/CLAUDE.md
  • src/Core/Front/Web/Middleware/FindDomainRecord.php
  • src/Core/Front/Web/Middleware/ResilientSession.php
  • src/Core/Headers/CLAUDE.md
  • src/Core/Headers/Livewire/CLAUDE.md
  • src/Core/Headers/Livewire/HeaderConfigurationManager.php
  • src/Core/Headers/Testing/CLAUDE.md
  • src/Core/Headers/Views/livewire/CLAUDE.md
  • src/Core/Helpers/CLAUDE.md
  • src/Core/Helpers/Rules/CLAUDE.md
  • src/Core/Input/CLAUDE.md
  • src/Core/Input/Tests/Unit/CLAUDE.md
  • src/Core/Lang/CLAUDE.md
  • src/Core/Lang/Console/Commands/CLAUDE.md
  • src/Core/Lang/Console/Commands/TranslationCoverageCommand.php
  • src/Core/Lang/Console/Commands/TranslationMemoryCommand.php
  • src/Core/Lang/Coverage/CLAUDE.md
  • src/Core/Lang/TranslationMemory/CLAUDE.md
  • src/Core/Lang/TranslationMemory/Contracts/CLAUDE.md
  • src/Core/Lang/en_GB/CLAUDE.md
  • src/Core/LifecycleEventProvider.php
  • src/Core/Mail/CLAUDE.md
  • src/Core/Mail/Rules/CLAUDE.md
  • src/Core/Media/Abstracts/CLAUDE.md
  • src/Core/Media/Abstracts/MediaConversion.php
  • src/Core/Media/CLAUDE.md
  • src/Core/Media/Conversions/CLAUDE.md
  • src/Core/Media/Events/CLAUDE.md
  • src/Core/Media/Image/CLAUDE.md
  • src/Core/Media/Image/ImageOptimization.php
  • src/Core/Media/Jobs/CLAUDE.md
  • src/Core/Media/Routes/CLAUDE.md
  • src/Core/Media/Support/CLAUDE.md
  • src/Core/Media/Thumbnail/CLAUDE.md
  • src/Core/Rules/CLAUDE.md
  • src/Core/Search/Analytics/CLAUDE.md
  • src/Core/Search/Analytics/SearchAnalytics.php
  • src/Core/Search/Analytics/migrations/CLAUDE.md
  • src/Core/Search/Boot.php
  • src/Core/Search/CLAUDE.md
  • src/Core/Search/Suggestions/CLAUDE.md
  • src/Core/Search/Suggestions/SearchSuggestions.php
  • src/Core/Search/Support/CLAUDE.md
  • src/Core/Search/Unified.php
  • src/Core/Seo/Analytics/CLAUDE.md
  • src/Core/Seo/Boot.php
  • src/Core/Seo/CLAUDE.md
  • src/Core/Seo/Console/Commands/CLAUDE.md
  • src/Core/Seo/Console/Commands/GenerateServiceOgImages.php
  • src/Core/Seo/Controllers/CLAUDE.md
  • src/Core/Seo/Jobs/CLAUDE.md
  • src/Core/Seo/Jobs/GenerateOgImageJob.php
  • src/Core/Seo/Models/CLAUDE.md
  • src/Core/Seo/Models/SeoScoreHistory.php
  • src/Core/Seo/SeoMetadata.php
  • src/Core/Seo/Services/CLAUDE.md
  • src/Core/Seo/Validation/CLAUDE.md
  • src/Core/Storage/CLAUDE.md
  • src/Core/Storage/CacheResilienceProvider.php
  • src/Core/Storage/Commands/CLAUDE.md
  • src/Core/Storage/Commands/WarmCacheCommand.php
  • src/Core/Storage/Events/CLAUDE.md
  • src/Core/Tests/Feature/AdminComponentsTest.php
  • src/Core/Tests/Feature/AdminRouteSmokeTest.php
  • src/Core/Tests/Feature/CLAUDE.md
  • src/Core/Tests/Feature/CdnIntegrationTest.php
  • src/Core/Tests/Feature/Config/CLAUDE.md
  • src/Core/Tests/Feature/Config/ChannelTest.php
  • src/Core/Tests/Feature/Config/ConfigValueTest.php
  • src/Core/Tests/Feature/CoreComponentsTest.php
  • src/Core/Tests/Feature/DatabaseMigrationTest.php
  • src/Core/Tests/Feature/EmailShieldTest.php
  • src/Core/Tests/Feature/ErrorPagesTest.php
  • src/Core/Tests/Feature/ImageOptimizerTest.php
  • src/Core/Tests/Feature/MailConfigurationTest.php
  • src/Core/Tests/Feature/ModuleScannerIntegrationTest.php
  • src/Core/Tests/Feature/OffloadMigrateCommandTest.php
  • src/Core/Tests/Feature/RewriteOffloadedUrlsTest.php
  • src/Core/Tests/Feature/SecurityFixesTest.php
  • src/Core/Tests/Feature/SecurityHeadersTest.php
  • src/Core/Tests/Feature/StorageOffloadTest.php
  • src/Core/Tests/Feature/ValidationRulesTest.php
  • src/Core/Tests/Unit/CLAUDE.md
  • src/Core/Tests/Unit/Crypt/CLAUDE.md
  • src/Core/Tests/Unit/HadesEncryptTest.php
  • src/Core/Tests/Unit/LthnHashTest.php
  • src/Core/Tests/Unit/Services/BunnyCdnServiceTest.php
  • src/Core/Tests/Unit/Services/CLAUDE.md
  • src/Core/Webhook/CLAUDE.md
  • src/Core/Webhook/CronTrigger.php
  • src/Mod/CLAUDE.md
  • src/Mod/Trees/CLAUDE.md
  • src/Mod/Trees/Database/Seeders/TreeSeeder.php
  • src/Mod/Trees/Routes/web.php
  • src/Mod/Trees/Tests/Feature/DailyLimitAndBonusTest.php
  • src/Mod/Trees/Tests/Feature/QueueProcessingTest.php
  • src/Mod/Trees/Tests/Feature/ReferralRouteTest.php
  • src/Mod/Trees/Tests/Feature/SignupReferralTest.php
  • src/Mod/Trees/Tests/Feature/StatsApiTest.php
  • src/Mod/Trees/Tests/Feature/SubscriberMonthlyCommandTest.php
  • src/Mod/Trees/Tests/Feature/TreePlantingTest.php
  • src/Mod/Trees/Tests/Feature/TreesPageTest.php
  • src/Mod/Trees/View/Modal/Web/Index.php
💤 Files with no reviewable changes (1)
  • CLAUDE.md

Comment thread cmd/core-php/main.go
Comment thread composer.json
Comment thread go.mod
Comment thread psalm.xml
Comment thread psalm.xml
Comment thread src/Core/Front/Admin/Contracts/CLAUDE.md
Comment thread src/Core/Front/Components/View/Blade/command/CLAUDE.md
Comment thread src/Core/Front/Services/CLAUDE.md
Comment thread src/Core/Helpers/Rules/CLAUDE.md
Comment thread src/Core/Seo/CLAUDE.md
@Snider Snider merged commit 9d8ccb5 into main Apr 27, 2026
13 of 15 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