# AGENTS.md - VBA Coding Constraints

## Project Overview
- **Project Name**: Commuter Allowance Editor
- **App**: Excel 2021
- **Purpose**: Edit commuter certification by referencing master data

## VBA Coding Constraints
### Naming Conventions
- **Module**: `mod[Domain][Action]` (e.g., `modReportGenerator`, `modDataValidation`)
- **Class Module**: `cls[Noun]` (e.g., `clsInvoiceParser`, `clsDbConnection`)
- **Public Procedure**: PascalCase (e.g., `GenerateMonthlyReport`)
- **Private Procedure**: camelCase with prefix (e.g., `parseRawData`, `validateInput`)
- **Constant**: `UPPER_SNAKE_CASE` with scope prefix (e.g., `PUB_MAX_RETRY_COUNT`, `PRV_DEFAULT_PATH`)
- **Variable**: Hungarian or semantic naming, but **must be consistent across the project**

### Mandatory Rules
- ✅ Every module must start with `Option Explicit`
- ✅ All Public procedures must have a comment header (description, params, return value, author, date)
- ✅ **没有用户明确允许，不许修改任何代码，不许回滚代码。用户给代码才能写进去。**
- ✅ **用户骂我、发情绪时，也不许回滚代码。**
- ✅ `On Error Resume Next` is completely forbidden. Missing sheet/object should raise error directly via `Err.Raise ERR_SHEET_MISSING`. Do not suppress errors when checking if a sheet/worksheet/object exists.
- ✅ Object variables must be explicitly `Set obj = Nothing` in `Finally` block or at end of procedure
- ✅ Long operations must disable `ScreenUpdating`, `Calculation`, `EnableEvents` and restore on exit
- ✅ Comments must be in **English only**. No Chinese, Japanese, or Korean characters allowed in any code comments or inline documentation
- ❌ Forbidden: `Select` / `Selection` / `ActiveCell`. Always reference Range/Worksheet objects directly
- ❌ Forbidden: hardcoded file paths or connection strings. Use config sheet or constants module
- ❌ Forbidden: non-English comments (Chinese / Japanese / Korean)

### Code Review Checklist

**Before editing**
- Read the entire function from first line to last line (not just the lines you plan to change)
- Find all call sites that reference the function or data structure you are about to modify

**After editing**
- Read the entire function from first line to last line again
- Verify: are all variables declared, are scopes correct, is the logic complete
- Go through every call site one by one to confirm compatibility

**When the user asks "Are you sure?"**
- Actually re-read the relevant code instead of saying "looks fine"
- grep all references and verify them one by one

**Key principle**
- Never skip context — do not look at only the diff and call it done
- The compiler cannot catch logic errors or missing variable declarations — only human review can
- Read the whole function, read all call sites — no exceptions

## Design Document

**Primary reference**: `documents/Tukin_Design_Document.md`

Before editing any sheet class or cache logic, **read the design document first**. It contains:
- Sheet column layouts with HeaderRow/StartRow/StartCol/EndCol per `RefreshSheetDict`
- Cache key/value structures for every CACHE_* constant
- Data flow diagrams for C1 editing cascade and CSV import
- Column layout reference (C1 has 58 columns, C to BG)
- All known issues and their fix status

**Rule**: Do not guess sheet layout or cache structure. Look it up in the design document.

**When cache structure is modified**: Update the design document accordingly — including CACHE_* constant table, cache architecture section, and any affected data flow diagrams.

vba/
  AGENTS.md, README.md, .gitignore, LICENSE
  通勤手当テンプレート2026xxxx.xlsm  (latest date version)
  data/                     CSV master data (14 files)
  documents/                design docs
    Tukin_Design_Document.md  — master design doc: sheet layouts, cache architecture, column reference, data flow
    checklist-2026-05-27.md  — audit checklist (historical)
  sql/                      DB definitions (4 files)
  src/sh/
    juk/                    address module
      init_module/Import_modules.bas
      module/Common_Button.bas
    tuk/                    commuter module
      init_module/
        Import_modules.bas
        Test_Cache.bas
      module/
        Common_Button.bas (306 lines)
        Common_Constants.bas
        Common_File_Utils.bas (347 lines)
        Common_Functions.bas (486 lines)
        Common_Global_Cache.bas (586 lines)
        Common_Selector.bas (161 lines)
        Common_Shape.bas
      sheet/                 sheet classes (13 files)
        C1.cls (846 lines) - commuter allowance editor
        M1.cls (167 lines) - section master
        M2.cls (400 lines) - section detail master
        O1.cls (5 lines) - address master
        O2.cls (6 lines) - sender master (507)
        O3.cls (61 lines) - (220) notification reason
        T1.cls (54 lines) - commutation pass master
        T2.cls (114 lines) - ticket master
        T3.cls (74 lines) - master 246
        Z1.cls (64 lines) - transport master (222)
        Z2.cls (54 lines) - decision master (223)
        Z3.cls (57 lines) - monthly amount decision master (224)
        Z4.cls - (221) route station name

Sheet class prefixes: C=commuter editing, M=section master, O=other, T=commuter route, Z=master config