Files
Rafhan Mazaya FathurrahmanandClaude Sonnet 5 ada6488592 feat(app): scan-mode sync, confirmation-gated documents, single-pass product classification
Fixes reported from APK field testing: DO/Product scan mode was inconsistent
between the camera drawer and documents screen (now one shared provider,
with an orange/green color cue); unconfirmed scans leaked into history with
placeholder data before the user tapped confirm (backend now gates
GET /documents on a new `confirmed` column, flipped only by PUT); and
Product Scan ran the GPU classifier twice, once at upload and again on
review (now a single pass at upload, persisted and read directly by the
editor). Also removes the unused "Hubungkan ke PO" field and fabricated
PO/SO/DO placeholder values from the Product Scan flow, closes out the
per-document-polling and save-recovery tasks (6.1/6.3), and splits several
touched files to stay under the repo's 256-line guideline.

Full detail in docs/iteration-log.md and backend/docs/iteration-log.md.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-07-10 15:19:32 +07:00

14 KiB

Agent Instructions

This is the authoritative rules file for any AI coding agent (Claude Code, Cursor, GitHub Copilot, Aider, etc.) working in a project that uses this starter kit. Agents that don't read AGENTS.md natively should be pointed at it via their own config file — see docs/vibe-coding/ for per-tool instructions. CLAUDE.md imports this file.

Scope: excludes backend/

This kit's automated behaviors — the e/enhance and n/next triggers, the §3 file-size threshold as an enforcement action (splitting a file because this kit says so), and the §5 Demo/Live and §6 Cloud/Local switches — govern the Flutter app at the repo root (lib/, test/, root-level config/docs) only.

backend/ is out of scope for this kit. It is a separately governed subtree with its own pre-existing rules files — backend/CLAUDE.md (project-specific architecture/history/confidentiality notes) and backend/AGENTS.md (carried over near-unchanged from ai-ocr-pfm-2026: uv conventions, issue-recording workflow, karpathy coding guidelines) — that predate this kit's adoption and are tuned to that codebase's own conventions. Do not let this kit's generic rules override or be conflated with them:

  • Don't run e/enhance against backend/ modules, and don't let n/next auto-seed or pick up backend-section tasks, unless the user explicitly asks for a backend-scoped run for that specific invocation.
  • Don't apply §3's 256-line split as a repo-wide mandate inside backend/ — that subtree already documents its own pre-existing large files as accepted debt (see backend/CLAUDE.md) and has its own change conventions.
  • §5 (Demo/Live) and §6 (Cloud/Local) describe app-level UX switches for the Flutter client; they are not a mandate to add mock-data layers or deployment switches inside the Next.js backend.
  • If asked to work inside backend/, defer entirely to backend/CLAUDE.md and backend/AGENTS.md (and backend/plans/next-enhancements.md for feature-level status — backend/next-implementation.md was deleted 2026-07-08, its content folded into that plan) instead of this file.

See Adaptation Notes at the end of this file for how plans/next-enhancements.md reconciles this after an earlier adoption pass mistakenly seeded backend sections.

0. Adopting Into an Existing Project

This kit auto-detects whether it's landing in a new or existing codebase — no separate trigger is required. You can also type "i" / "init" at any time to force a re-audit (e.g. after a large refactor or reorg).

Auto-detection: the first time "e"/"enhance" or "n"/"next" runs, if plans/next-enhancements.md is still the empty seed template (or missing) AND the repo already contains files/history beyond this kit's own files, treat it as an existing project and run the audit below first. Skip it on a genuinely empty/new project — there's nothing to audit.

The audit (owned by the Software Architect role, see SKILLS.md):

  • Don't overwrite silently. If the repo already has its own README.md/AGENTS.md/ CLAUDE.md, merge additively — append a clearly-marked section pointing at this kit's files rather than deleting existing project-specific instructions.
  • Discover reality before writing anything:
    • Detect the tech stack and real build/test/lint commands (package.json, Makefile, pyproject.toml, etc.).
    • Map the actual existing folder/module structure — this becomes the section list e/enhance uses, replacing invented sections.
    • Scan for files already over the 256-line threshold (§3) and list them as pre-existing debt, not a blocker — the rule binds new/touched files going forward, it does not retroactively force-refactor untouched legacy code.
    • Check for existing equivalents of Demo/Live (§5) or Cloud/Local (§6) patterns; adapt to what's already there instead of introducing a redundant second switch.
  • Seed plans/next-enhancements.md sections from the real discovered modules (not blank placeholders); optionally backfill docs/feature-list.md with a short "Existing Features (pre-kit)" summary so the log doesn't start misleadingly empty.
  • Record any deviation from this kit's defaults (because the project already does it differently) as a short Adaptation Notes subsection appended to the end of this file — so future e/n runs see local reality, not just the template's assumptions.
  • Once the audit (and any merge/adaptation) is done, e/enhance and n/next behave exactly as described below.

