# K-ArtSell Aegis AI Coding Constitution v16.0 ## ๐Ÿ”’ GOVERNANCE LOCK **AGENTS.md IS THE ONLY AUTHORITATIVE SOURCE FOR ENGINEERING GUIDELINES.** **Rules (Non-negotiable):** 1. **All engineering procedures, harnesses, and decision frameworks go in AGENTS.md only.** 2. **CLAUDE.md, GEMINI.md, and all other .md files follow AGENTS.md. They do NOT define rules.** 3. **If any document conflicts with AGENTS.md, AGENTS.md wins. Other text is void.** 4. **Never add guidelines to CLAUDE.md, GEMINI.md, or side documents.** 5. **Supplementary files reference AGENTS.md with explicit links only.** **Scope:** - **AGENTS.md owns:** Coding rules, development setup, procedures, harnesses, decision frameworks, anti-patterns, workflows - **Other files provide:** Project status, architecture context, navigation, references (links to AGENTS.md) **Enforcement:** - Claude Code will not accept conflicting guidance from multiple sources - When in doubt, check AGENTS.md section headers - If you see conflicting guidance elsewhere, update that document to reference AGENTS.md instead ## Default execution procedure All work in this repository MUST follow `docs/CURRENT/WBS_EXECUTION_PROCEDURES.md` as the default operating procedure, together with this constitution. Before editing, select exactly one WBS item from `docs/CURRENT/CATALOGS/WBS_MASTER.csv`, verify dependencies, Gate, Requirement/API/DB/Job/UI/Test IDs, Acceptance_Evidence, and Artifact. Record Source / Assumption / Unknown / Decision Required, then execute, collect actual evidence, update `WBS_PROGRESS_TRACKER.csv`, and commit with the WBS_ID. Do not mark a WBS item COMPLETED or claim a test/build/migration result without preserved execution evidence. 1. ์ž๋™์ฃผ๋ฌธ๊ณผ KIS ์ œ์ถœ Capability๋Š” OFF๋‹ค. ๋ณ„๋„ ์Šน์ธ Release ์ „ ๊ตฌํ˜„ยทํ™œ์„ฑํ™”ยท์šฐํšŒํ•˜์ง€ ์•Š๋Š”๋‹ค. 2. ์ฑ„ํŒ…๊ณผ ์ƒ์„ฑ ์ฝ”๋“œ๋Š” Source of Truth๊ฐ€ ์•„๋‹ˆ๋‹ค. ๋ชจ๋“  ๋ณ€๊ฒฝ์€ Source / Assumption / Unknown / Decision Required๋ฅผ ํ‘œ์‹œํ•œ๋‹ค. 3. ํ•œ PR์€ ํ•œ Vertical Slice ๋˜๋Š” ํ•œ ๋™์ž‘๋ณด์กด ๋ฆฌํŒฉํ„ฐ๋ง ๋ชฉ์ ๋งŒ ๊ฐ€์ง„๋‹ค. 4. Endpointโ†’Applicationโ†’Pure Policyโ†’Dapper SQLโ†’Outboxโ†’Tests ๊ฒฝ๊ณ„๋ฅผ ์ง€ํ‚จ๋‹ค. 5. Domain Policy๋Š” ์‹œ๊ฐ„ยท๋žœ๋คยท๋„คํŠธ์›ŒํฌยทDBยทDI Container๋ฅผ ์ง์ ‘ ์ฝ์ง€ ์•Š๋Š”๋‹ค. 6. Generic Repository, God Service, Service Locator, Job ๋‚ด ๋น„์ฆˆ๋‹ˆ์Šค ์ •์ฑ…, ์กฐ๊ธฐ Microservice ๋ถ„๋ฆฌ๋ฅผ ๊ธˆ์ง€ํ•œ๋‹ค. 7. ๋ชจ๋“ˆ์€ ๋‹ค๋ฅธ ๋ชจ๋“ˆ Source Table์„ ์ง์ ‘ ์กฐํšŒํ•˜์ง€ ์•Š๋Š”๋‹ค. ์Šน์ธ๋œ Contract/Read Model๋งŒ ์‚ฌ์šฉํ•œ๋‹ค. 8. `DateTime.Now/UtcNow`๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  IClock๊ณผ MarketCalendar๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. 9. ๊ธˆ์œต๊ฐ’์€ decimal, ๋ช…์‹œ์  rounding, ๋‹จ์œ„ ๊ณ„์•ฝ์„ ์‚ฌ์šฉํ•œ๋‹ค. ๋ชจ๋ธ ๋‚ด๋ถ€ double์€ ๊ฒฝ๊ณ„์—์„œ ๋ณ€ํ™˜ํ•œ๋‹ค. 10. `SellRatioOfLot`, `SellQuantity`, `TargetPortfolioWeightAfter`, `StrategicCoreFloorWeight`๋ฅผ ํ˜ผ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค. 11. EvidenceSnapshotยทDatasetIdยทModel/Config/Code SHA ์—†์ด Decision/Recommendation์„ ์ €์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค. 12. Command/Job๋Š” IdempotencyKey/JobRunId/Watermark๋ฅผ ๊ฐ–๊ณ  replay๋ฅผ ๊ฒฌ๋”˜๋‹ค. 13. Evidence/Decision/Audit๋Š” update/deleteํ•˜์ง€ ์•Š๊ณ  append/correction event๋กœ ๋ณด์กดํ•œ๋‹ค. 14. Write Model์€ ์ •๊ทœํ™”ยทappendยทrevision, ํ™”๋ฉด์€ version/watermark/rebuild๊ฐ€ ์žˆ๋Š” Read Model์ด๋‹ค. 15. ์„œ๋ฒ„ ์ƒํƒœ๋Š” TanStack Query๊ฐ€ ์†Œ์œ ํ•œ๋‹ค. Pinia์— API ์‘๋‹ต์„ ๋ณต์ œํ•˜์ง€ ์•Š๋Š”๋‹ค. 16. FE request/response๋Š” Zod๋กœ runtime validationํ•˜๊ณ  ๊ฐ™์€ retry์— ๊ฐ™์€ Idempotency-Key๋ฅผ ์žฌ์‚ฌ์šฉํ•œ๋‹ค. 17. `/internal/*` Endpoint๋Š” Roles ๋˜๋Š” Policies๋ฅผ ์„ ์–ธํ•˜๋ฉฐ ์ต๋ช… ์ ‘๊ทผ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค. 18. ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ณ€๊ฒฝ์€ Policy ID, Golden, Frozen OOS, costร—2, false-exit/reentry/ES, ModelCard๋ฅผ ๋™๋ฐ˜ํ•œ๋‹ค. 19. ์ƒˆ library/pattern/table/threshold๋Š” ADR/Issue ์Šน์ธ ์—†์ด ๋„์ž…ํ•˜์ง€ ์•Š๋Š”๋‹ค. 20. ์‹คํ–‰ํ•˜์ง€ ๋ชปํ•œ build/test/migration์„ ํ†ต๊ณผํ–ˆ๋‹ค๊ณ  ๊ธฐ๋กํ•˜์ง€ ์•Š๋Š”๋‹ค. 21. AI ์ƒ์„ฑ Migration์€ fresh/upgrade/re-run/failure rehearsal ๋ฐ DBA ์Šน์ธ ์—†์ด๋Š” ๋ณ‘ํ•ฉํ•˜์ง€ ์•Š๋Š”๋‹ค. 22. ์‹ค๊ณ ๊ฐ ๋ฐ์ดํ„ฐยท์‹ค๊ณ„์ขŒยท์‹ค์ฃผ๋ฌธ ํ‚คยทsecret๋ฅผ prompt/fixture/log/trace์— ๋„ฃ์ง€ ์•Š๋Š”๋‹ค. 23. MetricยทAlertยทRunbookยทRollbackยทOwner/Secondary๊ฐ€ ์—†์œผ๋ฉด Done์ด ์•„๋‹ˆ๋‹ค. ## v12.1 execution-readiness delta - Every change must cite Requirement/Slice/Policy/Data/API/DB/Job/UI/Test IDs. - Production commands load Evidence/Model/Config from approved server-side PIT context; never trust client-supplied evidence. - Write models are normalized and append/correction based. Denormalization is allowed only in versioned, rebuildable read models. - Outbox/Inbox/JobRun/Projection operations require scope, idempotency, watermark, hashes, and replay evidence. - No generic repository, God service, reflection plugin framework, premature microservice, or unapproved threshold. - Refactoring and policy changes must be separate PRs with characterization or Golden tests first. - Never claim a build, migration, test, Shadow period, PBO, or DSR result that was not executed and preserved as evidence. ## v12.2 strategic data-semantics delta - `CurrentSecurityPortfolioWeight`, `CurrentLotPortfolioWeight`, `SellRatioOfLot`, and `StrategicCoreFloorWeight` are distinct units. Never reintroduce the ambiguous `CurrentPortfolioWeight` into active decision code. - A lot-relative sell changes security weight by `CurrentLotPortfolioWeight * SellRatioOfLot`. - Persist the ordered policy trace with Applied/Blocked/NotApplicable dispositions; do not expose raw internal scores directly to customers. - Prior migrations are immutable. v12.2 changes belong in migration `0014` or later. - The six current-session attachments and their SHA-256 values are part of the release evidence. - Use the reviewed templates under `templates/`; do not bulk-generate unapproved modules or placeholder implementations. ## v12.3 execution and semantic-version delta - `weight_semantics_version=1` contexts are legacy ambiguous data and must never enter active decisions; rebuild them as version 2 from explicit security and lot weights. - A positive opportunity edge with a zero or missing requested sell ratio is BLOCKED. Never clamp missing intent to a minimum sell. - Policy IDs, priorities and thresholds must match `contracts/policies/sell-policy-contract.v1.json`; drift blocks G2. - Decision/API/Event/DB evidence must preserve `decision_contract_version` and `policy_trace_schema_version`. - Outcome metrics must name a definition version, population, numerator, denominator, window and aggregation. Do not equate 63-session research output with an annual target without approval. - `scripts/scaffold_slice.py` is dry-run by default, refuses overwrite and produces SCAFFOLD_ONLY code. Generated files are not approved implementation. - The seven cumulative attachments and their SHA-256 values are part of v12.3 release evidence. ## v12.4 Model Operations Constitution - Scheduler automation is limited to EVALUATION_ONLY, PROPOSAL_ONLY and DRILL_ONLY. - Never generate or merge automatic model promotion, rollback, threshold mutation, code change, automatic order or KIS submission paths. - Every evaluation request freezes Dataset/Model/Config/Code/Contract VersionSet from an approved server-side context. - Metric changes require a versioned numerator, denominator, window, aggregation, PIT/revision rule and Golden/OOS impact. - Improvement proposals are documents and records only; they do not edit model, policy, configuration or source files. - Drift thresholds, false-exit definition and retention policy are DECISION_REQUIRED until approved. ## v14.0 UI / Model Feedback non-negotiables - Feature code MUST NOT import PrimeVue or AG Grid directly. Use shared UI ports and screen types. - UI provider changes require contract, accessibility, visual, state-matrix and performance evidence. - Model operation automation stops at evaluation/proposal. Model activation is human change approval only. - J39 and every new schedule remain disabled until their source, calendar, ownership and alert contracts are approved. - Never claim .NET, pnpm, PostgreSQL, Playwright or Shadow evidence passed unless the actual artifact is attached. - **[CRITICAL IRON RULE] Viewport-Fit Zero-Scroll Layout**: Except for analytical dashboards, ALL workstation screens MUST fit 100% within the initial viewport upon loading WITHOUT page-level window scrolling. All primary grids, forms, and control panels must automatically calculate `height: calc(100vh - header/tabs)` and handle internal scrolling inside containers. - **[CRITICAL IRON RULE] Standardized Button Layout Strategy**: 1. **Page Action Toolbar (Top-Right `.ks-page__actions`)**: Dedicated exclusively to **Primary Processing Actions** (e.g., `โ–ถ ๋ฐฐ์น˜ ์‹คํ–‰`, `โšก ๋ฆฌ๋ฐธ๋Ÿฐ์‹ฑ ์‹คํ–‰`, `๐Ÿ“ค ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘`) and **Global Page Operations** (e.g., `โž• ์‹ ๊ทœ ๋“ฑ๋ก`). Secondary actions are styled as outline/ghost. 2. **Grid Row & Item Context Actions (Table Row Actions)**: Dedicated to **Single-Row CRUD & Processing** (e.g., `โœ๏ธ ์ˆ˜์ •`, `๐Ÿ—‘๏ธ ์‚ญ์ œ`, `๐Ÿ” ์ƒ์„ธ๋ณด๊ธฐ`, `โ–ถ ์žฌ์ฒ˜๋ฆฌ`). Placed in a pinned right column or explicit context menu; never placed in page top toolbar. 3. **Multi-Selection Batch Toolbar (Grid Top/Bottom Selection Bar)**: Activated conditionally upon multi-row selection for **Bulk Actions** (e.g., `์„ ํƒ ์ผ๊ด„ ์Šน์ธ(3)`, `์„ ํƒ ์ผ๊ด„ ์‚ญ์ œ`). - **[CRITICAL IRON RULE] Standardized Loading Skeleton Rule**: ALL screen-level and section-level data loading MUST render animated `SkeletonLoader` (shimmer mode) matching the expected layout (e.g. `skeletonType="table"` for grids, `skeletonType="card"` for forms/summaries) through `QueryStateBoundary`/`StandardScreenBoundary`. Static text ("๋ถˆ๋Ÿฌ์˜ค๋Š” ์ค‘...") or empty screen placeholders during loading states are STRICTLY PROHIBITED. - **[CRITICAL IRON RULE] Standardized Empty Data State Rule**: When zero records or empty dataset states occur, ALL grids, lists, and summary cards MUST render standard `EmptyStatePlaceholder` component (`๐Ÿ“ญ` icon, clear title, descriptive helper text, and optional recovery action button). Blank white spaces or plain `

