# Mailshot Plugin Environment Baseline

## Purpose

Define the persistent environment assumptions for this plugin so all requirements and implementation work use the same baseline.

## Global Requirement Context

This document will be referenced from every requirements specification document in this repository.
This document remains in the working context for all operations.

## Core Policy

"Do not use fallbacks without specific instruction"

No fallback behavior may be introduced or enabled unless a requirement explicitly instructs it.

Use the following rule in prompts:
Hard constraints for this task:

1) No fallbacks unless explicitly listed below.
2) No synthetic placeholders/default labels.
3) Fail fast on missing/invalid data paths.
4) Show explicit errors at point of detection.
5) If a fallback seems necessary, stop and ask first.

## Repository Context

- Primary workspace: `mailshot-plugin`
- Reference implementation patterns: `../members-list-plugin`
- Requirements folder: `requirements/`
- Credentials folder (local dev only): `credentials/`
- Results folder for test outputs and investigation findings: `results/`

## Development Assumptions

- Development should support a local fixture/harness workflow where practical.
- Runtime code paths used in tests should match production plugin code paths as closely as possible.
- Environment-specific behavior must be explicit, documented, and testable.

## Configuration Principles

- Use a single clear active configuration path per environment.
- Prefer explicit configuration over implicit defaults.
- Keep secrets outside committed source files.

## Database Routing Contract

- Mailshot feature writable state (definitions, assets, run logs, and related mailshot tables) must be stored in the database named by `.env` variable `MAILSHOTS_REMOTE_MYSQL_DB`.
- Recipient/source data reads (for DSL execution against contacts/accounts/renewals and approved custom source tables) must use the database named by `.env` variable `MEMBERS_REMOTE_MYSQL_DB`.
- Requirements documents must state whether each table/operation is a write-path (`MAILSHOTS_REMOTE_MYSQL_DB`) or read-path (`MEMBERS_REMOTE_MYSQL_DB`).

## Testing Hygiene

- Every test must clean up its own test artefacts.
- No test may leave persistent data/files/state behind unless a requirement explicitly allows it.
- Test results and investigation findings must be written under `results/`.

## Build And Release Scripts

- `scripts/` must contain a deployment script for deploying to the production server.
- `scripts/` must contain a packaging script that creates an uploadable WordPress plugin package.

## Third-Party Software Inventory

- PHP/Composer libraries (installed into `vendor/`):
  - `twig/twig`
  - `dompdf/dompdf`
  - transitive dependencies from `composer.lock` (for example `masterminds/html5`, `sabberworm/php-css-parser`, `thecodingmachine/safe`, Symfony polyfills)
- Frontend editor/runtime assets (vendored under plugin `assets/vendor/`):
  - `Jodit` rich-text editor
  - `Ace` editor (`ace.js`, html mode/worker, language tools, theme)
- Node/test toolchain:
  - `@playwright/test`
  - Playwright Chromium browser binaries (installed by Playwright CLI)
- System CLI/runtime dependencies used by scripts/runtime:
  - `zip` (required for plugin packaging)
  - `ssh` and `rsync` (required for remote deployment)
  - PHP CLI
  - Node.js / npm
  - `gs` (Ghostscript), required at runtime for merged PDF downloads
  - PHP `ZipArchive`, preferred at runtime for ZIP PDF downloads
  - `zip` CLI, required at runtime only when PHP `ZipArchive` is unavailable for ZIP PDF downloads

## Dependency Installation Scripts

- `scripts/install_dependencies.sh`
  - Installs Composer dependencies (`vendor/`) for plugin runtime.
  - Installs/bundles editor assets (Jodit + Ace) into `feca_mailshots_plugin/assets/vendor/`.
  - Installs Node dependencies (`npm ci`) unless skipped by flag.
- `scripts/package_plugin.sh`
  - Calls `scripts/install_dependencies.sh --skip-node` before packaging.
  - Builds versioned WordPress zip under `dist/`, including runtime `vendor/` and bundled editor assets.
- `scripts/deploy_remote.sh`
  - Calls `scripts/install_dependencies.sh --skip-node` before deploy.
  - Deploys plugin files and runtime `vendor/` to the configured remote WordPress plugin directory.
- `tests/e2e/run.sh`
  - Installs Node modules if missing, installs Playwright Chromium, and runs E2E tests (fixture or remote mode).

## Versioning Requirements

- The code must expose a WordPress-reportable semantic version number in `x.y.z` format.
- `x` is major, `y` is minor, `z` is patch level.
- Every deployment must increment patch level `z`.

## Documentation Contract

Each future requirements document should:

1. Link or refer to `requirements/environment.md`.
2. Declare any additional environment constraints beyond this baseline.
3. State if a requirement is local-only, test-only, or production-relevant.