1. Trigger "e" or "enhance"

If the user types "e", "enhance", or requests an enhancement plan:

  • Read /plans/next-enhancements.md to understand the current platform structure, history, and active tasks.
  • Overwrite or update the active tasks list inside /plans/next-enhancements.md.
  • The plan must cover each main section/module of the application.
  • Inside the tasks list, define exactly 3 new enhancements per section with:
    1. A unique number (e.g., 1.1, 1.2, 1.3).
    2. A clear, specific description of the functional change.
    3. A status (initially set to [TODO]).
  • Present this plan to the user in your final summary response.

2. Trigger "n", "next", or "n{x}"

If the user types "n", "next", "n{x}" (where {x} is a positive integer), or requests execution of the next enhancement task(s):

  • Read /plans/next-enhancements.md to check the status of tasks.
  • If all tasks are [DONE] (or none are [TODO]), automatically run the "e" / "enhance" workflow first.
  • Otherwise, select the most impactful [TODO] task(s) by strategic value, functional impact, or UX contribution — not just the first in order. If {x} is given, select the top {x} tasks and execute them sequentially.

2a. Clarify before building ("Grill Me" step)

Before implementing a task, check whether its scope or acceptance criteria are genuinely ambiguous (multiple valid interpretations, unspecified UI/data behavior, no clear "done" condition). If so:

  • Ask clarifying questions one at a time until the task is unambiguous — use your tool's native mechanism (e.g. Claude Code's AskUserQuestion) where available, otherwise ask inline and wait for the answer before continuing.
  • Record the resolved acceptance criteria as a short 1-3 line note next to the task entry in /plans/next-enhancements.md before writing any code.
  • Skip this step entirely when the task is already unambiguous — don't grill the user on obvious work.

2b. TDD Workflow (Test First)

  • Write Tests First: Before implementing the actual feature code for a task, write automated tests defining the expected behavior.

  • Iterate Until Green: Run the tests to confirm they fail, then write the implementation until all tests pass perfectly.

  • Browser Testing: If the enhancement involves web UI or visual components, use browser tools (e.g., Chrome) to test the app visually and functionally if necessary.

  • Implement the selected task(s) fully in the codebase, applying the relevant role(s) from SKILLS.md (Architect, Backend, Frontend, QA, Hardware/Compatibility).

  • Once complete:

    1. Update the task's status in /plans/next-enhancements.md to [DONE].
    2. Document the new/updated feature in /docs/feature-list.md under the right section heading.
    3. Create an Iteration Log: Perform a code review and audit of the tasks just completed. Document this audit in /docs/iteration-log.md (or append to it) to ensure all functions work perfectly.
  • Verify build integrity — this is not just "it compiles and runs":

    • QA pass: exercise the golden path and edge cases; run/extend automated tests.
    • Hardware/Compatibility pass: check cross-platform, cross-browser, and resource (memory/CPU) assumptions per SKILLS.md.
  • In your final response, state which task(s) were completed and the exact menu/navigation path to see the new feature.

3. File Size, Refactoring & SOLID Rules

  • SOLID Principles: Always design, implement, and refactor code adhering to SOLID programming principles (Single Responsibility, Open/Closed, Liskov Substitution, Interface Segregation, Dependency Inversion). This ensures code is modular, testable, and maintainable.
  • 256-line threshold: any code/script file — new, modified, or pre-existing — that exceeds 256 lines of code must be split into smaller, modular, logical files. This is a repo-wide rule, not just for new work; if you touch a file over the threshold, split it as part of that change.
  • Why: an agent reading a file spends its context budget parsing it before it can reason about the task. Small, single-purpose files keep that cost low and keep the agent's understanding accurate (see the "smart zone / dumb zone" problem — models reason worse as context fills up).
  • This applies to AGENTS.md, CLAUDE.md, and SKILLS.md too: keep each under ~250 lines. Push detail into linked docs (docs/) rather than growing the root files.

4. Roles

Every implementation task should be viewed through the lens of the relevant role(s) defined in SKILLS.md: Software Architect, Backend Engineer, Frontend Engineer, QA/Test Engineer, and Hardware & Performance Compatibility Reviewer. A single agent plays all roles in sequence unless the harness supports spawning role-specific subagents (see CLAUDE.md).

