- CLAUDE.md: add Grav 2.0 upgrade method, Admin2 setup, trip entity architecture, updated paths - bugs-and-fixes.md: fix stale paths, add BUG-004 (Admin2 empty dashboard) and BUG-005 (PHP session path) - posting-pipeline.md: update paths to trips/dailies structure Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
7.3 KiB
Bugs & Fixes
Backlog of confirmed bugs with root cause analysis and implementation spec for the fix.
BUG-001 — New entry not visible after form submission
Status: fixed 2026-06-18
Reported: 2026-06-18
Symptom
After submitting a new post via /post, the entry page file is created correctly on disk but does not appear in the /trips/<active_trip>/dailies feed or in the Grav Admin panel until the cache is manually flushed.
Root cause
Grav's page-tree cache (cache/doctrine/) is not invalidated when add-page-by-form writes a new page to disk. The tracker template uses page.children, which Grav serves from cache — so the new child page is invisible until the cache is cleared.
Workaround (manual)
Run in terminal after each submission:
docker exec intotheeast_grav bash -c "cd /var/www/html && php bin/grav clearcache"
Fix spec
Wire cache-clear into the form process so it happens automatically on every successful submission.
Approach — custom Grav plugin event hook:
- Create a small plugin
user/plugins/cache-on-save/with one event listener:- Listen on
onFormProcessed - When the form name is
new-entry, call$this->grav['cache']->deleteAll()(note:clear()does not exist onGrav\Common\Cachein Grav 1.7)
- Listen on
- Enable the plugin in
user/config/plugins/cache-on-save.yaml
This is the cleanest approach: it fires exactly once per successful submission, requires no changes to post-form.md, and works for any future forms too.
Alternative — disable page cache entirely:
Set cache: { enabled: false } in system.yaml. Simpler but degrades frontend performance; not recommended for production.
Files to create/modify
| File | Change |
|---|---|
user/plugins/cache-on-save/cache-on-save.php |
New plugin, ~30 lines |
user/plugins/cache-on-save/cache-on-save.yaml |
Plugin manifest, enabled: true |
user/config/plugins/cache-on-save.yaml |
Runtime config, enabled: true |
Acceptance criteria
- Submit a new post via
/post - Navigate to
/trips/<active_trip>/dailies— the new entry is visible immediately, no manual cache flush needed - Grav Admin also shows the new page immediately
BUG-002 — Stale Twig cache after theme file changes
Status: fixed 2026-06-18
Reported: 2026-06-18
Symptom
After theme template files are added or modified (e.g., creating partials/base.html.twig), Grav's Twig compiled-template cache still holds the old compiled version. Pages that extend the changed file throw 500 errors like "Template partials/base.html.twig is not defined" even though the file exists on disk.
Root cause
Grav caches compiled Twig templates in cache/twig/. When a new file is added, existing templates that reference it don't know to recompile — their cache entries are still valid from their own mtime perspective.
Workaround (manual)
Run after any theme file is added or changed:
docker exec intotheeast_grav bash -c "cd /var/www/html && php bin/grav clearcache"
Fix spec
Disable Twig template caching in development via user/config/system.yaml:
twig:
cache: false
Acceptable for a single-user dev setup — eliminates both BUG-001's side-effect and this bug entirely. Performance cost is negligible at one-user scale. On production, leave Twig cache enabled (it's fine there because template files don't change at runtime).
Files to change:
| File | Change |
|---|---|
user/config/system.yaml |
Add twig: { cache: false } under development section |
Acceptance criteria
- Add a new theme template file
- Reload any page — no 500 error, template works immediately without manual cache flush
BUG-003 — One post per day limit; silent failure on duplicate date
Status: fixed 2026-06-18 Reported: 2026-06-18
Symptom
Submitting a second post with the same date as an existing entry shows "Entry posted successfully!" but creates no file. The user's post is silently discarded.
Root cause
The add-page-by-form plugin built the page slug from date only (Y-m-d), producing folder names like 2026-06-18.entry. With overwrite_mode: false, if that folder already exists the plugin skips page creation but does not abort — the message process step runs regardless, showing a false success.
Fix
Change the slug template in user/pages/02.post/post-form.md to include time and title:
{{ form.value.date|date('Y-m-d-Hi') }}-{{ form.value.title|lower|regex_replace('/[^a-z0-9]+/', '-')|trim('-') }}
Example: title "Arrived in Tokyo" at 14:30 on 2026-06-18 → 2026-06-18-1430-arrived-in-tokyo
The slug is locked at creation time. Renaming the title afterwards does not change the URL.
Acceptance criteria
- Submit two posts on the same day with different times or titles — both appear in
/trips/<active_trip>/dailiesas separate entries - Renaming a post's title in the frontmatter does not break its URL
BUG-004 — Admin2 shows empty dashboard after Grav 2.0 upgrade
Status: fixed 2026-06-19
Symptom
After installing Grav 2.0 + Admin2, logging in shows an empty dashboard with no sidebar navigation (only a Settings item visible). Pages and content are not accessible.
Root causes (three separate issues)
A) Wrong user account type. system.yaml had accounts.type: regular (old file-based system). Admin2's API plugin uses the Flex user collection to look up accounts. With regular, the API saw zero users and entered setup-wizard mode.
B) Wrong pages type. system.yaml had pages.type: regular. Admin2's pages API requires pages.type: flex to serve the page tree.
C) Missing api.* permissions on user account. Grav 2.0 Admin2 uses a new api.* permission namespace (api.super, api.access, etc.) instead of the old admin.super. A user with only access.admin.super: true appears as a non-admin to Admin2.
Fix
In user/config/system.yaml:
accounts:
type: flex
pages:
type: flex
In user/accounts/<username>.yaml:
access:
admin:
login: true
super: true # keep for backward compat
api:
super: true # required by Admin2
access: true # required by Admin2
Notes
api.super: truecauses Admin2 to grant all sub-permissions automatically (api.pages,api.config, etc.)- JWT secret in
user/plugins/api/api.yamlcan stay empty — HMAC-SHA256 works with an empty key locally; production generates its own secure secret - The old
adminplugin must be disabled (enabled: false) to avoid route conflict withadmin2
BUG-005 — PHP session fails after Grav 2.0 container upgrade
Status: fixed 2026-06-19
Symptom
After replacing Grav core files inside the container, all pages return a CRITICAL error in logs/grav.log: Failed to start session: session_start(): Failed to read session data: files (path: ). Site is inaccessible.
Root cause
The getgrav/grav Docker image's PHP configuration does not set session.save_path. Grav 1.7 worked because the image's default PHP config included it; the updated image layer did not.
Fix
Add to php/php-local.ini:
session.save_path = /tmp
Restart the container to pick up the change. This file is bind-mounted into the container so no image rebuild is needed.