890 lines
19 KiB
Markdown
890 lines
19 KiB
Markdown
# AGENTS.md
|
||
|
||
This document defines how an **agent (human or LLM‑assisted)** should migrate the existing **WWCompanion** codebase, concepts, and behaviors into **SiteCompanion**, *without rewriting from scratch*. The migration is **patch‑style**: refactor, rename, generalize, and constrain—never invent new execution semantics.
|
||
|
||
|
||
SiteCompanion is a **tool, not a product**. It exists to remove copy/paste friction while preserving explicit user intent. Automation is restricted to **context binding only**.
|
||
|
||
---
|
||
|
||
|
||
## 0. Prime Directive (Non‑Negotiable)
|
||
|
||
**Preserve the execution model.**
|
||
|
||
> Nothing may execute without an explicit user click.
|
||
|
||
|
||
Allowed:
|
||
|
||
|
||
* Automatic **context restoration** (workspace loading on navigation)
|
||
|
||
* UI reinjection on DOM mutation (idempotent)
|
||
|
||
|
||
Forbidden:
|
||
|
||
* Auto‑execution
|
||
* Background scraping
|
||
* Inferred intent
|
||
* Heuristic task selection
|
||
|
||
Allowed (explicit exception):
|
||
|
||
* Auto‑generated or inferred selectors, but **only** when they resolve to one of the following concrete patterns:
|
||
* `{ kind: "css"; selector: string }`
|
||
* `{ kind: "cssAll"; selector: string; index: number }`
|
||
* `{ kind: "textScope"; text: string }`
|
||
* `{ kind: "anchoredCss"; anchor: { kind: "textScope"; text: string }; selector: string }`
|
||
|
||
If a change violates this, it is **out of scope**.
|
||
|
||
---
|
||
|
||
## 1. Terminology Mapping (Rename, Don’t Reimagine)
|
||
|
||
| WWCompanion | SiteCompanion | Notes |
|
||
| ----------- | ------------- | -------------------------------------------------- |
|
||
|
||
| Companion | SiteCompanion | Tool rename only |
|
||
| Prompt | Task | **Tasks are the most basic execution unit** |
|
||
| Quick Run | Shortcut | Shortcut = preconfigured run |
|
||
| Context | Site Text | Explicitly bound via paste/selection |
|
||
| Profile | Profile | Same meaning, now workspace-scoped |
|
||
| Mode | Env | Execution discipline (system prompt + constraints) |
|
||
|
||
Rules:
|
||
|
||
* The constructed prompt must use **`Profile`** as the header name for user context
|
||
* The extension must **never emit `Resume` as a pipeline header or constant prompt text**
|
||
* Users may supply resume-like content, but it is always placed under the `Profile` header
|
||
|
||
Do **not** introduce new conceptual layers.
|
||
|
||
|
||
---
|
||
|
||
## 2. Core Execution Pipeline (Must Remain Intact)
|
||
|
||
|
||
The execution pipeline is stable and final:
|
||
|
||
```
|
||
Env (system prompt + discipline)
|
||
→ Profile (opaque user context)
|
||
|
||
→ Task (semantic intent template)
|
||
→ Site Text (primary extracted text)
|
||
```
|
||
|
||
|
||
Rules:
|
||
|
||
* The pipeline must **not** contain a `Resume` stage
|
||
* Prompt headers must use **exactly** these names
|
||
* **Tasks** are the most basic executable unit
|
||
|
||
* **Shortcuts** bind `(env + profile + task)`
|
||
* Shortcuts are the **only pinnable and toolbar-exposed unit**
|
||
|
||
Agents must never collapse, rename, or reorder this pipeline.
|
||
|
||
|
||
---
|
||
|
||
## 3. Workspaces (Authoritative Model)
|
||
|
||
### 3.1 Root Global Workspace
|
||
|
||
SiteCompanion introduces a **real but hidden workspace** named **`global`**.
|
||
|
||
`global` is **not a special case** in code. It is a full workspace that:
|
||
|
||
* Always exists
|
||
* Is not user-deletable
|
||
* Is never auto-switched into
|
||
|
||
`global` owns:
|
||
|
||
* Global appearance defaults
|
||
|
||
* **Global API configuration (providers, endpoints, API keys)**
|
||
|
||
* Globally scoped Envs, Profiles, Tasks
|
||
* Global Presets
|
||
|
||
|
||
Rules:
|
||
|
||
* API configuration is **global-only** and **non-inheritable**
|
||
* `global` participates in inheritance like any other workspace
|
||
|
||
### 3.2 Workspace Definition
|
||
|
||
A **Workspace is a strict namespace**, but not an ownership boundary.
|
||
|
||
A workspace references:
|
||
|
||
|
||
* Appearance overrides
|
||
* Envs
|
||
* Profiles
|
||
* Tasks
|
||
* Presets
|
||
* Sites
|
||
|
||
### 3.3 Deletion Semantics
|
||
|
||
|
||
Deleting a workspace:
|
||
|
||
|
||
* **Does not delete** any Envs, Profiles, Tasks, Presets, or Sites
|
||
|
||
* Moves all referenced items to the **`global` workspace**
|
||
* Preserves names, identities, and semantics
|
||
|
||
Deletion therefore removes a *namespace*, not data.
|
||
|
||
|
||
### 3.4 Inheritance Model (Unified)
|
||
|
||
Scopes form a strict hierarchy:
|
||
|
||
|
||
```
|
||
global → workspace → site
|
||
```
|
||
|
||
Inheritance rules:
|
||
|
||
* Inherit by default
|
||
* Items may be disabled (subtractive)
|
||
* **Override by redefinition**: defining an item with the same name shadows the inherited one
|
||
* Nearest scope wins by name
|
||
|
||
|
||
Rules:
|
||
|
||
* No merging of semantics
|
||
* No inference
|
||
* APIs / API keys do **not** inherit
|
||
|
||
### 3.5 Migration Rule
|
||
|
||
If WWCompanion has:
|
||
|
||
|
||
* Global config
|
||
* Implicit defaults
|
||
* Cross-context state
|
||
|
||
Then:
|
||
|
||
* Move capability-like config into `global`
|
||
* Move user-meaningful items into a default migrated workspace
|
||
* Remove all implicit fallback logic
|
||
|
||
|
||
### 3.3 Inheritance Model (Unified)
|
||
|
||
Scopes form a strict hierarchy:
|
||
|
||
```
|
||
global → workspace → site
|
||
```
|
||
|
||
|
||
Inheritance rules:
|
||
|
||
* Inherit by default
|
||
* Items may be disabled (subtractive)
|
||
* **Override by redefinition**: defining an item with the same name shadows the inherited one
|
||
* Nearest scope wins by name
|
||
|
||
Rules:
|
||
|
||
|
||
* No merging of semantics
|
||
* No inference
|
||
* APIs / API keys do **not** inherit
|
||
|
||
### 3.4 Migration Rule
|
||
|
||
If WWCompanion has:
|
||
|
||
|
||
* Global config
|
||
* Implicit defaults
|
||
* Cross-context state
|
||
|
||
Then:
|
||
|
||
* Move capability-like config into `global`
|
||
* Move user-meaningful items into a default migrated workspace
|
||
* Remove all implicit fallback logic
|
||
|
||
---
|
||
|
||
## 4. Env & Profile Visibility (Final Decision)
|
||
|
||
In SiteCompanion:
|
||
|
||
|
||
* **Env selector is always visible**
|
||
* **Profile selector is always visible**
|
||
|
||
Even when:
|
||
|
||
|
||
* A preset defines defaults
|
||
|
||
Visibility = inspectability.
|
||
|
||
Agents must **not** introduce read‑only, hidden, or inferred env/profile states.
|
||
|
||
---
|
||
|
||
## 5. Tasks vs Shortcuts (Critical Separation)
|
||
|
||
### 5.1 Tasks
|
||
|
||
|
||
Tasks:
|
||
|
||
* Are the **most basic execution unit**
|
||
* Define semantic intent
|
||
* Are directly runnable via **manual popup execution**
|
||
* Define a **default Environment**
|
||
* Define a **default Profile**
|
||
* Are never pinnable
|
||
|
||
When a user selects or changes a Task in the popup:
|
||
|
||
* The Environment selector must refresh to the Task’s default Environment
|
||
* The Profile selector must refresh to the Task’s default Profile
|
||
|
||
|
||
### 5.2 Shortcuts
|
||
|
||
Shortcuts:
|
||
|
||
|
||
* Are concrete, named execution shortcuts
|
||
* Bind `(env + profile + task)` explicitly
|
||
* Are executable via **one click**
|
||
* Are pinnable
|
||
* **Never appear in the popup UI**
|
||
|
||
Shortcuts exist purely as **injected-toolbar shortcuts**.
|
||
|
||
|
||
### 5.3 Manual Execution (Popup Configuration)
|
||
|
||
|
||
The popup UI allows **manual execution of Tasks** using explicit configuration.
|
||
|
||
Rules:
|
||
|
||
* The popup UI must **never list or reference shortcuts**
|
||
* Manual execution must use the **same execution pipeline** as shortcuts
|
||
|
||
* Manual execution does **not** create a shortcut unless explicitly saved by the user
|
||
* Manual execution is equivalent to WWCompanion behavior
|
||
|
||
Migration rule:
|
||
|
||
|
||
> Any WWCompanion feature that "runs" something maps either to **manual Task execution** or to a **toolbar Shortcut**.
|
||
|
||
---
|
||
|
||
## 6. Site Binding & Context Extraction
|
||
|
||
### 6.1 Site Ownership
|
||
|
||
|
||
Each site:
|
||
|
||
* Belongs to exactly **one workspace**
|
||
* Has an explicit URL matcher
|
||
* Has an explicit extraction definition
|
||
* Inherits appearance, envs, profiles, tasks, presets from its workspace (unless overridden)
|
||
|
||
|
||
### 6.2 Unknown Sites (Two Paths Only)
|
||
|
||
When encountering an unknown site, **only two paths are allowed**:
|
||
|
||
#### Path A: Popup UI (default)
|
||
|
||
|
||
1. Toolbar appears in minimal state
|
||
2. User pastes or selects a portion of page text
|
||
3. System finds the *minimum DOM scope* whose `innerText` contains the pasted text
|
||
4. User confirms or retries
|
||
5. User selects workspace
|
||
6. Site config is created
|
||
|
||
|
||
#### Path B: Settings Page (manual)
|
||
|
||
* User defines URL matcher
|
||
* User defines extraction logic explicitly
|
||
|
||
|
||
Rules:
|
||
|
||
* No fuzzy matching
|
||
* No guessing
|
||
* No background scraping
|
||
|
||
|
||
---
|
||
|
||
## 7. Automatic Behavior (Strictly Limited)
|
||
|
||
Allowed automation:
|
||
|
||
|
||
* Loading a site’s associated workspace on navigation
|
||
|
||
Disallowed automation:
|
||
|
||
|
||
* Running presets
|
||
* Selecting presets
|
||
* Modifying env/profile/task
|
||
|
||
**Context may be restored. Intent may not be inferred.**
|
||
|
||
---
|
||
|
||
## 8. UI & Interaction Rules
|
||
|
||
|
||
SiteCompanion has **three UIs**, each with a strict role boundary. Wherever applicable, UI layout, interaction patterns, and visual hierarchy must **respect WWCompanion’s existing design**.
|
||
|
||
|
||
### 8.1 UI Surfaces (Authoritative)
|
||
|
||
1. **Floating Injected Toolbar**
|
||
|
||
* Appears on **recognized sites** only
|
||
* Floating, injected, idempotent on DOM mutation
|
||
* Supported positions only: four corners + bottom center
|
||
* Contains **toolbar presets only**
|
||
|
||
|
||
2. **Extension Popup UI**
|
||
|
||
* Primary inspection, configuration, and manual execution surface
|
||
|
||
* Never displays presets
|
||
|
||
* State-machine driven (see below)
|
||
|
||
3. **Settings UI**
|
||
|
||
* Configuration and organization surface only
|
||
* No execution affordances
|
||
|
||
|
||
---
|
||
|
||
### 8.2 Floating Toolbar (Toolbar Presets Only)
|
||
|
||
|
||
The floating toolbar:
|
||
|
||
* Displays buttons named after **all enabled presets in scope for the current site**
|
||
* Executes a preset with **one click**
|
||
* Is the **exclusive surface** from which presets may be executed
|
||
|
||
Preset aggregation order:
|
||
|
||
1. Enabled **Global Presets**
|
||
2. Enabled **Workspace Presets**
|
||
|
||
3. Enabled **Site Presets**
|
||
|
||
|
||
Rules:
|
||
|
||
* Presets must never appear in the popup UI
|
||
|
||
* Presets must never appear in settings execution paths
|
||
* Presets should be labeled as **"Toolbar Presets"** where naming clarification is needed
|
||
|
||
---
|
||
|
||
### 8.3 Popup UI – State Machine
|
||
|
||
The popup UI has **exactly three states**, and **popup state must be persisted**.
|
||
|
||
Persistence rule:
|
||
|
||
* Closing the popup **must not reset state**
|
||
* Popup state is preserved until:
|
||
|
||
* The user performs a manual action in the popup (selection / click), or
|
||
* The user executes a toolbar Shortcut
|
||
|
||
|
||
State transitions are therefore **explicit and durable**.
|
||
|
||
---
|
||
|
||
#### State 1: Unknown Site
|
||
|
||
Shown when a site has no saved configuration.
|
||
|
||
UI elements:
|
||
|
||
* Prompt asking the user to paste **partial text** they want SiteCompanion to extract each time
|
||
|
||
* Button: **"Try Extracting Full Text"**
|
||
|
||
|
||
---
|
||
|
||
#### State 2: Extraction Review
|
||
|
||
Entered after attempting full-text extraction.
|
||
|
||
UI elements:
|
||
|
||
|
||
* Read-only buffer showing the extracted text
|
||
* Editable field to configure the **URL match pattern** for the site
|
||
* Button: **Retry** (returns to State 1)
|
||
* Button: **Confirm** (saves the site as recognized)
|
||
|
||
Validation rules:
|
||
|
||
|
||
* URL patterns must be explicit
|
||
* **No URL pattern may be a substring of another** (conflict error)
|
||
|
||
---
|
||
|
||
|
||
#### State 3: Normal Execution
|
||
|
||
Shown for recognized sites.
|
||
|
||
Rules:
|
||
|
||
* Layout must respect WWCompanion popup design
|
||
* Allows manual configuration of env, profile, and task
|
||
* Changing the Task refreshes env/profile to Task defaults
|
||
* Allows manual execution
|
||
|
||
* **Never displays shortcuts or shortcut-derived UI**
|
||
|
||
* Adds a single, read-only line indicating the **current Workspace**
|
||
|
||
---
|
||
|
||
#### State 2: Extraction Review
|
||
|
||
Entered after attempting full-text extraction.
|
||
|
||
UI elements:
|
||
|
||
* Read-only buffer showing the extracted text
|
||
* Editable field to configure the **URL match pattern** for the site
|
||
* Button: **Retry** (returns to State 1)
|
||
* Button: **Confirm** (saves the site as recognized)
|
||
|
||
Validation rules:
|
||
|
||
* URL patterns must be explicit
|
||
* **No URL pattern may be a substring of another** (conflict error)
|
||
|
||
|
||
---
|
||
|
||
#### State 3: Normal Execution
|
||
|
||
Shown for recognized sites.
|
||
|
||
Rules:
|
||
|
||
* Layout must respect WWCompanion popup design
|
||
* Allows manual configuration of env, profile, task, and site text
|
||
* Allows manual execution
|
||
|
||
* **Never displays presets or preset-derived UI**
|
||
* Adds a single, read-only line indicating the **current Workspace**
|
||
|
||
---
|
||
|
||
### 8.4 Naming & Display Rules (UI-Wide)
|
||
|
||
|
||
* Naming conflict checking is **case-insensitive**
|
||
* Display must **preserve the original casing** of the name as entered
|
||
|
||
---
|
||
|
||
### 8.2 Floating Toolbar (Presets Only)
|
||
|
||
The floating toolbar:
|
||
|
||
* Displays buttons named after **all presets enabled for the current site**
|
||
* Executes a preset with **one click**
|
||
* Is the **exclusive surface** from which presets may be executed
|
||
|
||
Preset source order:
|
||
|
||
* Enabled **Global Presets**
|
||
* Enabled **Workspace Presets**
|
||
* Enabled **Site Presets**
|
||
|
||
Rules:
|
||
|
||
* Presets must never appear in the popup UI
|
||
* Presets must never appear in the settings execution paths
|
||
|
||
---
|
||
|
||
### 8.3 Popup UI – State Machine
|
||
|
||
|
||
The popup UI has **exactly three states**.
|
||
|
||
#### State 1: Unknown Site
|
||
|
||
Shown when a site has no saved configuration.
|
||
|
||
|
||
UI elements:
|
||
|
||
|
||
* Prompt asking the user to paste **partial text** they want SiteCompanion to extract each time
|
||
* Button: **"Try Extracting Full Text"**
|
||
|
||
---
|
||
|
||
#### State 2: Extraction Review
|
||
|
||
|
||
Entered after attempting full-text extraction.
|
||
|
||
|
||
UI elements:
|
||
|
||
* Read-only buffer showing the extracted text
|
||
* Editable field to configure the **URL match pattern**
|
||
* Button: **Retry** (returns to State 1)
|
||
|
||
* Button: **Confirm** (saves the site as recognized)
|
||
|
||
Validation rules:
|
||
|
||
* URL patterns must be explicit
|
||
* **No URL pattern may be a substring of another** (conflict error)
|
||
|
||
---
|
||
|
||
|
||
#### State 3: Normal Execution
|
||
|
||
Shown for recognized sites.
|
||
|
||
Rules:
|
||
|
||
* Layout must respect WWCompanion popup design
|
||
* Allows manual configuration of env, profile, task, and site text
|
||
* Allows manual execution
|
||
* **Never displays presets or preset-derived UI**
|
||
* Adds a single line indicating the **current Workspace**
|
||
|
||
---
|
||
|
||
### 8.4 Naming & Display Rules (UI-Wide)
|
||
|
||
* Naming conflict checking is **case-insensitive**
|
||
* Display must **preserve the original casing** of the name as entered
|
||
|
||
---
|
||
|
||
---
|
||
|
||
|
||
## 9. Preset Scope, Enablement, and Naming
|
||
|
||
### 9.1 Preset Scope Resolution
|
||
|
||
Toolbar presets shown for a site are the union of:
|
||
|
||
* Enabled **Global Presets**
|
||
* Enabled **Workspace Presets** (if applicable)
|
||
* Enabled **Site Presets** (if applicable)
|
||
|
||
|
||
### 9.2 Enablement Semantics
|
||
|
||
* Presets may exist at global, workspace, or site scope
|
||
* Lower tiers inherit enable/disable state from parents by default
|
||
* A lower-tier preset with the same name **overrides and disables** the inherited one
|
||
|
||
### 9.3 Naming Scope
|
||
|
||
Naming is scoped as:
|
||
|
||
```
|
||
Enabled Global + Enabled Workspace + Enabled Site + Module Type
|
||
```
|
||
|
||
Rules:
|
||
|
||
|
||
* Conflict detection is case-insensitive within the same module type
|
||
* Display preserves original casing
|
||
|
||
---
|
||
|
||
|
||
## 10. Motion & UX Doctrine
|
||
|
||
|
||
Structural motion only:
|
||
|
||
* Viewport‑anchored reflow (FLIP pattern)
|
||
* Item stays visually fixed; UI reflows around it
|
||
|
||
Motion is:
|
||
|
||
|
||
* Structural, not decorative
|
||
* Respectful of reduced‑motion settings
|
||
|
||
|
||
---
|
||
|
||
## 11. Engineering & UX Constraints
|
||
|
||
### 11.1 Legacy WWCompanion Adapters (Removal Mandate)
|
||
|
||
Any of the following **must be removed**, not adapted:
|
||
|
||
|
||
* Legacy config adapters
|
||
|
||
* Compatibility shims
|
||
* Auto-migration layers that preserve old semantics at runtime
|
||
|
||
|
||
Migration is **one-time and destructive** at the semantic level.
|
||
|
||
|
||
Allowed:
|
||
|
||
|
||
* Data migration scripts
|
||
|
||
* Explicit renaming / reshaping of stored config
|
||
|
||
|
||
Forbidden:
|
||
|
||
* Dual-mode logic
|
||
|
||
* Runtime branching on legacy flags
|
||
|
||
|
||
---
|
||
|
||
### 11.2 Settings UI Structure (Authoritative)
|
||
|
||
The Settings UI contains the following top-level sections:
|
||
|
||
#### 1. Global Configuration
|
||
|
||
Acts as the **configuration baseline**.
|
||
|
||
Contains:
|
||
|
||
* Global appearance (theme, toolbar positioning, auto-hide on unknown sites)
|
||
* API Keys
|
||
* API Configurations
|
||
* Expandable / foldable lists of:
|
||
|
||
* Environments
|
||
* Profiles
|
||
* Tasks
|
||
* Presets
|
||
|
||
Each configuration entry:
|
||
|
||
* Is configuration-only (no execution)
|
||
* Has an enable / disable toggle
|
||
|
||
Also includes:
|
||
|
||
|
||
* Expandable / foldable list of **sites inheriting directly from global**
|
||
|
||
---
|
||
|
||
#### 2. Workspaces
|
||
|
||
|
||
Contains a list of workspace sections (all visible in sidebar TOC; TOC supports folding).
|
||
|
||
|
||
Each workspace section contains:
|
||
|
||
|
||
* Name
|
||
* Appearance overrides (inherits from global on creation)
|
||
* API configurations shown as **enable/disable toggles only**
|
||
* Expandable / foldable lists of:
|
||
|
||
* Environments
|
||
* Profiles
|
||
* Tasks
|
||
* Presets
|
||
|
||
Each list is split into:
|
||
|
||
* **Inherited** (toggle-based enable/disable)
|
||
* **Workspace-specific** (full configuration UI)
|
||
|
||
Also includes:
|
||
|
||
* Expandable / foldable list of **sites inheriting from this workspace**
|
||
|
||
---
|
||
|
||
#### 3. Sites
|
||
|
||
Mirrors the Workspace structure, minus the list of sites.
|
||
|
||
|
||
Rules:
|
||
|
||
* Lower tiers inherit both enabled/disabled state and defaults from parents
|
||
* On creation or parent change, inherited defaults must be refreshed
|
||
* If a site/workspace config name conflicts with an enabled inherited one:
|
||
|
||
* The inherited one is automatically disabled
|
||
* Helper text must explain the override
|
||
|
||
---
|
||
|
||
|
||
### 11.3 Duplication Semantics
|
||
|
||
For all non-API configurations, duplication must be offered as:
|
||
|
||
* **Duplicate to Workspace** (with selector)
|
||
* **Duplicate to Site** (with selector)
|
||
|
||
No generic duplicate buttons are allowed.
|
||
|
||
---
|
||
|
||
### 11.4 Naming & Conflict Detection
|
||
|
||
Naming rules are **case-insensitive and module-specific**.
|
||
|
||
|
||
Rules:
|
||
|
||
* Conflicts are detected case-insensitively
|
||
* Display preserves original casing
|
||
* Different module types may share the same name
|
||
|
||
---
|
||
|
||
### 11.5 Error Checking & Messaging
|
||
|
||
Error checking is **mandatory and non-removable**.
|
||
|
||
Agents:
|
||
|
||
* May refactor validation logic
|
||
* May strengthen invariants
|
||
* May change *where* errors are surfaced in the UI
|
||
|
||
|
||
Agents may **not**:
|
||
|
||
* Silence errors
|
||
* Convert errors into warnings
|
||
* Auto-recover from invalid state without user action
|
||
|
||
Errors must:
|
||
|
||
|
||
* Be explicit
|
||
* Be attributable to a concrete user action or config
|
||
* Not block unrelated UI inspection
|
||
|
||
---
|
||
|
||
### 11.6 UI Design Theme
|
||
|
||
Respect the existing SiteCompanion UI doctrine:
|
||
|
||
* Minimal surface area
|
||
* WWCompanion layout parity where applicable
|
||
|
||
* No instructional text in execution paths
|
||
* No decorative UI
|
||
|
||
* No icon-first navigation
|
||
|
||
UI exists to expose state, not to explain it.
|
||
|
||
---
|
||
|
||
|
||
## 12. Migration Checklist (Agent‑Facing)
|
||
|
||
An agent migrating WWCompanion must:
|
||
|
||
* [ ] Rename concepts using the mapping table
|
||
|
||
* [ ] Ensure constructed prompts use `Profile` (never `Resume`) as the header
|
||
* [ ] Introduce workspaces as hard namespaces
|
||
|
||
* [ ] Introduce the `global` workspace for capability config
|
||
* [ ] Split global state into workspace‑owned state
|
||
* [ ] Separate tasks from presets
|
||
* [ ] Ensure only presets execute
|
||
* [ ] Make env & profile selectors always visible
|
||
* [ ] Remove any auto‑execution logic
|
||
* [ ] Remove all legacy config adapters
|
||
* [ ] Enforce case‑insensitive, module‑local naming rules
|
||
|
||
* [ ] Constrain automation to context binding only
|
||
* [ ] Keep execution pipeline intact
|
||
|
||
|
||
If any step requires inventing behavior, stop.
|
||
|
||
|
||
---
|
||
|
||
## 13. Closing Doctrine
|
||
|
||
SiteCompanion is intentionally **narrow**.
|
||
|
||
|
||
It restores **clarity of intent** by enforcing boundaries:
|
||
|
||
* Context may be bound automatically
|
||
* Intent may only cross the boundary via an explicit click
|
||
|
||
Legacy convenience is not a justification for ambiguity.
|
||
|
||
|
||
> The tool must always make it obvious *what will run*, *with what*, and *why*.
|
||
|
||
Agents exist to preserve this clarity — not to smooth it away.
|