ik
8cf453f86b
data: review media queue batch
2026-09-13 13:23:16 +07:00
ik
48cd217479
data: review media queue batch
2026-09-13 12:32:25 +07:00
ik
04ac25c818
data: review media queue batch
2026-09-13 11:55:26 +07:00
ik
976b386e6b
data: review media queue batch
2026-09-13 11:08:58 +07:00
ik
bb6fc6cd53
data: review media queue batch
2026-09-13 10:32:50 +07:00
ik
1adeff5e94
data: review next media queue batch
2026-09-13 10:02:42 +07:00
ik
9c44cfc08f
refactor: extract admin api router
2026-09-13 09:59:55 +07:00
ik
b76da2edd0
refactor: remove legacy submission handlers
2026-09-13 09:42:15 +07:00
ik
30bfccd0e7
refactor: move submission endpoints to router
2026-09-13 09:38:20 +07:00
ik
c93c6adc7a
security: restrict production content origins
CI / backend-and-migrations (push) Canceled after 0s
CI / astro-build (push) Canceled after 0s
CI / dependency-audit (push) Canceled after 0s
CI / compose-e2e (push) Canceled after 0s
2026-09-13 09:33:39 +07:00
ik
aae5e0926a
docs: define alpha observability baseline
2026-09-13 09:32:22 +07:00
ik
016d459861
feat: degrade home sections independently
2026-09-13 09:28:12 +07:00
ik
0abe1a2bb4
feat: lock concurrent moderation decisions
CI / backend-and-migrations (push) Canceled after 0s
CI / astro-build (push) Canceled after 0s
CI / dependency-audit (push) Canceled after 0s
CI / compose-e2e (push) Canceled after 0s
2026-09-13 09:26:18 +07:00
ik
cbd854d933
docs: add source permission register
CI / backend-and-migrations (push) Canceled after 0s
CI / astro-build (push) Canceled after 0s
CI / dependency-audit (push) Canceled after 0s
CI / compose-e2e (push) Canceled after 0s
2026-09-13 09:21:57 +07:00
ik
6aaee107a9
docs: add architecture and incident runbooks
2026-09-13 09:19:46 +07:00
ik
c6ffded8d7
feat: complete moderation history dashboard
CI / backend-and-migrations (push) Canceled after 0s
CI / astro-build (push) Canceled after 0s
CI / dependency-audit (push) Canceled after 0s
CI / compose-e2e (push) Canceled after 0s
2026-09-13 09:07:32 +07:00
ik
392e1e534a
fix: exclude generic maps from coverage
CI / backend-and-migrations (push) Canceled after 0s
CI / astro-build (push) Canceled after 0s
CI / dependency-audit (push) Canceled after 0s
CI / compose-e2e (push) Canceled after 0s
2026-09-13 08:54:53 +07:00
ik
3547598d37
fix: prioritize media URL classification
2026-09-13 08:46:42 +07:00
ik
0b7df7f721
fix: count unique media coverage
CI / backend-and-migrations (push) Canceled after 0s
CI / astro-build (push) Canceled after 0s
CI / dependency-audit (push) Canceled after 0s
CI / compose-e2e (push) Canceled after 0s
2026-09-13 08:22:10 +07:00
ik
7e464ef598
feat: track media catalog coverage
2026-09-13 08:14:56 +07:00
ik
674bc5627f
feat: expand RF4 media inventory
2026-09-13 08:06:48 +07:00
ik
4042c80f00
feat: audit catalog media coverage
CI / backend-and-migrations (push) Canceled after 0s
CI / astro-build (push) Canceled after 0s
CI / dependency-audit (push) Canceled after 0s
CI / compose-e2e (push) Canceled after 0s
2026-09-12 21:57:07 +07:00
ik
fcc26a5b34
feat: add moderation decision history
2026-09-12 21:52:25 +07:00
ik
9681bdbd36
feat: show moderation provenance
2026-09-12 21:51:09 +07:00
ik
def5c39aa1
feat: expose safe moderation provenance
2026-09-12 21:49:45 +07:00
ik
699a7c3857
feat: add safe moderation shortcuts
2026-09-12 21:47:49 +07:00
ik
0f078ab482
feat: prioritize risky moderation records
2026-09-12 21:45:29 +07:00
ik
ba4c42f8f6
feat: streamline moderation decisions
2026-09-12 21:43:41 +07:00
ik
8e419c1832
feat: filter external moderation queue
CI / backend-and-migrations (push) Canceled after 0s
CI / astro-build (push) Canceled after 0s
CI / dependency-audit (push) Canceled after 0s
CI / compose-e2e (push) Canceled after 0s
2026-09-12 21:37:10 +07:00
ik
6e18e8e565
feat: add admin operations dashboard
2026-09-12 21:35:18 +07:00
ik
7c28a0c36a
security: rate limit admin authentication
2026-09-12 21:33:26 +07:00
ik
ff8ea40d40
security: expire admin browser sessions
2026-09-12 21:29:18 +07:00
ik
ca22042d18
security: harden admin external links
2026-09-12 21:26:51 +07:00
ik
9158ae3d8a
data: store one authorized RF4 media asset
2026-09-12 21:25:28 +07:00
ik
1776283a95
refactor: assign submissions to dedicated router
2026-09-12 21:21:34 +07:00
ik
31bbc15535
refactor: isolate submission rate limiting
2026-09-12 21:19:10 +07:00
ik
e48b9ef876
refactor: extract public data router
2026-09-12 21:15:51 +07:00
ik
6974ae690d
refactor: extract activity and spot router
CI / backend-and-migrations (push) Canceled after 0s
CI / astro-build (push) Canceled after 0s
CI / dependency-audit (push) Canceled after 0s
CI / compose-e2e (push) Canceled after 0s
2026-09-12 21:12:35 +07:00
ik
b84f1fe815
refactor: extract public catalog router
CI / backend-and-migrations (push) Canceled after 0s
CI / astro-build (push) Canceled after 0s
CI / dependency-audit (push) Canceled after 0s
CI / compose-e2e (push) Canceled after 0s
2026-09-12 21:05:13 +07:00
ik
8d7fab97b9
ci: lock generated OpenAPI contract
2026-09-12 21:03:37 +07:00
ik
d4ded77355
ci: schedule isolated production bootstrap
CI / backend-and-migrations (push) Canceled after 0s
CI / astro-build (push) Canceled after 0s
CI / dependency-audit (push) Canceled after 0s
CI / compose-e2e (push) Canceled after 0s
2026-09-12 20:58:50 +07:00
ik
f6e6211871
test: verify release schema upgrade
2026-09-12 20:57:58 +07:00
ik
049f1ef30a
refactor: separate migrations from API runtime
CI / backend-and-migrations (push) Canceled after 0s
CI / astro-build (push) Canceled after 0s
CI / dependency-audit (push) Canceled after 0s
CI / compose-e2e (push) Canceled after 0s
2026-09-12 16:02:19 +07:00
ik
868278fdba
security: restrict MinIO app to one bucket
2026-09-12 16:01:00 +07:00
ik
926182a6cf
feat: add alpha load-test methodology
2026-09-12 15:58:07 +07:00
ik
883ad2c73b
feat: audit media catalog integrity
2026-09-12 15:57:04 +07:00
ik
215af73388
feat: add explicit media review workflow
CI / backend-and-migrations (push) Canceled after 0s
CI / astro-build (push) Canceled after 0s
CI / dependency-audit (push) Canceled after 0s
CI / compose-e2e (push) Canceled after 0s
2026-09-12 15:55:39 +07:00
ik
26724c7675
feat: validate and unblock media downloads
2026-09-12 15:54:53 +07:00
ik
bda0a0ef5e
feat: add rate-limited RF4 media collector
2026-09-12 15:52:27 +07:00
ik
52ff29668e
feat: add visual links between atlas entities
2026-09-12 15:46:36 +07:00
ik
45c7e65bc4
feat: connect atlas pages with breadcrumb line
2026-09-12 15:44:38 +07:00
ik
cadd5607b8
feat: compose atlas identity for fishing pairs
CI / backend-and-migrations (push) Canceled after 0s
CI / astro-build (push) Canceled after 0s
CI / dependency-audit (push) Canceled after 0s
CI / compose-e2e (push) Canceled after 0s
2026-09-12 15:37:54 +07:00
ik
2ce1e20af2
feat: add unique waterbody fingerprints
2026-09-12 15:35:57 +07:00
ik
80d534d549
feat: add semantic tackle glyphs
2026-09-12 15:30:40 +07:00
ik
c3e847c249
feat: distinguish fish by visual family
CI / backend-and-migrations (push) Canceled after 0s
CI / astro-build (push) Canceled after 0s
CI / dependency-audit (push) Canceled after 0s
CI / compose-e2e (push) Canceled after 0s
2026-09-12 15:28:24 +07:00
ik
b71e4a22a2
docs: plan entity visual identification
CI / backend-and-migrations (push) Canceled after 0s
CI / astro-build (push) Canceled after 0s
CI / dependency-audit (push) Canceled after 0s
CI / compose-e2e (push) Canceled after 0s
2026-09-12 15:23:45 +07:00
ik
966000b0b0
feat: transform catalogs into field atlas
2026-09-12 15:20:26 +07:00
ik
a8b1775169
refactor: establish brand motion system
CI / backend-and-migrations (push) Canceled after 0s
CI / astro-build (push) Canceled after 0s
CI / dependency-audit (push) Canceled after 0s
CI / compose-e2e (push) Canceled after 0s
2026-09-12 10:07:47 +07:00
ik
0c25cf020f
refactor: unify action hierarchy
2026-09-12 10:05:49 +07:00
ik
2477543029
refactor: unify public state panels
2026-09-12 10:02:19 +07:00
ik
c944db54af
refactor: unify catalog page heroes
CI / backend-and-migrations (push) Canceled after 0s
CI / astro-build (push) Canceled after 0s
CI / dependency-audit (push) Canceled after 0s
CI / compose-e2e (push) Canceled after 0s
2026-09-12 09:59:14 +07:00
ik
9647667ae2
refactor: unify editorial section headings
2026-09-12 09:57:56 +07:00
ik
fc22795b63
refactor: clarify visual motif grammar
CI / backend-and-migrations (push) Canceled after 0s
CI / astro-build (push) Canceled after 0s
CI / dependency-audit (push) Canceled after 0s
CI / compose-e2e (push) Canceled after 0s
2026-09-12 09:56:16 +07:00
ik
1fabf21935
refactor: introduce semantic brand tokens
2026-09-12 09:54:26 +07:00
ik
b0dd703f72
feat: establish brand identity hierarchy
2026-09-12 09:49:19 +07:00
ik
987d9ea109
perf: establish frontend performance baseline
2026-09-12 09:46:52 +07:00
ik
e7f3de1ddc
fix: tighten narrow viewport behavior
CI / backend-and-migrations (push) Canceled after 0s
CI / astro-build (push) Canceled after 0s
CI / dependency-audit (push) Canceled after 0s
CI / compose-e2e (push) Canceled after 0s
2026-09-12 09:42:17 +07:00
ik
4fef0e8b74
feat: add accessible queue loading states
CI / backend-and-migrations (push) Canceled after 0s
CI / astro-build (push) Canceled after 0s
CI / dependency-audit (push) Canceled after 0s
CI / compose-e2e (push) Canceled after 0s
2026-09-11 08:08:52 +07:00
ik
45b73ec54a
docs: refresh roadmap after recovery acceptance
CI / backend-and-migrations (push) Canceled after 0s
CI / astro-build (push) Canceled after 0s
CI / dependency-audit (push) Canceled after 0s
CI / compose-e2e (push) Canceled after 0s
2026-09-11 08:06:40 +07:00
ik
907ad537e2
fix: accept non-hex alembic revision ids
CI / backend-and-migrations (push) Canceled after 0s
CI / astro-build (push) Canceled after 0s
CI / dependency-audit (push) Canceled after 0s
CI / compose-e2e (push) Canceled after 0s
2026-09-11 07:58:40 +07:00
ik
51728bf3f2
test: clean up concurrent cooldown processes
2026-09-11 07:56:01 +07:00
ik
8f76f70409
feat: add activity level legend to spot view
2026-09-11 07:54:16 +07:00
ik
8c94d40766
feat: add one-click coordinate copying
2026-09-11 07:52:07 +07:00
ik
1ffaf7478d
fix: synchronize normalized records on import revisions
2026-09-11 07:50:31 +07:00
ik
2ad2bdcdff
fix: mark catalog outage pages as SEO errors
CI / backend-and-migrations (push) Canceled after 0s
CI / astro-build (push) Canceled after 0s
CI / dependency-audit (push) Canceled after 0s
CI / compose-e2e (push) Canceled after 0s
2026-09-11 07:49:58 +07:00
ik
6664f24f20
fix: invoke Caddy adapter correctly in bootstrap
2026-09-11 07:48:05 +07:00
ik
0b7bbc78a6
fix: make report and idempotency insert transactional
2026-09-11 07:47:36 +07:00
ik
fc963101b3
fix: handle concurrent idempotency key conflicts
2026-09-11 07:46:50 +07:00
ik
d28ad31aca
fix: fail closed on bootstrap migration inspection
2026-09-11 07:46:10 +07:00
ik
67d81f81ff
fix: keep advanced filters accessible on mobile
2026-09-11 07:45:45 +07:00
ik
d6bc5ce85c
fix: alert on degraded community scheduler health
CI / backend-and-migrations (push) Canceled after 0s
CI / astro-build (push) Canceled after 0s
CI / dependency-audit (push) Canceled after 0s
CI / compose-e2e (push) Canceled after 0s
2026-09-11 07:44:30 +07:00
ik
5b2db1cf48
fix: reject idempotency key payload conflicts
2026-09-11 07:44:07 +07:00
ik
42bdec6c2f
fix: isolate scheduler validation in bootstrap
2026-09-11 07:43:14 +07:00
ik
531f1aa82f
fix: replay idempotent upload token safely
2026-09-11 07:42:41 +07:00
ik
486e4c4673
fix: wire report idempotency and bootstrap scheduler check
2026-09-11 07:41:55 +07:00
ik
bea3b9ccbb
fix: align recovery schema idempotency and record counts
2026-09-11 07:40:58 +07:00
ik
13e04e6c66
A12: Add meaningful changes/provenance to ImportRecordEvent, skip events for unchanged data
CI / backend-and-migrations (push) Canceled after 0s
CI / astro-build (push) Canceled after 0s
CI / dependency-audit (push) Canceled after 0s
CI / compose-e2e (push) Canceled after 0s
2026-09-11 07:36:21 +07:00
ik
5107a7c467
A11: Use requirements-lock.txt in Dockerfile for reproducible builds
2026-09-11 07:35:35 +07:00
ik
2ba4f6027d
A10: Add Caddy config validation and scheduler checks to bootstrap
2026-09-11 07:35:22 +07:00
ik
641374ddbc
A05: Add server-side idempotency for catch report creation via Idempotency-Key header
2026-09-11 07:35:01 +07:00
ik
57aa3ffafb
A02/A03: Add state validation and normalize subdomain keys for shared cooldown
2026-09-10 20:34:05 +07:00
ik
f29ec706fd
R09: Add PaginatedOfficialRecordOut schema and paginated /api/v1/records endpoint
2026-09-10 20:27:45 +07:00
ik
7e08ecbfc6
A13: Finalize RECOVERY_FIXES_REPORT with verified status and commit history
CI / backend-and-migrations (push) Canceled after 0s
CI / astro-build (push) Canceled after 0s
CI / dependency-audit (push) Canceled after 0s
CI / compose-e2e (push) Canceled after 0s
2026-09-10 20:06:28 +07:00
ik
ec3a1ca516
A09: Use static registry for CLI choices, check enabled at runtime
...
Bug: 'choices=configured_sources()' in argparse opened DB session at
import time, causing --help to fail when DB was unavailable.
Fix:
- Added STATIC_SOURCE_CHOICES list with known source keys
- argparse uses static choices — no DB required for --help
- fetch-community command now checks enabled status at runtime
- Disabled sources return error: 'source X is disabled or not configured'
- run_source still handles locked/cooling down state
Verification:
- CLI --help works without DB
- fetch-community --help shows all known sources
- Disabled sources are rejected at runtime with clear error
- 124/124 Python tests pass (1 skipped)
2026-09-10 19:53:15 +07:00
ik
e2223c6f24
A07: Fix _auto_publish to allow fish name fallback without external_id
...
Bug: 'observation.fish_external_id is None' in early return prevented
auto-publishing observations that only have fish_name (no external_id),
even when name-based fallback matching was available.
Fix:
- Removed fish_external_id check from early return condition
- Auto-publish now tries external_id first, falls back to name match
- review_note now describes actual matching method:
'Auto-matched: fish via external_id/name, waterbody via external_id/name'
- Previous note 'Automatically matched by previously reviewed source aliases'
was misleading when name fallback was used
Verification:
- 14/14 community_importer tests pass
- 124/124 Python tests pass (1 skipped)
- Observations without fish_external_id can now auto-publish via name match
- review_note accurately describes matching method
2026-09-10 19:42:56 +07:00
ik
883e63aa8b
A01: Fix scheduler aggregation to not mask stale/failed sources
...
Bug: has_any_success allowed one healthy source to give overall 'ready'
when another source was stale/not_started/running — masking failures.
Fix:
- Added has_any_stale and has_any_running tracking
- Overall status is 'degraded' if ANY source is failed/stale/running
- Overall status is 'ready' ONLY when ALL enabled sources are healthy
- 'not_started' when no sources are enabled
- readiness (ready flag) still NOT blocked by import health (A01 requirement)
Verification:
- 7/7 readiness tests pass
- 124/124 Python tests pass (1 skipped)
- Stale source now shows 'degraded' instead of 'ready'
- Failed source still shows 'degraded'
- All healthy sources show 'ready'
2026-09-10 19:32:33 +07:00
ik
e996c6da41
A08: Pass errorPage on all pages with potential errors
...
Bug: Only index.astro passed errorPage={filterError}, missing:
- index.astro unavailable (503) — Dataset оставался на error page
- spots/[id].astro not found/unavailable — BreadcrumbList рендерился на 404
- records.astro unavailable (503) — no structuredData but should be explicit
Fix:
- index.astro: errorPage={filterError || unavailable}
- spots/[id].astro: errorPage={!spot || unavailable}
- records.astro: errorPage={unavailable}
- report.astro: не нужен (structuredData не передаётся)
Verification:
- Astro build: 0 errors
- Error pages (422, 503, 404) skip structuredData
- Normal pages include structuredData
- noindex still works for robots meta tag
2026-09-10 19:12:15 +07:00
ik
2a0c7b2fa5
A04: Fix pagination 'load more' condition for server-side pages
...
CI / backend-and-migrations (push) Canceled after 0s
CI / astro-build (push) Canceled after 0s
CI / dependency-audit (push) Canceled after 0s
CI / compose-e2e (push) Canceled after 0s
Bug: Condition 'items.length < totalItems' always true for partial last
page (e.g., 5 < 45 on offset=40), showing 'load more' link to empty page.
Fix: Use 'offset + items.length < totalItems' to correctly detect when
all items have been shown. Also update displayed counter to show
'offset + items.length из totalItems' for accurate progress.
Verification:
- Astro build: 0 errors
- 45 items, page 0: shows '20 из 45', next link to offset=20
- 45 items, page 20: shows '40 из 45', next link to offset=40
- 45 items, page 40: shows '45 из 45', NO next link (45 < 45 = false)
- Empty results: no next link (0 < 0 = false)
2026-09-10 18:41:35 +07:00
ik
69f052810c
A13: Update RECOVERY_FIXES_REPORT with final verified status
...
Comprehensive update with all A01-A13 fixes:
- A01: Per-source health affects community_scheduler status (degraded/stale)
- A02: Fixed double cooldown reservation bug in main()
- A03: Manual redirect control with per-hop validation
- A04: Fixed pagination offset calculation and filter-advanced-field CSS
- A05: Added sessionStorage error handling (safeStorage helper)
- A06: Added Docker chain rate limit tests (independent limits, forged XFF)
- A07: Improved review_note to explain matching method
- A08: Added explicit errorPage prop to skip structuredData on error pages
- A10: Fixed Alembic head extraction (grep -oE for revision ID)
- A11: Replaced pip audit with real pip-audit, removed || true
- A13: Final acceptance documentation
Test results:
- 124/124 Python tests pass (1 skipped)
- Astro build: 0 errors
- All verification checks pass
2026-09-10 18:19:01 +07:00
ik
ed78a17109
A11: Replace pip audit with real pip-audit tool and remove error suppression
...
Bug: CI used 'pip audit ... || true' which:
1. Relied on pip-audit being pre-installed (not guaranteed)
2. Suppressed all errors with '|| true', hiding security issues
Fix:
- Install pip-audit explicitly in CI workflow
- Remove '|| true' to fail on security vulnerabilities
- Use requirements-lock.txt instead of requirements.txt for reproducibility
- Check both production and dev dependencies
This ensures:
- Security audit actually runs and fails on vulnerabilities
- Locked dependencies are used for consistent results
- No silent failures masking security issues
2026-09-10 18:18:09 +07:00