5. Mockup Data & Demo/Live Mode

  • Store all mock/sample data in /data/mockup/ — keep it separate from UI components and styling.
  • Provide a mock API layer that reads from /data/mockup/ and mirrors the real backend contract.
  • Add a switcher control (icon) in the UI to toggle Demo (mock API + mock data) and Live (real API + real data).

6. Cloud vs Local (On-Premise)

  • Provide a setting to choose Cloud or Local (on-premise) deployment.
  • Cloud: use remote/cloud-hosted API endpoints and services.
  • Local: use on-premise/self-hosted API endpoints and services.
  • Persist the selection and route all backend/service calls to the chosen environment.

7. Ad-hoc Feature Requests

For direct feature requests not using "e"/"n", implement the feature and document it in /docs/feature-list.md.

Adaptation Notes (this project)

Recorded 2026-07-08, from adopting this kit into the existing app-pfm-ocr-v2 repo.

  • Tech stack: Flutter mobile app at the repo root (lib/) is the field client; backend/ runs a Next.js API gateway + Python PaddleOCR/vLLM OCR pipeline + Postgres. See root CLAUDE.md and backend/CLAUDE.md for full architecture.
  • Real commands: flutter test, flutter analyze lib, flutter build apk --release (Flutter, repo root); npm run dev/build/lint inside backend/pfm-web-app (Next.js) — see backend/CLAUDE.md for the OCR accuracy regression harness and the uv/vLLM Python service commands. There is no single unified test runner across both halves; Flutter and backend are tested independently.
  • Real module boundaries (seeded into plans/next-enhancements.md): Flutter — Auth & Splash, Camera Capture & Geotagging, Pending Documents Queue, Document Editor & PDF Receipt; Backend — Next.js API Gateway, OCR Pipeline & Accuracy, Postgres Data Layer, DevOps/Docker & Dev Tunnel.
  • Scope correction (2026-07-08, later same day): an early e/enhance run seeded and executed against the four Backend sections above (5-8) before the Scope: excludes backend/ rule at the top of this file was written. Those sections were first frozen as archival, then removed outright from plans/next-enhancements.md (2026-07-08) once backend/ got its own independent kit copy — the already-shipped 7.1 DB-transaction fix stays recorded in docs/feature-list.md, but the task itself no longer has an entry in this file's plan. plans/next-enhancements.md now tracks only the Flutter sections (1-4). Backend enhancement tracking lives entirely in backend/'s own copy of this kit (backend/plans/next-enhancements.md, driven by backend/AGENTS.md Part B).
  • Pre-existing files over the 256-line threshold (§3 debt, not a blocker — split only if/when touched going forward), Flutter only now that backend/ is out of scope for this kit (see §Scope above; backend's own debt list, re-verified 2026-07-08, lives in backend/AGENTS.md's Adaptation Notes instead): lib/features/camera/image_preview_screen.dart (380), lib/features/camera/camera_screen.dart (376). (editor_screen.dart was split 2026-07-10 when task 6.3 touched it — see root plans/next-enhancements.md §6.3 and docs/iteration-log.md; documents_screen.dart and pending_documents_provider.dart were already split down by earlier iterations and are no longer over threshold — this line was stale.)
  • No Demo/Live or Cloud/Local switch exists yet (§5, §6). The closest existing analogue is AppConfig.initializeApiBaseUrl() in lib/config/app_config.dart, which dynamically resolves a real backend endpoint (ngrok tunnel, falling back to a LAN IP) — it always talks to the live backend with real data, never mock data, so it is not a Demo/Live switch. Building an actual mock-data Demo mode and a Cloud/Local deployment switch remain open n/next work, not something this adoption pass implemented.
  • Naming collision to watch for: docker-compose.demo.yml at the repo root already uses "demo" for an unrelated concept — a production-mode Compose override (npm start instead of npm run dev), not a mock-data mode. Don't conflate it with §5's Demo/Live data switch when that feature is eventually built.
  • Pre-existing, unrelated governance files left as-is (not part of this kit, not touched by this adoption):
    • .agents/AGENTS.md — a short set of OCR post-processing/parsing rules (table column-shift correction, date normalization). Different purpose and path from this kit's root AGENTS.md; both coexist.
    • plans/next-enhancement-plan.md (singular) — a pre-existing, fully [DONE] QA verification checklist auto-managed by "QE guidelines," unrelated to the e/n workflow's plans/next-enhancements.md (plural, added by this kit). Kept side by side, not merged or migrated.
  • CLAUDE.md: the repo already had a substantial project-specific root CLAUDE.md. Per this section's "merge additively" rule, this kit's import and Claude-specific notes were appended as a new, clearly-marked section rather than replacing the file.