# 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:** `` (header right side) โ e.g., Help, AI Suggest - **Command bar:** `` โ e.g., Save, Reset, Approve buttons - **Status info:** `` โ e.g., Watermark, Owner, System status **Design Principle: Maximize Screen Real Estate** - Footers waste ~48-64px of viewport height (non-recoverable on mobile) - Single-screen principle: ALL controls must be visible without scrolling - Mobile UX: bottom footer is hardest to reach (thumb-friendly zone = top 60%, sides) - Information density: header/command-bar/summary can convey all necessary context - Content-first: Every pixel should serve user goal, not chrome **Example Migration:** ```vue