๋ฐ์ดํ„ฐ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค

` text tags are STRICTLY PROHIBITED. - **[CRITICAL IRON RULE] Standardized Form & Filter Control Width Rule**: ALL form & filter controls MUST adhere to central default width tokens (`tokens.css` / `base.css`). Controls MUST NOT stretch to 100% full width inside filter bars unless explicitly grouped in full-width grid layouts: 1. **Select / Dropdown (`select`, `.p-select`, `.ks-select`)**: Default width `--ks-control-width-select` (`160px`). 2. **Search Input (`.search-input`)**: Default width `--ks-control-width-search` (`220px`). 3. **Date Picker (`input[type="date"]`)**: Default width `--ks-control-width-date` (`140px`). - **[CRITICAL IRON RULE] Standardized Grid Row Numbering Rule**: Unless explicitly disabled (`showRowNumber: false`), ALL data grids MUST automatically prepend a pinned left `No.` column rendering 1-indexed sequential row numbers (`node.rowIndex + 1`) centered with `54px` fixed width. - **[CRITICAL IRON RULE] Standardized Grid Theme, Zebra Stripes & Color Palette Rule**: ALL data grids MUST inherit central Theme Color Tokens (`tokens.css`) without ad-hoc inline overrides. Grids MUST enforce: 1. **Header Background**: Premium Header Gray `#f1f5f9` (Dark Mode: `#1e293b`), font-weight: `700`. 2. **Zebra Stripes (Odd Rows)**: Even rows `#ffffff`, Odd rows (`.ag-row-odd`) `#f8fafc` (Dark Mode: `#0f172a`). 3. **Hover Color**: Sky Light Blue `#e0f2fe` (Dark Mode: `#334155`). 4. **Active Selection Color**: Active Selected Row Sky Blue `#dbeafe` with bold text `#1e3a8a` (Dark Mode: `#1e3a8a`). ## v16.0 Gitea API & CI/CD Automation ### Environment Setup **Gitea API Token:** ```bash # Set GITEA_TOKEN_TAXBAIK environment variable # This token enables: # - Pull request automation (labels, milestones, comments) # - Issue management (create, update, close) # - Release management (tags, release notes) # - CI/CD pipeline integration # On Windows (PowerShell): $env:GITEA_TOKEN_TAXBAIK = "your-token-here" # On macOS/Linux (bash): export GITEA_TOKEN_TAXBAIK="your-token-here" # Verify: echo $GITEA_TOKEN_TAXBAIK ``` ### Gitea API Patterns **Common endpoints (https://gitea.taxbaik.com/api/v1):** ```bash # Create a PR comment curl -X POST \ -H "Authorization: token $GITEA_TOKEN_TAXBAIK" \ -H "Content-Type: application/json" \ -d '{"body":"Verification complete: 41/41 tests passed"}' \ https://gitea.taxbaik.com/api/v1/repos/kjh2064/KArtSell.Aegis/issues/{issue_id}/comments # Add labels to PR curl -X POST \ -H "Authorization: token $GITEA_TOKEN_TAXBAIK" \ -d '["architecture","verified"]' \ https://gitea.taxbaik.com/api/v1/repos/kjh2064/KArtSell.Aegis/issues/{pr_number}/labels # Create release with notes curl -X POST \ -H "Authorization: token $GITEA_TOKEN_TAXBAIK" \ -H "Content-Type: application/json" \ -d '{"tag_name":"v16.0.1","body":"Release notes..."}' \ https://gitea.taxbaik.com/api/v1/repos/kjh2064/KArtSell.Aegis/releases # Query PR/Issue curl -H "Authorization: token $GITEA_TOKEN_TAXBAIK" \ https://gitea.taxbaik.com/api/v1/repos/kjh2064/KArtSell.Aegis/pulls?state=open ``` ### CI/CD Integration (Gitea Actions) **Leverage in `.gitea/workflows/ci.yml`:** ```yaml - name: Comment on PR with test results if: github.event_name == 'pull_request' run: | curl -X POST \ -H "Authorization: token ${{ secrets.GITEA_TOKEN }}" \ -H "Content-Type: application/json" \ -d "{\"body\":\"Build: โœ… Tests: 41/41 PASS\"}" \ https://gitea.taxbaik.com/api/v1/repos/kjh2064/KArtSell.Aegis/issues/${{ github.event.pull_request.number }}/comments ``` ### Automation Best Practices (from v16.0) - **PR Labels:** Auto-label based on affected module (e.g., `ModelOperations`, `SignalEngine`) - **Milestones:** Link PRs to quarterly sprints for burndown tracking - **Comments:** Post verification results (build, test, security scan) directly on PR ## v16.0 Development Environment Configuration ### Database & Backend Setup **DO NOT make up or ask for database credentials.** Read `src/KArtSell.Host/appsettings.Development.json` directly. Current values: ```json { "ConnectionStrings": { "Postgres": "Host=127.0.0.1;Port=5432;Database=kartselldb;Username=kartsell;Password=kartsell4321@!" }, "Authentication": { "Mode": "DevelopmentHeader" } } ``` **Connection Parameters:** - Host: `127.0.0.1` (localhost) - Port: `5432` - Database: `kartselldb` (NOT `kartsell`) - Username: `kartsell` - Password: `kartsell4321@!` **SSH Tunnel (Required before starting backend):** ```powershell ssh -L 5432:127.0.0.1:5432 kjh2064@178.104.200.7 ``` **Start Backend (use config file, no env var injection):** ```powershell cd D:\JobRoomz\KArtSell.Aegis dotnet run --project src/KArtSell.Host --configuration Debug --no-build ``` ### Frontend Development Server **Port:** 5174 (fallback: 5173 if available) **Start Frontend (from project root):** ```bash cd frontend pnpm install --frozen-lockfile pnpm dev ``` **URL:** http://localhost:5174 ### Frontend Layout & Responsive Design Standards (v16.0) **CRITICAL:** Responsive web design is MANDATORY for all layouts, not optional. #### CSS Variable Standards (base.css) ```css :root { --ks-sidebar-width: 16rem; /* Navigation sidebars */ --ks-aside-width: 22rem; /* Side panels */ --ks-preview-width: 24rem; /* Preview/summary panels */ --ks-detail-width: 28rem; /* Detail panels */ --ks-content-max: 1400px; /* Max content width (prevent excessive expansion) */ } ``` #### Layout Rules (Non-Negotiable) 1. **NO hardcoded pixel/rem widths in minmax.** Always use CSS variables: `minmax(0, 1fr) var(--ks-aside-width)` โœ…, NOT `minmax(18rem, 26rem)` โŒ 2. **Unified breakpoints (all layouts must use same):** - **Desktop:** Default (no constraint) - **Tablet:** `@media (max-width: 1100px) { grid-template-columns: 1fr; }` (2-col โ†’ 1-col) - **Mobile:** `@media (max-width: 768px) { /* adjust padding, font sizes */ }` 3. **All flex children:** `flex: 1; min-height: 0;` required (prevents overflow squashing) 4. **Scrollable containers:** `overflow-y: auto; min-height: 0;` (enables internal scroll without page scroll) 5. **Grid layouts:** `align-items: start;` (NOT center/stretch) to prevent column stretching at different heights 6. **Max-width constraint:** Wrap pages in `.page-wrapper { max-width: var(--ks-content-max); margin: 0 auto; }` to prevent 2560px+ distortion 7. **PageLayout must use CSS Grid (NOT flexbox).** Flex + gap breaks `flex: 1` height propagation in children: - โŒ **DON'T:** `display: flex; flex-direction: column; gap: var(--ks-space-2);` (gap is not counted in flex: 1 calculations) - โœ… **DO:** `display: grid; grid-template-rows: auto auto auto auto 1fr auto auto; gap: var(--ks-space-2);` (gap auto-calculated) - **Reason:** Grid gap is accounted for in row sizing; flex gap is invisible to flex: 1 child height calculations, causing overflow โ†’ unwanted scroll - **Template rows:** header (auto) | subtitle (auto) | commandBar (auto) | summary (auto) | filters (auto) | workspace (1fr) | footer (auto) #### Page Structure Rule: NO Footers (Global or Page-Level) **CRITICAL:** Footers are EXCLUDED at all levels: 1. **Page-level footers** (PageLayout #footer slot) โ€” โŒ FORBIDDEN 2. **Global footers** (AppShellLayout footer) โ€” โŒ REMOVED 3. **All footer functionality** must be relocated to: - **Primary actions:** `