Files
hcie-rust-v3.05/AGENTS.md
T

350 lines
21 KiB
Markdown
Raw Normal View History

# HCIE-Rust v3.05 — AI-Aware Architecture
2026-07-09 02:59:53 +03:00
## Mission Statement
HCIE-Rust v3.05 is a pixel-grade image editor built around an atomic project split that prevents automated agents from corrupting the engine while still allowing them to iterate on the graphical user interface. The active native GUI is the **Iced** workspace (`hcie-iced-app/`). The `hcie-egui-app/` workspace is legacy/frozen — do not modify it for new features.
2026-07-09 02:59:53 +03:00
## Atomic Crate Split (23 crates / 6 layers)
### Layer 1: DATA — locked, agents must not modify
| Crate | Responsibility | Dependencies |
|-------|----------------|--------------|
| `hcie-protocol` | Pure data structures and enumerations. Zero logic. | `serde` |
| `hcie-color` | Color conversions, gamma encode/decode, HSL/Lab. | `hcie-protocol` |
### Layer 2: ENGINE CORE — locked, agents must not modify
| Crate | Responsibility | Dependencies |
|-------|----------------|--------------|
| `hcie-blend` | 30+ blend mode implementations. | `hcie-protocol`, `hcie-color` |
| `hcie-history` | Closure-based undo/redo engine. | `hcie-protocol` |
| `hcie-brush-engine` | Brush mathematics, tip generation, pressure mapping. | `hcie-protocol` |
| `hcie-draw` | Pixel drawing: lines, rectangles, ellipses, strokes, flood fill. | `hcie-protocol`, `hcie-blend`, `hcie-brush-engine` |
| `hcie-composite` | Layer compositing and pixel output. | `hcie-protocol`, `hcie-blend` |
| `hcie-filter` | Image filters. | `hcie-protocol`, `hcie-blend` |
| `hcie-selection` | Selection mask operations: grow, shrink, feather, invert. | `hcie-protocol` |
| `hcie-text` | Vector text rendering via `fontdue`. | `hcie-protocol`, `fontdue` |
| `hcie-vector` | Vector shape engine. | `hcie-protocol` |
| `hcie-tile` | Sparse tile-based layer storage. | `hcie-protocol` |
| `hcie-io` | File I/O for PNG, JPG, WebP, PSD, KRA, HCIE native. | `hcie-protocol`, `image`, `zip`, `psd` |
### Layer 3: DOCUMENT — locked, agents must not modify
| Crate | Responsibility | Dependencies |
|-------|----------------|--------------|
| `hcie-document` | Document state: layers, active layer, dirty tracking, zoom. | `hcie-protocol`, `hcie-blend`, `hcie-history` |
### Layer 4: ENGINE API — locked, agents must not modify
| Crate | Output | Responsibility |
|-------|--------|----------------|
| `hcie-engine-api` | `staticlib` + `rlib` | Public API exposed to the GUI and AI/vision modules. Approximately 20 entry functions. |
### Layer 5: AI / VISION — locked, agents must not modify
These crates depend on `hcie-engine-api` and expose AI and vision features back through it.
| Crate | Responsibility | Dependencies |
|-------|----------------|--------------|
| `hcie-ai` | Ollama / LMStudio / OpenAI-compatible chat client, templates, AI actions. | `hcie-engine-api` |
| `hcie-vision` | ComfyUI pipelines, background removal, inpaint, super-resolution, smart selection. | `hcie-engine-api` |
### Layer 6: GUI — open, agents work here
One GUI workspace exists:
| Crate / Project | Directory | Responsibility | Dependencies |
|-----------------|-----------|----------------|--------------|
| `hcie-iced-app` | `hcie-iced-app/` | Workspace root for the native Iced GUI. | `hcie-engine-api`, `hcie-iced-gui`, panels |
| `hcie-iced-gui` | `hcie-iced-app/crates/hcie-iced-gui/` | Main binary and application orchestration. | `hcie-engine-api`, panels |
| `iced-panel-adapter` | `hcie-iced-app/crates/iced-panel-adapter/` | Dynamic schema-to-widget UI binder. | `hcie-engine-api` |
| `iced-panel-ai-chat` | `hcie-iced-app/crates/iced-panel-ai-chat/` | AI chat panel. | `hcie-engine-api`, `hcie-ai` |
| `iced-panel-script` | `hcie-iced-app/crates/iced-panel-script/` | Scripting / automation panel. | `hcie-engine-api` |
| `hcie-dry-media-brushes` | `hcie-iced-app/crates/hcie-dry-media-brushes/` | Dry-media brush presets (graphite, charcoal, pastel). | `hcie-engine-api` |
| `hcie-watercolor-brushes` | `hcie-iced-app/crates/hcie-watercolor-brushes/` | Watercolor brush presets. | `hcie-engine-api` |
| `hcie-ink-brushes` | `hcie-iced-app/crates/hcie-ink-brushes/` | Ink brush presets. | `hcie-engine-api` |
| `hcie-paint-brushes` | `hcie-iced-app/crates/hcie-paint-brushes/` | Paint brush presets. | `hcie-engine-api` |
| `hcie-digital-brushes` | `hcie-iced-app/crates/hcie-digital-brushes/` | Digital/vector brush presets. | `hcie-engine-api` |
2026-07-09 02:59:53 +03:00
## Critical Rules
1. **No direct GUI-to-engine bypass.** The GUI may not depend on or import `hcie-protocol`, `hcie-blend`, `hcie-document`, or any other engine crate directly. Use `hcie-engine-api` only.
2. **Engine API is the single entry point.** All engine operations go through `hcie-engine-api`. AI agents may not read or modify internal engine code.
3. **New feature = new file.** Prefer adding new files over editing existing ones; minimize changes to existing files.
4. **Engine library type.** `hcie-engine-api` is built as `crate-type = ["rlib", "staticlib"]`. The GUI links the `.a` / `.rlib` artifacts.
5. **Lock mechanism.** Engine crates are locked with `chmod 444` / directory `555` and owned by the `hcie-guard` user after build. Agents work only in the GUI layer.
## Build Order
```
Layer 1: hcie-protocol, hcie-color
Layer 2: hcie-blend, hcie-history, hcie-brush-engine, hcie-draw,
hcie-composite, hcie-filter, hcie-selection, hcie-text,
hcie-vector, hcie-tile, hcie-io, hcie-fx, hcie-psd, hcie-kra, hcie-native
Layer 3: hcie-document
Layer 4: hcie-engine-api (rlib + staticlib)
Layer 5: hcie-ai, hcie-vision
Layer 6: hcie-iced-app / hcie-iced-gui
2026-07-09 02:59:53 +03:00
```
## Performance Protection Notes (CRITICAL — Regression Prevention)
The engine optimizations below directly determine brush performance on 4K / multi-layer documents. Removing, disabling, or bypassing these mechanisms as a "temporary workaround" is forbidden. Before touching them, verify benefit by running:
```bash
cargo test -p hcie-engine-api --test visual_regression
cargo test -p hcie-engine-api --test performance_stroke_4k -- --nocapture
```
| Mechanism | Location | What it does | Why it is protected |
|-----------|----------|--------------|---------------------|
| `active_stroke_mask` pooling | `hcie-engine-api/src/lib.rs` | Keeps an approximately 8MB mask buffer alive between strokes. | Re-allocating the mask per stroke causes allocation pauses during continuous painting. |
| `composite_scratch` pooling | `hcie-engine-api/src/lib.rs` | Keeps an approximately 33MB composite scratch buffer alive between strokes. | Allocating and freeing the composite buffer on every `render_composite_region` call is expensive. |
| `below_cache` + `below_cache_dirty` | `hcie-engine-api/src/lib.rs` | Composites all layers below the active layer once at stroke start and reuses the result while the lower layers remain unchanged. | Re-compositing all layers on every stroke event costs milliseconds per event on 4K canvases. |
| Conditional `effects_dirty` set | `hcie-engine-api/src/lib.rs` | Triggers the effects pass only for layers that actually have effects or styles. | Avoids unnecessary 33MB buffer clones and repeated `apply_layer_effects` calls on unaffected layers. |
| Tile cache over-clear removal | `hcie-engine-api/src/lib.rs` | Does not clear `tile_layers` and re-tile all layers on opacity / visibility / blend / parent / move changes when layer pixels themselves did not change. | Keeps the tile cache valid and avoids redundant dense-to-tile copies. |
| Small-region sequential compositing | `hcie-composite/src/tiled.rs` | Uses a sequential loop instead of `par_chunks_exact_mut` for small dirty regions. | Rayon thread spawn overhead dominates the work when the dirty region is small. |
| Effects cache reuse | `hcie-composite/src/tiled.rs` | Skips `apply_layer_effects` when `layer.effects_cache` is already populated. | Prevents re-running the full effect pipeline on every partial composite. |
| Incremental tile update | `hcie-tile/src/lib.rs` | Updates only the tiles that intersect the dirty rectangle and writes only the changed sub-rectangle when a tile already exists. | Avoids throwing away the whole 33MB dense-to-tile copy on every small dirty region. |
| Vector stroke anti-aliasing density | `hcie-vector/src/lib.rs` | Keeps circle-overlap density high enough along vector strokes and ellipses so shapes do not look jagged/pixelated. | Reducing step counts makes circles, stars, polygons and rounded rectangles visibly tırtıklı. |
| `iced::widget::Shader` partial upload | `hcie-iced-gui` (`shader_canvas.rs`) | Keeps persistent `wgpu::Texture` on GPU, updating only dirty tile bounds (8KB vs 33MB) via `queue.write_texture()`. | Crucial for keeping 4K document panning, zooming, and drawing at 100+ FPS; going back to `ImageHandle::from_rgba` drops frame rate to 1 FPS. |
| `RefCell` dirty bounds accumulator | `hcie-iced-gui` (`app.rs`, `canvas/mod.rs`) | Unions dirty bounds of all Elm event loop updates in the frame and consumes/resets them inside `view()`. | Prevents frame-drop race conditions where multi-event frames throw away dirty regions, causing missing tile gaps. |
| Viewport widget boundary mapping | `hcie-iced-gui` (`shader_canvas.rs`) | Sets custom wgpu render viewport matching the absolute layout bounds of the canvas widget. | Aligning wgpu NDC coordinates to layout coordinates is the only way drawing coordinates match mouse/pen position. |
| Nearest-Neighbor sampler filtering | `hcie-iced-gui` (`shader_canvas.rs`) | Sets magnification and minification filter modes to `wgpu::FilterMode::Nearest` on the GPU texture sampler. | Prevents linear interpolation sub-pixel sampling seams (black/transparent border lines) between 256x256 tiles. |
2026-07-09 02:59:53 +03:00
### GUI First-Frame Visibility & Iced GPU Acceleration (CRITICAL — Regression Prevention)
2026-07-09 02:59:53 +03:00
Two mechanisms together fix the recurring "default first document canvas is invisible until the tab title is clicked" bug. Removing either half makes the regression come back.
| Mechanism | Location | What it does | Why it is protected |
|-----------|----------|--------------|---------------------|
| Initial document active tab | `hcie-egui-app/crates/hcie-gui-egui/src/app/mod.rs` (`HcieApp::new`) | Sets `Document(0)` as the active dock tab on startup so egui_dock calls the canvas widget's `ui()` on the first frame. | Without this, the canvas widget is skipped and the composite texture is never created until the user clicks the tab title. |
| Extra repaint after new texture | `hcie-egui-app/crates/hcie-gui-egui/src/canvas/mod.rs` | Requests multiple repaints after `render_composition` creates a brand-new texture, because egui uploads GPU textures asynchronously. | A single repaint often leaves the canvas blank on the first frame; the second/third frame actually displays the texture. |
| `DrawingFinished` does NOT clear dirty flags | `hcie-egui-app/crates/hcie-gui-egui/src/app/mod.rs` | Leaves engine dirty flags intact so `render_composition` can upload the result on the next frame. | Calling `clear_dirty_flags()` inside `DrawingFinished` races with the next render pass and makes newly drawn vector shapes disappear. |
**AI AGENT WARNING:** Do not remove, shorten, or "optimize away" the startup active-tab setting, the egui multi-frame repaint requests, the `DrawingFinished` no-op, OR any of the `hcie-iced-gui` GPU-acceleration optimizations (RefCell union accumulator, viewport boundary mapping, Nearest filtering, or partial uploads). These look like minor details but they are the only things keeping the first canvas visible and Iced running smoothly at 100+ FPS. Every past removal has re-introduced regressions. If a change you are making touches any of these places, stop and verify with an actual app launch.
2026-07-09 02:59:53 +03:00
If a new feature conflicts with one of these mechanisms, extend the existing API by adding a new function or file rather than bypassing or duplicating the protected code.
## GUI Workspace Architecture (CRITICAL — AI Search Scope)
Only one GUI workspace exists: `hcie-iced-app/`. The GUI crates are `hcie-iced-gui/` and `iced-panel-*/`. The `hcie-egui-app/` workspace is legacy and frozen.
2026-07-09 02:59:53 +03:00
### AI Search Rule
When searching for a crate, module, file, or symbol:
1. Scan the active GUI workspace first (`hcie-iced-app/`).
2026-07-09 02:59:53 +03:00
2. Then scan sibling engine crates (`../hcie-*/`).
3. Follow the `Cargo.toml` dependency chain; if a dependency lives in another workspace, scan that workspace too.
4. If a symbol name appears in two different modules (for example, `plugins/`), examine both.
## Error Isolation
Every crate can be built independently. A crash or failure in one crate does not cascade to the others. The GUI does not see engine code changes until the engine static library is rebuilt.
## Locked Files (agents may not write here)
- `hcie-protocol/src/*.rs`
- `hcie-color/src/*.rs`
- `hcie-blend/src/*.rs`
- `hcie-history/src/*.rs`
- `hcie-brush-engine/src/*.rs`
- `hcie-draw/src/*.rs`
- `hcie-composite/src/*.rs`
- `hcie-filter/src/*.rs`
- `hcie-selection/src/*.rs`
- `hcie-text/src/*.rs`
- `hcie-vector/src/*.rs`
- `hcie-tile/src/*.rs`
- `hcie-io/src/*.rs`
- `hcie-document/src/*.rs`
- `hcie-engine-api/src/*.rs`
- `hcie-ai/src/*.rs`
- `hcie-vision/src/*.rs`
- `hcie-fx/src/*.rs`
- `hcie-psd/src/*.rs`
- `hcie-kra/src/*.rs`
- `hcie-native/src/*.rs`
Use `unlock.sh <crate>` to temporarily open a crate, make the required change, then `lock.sh <crate>` to lock it again.
## Open Files (agents may write here)
### Active Iced GUI
2026-07-09 02:59:53 +03:00
- `hcie-iced-app/crates/hcie-iced-gui/src/*.rs`
- `hcie-iced-app/crates/hcie-iced-gui/Cargo.toml`
- `hcie-iced-app/crates/iced-panel-adapter/src/*.rs`
- `hcie-iced-app/crates/iced-panel-ai-chat/src/*.rs`
- `hcie-iced-app/crates/iced-panel-script/src/*.rs`
- `hcie-iced-app/crates/hcie-dry-media-brushes/src/*.rs`
- `hcie-iced-app/crates/hcie-watercolor-brushes/src/*.rs`
- `hcie-iced-app/crates/hcie-ink-brushes/src/*.rs`
- `hcie-iced-app/crates/hcie-paint-brushes/src/*.rs`
- `hcie-iced-app/crates/hcie-digital-brushes/src/*.rs`
2026-07-09 02:59:53 +03:00
## Important Notes
- Never add an `egui` dependency to any engine crate.
- Never access `hcie-protocol` directly from GUI code.
- Never import a locked engine crate directly from GUI code; route everything through `hcie-engine-api`.
- The active GUI workspace is `hcie-iced-app/`. Treat `hcie-egui-app/` as read-only legacy reference.
2026-07-09 02:59:53 +03:00
## Engine API — Public Surface
The GUI uses only the public items exported by `hcie-engine-api`. Example high-level operations:
```rust
use hcie_engine_api::Engine;
let mut engine = Engine::new(800, 600);
let layer_id = engine.add_layer("Background");
engine.set_active_layer(layer_id);
engine.draw_stroke(&points);
let pixels = engine.get_composite_pixels();
```
For the full API, see `hcie-engine-api/src/lib.rs` and `ARCHITECTURE.md`.
## Screenshot & Visual Verification (AI Agent Workflow)
AI agents MUST capture screenshots after every GUI change to verify visual results.
The egui GUI has a built-in screenshot mechanism that agents should use.
### How to Capture
#### Full Viewport Screenshot (F12)
- **Trigger:** Press `F12` while the egui GUI is running
- **Output:** `target/screenshots/toolbox_{unix_timestamp}.png`
- **Scope:** Entire viewport (all panels, menus, canvas)
- **Implementation:** `hcie-egui-app/crates/hcie-gui-egui/src/app/mod.rs:2340-2342`
#### Automated Panel Screenshot (CLI)
```bash
cargo run -p hcie-gui-egui -- --screenshot-panel "PanelName" output.png
```
- **Scope:** Crops to the specified panel's screen-space rect
- **Implementation:** `hcie-egui-app/crates/hcie-gui-egui/src/app/mod.rs:2994-3009`
- **State machine:** 7-frame capture flow (layout settle → screenshot → crop → save)
#### Available Panel Names (exact strings for `--screenshot-panel`)
| Panel Name | Enum Variant | Description |
|------------|-------------|-------------|
| `Tools` | `HciePane::Tools` | Toolbox (brush, eraser, shapes, etc.) |
| `Filters` | `HciePane::Filters` | Filter parameter panels |
| `Brushes & Tips` | `HciePane::Brushes` | Brush presets and tip configuration |
| `Color Palette` | `HciePane::ColorBox` | Color picker and palette |
| `AI Assistant` | `HciePane::AiAssistant` | AI chat panel |
| `Layers` | `HciePane::Layers` | Layer list and management |
| `History` | `HciePane::History` | Undo/redo history timeline |
| `Properties` | `HciePane::Properties` | Active object properties |
| `Plugins` | `HciePane::Plugins` | Plugin management panel |
| `Layer Styles` | `HciePane::LayerStyles` | Layer effects/styles editor |
| `Layer Details` | `HciePane::LayerDetails` | Detailed layer info panel |
> **Note:** Panel names are case-sensitive and must match exactly. The mapping is
> defined in `pane_from_name()` at `mod.rs:926-941`.
### Screenshot Flow (7-Frame State Machine)
```
Frame 0: Ensure target panel exists in dock
Frame 1-5: Wait for layout to settle (50ms repaints each)
Frame 6: Issue ViewportCommand::Screenshot
Frame 7: Receive egui::Event::Screenshot, crop to panel rect, save PNG, close
```
### Helper Functions
| Function | File | Purpose |
|----------|------|---------|
| `crop_colorimage()` | `mod.rs:3373-3391` | Crops `egui::ColorImage` to screen-space rect |
| `save_colorimage()` | `mod.rs:3393-3400` | RGBA bytes → PNG file via `image::save_buffer` |
| `pane_from_name()` | `mod.rs:926-941` | Maps panel name strings to `HciePane` enum |
### Agent GUI Iteration Rules
1. **After every CSS/layout/code change:** Take a screenshot and visually inspect it
2. **Before/after refactoring:** Capture both states for comparison
3. **When user provides a reference image:** Capture current state, compare with reference
4. **Document visual regressions:** If a screenshot shows degradation, log it before fixing
5. **Use `--screenshot-panel`** for focused panel inspection (not full viewport)
6. **Engine pixel-perfect capture:** Use `engine.get_composite_pixels()` for viewport-independent output (bypasses GUI rendering)
### Visual Design Iteration (Reference Image Workflow)
When the user provides reference images or design mockups, the AI agent MUST follow
this workflow to ensure pixel-accurate results:
1. **Study the reference image first.** Before writing any code, analyze the
reference image's layout, spacing, colours, font sizes, shadows, borders,
and overall visual hierarchy. Note exact values where possible.
2. **Implement changes incrementally.** Apply one visual change at a time (e.g.
background colour first, then typography, then spacing). After each change:
- Take a screenshot (`F12` or `--screenshot-panel`)
- Compare against the reference image
- Note discrepancies and fix them before moving on
3. **Report visual diffs to the user.** After completing a set of changes,
present a before/after comparison. Embed screenshots in the response so the
user can visually validate the result without running the application.
4. **Respect the user's verbal corrections.** When the user says "move X left",
"make Y darker", "the spacing is too wide", etc., apply the feedback
literally and take a new screenshot immediately. Do not re-interpret or
override the user's aesthetic judgment.
5. **Preserve design tokens across sessions.** If the user establishes a visual
language (specific colours, font sizes, border radii), document them and
reuse them consistently in subsequent panels and dialogs.
### API Details
- **egui built-in:** `egui::ViewportCommand::Screenshot` — requests platform viewport capture
- **egui event:** `egui::Event::Screenshot { image, .. }` — delivers `egui::ColorImage` on next frame
- **image crate:** `image::save_buffer()` — writes raw RGBA bytes to PNG
---
# DOCUMENTATION
## Comprehensive Documentation Guidelines
For every function, method, struct, module, and file within the scope of work, add a detailed docstring/comment block at the very beginning. All documentation must be written in clear, professional English.
Each block must include:
* **Purpose:** A clear explanation of what this specific section, module, or function does.
* **Logic & Workflow:** The underlying operational logic, algorithm, or step-by-step mechanism it uses to achieve its goal.
* **Arguments & Returns (for functions/methods):** Explicit descriptions of input parameters (types and purposes) and return values.
* **Side Effects / Dependencies (if any):** Any global state changes, I/O operations, or external system dependencies.
# DEBUGGING
Only apply while debugging operations.
## Role and Objective
Analyze the provided code and improve it by adding detailed documentation and strategic debug logging.
## Strategic Debug Logging Guidelines
To accelerate root-cause analysis and system observability, insert comprehensive debug logs throughout the codebase.
* **Placement:** Place logs at critical execution boundaries:
* Entry and exit points of major functions (logging input parameters and final return values).
* Inside conditional branches (`if` / `else`) to track the exact execution path.
* Immediately before and after complex calculations, external API calls, or database operations.
* Inside catch/except blocks to capture full error contexts and stack traces.
* **Log Level:** Use the appropriate `DEBUG` or `TRACE` log level so these messages do not clutter production environments but can be fully enabled during troubleshooting.
* **Contextual Data:** Ensure log messages include relevant runtime data variables, identifiers, or state structures (serialized safely) to provide actionable context for debugging.
---
# Execution Output Requirements
* Preserve all existing business logic; do not alter the functionality of the code.
* Maintain the established code formatting style, indentation, and naming conventions of the source file.
* Return the fully updated code enclosed in appropriate markdown code fences.