diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 0000000..7f22043
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1,2 @@
+# Preserve the pinned upstream license bytes, including its original trailing space.
+assets/brand/source/OFL-Exo2.txt -text whitespace=-blank-at-eol
diff --git a/.github/ISSUE_TEMPLATE/brand-asset.yml b/.github/ISSUE_TEMPLATE/brand-asset.yml
new file mode 100644
index 0000000..e63ad66
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/brand-asset.yml
@@ -0,0 +1,62 @@
+name: Brand or asset request
+description: Request profile, mascot, or design asset work in php-fast-forward/.github.
+title: "[Brand]: "
+body:
+ - type: markdown
+ attributes:
+ value: |
+ Submit brand and asset requests in [php-fast-forward/.github](https://github.com/php-fast-forward/.github/issues).
+ This organization template may also appear in package repositories; package bugs and code changes belong in their affected repository.
+ Review [DESIGN.md](https://github.com/php-fast-forward/.github/blob/main/DESIGN.md), [STYLE.md](https://github.com/php-fast-forward/.github/blob/main/STYLE.md), [SOUL.md](https://github.com/php-fast-forward/.github/blob/main/SOUL.md), and [the asset catalog](https://github.com/php-fast-forward/.github/blob/main/assets/README.md).
+ Keep references and uploads suitable for public reading. Use the affected repository's security policy for vulnerabilities.
+ - type: textarea
+ id: purpose
+ attributes:
+ label: Purpose and audience
+ description: What should this change help someone understand or do? Who will use it?
+ validations:
+ required: true
+ - type: dropdown
+ id: request_type
+ attributes:
+ label: Requested change
+ options:
+ - Existing asset correction or export
+ - Mascot pose or illustration
+ - Profile or documentation presentation
+ - Design token or component
+ - Visual identity proposal
+ validations:
+ required: true
+ - type: textarea
+ id: intended_surface
+ attributes:
+ label: Intended surface and requirements
+ description: Name the page or context, size, format, background, and accessibility needs.
+ validations:
+ required: true
+ - type: textarea
+ id: references
+ attributes:
+ label: References and provenance
+ description: Link asset IDs or public references. Record origin, author or method where known, and reuse permissions. Mark unknown information, or state that no references exist yet.
+ validations:
+ required: true
+ - type: textarea
+ id: design_evidence
+ attributes:
+ label: Proposed result and review evidence
+ description: Describe the result, include a public-safe preview if available, and explain relevant design, style, or character rules or proposed contract changes.
+ validations:
+ required: true
+ - type: checkboxes
+ id: submission_checks
+ attributes:
+ label: Before submitting
+ options:
+ - label: I searched existing requests and the asset catalog for related work.
+ required: true
+ - label: The references and uploads contain no secrets, personal data, or confidential material.
+ required: true
+ - label: I recorded source and permission status, including anything that is unknown.
+ required: true
diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml
new file mode 100644
index 0000000..d6e6179
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/bug_report.yml
@@ -0,0 +1,45 @@
+name: Bug report
+description: Report a reproducible problem in the affected PHP Fast Forward repository.
+title: "[Bug]: "
+body:
+ - type: markdown
+ attributes:
+ value: |
+ Use the affected repository for package behavior, documentation, or accessibility barriers.
+ For central profile, mascot, and design assets, use [php-fast-forward/.github](https://github.com/php-fast-forward/.github/issues).
+ Follow the affected repository's security policy for vulnerabilities. Remove secrets, personal information, and private URLs from examples, logs, and screenshots.
+ - type: textarea
+ id: affected_component
+ attributes:
+ label: Affected repository, package, and version
+ description: Identify the repository, package or page, and version. Use a commit or branch when no version applies.
+ validations:
+ required: true
+ - type: textarea
+ id: environment
+ attributes:
+ label: PHP version and environment
+ description: Include relevant PHP, operating system, dependency, browser, or assistive technology versions. Write not applicable for fields unrelated to this report.
+ validations:
+ required: true
+ - type: textarea
+ id: reproduction
+ attributes:
+ label: Steps to reproduce
+ description: Provide the smallest public-safe example or steps, including the command or page location.
+ validations:
+ required: true
+ - type: textarea
+ id: expected_result
+ attributes:
+ label: Expected result
+ description: Explain the behavior or access you expected.
+ validations:
+ required: true
+ - type: textarea
+ id: actual_result
+ attributes:
+ label: Actual result
+ description: Explain what happened. Include only relevant, redacted output or screenshots; never upload credentials, personal data, or confidential logs.
+ validations:
+ required: true
diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml
new file mode 100644
index 0000000..8e275fe
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/feature_request.yml
@@ -0,0 +1,31 @@
+name: Feature request
+description: Describe a use case and a proposed improvement in the affected repository.
+title: "[Feature]: "
+body:
+ - type: markdown
+ attributes:
+ value: |
+ Search existing requests first and use the affected repository.
+ Submit central profile, mascot, or design work through the brand form in [php-fast-forward/.github](https://github.com/php-fast-forward/.github/issues).
+ Keep examples and references suitable for public reading; omit secrets, personal information, and confidential material.
+ - type: textarea
+ id: problem
+ attributes:
+ label: Problem and use case
+ description: Who needs this, what are they trying to do, and what makes the current approach difficult?
+ validations:
+ required: true
+ - type: textarea
+ id: proposal
+ attributes:
+ label: Proposed result
+ description: Describe the improvement, affected package or component, and how someone would use it. Examples are welcome.
+ validations:
+ required: true
+ - type: textarea
+ id: alternatives
+ attributes:
+ label: Alternatives considered
+ description: Describe existing options, workarounds, and relevant tradeoffs. State if you have not found an alternative.
+ validations:
+ required: true
diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
new file mode 100644
index 0000000..250d86c
--- /dev/null
+++ b/.github/PULL_REQUEST_TEMPLATE.md
@@ -0,0 +1,27 @@
+## Purpose and result
+
+
+
+Related issue:
+
+
+## Validation
+
+
+
+## Brand and asset evidence (when relevant)
+
+
+
+## Checklist
+
+- [ ] The change belongs in this repository and follows its contribution instructions.
+- [ ] The description explains the result and the relevant validation performed.
+- [ ] Code examples, commands, and documentation match the delivered behavior.
+- [ ] If assets changed, their origin and permission status are documented and relevant previews/catalog updates are included.
+- [ ] The diff, logs, and previews contain no secrets, personal data, confidential material, or accidental system files.
diff --git a/.github/workflows/brand-assets.yml b/.github/workflows/brand-assets.yml
new file mode 100644
index 0000000..3418e4d
--- /dev/null
+++ b/.github/workflows/brand-assets.yml
@@ -0,0 +1,59 @@
+name: Brand assets
+
+on:
+ pull_request:
+ paths:
+ - 'assets/**'
+ - 'DESIGN.md'
+ - 'SOUL.md'
+ - 'STYLE.md'
+ - 'docs/brand/**'
+ - 'skills/dash-art/**'
+ - 'references/**'
+ - 'profile/assets/**'
+ - 'scripts/**'
+ - 'tests/**'
+ - 'composer.json'
+ - 'composer.lock'
+ - 'phpunit.xml'
+ - '.gitattributes'
+ - '.github/workflows/brand-assets.yml'
+ push:
+ branches: [main]
+ paths:
+ - 'assets/**'
+ - 'DESIGN.md'
+ - 'SOUL.md'
+ - 'STYLE.md'
+ - 'docs/brand/**'
+ - 'skills/dash-art/**'
+ - 'references/**'
+ - 'profile/assets/**'
+ - 'scripts/**'
+ - 'tests/**'
+ - 'composer.json'
+ - 'composer.lock'
+ - 'phpunit.xml'
+ - '.gitattributes'
+ - '.github/workflows/brand-assets.yml'
+
+permissions:
+ contents: read
+
+jobs:
+ validate:
+ runs-on: ubuntu-latest
+ timeout-minutes: 5
+ steps:
+ - uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4
+ - name: Set up PHP
+ uses: shivammathur/setup-php@bf6b4fbd49ca58e4608c9c89fba0b8d90bd2a39f # 2.35.5
+ with:
+ php-version: '8.4'
+ extensions: dom, mbstring, zlib
+ tools: composer:v2
+ coverage: none
+ - name: Install locked development dependencies
+ run: composer install --no-interaction --no-plugins --no-scripts --prefer-dist --no-progress
+ - name: Verify assets, exports and publication regression tests
+ run: composer check
diff --git a/.github/workflows/brand-pages.yml b/.github/workflows/brand-pages.yml
new file mode 100644
index 0000000..4403273
--- /dev/null
+++ b/.github/workflows/brand-pages.yml
@@ -0,0 +1,88 @@
+name: Brand Pages
+
+on:
+ push:
+ branches: [main]
+ paths:
+ - 'assets/**'
+ - 'docs/brand/**'
+ - 'profile/**'
+ - '*.md'
+ - 'scripts/**'
+ - 'tests/**'
+ - 'composer.json'
+ - 'composer.lock'
+ - 'phpunit.xml'
+ - '.gitattributes'
+ - '.github/workflows/brand-pages.yml'
+ pull_request:
+ paths:
+ - 'assets/**'
+ - 'docs/brand/**'
+ - 'profile/**'
+ - '*.md'
+ - 'scripts/**'
+ - 'tests/**'
+ - 'composer.json'
+ - 'composer.lock'
+ - 'phpunit.xml'
+ - '.gitattributes'
+ - '.github/workflows/brand-pages.yml'
+ workflow_dispatch:
+
+permissions:
+ contents: read
+
+concurrency:
+ group: brand-pages-${{ github.event_name != 'pull_request' && github.ref == 'refs/heads/main' && 'deployment' || github.ref }}
+ cancel-in-progress: false
+
+jobs:
+ build:
+ runs-on: ubuntu-latest
+ timeout-minutes: 10
+ steps:
+ - name: Checkout
+ uses: actions/checkout@11d5960a326750d5838078e36cf38b85af677262 # v4, matches brand-assets.yml
+ - name: Set up PHP
+ uses: shivammathur/setup-php@bf6b4fbd49ca58e4608c9c89fba0b8d90bd2a39f # 2.35.5
+ with:
+ php-version: '8.4'
+ extensions: dom, mbstring, zlib
+ tools: composer:v2
+ coverage: none
+ - name: Install locked development dependencies
+ run: composer install --no-interaction --no-plugins --no-scripts --prefer-dist --no-progress
+ - name: Verify assets, exports and publication boundaries
+ run: composer check
+ - name: Build public brand library
+ env:
+ SOURCE_REF: ${{ github.sha }}
+ run: php scripts/build-brand-pages.php --output-dir _site --source-ref "$SOURCE_REF"
+ - name: Upload Pages artifact
+ uses: actions/upload-pages-artifact@fc324d3547104276b827a68afc52ff2a11cc49c9 # v5.0.0
+ with:
+ path: _site
+ retention-days: 1
+ include-hidden-files: true # The staging script creates only .nojekyll.
+
+ deploy:
+ if: github.event_name != 'pull_request' && github.ref == 'refs/heads/main'
+ needs: build
+ runs-on: ubuntu-latest
+ timeout-minutes: 10
+ permissions:
+ contents: read
+ pages: write
+ id-token: write
+ environment:
+ name: github-pages
+ url: ${{ steps.deployment.outputs.page_url }}
+ steps:
+ - name: Read Pages configuration
+ uses: actions/configure-pages@45bfe0192ca1faeb007ade9deae92b16b8254a0d # v6.0.0
+ with:
+ enablement: false
+ - name: Deploy brand library
+ id: deployment
+ uses: actions/deploy-pages@368f82528645a54fb793d4d04e342629a3f51346 # v5.0.1
diff --git a/.gitignore b/.gitignore
index dcc0a31..cfa9ce9 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1 +1,8 @@
-backup/
\ No newline at end of file
+backup/
+.DS_Store
+._*
+vendor/
+.phpunit.cache/
+
+# Generated GitHub Pages staging output
+_site/
diff --git a/ACCESSIBILITY.md b/ACCESSIBILITY.md
new file mode 100644
index 0000000..859fe4e
--- /dev/null
+++ b/ACCESSIBILITY.md
@@ -0,0 +1,22 @@
+# PHP Fast Forward accessibility priorities
+
+Make PHP Fast Forward documentation, websites, examples, and interfaces usable by people with different access needs. These are organization priorities; follow any more specific guidance in the affected repository.
+
+## Design and implementation
+
+- Use readable text and sufficient contrast for text, controls, and focus indicators. Convey status and meaning with text or other cues alongside color.
+- Keep instructions and code selectable and copyable as text. Provide textual explanations for diagrams and screenshots when they carry information.
+- Make interactive elements operable by keyboard, with visible focus and a logical navigation order. Use meaningful labels and semantic structure.
+- Preserve readable content when text is enlarged or the viewport changes. Give useful alternative text to informative images and keep purely decorative images out of the reading flow.
+
+Use [W3C WAI's design guidance](https://www.w3.org/WAI/tips/designing/) when reviewing contrast, navigation, labels, structure, and image alternatives.
+
+Keep nonessential animation optional. For web interfaces, respect reduced-motion preferences and provide a static equivalent; [WAI technique C39](https://www.w3.org/WAI/WCAG22/Techniques/css/C39) explains the `prefers-reduced-motion` approach. A mascot animation must not be required to understand an instruction or status.
+
+## Review and reporting
+
+Review relevant changes with keyboard navigation, text enlargement, contrast checks, and appropriate assistive technology or content checks. Record the surface and environment tested, observed barriers, and unresolved limitations. A compliance statement should identify the standard, assessed scope, and supporting evidence.
+
+Report an accessibility barrier as a bug in the affected repository. Include the page or component, expected access, reproduction steps, and relevant browser or assistive technology version when useful. Keep the report public-safe; you do not need to disclose a disability or personal medical information.
+
+For central profile content, mascot assets, or the visual system, use [the profile and design repository](https://github.com/php-fast-forward/.github/issues) and its brand form. Its [design guidance](https://github.com/php-fast-forward/.github/blob/main/DESIGN.md) and [asset catalog](https://github.com/php-fast-forward/.github/blob/main/assets/README.md) document intended applications and known asset limitations.
diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md
new file mode 100644
index 0000000..9a21564
--- /dev/null
+++ b/CODE_OF_CONDUCT.md
@@ -0,0 +1,23 @@
+# PHP Fast Forward community Code of Conduct
+
+PHP Fast Forward welcomes people with different backgrounds, identities, abilities, and levels of experience. Help make its repositories and project discussions useful places to learn and contribute. These are organization defaults; respect additional expectations published in the space where you participate.
+
+## How we work together
+
+Be respectful and specific. Critique ideas and behavior rather than attacking people. Make room for questions, acknowledge useful corrections, and respect others' time and boundaries. Keep technical disagreements focused on evidence and the tradeoffs under discussion.
+
+Harassment, threats, discriminatory language, sexual attention, repeated unwanted contact, and publishing another person's private information are unacceptable. Do not use project spaces for spam or targeted humiliation.
+
+These expectations apply to project issues, pull requests, discussions, and other spaces managed by PHP Fast Forward maintainers. They also apply when someone is representing the project in a public setting.
+
+## Reporting concerns
+
+Use GitHub's **Report content** action on the relevant issue, pull request, or comment when available. GitHub may offer reporting to repository admins or to GitHub Support, depending on the context and repository settings. See [Reporting abuse or spam](https://docs.github.com/en/communities/maintaining-your-safety-on-github/reporting-abuse-or-spam) for available reporting routes.
+
+Use a repository's published confidential conduct contact if it provides one. These defaults do not establish a confidential contact. When no private contact is published, use GitHub's platform reporting tools for sensitive cases instead of posting personal details or a sensitive account in a public issue. Share only the information needed for the selected route; do not promise confidentiality on behalf of the project.
+
+## Maintainer responsibilities
+
+Maintainers may edit or remove disruptive content, close discussions, or restrict participation to protect the community. They should consider context and severity, explain decisions where appropriate, and limit the circulation of sensitive information to people who need it to address the concern.
+
+The aim is a respectful, constructive community. Maintainers retain responsibility for enforcing expectations in the spaces they manage; GitHub handles reports about its platform rules through its own processes.
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
new file mode 100644
index 0000000..811db7f
--- /dev/null
+++ b/CONTRIBUTING.md
@@ -0,0 +1,36 @@
+# Contributing to PHP Fast Forward
+
+Contributions to PHP Fast Forward are welcome: bug reports, documentation, examples, package improvements, and visual identity work. These are organization defaults. Follow the affected repository's own contribution guide, operating instructions, and documented checks when present.
+
+## Choose the right repository
+
+Search the affected repository's issues before opening a proposal. Describe the problem or reader need, the expected result, and enough evidence to understand it. Framework code and package documentation belong in the relevant package repository.
+
+The [organization profile and design repository](https://github.com/php-fast-forward/.github) maintains public profile content, design assets, and shared community metadata. File brand and mascot requests there, even if this guide or an inherited template appears in another repository.
+
+Follow the [community Code of Conduct](https://github.com/php-fast-forward/.github/blob/main/CODE_OF_CONDUCT.md). Use the affected repository's security policy, or the [shared security guidance](https://github.com/php-fast-forward/.github/blob/main/SECURITY.md), for potential vulnerabilities.
+
+## Prepare a contribution
+
+Small corrections can go directly into a pull request. For a broad API, architecture, or visual direction change, explain the intended result before building a large implementation.
+
+Keep changes focused. Explain what changed and why, link a related issue when one exists, and include the relevant checks and their results. Use the affected repository's documented environment and test commands. Add regression coverage when it meaningfully verifies a behavior change. Describe manual review and limitations where automation cannot verify the result.
+
+Use public, sanitized material in examples, screenshots, and logs. Exclude secrets, personal data, private links, and content you are not authorized to publish. Keep operating-system files, editor metadata, and unrelated changes out of the diff.
+
+## Brand and asset contributions
+
+For work in the design repository, read [DESIGN.md](https://github.com/php-fast-forward/.github/blob/main/DESIGN.md), [STYLE.md](https://github.com/php-fast-forward/.github/blob/main/STYLE.md), [SOUL.md](https://github.com/php-fast-forward/.github/blob/main/SOUL.md), and [the asset guide](https://github.com/php-fast-forward/.github/blob/main/assets/README.md). The [asset manifest](https://github.com/php-fast-forward/.github/blob/main/assets/manifest.json) records asset identity, origin, and reuse status.
+
+Keep editable sources, references, and reusable exports identifiable. Record the origin, author or generation method where known, transformations, and permission or license status. Mark unknown information explicitly. Storage in the repository does not itself grant reuse rights, and a repository license must not be assumed to cover every illustration, font, logo, or reference.
+
+For a visual pull request:
+
+- Explain the intended audience and surface.
+- Follow the design, style, and character contracts, or identify a proposed contract change.
+- Include a preview at the intended size, with light and dark surfaces where relevant.
+- Preserve the fox's recognizable features and provide alternative text when the image carries information.
+- Update `assets/manifest.json` and the asset guide for new or changed assets.
+- Include source and permission information, dimensions, and relevant validation results.
+
+Maintainers review scope, consistency, evidence, and reuse status. A new visual concept remains a proposal until it is accepted into the documented identity. Each repository's maintainers decide whether a contribution is ready to merge.
diff --git a/DESIGN.md b/DESIGN.md
new file mode 100644
index 0000000..f234cf1
--- /dev/null
+++ b/DESIGN.md
@@ -0,0 +1,298 @@
+---
+version: alpha
+name: PHP Fast Forward
+description: Clear PHP foundations, a curious orange fox, and visible forward momentum.
+colors:
+ primary: "#6D28D9"
+ primary-hover: "#5B21B6"
+ blue: "#2563EB"
+ cyan: "#22D3EE"
+ navy: "#050B20"
+ ink: "#142033"
+ muted: "#475569"
+ neutral: "#F6F8FF"
+ white: "#FFFFFF"
+ border: "#CBD5E1"
+ fox-orange: "#F28D1A"
+ fox-cream: "#FFF3DF"
+ fox-outline: "#592D19"
+typography:
+ h1:
+ fontFamily: "system-ui, -apple-system, BlinkMacSystemFont, Segoe UI, sans-serif"
+ fontSize: 3rem
+ fontWeight: 750
+ lineHeight: "1.1"
+ letterSpacing: "-0.03em"
+ h2:
+ fontFamily: "system-ui, -apple-system, BlinkMacSystemFont, Segoe UI, sans-serif"
+ fontSize: 2rem
+ fontWeight: 700
+ lineHeight: "1.2"
+ letterSpacing: 0px
+ body-md:
+ fontFamily: "system-ui, -apple-system, BlinkMacSystemFont, Segoe UI, sans-serif"
+ fontSize: 1rem
+ fontWeight: 400
+ lineHeight: "1.6"
+ letterSpacing: 0px
+ label:
+ fontFamily: "system-ui, -apple-system, BlinkMacSystemFont, Segoe UI, sans-serif"
+ fontSize: 0.875rem
+ fontWeight: 600
+ lineHeight: "1.4"
+ letterSpacing: 0px
+ code:
+ fontFamily: "ui-monospace, SFMono-Regular, Menlo, Consolas, monospace"
+ fontSize: 0.875rem
+ fontWeight: 400
+ lineHeight: "1.6"
+ letterSpacing: 0px
+rounded:
+ sm: 6px
+ md: 12px
+ lg: 20px
+ pill: 999px
+spacing:
+ xs: 4px
+ sm: 8px
+ md: 16px
+ lg: 24px
+ xl: 32px
+ 2xl: 48px
+ 3xl: 64px
+components:
+ button-primary:
+ backgroundColor: "{colors.primary}"
+ textColor: "{colors.white}"
+ rounded: "{rounded.sm}"
+ padding: 12px
+ typography: "{typography.label}"
+ button-primary-hover:
+ backgroundColor: "{colors.primary-hover}"
+ textColor: "{colors.white}"
+ button-secondary:
+ backgroundColor: "{colors.cyan}"
+ textColor: "{colors.ink}"
+ rounded: "{rounded.sm}"
+ padding: 12px
+ page:
+ backgroundColor: "{colors.neutral}"
+ textColor: "{colors.ink}"
+ typography: "{typography.body-md}"
+ card:
+ backgroundColor: "{colors.white}"
+ textColor: "{colors.ink}"
+ rounded: "{rounded.md}"
+ padding: "{spacing.lg}"
+ caption:
+ backgroundColor: "{colors.white}"
+ textColor: "{colors.muted}"
+ typography: "{typography.label}"
+ hero:
+ backgroundColor: "{colors.navy}"
+ textColor: "{colors.white}"
+ typography: "{typography.h1}"
+ code-panel:
+ backgroundColor: "{colors.navy}"
+ textColor: "{colors.white}"
+ rounded: "{rounded.md}"
+ padding: "{spacing.md}"
+ typography: "{typography.code}"
+ link-light:
+ backgroundColor: "{colors.white}"
+ textColor: "{colors.blue}"
+ neutral-divider:
+ backgroundColor: "{colors.border}"
+ textColor: "{colors.ink}"
+ mascot-orange-label:
+ backgroundColor: "{colors.fox-orange}"
+ textColor: "{colors.ink}"
+ mascot-cream-label:
+ backgroundColor: "{colors.fox-cream}"
+ textColor: "{colors.fox-outline}"
+---
+
+## Overview
+
+This is the normative visual system for PHP Fast Forward. The values above are
+UI design decisions based on the supplied artwork, not claims that every raster
+pixel matches those colors. [SOUL.md](SOUL.md) defines the character's purpose;
+[STYLE.md](STYLE.md) defines the voice. The [asset catalog](assets/README.md)
+records the actual reusable files and their provenance.
+
+The selected framework signature is direction F: a simplified fox symbol beside
+“PHP FastForward”, with the symbol and “Fast” in orange. Dash's complete character
+illustrations help people learn and participate; dark speed trails can express
+momentum in editorial artwork. Keep everyday documentation calm and readable.
+
+The [brand specimen](docs/brand/index.html) presents Dash's pose matrix, palette,
+and reference families. The [documentation pattern](docs/brand/documentation.md)
+and [logo compositions](docs/brand/logo-compositions.md) define reusable applications.
+
+## Colors
+
+| Role | Token | Application |
+| --- | --- | --- |
+| Interactive emphasis | `primary` / `primary-hover` | Buttons and selected navigation on light surfaces. |
+| Optional decorative gradient | `primary` → `blue` → `cyan` | Editorial accents; a gradient is not required by the selected logo. |
+| Logo orange | `#FF641B` in `assets/brand/logo-source.json` | Fox symbol and “Fast” in the color signatures; separate from UI and fur tokens. |
+| Dark stage | `navy` | Hero, code panels, and illustration backgrounds. |
+| Reading surfaces | `neutral`, `white` | Documentation and cards. |
+| Text | `ink`, `muted` | Headings/body and supporting copy on light surfaces. |
+| Structure | `border` | Quiet separators; not sufficient alone to identify a control. |
+| Character shorthand | `fox-orange`, `fox-cream`, `fox-outline` | Swatches for orange fur, cream markings, and warm brown contour. |
+
+Use solid violet with white text for the primary action. Cyan and orange accents
+take dark text. Decorative gradients are not reliable text backgrounds.
+Use a visible outline or filled boundary where control recognition needs it.
+
+Text pairs must meet 4.5:1 for normal text and 3:1 for large text; UI boundaries
+and focus indicators need 3:1 against adjacent colors. Color alone must not
+communicate a state. These rules follow
+[WCAG contrast guidance](https://www.w3.org/WAI/WCAG22/Understanding/contrast-minimum.html).
+Token lint covers declared component text pairs, not complete-page accessibility.
+
+## Typography
+
+Use the system sans-serif stack for interfaces and the system monospace stack
+for code. The selected logo lettering uses Exo 2 Italic, version 2.010, at weight
+900. Its glyphs are outlined in the SVGs, so rendering the logo requires no font
+installation or browser font request. This lettering does not change the UI
+font stacks. The official unmodified variable font, SIL OFL 1.1 notice, pinned
+source commit, and byte hashes live in [brand/source](assets/brand/source/font-source.json).
+
+Use one H1 per page, sentence case, and a readable body line height of 1.6.
+Scale the display heading down to 2rem on small screens. Keep installation
+commands as selectable text. A picture of code never replaces a working example.
+
+## Layout
+
+Use the 4px spacing scale. Content pages use a centered width of at most 1200px;
+reading prose uses about 70 characters per line. Give mobile pages at least
+16px horizontal padding. Cards can form a grid, but preserve their reading order.
+
+Website reference direction: a navy hero with a concise promise, one install
+command, a primary documentation action, and a supporting ecosystem action;
+then a light package grid, an installation example, and a community section.
+Documentation reference direction: a navigation rail, reading column, code
+panels, and a secondary table of contents. On narrow screens the reading column
+comes first and navigation can collapse into a keyboard-operable control.
+
+These are design patterns. The archived concepts' statistics, versions,
+dependency claims, fictional API, and social links do not establish shipped
+features. Verify actual package documentation before implementing a website.
+
+## Elevation & Depth
+
+Use thin borders and restrained shadows to group content. Reserve glow and
+light trails for hero or campaign artwork. Place text on an opaque panel when
+artwork would reduce contrast. Package illustrations use the primary developer family. Keep the secondary
+editorial family separate within a composition.
+
+## Shapes
+
+Use gently rounded rectangles for cards and code panels. Keep the selected fox
+symbol's native silhouette. Keep illustrations proportional, preserve transparent padding, and avoid
+stretching, mirroring, or clipping the fox's ears and tail.
+
+Dash has large triangular ears with pink/cream inner fur and brown rims, a
+cream muzzle and cheeks, a small dark nose, warm amber/brown eyes, an orange
+forehead tuft, dark paws, and exactly one full cream-tipped tail. The shared
+costume is a violet hoodie with two cream drawstrings and a plain chest.
+
+The primary reference is [dash-developer-welcome.png](assets/mascot/dash-developer-welcome.png).
+Use its upright proportions, longer muzzle, face, dimensional fur, and cloth
+rendering for new package and default institutional illustrations. The reading,
+guide, and build poses corroborate this master. The secondary
+[dash-editorial-hoodie.png](assets/mascot/dash-editorial-hoodie.png) anchors the
+softer editorial collection: rounder face, compact seated proportions, larger
+eyes, and painted brown contours. Choose that collection deliberately for
+welcome, community, or a softer institutional context. Do not blend the models.
+
+These are authored reference poses, not an orthographic turnaround. New side/back
+views remain new derivatives; none can be inferred from a banner alone.
+
+## Components
+
+**Logo.** Direction F is the selected fox signature, with “Fast” in orange.
+The eight exports contain native vector geometry and outlined lettering.
+
+| Application | Full signature | Standalone mark |
+| --- | --- | --- |
+| Light surfaces, color | [fast-forward-logo.svg](assets/brand/fast-forward-logo.svg) | [fast-forward-mark.svg](assets/brand/fast-forward-mark.svg) |
+| Dark surfaces, color | [fast-forward-logo-dark.svg](assets/brand/fast-forward-logo-dark.svg) | [fast-forward-mark-dark.svg](assets/brand/fast-forward-mark-dark.svg) |
+| Light surfaces, monochrome | [fast-forward-logo-ink.svg](assets/brand/fast-forward-logo-ink.svg) | [fast-forward-mark-ink.svg](assets/brand/fast-forward-mark-ink.svg) |
+| Dark surfaces, monochrome | [fast-forward-logo-white.svg](assets/brand/fast-forward-logo-white.svg) | [fast-forward-mark-white.svg](assets/brand/fast-forward-mark-white.svg) |
+
+Edit [logo-source.json](assets/brand/logo-source.json), then rebuild with
+[build-brand-logos.php](scripts/build-brand-logos.php); do not redraw individual
+exports independently. The monochrome variants use the same selected geometry.
+Retired logos remain only in the ignored archive and its provenance records.
+
+Reserve clear space of at least 25% of mark height. Start the native symbol at
+32px high, full signatures at 200px wide, and standalone Dash at 160px high.
+These are initial application minima; inspect the actual consumer size and
+review smaller icon use separately. Do not use detailed full-body Dash artwork
+as a favicon.
+
+**Mascot lockups.** Compose Dash beside the selected signature while preserving
+clear space and hierarchy. Keep full-body artwork separate from the vector
+symbol. The developer collection is the default; editorial is an optional
+institutional/community application. The [logo board](docs/brand/logo-compositions.html)
+and [brand CSS](assets/styles/brand.css) supply applications. The simplified fox
+symbol does not replace the character masters or establish hidden anatomy.
+
+**Mascot matrix.** Keep identity stable within the chosen collection. Context
+changes through pose, expression, props, and an intentional package emblem.
+Shared masters have no chest emblem; compose reviewed symbols separately.
+No new eye colors, extra tails, headphones, or silent proportion changes.
+
+| Collection | Master | Role | Supplied poses |
+| --- | --- | --- | --- |
+| Developer — primary | `dash-developer-welcome` | Package, documentation, default institutional identity | Welcome, reading, guiding, composing |
+| Editorial — secondary | `dash-editorial-hoodie` | Welcome, community, softer institutional moments | Welcome, reading, guiding, composing |
+| Historical package sources | Cataloged local/public banners | Provenance and costume context | Banner poses, not interchangeable character masters or logo masters |
+| Archived sources | Manifest `archived_sources` | Provenance only | Retired face and logo interpretations |
+
+**Documentation.** Use the [documentation pattern](docs/brand/documentation.md)
+for navigation, prose, code, callouts, package cards, and responsive reading.
+The [standalone stylesheet](assets/styles/documentation.css) adapts the token
+export to browser CSS. Generated Tailwind `@theme` needs consumer processing.
+
+**Controls.** Primary buttons have one clear action. Secondary actions use a
+solid surface and visible boundary. Focus uses a 2px outline with a 2px offset:
+violet on white/light backgrounds and cyan on navy. Aim for 44px touch targets.
+Disabled and error states need text or an icon, not color alone.
+
+**Package cards.** Use exact Composer package names, one responsibility, and a
+repository link. Do not decorate unavailable features as implemented. Use icons
+with text labels. The archived icon set is a reference, including third-party
+marks whose usage rights have not been recorded.
+
+**Motion.** Speed trails in supplied assets are still images. Future animation
+should be brief, optional, and avoid loops behind reading content. Honor
+`prefers-reduced-motion`. The specimen works without animation or remote requests.
+
+## Do's and Don'ts
+
+- Choose one character rendering family per composition; use the catalog status.
+- Use real alpha PNGs rather than images with a baked-in checkerboard.
+- Keep technical content selectable and understandable without illustration.
+- Provide alt text for meaningful images and empty alt text for decoration.
+- Use the exact existing lockups; avoid stretching, mirroring, arbitrary colors,
+ replacing the fox face, or changing the selected symbol's silhouette.
+- Avoid performance superlatives, unverified metrics, fictional product APIs,
+ and inherited license claims from mockups.
+- Record a new derivative and its source hash; never silently overwrite a
+ canonical reference with a newly generated interpretation.
+
+## Reproducible exports
+
+This file follows the [DESIGN.md specification](https://github.com/google-labs-code/design.md).
+It is the token source; generated exports live in `assets/tokens/`.
+The CLI version is pinned in the [asset guide](assets/README.md). Re-export all
+three files together after changing tokens, then validate the asset manifest.
+Brand artwork and UI tokens have different jobs. The token exports do not
+generate the logo SVGs; those come from the separate vector master and generator.
+Font licensing is recorded with its source and does not assign a blanket license
+to other supplied illustrations.
diff --git a/README.md b/README.md
index b9673b7..38e348d 100644
--- a/README.md
+++ b/README.md
@@ -1,29 +1,97 @@
-
+
+
+
+
+
-# PHP Fast Forward Organization Profile
+# PHP Fast Forward identity and organization profile
-This repository holds the public GitHub organization profile and shared GitHub
-metadata for [`php-fast-forward`](https://github.com/php-fast-forward).
+This repository is the public home of PHP Fast Forward's visual identity,
+mascot references, design assets, organization profile, and community defaults.
+Framework code and tooling belong in their own
+[organization repositories](https://github.com/php-fast-forward).
-It exists so the organization page can have a proper manifesto, visual identity,
-and sponsorship metadata without mixing that content into the framework or
-tooling repositories themselves.
+## Start here
-## What lives here
+| Source | Responsibility |
+| --- | --- |
+| [DESIGN.md](DESIGN.md) | Visual canon, UI tokens, logo applications, mascot anatomy, and pose/use matrix. |
+| [STYLE.md](STYLE.md) | Public voice, language, terminology, and evidence in product claims. |
+| [SOUL.md](SOUL.md) | Character, values, and the Fast Forward fox's relationship with people. |
+| [Asset library](assets/README.md) | Reusable exports, metadata, provenance, and consumption rules. |
+| [Asset manifest](assets/manifest.json) | Stable asset IDs, hashes, dimensions, and classifications. |
+| [Public visual library](https://php-fast-forward.github.io/.github/) | GitHub Pages publication target for the visual specimens and reusable asset kit. |
+| [Visual specimen](docs/brand/index.html) | Browsable mascot matrix, light/dark previews, and reference families. |
+| [Documentation pattern](docs/brand/documentation.html) | Executable reading/navigation/code style and reusable CSS. |
+| [Logo kit](docs/brand/logo-compositions.html) | Fox signature, orange Fast, dark-surface and monochrome variants. |
+| [Vector master](assets/brand/logo-source.json) | Source geometry, outlined Exo 2 lettering, palette, and reproducible SVG variants. |
+| [Pages setup](docs/brand/pages.md) | Workflow, publication target, and deployment setup for the local brand pages. |
+| [Dash artwork skill](skills/dash-art/SKILL.md) | Generate consistent repository illustrations using verified masters and recorded prompts. |
+| [References](references/README.md) | Website concepts, package art, and icon references. |
+| [Design assessment](docs/brand/assessment.md) | Audit findings, decisions, and next artwork/website work. |
+| [Mascot production guide](docs/brand/mascot-production.md) | Reference stack, planned pose matrix, and reusable illustration briefs. |
-- [`profile/README.md`](./profile/README.md) is the organization profile shown on
- the GitHub organization page
-- [`profile/assets`](./profile/assets) contains the public assets used by that
- profile
-- [`.github/FUNDING.yml`](./.github/FUNDING.yml) defines the organization
- sponsorship links
+
+
+
+
+Dash developer is the primary character reference; the new editorial collection
+is a secondary choice. Both wear the shared purple hoodie; package emblems are
+composed separately when needed. References have explicit statuses so
+an old concept or divergent illustration cannot silently redefine the mascot.
+
+Open `docs/brand/index.html` in a browser, or serve the repository with
+`php -S 127.0.0.1:8765` and visit
+`http://127.0.0.1:8765/docs/brand/`. The specimen loads only repository files.
+
+The logo combines the fox symbol and “Fast” in orange
+`#FF641B`. Eight native SVG exports cover full signatures and standalone marks
+on light/dark surfaces and in ink/white monochrome. The lettering uses licensed
+Exo 2 Italic at weight 900, converted to paths; interface typography stays on the
+system-font tokens. See the [asset guide](assets/README.md#logo-masters).
+
+## Organization surfaces
+
+- [profile/README.md](profile/README.md) is the default English organization profile, with links to [Português (Brasil)](profile/README.pt-BR.md) and [Español](profile/README.es.md).
+- [profile/assets](profile/assets) delivers the organization-profile artwork.
+- [.github/FUNDING.yml](.github/FUNDING.yml) holds sponsorship links.
+- [CONTRIBUTING.md](CONTRIBUTING.md), [SUPPORT.md](SUPPORT.md),
+ [CODE_OF_CONDUCT.md](CODE_OF_CONDUCT.md), [SECURITY.md](SECURITY.md), and
+ [ACCESSIBILITY.md](ACCESSIBILITY.md) provide community defaults.
+- [.github/ISSUE_TEMPLATE](.github/ISSUE_TEMPLATE) and
+ [.github/PULL_REQUEST_TEMPLATE.md](.github/PULL_REQUEST_TEMPLATE.md) support
+ issue and review preparation.
+
+GitHub can inherit these defaults in organization repositories that do not
+provide their own corresponding files. Repository-specific files take precedence;
+templates and files are not copied into consumer clones. See
+[GitHub's default community file rules](https://docs.github.com/en/communities/setting-up-your-project-for-healthy-contributions/creating-a-default-community-health-file).
+
+This repository is public. Keep private materials in an appropriate private
+repository or local archive. The ignored `backup/` is not a publication surface
+or a dependency of the reusable kit. Artwork rights and authoring gaps remain
+explicit in the catalog; no inferred license is assigned to supplied artwork.
+
+## Validation
+
+```sh
+composer install
+composer check
+```
+
+The [asset guide](assets/README.md#token-exports) describes reproducible token
+exports. The brand workflow verifies delivered files and validator failure
+modes. Visual likeness and complete accessibility still require review.
-## Notes
+Dash is the Fast Forward fox. The developer collection is the primary reference;
+the newly authored cute editorial collection supports community and softer
+institutional moments. Both have welcome, reading, guiding, and composing poses.
+The original cute source-pack exports and retired logos are retained in the
+ignored local backup, with provenance in the manifest's archive metadata. See the
+[production guide](docs/brand/mascot-production.md) and
+[generation receipts](docs/brand/dash-generation.json) for exact references.
-- Private or spoiler assets can be kept outside versioned profile assets
-- The organization manifesto itself lives in [`profile/README.md`](./profile/README.md)
-- Framework code and developer tooling live in their own repositories, especially
- [`framework`](https://github.com/php-fast-forward/framework) and
- [`dev-tools`](https://github.com/php-fast-forward/dev-tools)
+The versioned `dash-art` package is source for reuse, not a host installation.
+Set `DASH_BRAND_ROOT` to this checkout when using it from another repository.
diff --git a/SECURITY.md b/SECURITY.md
new file mode 100644
index 0000000..3a59b5f
--- /dev/null
+++ b/SECURITY.md
@@ -0,0 +1,17 @@
+# PHP Fast Forward security guidance
+
+This is the organization's default security policy. A repository's own security policy takes precedence. Report a potential vulnerability to the affected repository, including when it involves a specific `fast-forward/*` package.
+
+## Reporting a potential vulnerability
+
+Use GitHub's **Report a vulnerability** option on the affected repository when private vulnerability reporting is enabled. Review the repository's security policy and submit reproduction steps, affected versions or files, and likely impact through the private form. Availability is configured per repository; publishing this file does not enable private reporting. See [GitHub's private reporting instructions](https://docs.github.com/en/code-security/how-tos/report-and-fix-vulnerabilities/report-privately).
+
+When that option is unavailable and the affected repository has no published private reporting route, open a public issue asking maintainers to provide a private security contact. Keep the request brief and omit vulnerability details, exploit code, credentials, and sensitive attachments. Share the technical report only after a private route has been established.
+
+Do not include secrets or personal information in public issues or pull requests. For platform abuse or exposed private information, use the appropriate [GitHub reporting tools](https://docs.github.com/en/communities/maintaining-your-safety-on-github/reporting-abuse-or-spam).
+
+## Scope and expectations
+
+Repository maintainers document supported package versions and any additional reporting terms in their own policies. These defaults do not announce a bounty program, a private email address, or response deadlines. Coordinate disclosure of unresolved vulnerabilities through the private reporting route that is actually available.
+
+The organization profile repository contains public content, design assets, and shared community metadata. Package vulnerabilities still belong with the affected package's maintainers.
diff --git a/SOUL.md b/SOUL.md
new file mode 100644
index 0000000..661a75d
--- /dev/null
+++ b/SOUL.md
@@ -0,0 +1,69 @@
+# The soul of PHP Fast Forward
+
+PHP Fast Forward helps people build PHP applications with less ceremony: PSR interfaces, composition, portable boundaries, and proven components. The brand should make those choices feel understandable and approachable.
+
+This document defines character and intent. [DESIGN.md](DESIGN.md) defines the visual system; [STYLE.md](STYLE.md) defines language and voice; [assets/README.md](assets/README.md) identifies the reusable assets and their status.
+
+## Dash, the Fast Forward fox
+
+**Dash** is the framework's companion. Introduce the character as **Dash, the Fast Forward fox** in English and **Dash, a raposa do Fast Forward** in Brazilian Portuguese. Use **Dash** once the context is clear. The name was selected by the maintainer during the 2026-10-03 identity work.
+
+The name suggests forward movement: a useful next step, a clearer explanation, or a component connected well. It does not establish a performance claim. Dash remains a patient guide when a reader needs time to understand a concept.
+
+The fox welcomes people into the project, helps direct their attention, and gives the ecosystem a recognizable human presence. It belongs beside explanations, examples, and community moments. Its role is to help a reader find the next useful step.
+
+## Values
+
+| Value | What it means for the framework and its identity |
+| --- | --- |
+| Interoperability | Start with shared PHP standards and explain the boundaries they create. |
+| Composition | Show how small parts work together and make dependencies understandable. |
+| Portability | Help people carry their knowledge and components across projects and environments. |
+| Less ceremony | Prefer the smallest useful explanation and the fewest concepts needed to act. |
+| Proven foundations | Give credit to the components and communities the framework builds on. |
+| Human judgment | Support people and agents with clear, inspectable workflows and explicit outcomes. |
+
+These are design principles, not automatic claims that every package satisfies every PSR or has a particular performance result. Describe the behavior of each package with evidence.
+
+## Personality
+
+The fox is curious, resourceful, warm, and composed. It enjoys making a difficult idea easier to understand. It has enough confidence to point out the next step and enough humility to acknowledge uncertainty.
+
+Its energy comes from progress: a first working example, a component connected cleanly, a clearer boundary, or a useful contribution. Keep expressions readable and friendly. Humor can acknowledge the small absurdities of development without making a newcomer the joke.
+
+The fox supports an independent developer. Give people the explanation, tradeoffs, and tools to make their own decisions. In agent-assisted work, show what changed and how it was checked.
+
+## Character in use
+
+| Reference pose | Intended role |
+| --- | --- |
+| Welcome | Onboarding, introductions, appreciation, and community care. |
+| Reading | Documentation, concepts, tutorials, and learning. |
+| Guiding | Explanations, direction, and the next useful step. |
+| Composing | Building, integration, and relationships between components. |
+
+Choose a pose for the surrounding message. Preserve its recognizable anatomy and let the content carry the explanation. Use the institutional mark for product identification and the fox for companionship.
+
+## Visual canon
+
+Dash has orange fur, warm amber/brown eyes, a dark nose and paws, cream cheeks and muzzle, large triangular ears, and one sweeping tail with a cream tip. The purple hoodie has two cream drawstrings and a plain chest in the shared reference.
+
+The **developer collection is the primary identity**: a more upright body, longer muzzle, and polished dimensional fur and cloth. Use it for package illustrations, documentation, and default institutional applications. The **editorial collection is secondary**: a rounder face, larger eyes, compact seated proportions, and painted brown contours. Use it for welcoming, community, or an intentionally softer institutional moment. Each collection has its own reference master; do not mix their faces, body proportions, or rendering in one illustration.
+
+The newly authored reference poses are welcome, reading, guiding, and composing. Older cute source-pack drawings and retired logos are archived in the ignored local backup with provenance records; they are not the reference for new Dash artwork.
+
+The framework's selected F signature uses a simplified fox symbol and orange “Fast”, with a monochrome counterpart of the same drawing. This vector symbol identifies the product; the full Dash illustrations provide companionship. The symbol does not redefine the character's proportions or imply new views of its anatomy. Exo 2 lettering gives the signature its personality while interface typography remains focused on readable documentation.
+
+Preserve the recognizable silhouette, facial character, and relationship between the orange, brown, and cream areas. Pose changes must keep the fox recognizable. New names, anatomy, permanent costumes, or major stylistic changes require a deliberate update to the character definition and references.
+
+Use [DESIGN.md](DESIGN.md) for exact tokens, proportions, contrast rules, and approved applications. Use [assets/README.md](assets/README.md) to distinguish reusable exports, reference images, and historical concepts. A concept image alone does not establish a new canon rule.
+
+## Relationship with the community
+
+Make documentation welcoming to beginners and useful to experienced PHP developers. Respect the work of upstream maintainers. Discuss design tradeoffs plainly and avoid judging people by the framework or tools they use.
+
+The fox may celebrate a contribution or guide a tutorial. Instructions, warnings, errors, and support messages must remain understandable without the character. The identity should help readers navigate the work and trust its evidence.
+
+## Keeping the soul consistent
+
+When adding a page, illustration, or campaign, check that it supports a useful reader action, expresses these values, and follows the visual canon. Record new reusable assets and their provenance in the asset catalog. Keep this document focused on enduring character; put implementation details and current product behavior in the relevant documentation.
diff --git a/STYLE.md b/STYLE.md
new file mode 100644
index 0000000..d528ee7
--- /dev/null
+++ b/STYLE.md
@@ -0,0 +1,86 @@
+# PHP Fast Forward style
+
+Write so a developer can understand the purpose, choose a useful next step, and verify the result. The voice is clear, welcoming, practical, and quietly confident. It reflects the character described in [SOUL.md](SOUL.md) and the presentation rules in [DESIGN.md](DESIGN.md).
+
+## Language
+
+Public repository documentation, asset descriptions, and reusable product copy use English. In conversation, follow the person's language; use natural Brazilian Portuguese when they write in PT-BR.
+
+The organization profile has an English default at [profile/README.md](profile/README.md), with explicitly supported [Brazilian Portuguese](profile/README.pt-BR.md) and [Spanish](profile/README.es.md) translations. Keep the language links at the top of all three versions, marking the current language. Update their structure, package claims, roadmap status, code, destinations, and image references together; translate the prose and alternative text while preserving identifiers and examples.
+
+Keep code identifiers, namespaces, commands, package names, flags, and output exactly as they appear in the software. Translate the explanation around them. Avoid translating an identifier to make prose sound smoother.
+
+## Names and terminology
+
+| Term | Usage |
+| --- | --- |
+| PHP Fast Forward | Full framework and public ecosystem name. Use on first mention and when identifying the product. |
+| Fast Forward | Short form when the context already identifies PHP Fast Forward. |
+| `fast-forward/*` | Composer package namespace. Use exact package names when documenting installation or dependencies. |
+| Dash | Mascot name. On first mention, use “Dash, the Fast Forward fox”; in PT-BR, “Dash, a raposa do Fast Forward”; in Spanish, “Dash, el zorro de Fast Forward”. Use Dash afterward. |
+| Component / package | A specific reusable unit. Name the actual unit and explain its responsibility. |
+| Framework | The shared application-building approach and ecosystem; avoid implying that every package requires the whole ecosystem. |
+| PSR-first | A design principle. Name the relevant PSR and the implemented boundary when making a technical claim. |
+| Agent-assisted workflow | Work a person can inspect, reproduce, and review with agent support. Describe the actual steps and outputs. |
+
+Use **PHP**, **Composer**, and **PSR** with their established capitalization. Use the exact spelling of upstream projects and credit them where relevant.
+
+## Visual identity in copy
+
+Use the selected F signature or its standalone fox symbol from the [logo kit](assets/README.md#logo-masters). Its outlined Exo 2 lettering and orange “Fast” are graphic treatments; write **PHP Fast Forward** with spaces in prose and preserve exact package identifiers in code. The licensed logo font does not replace the system interface and code fonts.
+
+Describe a local proposal, a selected direction, a prepared export, and a published asset according to its actual state. A concept-generation receipt preserves the decision's source; later selection does not rewrite that historical receipt as publication evidence. New Dash scenes awaiting review remain proposals until their review status changes.
+
+## Voice
+
+Lead with what the reader can do or what changed. Then explain the reason and the evidence they need. Use active verbs and short, connected paragraphs. Define an unfamiliar concept at the point where it matters.
+
+| Situation | Preferred copy | Avoid |
+| --- | --- | --- |
+| Introduce the framework | “Build with PSR interfaces and compose the components your application needs.” | “The ultimate PHP revolution.” |
+| Explain composition | “This example passes the collaborator through the constructor. You can replace it with another implementation.” | “It works by magic.” |
+| Describe a small API | “The example uses one class to handle the request. The container supplies its dependencies.” | “Zero complexity, guaranteed.” |
+| Welcome a contributor | “Thanks for the example. Please include the PHP version and the command you ran.” | Praise that hides the next action. |
+| State uncertainty | “This configuration has not been tested on Windows. The documented check covers Linux.” | A claim of universal portability without supporting checks. |
+| Report a fix | “The handler now receives the configured collaborator. The regression test covers a missing binding.” | “Everything is fixed.” |
+
+Examples illustrate tone. Only publish statements that match the implementation and the checks performed.
+
+## Structure and interface copy
+
+For a guide, state the outcome, list necessary prerequisites, show the smallest useful example, and explain how to confirm the result. Add alternatives when they help the reader make a choice.
+
+For a change report, state the behavior that changed, why it changed, and the validation performed. Name material limitations. Keep commands close to the step they support.
+
+Use headings that describe the content, links that name their destination, and button labels that describe an action: “Read the guide”, “Browse packages”, or “View the example”. Avoid vague labels such as “Click here”.
+
+Use tables for comparisons and lists for parallel items or ordered steps. Keep ordinary explanations in prose. Give images meaningful alternative text when they convey information. Decorative mascot images should not repeat adjacent text to screen readers.
+
+## Humor and the fox
+
+Use an occasional short line of developer humor when it fits the moment. Keep the instruction useful if the joke is removed. Never joke at the reader's expense or during an urgent error, security notice, data-loss warning, or serious support incident.
+
+The fox can welcome, guide, learn, and express appreciation. Use its pose intentionally and keep character dialogue brief. Avoid forcing fox puns into every page or making fictional dialogue part of a required technical step.
+
+Example of a light aside: “A smaller dependency graph also gives future-you fewer boxes to unpack.”
+
+## Evidence and claims
+
+“Fast Forward” is the product name. Any claim about speed, memory, reliability, compatibility, or reduced work needs its own support.
+
+- Name the PHP version, package version, environment, and method when publishing measurements.
+- Identify the relevant PSR and implementation when claiming standards compatibility.
+- Scope portability claims to the environments actually checked.
+- Describe the number of classes or steps in a specific example instead of promising universally effortless development.
+- Separate a concept, implemented behavior, verified behavior, and a planned feature.
+- Cite upstream documentation and licenses when using third-party components or assets.
+
+Use an explicit placeholder for unfinished examples and label proposals as proposals. Do not present a website concept or a mascot variation as a shipped product feature.
+
+## Code, commands, and output
+
+Keep code examples runnable for the documented environment, or clearly label omitted parts. Use syntax-labeled fenced blocks. Keep explanatory prose outside copyable commands and preserve actual output when showing diagnostic evidence.
+
+Do not add mascot artwork, emoji, slogans, or decorative characters to commands, identifiers, JSON, machine-readable output, or copied logs. Essential status information must have a plain-text meaning; color and illustration may reinforce it.
+
+The [asset catalog](assets/README.md) records the available images and their intended use. Follow it when adding the fox to public content.
diff --git a/SUPPORT.md b/SUPPORT.md
new file mode 100644
index 0000000..593f7eb
--- /dev/null
+++ b/SUPPORT.md
@@ -0,0 +1,11 @@
+# Getting help with PHP Fast Forward
+
+These are organization defaults. Follow the affected repository's own support instructions when present.
+
+For framework behavior, installation, or a specific `fast-forward/*` package, search and ask in the affected package repository. Include the package and PHP versions, the command or minimal example, the expected result, and the actual result. File implementation changes and bug reports there.
+
+For the organization profile, visual identity, mascot, or reusable design assets, use the [profile and design repository](https://github.com/php-fast-forward/.github). Read [DESIGN.md](https://github.com/php-fast-forward/.github/blob/main/DESIGN.md) and [the asset guide](https://github.com/php-fast-forward/.github/blob/main/assets/README.md) before asking about asset use. Describe the intended audience and surface, required format or dimensions, and the existing asset or public reference involved.
+
+Keep examples suitable for public reading. Remove credentials, personal information, private URLs, and confidential material. Follow the affected repository's security policy, or the [shared security guidance](https://github.com/php-fast-forward/.github/blob/main/SECURITY.md), for potential vulnerabilities. Use the [Code of Conduct](https://github.com/php-fast-forward/.github/blob/main/CODE_OF_CONDUCT.md) for conduct concerns.
+
+Use the GitHub channels that the affected repository actually provides. These defaults do not advertise a private support address or a guaranteed response time.
diff --git a/assets/README.md b/assets/README.md
new file mode 100644
index 0000000..808a3d4
--- /dev/null
+++ b/assets/README.md
@@ -0,0 +1,194 @@
+# PHP Fast Forward asset library
+
+Start with [DESIGN.md](../DESIGN.md), [SOUL.md](../SOUL.md), and
+[STYLE.md](../STYLE.md). The [visual specimen](../docs/brand/index.html) shows the
+mascot matrix and the families side by side. The
+[manifest](manifest.json) is the inventory of delivered bytes, provenance,
+dimensions, formats, and classification.
+
+## Source of truth
+
+`assets/` holds the selected reusable identity. `references/` holds concepts and
+historical variants for comparison. `profile/assets/` holds organization-profile
+delivery exports. The selected logo has eight native SVG exports; full Dash
+illustrations remain cataloged PNGs. Retired logos are excluded from the visible
+kit and retained only in the ignored archive with `archived_sources` metadata.
+
+“Canonical” means selected for visual consistency in this identity version.
+It does not mean an author has granted a new license, a complete turnaround
+exists, or every illustration is a native vector drawing. The historical source
+pack records only that its artwork was created in a conversation; its authoring
+and usage-rights gaps remain historical provenance. The current logo's native
+master, generator, and official Exo 2 font source are recorded separately.
+Package references distinguish verified public commit/blob provenance from
+local tracked/untracked sources; public availability is not a redistribution license.
+Do not infer artwork licensing from Composer metadata or a mockup's footer.
+License/authoring gaps are recorded in the [assessment](../docs/brand/assessment.md).
+
+## Reusable files
+
+| File / collection | Role | Surface |
+| --- | --- | --- |
+| [brand/fast-forward-logo.svg](brand/fast-forward-logo.svg) / [dark](brand/fast-forward-logo-dark.svg) | Selected direction F, fox signature with orange “Fast” | Color signature on light / dark surfaces. |
+| [brand/fast-forward-logo-ink.svg](brand/fast-forward-logo-ink.svg) / [white](brand/fast-forward-logo-white.svg) | Monochrome signature, same selected geometry | Ink on light / white on dark. |
+| [brand/fast-forward-mark.svg](brand/fast-forward-mark.svg) / [dark](brand/fast-forward-mark-dark.svg) | Native standalone fox symbol | Small UI and symbol applications on light / dark. |
+| [brand/fast-forward-mark-ink.svg](brand/fast-forward-mark-ink.svg) / [white](brand/fast-forward-mark-white.svg) | Monochrome standalone symbol | Ink on light / white on dark. |
+| [mascot/dash-developer-welcome.png](mascot/dash-developer-welcome.png) | **Primary Dash master**, mature purple-hoodie family | Default package, documentation, institutional. |
+| [Developer reading](mascot/dash-developer-reading.png), [guiding](mascot/dash-developer-guide.png), [composing](mascot/dash-developer-build.png) | Derivatives of the primary developer master | Choose a pose for the surrounding message. |
+| [mascot/dash-editorial-hoodie.png](mascot/dash-editorial-hoodie.png) | **Secondary editorial master**, newly created cute family | Welcome, community, softer institutional moment. |
+| [Editorial reading](mascot/dash-editorial-reading.png), [guiding](mascot/dash-editorial-guide.png), [composing](mascot/dash-editorial-build.png) | Derivatives of the editorial master | Preserve that master's face and painted finish. |
+| [styles/documentation.css](styles/documentation.css) | Standalone documentation pattern and token adapter | Light/navy reading, prose, navigation, code. |
+| [styles/brand.css](styles/brand.css) | Reusable logo and mascot compositions | See the [logo board](../docs/brand/logo-compositions.html). |
+| [backgrounds/hero-trails.png](backgrounds/hero-trails.png) / [footer](backgrounds/footer-trails.png) | Supplied speed-trail surfaces | Decorative editorial backgrounds. |
+
+Use one collection per composition. Developer is the default; editorial is an
+intentional secondary choice. Original cute source-pack drawings and lockups
+were archived locally under ignored `backup/dash/legacy-kit/`, with matching
+hashes verified before removing them from the active kit. Retired logo files
+are also archived with their provenance; their old lettering is not the current
+font definition.
+
+## Logo masters
+
+Direction F is selected: the fox symbol and “Fast” use orange `#FF641B`; the
+dark-surface signature uses white surrounding lettering, and the monochrome
+variants preserve the same geometry. Gradients are optional decorative accents.
+UI colors and full Dash fur/hoodie colors remain governed by [DESIGN.md](../DESIGN.md).
+
+[brand/logo-source.json](brand/logo-source.json) is the editable source of truth
+for symbol paths, lettering outlines, palette, and layout.
+[build-brand-logos.php](../scripts/build-brand-logos.php) builds all eight SVGs
+without fontTools or installed fonts at delivery time:
+
+```sh
+php scripts/build-brand-logos.php
+php scripts/build-brand-logos.php --check
+```
+
+The lettering uses Exo 2 Italic, version 2.010, weight 900. The official variable
+[font](brand/source/Exo2-Italic.ttf) is preserved byte for byte, with its
+[SIL OFL 1.1 notice](brand/source/OFL-Exo2.txt). The
+[font-source record](brand/source/font-source.json) pins the Google Fonts commit,
+URLs, hashes, byte lengths, version, and in-memory outline authoring method.
+Retain the font's notice and license when redistributing the font. Its license
+does not establish rights for unrelated supplied artwork.
+
+The selected production SVGs are separate from the earlier concept-generation
+receipt. Selection and local preparation do not imply external publication.
+
+## Status and provenance
+
+| Status | Meaning |
+| --- | --- |
+| `canonical` | Selected current identity, primary Dash references, and reusable styles/marks. |
+| `package-variant` | Secondary editorial references and local/public package variations, with explicit provenance. |
+| `reference` | Composition/icon/layout reference; no product claims are inherited. |
+| `legacy` | Historical delivery path retained for compatibility, or retired source/logo metadata excluded from the current identity. |
+| `exploratory` | Proposal awaiting review; not a selected master. Display in a review gallery requires separate publication authorization. |
+
+Each manifest entry has a stable ID, file path, role, SHA-256, byte length,
+format, status, and source. Raster metadata records the inspected dimensions,
+mode, and alpha availability. SVG metadata records embedded raster presence.
+Copied files keep the source SHA-256; derivatives explain the transformation.
+No private project source text or illustrations were imported.
+
+Awaiting-review proposals are excluded from Pages unless their catalog records
+explicitly set `publication.scope` to `brand-review-gallery` and
+`publication.authorization` to `maintainer-request`. The five current developer
+scene proposals have that display authorization, matching their generation
+receipts and the maintainer's request to publish the asset-visualization HTML.
+They keep `review_status: awaiting-review`; public display is not canonical
+selection. Publication remains pending the Pages workflow running from `main`.
+
+The ignored local `backup/` remains an archive, including Affinity documents and
+unused exports. It is not required by consumers or validation. Do not add it
+wholesale. The pre-existing untracked GitHub Actions social preview remains
+outside this delivery; it was not silently promoted into canon.
+
+## Updating the library
+
+1. Choose the role and reference family before producing an asset.
+2. Record the source, authoring method, rights evidence, and intended surface.
+3. Add a new filename and manifest entry; preserve historical delivery URLs.
+4. Inspect transparency, edges, anatomy, contrast, and readable size in the
+ specimen. Newly generated poses are derivatives, not automatic canon.
+5. Run `composer check` from the repository root.
+6. For token changes, regenerate all exports and include the design lint result.
+
+The validator verifies bytes and delivery metadata, rejects unsafe SVG content,
+and checks that managed images are cataloged. It does not judge likeness,
+copyright, alt-text quality, or complete accessibility. Those need review.
+
+## Token exports
+
+[DESIGN.md](../DESIGN.md) is normative. Generated files are
+[tokens/tokens.json](tokens/tokens.json) (DTCG),
+[tokens/tailwind.theme.json](tokens/tailwind.theme.json) (Tailwind v3), and
+[tokens/theme.css](tokens/theme.css) (Tailwind v4).
+
+The PHP exporter reads the normative YAML through Composer's Symfony YAML
+dependency, validates tokens and references, exports all three formats, and
+records source/output/generator hashes in `exports.json`:
+
+```sh
+php scripts/export-design.php
+php scripts/export-design.php --check
+```
+
+To prepare a token change while the browser adapter still has old values, use
+`php scripts/export-design.php --tokens-only`, update the token declarations in
+`assets/styles/documentation.css` and its manifest digest, then run `--check` and
+the asset validator. This preparation mode is not the CI validation command.
+
+CI uses `--check` to regenerate and compare the actual outputs with the committed
+exports. The browser adapter must expose every generated token as an active
+top-level `:root` declaration; comments and component-only declarations do not
+satisfy this check.
+
+All styles declare unitless line-height ratios and letter spacing explicitly.
+The exporter separates font
+fallbacks, converts relative `em` tracking to a supported DTCG dimension, and
+adds the associated typography properties used by Tailwind v4 text utilities.
+It rejects incomplete typography instead of publishing silently missing values.
+See the [DTCG typography contract](https://www.designtokens.org/tr/2025.10/format/#typography)
+and [Tailwind text metadata](https://tailwindcss.com/docs/font-size#customizing-your-theme).
+
+Install and run the complete asset, export and regression validation:
+
+```sh
+composer install
+composer check
+```
+
+For RTK-enabled hosts, run these commands through RTK per the local bootstrap.
+The export format follows the [DESIGN.md specification](https://github.com/google-labs-code/design.md).
+
+## Consumption
+
+Use repository-relative paths inside this repository. Consumer repository
+banners live at `docs/_static/mascot-banner.png` and README links use that local
+path. The central artwork catalog retains production details; consumers do not
+need an extra assets guide or generation manifest. Library archives exclude
+`/docs/` and `/README*.md`; runtime assets used by the documentation template live
+with its `data/` files. For remote embeds, pin the raw GitHub asset URL to a
+commit so an unrelated future export cannot change an already released page.
+Preserve asset provenance and any applicable notices with the copy.
+
+Serve PNG as `image/png` and SVG as `image/svg+xml`. Give meaningful artwork
+alt text. Decorative artwork has empty alt text. Use the dark color signature
+or white monochrome variant on navy; choose the light color or ink variant on
+light surfaces. Full signatures are outlined SVGs, while composed profile images
+can combine these vectors with raster Dash artwork.
+
+## Generate consistent Dash artwork
+
+Use the versioned [dash-art skill](../skills/dash-art/SKILL.md), the
+[production guide](../docs/brand/mascot-production.md), and actual master images.
+The [generation receipts](../docs/brand/dash-generation.json) preserve exact
+prompts, source hashes, edits, output identity, and the tool information exposed
+during production. The built-in image generator was used; no model/version was
+invented when the tool did not expose one. A file-integrity check does not prove
+likeness or clear rights.
+
+The skill is source in this repository; this change installs nothing in a host's
+skill collection. A consumer can provide this checkout as `DASH_BRAND_ROOT`.
diff --git a/assets/backgrounds/footer-trails.png b/assets/backgrounds/footer-trails.png
new file mode 100644
index 0000000..c6a1a40
Binary files /dev/null and b/assets/backgrounds/footer-trails.png differ
diff --git a/assets/backgrounds/hero-trails.png b/assets/backgrounds/hero-trails.png
new file mode 100644
index 0000000..1adcf88
Binary files /dev/null and b/assets/backgrounds/hero-trails.png differ
diff --git a/assets/brand/fast-forward-logo-dark.svg b/assets/brand/fast-forward-logo-dark.svg
new file mode 100644
index 0000000..eac6e15
--- /dev/null
+++ b/assets/brand/fast-forward-logo-dark.svg
@@ -0,0 +1,26 @@
+
diff --git a/assets/brand/fast-forward-logo-ink.svg b/assets/brand/fast-forward-logo-ink.svg
new file mode 100644
index 0000000..fb2d58c
--- /dev/null
+++ b/assets/brand/fast-forward-logo-ink.svg
@@ -0,0 +1,30 @@
+
diff --git a/assets/brand/fast-forward-logo-white.svg b/assets/brand/fast-forward-logo-white.svg
new file mode 100644
index 0000000..50a82b5
--- /dev/null
+++ b/assets/brand/fast-forward-logo-white.svg
@@ -0,0 +1,30 @@
+
diff --git a/assets/brand/fast-forward-logo.svg b/assets/brand/fast-forward-logo.svg
new file mode 100644
index 0000000..de68907
--- /dev/null
+++ b/assets/brand/fast-forward-logo.svg
@@ -0,0 +1,26 @@
+
diff --git a/assets/brand/fast-forward-mark-dark.svg b/assets/brand/fast-forward-mark-dark.svg
new file mode 100644
index 0000000..ff3802c
--- /dev/null
+++ b/assets/brand/fast-forward-mark-dark.svg
@@ -0,0 +1,12 @@
+
diff --git a/assets/brand/fast-forward-mark-ink.svg b/assets/brand/fast-forward-mark-ink.svg
new file mode 100644
index 0000000..ffa025d
--- /dev/null
+++ b/assets/brand/fast-forward-mark-ink.svg
@@ -0,0 +1,16 @@
+
diff --git a/assets/brand/fast-forward-mark-white.svg b/assets/brand/fast-forward-mark-white.svg
new file mode 100644
index 0000000..d176917
--- /dev/null
+++ b/assets/brand/fast-forward-mark-white.svg
@@ -0,0 +1,16 @@
+
diff --git a/assets/brand/fast-forward-mark.svg b/assets/brand/fast-forward-mark.svg
new file mode 100644
index 0000000..5896413
--- /dev/null
+++ b/assets/brand/fast-forward-mark.svg
@@ -0,0 +1,12 @@
+
diff --git a/assets/brand/logo-source.json b/assets/brand/logo-source.json
new file mode 100644
index 0000000..703d104
--- /dev/null
+++ b/assets/brand/logo-source.json
@@ -0,0 +1,272 @@
+{
+ "schema_version": 1,
+ "name": "PHP Fast Forward — Dash fox signature",
+ "direction": "F",
+ "selection": {
+ "status": "direction-selected",
+ "publication": "local-not-published",
+ "evidence": "User selected the fox direction with Fast in orange and its monochrome counterpart on 2026-10-03.",
+ "origin": "Generative concept; production geometry authored as native paths. Final exports are presented separately before publication."
+ },
+ "symbol": {
+ "view_box": [
+ 0,
+ 0,
+ 320,
+ 320
+ ],
+ "description": "A right-facing fox with two upright ears, a cream muzzle and a forward curl beneath the head. This is a brand symbol, not a literal Dash character model.",
+ "paths": [
+ {
+ "id": "rear-ear",
+ "role": "rear",
+ "d": "M135 4 C118 34 108 65 102 94 L163 88 C161 52 147 20 135 4 Z"
+ },
+ {
+ "id": "front-ear",
+ "role": "orange",
+ "d": "M163 18 C187 34 208 65 220 91 L178 100 C181 72 174 42 163 18 Z"
+ },
+ {
+ "id": "head",
+ "role": "orange",
+ "d": "M102 94 C142 81 186 79 220 91 C244 104 256 122 265 141 C275 154 295 158 314 162 C308 182 288 193 262 192 C227 191 204 180 180 184 C115 187 50 215 28 271 C6 253 0 227 1 203 C0 172 14 145 37 126 C56 110 77 100 102 94 Z"
+ },
+ {
+ "id": "forward-curl",
+ "role": "orange",
+ "d": "M151 207 C194 198 238 220 278 247 C245 282 206 314 153 315 C180 296 201 269 204 247 C195 229 174 214 151 207 Z"
+ },
+ {
+ "id": "lower-curl",
+ "role": "orange",
+ "d": "M42 281 C48 247 79 224 111 226 C135 239 155 255 175 264 C136 298 83 322 42 281 Z"
+ },
+ {
+ "id": "muzzle",
+ "role": "cream",
+ "d": "M49 184 C91 148 124 132 163 130 C198 128 231 143 256 154 C273 163 296 163 314 162 C308 182 288 193 262 192 C227 191 204 180 180 184 C160 184 145 189 132 194 C98 174 79 174 49 184 Z"
+ },
+ {
+ "id": "eye",
+ "role": "eye",
+ "d": "M201 128 C221 131 235 143 239 157 C226 145 214 135 201 128 Z"
+ },
+ {
+ "id": "nose",
+ "role": "nose",
+ "d": "M287 159 L315 162 C310 175 301 183 291 187 C296 176 283 168 287 159 Z"
+ }
+ ]
+ },
+ "layout": {
+ "x": 355,
+ "word_gap": 16,
+ "right_padding": 24,
+ "lines": [
+ {
+ "text": "PHP",
+ "baseline": 137,
+ "size": 70
+ },
+ {
+ "text": "FastForward",
+ "baseline": 242,
+ "size": 96
+ }
+ ]
+ },
+ "variants": {
+ "color": {
+ "orange": "#FF641B",
+ "rear": "#142033",
+ "cream": "#FFF3DF",
+ "eye": "#142033",
+ "nose": "#142033",
+ "lettering": "#142033"
+ },
+ "dark": {
+ "orange": "#FF641B",
+ "rear": "#FFFFFF",
+ "cream": "#FFF3DF",
+ "eye": "#142033",
+ "nose": "#142033",
+ "lettering": "#FFFFFF"
+ },
+ "ink": {
+ "orange": "#142033",
+ "rear": "#142033",
+ "cream": "#142033",
+ "eye": "#142033",
+ "nose": "#142033",
+ "lettering": "#142033"
+ },
+ "white": {
+ "orange": "#FFFFFF",
+ "rear": "#FFFFFF",
+ "cream": "#FFFFFF",
+ "eye": "#FFFFFF",
+ "nose": "#FFFFFF",
+ "lettering": "#FFFFFF"
+ }
+ },
+ "lettering": {
+ "schema_version": 1,
+ "text": "PHPFastForward",
+ "font_family": "Exo 2",
+ "font_style": "Italic",
+ "weight": 900,
+ "units_per_em": 1000,
+ "font_version": "Version 2.010",
+ "font_sha256": "bad568cea9ed23d6ae4aea41ad3f7747752952aabdd85d7f01474af392a21b32",
+ "source_commit": "9710da1eacb3be272583c3224dcb70f9da6eadbb",
+ "source_files": [
+ {
+ "path": "assets/brand/source/Exo2-Italic.ttf",
+ "sha256": "bad568cea9ed23d6ae4aea41ad3f7747752952aabdd85d7f01474af392a21b32"
+ },
+ {
+ "path": "assets/brand/source/OFL-Exo2.txt",
+ "sha256": "7f95a8eeecc6904ffc81cd10cc8ebc7fcee72a67922924bf45f02dff03b88127"
+ },
+ {
+ "path": "assets/brand/source/font-source.json",
+ "sha256": "0f3cf752ecd482979a583cb0afd63ba6a747d0b6c96e0150d33be101c55fde9b"
+ }
+ ],
+ "coordinate_system": "font-y-up; baseline y=0; SVG composition must invert the y axis",
+ "metrics": {
+ "ascender": 999,
+ "descender": -201,
+ "line_gap": 0
+ },
+ "glyphs": {
+ "P": {
+ "glyph_name": "P",
+ "path": "M386 700Q492 700 553.0 678.5Q614 657 636.0 604.0Q658 551 645 457Q633 368 603.5 319.0Q574 270 518.5 251.0Q463 232 372 232Q321 232 271.5 237.5Q222 243 179.5 252.0Q137 261 107.0 271.0Q77 281 66 289L72 385Q140 385 213.0 385.0Q286 385 353 385Q379 385 394.0 390.0Q409 395 417.5 414.0Q426 433 431 473Q435 501 432.5 517.0Q430 533 418.0 540.0Q406 547 381 547Q278 547 206.5 545.5Q135 544 110 541L108 690Q153 695 192.0 697.0Q231 699 276.5 699.5Q322 700 386 700ZM324 690 227 0H11L108 690Z",
+ "advance": 638,
+ "bounds": [
+ 11,
+ 0,
+ 649.8285714285714,
+ 700
+ ]
+ },
+ "H": {
+ "glyph_name": "H",
+ "path": "M326 690 229 0H12L109 690ZM467 443 445 289H262L283 443ZM708 690 611 0H394L491 690Z",
+ "advance": 705,
+ "bounds": [
+ 12,
+ 0,
+ 708,
+ 690
+ ]
+ },
+ "F": {
+ "glyph_name": "F",
+ "path": "M261 694Q350 694 442.0 692.0Q534 690 603 679L579 528H349Q322 528 310.0 519.5Q298 511 295 488L227 0H9L85 541Q95 612 143.0 653.0Q191 694 261 694ZM85 411H525L507 267H64Z",
+ "advance": 567,
+ "bounds": [
+ 9,
+ 0,
+ 603,
+ 694
+ ]
+ },
+ "a": {
+ "glyph_name": "a",
+ "path": "M354 514Q380 514 415.5 511.0Q451 508 487.5 503.0Q524 498 553.5 492.5Q583 487 597 482L434 376Q409 377 386.0 377.0Q363 377 328 377Q312 377 298.0 373.5Q284 370 273.0 359.5Q262 349 253.0 327.5Q244 306 239 270Q232 219 229.5 192.5Q227 166 234.0 157.0Q241 148 260 149Q279 151 302.0 169.5Q325 188 346.0 216.5Q367 245 380 277L414 221Q399 148 365.5 97.5Q332 47 283.0 20.0Q234 -7 170 -12Q98 -17 62.0 16.0Q26 49 19.0 113.0Q12 177 25 264Q39 353 66.5 403.5Q94 454 135.5 477.5Q177 501 232.0 507.5Q287 514 354 514ZM392 500 597 482 529 0H367L365 109L338 125Z",
+ "advance": 613,
+ "bounds": [
+ 16.55,
+ -12.657894736842104,
+ 597,
+ 514
+ ]
+ },
+ "s": {
+ "glyph_name": "s",
+ "path": "M278 514Q318 514 365.0 511.0Q412 508 456.5 503.0Q501 498 530 491L513 370Q464 370 415.0 370.0Q366 370 322 370Q287 370 268.5 369.5Q250 369 243.0 367.0Q236 365 235 360Q234 353 243.5 347.0Q253 341 284 333L393 304Q434 293 461.0 272.0Q488 251 500.0 219.5Q512 188 507 146Q499 80 467.0 46.5Q435 13 381.5 1.0Q328 -11 253 -11Q222 -11 182.5 -9.5Q143 -8 96.5 -3.0Q50 2 -3 11L14 132Q27 132 55.0 132.0Q83 132 117.0 132.0Q151 132 182 132Q234 132 260.0 133.5Q286 135 295.5 138.5Q305 142 306 148Q307 153 303.0 156.5Q299 160 287.0 164.5Q275 169 252 175L147 205Q100 219 73.5 243.5Q47 268 38.5 302.0Q30 336 36 376Q43 420 66.0 450.5Q89 481 139.5 497.5Q190 514 278 514Z",
+ "advance": 548,
+ "bounds": [
+ -3,
+ -11,
+ 530,
+ 514
+ ]
+ },
+ "t": {
+ "glyph_name": "t",
+ "path": "M354 631 289 178Q286 159 291.5 152.5Q297 146 320 146H379L390 10Q367 1 336.0 -4.0Q305 -9 274.5 -11.5Q244 -14 223 -14Q147 -14 105.0 25.0Q63 64 73 130L147 631ZM455 500 438 374H23L38 495L135 500Z",
+ "advance": 439,
+ "bounds": [
+ 23,
+ -14,
+ 455,
+ 631
+ ]
+ },
+ "o": {
+ "glyph_name": "o",
+ "path": "M327 514Q427 514 488.5 487.0Q550 460 573.0 400.5Q596 341 582 241Q569 147 535.5 91.5Q502 36 440.0 12.0Q378 -12 278 -12Q179 -12 117.0 14.5Q55 41 31.0 100.0Q7 159 21 257Q35 353 68.0 409.0Q101 465 164.0 489.5Q227 514 327 514ZM323 372Q296 372 281.0 362.0Q266 352 257.0 324.0Q248 296 240 241Q234 195 234.5 171.0Q235 147 247.5 138.5Q260 130 286 130Q312 130 326.0 140.0Q340 150 348.5 177.5Q357 205 365 257Q372 305 371.0 329.5Q370 354 359.0 363.0Q348 372 323 372Z",
+ "advance": 615,
+ "bounds": [
+ 15.842105263157896,
+ -12,
+ 587.2972972972973,
+ 514
+ ]
+ },
+ "r": {
+ "glyph_name": "r",
+ "path": "M237 500 247 398 266 386 214 0H3L73 500ZM479 514 436 322H389Q362 322 329.0 319.0Q296 316 242 307L234 424Q289 471 342.0 492.5Q395 514 443 514Z",
+ "advance": 452,
+ "bounds": [
+ 3,
+ 0,
+ 479,
+ 514
+ ]
+ },
+ "w": {
+ "glyph_name": "w",
+ "path": "M116 0Q91 0 75.0 16.5Q59 33 57 56L41 501H254L246 130H252Q267 130 276.5 146.0Q286 162 294 196Q299 214 303.5 236.5Q308 259 312 287Q316 309 319.5 334.0Q323 359 327.0 387.5Q331 416 336 448Q338 465 352.5 482.5Q367 500 398 500H570Q594 500 610.0 485.0Q626 470 627 447L630 130H637Q656 130 662.0 152.0Q668 174 675 208Q682 239 686.5 266.5Q691 294 695 322Q701 361 705.5 403.5Q710 446 714 500H922Q918 465 913.0 430.0Q908 395 902.0 361.0Q896 327 888 294Q878 248 865.5 205.5Q853 163 839 128Q821 83 796.5 54.5Q772 26 731.0 13.0Q690 0 619 0H542Q517 0 500.0 16.5Q483 33 483 56L485 376H473Q472 368 469.5 349.0Q467 330 463.0 305.5Q459 281 454 253Q451 234 447.0 214.0Q443 194 439.0 176.0Q435 158 431 142Q413 74 384.0 44.0Q355 14 316.0 7.0Q277 0 226 0Z",
+ "advance": 925,
+ "bounds": [
+ 41,
+ 0,
+ 922,
+ 501
+ ]
+ },
+ "d": {
+ "glyph_name": "d",
+ "path": "M236 514Q318 514 387.0 502.5Q456 491 492 465L473 387Q438 387 407.5 387.0Q377 387 327 387Q305 387 290.0 382.5Q275 378 265.5 366.0Q256 354 249.5 331.0Q243 308 238 270Q234 234 232.0 209.5Q230 185 237.0 173.0Q244 161 264 162Q296 164 321.5 180.0Q347 196 368 212L406 126Q394 112 371.5 89.0Q349 66 318.5 43.0Q288 20 252.0 4.0Q216 -12 175 -12Q113 -12 75.5 18.5Q38 49 25.0 110.5Q12 172 24 264Q34 339 53.5 388.0Q73 437 100.5 464.5Q128 492 162.5 503.0Q197 514 236 514ZM631 700 532 0H366L360 134L341 145L387 484L396 500Q396 525 397.5 551.0Q399 577 403 605L421 700Z",
+ "advance": 617,
+ "bounds": [
+ 18.240000000000002,
+ -12,
+ 631,
+ 700
+ ]
+ }
+ },
+ "layout_note": "Individual glyph paths and horizontal advance widths. No shaped sequence or pair-kerning claim.",
+ "authoring": {
+ "tool": "fontTools",
+ "version": "4.66.1",
+ "instance": {
+ "wght": 900
+ },
+ "pen": "SVGPathPen"
+ },
+ "kerning": {
+ "Fa": -12,
+ "Fo": -10,
+ "st": -10,
+ "wa": -12,
+ "rd": -8
+ }
+ }
+}
diff --git a/assets/brand/source/Exo2-Italic.ttf b/assets/brand/source/Exo2-Italic.ttf
new file mode 100644
index 0000000..912ba65
Binary files /dev/null and b/assets/brand/source/Exo2-Italic.ttf differ
diff --git a/assets/brand/source/OFL-Exo2.txt b/assets/brand/source/OFL-Exo2.txt
new file mode 100644
index 0000000..5bec984
--- /dev/null
+++ b/assets/brand/source/OFL-Exo2.txt
@@ -0,0 +1,93 @@
+Copyright 2013 The Exo 2 Project Authors (https://github.com/googlefonts/Exo-2.0)
+
+This Font Software is licensed under the SIL Open Font License, Version 1.1.
+This license is copied below, and is also available with a FAQ at:
+https://openfontlicense.org
+
+
+-----------------------------------------------------------
+SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007
+-----------------------------------------------------------
+
+PREAMBLE
+The goals of the Open Font License (OFL) are to stimulate worldwide
+development of collaborative font projects, to support the font creation
+efforts of academic and linguistic communities, and to provide a free and
+open framework in which fonts may be shared and improved in partnership
+with others.
+
+The OFL allows the licensed fonts to be used, studied, modified and
+redistributed freely as long as they are not sold by themselves. The
+fonts, including any derivative works, can be bundled, embedded,
+redistributed and/or sold with any software provided that any reserved
+names are not used by derivative works. The fonts and derivatives,
+however, cannot be released under any other type of license. The
+requirement for fonts to remain under this license does not apply
+to any document created using the fonts or their derivatives.
+
+DEFINITIONS
+"Font Software" refers to the set of files released by the Copyright
+Holder(s) under this license and clearly marked as such. This may
+include source files, build scripts and documentation.
+
+"Reserved Font Name" refers to any names specified as such after the
+copyright statement(s).
+
+"Original Version" refers to the collection of Font Software components as
+distributed by the Copyright Holder(s).
+
+"Modified Version" refers to any derivative made by adding to, deleting,
+or substituting -- in part or in whole -- any of the components of the
+Original Version, by changing formats or by porting the Font Software to a
+new environment.
+
+"Author" refers to any designer, engineer, programmer, technical
+writer or other person who contributed to the Font Software.
+
+PERMISSION & CONDITIONS
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of the Font Software, to use, study, copy, merge, embed, modify,
+redistribute, and sell modified and unmodified copies of the Font
+Software, subject to the following conditions:
+
+1) Neither the Font Software nor any of its individual components,
+in Original or Modified Versions, may be sold by itself.
+
+2) Original or Modified Versions of the Font Software may be bundled,
+redistributed and/or sold with any software, provided that each copy
+contains the above copyright notice and this license. These can be
+included either as stand-alone text files, human-readable headers or
+in the appropriate machine-readable metadata fields within text or
+binary files as long as those fields can be easily viewed by the user.
+
+3) No Modified Version of the Font Software may use the Reserved Font
+Name(s) unless explicit written permission is granted by the corresponding
+Copyright Holder. This restriction only applies to the primary font name as
+presented to the users.
+
+4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font
+Software shall not be used to promote, endorse or advertise any
+Modified Version, except to acknowledge the contribution(s) of the
+Copyright Holder(s) and the Author(s) or with their explicit written
+permission.
+
+5) The Font Software, modified or unmodified, in part or in whole,
+must be distributed entirely under this license, and must not be
+distributed under any other license. The requirement for fonts to
+remain under this license does not apply to any document created
+using the Font Software.
+
+TERMINATION
+This license becomes null and void if any of the above conditions are
+not met.
+
+DISCLAIMER
+THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
+OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE
+COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL
+DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM
+OTHER DEALINGS IN THE FONT SOFTWARE.
diff --git a/assets/brand/source/font-source.json b/assets/brand/source/font-source.json
new file mode 100644
index 0000000..f85febd
--- /dev/null
+++ b/assets/brand/source/font-source.json
@@ -0,0 +1,44 @@
+{
+ "schema_version": 1,
+ "id": "font-exo2-italic",
+ "family": "Exo 2",
+ "style": "Italic",
+ "version": "Version 2.010",
+ "font_revision": 2.0099945068359375,
+ "upstream": {
+ "repository": "https://github.com/google/fonts",
+ "commit": "9710da1eacb3be272583c3224dcb70f9da6eadbb",
+ "path": "ofl/exo2/Exo2-Italic[wght].ttf",
+ "url": "https://raw.githubusercontent.com/google/fonts/9710da1eacb3be272583c3224dcb70f9da6eadbb/ofl/exo2/Exo2-Italic%5Bwght%5D.ttf"
+ },
+ "file": {
+ "path": "assets/brand/source/Exo2-Italic.ttf",
+ "sha256": "bad568cea9ed23d6ae4aea41ad3f7747752952aabdd85d7f01474af392a21b32",
+ "bytes": 302556,
+ "preservation": "official variable font bytes, unmodified"
+ },
+ "license": {
+ "identifier": "OFL-1.1",
+ "path": "assets/brand/source/OFL-Exo2.txt",
+ "upstream_url": "https://raw.githubusercontent.com/google/fonts/9710da1eacb3be272583c3224dcb70f9da6eadbb/ofl/exo2/OFL.txt",
+ "sha256": "7f95a8eeecc6904ffc81cd10cc8ebc7fcee72a67922924bf45f02dff03b88127",
+ "bytes": 4386
+ },
+ "axes": [
+ {
+ "tag": "wght",
+ "minimum": 100.0,
+ "default": 400.0,
+ "maximum": 900.0
+ }
+ ],
+ "lettering_instance": {
+ "wght": 900
+ },
+ "authoring": {
+ "tool": "fontTools",
+ "version": "4.66.1",
+ "operation": "instantiateVariableFont in memory; SVGPathPen outlines; no modified font distributed"
+ },
+ "scope": "Logo lettering only. Interface typography remains the system-font design tokens."
+}
diff --git a/assets/manifest.json b/assets/manifest.json
new file mode 100644
index 0000000..5134e1d
--- /dev/null
+++ b/assets/manifest.json
@@ -0,0 +1,2902 @@
+{
+ "schema_version": 1,
+ "identity_version": "2026-10-03",
+ "description": "Selected reusable assets and classified references; visual canon is DESIGN.md.",
+ "assets": [
+ {
+ "id": "background-footer",
+ "path": "assets/backgrounds/footer-trails.png",
+ "category": "background",
+ "status": "canonical",
+ "role": "Dark footer trails",
+ "provenance": {
+ "source": "supplied-backup:php_fast_forward_clean_assets_transparent/03_backgrounds/footer_background_light_trails.png",
+ "source_sha256": "41034968ba866387f06c540c49eb2d838500c87b0f696d709585d319d8bcdd3d"
+ },
+ "rights": "Not recorded in supplied source; no new asset license is asserted.",
+ "sha256": "41034968ba866387f06c540c49eb2d838500c87b0f696d709585d319d8bcdd3d",
+ "bytes": 843347,
+ "format": "png",
+ "width": 1774,
+ "height": 887,
+ "mode": "RGB",
+ "has_alpha": false
+ },
+ {
+ "id": "background-hero",
+ "path": "assets/backgrounds/hero-trails.png",
+ "category": "background",
+ "status": "canonical",
+ "role": "Dark hero trails",
+ "provenance": {
+ "source": "supplied-backup:php_fast_forward_clean_assets_transparent/03_backgrounds/hero_background_light_trails.png",
+ "source_sha256": "62427aa0080f6148bc654daa1a1f3699ed565899221125280866cb7e1072c5f4"
+ },
+ "rights": "Not recorded in supplied source; no new asset license is asserted.",
+ "sha256": "62427aa0080f6148bc654daa1a1f3699ed565899221125280866cb7e1072c5f4",
+ "bytes": 952363,
+ "format": "png",
+ "width": 1672,
+ "height": 941,
+ "mode": "RGB",
+ "has_alpha": false
+ },
+ {
+ "id": "legacy-mascot-wave-heart",
+ "path": "profile/assets/mascot-wave-heart.svg",
+ "category": "profile",
+ "status": "legacy",
+ "role": "Historical profile URL retained for compatibility",
+ "provenance": {
+ "source": "repository:profile/assets/mascot-wave-heart.svg",
+ "source_sha256": "66a5a0d85dde0543b9844474932cc10cc9ff59220f6e33af98aff1960df8aa2a",
+ "source_commit": "ea130ec1af8c01e4b13d7767f7dc51ec216e3087"
+ },
+ "rights": "Not recorded in supplied source; no new asset license is asserted.",
+ "sha256": "66a5a0d85dde0543b9844474932cc10cc9ff59220f6e33af98aff1960df8aa2a",
+ "bytes": 1212543,
+ "format": "svg",
+ "embedded_raster": true
+ },
+ {
+ "id": "reference-icon-collection-reference-transparent-cropped-png",
+ "path": "references/icons/icon_collection_reference_transparent_cropped.png",
+ "category": "icons",
+ "status": "reference",
+ "role": "Archived icon reference; rights not recorded",
+ "provenance": {
+ "source": "supplied-backup:php_fast_forward_clean_assets_transparent/05_icons/icon_collection_reference_transparent_cropped.png",
+ "source_sha256": "617d82040efc9115160e05c410fc1126b2b9ba8453642da740e278ad49df5d0d"
+ },
+ "rights": "Not recorded in supplied source; no new asset license is asserted.",
+ "sha256": "617d82040efc9115160e05c410fc1126b2b9ba8453642da740e278ad49df5d0d",
+ "bytes": 607184,
+ "format": "png",
+ "width": 1336,
+ "height": 929,
+ "mode": "RGBA",
+ "has_alpha": true
+ },
+ {
+ "id": "reference-icon-sprite-css",
+ "path": "references/icons/icon_sprite.css",
+ "category": "icons",
+ "status": "reference",
+ "role": "Archived icon reference; rights not recorded",
+ "provenance": {
+ "source": "supplied-backup:php_fast_forward_clean_assets_transparent/05_icons/icon_sprite.css",
+ "source_sha256": "625a291dcd59d40a7fbb56f9f7dbf077839346602c86677e4ad955be62c1ab3f",
+ "transformation": "Corrected sprite image URL to icon_sprite.png; geometry unchanged."
+ },
+ "rights": "Not recorded in supplied source; no new asset license is asserted.",
+ "sha256": "a4bcf96154ec5cb014daadc2fa3047a17e6123521157e3de92c9fb62f797bde9",
+ "bytes": 2183,
+ "format": "css"
+ },
+ {
+ "id": "reference-icon-sprite-png",
+ "path": "references/icons/icon_sprite.png",
+ "category": "icons",
+ "status": "reference",
+ "role": "Archived icon reference; rights not recorded",
+ "provenance": {
+ "source": "supplied-backup:php_fast_forward_clean_assets_transparent/05_icons/icon_sprite.png",
+ "source_sha256": "28da6ecb76f81c58fe075fa65ebe805cd6df7e42771130d95503dea5e9bf39f5"
+ },
+ "rights": "Not recorded in supplied source; no new asset license is asserted.",
+ "sha256": "28da6ecb76f81c58fe075fa65ebe805cd6df7e42771130d95503dea5e9bf39f5",
+ "bytes": 71632,
+ "format": "png",
+ "width": 1024,
+ "height": 512,
+ "mode": "RGBA",
+ "has_alpha": true
+ },
+ {
+ "id": "reference-icon-sprite-svg",
+ "path": "references/icons/icon_sprite.svg",
+ "category": "icons",
+ "status": "reference",
+ "role": "Archived icon reference; rights not recorded",
+ "provenance": {
+ "source": "supplied-backup:php_fast_forward_clean_assets_transparent/05_icons/icon_sprite.svg",
+ "source_sha256": "e6e4ba7b51eac60f9cb3a0fd495f47faf574c0f599aebccc1dbc6930c48641f6"
+ },
+ "rights": "Not recorded in supplied source; no new asset license is asserted.",
+ "sha256": "e6e4ba7b51eac60f9cb3a0fd495f47faf574c0f599aebccc1dbc6930c48641f6",
+ "bytes": 13485,
+ "format": "svg",
+ "embedded_raster": false
+ },
+ {
+ "id": "reference-icon-sprite-manifest-json",
+ "path": "references/icons/icon_sprite_manifest.json",
+ "category": "icons",
+ "status": "reference",
+ "role": "Archived icon reference; rights not recorded",
+ "provenance": {
+ "source": "supplied-backup:php_fast_forward_clean_assets_transparent/05_icons/icon_sprite_manifest.json",
+ "source_sha256": "1bccbbd469425d75b94ae609ffbbbd2e813aaad08ed5d5c930e55b72b9a95554"
+ },
+ "rights": "Not recorded in supplied source; no new asset license is asserted.",
+ "sha256": "1bccbbd469425d75b94ae609ffbbbd2e813aaad08ed5d5c930e55b72b9a95554",
+ "bytes": 8919,
+ "format": "json"
+ },
+ {
+ "id": "reference-icon-symbols-svg",
+ "path": "references/icons/icon_symbols.svg",
+ "category": "icons",
+ "status": "reference",
+ "role": "Archived icon reference; rights not recorded",
+ "provenance": {
+ "source": "supplied-backup:php_fast_forward_clean_assets_transparent/05_icons/icon_symbols.svg",
+ "source_sha256": "cd275338a016ab5bacc5eeffebb151ddc0a0be561ae55ad560395fbbb7c933a8"
+ },
+ "rights": "Not recorded in supplied source; no new asset license is asserted.",
+ "sha256": "cd275338a016ab5bacc5eeffebb151ddc0a0be561ae55ad560395fbbb7c933a8",
+ "bytes": 11137,
+ "format": "svg",
+ "embedded_raster": false
+ },
+ {
+ "id": "dash-editorial-hoodie",
+ "path": "assets/mascot/dash-editorial-hoodie.png",
+ "category": "mascot",
+ "status": "package-variant",
+ "family": "editorial",
+ "role": "Secondary editorial identity master",
+ "provenance": {
+ "source": "generated:image_gen.imagegen; docs/brand/dash-generation.json#dash-editorial-hoodie",
+ "source_sha256": "6c8eae7c1987ce8145ef0d6d3a861ec6aadd16d64bec5e2f61f67346425d2e58",
+ "generation_receipt": "docs/brand/dash-generation.json",
+ "source_ids": [
+ "reference-package-dev-tools"
+ ]
+ },
+ "rights": "Generated during authorized repository identity work; source artwork rights remain unrecorded, no separate asset license is asserted.",
+ "sha256": "32da08a9e6c868687887e2557885d27e4e1f43b99dddf26787da1d8aa4798090",
+ "bytes": 1244120,
+ "format": "png",
+ "width": 1312,
+ "height": 1199,
+ "mode": "RGBA",
+ "has_alpha": true
+ },
+ {
+ "id": "dash-editorial-reading",
+ "path": "assets/mascot/dash-editorial-reading.png",
+ "category": "mascot",
+ "status": "package-variant",
+ "family": "editorial",
+ "role": "Same-collection pose reference",
+ "provenance": {
+ "source": "generated:image_gen.imagegen; docs/brand/dash-generation.json#dash-editorial-reading",
+ "source_sha256": "32da08a9e6c868687887e2557885d27e4e1f43b99dddf26787da1d8aa4798090",
+ "generation_receipt": "docs/brand/dash-generation.json",
+ "source_ids": [
+ "dash-editorial-hoodie"
+ ]
+ },
+ "rights": "Generated during authorized repository identity work; source artwork rights remain unrecorded, no separate asset license is asserted.",
+ "sha256": "e0389e36c14d7d4176a82db0e08461ec364c4d45c00d31247947970d8d218551",
+ "bytes": 1313121,
+ "format": "png",
+ "width": 1312,
+ "height": 1199,
+ "mode": "RGBA",
+ "has_alpha": true
+ },
+ {
+ "id": "dash-editorial-guide",
+ "path": "assets/mascot/dash-editorial-guide.png",
+ "category": "mascot",
+ "status": "package-variant",
+ "family": "editorial",
+ "role": "Same-collection pose reference",
+ "provenance": {
+ "source": "generated:image_gen.imagegen; docs/brand/dash-generation.json#dash-editorial-guide",
+ "source_sha256": "32da08a9e6c868687887e2557885d27e4e1f43b99dddf26787da1d8aa4798090",
+ "generation_receipt": "docs/brand/dash-generation.json",
+ "source_ids": [
+ "dash-editorial-hoodie"
+ ]
+ },
+ "rights": "Generated during authorized repository identity work; source artwork rights remain unrecorded, no separate asset license is asserted.",
+ "sha256": "30797ab924e979662ce01e47cd101a429b50c8dd854d1f118575f0fcf066401c",
+ "bytes": 1225215,
+ "format": "png",
+ "width": 1312,
+ "height": 1199,
+ "mode": "RGBA",
+ "has_alpha": true
+ },
+ {
+ "id": "dash-editorial-build",
+ "path": "assets/mascot/dash-editorial-build.png",
+ "category": "mascot",
+ "status": "package-variant",
+ "family": "editorial",
+ "role": "Same-collection pose reference",
+ "provenance": {
+ "source": "generated:image_gen.imagegen; docs/brand/dash-generation.json#dash-editorial-build",
+ "source_sha256": "32da08a9e6c868687887e2557885d27e4e1f43b99dddf26787da1d8aa4798090",
+ "generation_receipt": "docs/brand/dash-generation.json",
+ "source_ids": [
+ "dash-editorial-hoodie"
+ ]
+ },
+ "rights": "Generated during authorized repository identity work; source artwork rights remain unrecorded, no separate asset license is asserted.",
+ "sha256": "c6bec169f8a014ba3952f65efc254d77c2895ab552726a7e5cb0052a3ca17891",
+ "bytes": 1245674,
+ "format": "png",
+ "width": 1312,
+ "height": 1199,
+ "mode": "RGBA",
+ "has_alpha": true
+ },
+ {
+ "id": "dash-developer-welcome",
+ "path": "assets/mascot/dash-developer-welcome.png",
+ "category": "mascot",
+ "status": "canonical",
+ "family": "developer",
+ "role": "Primary developer identity master",
+ "provenance": {
+ "source": "generated:image_gen.imagegen; docs/brand/dash-generation.json#dash-developer-welcome",
+ "source_sha256": "430d20cf74eb0c800b8b5f6d709dfeb18fffd44da40a2af99f8c3018e968dceb",
+ "generation_receipt": "docs/brand/dash-generation.json",
+ "source_ids": [
+ "reference-package-event-dispatcher",
+ "reference-package-fork",
+ "reference-package-dev-tools"
+ ]
+ },
+ "rights": "Generated during authorized repository identity work; source artwork rights remain unrecorded, no separate asset license is asserted.",
+ "sha256": "38b2c5bb87c94326bcab6463f74fc785414d8539e9175e088b5a5c797a466e09",
+ "bytes": 2010542,
+ "format": "png",
+ "width": 1024,
+ "height": 1536,
+ "mode": "RGBA",
+ "has_alpha": true
+ },
+ {
+ "id": "dash-developer-reading",
+ "path": "assets/mascot/dash-developer-reading.png",
+ "category": "mascot",
+ "status": "canonical",
+ "family": "developer",
+ "role": "Same-collection pose reference",
+ "provenance": {
+ "source": "generated:image_gen.imagegen; docs/brand/dash-generation.json#dash-developer-reading",
+ "source_sha256": "430d20cf74eb0c800b8b5f6d709dfeb18fffd44da40a2af99f8c3018e968dceb",
+ "generation_receipt": "docs/brand/dash-generation.json",
+ "source_ids": [
+ "reference-package-event-dispatcher",
+ "reference-package-fork",
+ "reference-package-dev-tools"
+ ]
+ },
+ "rights": "Generated during authorized repository identity work; source artwork rights remain unrecorded, no separate asset license is asserted.",
+ "sha256": "bb87dc5d6a8bbcde4510ca5f99e19a6a216a577b9c83aac2c5947454e2b1e982",
+ "bytes": 2214296,
+ "format": "png",
+ "width": 1024,
+ "height": 1536,
+ "mode": "RGBA",
+ "has_alpha": true
+ },
+ {
+ "id": "dash-developer-guide",
+ "path": "assets/mascot/dash-developer-guide.png",
+ "category": "mascot",
+ "status": "canonical",
+ "family": "developer",
+ "role": "Same-collection pose reference",
+ "provenance": {
+ "source": "generated:image_gen.imagegen; docs/brand/dash-generation.json#dash-developer-guide",
+ "source_sha256": "430d20cf74eb0c800b8b5f6d709dfeb18fffd44da40a2af99f8c3018e968dceb",
+ "generation_receipt": "docs/brand/dash-generation.json",
+ "source_ids": [
+ "reference-package-event-dispatcher",
+ "reference-package-fork",
+ "reference-package-dev-tools"
+ ]
+ },
+ "rights": "Generated during authorized repository identity work; source artwork rights remain unrecorded, no separate asset license is asserted.",
+ "sha256": "84f32b5236d9905f609f379abc15d8ccf1253503e402de658c8005d3923e6e93",
+ "bytes": 2164660,
+ "format": "png",
+ "width": 1024,
+ "height": 1536,
+ "mode": "RGBA",
+ "has_alpha": true
+ },
+ {
+ "id": "dash-developer-build",
+ "path": "assets/mascot/dash-developer-build.png",
+ "category": "mascot",
+ "status": "canonical",
+ "family": "developer",
+ "role": "Same-collection pose reference",
+ "provenance": {
+ "source": "generated:image_gen.imagegen; docs/brand/dash-generation.json#dash-developer-build",
+ "source_sha256": "430d20cf74eb0c800b8b5f6d709dfeb18fffd44da40a2af99f8c3018e968dceb",
+ "generation_receipt": "docs/brand/dash-generation.json",
+ "source_ids": [
+ "reference-package-event-dispatcher",
+ "reference-package-fork",
+ "reference-package-dev-tools"
+ ]
+ },
+ "rights": "Generated during authorized repository identity work; source artwork rights remain unrecorded, no separate asset license is asserted.",
+ "sha256": "3cca06ae5f82e33a97855ddcb38b3e59c4b750743e7bdb16103a122c492ea303",
+ "bytes": 2128379,
+ "format": "png",
+ "width": 1024,
+ "height": 1536,
+ "mode": "RGBA",
+ "has_alpha": true
+ },
+ {
+ "id": "documentation-style",
+ "path": "assets/styles/documentation.css",
+ "category": "styles",
+ "status": "canonical",
+ "role": "Reusable browser stylesheet authored for this repository",
+ "provenance": {
+ "source": "repository-authored:assets/styles/documentation.css",
+ "source_sha256": "cba9abacb7d52f1225ba9566ba64bfccf27dc926255cb9f3f374c0f45d83316e",
+ "authoring_date": "2026-10-03",
+ "design_source": "DESIGN.md",
+ "transformation": "Stylesheet maintained directly in this repository; source_sha256 and the delivered SHA-256 both identify the current file bytes.",
+ "source_history": [
+ {
+ "source": "repository-authored:assets/styles/documentation.css",
+ "source_sha256": "8d7db55741cda9b46ffc10b9d3ccbf078cfb99a64e68ccea82628ac8d66369db",
+ "availability": "historical-metadata-only",
+ "note": "Previously recorded authoring digest; no match to the current file bytes is asserted."
+ }
+ ]
+ },
+ "rights": "New repository-authored stylesheet; no third-party code or font is bundled.",
+ "sha256": "cba9abacb7d52f1225ba9566ba64bfccf27dc926255cb9f3f374c0f45d83316e",
+ "bytes": 19047,
+ "format": "css"
+ },
+ {
+ "id": "brand-style",
+ "path": "assets/styles/brand.css",
+ "category": "styles",
+ "status": "canonical",
+ "role": "Reusable browser stylesheet authored for this repository",
+ "provenance": {
+ "source": "repository-authored:assets/styles/brand.css",
+ "source_sha256": "8ae86dc52b017bfae63c384a74ad47997fc8f0d139d62b128556a15965af1594",
+ "authoring_date": "2026-10-03",
+ "design_source": "DESIGN.md",
+ "transformation": "Stylesheet maintained directly in this repository; source_sha256 and the delivered SHA-256 both identify the current file bytes.",
+ "source_history": [
+ {
+ "source": "repository-authored:assets/styles/brand.css",
+ "source_sha256": "26d256b652554477ed2c2e47f9299a78ec6e60d4c5cb7ffc5e90339f90ffce0e",
+ "availability": "historical-metadata-only",
+ "note": "Previously recorded authoring digest; no match to the current file bytes is asserted."
+ }
+ ]
+ },
+ "rights": "New repository-authored stylesheet; no third-party code or font is bundled.",
+ "sha256": "8ae86dc52b017bfae63c384a74ad47997fc8f0d139d62b128556a15965af1594",
+ "bytes": 10290,
+ "format": "css"
+ },
+ {
+ "id": "dash-developer-coding",
+ "path": "assets/mascot/dash-developer-coding.png",
+ "category": "mascot",
+ "status": "exploratory",
+ "review_status": "awaiting-review",
+ "family": "developer",
+ "role": "Programming at a laptop; local proposal awaiting maintainer review",
+ "provenance": {
+ "source": "generated:image_gen.imagegen; docs/brand/dash-generation.json#dash-developer-coding",
+ "source_sha256": "38b2c5bb87c94326bcab6463f74fc785414d8539e9175e088b5a5c797a466e09",
+ "generation_receipt": "docs/brand/dash-generation.json",
+ "source_ids": [
+ "dash-developer-welcome"
+ ]
+ },
+ "rights": "Generated during authorized repository identity work; source artwork rights remain unrecorded, no separate asset license is asserted.",
+ "sha256": "0df1f8a5c5db602ea649ad716ffe9f5396de849314e8190c74b99248b13c0fba",
+ "bytes": 1989218,
+ "format": "png",
+ "width": 1024,
+ "height": 1536,
+ "mode": "RGBA",
+ "has_alpha": true,
+ "publication": {
+ "scope": "brand-review-gallery",
+ "authorization": "maintainer-request",
+ "recorded_at": "2026-10-04",
+ "evidence": "Maintainer requested a workflow to publish the asset-visualization HTML on this repository's GitHub Pages. This includes the explicitly labeled proposal gallery.",
+ "deployment": "pending-main",
+ "canonical_selection": false
+ }
+ },
+ {
+ "id": "dash-developer-debugging",
+ "path": "assets/mascot/dash-developer-debugging.png",
+ "category": "mascot",
+ "status": "exploratory",
+ "review_status": "awaiting-review",
+ "family": "developer",
+ "role": "Investigating components; local proposal awaiting maintainer review",
+ "provenance": {
+ "source": "generated:image_gen.imagegen; docs/brand/dash-generation.json#dash-developer-debugging",
+ "source_sha256": "38b2c5bb87c94326bcab6463f74fc785414d8539e9175e088b5a5c797a466e09",
+ "generation_receipt": "docs/brand/dash-generation.json",
+ "source_ids": [
+ "dash-developer-welcome"
+ ]
+ },
+ "rights": "Generated during authorized repository identity work; source artwork rights remain unrecorded, no separate asset license is asserted.",
+ "sha256": "829bb9cc0e9596d0c61d51f5709fa3f0ad6a6558c2fc853c83870a230f00f8c5",
+ "bytes": 2127143,
+ "format": "png",
+ "width": 1024,
+ "height": 1536,
+ "mode": "RGBA",
+ "has_alpha": true,
+ "publication": {
+ "scope": "brand-review-gallery",
+ "authorization": "maintainer-request",
+ "recorded_at": "2026-10-04",
+ "evidence": "Maintainer requested a workflow to publish the asset-visualization HTML on this repository's GitHub Pages. This includes the explicitly labeled proposal gallery.",
+ "deployment": "pending-main",
+ "canonical_selection": false
+ }
+ },
+ {
+ "id": "dash-developer-explaining",
+ "path": "assets/mascot/dash-developer-explaining.png",
+ "category": "mascot",
+ "status": "exploratory",
+ "review_status": "awaiting-review",
+ "family": "developer",
+ "role": "Explaining composition; local proposal awaiting maintainer review",
+ "provenance": {
+ "source": "generated:image_gen.imagegen; docs/brand/dash-generation.json#dash-developer-explaining",
+ "source_sha256": "38b2c5bb87c94326bcab6463f74fc785414d8539e9175e088b5a5c797a466e09",
+ "generation_receipt": "docs/brand/dash-generation.json",
+ "source_ids": [
+ "dash-developer-welcome"
+ ]
+ },
+ "rights": "Generated during authorized repository identity work; source artwork rights remain unrecorded, no separate asset license is asserted.",
+ "sha256": "b5a2bb951b87d61002fab5a6b3463ce3a7413f63e234e294041f5feb7ab79df2",
+ "bytes": 1845598,
+ "format": "png",
+ "width": 1024,
+ "height": 1536,
+ "mode": "RGBA",
+ "has_alpha": true,
+ "publication": {
+ "scope": "brand-review-gallery",
+ "authorization": "maintainer-request",
+ "recorded_at": "2026-10-04",
+ "evidence": "Maintainer requested a workflow to publish the asset-visualization HTML on this repository's GitHub Pages. This includes the explicitly labeled proposal gallery.",
+ "deployment": "pending-main",
+ "canonical_selection": false
+ }
+ },
+ {
+ "id": "dash-developer-portrait-study",
+ "path": "assets/mascot/dash-developer-portrait-study.png",
+ "category": "mascot",
+ "status": "exploratory",
+ "review_status": "awaiting-review",
+ "family": "developer",
+ "role": "Waist-up portrait for local logo proposals; local proposal awaiting maintainer review",
+ "provenance": {
+ "source": "generated:image_gen.imagegen; docs/brand/dash-generation.json#dash-developer-portrait-study",
+ "source_sha256": "38b2c5bb87c94326bcab6463f74fc785414d8539e9175e088b5a5c797a466e09",
+ "generation_receipt": "docs/brand/dash-generation.json",
+ "source_ids": [
+ "dash-developer-welcome"
+ ]
+ },
+ "rights": "Generated during authorized repository identity work; source artwork rights remain unrecorded, no separate asset license is asserted.",
+ "sha256": "9b4adf163832ba51d2dddc2b043627b3b70cf84b1b98063770f6537dc549e460",
+ "bytes": 1392780,
+ "format": "png",
+ "width": 1254,
+ "height": 1254,
+ "mode": "RGBA",
+ "has_alpha": true,
+ "publication": {
+ "scope": "brand-review-gallery",
+ "authorization": "maintainer-request",
+ "recorded_at": "2026-10-04",
+ "evidence": "Maintainer requested a workflow to publish the asset-visualization HTML on this repository's GitHub Pages. This includes the explicitly labeled proposal gallery.",
+ "deployment": "pending-main",
+ "canonical_selection": false
+ }
+ },
+ {
+ "id": "navigation-style",
+ "path": "assets/styles/navigation.css",
+ "category": "styles",
+ "status": "reference",
+ "role": "Shared navigation stylesheet for local brand review previews",
+ "provenance": {
+ "source": "repository-authored:assets/styles/navigation.css",
+ "source_sha256": "f626036b9ca345f316c52deb5c67707329972272d856e47f2934705ec5849ddb",
+ "authoring_date": "2026-10-03",
+ "design_source": "DESIGN.md",
+ "transformation": "Stylesheet maintained directly in this repository; source_sha256 and the delivered SHA-256 both identify the current file bytes.",
+ "source_history": [
+ {
+ "source": "repository-authored:assets/styles/navigation.css",
+ "source_sha256": "ecfb115817f07be26f18cf20e2063b52c711e50861d5aa557d9561754d93f292",
+ "availability": "historical-metadata-only",
+ "note": "Previously recorded authoring digest; no match to the current file bytes is asserted."
+ }
+ ]
+ },
+ "rights": "New repository-authored stylesheet; no third-party code or font is bundled.",
+ "sha256": "f626036b9ca345f316c52deb5c67707329972272d856e47f2934705ec5849ddb",
+ "bytes": 3295,
+ "format": "css"
+ },
+ {
+ "id": "dash-developer-workstation",
+ "path": "assets/mascot/dash-developer-workstation.png",
+ "category": "mascot",
+ "status": "exploratory",
+ "review_status": "awaiting-review",
+ "role": "Developer workstation scene with intentional opaque navy background; local proposal awaiting maintainer review",
+ "provenance": {
+ "source": "generated:image_gen.imagegen; docs/brand/dash-generation.json#dash-developer-workstation",
+ "source_sha256": "38b2c5bb87c94326bcab6463f74fc785414d8539e9175e088b5a5c797a466e09",
+ "generation_receipt": "docs/brand/dash-generation.json",
+ "source_ids": [
+ "dash-developer-welcome"
+ ]
+ },
+ "rights": "Generated during authorized repository identity work; source artwork rights remain unrecorded, no separate asset license is asserted.",
+ "sha256": "791cca47c009a14a9d8564d3aa554eba79d3262dbaf4652c978a33ff89cfef45",
+ "bytes": 2180315,
+ "format": "png",
+ "width": 1672,
+ "height": 941,
+ "mode": "RGB",
+ "has_alpha": false,
+ "family": "developer",
+ "publication": {
+ "scope": "brand-review-gallery",
+ "authorization": "maintainer-request",
+ "recorded_at": "2026-10-04",
+ "evidence": "Maintainer requested a workflow to publish the asset-visualization HTML on this repository's GitHub Pages. This includes the explicitly labeled proposal gallery.",
+ "deployment": "pending-main",
+ "canonical_selection": false
+ }
+ },
+ {
+ "id": "fast-forward-logo",
+ "path": "assets/brand/fast-forward-logo.svg",
+ "sha256": "22f7cef89ac72491c1bafb1d146acf263d5bcf8d3e7ccda082af09028fa0110a",
+ "bytes": 7863,
+ "format": "svg",
+ "category": "brand",
+ "status": "canonical",
+ "direction": "F",
+ "logo_form": "signature",
+ "logo_variant": "color",
+ "publication": {
+ "status": "authorized",
+ "scope": "brand-public-library",
+ "authorization": "maintainer-request",
+ "recorded_at": "2026-10-05",
+ "initial_status": "local-not-published",
+ "evidence": "The maintainer selected the direction F fox logo and requested GitHub Pages publication of the asset-visualization HTML and its reusable assets.",
+ "deployment": "not-asserted-by-catalog"
+ },
+ "review_status": "direction-selected",
+ "role": "PHP Fast Forward outlined signature — color variant",
+ "provenance": {
+ "source": "derived:assets/brand/logo-source.json",
+ "source_sha256": "cf3880d262868728b5c24241b5ab317b659559a70ded29b06077cb2590b694d2",
+ "source_ids": [
+ "fast-forward-logo-concepts"
+ ],
+ "generation_receipt": "docs/brand/logo-generation.json",
+ "authoring": "Native path geometry authored in this repository; Exo 2 Italic weight 900 lettering outlined from the pinned font source.",
+ "transformation": "Production reconstruction of selected direction F; shared geometry and lettering across surface and monochrome variants. This symbol does not replace the Dash character master."
+ },
+ "rights": "Repository-authored native symbol geometry; outlined lettering from Exo 2 under OFL-1.1. See assets/brand/source/font-source.json and source/OFL-Exo2.txt; no separate artwork license is declared.",
+ "embedded_raster": false,
+ "view_box": [
+ 0.0,
+ 0.0,
+ 1006.0,
+ 320.0
+ ]
+ },
+ {
+ "id": "fast-forward-logo-dark",
+ "path": "assets/brand/fast-forward-logo-dark.svg",
+ "sha256": "7c5dc6cabcd5fecc383042f660017fb97deb1ff2f6bd229f1f46e77e1f97310a",
+ "bytes": 7863,
+ "format": "svg",
+ "category": "brand",
+ "status": "canonical",
+ "direction": "F",
+ "logo_form": "signature",
+ "logo_variant": "dark",
+ "publication": {
+ "status": "authorized",
+ "scope": "brand-public-library",
+ "authorization": "maintainer-request",
+ "recorded_at": "2026-10-05",
+ "initial_status": "local-not-published",
+ "evidence": "The maintainer selected the direction F fox logo and requested GitHub Pages publication of the asset-visualization HTML and its reusable assets.",
+ "deployment": "not-asserted-by-catalog"
+ },
+ "review_status": "direction-selected",
+ "role": "PHP Fast Forward outlined signature — dark variant",
+ "provenance": {
+ "source": "derived:assets/brand/logo-source.json",
+ "source_sha256": "cf3880d262868728b5c24241b5ab317b659559a70ded29b06077cb2590b694d2",
+ "source_ids": [
+ "fast-forward-logo-concepts"
+ ],
+ "generation_receipt": "docs/brand/logo-generation.json",
+ "authoring": "Native path geometry authored in this repository; Exo 2 Italic weight 900 lettering outlined from the pinned font source.",
+ "transformation": "Production reconstruction of selected direction F; shared geometry and lettering across surface and monochrome variants. This symbol does not replace the Dash character master."
+ },
+ "rights": "Repository-authored native symbol geometry; outlined lettering from Exo 2 under OFL-1.1. See assets/brand/source/font-source.json and source/OFL-Exo2.txt; no separate artwork license is declared.",
+ "embedded_raster": false,
+ "view_box": [
+ 0.0,
+ 0.0,
+ 1006.0,
+ 320.0
+ ]
+ },
+ {
+ "id": "fast-forward-logo-ink",
+ "path": "assets/brand/fast-forward-logo-ink.svg",
+ "sha256": "9053c84e28d5457a203546482389550fbb1c0d52e12dc6de33555b30a8a83bb2",
+ "bytes": 8080,
+ "format": "svg",
+ "category": "brand",
+ "status": "canonical",
+ "direction": "F",
+ "logo_form": "signature",
+ "logo_variant": "ink",
+ "publication": {
+ "status": "authorized",
+ "scope": "brand-public-library",
+ "authorization": "maintainer-request",
+ "recorded_at": "2026-10-05",
+ "initial_status": "local-not-published",
+ "evidence": "The maintainer selected the direction F fox logo and requested GitHub Pages publication of the asset-visualization HTML and its reusable assets.",
+ "deployment": "not-asserted-by-catalog"
+ },
+ "review_status": "direction-selected",
+ "role": "PHP Fast Forward outlined signature — ink variant",
+ "provenance": {
+ "source": "derived:assets/brand/logo-source.json",
+ "source_sha256": "cf3880d262868728b5c24241b5ab317b659559a70ded29b06077cb2590b694d2",
+ "source_ids": [
+ "fast-forward-logo-concepts"
+ ],
+ "generation_receipt": "docs/brand/logo-generation.json",
+ "authoring": "Native path geometry authored in this repository; Exo 2 Italic weight 900 lettering outlined from the pinned font source.",
+ "transformation": "Production reconstruction of selected direction F; shared geometry and lettering across surface and monochrome variants. This symbol does not replace the Dash character master."
+ },
+ "rights": "Repository-authored native symbol geometry; outlined lettering from Exo 2 under OFL-1.1. See assets/brand/source/font-source.json and source/OFL-Exo2.txt; no separate artwork license is declared.",
+ "embedded_raster": false,
+ "view_box": [
+ 0.0,
+ 0.0,
+ 1006.0,
+ 320.0
+ ]
+ },
+ {
+ "id": "fast-forward-logo-white",
+ "path": "assets/brand/fast-forward-logo-white.svg",
+ "sha256": "0fac5b010090f26bdfea3441d0231fa7f37a721986e502706b9a726218d34f5a",
+ "bytes": 8080,
+ "format": "svg",
+ "category": "brand",
+ "status": "canonical",
+ "direction": "F",
+ "logo_form": "signature",
+ "logo_variant": "white",
+ "publication": {
+ "status": "authorized",
+ "scope": "brand-public-library",
+ "authorization": "maintainer-request",
+ "recorded_at": "2026-10-05",
+ "initial_status": "local-not-published",
+ "evidence": "The maintainer selected the direction F fox logo and requested GitHub Pages publication of the asset-visualization HTML and its reusable assets.",
+ "deployment": "not-asserted-by-catalog"
+ },
+ "review_status": "direction-selected",
+ "role": "PHP Fast Forward outlined signature — white variant",
+ "provenance": {
+ "source": "derived:assets/brand/logo-source.json",
+ "source_sha256": "cf3880d262868728b5c24241b5ab317b659559a70ded29b06077cb2590b694d2",
+ "source_ids": [
+ "fast-forward-logo-concepts"
+ ],
+ "generation_receipt": "docs/brand/logo-generation.json",
+ "authoring": "Native path geometry authored in this repository; Exo 2 Italic weight 900 lettering outlined from the pinned font source.",
+ "transformation": "Production reconstruction of selected direction F; shared geometry and lettering across surface and monochrome variants. This symbol does not replace the Dash character master."
+ },
+ "rights": "Repository-authored native symbol geometry; outlined lettering from Exo 2 under OFL-1.1. See assets/brand/source/font-source.json and source/OFL-Exo2.txt; no separate artwork license is declared.",
+ "embedded_raster": false,
+ "view_box": [
+ 0.0,
+ 0.0,
+ 1006.0,
+ 320.0
+ ]
+ },
+ {
+ "id": "fast-forward-mark",
+ "path": "assets/brand/fast-forward-mark.svg",
+ "sha256": "328327ea720124de1a7b87c493a58be0188167660982c963cc14cf1eeaaaaf2f",
+ "bytes": 1294,
+ "format": "svg",
+ "category": "brand",
+ "status": "canonical",
+ "direction": "F",
+ "logo_form": "mark",
+ "logo_variant": "color",
+ "publication": {
+ "status": "authorized",
+ "scope": "brand-public-library",
+ "authorization": "maintainer-request",
+ "recorded_at": "2026-10-05",
+ "initial_status": "local-not-published",
+ "evidence": "The maintainer selected the direction F fox logo and requested GitHub Pages publication of the asset-visualization HTML and its reusable assets.",
+ "deployment": "not-asserted-by-catalog"
+ },
+ "review_status": "direction-selected",
+ "role": "Dash fox brand symbol — color variant",
+ "provenance": {
+ "source": "derived:assets/brand/logo-source.json",
+ "source_sha256": "cf3880d262868728b5c24241b5ab317b659559a70ded29b06077cb2590b694d2",
+ "source_ids": [
+ "fast-forward-logo-concepts"
+ ],
+ "generation_receipt": "docs/brand/logo-generation.json",
+ "authoring": "Native path geometry authored in this repository; Exo 2 Italic weight 900 lettering outlined from the pinned font source.",
+ "transformation": "Production reconstruction of selected direction F; shared geometry and lettering across surface and monochrome variants. This symbol does not replace the Dash character master."
+ },
+ "rights": "Repository-authored native symbol geometry; outlined lettering from Exo 2 under OFL-1.1. See assets/brand/source/font-source.json and source/OFL-Exo2.txt; no separate artwork license is declared.",
+ "embedded_raster": false,
+ "view_box": [
+ 0.0,
+ 0.0,
+ 320.0,
+ 320.0
+ ]
+ },
+ {
+ "id": "fast-forward-mark-dark",
+ "path": "assets/brand/fast-forward-mark-dark.svg",
+ "sha256": "1d967ff41bedebfea91fd42bb9fe08c3b32d90904261ddfabdf8a3a2b708c6c9",
+ "bytes": 1294,
+ "format": "svg",
+ "category": "brand",
+ "status": "canonical",
+ "direction": "F",
+ "logo_form": "mark",
+ "logo_variant": "dark",
+ "publication": {
+ "status": "authorized",
+ "scope": "brand-public-library",
+ "authorization": "maintainer-request",
+ "recorded_at": "2026-10-05",
+ "initial_status": "local-not-published",
+ "evidence": "The maintainer selected the direction F fox logo and requested GitHub Pages publication of the asset-visualization HTML and its reusable assets.",
+ "deployment": "not-asserted-by-catalog"
+ },
+ "review_status": "direction-selected",
+ "role": "Dash fox brand symbol — dark variant",
+ "provenance": {
+ "source": "derived:assets/brand/logo-source.json",
+ "source_sha256": "cf3880d262868728b5c24241b5ab317b659559a70ded29b06077cb2590b694d2",
+ "source_ids": [
+ "fast-forward-logo-concepts"
+ ],
+ "generation_receipt": "docs/brand/logo-generation.json",
+ "authoring": "Native path geometry authored in this repository; Exo 2 Italic weight 900 lettering outlined from the pinned font source.",
+ "transformation": "Production reconstruction of selected direction F; shared geometry and lettering across surface and monochrome variants. This symbol does not replace the Dash character master."
+ },
+ "rights": "Repository-authored native symbol geometry; outlined lettering from Exo 2 under OFL-1.1. See assets/brand/source/font-source.json and source/OFL-Exo2.txt; no separate artwork license is declared.",
+ "embedded_raster": false,
+ "view_box": [
+ 0.0,
+ 0.0,
+ 320.0,
+ 320.0
+ ]
+ },
+ {
+ "id": "fast-forward-mark-ink",
+ "path": "assets/brand/fast-forward-mark-ink.svg",
+ "sha256": "63953af2d2d38f49c450e95f2fe0e7f8af6d754537d2b63d86c52060dbd9a839",
+ "bytes": 1511,
+ "format": "svg",
+ "category": "brand",
+ "status": "canonical",
+ "direction": "F",
+ "logo_form": "mark",
+ "logo_variant": "ink",
+ "publication": {
+ "status": "authorized",
+ "scope": "brand-public-library",
+ "authorization": "maintainer-request",
+ "recorded_at": "2026-10-05",
+ "initial_status": "local-not-published",
+ "evidence": "The maintainer selected the direction F fox logo and requested GitHub Pages publication of the asset-visualization HTML and its reusable assets.",
+ "deployment": "not-asserted-by-catalog"
+ },
+ "review_status": "direction-selected",
+ "role": "Dash fox brand symbol — ink variant",
+ "provenance": {
+ "source": "derived:assets/brand/logo-source.json",
+ "source_sha256": "cf3880d262868728b5c24241b5ab317b659559a70ded29b06077cb2590b694d2",
+ "source_ids": [
+ "fast-forward-logo-concepts"
+ ],
+ "generation_receipt": "docs/brand/logo-generation.json",
+ "authoring": "Native path geometry authored in this repository; Exo 2 Italic weight 900 lettering outlined from the pinned font source.",
+ "transformation": "Production reconstruction of selected direction F; shared geometry and lettering across surface and monochrome variants. This symbol does not replace the Dash character master."
+ },
+ "rights": "Repository-authored native symbol geometry; outlined lettering from Exo 2 under OFL-1.1. See assets/brand/source/font-source.json and source/OFL-Exo2.txt; no separate artwork license is declared.",
+ "embedded_raster": false,
+ "view_box": [
+ 0.0,
+ 0.0,
+ 320.0,
+ 320.0
+ ]
+ },
+ {
+ "id": "fast-forward-mark-white",
+ "path": "assets/brand/fast-forward-mark-white.svg",
+ "sha256": "c5e71e5035fd99dd0e5b63b02670d25dcef1359ef41e81a13404da121a2113f9",
+ "bytes": 1511,
+ "format": "svg",
+ "category": "brand",
+ "status": "canonical",
+ "direction": "F",
+ "logo_form": "mark",
+ "logo_variant": "white",
+ "publication": {
+ "status": "authorized",
+ "scope": "brand-public-library",
+ "authorization": "maintainer-request",
+ "recorded_at": "2026-10-05",
+ "initial_status": "local-not-published",
+ "evidence": "The maintainer selected the direction F fox logo and requested GitHub Pages publication of the asset-visualization HTML and its reusable assets.",
+ "deployment": "not-asserted-by-catalog"
+ },
+ "review_status": "direction-selected",
+ "role": "Dash fox brand symbol — white variant",
+ "provenance": {
+ "source": "derived:assets/brand/logo-source.json",
+ "source_sha256": "cf3880d262868728b5c24241b5ab317b659559a70ded29b06077cb2590b694d2",
+ "source_ids": [
+ "fast-forward-logo-concepts"
+ ],
+ "generation_receipt": "docs/brand/logo-generation.json",
+ "authoring": "Native path geometry authored in this repository; Exo 2 Italic weight 900 lettering outlined from the pinned font source.",
+ "transformation": "Production reconstruction of selected direction F; shared geometry and lettering across surface and monochrome variants. This symbol does not replace the Dash character master."
+ },
+ "rights": "Repository-authored native symbol geometry; outlined lettering from Exo 2 under OFL-1.1. See assets/brand/source/font-source.json and source/OFL-Exo2.txt; no separate artwork license is declared.",
+ "embedded_raster": false,
+ "view_box": [
+ 0.0,
+ 0.0,
+ 320.0,
+ 320.0
+ ]
+ },
+ {
+ "id": "fast-forward-logo-source",
+ "path": "assets/brand/logo-source.json",
+ "category": "brand",
+ "status": "canonical",
+ "role": "Editable production source for direction F geometry, outlined lettering, layouts and all eight native SVG variants",
+ "provenance": {
+ "source": "derived:fast-forward-logo-concepts",
+ "source_sha256": "c5586c01fa8d3abe9986d17d3e9a1125ccefd0802f737c90e1c5b4dc9d44be56",
+ "source_ids": [
+ "fast-forward-logo-concepts"
+ ],
+ "authoring": "Repository-authored native geometry and deterministic layouts; glyph paths outlined from the separately pinned OFL font source."
+ },
+ "rights": "Repository-authored source geometry; Exo 2 outlined glyphs derive from OFL-1.1 font bytes. See source/font-source.json and source/OFL-Exo2.txt.",
+ "sha256": "cf3880d262868728b5c24241b5ab317b659559a70ded29b06077cb2590b694d2",
+ "bytes": 10546,
+ "format": "json"
+ },
+ {
+ "id": "font-exo2-italic-source",
+ "path": "assets/brand/source/font-source.json",
+ "category": "typography",
+ "status": "reference",
+ "role": "Pinned upstream Exo 2 Italic font provenance, original bytes, OFL license and lettering-instance receipt",
+ "provenance": {
+ "source": "https://raw.githubusercontent.com/google/fonts/9710da1eacb3be272583c3224dcb70f9da6eadbb/ofl/exo2/Exo2-Italic%5Bwght%5D.ttf",
+ "source_sha256": "bad568cea9ed23d6ae4aea41ad3f7747752952aabdd85d7f01474af392a21b32",
+ "authoring": "Metadata for the original pinned Google Fonts file and its OFL license; no font bytes modified."
+ },
+ "rights": "Exo 2 original font distributed under OFL-1.1, recorded in assets/brand/source/OFL-Exo2.txt; copyright and full conditions retained there.",
+ "sha256": "0f3cf752ecd482979a583cb0afd63ba6a747d0b6c96e0150d33be101c55fde9b",
+ "bytes": 1477,
+ "format": "json"
+ },
+ {
+ "id": "profile-brand-hero-banner",
+ "path": "profile/assets/brand-hero-banner.png",
+ "category": "profile",
+ "status": "canonical",
+ "role": "Current GitHub profile cover rendered with the direction F dark signature and primary developer Dash master",
+ "publication": {
+ "status": "authorized",
+ "scope": "brand-public-library",
+ "authorization": "maintainer-request",
+ "recorded_at": "2026-10-05",
+ "initial_status": "local-not-published",
+ "evidence": "The maintainer selected the direction F fox logo and requested GitHub Pages publication of the asset-visualization HTML and its reusable assets.",
+ "deployment": "not-asserted-by-catalog"
+ },
+ "export_date": "2026-10-04",
+ "provenance": {
+ "source": "rendered:docs/brand/profile-banner.html",
+ "source_sha256": "09c2308beeb3514e5f0c235df994ee3b31cb7591794ae1a4271af4362211e370",
+ "source_ids": [
+ "fast-forward-logo-dark",
+ "dash-developer-welcome",
+ "font-exo2-italic-source"
+ ],
+ "authoring": "Repository HTML rendered in Chromium through Cua; native CDP Page.captureScreenshot with format=png. No input or captured pixels edited.",
+ "transformation": "PNG export of the final HTML viewport; replaces the retired institutional identity while retaining its historical records separately.",
+ "rendering": {
+ "tool": "Cua browser",
+ "engine": "Chromium",
+ "capture": "CDP Page.captureScreenshot",
+ "format": "png",
+ "date": "2026-10-04",
+ "viewport": {
+ "width": 1280,
+ "height": 640
+ },
+ "source_html": {
+ "path": "docs/brand/profile-banner.html",
+ "sha256": "09c2308beeb3514e5f0c235df994ee3b31cb7591794ae1a4271af4362211e370"
+ },
+ "source_stylesheets": [],
+ "source_artwork": [
+ {
+ "id": "fast-forward-logo-dark",
+ "path": "assets/brand/fast-forward-logo-dark.svg",
+ "sha256": "c38c5e4f851b47e3435e8200f16515fdca79c9a9caf1e51e963d1720ea8c89c5"
+ },
+ {
+ "id": "dash-developer-welcome",
+ "path": "assets/mascot/dash-developer-welcome.png",
+ "sha256": "38b2c5bb87c94326bcab6463f74fc785414d8539e9175e088b5a5c797a466e09"
+ }
+ ],
+ "outlined_lettering_source": {
+ "id": "font-exo2-italic-source",
+ "path": "assets/brand/source/font-source.json",
+ "sha256": "0f3cf752ecd482979a583cb0afd63ba6a747d0b6c96e0150d33be101c55fde9b",
+ "font_sha256": "bad568cea9ed23d6ae4aea41ad3f7747752952aabdd85d7f01474af392a21b32",
+ "runtime_font_load": false
+ },
+ "personal_photo_used": false
+ }
+ },
+ "rights": "Repository-authored composition using the recorded direction F symbol, OFL-1.1 outlined Exo 2 lettering and the recorded Dash artwork. No separate artwork license is declared; source rights and attribution remain in their respective records.",
+ "sha256": "0d1281906811ba583a84f78ce867efc1bec724d056db6e40520e1e830582396c",
+ "bytes": 332043,
+ "format": "png",
+ "width": 1280,
+ "height": 640,
+ "mode": "RGB",
+ "has_alpha": false
+ },
+ {
+ "id": "profile-docs-installation",
+ "path": "profile/assets/docs-installation.png",
+ "category": "profile",
+ "status": "canonical",
+ "role": "Current documentation reference-page export rendered with the direction F dark signature and developer Dash reading pose",
+ "publication": {
+ "status": "authorized",
+ "scope": "brand-public-library",
+ "authorization": "maintainer-request",
+ "recorded_at": "2026-10-05",
+ "initial_status": "local-not-published",
+ "evidence": "The maintainer selected the direction F fox logo and requested GitHub Pages publication of the asset-visualization HTML and its reusable assets.",
+ "deployment": "not-asserted-by-catalog"
+ },
+ "export_date": "2026-10-04",
+ "provenance": {
+ "source": "rendered:docs/brand/documentation.html",
+ "source_sha256": "5bfa9e79b188fef782c3cbdb21a2bdfd9072f2ed419bd1094a6064e7f3c8fc08",
+ "source_ids": [
+ "fast-forward-logo-dark",
+ "dash-developer-reading",
+ "font-exo2-italic-source",
+ "documentation-style",
+ "navigation-style"
+ ],
+ "authoring": "Repository HTML rendered in Google Chrome with Playwright CLI 0.1.22; native page.screenshot with type=png and viewport capture. No input or captured pixels edited.",
+ "transformation": "Viewport PNG reexport after correcting the bootstrap call to match the variadic container API; pixels are captured directly without image edits.",
+ "rendering": {
+ "tool": "Playwright CLI",
+ "engine": "Chromium",
+ "capture": "Playwright page.screenshot",
+ "format": "png",
+ "date": "2026-10-04",
+ "viewport": {
+ "width": 1280,
+ "height": 960
+ },
+ "source_html": {
+ "path": "docs/brand/documentation.html",
+ "sha256": "5bfa9e79b188fef782c3cbdb21a2bdfd9072f2ed419bd1094a6064e7f3c8fc08"
+ },
+ "source_stylesheets": [
+ {
+ "id": "documentation-style",
+ "path": "assets/styles/documentation.css",
+ "sha256": "96218cd24b0817e0a39ff66d6479d2359a0fca7b1140f9dea808126becb48359"
+ },
+ {
+ "id": "navigation-style",
+ "path": "assets/styles/navigation.css",
+ "sha256": "f626036b9ca345f316c52deb5c67707329972272d856e47f2934705ec5849ddb"
+ }
+ ],
+ "source_artwork": [
+ {
+ "id": "fast-forward-logo-dark",
+ "path": "assets/brand/fast-forward-logo-dark.svg",
+ "sha256": "c38c5e4f851b47e3435e8200f16515fdca79c9a9caf1e51e963d1720ea8c89c5"
+ },
+ {
+ "id": "dash-developer-reading",
+ "path": "assets/mascot/dash-developer-reading.png",
+ "sha256": "bb87dc5d6a8bbcde4510ca5f99e19a6a216a577b9c83aac2c5947454e2b1e982"
+ }
+ ],
+ "outlined_lettering_source": {
+ "id": "font-exo2-italic-source",
+ "path": "assets/brand/source/font-source.json",
+ "sha256": "0f3cf752ecd482979a583cb0afd63ba6a747d0b6c96e0150d33be101c55fde9b",
+ "font_sha256": "bad568cea9ed23d6ae4aea41ad3f7747752952aabdd85d7f01474af392a21b32",
+ "runtime_font_load": false
+ },
+ "personal_photo_used": false,
+ "generator": "@playwright/cli@0.1.22",
+ "source_ref": "working-tree",
+ "source_base_commit": "646a0fb869c00949795637a932c14a5511b04459",
+ "scale": "css",
+ "full_page": false,
+ "device_pixel_ratio": 1,
+ "scroll": {
+ "x": 0,
+ "y": 0
+ }
+ }
+ },
+ "rights": "Repository-authored composition using the recorded direction F symbol, OFL-1.1 outlined Exo 2 lettering and the recorded Dash artwork. No separate artwork license is declared; source rights and attribution remain in their respective records.",
+ "sha256": "cc7ee2b77ae139e96ca87508ad31a802ff9c953b4a8b41e17efb73a31ae1d0b5",
+ "bytes": 213592,
+ "format": "png",
+ "width": 1280,
+ "height": 960,
+ "mode": "RGB",
+ "has_alpha": false
+ },
+ {
+ "id": "reference-dash-package-agents",
+ "path": "references/ecosystem/agents.png",
+ "category": "ecosystem",
+ "status": "reference",
+ "review_status": "reviewed",
+ "family": "developer",
+ "role": "Dash organizes reusable agent roles and skill resources",
+ "provenance": {
+ "source": "https://github.com/php-fast-forward/agents/blob/cd01df7bc3baa52a4fa91b27ab5d72bc7fa1b048/docs/_static/mascot-banner.png",
+ "source_sha256": "9fba44c597619d136eba58eb1af537226be6914804ae832c52d1dd77a51e2765",
+ "repository": "php-fast-forward/agents",
+ "source_path": "docs/_static/mascot-banner.png",
+ "source_commit": "cd01df7bc3baa52a4fa91b27ab5d72bc7fa1b048",
+ "git_blob_sha": "3a8fa5aab0c92422aecc1e819ce400f10c9a1413",
+ "source_scope": "public-pull-request-head",
+ "pull_request": "https://github.com/php-fast-forward/agents/pull/4",
+ "verified_on": "2026-10-05",
+ "generation_receipt": "docs/brand/repository-artwork.json",
+ "generation_record": "reference-dash-package-agents",
+ "source_ids": [
+ "dash-developer-welcome",
+ "dash-developer-build"
+ ]
+ },
+ "rights": "Generated for authorized repository identity work. Historical reference-art rights remain unrecorded; no independent third-party asset license is asserted.",
+ "sha256": "9fba44c597619d136eba58eb1af537226be6914804ae832c52d1dd77a51e2765",
+ "bytes": 2336856,
+ "format": "png",
+ "width": 1536,
+ "height": 1024,
+ "mode": "RGB",
+ "has_alpha": false,
+ "publication": {
+ "status": "authorized",
+ "authorization": "maintainer-request",
+ "recorded_at": "2026-10-05",
+ "scope": "brand-public-library",
+ "evidence": "Maintainer requested repository-specific Dash artwork, public repository PRs and a public ecosystem gallery in the central brand library on 2026-10-05."
+ }
+ },
+ {
+ "id": "reference-dash-package-changelog",
+ "path": "references/ecosystem/changelog.png",
+ "category": "ecosystem",
+ "status": "reference",
+ "review_status": "reviewed",
+ "family": "developer",
+ "role": "Dash consolidates release fragments into a history ledger",
+ "provenance": {
+ "source": "https://github.com/php-fast-forward/changelog/blob/323a35935609fbc4bbaec27490e8710403e69f22/docs/_static/mascot-banner.png",
+ "source_sha256": "a5e740350c79961311f8d12ecac1831c69b5ca59dc86efc80a0109586e2a9239",
+ "repository": "php-fast-forward/changelog",
+ "source_path": "docs/_static/mascot-banner.png",
+ "source_commit": "323a35935609fbc4bbaec27490e8710403e69f22",
+ "git_blob_sha": "6c6ad10e9bc9b2a7840028ff38959c379ce58038",
+ "source_scope": "public-pull-request-head",
+ "pull_request": "https://github.com/php-fast-forward/changelog/pull/12",
+ "verified_on": "2026-10-05",
+ "generation_receipt": "docs/brand/repository-artwork.json",
+ "generation_record": "reference-dash-package-changelog",
+ "source_ids": [
+ "dash-developer-welcome",
+ "dash-developer-build"
+ ]
+ },
+ "rights": "Generated for authorized repository identity work. Historical reference-art rights remain unrecorded; no independent third-party asset license is asserted.",
+ "sha256": "a5e740350c79961311f8d12ecac1831c69b5ca59dc86efc80a0109586e2a9239",
+ "bytes": 2033274,
+ "format": "png",
+ "width": 1536,
+ "height": 1024,
+ "mode": "RGB",
+ "has_alpha": false,
+ "publication": {
+ "status": "authorized",
+ "authorization": "maintainer-request",
+ "recorded_at": "2026-10-05",
+ "scope": "brand-public-library",
+ "evidence": "Maintainer requested repository-specific Dash artwork, public repository PRs and a public ecosystem gallery in the central brand library on 2026-10-05."
+ }
+ },
+ {
+ "id": "reference-dash-package-clock",
+ "path": "references/ecosystem/clock.png",
+ "category": "ecosystem",
+ "status": "reference",
+ "review_status": "reviewed",
+ "family": "developer",
+ "role": "Dash contrasts live and frozen clocks for deterministic tests",
+ "provenance": {
+ "source": "https://github.com/php-fast-forward/clock/blob/33be1a9f588a21e5f9523251d9c29c14be2a77db/docs/_static/mascot-banner.png",
+ "source_sha256": "33d5e5fb41e58824999aad9b2f6ca0ff2b3dd90caf6798072d985b013f019dde",
+ "repository": "php-fast-forward/clock",
+ "source_path": "docs/_static/mascot-banner.png",
+ "source_commit": "33be1a9f588a21e5f9523251d9c29c14be2a77db",
+ "git_blob_sha": "32832bddcb6b6c93c791e847ffbac5fa5fe14250",
+ "source_scope": "public-pull-request-head",
+ "pull_request": "https://github.com/php-fast-forward/clock/pull/1",
+ "verified_on": "2026-10-05",
+ "generation_receipt": "docs/brand/repository-artwork.json",
+ "generation_record": "reference-dash-package-clock",
+ "source_ids": [
+ "dash-developer-welcome",
+ "dash-developer-build"
+ ]
+ },
+ "rights": "Generated for authorized repository identity work. Historical reference-art rights remain unrecorded; no independent third-party asset license is asserted.",
+ "sha256": "33d5e5fb41e58824999aad9b2f6ca0ff2b3dd90caf6798072d985b013f019dde",
+ "bytes": 2200571,
+ "format": "png",
+ "width": 1536,
+ "height": 1024,
+ "mode": "RGB",
+ "has_alpha": false,
+ "publication": {
+ "status": "authorized",
+ "authorization": "maintainer-request",
+ "recorded_at": "2026-10-05",
+ "scope": "brand-public-library",
+ "evidence": "Maintainer requested repository-specific Dash artwork, public repository PRs and a public ecosystem gallery in the central brand library on 2026-10-05."
+ }
+ },
+ {
+ "id": "reference-dash-package-composer-installers",
+ "path": "references/ecosystem/composer-installers.png",
+ "category": "ecosystem",
+ "status": "reference",
+ "review_status": "reviewed",
+ "family": "developer",
+ "role": "Dash copies declared resource-bundle payloads into a target folder",
+ "provenance": {
+ "source": "https://github.com/php-fast-forward/composer-installers/blob/924719aab66311217dc92e10b3dc055e53fd935a/docs/_static/mascot-banner.png",
+ "source_sha256": "b4c6e762f7ca106fc17925d2b0742bf8998352b3cad62159edb404520b67d668",
+ "repository": "php-fast-forward/composer-installers",
+ "source_path": "docs/_static/mascot-banner.png",
+ "source_commit": "924719aab66311217dc92e10b3dc055e53fd935a",
+ "git_blob_sha": "13e9ace487e6de7e790eef5e48a0adacfe1d4914",
+ "source_scope": "public-pull-request-head",
+ "pull_request": "https://github.com/php-fast-forward/composer-installers/pull/10",
+ "verified_on": "2026-10-05",
+ "generation_receipt": "docs/brand/repository-artwork.json",
+ "generation_record": "reference-dash-package-composer-installers",
+ "source_ids": [
+ "dash-developer-welcome",
+ "dash-developer-build"
+ ]
+ },
+ "rights": "Generated for authorized repository identity work. Historical reference-art rights remain unrecorded; no independent third-party asset license is asserted.",
+ "sha256": "b4c6e762f7ca106fc17925d2b0742bf8998352b3cad62159edb404520b67d668",
+ "bytes": 2060693,
+ "format": "png",
+ "width": 1536,
+ "height": 1024,
+ "mode": "RGB",
+ "has_alpha": false,
+ "publication": {
+ "status": "authorized",
+ "authorization": "maintainer-request",
+ "recorded_at": "2026-10-05",
+ "scope": "brand-public-library",
+ "evidence": "Maintainer requested repository-specific Dash artwork, public repository PRs and a public ecosystem gallery in the central brand library on 2026-10-05."
+ }
+ },
+ {
+ "id": "reference-dash-package-config",
+ "path": "references/ecosystem/config.png",
+ "category": "ecosystem",
+ "status": "reference",
+ "review_status": "reviewed",
+ "family": "developer",
+ "role": "Dash combines configuration sources into a nested settings tree",
+ "provenance": {
+ "source": "https://github.com/php-fast-forward/config/blob/cdeaa55461a6cfa1564183a5a62f3a90d3e75e61/docs/_static/mascot-banner.png",
+ "source_sha256": "d42da519e554495d93374013b8a9fafb0a9fcf46ae80db8a6527d287b623cbab",
+ "repository": "php-fast-forward/config",
+ "source_path": "docs/_static/mascot-banner.png",
+ "source_commit": "cdeaa55461a6cfa1564183a5a62f3a90d3e75e61",
+ "git_blob_sha": "da4f4112a6c72faba723491fb178d7475ca655d5",
+ "source_scope": "public-pull-request-head",
+ "pull_request": "https://github.com/php-fast-forward/config/pull/4",
+ "verified_on": "2026-10-05",
+ "generation_receipt": "docs/brand/repository-artwork.json",
+ "generation_record": "reference-dash-package-config",
+ "source_ids": [
+ "dash-developer-welcome",
+ "dash-developer-build"
+ ]
+ },
+ "rights": "Generated for authorized repository identity work. Historical reference-art rights remain unrecorded; no independent third-party asset license is asserted.",
+ "sha256": "d42da519e554495d93374013b8a9fafb0a9fcf46ae80db8a6527d287b623cbab",
+ "bytes": 1964606,
+ "format": "png",
+ "width": 1536,
+ "height": 1024,
+ "mode": "RGB",
+ "has_alpha": false,
+ "publication": {
+ "status": "authorized",
+ "authorization": "maintainer-request",
+ "recorded_at": "2026-10-05",
+ "scope": "brand-public-library",
+ "evidence": "Maintainer requested repository-specific Dash artwork, public repository PRs and a public ecosystem gallery in the central brand library on 2026-10-05."
+ }
+ },
+ {
+ "id": "reference-dash-package-container",
+ "path": "references/ecosystem/container.png",
+ "category": "ecosystem",
+ "status": "reference",
+ "review_status": "reviewed",
+ "family": "developer",
+ "role": "Dash resolves service components from an aggregate registry",
+ "provenance": {
+ "source": "https://github.com/php-fast-forward/container/blob/ac31a91936a49559d49ab7164e19de8101657e4e/docs/_static/mascot-banner.png",
+ "source_sha256": "3a1fd8f79f2c7a87a1d4a76173f8329163c5f51d5864053182d7fe0e88106b36",
+ "repository": "php-fast-forward/container",
+ "source_path": "docs/_static/mascot-banner.png",
+ "source_commit": "ac31a91936a49559d49ab7164e19de8101657e4e",
+ "git_blob_sha": "2321b7fe8a946d73a95fb3efd352a6377e7be673",
+ "source_scope": "public-pull-request-head",
+ "pull_request": "https://github.com/php-fast-forward/container/pull/7",
+ "verified_on": "2026-10-05",
+ "generation_receipt": "docs/brand/repository-artwork.json",
+ "generation_record": "reference-dash-package-container",
+ "source_ids": [
+ "dash-developer-welcome",
+ "dash-developer-build"
+ ]
+ },
+ "rights": "Generated for authorized repository identity work. Historical reference-art rights remain unrecorded; no independent third-party asset license is asserted.",
+ "sha256": "3a1fd8f79f2c7a87a1d4a76173f8329163c5f51d5864053182d7fe0e88106b36",
+ "bytes": 1980932,
+ "format": "png",
+ "width": 1536,
+ "height": 1024,
+ "mode": "RGB",
+ "has_alpha": false,
+ "publication": {
+ "status": "authorized",
+ "authorization": "maintainer-request",
+ "recorded_at": "2026-10-05",
+ "scope": "brand-public-library",
+ "evidence": "Maintainer requested repository-specific Dash artwork, public repository PRs and a public ecosystem gallery in the central brand library on 2026-10-05."
+ }
+ },
+ {
+ "id": "reference-dash-package-defer",
+ "path": "references/ecosystem/defer.png",
+ "category": "ecosystem",
+ "status": "reference",
+ "review_status": "reviewed",
+ "family": "developer",
+ "role": "Dash performs deferred scope cleanup in reverse stack order",
+ "provenance": {
+ "source": "https://github.com/php-fast-forward/defer/blob/ca2453a811b84272a1467c7ca25e8aada2be348c/docs/_static/mascot-banner.png",
+ "source_sha256": "d4e00106c2da461663fb8dd0cc2cd2cc2863e8ca12997ed5518c1eee348c3916",
+ "repository": "php-fast-forward/defer",
+ "source_path": "docs/_static/mascot-banner.png",
+ "source_commit": "ca2453a811b84272a1467c7ca25e8aada2be348c",
+ "git_blob_sha": "1baebbba6424e0684a3ffd984596749c45a95e50",
+ "source_scope": "public-pull-request-head",
+ "pull_request": "https://github.com/php-fast-forward/defer/pull/1",
+ "verified_on": "2026-10-05",
+ "generation_receipt": "docs/brand/repository-artwork.json",
+ "generation_record": "reference-dash-package-defer",
+ "source_ids": [
+ "dash-developer-welcome",
+ "dash-developer-build"
+ ]
+ },
+ "rights": "Generated for authorized repository identity work. Historical reference-art rights remain unrecorded; no independent third-party asset license is asserted.",
+ "sha256": "d4e00106c2da461663fb8dd0cc2cd2cc2863e8ca12997ed5518c1eee348c3916",
+ "bytes": 2176575,
+ "format": "png",
+ "width": 1536,
+ "height": 1024,
+ "mode": "RGB",
+ "has_alpha": false,
+ "publication": {
+ "status": "authorized",
+ "authorization": "maintainer-request",
+ "recorded_at": "2026-10-05",
+ "scope": "brand-public-library",
+ "evidence": "Maintainer requested repository-specific Dash artwork, public repository PRs and a public ecosystem gallery in the central brand library on 2026-10-05."
+ }
+ },
+ {
+ "id": "reference-dash-package-enum",
+ "path": "references/ecosystem/enum.png",
+ "category": "ecosystem",
+ "status": "reference",
+ "review_status": "reviewed",
+ "family": "developer",
+ "role": "Dash organizes a finite set of typed choices",
+ "provenance": {
+ "source": "https://github.com/php-fast-forward/enum/blob/e43c4fe049a3657cee45fa9ab11a17c092a9c6a5/docs/_static/mascot-banner.png",
+ "source_sha256": "c764b8a558442b857ce419e6767a6f5c671de969ab3b26ef2d96c95eeae6ce2f",
+ "repository": "php-fast-forward/enum",
+ "source_path": "docs/_static/mascot-banner.png",
+ "source_commit": "e43c4fe049a3657cee45fa9ab11a17c092a9c6a5",
+ "git_blob_sha": "e33e66e8ff80058f7cda9d2899381664ff03a342",
+ "source_scope": "public-pull-request-head",
+ "pull_request": "https://github.com/php-fast-forward/enum/pull/5",
+ "verified_on": "2026-10-05",
+ "generation_receipt": "docs/brand/repository-artwork.json",
+ "generation_record": "reference-dash-package-enum",
+ "source_ids": [
+ "dash-developer-welcome",
+ "dash-developer-build"
+ ]
+ },
+ "rights": "Generated for authorized repository identity work. Historical reference-art rights remain unrecorded; no independent third-party asset license is asserted.",
+ "sha256": "c764b8a558442b857ce419e6767a6f5c671de969ab3b26ef2d96c95eeae6ce2f",
+ "bytes": 1910263,
+ "format": "png",
+ "width": 1536,
+ "height": 1024,
+ "mode": "RGB",
+ "has_alpha": false,
+ "publication": {
+ "status": "authorized",
+ "authorization": "maintainer-request",
+ "recorded_at": "2026-10-05",
+ "scope": "brand-public-library",
+ "evidence": "Maintainer requested repository-specific Dash artwork, public repository PRs and a public ecosystem gallery in the central brand library on 2026-10-05."
+ }
+ },
+ {
+ "id": "reference-dash-package-event-dispatcher",
+ "path": "references/ecosystem/event-dispatcher.png",
+ "category": "ecosystem",
+ "status": "reference",
+ "review_status": "reviewed",
+ "family": "developer",
+ "role": "Dash routes a named event through ordered listeners",
+ "provenance": {
+ "source": "https://github.com/php-fast-forward/event-dispatcher/blob/e03e9f30cb42028729c2d073050523468ef0a37b/docs/_static/mascot-banner.png",
+ "source_sha256": "9b5e6e4d482ebbe2b427b343e8d2b31209a2b942b92fe9cb202cf2a11b610050",
+ "repository": "php-fast-forward/event-dispatcher",
+ "source_path": "docs/_static/mascot-banner.png",
+ "source_commit": "e03e9f30cb42028729c2d073050523468ef0a37b",
+ "git_blob_sha": "1eb2c7db5fe61b99540d199b95c68d68aa357c02",
+ "source_scope": "public-pull-request-head",
+ "pull_request": "https://github.com/php-fast-forward/event-dispatcher/pull/1",
+ "verified_on": "2026-10-05",
+ "generation_receipt": "docs/brand/repository-artwork.json",
+ "generation_record": "reference-dash-package-event-dispatcher",
+ "source_ids": [
+ "dash-developer-welcome",
+ "dash-developer-build"
+ ]
+ },
+ "rights": "Generated for authorized repository identity work. Historical reference-art rights remain unrecorded; no independent third-party asset license is asserted.",
+ "sha256": "9b5e6e4d482ebbe2b427b343e8d2b31209a2b942b92fe9cb202cf2a11b610050",
+ "bytes": 1947485,
+ "format": "png",
+ "width": 1536,
+ "height": 1024,
+ "mode": "RGB",
+ "has_alpha": false,
+ "publication": {
+ "status": "authorized",
+ "authorization": "maintainer-request",
+ "recorded_at": "2026-10-05",
+ "scope": "brand-public-library",
+ "evidence": "Maintainer requested repository-specific Dash artwork, public repository PRs and a public ecosystem gallery in the central brand library on 2026-10-05."
+ }
+ },
+ {
+ "id": "reference-dash-package-fork",
+ "path": "references/ecosystem/fork.png",
+ "category": "ecosystem",
+ "status": "reference",
+ "review_status": "reviewed",
+ "family": "developer",
+ "role": "Dash coordinates child processes and collected outputs",
+ "provenance": {
+ "source": "https://github.com/php-fast-forward/fork/blob/6032d1bc7ddb24cb08bc426b1b8822f6a6e824cd/docs/_static/mascot-banner.png",
+ "source_sha256": "167b3c043276f8b20afdc3299f4c35c47776a8997b223ea0fb81fbe5b64d908b",
+ "repository": "php-fast-forward/fork",
+ "source_path": "docs/_static/mascot-banner.png",
+ "source_commit": "6032d1bc7ddb24cb08bc426b1b8822f6a6e824cd",
+ "git_blob_sha": "ef44517a825c9be68fa1831a0cfd4912432e7514",
+ "source_scope": "public-pull-request-head",
+ "pull_request": "https://github.com/php-fast-forward/fork/pull/2",
+ "verified_on": "2026-10-05",
+ "generation_receipt": "docs/brand/repository-artwork.json",
+ "generation_record": "reference-dash-package-fork",
+ "source_ids": [
+ "dash-developer-welcome",
+ "dash-developer-build"
+ ]
+ },
+ "rights": "Generated for authorized repository identity work. Historical reference-art rights remain unrecorded; no independent third-party asset license is asserted.",
+ "sha256": "167b3c043276f8b20afdc3299f4c35c47776a8997b223ea0fb81fbe5b64d908b",
+ "bytes": 1832377,
+ "format": "png",
+ "width": 1536,
+ "height": 1024,
+ "mode": "RGB",
+ "has_alpha": false,
+ "publication": {
+ "status": "authorized",
+ "authorization": "maintainer-request",
+ "recorded_at": "2026-10-05",
+ "scope": "brand-public-library",
+ "evidence": "Maintainer requested repository-specific Dash artwork, public repository PRs and a public ecosystem gallery in the central brand library on 2026-10-05."
+ }
+ },
+ {
+ "id": "reference-dash-package-framework",
+ "path": "references/ecosystem/framework.png",
+ "category": "ecosystem",
+ "status": "reference",
+ "review_status": "reviewed",
+ "family": "developer",
+ "role": "Dash connects framework components through a shared bootstrap",
+ "provenance": {
+ "source": "https://github.com/php-fast-forward/framework/blob/bd0d0e1486592d18d9d8db69a7874b6b53823c8d/docs/_static/mascot-banner.png",
+ "source_sha256": "e3a2ca0606ab886aa6aea8047a5fef9f5e35cc842321d15a9fbcca7e880491b2",
+ "repository": "php-fast-forward/framework",
+ "source_path": "docs/_static/mascot-banner.png",
+ "source_commit": "bd0d0e1486592d18d9d8db69a7874b6b53823c8d",
+ "git_blob_sha": "7859bbea3e4395f55355ca2118768bee6a15eb7f",
+ "source_scope": "public-pull-request-head",
+ "pull_request": "https://github.com/php-fast-forward/framework/pull/9",
+ "verified_on": "2026-10-05",
+ "generation_receipt": "docs/brand/repository-artwork.json",
+ "generation_record": "reference-dash-package-framework",
+ "source_ids": [
+ "dash-developer-welcome",
+ "dash-developer-build"
+ ]
+ },
+ "rights": "Generated for authorized repository identity work. Historical reference-art rights remain unrecorded; no independent third-party asset license is asserted.",
+ "sha256": "e3a2ca0606ab886aa6aea8047a5fef9f5e35cc842321d15a9fbcca7e880491b2",
+ "bytes": 2092421,
+ "format": "png",
+ "width": 1536,
+ "height": 1024,
+ "mode": "RGB",
+ "has_alpha": false,
+ "publication": {
+ "status": "authorized",
+ "authorization": "maintainer-request",
+ "recorded_at": "2026-10-05",
+ "scope": "brand-public-library",
+ "evidence": "Maintainer requested repository-specific Dash artwork, public repository PRs and a public ecosystem gallery in the central brand library on 2026-10-05."
+ }
+ },
+ {
+ "id": "reference-dash-package-github-actions",
+ "path": "references/ecosystem/github-actions.png",
+ "category": "ecosystem",
+ "status": "reference",
+ "review_status": "reviewed",
+ "family": "developer",
+ "role": "Dash connects reusable workflow stages in CI automation",
+ "provenance": {
+ "source": "https://github.com/php-fast-forward/github-actions/blob/4218dcbaf5e010518016617bee96c3fe6c5a383c/docs/_static/mascot-banner.png",
+ "source_sha256": "970a84991d63709eccd5c9da7c4a346df675ed124fdf682cfc84c44b8b9f1e16",
+ "repository": "php-fast-forward/github-actions",
+ "source_path": "docs/_static/mascot-banner.png",
+ "source_commit": "4218dcbaf5e010518016617bee96c3fe6c5a383c",
+ "git_blob_sha": "b2f2641b7758be9ed1227baf9205aa5b08603774",
+ "source_scope": "public-pull-request-head",
+ "pull_request": "https://github.com/php-fast-forward/github-actions/pull/3",
+ "verified_on": "2026-10-05",
+ "generation_receipt": "docs/brand/repository-artwork.json",
+ "generation_record": "reference-dash-package-github-actions",
+ "source_ids": [
+ "dash-developer-welcome",
+ "dash-developer-build"
+ ]
+ },
+ "rights": "Generated for authorized repository identity work. Historical reference-art rights remain unrecorded; no independent third-party asset license is asserted.",
+ "sha256": "970a84991d63709eccd5c9da7c4a346df675ed124fdf682cfc84c44b8b9f1e16",
+ "bytes": 1994037,
+ "format": "png",
+ "width": 1536,
+ "height": 1024,
+ "mode": "RGB",
+ "has_alpha": false,
+ "publication": {
+ "status": "authorized",
+ "authorization": "maintainer-request",
+ "recorded_at": "2026-10-05",
+ "scope": "brand-public-library",
+ "evidence": "Maintainer requested repository-specific Dash artwork, public repository PRs and a public ecosystem gallery in the central brand library on 2026-10-05."
+ }
+ },
+ {
+ "id": "reference-dash-package-http",
+ "path": "references/ecosystem/http.png",
+ "category": "ecosystem",
+ "status": "reference",
+ "review_status": "reviewed",
+ "family": "developer",
+ "role": "Dash assembles message, factory and client components",
+ "provenance": {
+ "source": "https://github.com/php-fast-forward/http/blob/e7db743a9f09b277fc110d2179e8b20f28c3cccf/docs/_static/mascot-banner.png",
+ "source_sha256": "921a9dc1d0c0e7a0a1d9b75f00876be893c3497504aaac3a747ce16242d4beba",
+ "repository": "php-fast-forward/http",
+ "source_path": "docs/_static/mascot-banner.png",
+ "source_commit": "e7db743a9f09b277fc110d2179e8b20f28c3cccf",
+ "git_blob_sha": "ea64ffdbff40bea65985289a6d89d3a6082f54a0",
+ "source_scope": "public-pull-request-head",
+ "pull_request": "https://github.com/php-fast-forward/http/pull/1",
+ "verified_on": "2026-10-05",
+ "generation_receipt": "docs/brand/repository-artwork.json",
+ "generation_record": "reference-dash-package-http",
+ "source_ids": [
+ "dash-developer-welcome",
+ "dash-developer-build"
+ ]
+ },
+ "rights": "Generated for authorized repository identity work. Historical reference-art rights remain unrecorded; no independent third-party asset license is asserted.",
+ "sha256": "921a9dc1d0c0e7a0a1d9b75f00876be893c3497504aaac3a747ce16242d4beba",
+ "bytes": 2064674,
+ "format": "png",
+ "width": 1536,
+ "height": 1024,
+ "mode": "RGB",
+ "has_alpha": false,
+ "publication": {
+ "status": "authorized",
+ "authorization": "maintainer-request",
+ "recorded_at": "2026-10-05",
+ "scope": "brand-public-library",
+ "evidence": "Maintainer requested repository-specific Dash artwork, public repository PRs and a public ecosystem gallery in the central brand library on 2026-10-05."
+ }
+ },
+ {
+ "id": "reference-dash-package-http-client",
+ "path": "references/ecosystem/http-client.png",
+ "category": "ecosystem",
+ "status": "reference",
+ "review_status": "reviewed",
+ "family": "developer",
+ "role": "Dash exchanges request and response envelopes",
+ "provenance": {
+ "source": "https://github.com/php-fast-forward/http-client/blob/c605b8b2ba763f5456bd4df989fc58ddd66fb753/docs/_static/mascot-banner.png",
+ "source_sha256": "5565275d75e23a28e5b6bbb28b99f335d88a8d66ae10655493d8b229b0baf079",
+ "repository": "php-fast-forward/http-client",
+ "source_path": "docs/_static/mascot-banner.png",
+ "source_commit": "c605b8b2ba763f5456bd4df989fc58ddd66fb753",
+ "git_blob_sha": "2797a09dc32ecf61ba11c347b30677e8f939c044",
+ "source_scope": "public-pull-request-head",
+ "pull_request": "https://github.com/php-fast-forward/http-client/pull/1",
+ "verified_on": "2026-10-05",
+ "generation_receipt": "docs/brand/repository-artwork.json",
+ "generation_record": "reference-dash-package-http-client",
+ "source_ids": [
+ "dash-developer-welcome",
+ "dash-developer-build"
+ ]
+ },
+ "rights": "Generated for authorized repository identity work. Historical reference-art rights remain unrecorded; no independent third-party asset license is asserted.",
+ "sha256": "5565275d75e23a28e5b6bbb28b99f335d88a8d66ae10655493d8b229b0baf079",
+ "bytes": 1936246,
+ "format": "png",
+ "width": 1536,
+ "height": 1024,
+ "mode": "RGB",
+ "has_alpha": false,
+ "publication": {
+ "status": "authorized",
+ "authorization": "maintainer-request",
+ "recorded_at": "2026-10-05",
+ "scope": "brand-public-library",
+ "evidence": "Maintainer requested repository-specific Dash artwork, public repository PRs and a public ecosystem gallery in the central brand library on 2026-10-05."
+ }
+ },
+ {
+ "id": "reference-dash-package-http-factory",
+ "path": "references/ecosystem/http-factory.png",
+ "category": "ecosystem",
+ "status": "reference",
+ "review_status": "reviewed",
+ "family": "developer",
+ "role": "Dash builds request, response, stream and URI objects",
+ "provenance": {
+ "source": "https://github.com/php-fast-forward/http-factory/blob/ef11ffc9f314a62d7b051ccf76184cb24c3ea6f8/docs/_static/mascot-banner.png",
+ "source_sha256": "0e63c41e7f841255aa44ec9bfc94312bed1a4c3613ce30947ce4a7ac085d2ca1",
+ "repository": "php-fast-forward/http-factory",
+ "source_path": "docs/_static/mascot-banner.png",
+ "source_commit": "ef11ffc9f314a62d7b051ccf76184cb24c3ea6f8",
+ "git_blob_sha": "c3d77e76d638ad3bd11c7cb246aa3d929c7cb29e",
+ "source_scope": "public-pull-request-head",
+ "pull_request": "https://github.com/php-fast-forward/http-factory/pull/1",
+ "verified_on": "2026-10-05",
+ "generation_receipt": "docs/brand/repository-artwork.json",
+ "generation_record": "reference-dash-package-http-factory",
+ "source_ids": [
+ "dash-developer-welcome",
+ "dash-developer-build"
+ ]
+ },
+ "rights": "Generated for authorized repository identity work. Historical reference-art rights remain unrecorded; no independent third-party asset license is asserted.",
+ "sha256": "0e63c41e7f841255aa44ec9bfc94312bed1a4c3613ce30947ce4a7ac085d2ca1",
+ "bytes": 2169191,
+ "format": "png",
+ "width": 1536,
+ "height": 1024,
+ "mode": "RGB",
+ "has_alpha": false,
+ "publication": {
+ "status": "authorized",
+ "authorization": "maintainer-request",
+ "recorded_at": "2026-10-05",
+ "scope": "brand-public-library",
+ "evidence": "Maintainer requested repository-specific Dash artwork, public repository PRs and a public ecosystem gallery in the central brand library on 2026-10-05."
+ }
+ },
+ {
+ "id": "reference-dash-package-http-message",
+ "path": "references/ecosystem/http-message.png",
+ "category": "ecosystem",
+ "status": "reference",
+ "review_status": "reviewed",
+ "family": "developer",
+ "role": "Dash inspects immutable message layers and response forms",
+ "provenance": {
+ "source": "https://github.com/php-fast-forward/http-message/blob/56c14f67065e444e1d0bde89a19fd63d2eec8cfe/docs/_static/mascot-banner.png",
+ "source_sha256": "76dfd3ddb316d8196d5316805a6153f8a6d109b8c85ec49de8e2f3ff8557e745",
+ "repository": "php-fast-forward/http-message",
+ "source_path": "docs/_static/mascot-banner.png",
+ "source_commit": "56c14f67065e444e1d0bde89a19fd63d2eec8cfe",
+ "git_blob_sha": "16063bd2c3694dfa19f5f240b91c7e3e9f2ea212",
+ "source_scope": "public-pull-request-head",
+ "pull_request": "https://github.com/php-fast-forward/http-message/pull/1",
+ "verified_on": "2026-10-05",
+ "generation_receipt": "docs/brand/repository-artwork.json",
+ "generation_record": "reference-dash-package-http-message",
+ "source_ids": [
+ "dash-developer-welcome",
+ "dash-developer-build"
+ ]
+ },
+ "rights": "Generated for authorized repository identity work. Historical reference-art rights remain unrecorded; no independent third-party asset license is asserted.",
+ "sha256": "76dfd3ddb316d8196d5316805a6153f8a6d109b8c85ec49de8e2f3ff8557e745",
+ "bytes": 2035002,
+ "format": "png",
+ "width": 1536,
+ "height": 1024,
+ "mode": "RGB",
+ "has_alpha": false,
+ "publication": {
+ "status": "authorized",
+ "authorization": "maintainer-request",
+ "recorded_at": "2026-10-05",
+ "scope": "brand-public-library",
+ "evidence": "Maintainer requested repository-specific Dash artwork, public repository PRs and a public ecosystem gallery in the central brand library on 2026-10-05."
+ }
+ },
+ {
+ "id": "reference-dash-package-iterators",
+ "path": "references/ecosystem/iterators.png",
+ "category": "ecosystem",
+ "status": "reference",
+ "review_status": "reviewed",
+ "family": "developer",
+ "role": "Dash traverses, filters and groups a stream of data",
+ "provenance": {
+ "source": "https://github.com/php-fast-forward/iterators/blob/4e422131389727502f01370901f76eeacc2a9ebd/docs/_static/mascot-banner.png",
+ "source_sha256": "53160b1b44918cde59236a2ee0e47a01b49c13851e87bf8a711e63bb146aa7d4",
+ "repository": "php-fast-forward/iterators",
+ "source_path": "docs/_static/mascot-banner.png",
+ "source_commit": "4e422131389727502f01370901f76eeacc2a9ebd",
+ "git_blob_sha": "887163549eadbeec61a9092f22cbfee81480199d",
+ "source_scope": "public-pull-request-head",
+ "pull_request": "https://github.com/php-fast-forward/iterators/pull/1",
+ "verified_on": "2026-10-05",
+ "generation_receipt": "docs/brand/repository-artwork.json",
+ "generation_record": "reference-dash-package-iterators",
+ "source_ids": [
+ "dash-developer-welcome",
+ "dash-developer-build"
+ ]
+ },
+ "rights": "Generated for authorized repository identity work. Historical reference-art rights remain unrecorded; no independent third-party asset license is asserted.",
+ "sha256": "53160b1b44918cde59236a2ee0e47a01b49c13851e87bf8a711e63bb146aa7d4",
+ "bytes": 2176138,
+ "format": "png",
+ "width": 1536,
+ "height": 1024,
+ "mode": "RGB",
+ "has_alpha": false,
+ "publication": {
+ "status": "authorized",
+ "authorization": "maintainer-request",
+ "recorded_at": "2026-10-05",
+ "scope": "brand-public-library",
+ "evidence": "Maintainer requested repository-specific Dash artwork, public repository PRs and a public ecosystem gallery in the central brand library on 2026-10-05."
+ }
+ },
+ {
+ "id": "reference-dash-package-phpdoc-bootstrap-template",
+ "path": "references/ecosystem/phpdoc-bootstrap-template.png",
+ "category": "ecosystem",
+ "status": "reference",
+ "review_status": "reviewed",
+ "family": "developer",
+ "role": "Dash drafts responsive documentation navigation and page layouts",
+ "provenance": {
+ "source": "https://github.com/php-fast-forward/phpdoc-bootstrap-template/blob/a0ebeefda7fc72a8607e4800d8ba2c817a3d870d/docs/_static/mascot-banner.png",
+ "source_sha256": "7dfd57f6a8df627a41d05e1a8229f6c3602c3fed313fb680241f33f6fe950f82",
+ "repository": "php-fast-forward/phpdoc-bootstrap-template",
+ "source_path": "docs/_static/mascot-banner.png",
+ "source_commit": "a0ebeefda7fc72a8607e4800d8ba2c817a3d870d",
+ "git_blob_sha": "c817b464e0fe72b674e38e5cbf4e9388c322449e",
+ "source_scope": "public-pull-request-head",
+ "pull_request": "https://github.com/php-fast-forward/phpdoc-bootstrap-template/pull/5",
+ "verified_on": "2026-10-05",
+ "generation_receipt": "docs/brand/repository-artwork.json",
+ "generation_record": "reference-dash-package-phpdoc-bootstrap-template",
+ "source_ids": [
+ "dash-developer-welcome",
+ "dash-developer-build"
+ ]
+ },
+ "rights": "Generated for authorized repository identity work. Historical reference-art rights remain unrecorded; no independent third-party asset license is asserted.",
+ "sha256": "7dfd57f6a8df627a41d05e1a8229f6c3602c3fed313fb680241f33f6fe950f82",
+ "bytes": 2021717,
+ "format": "png",
+ "width": 1536,
+ "height": 1024,
+ "mode": "RGB",
+ "has_alpha": false,
+ "publication": {
+ "status": "authorized",
+ "authorization": "maintainer-request",
+ "recorded_at": "2026-10-05",
+ "scope": "brand-public-library",
+ "evidence": "Maintainer requested repository-specific Dash artwork, public repository PRs and a public ecosystem gallery in the central brand library on 2026-10-05."
+ }
+ },
+ {
+ "id": "reference-dash-package-dev-tools",
+ "path": "references/ecosystem/dev-tools.png",
+ "category": "ecosystem",
+ "status": "reference",
+ "review_status": "reviewed",
+ "family": "developer",
+ "role": "Dash coordinates testing, style, refactoring and documentation tools",
+ "provenance": {
+ "source": "https://github.com/php-fast-forward/dev-tools/blob/1ff10624f08642d50437cd33d337a43972203e7e/docs/_static/mascot-banner.png",
+ "source_sha256": "b8b569a5cfd84474f3d2d9a6d411bdf0aa00a6188c2e5c0734b1f9ce173c13ec",
+ "repository": "php-fast-forward/dev-tools",
+ "source_path": "docs/_static/mascot-banner.png",
+ "source_commit": "1ff10624f08642d50437cd33d337a43972203e7e",
+ "git_blob_sha": "7c9909f8aef76259a0f8f6c070c5f343801c3e7e",
+ "source_scope": "public-pull-request-head",
+ "pull_request": "https://github.com/php-fast-forward/dev-tools/pull/360",
+ "verified_on": "2026-10-05",
+ "generation_receipt": "docs/brand/repository-artwork.json",
+ "generation_record": "reference-dash-package-dev-tools",
+ "source_ids": [
+ "dash-developer-welcome",
+ "dash-developer-build"
+ ]
+ },
+ "rights": "Generated for authorized repository identity work. Historical reference-art rights remain unrecorded; no independent third-party asset license is asserted.",
+ "sha256": "b8b569a5cfd84474f3d2d9a6d411bdf0aa00a6188c2e5c0734b1f9ce173c13ec",
+ "bytes": 2092029,
+ "format": "png",
+ "width": 1536,
+ "height": 1024,
+ "mode": "RGB",
+ "has_alpha": false,
+ "publication": {
+ "status": "authorized",
+ "authorization": "maintainer-request",
+ "recorded_at": "2026-10-05",
+ "scope": "brand-public-library",
+ "evidence": "Maintainer requested repository-specific Dash artwork, public repository PRs and a public ecosystem gallery in the central brand library on 2026-10-05."
+ }
+ }
+ ],
+ "archived_sources": [
+ {
+ "id": "legacy-brand-hero-banner",
+ "path": "profile/assets/brand-hero-banner.png",
+ "category": "profile",
+ "status": "legacy",
+ "role": "Historical profile URL retained for compatibility",
+ "provenance": {
+ "source": "repository:profile/assets/brand-hero-banner.png",
+ "source_sha256": "f1fd2ee997e74eead4631fb1ce0504c4294c1091502f3de0520f7b49f4ac6be9",
+ "source_commit": "ea130ec1af8c01e4b13d7767f7dc51ec216e3087"
+ },
+ "rights": "Not recorded in supplied source; no new asset license is asserted.",
+ "sha256": "f1fd2ee997e74eead4631fb1ce0504c4294c1091502f3de0520f7b49f4ac6be9",
+ "bytes": 1358622,
+ "format": "png",
+ "width": 1672,
+ "height": 941,
+ "mode": "RGB",
+ "has_alpha": false,
+ "availability": "local-backup-not-distributed",
+ "included_in_public_kit": false,
+ "archive_path": "backup/brand/retired-2026-10-03/profile/assets/brand-hero-banner.png",
+ "retirement": {
+ "date": "2026-10-03",
+ "status": "retired",
+ "reason": "Replaced by the selected native direction F fox identity; original bytes and provenance retained in the local ignored backup."
+ }
+ },
+ {
+ "id": "brand-mark",
+ "path": "assets/brand/mark.png",
+ "category": "brand",
+ "status": "legacy",
+ "original_status": "canonical",
+ "role": "Framework mark",
+ "provenance": {
+ "source": "supplied-backup:php_fast_forward_clean_assets_transparent/01_brand/logo_mark_arrows_transparent_cropped.png",
+ "source_sha256": "e03c302ef9836b44f06bad1f4ad59dac7f3d1c559a098a83e5a3c572acaa34bf"
+ },
+ "rights": "Not recorded in supplied source; no new asset license is asserted.",
+ "sha256": "e03c302ef9836b44f06bad1f4ad59dac7f3d1c559a098a83e5a3c572acaa34bf",
+ "bytes": 236386,
+ "format": "png",
+ "width": 1072,
+ "height": 543,
+ "mode": "RGBA",
+ "has_alpha": true,
+ "availability": "local-backup-not-distributed",
+ "included_in_public_kit": false,
+ "archive_path": "backup/brand/retired-2026-10-03/assets/brand/mark.png",
+ "retirement": {
+ "date": "2026-10-03",
+ "status": "retired",
+ "reason": "Replaced by the selected native direction F fox identity; original bytes and provenance retained in the local ignored backup."
+ }
+ },
+ {
+ "id": "brand-wordmark-light",
+ "path": "assets/brand/wordmark-light.png",
+ "category": "brand",
+ "status": "legacy",
+ "original_status": "canonical",
+ "role": "Wordmark for light surfaces",
+ "provenance": {
+ "source": "supplied-backup:php_fast_forward_clean_assets_transparent/01_brand/logo_horizontal_text_transparent_cropped.png",
+ "source_sha256": "687896b5ff7aa712e5e5d4a60fe11cdf120e24e7fb78a614d5a4c2e7a504f36f"
+ },
+ "rights": "Not recorded in supplied source; no new asset license is asserted.",
+ "sha256": "687896b5ff7aa712e5e5d4a60fe11cdf120e24e7fb78a614d5a4c2e7a504f36f",
+ "bytes": 190937,
+ "format": "png",
+ "width": 1581,
+ "height": 281,
+ "mode": "RGBA",
+ "has_alpha": true,
+ "availability": "local-backup-not-distributed",
+ "included_in_public_kit": false,
+ "archive_path": "backup/brand/retired-2026-10-03/assets/brand/wordmark-light.png",
+ "retirement": {
+ "date": "2026-10-03",
+ "status": "retired",
+ "reason": "Replaced by the selected native direction F fox identity; original bytes and provenance retained in the local ignored backup."
+ }
+ },
+ {
+ "id": "mark-compact",
+ "path": "assets/brand/mark-compact.svg",
+ "category": "brand",
+ "status": "legacy",
+ "original_status": "canonical",
+ "role": "Compact color mark for small UI applications",
+ "provenance": {
+ "source": "derived:assets/brand/mark.png",
+ "source_sha256": "e03c302ef9836b44f06bad1f4ad59dac7f3d1c559a098a83e5a3c572acaa34bf",
+ "authoring": "New native SVG geometry authored in this repository on 2026-10-03.",
+ "transformation": "Simplify the three forward chevrons; omit speed trails; use design tokens. Not a trace or a replacement of the supplied raster wordmark."
+ },
+ "rights": "New repository-authored geometry; no separate artwork license is declared.",
+ "sha256": "8661e34fc7c57ddd2f4c35a6433855e07c3d98efb5bf174d69e17c0ede99af55",
+ "bytes": 625,
+ "format": "svg",
+ "embedded_raster": false,
+ "availability": "local-backup-not-distributed",
+ "included_in_public_kit": false,
+ "archive_path": "backup/brand/retired-2026-10-03/assets/brand/mark-compact.svg",
+ "retirement": {
+ "date": "2026-10-03",
+ "status": "retired",
+ "reason": "Replaced by the selected native direction F fox identity; original bytes and provenance retained in the local ignored backup."
+ }
+ },
+ {
+ "id": "mark-compact-ink",
+ "path": "assets/brand/mark-compact-ink.svg",
+ "category": "brand",
+ "status": "legacy",
+ "original_status": "canonical",
+ "role": "Compact monochrome mark for light surfaces",
+ "provenance": {
+ "source": "derived:assets/brand/mark.png",
+ "source_sha256": "e03c302ef9836b44f06bad1f4ad59dac7f3d1c559a098a83e5a3c572acaa34bf",
+ "authoring": "New native SVG geometry authored in this repository on 2026-10-03.",
+ "transformation": "Simplify the three forward chevrons; omit speed trails; use design tokens. Not a trace or a replacement of the supplied raster wordmark."
+ },
+ "rights": "New repository-authored geometry; no separate artwork license is declared.",
+ "sha256": "e448cc1bdcb10a84601cb5d65c6bee7ac61d9cdefca2320695871c295d7a7137",
+ "bytes": 360,
+ "format": "svg",
+ "embedded_raster": false,
+ "availability": "local-backup-not-distributed",
+ "included_in_public_kit": false,
+ "archive_path": "backup/brand/retired-2026-10-03/assets/brand/mark-compact-ink.svg",
+ "retirement": {
+ "date": "2026-10-03",
+ "status": "retired",
+ "reason": "Replaced by the selected native direction F fox identity; original bytes and provenance retained in the local ignored backup."
+ }
+ },
+ {
+ "id": "mark-compact-white",
+ "path": "assets/brand/mark-compact-white.svg",
+ "category": "brand",
+ "status": "legacy",
+ "original_status": "canonical",
+ "role": "Compact monochrome mark for navy surfaces",
+ "provenance": {
+ "source": "derived:assets/brand/mark.png",
+ "source_sha256": "e03c302ef9836b44f06bad1f4ad59dac7f3d1c559a098a83e5a3c572acaa34bf",
+ "authoring": "New native SVG geometry authored in this repository on 2026-10-03.",
+ "transformation": "Simplify the three forward chevrons; omit speed trails; use design tokens. Not a trace or a replacement of the supplied raster wordmark."
+ },
+ "rights": "New repository-authored geometry; no separate artwork license is declared.",
+ "sha256": "c0c86a8dbfa21ff774dbfb14dc7fb2b6c241d355d1b977066e87155adb7a722c",
+ "bytes": 362,
+ "format": "svg",
+ "embedded_raster": false,
+ "availability": "local-backup-not-distributed",
+ "included_in_public_kit": false,
+ "archive_path": "backup/brand/retired-2026-10-03/assets/brand/mark-compact-white.svg",
+ "retirement": {
+ "date": "2026-10-03",
+ "status": "retired",
+ "reason": "Replaced by the selected native direction F fox identity; original bytes and provenance retained in the local ignored backup."
+ }
+ },
+ {
+ "id": "fast-forward-logo-concepts",
+ "path": "assets/brand/fast-forward-logo-concepts.png",
+ "category": "brand",
+ "status": "exploratory",
+ "review_status": "awaiting-review",
+ "role": "Bitmap logo directions E/F/G for local review; generated lettering and geometry require reconstruction",
+ "provenance": {
+ "source": "generated:image_gen.imagegen; docs/brand/logo-generation.json#fast-forward-logo-concepts",
+ "source_sha256": "687896b5ff7aa712e5e5d4a60fe11cdf120e24e7fb78a614d5a4c2e7a504f36f",
+ "generation_receipt": "docs/brand/logo-generation.json",
+ "source_ids": [
+ "brand-wordmark-light",
+ "dash-developer-welcome"
+ ]
+ },
+ "rights": "Generated during authorized repository identity work; source artwork rights remain unrecorded, no separate asset license is asserted.",
+ "sha256": "c5586c01fa8d3abe9986d17d3e9a1125ccefd0802f737c90e1c5b4dc9d44be56",
+ "bytes": 1046074,
+ "format": "png",
+ "width": 1774,
+ "height": 887,
+ "mode": "RGB",
+ "has_alpha": false,
+ "availability": "local-backup-not-distributed",
+ "included_in_public_kit": false,
+ "archive_path": "backup/brand/retired-2026-10-03/assets/brand/fast-forward-logo-concepts.png",
+ "retirement": {
+ "date": "2026-10-03",
+ "status": "retired",
+ "reason": "Replaced by the selected native direction F fox identity; original bytes and provenance retained in the local ignored backup."
+ },
+ "selection": {
+ "direction": "F",
+ "status": "direction-selected",
+ "date": "2026-10-03",
+ "evidence": "Maintainer selected the fox direction with Fast in orange and its monochromatic rendition."
+ }
+ },
+ {
+ "id": "legacy-brand-wordmark-banner",
+ "path": "profile/assets/brand-wordmark-banner.svg",
+ "category": "profile",
+ "status": "legacy",
+ "role": "Historical profile URL retained for compatibility",
+ "provenance": {
+ "source": "repository:profile/assets/brand-wordmark-banner.svg",
+ "source_sha256": "49bf76546be53867274929ca7d329f4a890c5b532e187a9e45d3b6fb2b93f186",
+ "source_commit": "ea130ec1af8c01e4b13d7767f7dc51ec216e3087"
+ },
+ "rights": "Not recorded in supplied source; no new asset license is asserted.",
+ "sha256": "49bf76546be53867274929ca7d329f4a890c5b532e187a9e45d3b6fb2b93f186",
+ "bytes": 207020,
+ "format": "svg",
+ "embedded_raster": true,
+ "availability": "local-backup-not-distributed",
+ "included_in_public_kit": false,
+ "archive_path": "backup/brand/retired-2026-10-03/profile/assets/brand-wordmark-banner.svg",
+ "retirement": {
+ "date": "2026-10-03",
+ "status": "retired",
+ "reason": "Replaced by the selected native direction F fox identity; original bytes and provenance retained in the local ignored backup."
+ }
+ },
+ {
+ "id": "legacy-mascot-wordmark-horizontal",
+ "path": "profile/assets/mascot-wordmark-horizontal.svg",
+ "category": "profile",
+ "status": "legacy",
+ "role": "Historical profile URL retained for compatibility",
+ "provenance": {
+ "source": "repository:profile/assets/mascot-wordmark-horizontal.svg",
+ "source_sha256": "c370e39e574c0bdbdb18d776fb593598112bfe986794957e13464cbca855368c",
+ "source_commit": "ea130ec1af8c01e4b13d7767f7dc51ec216e3087"
+ },
+ "rights": "Not recorded in supplied source; no new asset license is asserted.",
+ "sha256": "c370e39e574c0bdbdb18d776fb593598112bfe986794957e13464cbca855368c",
+ "bytes": 328423,
+ "format": "svg",
+ "embedded_raster": true,
+ "availability": "local-backup-not-distributed",
+ "included_in_public_kit": false,
+ "archive_path": "backup/brand/retired-2026-10-03/profile/assets/mascot-wordmark-horizontal.svg",
+ "retirement": {
+ "date": "2026-10-03",
+ "status": "retired",
+ "reason": "Replaced by the selected native direction F fox identity; original bytes and provenance retained in the local ignored backup."
+ }
+ },
+ {
+ "id": "legacy-docs-installation-mockup",
+ "path": "profile/assets/docs-installation-mockup.svg",
+ "category": "profile",
+ "status": "legacy",
+ "role": "Historical profile URL retained for compatibility",
+ "provenance": {
+ "source": "repository:profile/assets/docs-installation-mockup.svg",
+ "source_sha256": "018d99e02bf067138a263cbf477c0ed7aca15d46ac6d2a5cf0a2e7bc5d917f25",
+ "source_commit": "ea130ec1af8c01e4b13d7767f7dc51ec216e3087"
+ },
+ "rights": "Not recorded in supplied source; no new asset license is asserted.",
+ "sha256": "018d99e02bf067138a263cbf477c0ed7aca15d46ac6d2a5cf0a2e7bc5d917f25",
+ "bytes": 13096,
+ "format": "svg",
+ "embedded_raster": false,
+ "availability": "local-backup-not-distributed",
+ "included_in_public_kit": false,
+ "archive_path": "backup/brand/retired-2026-10-03/profile/assets/docs-installation-mockup.svg",
+ "retirement": {
+ "date": "2026-10-03",
+ "status": "retired",
+ "reason": "Replaced by the selected native direction F fox identity; original bytes and provenance retained in the local ignored backup."
+ }
+ },
+ {
+ "id": "reference-landing",
+ "path": "references/website/landing-page.png",
+ "category": "website",
+ "status": "reference",
+ "role": "Future landing composition; embedded claims unverified",
+ "provenance": {
+ "source": "supplied-backup:php_fast_forward_clean_assets_transparent/04_mockups/landing_page_design_full.png",
+ "source_sha256": "389025c965bb179f826180f29219c53bfaa537796a6bee0419428818a8da70bf"
+ },
+ "rights": "Not recorded in supplied source; no new asset license is asserted.",
+ "sha256": "389025c965bb179f826180f29219c53bfaa537796a6bee0419428818a8da70bf",
+ "bytes": 1132261,
+ "format": "png",
+ "width": 935,
+ "height": 1683,
+ "mode": "RGB",
+ "has_alpha": false,
+ "availability": "local-backup-not-distributed",
+ "included_in_public_kit": false,
+ "archive_path": "backup/brand/retired-2026-10-03/references/website/landing-page.png",
+ "retirement": {
+ "date": "2026-10-03",
+ "status": "retired",
+ "reason": "Replaced by the selected native direction F fox identity; original bytes and provenance retained in the local ignored backup."
+ }
+ },
+ {
+ "id": "reference-documentation",
+ "path": "references/website/documentation.png",
+ "category": "website",
+ "status": "reference",
+ "role": "Future docs layout; embedded API and claims unverified",
+ "provenance": {
+ "source": "supplied-backup:php_fast_forward_clean_assets_transparent/04_mockups/documentation_layout_preview.png",
+ "source_sha256": "63f5c124e68f74ec322c4685e9373958542fcd293dbcc95b9339501733400836"
+ },
+ "rights": "Not recorded in supplied source; no new asset license is asserted.",
+ "sha256": "63f5c124e68f74ec322c4685e9373958542fcd293dbcc95b9339501733400836",
+ "bytes": 893420,
+ "format": "png",
+ "width": 1448,
+ "height": 1086,
+ "mode": "RGB",
+ "has_alpha": false,
+ "availability": "local-backup-not-distributed",
+ "included_in_public_kit": false,
+ "archive_path": "backup/brand/retired-2026-10-03/references/website/documentation.png",
+ "retirement": {
+ "date": "2026-10-03",
+ "status": "retired",
+ "reason": "Replaced by the selected native direction F fox identity; original bytes and provenance retained in the local ignored backup."
+ }
+ },
+ {
+ "id": "reference-package-framework",
+ "path": "references/ecosystem/framework.png",
+ "category": "ecosystem",
+ "status": "reference",
+ "role": "Existing public package artwork",
+ "provenance": {
+ "source": "https://github.com/php-fast-forward/framework/blob/dac7ef8e4cfd8d39f36d526a6a4345958bcc83eb/docs/_static/mascot.png",
+ "source_sha256": "7e19237f0dca9e6534381203fc5dc69685e986551d7a107e51a6136e1e986f8f",
+ "repository": "php-fast-forward/framework",
+ "source_commit": "dac7ef8e4cfd8d39f36d526a6a4345958bcc83eb",
+ "git_blob_sha": "35304abcd8b3420838c42a22a49c84185c646411",
+ "public_default_branch_verified_on": "2026-10-03",
+ "visual_notes": [
+ "Legacy ecosystem banner: unclothed orange fox, white muzzle/chest/tail tip, amber eyes, dark brown contours.",
+ "Navy background with violet-blue-cyan connection trails, chevron wordmark, outlined ecosystem cards.",
+ "Confirms neutral fox continuity with the organization profile and backup identity; embedded product copy remains a historical reference."
+ ]
+ },
+ "rights": "Not recorded in supplied source; no new asset license is asserted.",
+ "sha256": "7e19237f0dca9e6534381203fc5dc69685e986551d7a107e51a6136e1e986f8f",
+ "bytes": 1473461,
+ "format": "png",
+ "width": 1536,
+ "height": 1024,
+ "mode": "RGB",
+ "has_alpha": false,
+ "family": "historical-editorial",
+ "availability": "local-backup-not-distributed",
+ "included_in_public_kit": false,
+ "archive_path": "backup/brand/retired-2026-10-03/references/ecosystem/framework.png",
+ "retirement": {
+ "date": "2026-10-03",
+ "status": "retired",
+ "reason": "Replaced by the selected native direction F fox identity; original bytes and provenance retained in the local ignored backup."
+ }
+ },
+ {
+ "id": "reference-package-dev-tools",
+ "path": "references/ecosystem/dev-tools.png",
+ "category": "ecosystem",
+ "status": "legacy",
+ "role": "Existing public package artwork",
+ "provenance": {
+ "source": "https://github.com/php-fast-forward/dev-tools/blob/f2dbd184cd874140bd5e85d15edadd49d42ba87c/docs/_static/mascot-banner.png",
+ "source_sha256": "12fe5ab6b4e53a616c7f2589c0262c9daca98642a4b99a5b048f60ab7fbacdca",
+ "repository": "php-fast-forward/dev-tools",
+ "source_commit": "f2dbd184cd874140bd5e85d15edadd49d42ba87c",
+ "git_blob_sha": "9860d6d7b89f495005aeecb8e316ce067edb1d27",
+ "public_default_branch_verified_on": "2026-10-03",
+ "visual_notes": [
+ "Established package costume: orange fox with purple hoodie, white wrench-and-gear chest emblem and amber eyes.",
+ "Glossy shaded fur, rounded 3D icon tiles, lavender surfaces; mascot operates a tooling mixing console.",
+ "Historical public hoodie reference; the newly authored Dash developer master now governs future package artwork."
+ ]
+ },
+ "rights": "Not recorded in supplied source; no new asset license is asserted.",
+ "sha256": "12fe5ab6b4e53a616c7f2589c0262c9daca98642a4b99a5b048f60ab7fbacdca",
+ "bytes": 2258972,
+ "format": "png",
+ "width": 1774,
+ "height": 887,
+ "mode": "RGB",
+ "has_alpha": false,
+ "family": "developer",
+ "original_status": "package-variant",
+ "availability": "local-backup-not-distributed",
+ "included_in_public_kit": false,
+ "archive_path": "backup/brand/retired-2026-10-05/references/ecosystem/dev-tools.png",
+ "retirement": {
+ "date": "2026-10-05",
+ "status": "retired",
+ "reason": "Replaced by the reviewed repository-specific Dash application. Original bytes and provenance are retained in the ignored local archive; the source ID remains available to historical generation receipts."
+ }
+ },
+ {
+ "id": "reference-package-enum",
+ "path": "references/ecosystem/enum.png",
+ "category": "ecosystem",
+ "status": "legacy",
+ "role": "Existing public package artwork",
+ "provenance": {
+ "source": "https://github.com/php-fast-forward/enum/blob/14a5d4175e58dce2c410df1e0a003fd706d7a2c4/docs/_static/enum-mascot-banner.png",
+ "source_sha256": "129bea6fb7c083c7c6aec7c392b98253adbd947cad960d91ede08537bea86b9a",
+ "repository": "php-fast-forward/enum",
+ "source_commit": "14a5d4175e58dce2c410df1e0a003fd706d7a2c4",
+ "git_blob_sha": "a08197fc1715f5447adc52fe9c5d3f7a2ed721a1",
+ "public_default_branch_verified_on": "2026-10-03",
+ "visual_notes": [
+ "Package variant: purple hoodie with white PHP-like chest emblem, pointer pose and violet eyes.",
+ "Glossy shaded fur, soft lavender scene, code cards and rounded UI tiles.",
+ "Violet eye color is a variant deviation rather than canonical anatomy; no headphones."
+ ]
+ },
+ "rights": "Not recorded in supplied source; no new asset license is asserted.",
+ "sha256": "129bea6fb7c083c7c6aec7c392b98253adbd947cad960d91ede08537bea86b9a",
+ "bytes": 1841331,
+ "format": "png",
+ "width": 1693,
+ "height": 929,
+ "mode": "RGB",
+ "has_alpha": false,
+ "family": "developer",
+ "original_status": "package-variant",
+ "availability": "local-backup-not-distributed",
+ "included_in_public_kit": false,
+ "archive_path": "backup/brand/retired-2026-10-05/references/ecosystem/enum.png",
+ "retirement": {
+ "date": "2026-10-05",
+ "status": "retired",
+ "reason": "Replaced by the reviewed repository-specific Dash application. Original bytes and provenance are retained in the ignored local archive; the source ID remains available to historical generation receipts."
+ }
+ },
+ {
+ "id": "reference-package-agents",
+ "path": "references/ecosystem/agents.png",
+ "category": "ecosystem",
+ "status": "legacy",
+ "family": "developer",
+ "role": "Locally supplied package illustration; not claimed as shipped default-branch art",
+ "provenance": {
+ "source": "local-checkout:php-fast-forward/agents/docs/_static/mascot-banner.png",
+ "source_sha256": "c8f248fef95ffff8649cc9987ed9fe652a8e6cab40ecbc3a9e3b6f451b5a5318",
+ "repository": "php-fast-forward/agents",
+ "source_scope": "tracked-local-branch",
+ "local_branch": "task/1-initial-agents-package",
+ "local_checkout_head": "e8b0f95695b2ff79b228c939837df80141a4a62b",
+ "source_tracked": true,
+ "source_in_local_head": true,
+ "git_blob_sha": "d54c7b9ded0a4a145673c4bc87442c36f98a2f14",
+ "public_default_branch_head_on_audit": "92c785da6fba85d5e0b414e32ee8c1b344e37f06",
+ "source_on_public_default_branch": false,
+ "verified_on": "2026-10-03",
+ "visual_notes": [
+ "purple hoodie",
+ "cream drawstrings",
+ "orange fur",
+ "brown eyes",
+ "resource bundle chest emblem",
+ "box and folder props",
+ "light lavender background"
+ ],
+ "embedded_copy_status": "Visual reference only; code, APIs and claims in the banner require separate verification."
+ },
+ "rights": "Not recorded in supplied source; no new asset license is asserted.",
+ "sha256": "c8f248fef95ffff8649cc9987ed9fe652a8e6cab40ecbc3a9e3b6f451b5a5318",
+ "bytes": 2422381,
+ "format": "png",
+ "width": 1536,
+ "height": 1024,
+ "mode": "RGB",
+ "has_alpha": false,
+ "original_status": "package-variant",
+ "availability": "local-backup-not-distributed",
+ "included_in_public_kit": false,
+ "archive_path": "backup/brand/retired-2026-10-05/references/ecosystem/agents.png",
+ "retirement": {
+ "date": "2026-10-05",
+ "status": "retired",
+ "reason": "Replaced by the reviewed repository-specific Dash application. Original bytes and provenance are retained in the ignored local archive; the source ID remains available to historical generation receipts."
+ }
+ },
+ {
+ "id": "reference-package-changelog",
+ "path": "references/ecosystem/changelog.png",
+ "category": "ecosystem",
+ "status": "legacy",
+ "family": "developer",
+ "role": "Locally supplied package illustration; not claimed as shipped default-branch art",
+ "provenance": {
+ "source": "local-checkout:php-fast-forward/changelog/docs/_static/mascot-banner.png",
+ "source_sha256": "1aba6b4222b9f51f528f010832d891955350b50b3d6dcc3fd37711a65fe6bc52",
+ "repository": "php-fast-forward/changelog",
+ "source_scope": "untracked-local-source",
+ "local_branch": "task/1-bootstrap-standalone-changelog-package",
+ "local_checkout_head": "3454616467dec4be832c9e432d9788dabe652091",
+ "source_tracked": false,
+ "source_in_local_head": false,
+ "git_blob_sha": "5d79fbae102dd7b47f71333d3fdf1a0a9ffddbf8",
+ "public_default_branch_head_on_audit": "556ecf882ca841102f0474f3367a8f18d54db634",
+ "source_on_public_default_branch": false,
+ "verified_on": "2026-10-03",
+ "visual_notes": [
+ "purple hoodie",
+ "cream drawstrings",
+ "orange fur",
+ "brown eyes",
+ "document/check chest emblem",
+ "writing pen and notebook",
+ "light lavender background"
+ ],
+ "embedded_copy_status": "Visual reference only; code, APIs and claims in the banner require separate verification."
+ },
+ "rights": "Not recorded in supplied source; no new asset license is asserted.",
+ "sha256": "1aba6b4222b9f51f528f010832d891955350b50b3d6dcc3fd37711a65fe6bc52",
+ "bytes": 2368709,
+ "format": "png",
+ "width": 1536,
+ "height": 1024,
+ "mode": "RGB",
+ "has_alpha": false,
+ "original_status": "package-variant",
+ "availability": "local-backup-not-distributed",
+ "included_in_public_kit": false,
+ "archive_path": "backup/brand/retired-2026-10-05/references/ecosystem/changelog.png",
+ "retirement": {
+ "date": "2026-10-05",
+ "status": "retired",
+ "reason": "Replaced by the reviewed repository-specific Dash application. Original bytes and provenance are retained in the ignored local archive; the source ID remains available to historical generation receipts."
+ }
+ },
+ {
+ "id": "reference-package-clock",
+ "path": "references/ecosystem/clock.png",
+ "category": "ecosystem",
+ "status": "legacy",
+ "family": "developer",
+ "role": "Locally supplied package illustration; not claimed as shipped default-branch art",
+ "provenance": {
+ "source": "local-checkout:php-fast-forward/clock/docs/_static/mascot-banner.png",
+ "source_sha256": "5578c516e465c665387ef6fc788987a560fb727d6a2e4782fbb806d86b70aef6",
+ "repository": "php-fast-forward/clock",
+ "source_scope": "untracked-local-source",
+ "local_branch": "main",
+ "local_checkout_head": "d578f5385d7add0bd614ce7d2aa8311cced33234",
+ "source_tracked": false,
+ "source_in_local_head": false,
+ "git_blob_sha": "f1b982b46943fef9c08e547ffda6d7ba6adfe9fb",
+ "public_default_branch_head_on_audit": "d578f5385d7add0bd614ce7d2aa8311cced33234",
+ "source_on_public_default_branch": false,
+ "verified_on": "2026-10-03",
+ "visual_notes": [
+ "purple hoodie",
+ "cream drawstrings",
+ "orange fur",
+ "brown eyes",
+ "clock chest emblem",
+ "handheld glowing clock",
+ "light lavender background"
+ ],
+ "embedded_copy_status": "Visual reference only; code, APIs and claims in the banner require separate verification."
+ },
+ "rights": "Not recorded in supplied source; no new asset license is asserted.",
+ "sha256": "5578c516e465c665387ef6fc788987a560fb727d6a2e4782fbb806d86b70aef6",
+ "bytes": 2076902,
+ "format": "png",
+ "width": 1536,
+ "height": 1024,
+ "mode": "RGB",
+ "has_alpha": false,
+ "original_status": "package-variant",
+ "availability": "local-backup-not-distributed",
+ "included_in_public_kit": false,
+ "archive_path": "backup/brand/retired-2026-10-05/references/ecosystem/clock.png",
+ "retirement": {
+ "date": "2026-10-05",
+ "status": "retired",
+ "reason": "Replaced by the reviewed repository-specific Dash application. Original bytes and provenance are retained in the ignored local archive; the source ID remains available to historical generation receipts."
+ }
+ },
+ {
+ "id": "reference-package-composer-installers",
+ "path": "references/ecosystem/composer-installers.png",
+ "category": "ecosystem",
+ "status": "legacy",
+ "family": "developer",
+ "role": "Locally supplied package illustration; not claimed as shipped default-branch art",
+ "provenance": {
+ "source": "local-checkout:php-fast-forward/composer-installers/docs/_static/mascot-banner.png",
+ "source_sha256": "c00b9f06a0fc4f88623705ebaf72afff02e2dc72ad2a955d80cf6a758741623e",
+ "repository": "php-fast-forward/composer-installers",
+ "source_scope": "untracked-local-source",
+ "local_branch": "main",
+ "local_checkout_head": "c7e2568e3480eed950fbb6621b235265de71dfe4",
+ "source_tracked": false,
+ "source_in_local_head": false,
+ "git_blob_sha": "c903a8c992830d540fae11e05cf79b40e46110c0",
+ "public_default_branch_head_on_audit": "c7e2568e3480eed950fbb6621b235265de71dfe4",
+ "source_on_public_default_branch": false,
+ "verified_on": "2026-10-03",
+ "visual_notes": [
+ "purple hoodie",
+ "cream drawstrings",
+ "orange fur",
+ "brown eyes",
+ "package cube chest emblem",
+ "box and folder props",
+ "light lavender background"
+ ],
+ "embedded_copy_status": "Visual reference only; code, APIs and claims in the banner require separate verification."
+ },
+ "rights": "Not recorded in supplied source; no new asset license is asserted.",
+ "sha256": "c00b9f06a0fc4f88623705ebaf72afff02e2dc72ad2a955d80cf6a758741623e",
+ "bytes": 2256287,
+ "format": "png",
+ "width": 1536,
+ "height": 1024,
+ "mode": "RGB",
+ "has_alpha": false,
+ "original_status": "package-variant",
+ "availability": "local-backup-not-distributed",
+ "included_in_public_kit": false,
+ "archive_path": "backup/brand/retired-2026-10-05/references/ecosystem/composer-installers.png",
+ "retirement": {
+ "date": "2026-10-05",
+ "status": "retired",
+ "reason": "Replaced by the reviewed repository-specific Dash application. Original bytes and provenance are retained in the ignored local archive; the source ID remains available to historical generation receipts."
+ }
+ },
+ {
+ "id": "reference-package-config",
+ "path": "references/ecosystem/config.png",
+ "category": "ecosystem",
+ "status": "legacy",
+ "family": "developer",
+ "role": "Locally supplied package illustration; not claimed as shipped default-branch art",
+ "provenance": {
+ "source": "local-checkout:php-fast-forward/config/docs/_static/mascot-banner.png",
+ "source_sha256": "bf26ec54f07482a0ec34a8e82769a15cb0d49b5497c8d8b04419709692905534",
+ "repository": "php-fast-forward/config",
+ "source_scope": "untracked-local-source",
+ "local_branch": "main",
+ "local_checkout_head": "bee3ac57a9f7f0a377022d5723c71e7c9bea4242",
+ "source_tracked": false,
+ "source_in_local_head": false,
+ "git_blob_sha": "57b3a888158524b1313007336b05d98b867a671e",
+ "public_default_branch_head_on_audit": "bee3ac57a9f7f0a377022d5723c71e7c9bea4242",
+ "source_on_public_default_branch": false,
+ "verified_on": "2026-10-03",
+ "visual_notes": [
+ "purple hoodie",
+ "cream drawstrings",
+ "orange fur",
+ "brown eyes",
+ "gear chest emblem",
+ "glowing configuration cube",
+ "dark navy background"
+ ],
+ "embedded_copy_status": "Visual reference only; code, APIs and claims in the banner require separate verification."
+ },
+ "rights": "Not recorded in supplied source; no new asset license is asserted.",
+ "sha256": "bf26ec54f07482a0ec34a8e82769a15cb0d49b5497c8d8b04419709692905534",
+ "bytes": 2235506,
+ "format": "png",
+ "width": 1536,
+ "height": 1024,
+ "mode": "RGB",
+ "has_alpha": false,
+ "original_status": "package-variant",
+ "availability": "local-backup-not-distributed",
+ "included_in_public_kit": false,
+ "archive_path": "backup/brand/retired-2026-10-05/references/ecosystem/config.png",
+ "retirement": {
+ "date": "2026-10-05",
+ "status": "retired",
+ "reason": "Replaced by the reviewed repository-specific Dash application. Original bytes and provenance are retained in the ignored local archive; the source ID remains available to historical generation receipts."
+ }
+ },
+ {
+ "id": "reference-package-container",
+ "path": "references/ecosystem/container.png",
+ "category": "ecosystem",
+ "status": "legacy",
+ "family": "developer",
+ "role": "Locally supplied package illustration; not claimed as shipped default-branch art",
+ "provenance": {
+ "source": "local-checkout:php-fast-forward/container/docs/_static/mascot-banner.png",
+ "source_sha256": "4fa62e482e8c9b9415365e03e85cc26a791b4a797123bb8ee0f949ae052f46b5",
+ "repository": "php-fast-forward/container",
+ "source_scope": "untracked-local-source",
+ "local_branch": "main",
+ "local_checkout_head": "e9af924a0c92a3ebc0992ecede07631ae943accf",
+ "source_tracked": false,
+ "source_in_local_head": false,
+ "git_blob_sha": "c2849e3050dddfa7ddc3490f72dea297c85295f1",
+ "public_default_branch_head_on_audit": "e9af924a0c92a3ebc0992ecede07631ae943accf",
+ "source_on_public_default_branch": false,
+ "verified_on": "2026-10-03",
+ "visual_notes": [
+ "purple hoodie",
+ "cream drawstrings",
+ "orange fur",
+ "brown eyes",
+ "wire cube chest emblem",
+ "glowing container cube",
+ "dark navy background"
+ ],
+ "embedded_copy_status": "Visual reference only; code, APIs and claims in the banner require separate verification."
+ },
+ "rights": "Not recorded in supplied source; no new asset license is asserted.",
+ "sha256": "4fa62e482e8c9b9415365e03e85cc26a791b4a797123bb8ee0f949ae052f46b5",
+ "bytes": 2213330,
+ "format": "png",
+ "width": 1536,
+ "height": 1024,
+ "mode": "RGB",
+ "has_alpha": false,
+ "original_status": "package-variant",
+ "availability": "local-backup-not-distributed",
+ "included_in_public_kit": false,
+ "archive_path": "backup/brand/retired-2026-10-05/references/ecosystem/container.png",
+ "retirement": {
+ "date": "2026-10-05",
+ "status": "retired",
+ "reason": "Replaced by the reviewed repository-specific Dash application. Original bytes and provenance are retained in the ignored local archive; the source ID remains available to historical generation receipts."
+ }
+ },
+ {
+ "id": "reference-package-defer",
+ "path": "references/ecosystem/defer.png",
+ "category": "ecosystem",
+ "status": "legacy",
+ "family": "developer",
+ "role": "Locally supplied package illustration; not claimed as shipped default-branch art",
+ "provenance": {
+ "source": "local-checkout:php-fast-forward/defer/docs/_static/mascot-banner.png",
+ "source_sha256": "0997c0ea41aff048c27ae6d4e7bca9d48ad4a8cee63b01911bc8e832d333b004",
+ "repository": "php-fast-forward/defer",
+ "source_scope": "untracked-local-source",
+ "local_branch": "main",
+ "local_checkout_head": "d0d4847121b995a4dbd9ffd31b0831856dc9975f",
+ "source_tracked": false,
+ "source_in_local_head": false,
+ "git_blob_sha": "c3d60e616fc70710d4b09b64e536449522ad7268",
+ "public_default_branch_head_on_audit": "d0d4847121b995a4dbd9ffd31b0831856dc9975f",
+ "source_on_public_default_branch": false,
+ "verified_on": "2026-10-03",
+ "visual_notes": [
+ "purple hoodie",
+ "cream drawstrings",
+ "orange fur",
+ "brown eyes",
+ "clock/return chest emblem",
+ "resource box and glowing clock token",
+ "light lavender background"
+ ],
+ "embedded_copy_status": "Visual reference only; code, APIs and claims in the banner require separate verification."
+ },
+ "rights": "Not recorded in supplied source; no new asset license is asserted.",
+ "sha256": "0997c0ea41aff048c27ae6d4e7bca9d48ad4a8cee63b01911bc8e832d333b004",
+ "bytes": 2087726,
+ "format": "png",
+ "width": 1536,
+ "height": 1024,
+ "mode": "RGB",
+ "has_alpha": false,
+ "original_status": "package-variant",
+ "availability": "local-backup-not-distributed",
+ "included_in_public_kit": false,
+ "archive_path": "backup/brand/retired-2026-10-05/references/ecosystem/defer.png",
+ "retirement": {
+ "date": "2026-10-05",
+ "status": "retired",
+ "reason": "Replaced by the reviewed repository-specific Dash application. Original bytes and provenance are retained in the ignored local archive; the source ID remains available to historical generation receipts."
+ }
+ },
+ {
+ "id": "reference-package-event-dispatcher",
+ "path": "references/ecosystem/event-dispatcher.png",
+ "category": "ecosystem",
+ "status": "legacy",
+ "family": "developer",
+ "role": "Locally supplied package illustration; not claimed as shipped default-branch art",
+ "provenance": {
+ "source": "local-checkout:php-fast-forward/event-dispatcher/docs/_static/mascot-banner.png",
+ "source_sha256": "86db340858ffb798d7416601ffef474d020ede1904786ecd7045590a5af3ccaf",
+ "repository": "php-fast-forward/event-dispatcher",
+ "source_scope": "untracked-local-source",
+ "local_branch": "main",
+ "local_checkout_head": "41f473b73577d661334ac467f5677a0a26d7a161",
+ "source_tracked": false,
+ "source_in_local_head": false,
+ "git_blob_sha": "92def24fe53e27c28c3ca93f414ac0e7609bf614",
+ "public_default_branch_head_on_audit": "41f473b73577d661334ac467f5677a0a26d7a161",
+ "source_on_public_default_branch": false,
+ "verified_on": "2026-10-03",
+ "visual_notes": [
+ "purple hoodie",
+ "cream drawstrings",
+ "orange fur",
+ "brown eyes",
+ "broadcast chest emblem",
+ "event cards and routing diagram",
+ "dark navy background"
+ ],
+ "embedded_copy_status": "Visual reference only; code, APIs and claims in the banner require separate verification."
+ },
+ "rights": "Not recorded in supplied source; no new asset license is asserted.",
+ "sha256": "86db340858ffb798d7416601ffef474d020ede1904786ecd7045590a5af3ccaf",
+ "bytes": 2280473,
+ "format": "png",
+ "width": 1536,
+ "height": 1024,
+ "mode": "RGB",
+ "has_alpha": false,
+ "original_status": "package-variant",
+ "availability": "local-backup-not-distributed",
+ "included_in_public_kit": false,
+ "archive_path": "backup/brand/retired-2026-10-05/references/ecosystem/event-dispatcher.png",
+ "retirement": {
+ "date": "2026-10-05",
+ "status": "retired",
+ "reason": "Replaced by the reviewed repository-specific Dash application. Original bytes and provenance are retained in the ignored local archive; the source ID remains available to historical generation receipts."
+ }
+ },
+ {
+ "id": "reference-package-fork",
+ "path": "references/ecosystem/fork.png",
+ "category": "ecosystem",
+ "status": "legacy",
+ "family": "developer",
+ "role": "Locally supplied package illustration; not claimed as shipped default-branch art",
+ "provenance": {
+ "source": "local-checkout:php-fast-forward/fork/docs/_static/mascot-banner.png",
+ "source_sha256": "fc0812a2bbcaa50eb8a79c361aa95dde11f3b5422b4901527ecdbcc65b68a980",
+ "repository": "php-fast-forward/fork",
+ "source_scope": "untracked-local-source",
+ "local_branch": "main",
+ "local_checkout_head": "97d7637ff02f1142256f78d9d4ac95a0a06a7d28",
+ "source_tracked": false,
+ "source_in_local_head": false,
+ "git_blob_sha": "66303f7b34aa97d66d35edb1944882254474dbee",
+ "public_default_branch_head_on_audit": "97d7637ff02f1142256f78d9d4ac95a0a06a7d28",
+ "source_on_public_default_branch": false,
+ "verified_on": "2026-10-03",
+ "visual_notes": [
+ "purple hoodie",
+ "cream drawstrings",
+ "orange fur",
+ "brown eyes",
+ "process tree chest emblem",
+ "worker orchestration console",
+ "dark navy background"
+ ],
+ "embedded_copy_status": "Visual reference only; code, APIs and claims in the banner require separate verification."
+ },
+ "rights": "Not recorded in supplied source; no new asset license is asserted.",
+ "sha256": "fc0812a2bbcaa50eb8a79c361aa95dde11f3b5422b4901527ecdbcc65b68a980",
+ "bytes": 2169393,
+ "format": "png",
+ "width": 1536,
+ "height": 1024,
+ "mode": "RGB",
+ "has_alpha": false,
+ "original_status": "package-variant",
+ "availability": "local-backup-not-distributed",
+ "included_in_public_kit": false,
+ "archive_path": "backup/brand/retired-2026-10-05/references/ecosystem/fork.png",
+ "retirement": {
+ "date": "2026-10-05",
+ "status": "retired",
+ "reason": "Replaced by the reviewed repository-specific Dash application. Original bytes and provenance are retained in the ignored local archive; the source ID remains available to historical generation receipts."
+ }
+ },
+ {
+ "id": "reference-package-github-actions",
+ "path": "references/ecosystem/github-actions.png",
+ "category": "ecosystem",
+ "status": "legacy",
+ "family": "developer",
+ "role": "Locally supplied package illustration; not claimed as shipped default-branch art",
+ "provenance": {
+ "source": "local-checkout:php-fast-forward/github-actions/docs/_static/mascot-banner.png",
+ "source_sha256": "bd1aa529b88328ec7aca54ea51cb495cb1dc8e90639cb6968e9f12c4d22bddac",
+ "repository": "php-fast-forward/github-actions",
+ "source_scope": "untracked-local-source",
+ "local_branch": "task/1-bootstrap-console-runtime",
+ "local_checkout_head": "28da75de2b349d4c01809994d1661062f7daf0dd",
+ "source_tracked": false,
+ "source_in_local_head": false,
+ "git_blob_sha": "c6794cf345ed7644573abc614cea571e1f7a5244",
+ "public_default_branch_head_on_audit": "124bb800b6acc89c0c96209fb164b8b5ef743762",
+ "source_on_public_default_branch": false,
+ "verified_on": "2026-10-03",
+ "visual_notes": [
+ "purple hoodie",
+ "cream drawstrings",
+ "orange fur",
+ "brown eyes",
+ "workflow graph chest emblem",
+ "automation console",
+ "light lavender background"
+ ],
+ "embedded_copy_status": "Visual reference only; code, APIs and claims in the banner require separate verification."
+ },
+ "rights": "Not recorded in supplied source; no new asset license is asserted.",
+ "sha256": "bd1aa529b88328ec7aca54ea51cb495cb1dc8e90639cb6968e9f12c4d22bddac",
+ "bytes": 2431724,
+ "format": "png",
+ "width": 1536,
+ "height": 1024,
+ "mode": "RGB",
+ "has_alpha": false,
+ "original_status": "package-variant",
+ "availability": "local-backup-not-distributed",
+ "included_in_public_kit": false,
+ "archive_path": "backup/brand/retired-2026-10-05/references/ecosystem/github-actions.png",
+ "retirement": {
+ "date": "2026-10-05",
+ "status": "retired",
+ "reason": "Replaced by the reviewed repository-specific Dash application. Original bytes and provenance are retained in the ignored local archive; the source ID remains available to historical generation receipts."
+ }
+ },
+ {
+ "id": "reference-package-iterators",
+ "path": "references/ecosystem/iterators.png",
+ "category": "ecosystem",
+ "status": "legacy",
+ "family": "developer",
+ "role": "Locally supplied package illustration; not claimed as shipped default-branch art",
+ "provenance": {
+ "source": "local-checkout:php-fast-forward/iterators/docs/_static/mascot-banner.png",
+ "source_sha256": "2da1304b1af27844f853aca004954bb7277b9c9713392ef76952db404b3e0dc9",
+ "repository": "php-fast-forward/iterators",
+ "source_scope": "untracked-local-source",
+ "local_branch": "main",
+ "local_checkout_head": "c339bab21b85140c22ab517c1ef9d2c7cd27d82c",
+ "source_tracked": false,
+ "source_in_local_head": false,
+ "git_blob_sha": "5fdf5cbcf892e3b6ca1f1ff9824d24aa5df5db5e",
+ "public_default_branch_head_on_audit": "c339bab21b85140c22ab517c1ef9d2c7cd27d82c",
+ "source_on_public_default_branch": false,
+ "verified_on": "2026-10-03",
+ "visual_notes": [
+ "purple hoodie",
+ "cream drawstrings",
+ "orange fur",
+ "brown eyes",
+ "circular arrows chest emblem",
+ "data sequence and transformations",
+ "light lavender background"
+ ],
+ "embedded_copy_status": "Visual reference only; code, APIs and claims in the banner require separate verification."
+ },
+ "rights": "Not recorded in supplied source; no new asset license is asserted.",
+ "sha256": "2da1304b1af27844f853aca004954bb7277b9c9713392ef76952db404b3e0dc9",
+ "bytes": 2228604,
+ "format": "png",
+ "width": 1536,
+ "height": 1024,
+ "mode": "RGB",
+ "has_alpha": false,
+ "original_status": "package-variant",
+ "availability": "local-backup-not-distributed",
+ "included_in_public_kit": false,
+ "archive_path": "backup/brand/retired-2026-10-05/references/ecosystem/iterators.png",
+ "retirement": {
+ "date": "2026-10-05",
+ "status": "retired",
+ "reason": "Replaced by the reviewed repository-specific Dash application. Original bytes and provenance are retained in the ignored local archive; the source ID remains available to historical generation receipts."
+ }
+ }
+ ]
+}
diff --git a/assets/mascot/dash-developer-build.png b/assets/mascot/dash-developer-build.png
new file mode 100644
index 0000000..2e00d8b
Binary files /dev/null and b/assets/mascot/dash-developer-build.png differ
diff --git a/assets/mascot/dash-developer-coding.png b/assets/mascot/dash-developer-coding.png
new file mode 100644
index 0000000..e237f89
Binary files /dev/null and b/assets/mascot/dash-developer-coding.png differ
diff --git a/assets/mascot/dash-developer-debugging.png b/assets/mascot/dash-developer-debugging.png
new file mode 100644
index 0000000..9ed111a
Binary files /dev/null and b/assets/mascot/dash-developer-debugging.png differ
diff --git a/assets/mascot/dash-developer-explaining.png b/assets/mascot/dash-developer-explaining.png
new file mode 100644
index 0000000..c9a0590
Binary files /dev/null and b/assets/mascot/dash-developer-explaining.png differ
diff --git a/assets/mascot/dash-developer-guide.png b/assets/mascot/dash-developer-guide.png
new file mode 100644
index 0000000..125483e
Binary files /dev/null and b/assets/mascot/dash-developer-guide.png differ
diff --git a/assets/mascot/dash-developer-portrait-study.png b/assets/mascot/dash-developer-portrait-study.png
new file mode 100644
index 0000000..3580b2c
Binary files /dev/null and b/assets/mascot/dash-developer-portrait-study.png differ
diff --git a/assets/mascot/dash-developer-reading.png b/assets/mascot/dash-developer-reading.png
new file mode 100644
index 0000000..58bea91
Binary files /dev/null and b/assets/mascot/dash-developer-reading.png differ
diff --git a/assets/mascot/dash-developer-welcome.png b/assets/mascot/dash-developer-welcome.png
new file mode 100644
index 0000000..ca1c57c
Binary files /dev/null and b/assets/mascot/dash-developer-welcome.png differ
diff --git a/assets/mascot/dash-developer-workstation.png b/assets/mascot/dash-developer-workstation.png
new file mode 100644
index 0000000..734922b
Binary files /dev/null and b/assets/mascot/dash-developer-workstation.png differ
diff --git a/assets/mascot/dash-editorial-build.png b/assets/mascot/dash-editorial-build.png
new file mode 100644
index 0000000..cc54b11
Binary files /dev/null and b/assets/mascot/dash-editorial-build.png differ
diff --git a/assets/mascot/dash-editorial-guide.png b/assets/mascot/dash-editorial-guide.png
new file mode 100644
index 0000000..1250841
Binary files /dev/null and b/assets/mascot/dash-editorial-guide.png differ
diff --git a/assets/mascot/dash-editorial-hoodie.png b/assets/mascot/dash-editorial-hoodie.png
new file mode 100644
index 0000000..c5659b6
Binary files /dev/null and b/assets/mascot/dash-editorial-hoodie.png differ
diff --git a/assets/mascot/dash-editorial-reading.png b/assets/mascot/dash-editorial-reading.png
new file mode 100644
index 0000000..6d6eb24
Binary files /dev/null and b/assets/mascot/dash-editorial-reading.png differ
diff --git a/assets/styles/brand.css b/assets/styles/brand.css
new file mode 100644
index 0000000..f9b581c
--- /dev/null
+++ b/assets/styles/brand.css
@@ -0,0 +1,121 @@
+/* Original PHP Fast Forward composition styles. No external imports or fonts.
+ * --color-* tokens are consumed when available; fallbacks mirror DESIGN.md.
+ * Components are scoped to ff-brand-* classes. These are HTML applications,
+ * not new logo files or a replacement for a native lettering master.
+ */
+.ff-brand-page {
+ --ff-brand-primary: var(--color-primary, #6d28d9);
+ --ff-brand-primary-hover: var(--color-primary-hover, #5b21b6);
+ --ff-brand-cyan: var(--color-cyan, #22d3ee);
+ --ff-brand-navy: var(--color-navy, #050b20);
+ --ff-brand-ink: var(--color-ink, #142033);
+ --ff-brand-muted: var(--color-muted, #475569);
+ --ff-brand-paper: var(--color-neutral, #f6f8ff);
+ --ff-brand-white: var(--color-white, #ffffff);
+ --ff-brand-border: var(--color-border, #cbd5e1);
+ --ff-brand-radius: var(--radius-md, 12px);
+ --ff-brand-space: var(--spacing-lg, 24px);
+ margin: 0;
+ background: var(--ff-brand-paper);
+ color: var(--ff-brand-ink);
+ font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
+ line-height: 1.6;
+ color-scheme: light;
+ overflow-wrap: break-word;
+}
+.ff-brand-page *, .ff-brand-page *::before, .ff-brand-page *::after { box-sizing: border-box; }
+.ff-brand-page a { color: var(--ff-brand-primary); text-underline-offset: .2em; }
+.ff-brand-page a:hover { text-decoration-thickness: 2px; }
+.ff-brand-page :is(a, [tabindex]):focus-visible { outline: 2px solid var(--ff-brand-primary); outline-offset: 3px; }
+.ff-brand-page img { display: block; max-width: 100%; }
+.ff-brand-page :is(h1, h2, h3, p, figure) { margin-top: 0; }
+.ff-brand-page :is(h1, h2, h3) { line-height: 1.2; text-wrap: balance; }
+.ff-brand-page section { scroll-margin-top: 24px; }
+.ff-brand-wrap { width: min(1200px, calc(100% - 48px)); margin-inline: auto; }
+.ff-brand-skip { position: fixed; inset: 16px auto auto 16px; padding: 12px 16px; background: white; z-index: 10; transform: translateY(-180%); }
+.ff-brand-skip:focus { transform: translateY(0); }
+.ff-brand-header { padding: 24px 0; background: var(--ff-brand-navy); color: var(--ff-brand-white); }
+.ff-brand-header-inner { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 24px; }
+.ff-brand-header a { color: var(--ff-brand-white); }
+.ff-brand-header :focus-visible { outline-color: var(--ff-brand-cyan); }
+.ff-brand-header-title { margin: 0; font-size: 1rem; font-weight: 750; letter-spacing: -.015em; }
+.ff-brand-header-nav { display: flex; flex-wrap: wrap; gap: 8px 24px; font-size: .875rem; }
+.ff-brand-header-nav a { display: inline-flex; align-items: center; min-height: 44px; }
+.ff-brand-main { padding-block: 48px; }
+.ff-brand-intro { max-width: 760px; margin-bottom: 32px; }
+.ff-brand-eyebrow { margin-bottom: 12px; color: var(--ff-brand-primary); font-size: .75rem; font-weight: 750; letter-spacing: .08em; text-transform: uppercase; }
+.ff-brand-title { margin-bottom: 16px; font-size: clamp(2rem, 4vw, 3rem); font-weight: 750; letter-spacing: -.03em; line-height: 1.1; }
+.ff-brand-intro p:last-child { margin-bottom: 0; color: var(--ff-brand-muted); font-size: 1.0625rem; }
+.ff-brand-jump-nav { display: flex; flex-wrap: wrap; gap: 8px; padding-bottom: 24px; margin-bottom: 40px; border-bottom: 1px solid var(--ff-brand-border); }
+.ff-brand-jump-nav a { display: inline-flex; align-items: center; min-height: 44px; padding: 8px 16px; border: 1px solid var(--ff-brand-primary); border-radius: 6px; background: var(--ff-brand-white); font-size: .875rem; font-weight: 650; text-decoration: none; }
+.ff-brand-jump-nav a:hover { background: var(--ff-brand-primary); color: var(--ff-brand-white); }
+.ff-brand-section + .ff-brand-section { margin-top: 48px; }
+.ff-brand-section-head { display: flex; flex-wrap: wrap; align-items: baseline; justify-content: space-between; gap: 12px 24px; margin-bottom: 20px; }
+.ff-brand-section-head h2 { margin: 0; font-size: 1.625rem; font-weight: 700; letter-spacing: -.02em; }
+.ff-brand-section-head p { max-width: 560px; margin: 0; color: var(--ff-brand-muted); font-size: .875rem; }
+.ff-brand-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 24px; }
+.ff-brand-example { margin: 0; min-width: 0; border: 1px solid var(--ff-brand-border); border-radius: var(--ff-brand-radius); background: var(--ff-brand-white); }
+.ff-brand-canvas { --ff-brand-canvas-ink: var(--ff-brand-ink); --ff-brand-canvas-muted: var(--ff-brand-muted); display: grid; place-items: center; min-height: 300px; padding: 24px; border-radius: var(--ff-brand-radius) var(--ff-brand-radius) 0 0; background: var(--ff-brand-white); color: var(--ff-brand-canvas-ink); }
+.ff-brand-canvas--navy { --ff-brand-canvas-ink: var(--ff-brand-white); --ff-brand-canvas-muted: var(--ff-brand-border); background: var(--ff-brand-navy); }
+.ff-brand-caption { padding: 16px 24px 20px; border-top: 1px solid var(--ff-brand-border); color: var(--ff-brand-muted); font-size: .8125rem; }
+.ff-brand-caption strong { display: block; margin-bottom: 4px; color: var(--ff-brand-ink); font-size: .875rem; }
+.ff-brand-lockup { display: flex; align-items: center; justify-content: center; gap: 16px; max-width: 100%; color: var(--ff-brand-canvas-ink, var(--ff-brand-ink)); }
+.ff-brand-identity { display: flex; align-items: center; gap: 8px; min-width: 0; }
+.ff-brand-symbol { --ff-brand-mark-height: 48px; display: grid; place-items: center; flex: 0 0 auto; padding: calc(var(--ff-brand-mark-height) * .25); }
+.ff-brand-symbol img { width: calc(var(--ff-brand-mark-height) * 1.5); height: var(--ff-brand-mark-height); object-fit: contain; }
+.ff-brand-name { display: block; min-width: 0; font-size: clamp(1.375rem, 2.2vw, 1.875rem); font-weight: 750; letter-spacing: -.035em; line-height: 1.1; }
+.ff-brand-name small { display: block; margin-bottom: 6px; font-size: .75rem; font-weight: 650; letter-spacing: .08em; }
+.ff-brand-dash { width: 176px; height: auto; flex: 0 1 176px; object-fit: contain; }
+.ff-brand-lockup--with-dash { gap: 20px; width: 100%; }
+.ff-brand-lockup--with-dash .ff-brand-name { font-size: 1.5rem; }
+.ff-brand-lockup--editorial .ff-brand-dash { width: 160px; flex-basis: 160px; }
+.ff-brand-source { display: flex; align-items: center; gap: 32px; margin: 24px 0 0; padding: 24px; border: 1px solid var(--ff-brand-border); border-radius: var(--ff-brand-radius); background: var(--ff-brand-white); }
+.ff-brand-source img { width: 340px; height: auto; }
+.ff-brand-source figcaption { max-width: 48ch; color: var(--ff-brand-muted); font-size: .8125rem; }
+.ff-brand-source strong { display: block; color: var(--ff-brand-ink); margin-bottom: 4px; }
+.ff-brand-avatar { width: 256px; aspect-ratio: 1; display: grid; grid-template-rows: minmax(0, 1fr) 32px; gap: 8px; padding: 16px; border: 1px solid var(--ff-brand-canvas-muted); border-radius: 20px; color: var(--ff-brand-canvas-ink); background: inherit; }
+.ff-brand-avatar-portrait { display: grid; place-items: center; min-height: 0; }
+.ff-brand-avatar-dash { width: 100%; height: 100%; object-fit: contain; min-height: 0; }
+.ff-brand-avatar-signature { display: flex; align-items: center; justify-content: space-between; gap: 16px; padding-inline: 8px; font-size: .75rem; font-weight: 700; }
+.ff-brand-avatar-mark { width: 36px; height: 24px; object-fit: contain; }
+.ff-brand-rules { display: grid; grid-template-columns: 1fr 1fr; gap: 32px; margin-top: 40px; padding-top: 32px; border-top: 1px solid var(--ff-brand-border); }
+.ff-brand-rules h2 { margin-bottom: 12px; font-size: 1.25rem; }
+.ff-brand-rules p { margin-bottom: 16px; color: var(--ff-brand-muted); font-size: .875rem; }
+.ff-brand-rules ul { margin: 0; padding-left: 20px; color: var(--ff-brand-muted); font-size: .875rem; }
+.ff-brand-rules li + li { margin-top: 8px; }
+.ff-brand-footer { padding: 24px 0 40px; border-top: 1px solid var(--ff-brand-border); }
+.ff-brand-footer-inner { display: flex; flex-wrap: wrap; justify-content: space-between; gap: 16px 24px; color: var(--ff-brand-muted); font-size: .8125rem; }
+.ff-brand-footer a { display: inline-flex; align-items: center; min-height: 44px; }
+@media (max-width: 1060px) {
+ .ff-brand-lockup--with-dash { flex-direction: column; gap: 20px; }
+ .ff-brand-lockup--with-dash .ff-brand-dash { flex: 0 0 auto; width: 176px; }
+}
+@media (max-width: 720px) {
+ .ff-brand-wrap { width: calc(100% - 32px); }
+ .ff-brand-main { padding-block: 32px; }
+ .ff-brand-grid, .ff-brand-rules { grid-template-columns: 1fr; }
+ .ff-brand-canvas { min-height: 280px; padding: 24px 16px; }
+ .ff-brand-identity { gap: 4px; }
+ .ff-brand-lockup--with-dash .ff-brand-name { font-size: 1.375rem; }
+ .ff-brand-source { align-items: start; flex-direction: column; gap: 20px; padding: 20px; }
+ .ff-brand-source img { width: min(340px, 100%); }
+ .ff-brand-avatar { width: min(256px, 100%); }
+}
+@media (prefers-reduced-motion: reduce) {
+ .ff-brand-page *, .ff-brand-page *::before, .ff-brand-page *::after { scroll-behavior: auto; animation: none; transition: none; }
+}
+
+/* Selected fox signature: shared vector-master applications. */
+ .ff-logo-main {display:grid;place-items:center;background:#fff;padding:48px 32px;min-height:260px;border:1px solid var(--color-border,#cbd5e1);border-radius:12px}
+ .ff-logo-main img {width:min(780px,100%);height:auto}
+ .ff-logo-variants {display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:24px}
+ .ff-logo-surface {display:grid;place-items:center;min-height:200px;padding:36px 24px;background:#fff;border-radius:12px 12px 0 0}
+ .ff-logo-surface img {display:block;width:100%;height:auto;max-height:180px}
+ .ff-logo-surface--navy {background:#050b20}
+ .ff-logo-symbols {display:flex;align-items:center;justify-content:space-around;gap:24px;min-height:200px;padding:24px;background:#fff;border-radius:12px}
+ .ff-logo-symbols img {width:var(--size);height:var(--size)}
+ .ff-logo-application {display:block;width:100%;height:auto;border-radius:12px}
+ .ff-logo-rule-list {padding-left:24px;line-height:1.7}
+ .ff-logo-downloads {display:flex;flex-wrap:wrap;gap:8px 24px;margin-block:20px}
+ .ff-logo-downloads a {font-weight:650}
+ @media(max-width:720px){.ff-logo-variants{grid-template-columns:1fr}.ff-logo-main{padding:24px 16px;min-height:180px}.ff-logo-symbols{gap:12px}.ff-logo-symbols img{max-width:25%}}
diff --git a/assets/styles/documentation.css b/assets/styles/documentation.css
new file mode 100644
index 0000000..b28b328
--- /dev/null
+++ b/assets/styles/documentation.css
@@ -0,0 +1,349 @@
+/* PHP Fast Forward documentation pattern.
+ * Authored here; no external styles, fonts, or runtime dependencies.
+ * Browser adapter below mirrors assets/tokens/theme.css. That export uses
+ * Tailwind's @theme directive, which needs processing before browser use.
+ * The export helper preserves font stacks and complete typography metadata.
+ */
+@layer ff-token-adapter, ff-documentation;
+
+@layer ff-token-adapter {
+ :root {
+ --color-primary: #6d28d9;
+ --color-primary-hover: #5b21b6;
+ --color-blue: #2563eb;
+ --color-cyan: #22d3ee;
+ --color-navy: #050b20;
+ --color-ink: #142033;
+ --color-muted: #475569;
+ --color-neutral: #f6f8ff;
+ --color-white: #ffffff;
+ --color-border: #cbd5e1;
+ --color-fox-orange: #f28d1a;
+ --color-fox-cream: #fff3df;
+ --color-fox-outline: #592d19;
+ --font-h1: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
+ --font-h2: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
+ --font-body-md: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
+ --font-label: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
+ --font-code: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
+ --text-h1: 3rem;
+ --text-h2: 2rem;
+ --text-body-md: 1rem;
+ --text-label: 0.875rem;
+ --text-code: 0.875rem;
+ --leading-h1: 1.1;
+ --leading-h2: 1.2;
+ --leading-body-md: 1.6;
+ --leading-label: 1.4;
+ --leading-code: 1.6;
+ --tracking-h1: -0.03em;
+ --tracking-h2: 0px;
+ --tracking-body-md: 0px;
+ --tracking-label: 0px;
+ --tracking-code: 0px;
+ --font-weight-h1: 750;
+ --font-weight-h2: 700;
+ --font-weight-body-md: 400;
+ --font-weight-label: 600;
+ --font-weight-code: 400;
+ --radius-sm: 6px;
+ --radius-md: 12px;
+ --radius-lg: 20px;
+ --radius-pill: 999px;
+ --spacing-xs: 4px;
+ --spacing-sm: 8px;
+ --spacing-md: 16px;
+ --spacing-lg: 24px;
+ --spacing-xl: 32px;
+ --spacing-2xl: 48px;
+ --spacing-3xl: 64px;
+ --text-h1--line-height: 1.1;
+ --text-h2--line-height: 1.2;
+ --text-body-md--line-height: 1.6;
+ --text-label--line-height: 1.4;
+ --text-code--line-height: 1.6;
+ --text-h1--letter-spacing: -0.03em;
+ --text-h2--letter-spacing: 0px;
+ --text-body-md--letter-spacing: 0px;
+ --text-label--letter-spacing: 0px;
+ --text-code--letter-spacing: 0px;
+ --text-h1--font-weight: 750;
+ --text-h2--font-weight: 700;
+ --text-body-md--font-weight: 400;
+ --text-label--font-weight: 600;
+ --text-code--font-weight: 400;
+ }
+}
+
+@layer ff-documentation {
+ .ff-docs {
+ --ff-docs-paper: var(--color-neutral);
+ --ff-docs-panel: var(--color-white);
+ --ff-docs-text: var(--color-ink);
+ --ff-docs-muted: var(--color-muted);
+ --ff-docs-line: var(--color-border);
+ --ff-docs-link: var(--color-primary);
+ --ff-docs-focus: var(--color-primary);
+ color-scheme: light;
+ margin: 0;
+ padding: var(--spacing-xl) var(--spacing-lg) var(--spacing-2xl);
+ background: var(--color-navy);
+ color: var(--ff-docs-text);
+ font-family: var(--font-body-md);
+ font-size: var(--text-body-md);
+ line-height: var(--text-body-md--line-height);
+ overflow-wrap: break-word;
+ }
+
+ .ff-docs[data-reading-theme="navy"] {
+ --ff-docs-paper: var(--color-navy);
+ --ff-docs-panel: var(--color-navy);
+ --ff-docs-text: var(--color-white);
+ --ff-docs-muted: var(--color-border);
+ --ff-docs-line: var(--color-muted);
+ --ff-docs-link: var(--color-cyan);
+ --ff-docs-focus: var(--color-cyan);
+ color-scheme: dark;
+ }
+
+ .ff-docs *, .ff-docs *::before, .ff-docs *::after { box-sizing: border-box; }
+ .ff-docs [hidden] { display: none !important; }
+ .ff-docs img { display: block; max-width: 100%; height: auto; }
+ .ff-docs a { color: var(--ff-docs-link); text-underline-offset: .2em; }
+ .ff-docs a:hover { text-decoration-thickness: 2px; }
+ .ff-docs button { font: inherit; cursor: pointer; }
+ .ff-docs :is(a, button, summary, [tabindex]):focus-visible {
+ outline: 2px solid var(--ff-docs-focus);
+ outline-offset: 3px;
+ }
+ .ff-docs :is(h1, h2, h3, p) { margin-top: 0; }
+ .ff-docs :is(h2, h3, section) { scroll-margin-top: var(--spacing-xl); }
+ .ff-docs :is(h1, h2, h3) { line-height: var(--text-h2--line-height); text-wrap: balance; }
+ .ff-docs h1 { line-height: var(--text-h1--line-height); }
+ .ff-docs code { font-family: var(--font-code); font-size: var(--text-code); }
+ .ff-docs .ff-docs-skip {
+ position: fixed;
+ inset: var(--spacing-md) auto auto var(--spacing-md);
+ z-index: 10;
+ padding: 12px var(--spacing-md);
+ border-radius: var(--radius-sm);
+ background: var(--color-white);
+ color: var(--color-primary);
+ transform: translateY(-180%);
+ }
+ .ff-docs .ff-docs-skip:focus { transform: translateY(0); }
+ .ff-docs .ff-docs-topbar {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ gap: var(--spacing-md);
+ max-width: 1200px;
+ margin: 0 auto var(--spacing-lg);
+ color: var(--color-white);
+ }
+ .ff-docs .ff-docs-topbar a { color: var(--color-border); font-size: var(--text-label); }
+ .ff-docs .ff-docs-topbar :focus-visible { outline-color: var(--color-cyan); }
+ .ff-docs .ff-docs-topbar-label { margin: 0; font-size: var(--text-label); }
+ .ff-docs .ff-docs-theme {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ width: 44px;
+ min-height: 44px;
+ padding: 8px;
+ border: 1px solid var(--color-cyan);
+ border-radius: var(--radius-sm);
+ background: transparent;
+ color: var(--color-white);
+ font-size: var(--text-label);
+ }
+ .ff-docs .ff-docs-theme:hover { background: var(--color-primary-hover); }
+ .ff-docs .ff-docs-theme-sun { display: none; }
+ .ff-docs[data-reading-theme="navy"] .ff-docs-theme-sun { display: block; }
+ .ff-docs[data-reading-theme="navy"] .ff-docs-theme-moon { display: none; }
+ .ff-docs button[hidden] { display: none; }
+ .ff-docs .ff-docs-shell {
+ display: grid;
+ grid-template-columns: 248px minmax(0, 1fr);
+ max-width: 1200px;
+ min-height: calc(100vh - 144px);
+ margin: auto;
+ border: 1px solid var(--color-muted);
+ border-radius: var(--radius-lg);
+ background: var(--ff-docs-paper);
+ overflow: clip;
+ }
+ .ff-docs .ff-docs-rail {
+ padding: var(--spacing-lg);
+ background: var(--color-navy);
+ color: var(--color-white);
+ --ff-docs-focus: var(--color-cyan);
+ }
+ .ff-docs .ff-docs-rail-inner { position: sticky; top: var(--spacing-lg); }
+ .ff-docs .ff-docs-brand {
+ display: flex;
+ align-items: center;
+ gap: var(--spacing-sm);
+ margin-bottom: var(--spacing-xl);
+ color: var(--color-white);
+ text-decoration: none;
+ font-size: .9375rem;
+ font-weight: 750;
+ line-height: 1.2;
+ }
+ .ff-docs .ff-docs-brand img { width: 96px; height: 48px; object-fit: contain; }
+ .ff-docs .ff-docs-brand small { display: block; margin-bottom: var(--spacing-xs); font-size: .75rem; color: var(--color-border); }
+ .ff-docs .ff-docs-navigation summary {
+ display: flex;
+ align-items: center;
+ justify-content: space-between;
+ min-height: 44px;
+ margin-bottom: var(--spacing-md);
+ border-bottom: 1px solid var(--color-muted);
+ color: var(--color-border);
+ font-size: var(--text-label);
+ font-weight: 600;
+ cursor: pointer;
+ list-style: none;
+ }
+ .ff-docs .ff-docs-navigation summary::-webkit-details-marker { display: none; }
+ .ff-docs .ff-docs-navigation summary::after { content: "+"; font-size: 1.2rem; }
+ .ff-docs .ff-docs-navigation[open] summary::after { content: "−"; }
+ .ff-docs .ff-docs-nav-group + .ff-docs-nav-group { margin-top: var(--spacing-lg); }
+ .ff-docs .ff-docs-nav-label { margin: 0 0 var(--spacing-sm); color: var(--color-border); font-size: .75rem; font-weight: 650; }
+ .ff-docs .ff-docs-navigation ul { list-style: none; margin: 0; padding: 0; }
+ .ff-docs .ff-docs-navigation li + li { margin-top: var(--spacing-xs); }
+ .ff-docs .ff-docs-nav-link {
+ display: flex;
+ align-items: center;
+ min-height: 44px;
+ padding: 10px 12px;
+ border-radius: var(--radius-sm);
+ color: var(--color-white);
+ font-size: var(--text-label);
+ text-decoration: none;
+ }
+ .ff-docs .ff-docs-nav-link:hover { background: var(--color-primary-hover); }
+ .ff-docs .ff-docs-nav-link[aria-current="page"] { background: var(--color-primary); font-weight: 700; }
+ .ff-docs .ff-docs-rail-note { margin: var(--spacing-2xl) 0 0; padding-top: var(--spacing-lg); border-top: 1px solid var(--color-muted); color: var(--color-border); font-size: .8125rem; }
+ .ff-docs .ff-docs-content { min-width: 0; padding: var(--spacing-xl) var(--spacing-xl) var(--spacing-2xl); }
+ .ff-docs .ff-docs-breadcrumb { margin-bottom: var(--spacing-xl); font-size: .8125rem; color: var(--ff-docs-muted); }
+ .ff-docs .ff-docs-breadcrumb ol { display: flex; flex-wrap: wrap; gap: var(--spacing-sm); list-style: none; margin: 0; padding: 0; }
+ .ff-docs .ff-docs-breadcrumb li + li::before { content: "/"; margin-right: var(--spacing-sm); color: var(--ff-docs-muted); }
+ .ff-docs .ff-docs-breadcrumb a { color: var(--ff-docs-muted); }
+ .ff-docs .ff-docs-reading-grid { display: grid; grid-template-columns: minmax(0, 1fr) 188px; gap: var(--spacing-xl); align-items: start; }
+ .ff-docs .ff-docs-article { min-width: 0; max-width: 70ch; }
+ .ff-docs .ff-docs-kicker { margin: 0 0 var(--spacing-md); color: var(--ff-docs-link); font-size: .75rem; font-weight: 700; letter-spacing: .08em; text-transform: uppercase; }
+ .ff-docs .ff-docs-article h1 { margin-bottom: var(--spacing-md); font-family: var(--font-h1); font-size: var(--text-h1); font-weight: var(--font-weight-h1); letter-spacing: var(--tracking-h1); line-height: 1.1; }
+ .ff-docs .ff-docs-lead { margin-bottom: var(--spacing-lg); color: var(--ff-docs-muted); font-size: 1.0625rem; }
+ .ff-docs .ff-docs-page-meta { display: flex; flex-wrap: wrap; gap: var(--spacing-sm) var(--spacing-lg); margin: 0 0 var(--spacing-xl); padding: 0 0 var(--spacing-lg); border-bottom: 1px solid var(--ff-docs-line); color: var(--ff-docs-muted); font-size: .75rem; }
+ .ff-docs .ff-docs-page-meta span { display: inline-flex; align-items: center; gap: var(--spacing-xs); }
+ .ff-docs .ff-docs-page-meta strong { color: var(--ff-docs-text); }
+ .ff-docs .ff-docs-article section + section { margin-top: var(--spacing-xl); }
+ .ff-docs .ff-docs-article h2 { margin-bottom: var(--spacing-md); font-family: var(--font-h2); font-size: 1.4rem; font-weight: var(--font-weight-h2); letter-spacing: -.02em; }
+ .ff-docs .ff-docs-article h3 { margin-bottom: var(--spacing-sm); font-size: 1rem; }
+ .ff-docs .ff-docs-article p { margin-bottom: var(--spacing-md); }
+ .ff-docs .ff-docs-article :is(ul, ol) { padding-left: var(--spacing-lg); margin: 0 0 var(--spacing-lg); }
+ .ff-docs .ff-docs-article li + li { margin-top: var(--spacing-sm); }
+ .ff-docs .ff-docs-article :not(pre) > code { border: 1px solid var(--ff-docs-line); border-radius: 4px; padding: 1px 4px; background: var(--ff-docs-panel); font-size: .8125rem; }
+ .ff-docs .ff-docs-code {
+ margin: var(--spacing-lg) 0;
+ border: 1px solid var(--color-muted);
+ border-radius: var(--radius-md);
+ background: var(--color-navy);
+ color: var(--color-white);
+ --ff-docs-focus: var(--color-cyan);
+ }
+ .ff-docs .ff-docs-code-header { display: grid; grid-template-columns: 44px minmax(0, 1fr) 44px; align-items: center; gap: var(--spacing-sm); min-height: 52px; padding: var(--spacing-xs) 8px; border-bottom: 1px solid var(--color-muted); font-family: var(--font-code); font-size: .75rem; color: var(--color-border); }
+ .ff-docs .ff-docs-window-dots { display: flex; justify-content: center; gap: 5px; }
+ .ff-docs .ff-docs-window-dots i { width: 8px; height: 8px; border-radius: 50%; background: var(--color-muted); }
+ .ff-docs .ff-docs-code-title { display: flex; align-items: center; justify-content: center; gap: 6px; min-width: 0; text-align: center; }
+ .ff-docs .ff-docs-code-title svg { flex-shrink: 0; }
+ .ff-docs .ff-docs-copy { display: inline-flex; align-items: center; justify-content: center; height: 44px; width: 44px; padding: 8px; border: 1px solid transparent; border-radius: var(--radius-sm); background: transparent; color: var(--color-border); }
+ .ff-docs .ff-docs-copy-check { display: none; }
+ .ff-docs .ff-docs-copy[data-copied] .ff-docs-copy-icon { display: none; }
+ .ff-docs .ff-docs-copy[data-copied] .ff-docs-copy-check { display: block; color: var(--color-cyan); }
+ .ff-docs .ff-docs-copy:hover { background: var(--color-primary-hover); }
+ .ff-docs .ff-docs-code pre { margin: 0; max-width: 100%; padding: var(--spacing-md); overflow-x: auto; font-family: var(--font-code); line-height: 1.7; tab-size: 4; }
+ .ff-docs .ff-docs-code pre code { display: block; white-space: pre; overflow-wrap: normal; }
+ .ff-docs .ff-docs-copy-status { display: block; padding: 0 var(--spacing-md); font-size: .75rem; color: var(--color-cyan); }
+ .ff-docs .ff-docs-copy-status:not(:empty) { padding-bottom: var(--spacing-md); }
+ .ff-docs .ff-docs-code-keyword { color: var(--color-cyan); }
+ .ff-docs .ff-docs-code-string { color: var(--color-fox-cream); }
+ .ff-docs .ff-docs-code-comment { color: var(--color-border); }
+ .ff-docs .ff-docs-callout { margin: var(--spacing-lg) 0; padding: var(--spacing-md) var(--spacing-lg); border: 1px solid var(--ff-docs-line); border-radius: var(--radius-md); background: var(--ff-docs-panel); }
+ .ff-docs .ff-docs-callout strong { display: block; margin-bottom: var(--spacing-xs); font-size: var(--text-label); }
+ .ff-docs .ff-docs-callout p { margin: 0; color: var(--ff-docs-muted); font-size: var(--text-label); }
+ .ff-docs .ff-docs-callout[data-kind="important"] { border-color: var(--ff-docs-focus); }
+ .ff-docs .ff-docs-side { min-width: 0; }
+ .ff-docs .ff-docs-side-inner { position: sticky; top: var(--spacing-lg); }
+ .ff-docs .ff-docs-toc { margin-bottom: var(--spacing-xl); }
+ .ff-docs .ff-docs-toc h2 { margin: 0 0 var(--spacing-sm); font-size: .8125rem; font-weight: 700; }
+ .ff-docs .ff-docs-toc ol { list-style: none; margin: 0; padding: 0; }
+ .ff-docs .ff-docs-toc a { display: flex; align-items: center; min-height: 44px; padding: var(--spacing-sm) 0; color: var(--ff-docs-muted); font-size: .8125rem; text-decoration: none; }
+ .ff-docs .ff-docs-toc a:hover, .ff-docs .ff-docs-toc a[aria-current="location"] { color: var(--ff-docs-link); text-decoration: underline; }
+ .ff-docs .ff-docs-companion { margin: 0; padding-top: var(--spacing-lg); border-top: 1px solid var(--ff-docs-line); }
+ .ff-docs .ff-docs-companion img { width: 188px; margin: 0 auto var(--spacing-md); }
+ .ff-docs .ff-docs-companion figcaption { font-size: .8125rem; color: var(--ff-docs-muted); }
+ .ff-docs .ff-docs-companion strong { display: block; color: var(--ff-docs-text); margin-bottom: var(--spacing-xs); }
+ .ff-docs .ff-docs-package { display: block; padding: var(--spacing-lg); border: 1px solid var(--ff-docs-line); border-radius: var(--radius-md); background: var(--ff-docs-panel); }
+ .ff-docs .ff-docs-package-name { display: block; margin-bottom: var(--spacing-sm); color: var(--ff-docs-text); font-family: var(--font-code); font-size: var(--text-code); font-weight: 700; overflow-wrap: anywhere; }
+ .ff-docs .ff-docs-package p { margin-bottom: var(--spacing-md); color: var(--ff-docs-muted); font-size: var(--text-label); }
+ .ff-docs .ff-docs-package a { display: inline-flex; align-items: center; min-height: 44px; font-size: var(--text-label); font-weight: 650; }
+ .ff-docs .ff-docs-page-footer { display: flex; flex-wrap: wrap; gap: var(--spacing-md); justify-content: space-between; margin-top: var(--spacing-xl); padding-top: var(--spacing-lg); border-top: 1px solid var(--ff-docs-line); color: var(--ff-docs-muted); font-size: .75rem; }
+ .ff-docs .ff-docs-page-footer a { display: inline-flex; align-items: center; min-height: 44px; }
+
+ @media (max-width: 1080px) {
+ .ff-docs .ff-docs-reading-grid { grid-template-columns: minmax(0, 1fr); }
+ .ff-docs .ff-docs-side { margin-top: var(--spacing-xl); }
+ .ff-docs .ff-docs-side-inner { position: static; display: grid; grid-template-columns: 1fr 1fr; gap: var(--spacing-xl); }
+ .ff-docs .ff-docs-companion { padding: 0; border: 0; }
+ .ff-docs .ff-docs-companion img { width: 176px; margin: 0 auto var(--spacing-md); }
+ }
+ @media (max-width: 760px) {
+ .ff-docs { padding: var(--spacing-md) var(--spacing-md) var(--spacing-xl); }
+ .ff-docs .ff-docs-topbar { margin-bottom: var(--spacing-md); }
+ .ff-docs .ff-docs-topbar-label { font-size: .75rem; }
+ .ff-docs .ff-docs-shell { grid-template-columns: minmax(0, 1fr); }
+ .ff-docs .ff-docs-rail { padding: var(--spacing-md); }
+ .ff-docs .ff-docs-rail-inner { position: static; }
+ .ff-docs .ff-docs-brand { margin-bottom: var(--spacing-md); }
+ .ff-docs .ff-docs-navigation summary { margin-bottom: 0; border-top: 1px solid var(--color-muted); border-bottom: 0; }
+ .ff-docs .ff-docs-navigation[open] summary { margin-bottom: var(--spacing-md); }
+ .ff-docs .ff-docs-rail-note { margin-top: var(--spacing-lg); padding-top: var(--spacing-md); }
+ .ff-docs .ff-docs-content { padding: var(--spacing-lg) var(--spacing-md) var(--spacing-xl); }
+ .ff-docs .ff-docs-breadcrumb { margin-bottom: var(--spacing-lg); }
+ .ff-docs .ff-docs-article h1 { font-size: 2rem; }
+ .ff-docs .ff-docs-lead { font-size: 1rem; }
+ .ff-docs .ff-docs-side-inner { display: block; }
+ .ff-docs .ff-docs-companion { padding-top: var(--spacing-lg); border-top: 1px solid var(--ff-docs-line); }
+ .ff-docs .ff-docs-callout { padding: var(--spacing-md); }
+ }
+ @media (prefers-reduced-motion: reduce) {
+ .ff-docs *, .ff-docs *::before, .ff-docs *::after { scroll-behavior: auto; animation: none; transition: none; }
+ }
+ @media print {
+ .ff-docs, .ff-docs[data-reading-theme="navy"] {
+ --ff-docs-paper: var(--color-white);
+ --ff-docs-panel: var(--color-white);
+ --ff-docs-text: var(--color-ink);
+ --ff-docs-muted: var(--color-muted);
+ --ff-docs-line: var(--color-border);
+ --ff-docs-link: var(--color-primary);
+ background: white;
+ padding: 0;
+ color: var(--color-ink);
+ }
+ .ff-docs .ff-docs-shell { display: block; border: 0; }
+ .ff-docs :is(.ff-docs-topbar, .ff-docs-rail, .ff-docs-side, .ff-docs-copy, .ff-docs-skip) { display: none; }
+ .ff-docs .ff-docs-content { padding: 0; }
+ .ff-docs .ff-docs-code { background: white; color: var(--color-ink); }
+ .ff-docs :is(.ff-docs-code-header, .ff-docs-code-keyword, .ff-docs-code-string, .ff-docs-code-comment) { color: inherit; }
+ .ff-docs .ff-docs-code pre { white-space: pre-wrap; overflow: visible; }
+ .ff-docs .ff-docs-code pre code { white-space: pre-wrap; }
+ .ff-docs .ff-docs-article { max-width: none; }
+ }
+}
+
+.ff-docs-brand.ff-docs-brand--signature img { width:100%; max-width:200px; height:auto; }
+.ff-docs-brand.ff-docs-brand--signature { display:block; }
diff --git a/assets/styles/navigation.css b/assets/styles/navigation.css
new file mode 100644
index 0000000..587b549
--- /dev/null
+++ b/assets/styles/navigation.css
@@ -0,0 +1,82 @@
+/* Shared local brand-library navigation. Token fallbacks follow DESIGN.md.
+ * No JavaScript, external fonts, imports, or requests are required.
+ */
+.ff-kit-header {
+ --ff-kit-navy: var(--color-navy, #050b20);
+ --ff-kit-white: var(--color-white, #ffffff);
+ --ff-kit-line: var(--color-muted, #475569);
+ --ff-kit-primary: var(--color-primary, #6d28d9);
+ --ff-kit-primary-hover: var(--color-primary-hover, #5b21b6);
+ --ff-kit-focus: var(--color-cyan, #22d3ee);
+ padding: 16px 0;
+ border-bottom: 1px solid var(--ff-kit-line);
+ background: var(--ff-kit-navy);
+ color: var(--ff-kit-white);
+ font-family: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
+}
+.ff-kit-header *, .ff-kit-header *::before, .ff-kit-header *::after { box-sizing: border-box; }
+.ff-kit-header .ff-kit-header-inner {
+ display: flex;
+ flex-wrap: wrap;
+ align-items: center;
+ justify-content: space-between;
+ gap: 12px 24px;
+ width: min(1200px, calc(100% - 48px));
+ margin-inline: auto;
+}
+.ff-kit-header .ff-kit-brand {
+ display: inline-flex;
+ align-items: center;
+ min-height: 48px;
+ gap: 8px;
+ color: var(--ff-kit-white);
+ font-size: 1rem;
+ font-weight: 750;
+ line-height: 1.2;
+ text-decoration: none;
+}
+.ff-kit-header .ff-kit-brand-symbol { display: inline-flex; flex: 0 0 auto; padding: 8px; }
+.ff-kit-header .ff-kit-brand-symbol img { display: block; width: 48px; height: 32px; object-fit: contain; }
+.ff-kit-header .ff-kit-nav { display: flex; flex-wrap: wrap; align-items: center; gap: 4px; min-width: 0; }
+.ff-kit-header .ff-kit-link {
+ display: inline-flex;
+ align-items: center;
+ justify-content: center;
+ min-height: 44px;
+ padding: 8px 12px;
+ border: 1px solid transparent;
+ border-radius: 6px;
+ color: var(--ff-kit-white);
+ font-size: .8125rem;
+ font-weight: 550;
+ line-height: 1.3;
+ text-decoration: none;
+}
+.ff-kit-header .ff-kit-link:hover { background: var(--ff-kit-primary-hover); }
+.ff-kit-header .ff-kit-link[aria-current="page"] { background: var(--ff-kit-primary); border-color: var(--ff-kit-primary); font-weight: 750; }
+.ff-kit-header :is(.ff-kit-brand, .ff-kit-link, .ff-kit-button):focus-visible { outline: 2px solid var(--ff-kit-focus); outline-offset: 3px; }
+.ff-kit-header .ff-kit-actions { display: flex; align-items: center; flex-wrap: wrap; gap: 8px; }
+.ff-kit-header .ff-kit-button {
+ min-height: 44px;
+ padding: 8px 12px;
+ border: 1px solid var(--ff-kit-focus);
+ border-radius: 6px;
+ background: transparent;
+ color: var(--ff-kit-white);
+ font: inherit;
+ font-size: .8125rem;
+ cursor: pointer;
+}
+.ff-kit-header .ff-kit-button:hover { background: var(--ff-kit-primary-hover); }
+.ff-kit-header [hidden] { display: none !important; }
+.ff-docs > .ff-kit-header { margin-bottom: 24px; padding: 0 0 16px; }
+.ff-docs > .ff-kit-header .ff-kit-header-inner { width: min(1200px, 100%); }
+@media (max-width: 720px) {
+ .ff-kit-header .ff-kit-header-inner { width: calc(100% - 32px); align-items: flex-start; gap: 12px; }
+ .ff-kit-header .ff-kit-nav { width: 100%; }
+ .ff-kit-header .ff-kit-link { justify-content: flex-start; }
+ .ff-docs > .ff-kit-header .ff-kit-header-inner { width: 100%; }
+}
+@media print { .ff-kit-header { display: none; } }
+
+.ff-kit-header .ff-kit-logo { display:block; width:224px; height:auto; max-width:100%; }
diff --git a/assets/tokens/exports.json b/assets/tokens/exports.json
new file mode 100644
index 0000000..166f3cd
--- /dev/null
+++ b/assets/tokens/exports.json
@@ -0,0 +1,25 @@
+{
+ "schema_version": 1,
+ "source": "DESIGN.md",
+ "source_sha256": "ba539bae82386db1e8ff65ad15ff8b52fc13eb1ede4634778295241f73592d63",
+ "generator": "php scripts/export-design.php",
+ "normalization": "scripts/DesignExports.php",
+ "normalization_sha256": "beffa76726c84f0335be8e85f5a8c567ddd3508f916d7a3c0e4b1e3d04c579f7",
+ "outputs": [
+ {
+ "path": "tokens.json",
+ "format": "dtcg",
+ "sha256": "426941e7ae029805fb5454ec0359c9f818233d0c806831653f8b824b3dc972e5"
+ },
+ {
+ "path": "tailwind.theme.json",
+ "format": "json-tailwind",
+ "sha256": "08732a06756125c7d54e1d7280d36cc73c773969aeb162b201a22156bf19d2b7"
+ },
+ {
+ "path": "theme.css",
+ "format": "css-tailwind",
+ "sha256": "3192e1a9d7228300e0be0a23b95df8297439f440df74fac2abd53383c3cea2f2"
+ }
+ ]
+}
diff --git a/assets/tokens/tailwind.theme.json b/assets/tokens/tailwind.theme.json
new file mode 100644
index 0000000..9af4e69
--- /dev/null
+++ b/assets/tokens/tailwind.theme.json
@@ -0,0 +1,115 @@
+{
+ "theme": {
+ "extend": {
+ "colors": {
+ "primary": "#6d28d9",
+ "primary-hover": "#5b21b6",
+ "blue": "#2563eb",
+ "cyan": "#22d3ee",
+ "navy": "#050b20",
+ "ink": "#142033",
+ "muted": "#475569",
+ "neutral": "#f6f8ff",
+ "white": "#ffffff",
+ "border": "#cbd5e1",
+ "fox-orange": "#f28d1a",
+ "fox-cream": "#fff3df",
+ "fox-outline": "#592d19"
+ },
+ "fontFamily": {
+ "h1": [
+ "system-ui",
+ "-apple-system",
+ "BlinkMacSystemFont",
+ "Segoe UI",
+ "sans-serif"
+ ],
+ "h2": [
+ "system-ui",
+ "-apple-system",
+ "BlinkMacSystemFont",
+ "Segoe UI",
+ "sans-serif"
+ ],
+ "body-md": [
+ "system-ui",
+ "-apple-system",
+ "BlinkMacSystemFont",
+ "Segoe UI",
+ "sans-serif"
+ ],
+ "label": [
+ "system-ui",
+ "-apple-system",
+ "BlinkMacSystemFont",
+ "Segoe UI",
+ "sans-serif"
+ ],
+ "code": [
+ "ui-monospace",
+ "SFMono-Regular",
+ "Menlo",
+ "Consolas",
+ "monospace"
+ ]
+ },
+ "fontSize": {
+ "h1": [
+ "3rem",
+ {
+ "lineHeight": "1.1",
+ "letterSpacing": "-0.03em",
+ "fontWeight": "750"
+ }
+ ],
+ "h2": [
+ "2rem",
+ {
+ "lineHeight": "1.2",
+ "letterSpacing": "0px",
+ "fontWeight": "700"
+ }
+ ],
+ "body-md": [
+ "1rem",
+ {
+ "lineHeight": "1.6",
+ "letterSpacing": "0px",
+ "fontWeight": "400"
+ }
+ ],
+ "label": [
+ "0.875rem",
+ {
+ "lineHeight": "1.4",
+ "letterSpacing": "0px",
+ "fontWeight": "600"
+ }
+ ],
+ "code": [
+ "0.875rem",
+ {
+ "lineHeight": "1.6",
+ "letterSpacing": "0px",
+ "fontWeight": "400"
+ }
+ ]
+ },
+ "borderRadius": {
+ "sm": "6px",
+ "md": "12px",
+ "lg": "20px",
+ "pill": "999px"
+ },
+ "spacing": {
+ "xs": "4px",
+ "sm": "8px",
+ "md": "16px",
+ "lg": "24px",
+ "xl": "32px",
+ "2xl": "48px",
+ "3xl": "64px"
+ }
+ }
+ }
+}
diff --git a/assets/tokens/theme.css b/assets/tokens/theme.css
new file mode 100644
index 0000000..6d0a98b
--- /dev/null
+++ b/assets/tokens/theme.css
@@ -0,0 +1,66 @@
+@theme {
+ --color-primary: #6d28d9;
+ --color-primary-hover: #5b21b6;
+ --color-blue: #2563eb;
+ --color-cyan: #22d3ee;
+ --color-navy: #050b20;
+ --color-ink: #142033;
+ --color-muted: #475569;
+ --color-neutral: #f6f8ff;
+ --color-white: #ffffff;
+ --color-border: #cbd5e1;
+ --color-fox-orange: #f28d1a;
+ --color-fox-cream: #fff3df;
+ --color-fox-outline: #592d19;
+ --font-h1: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
+ --font-h2: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
+ --font-body-md: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
+ --font-label: system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
+ --font-code: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
+ --text-h1: 3rem;
+ --text-h2: 2rem;
+ --text-body-md: 1rem;
+ --text-label: 0.875rem;
+ --text-code: 0.875rem;
+ --leading-h1: 1.1;
+ --leading-h2: 1.2;
+ --leading-body-md: 1.6;
+ --leading-label: 1.4;
+ --leading-code: 1.6;
+ --tracking-h1: -0.03em;
+ --tracking-h2: 0px;
+ --tracking-body-md: 0px;
+ --tracking-label: 0px;
+ --tracking-code: 0px;
+ --font-weight-h1: 750;
+ --font-weight-h2: 700;
+ --font-weight-body-md: 400;
+ --font-weight-label: 600;
+ --font-weight-code: 400;
+ --radius-sm: 6px;
+ --radius-md: 12px;
+ --radius-lg: 20px;
+ --radius-pill: 999px;
+ --spacing-xs: 4px;
+ --spacing-sm: 8px;
+ --spacing-md: 16px;
+ --spacing-lg: 24px;
+ --spacing-xl: 32px;
+ --spacing-2xl: 48px;
+ --spacing-3xl: 64px;
+ --text-h1--line-height: 1.1;
+ --text-h2--line-height: 1.2;
+ --text-body-md--line-height: 1.6;
+ --text-label--line-height: 1.4;
+ --text-code--line-height: 1.6;
+ --text-h1--letter-spacing: -0.03em;
+ --text-h2--letter-spacing: 0px;
+ --text-body-md--letter-spacing: 0px;
+ --text-label--letter-spacing: 0px;
+ --text-code--letter-spacing: 0px;
+ --text-h1--font-weight: 750;
+ --text-h2--font-weight: 700;
+ --text-body-md--font-weight: 400;
+ --text-label--font-weight: 600;
+ --text-code--font-weight: 400;
+}
diff --git a/assets/tokens/tokens.json b/assets/tokens/tokens.json
new file mode 100644
index 0000000..4639f03
--- /dev/null
+++ b/assets/tokens/tokens.json
@@ -0,0 +1,333 @@
+{
+ "$description": "Clear PHP foundations, a curious orange fox, and visible forward momentum.",
+ "color": {
+ "$type": "color",
+ "primary": {
+ "$value": {
+ "colorSpace": "srgb",
+ "components": [
+ 0.427,
+ 0.157,
+ 0.851
+ ],
+ "hex": "#6d28d9"
+ }
+ },
+ "primary-hover": {
+ "$value": {
+ "colorSpace": "srgb",
+ "components": [
+ 0.357,
+ 0.129,
+ 0.714
+ ],
+ "hex": "#5b21b6"
+ }
+ },
+ "blue": {
+ "$value": {
+ "colorSpace": "srgb",
+ "components": [
+ 0.145,
+ 0.388,
+ 0.922
+ ],
+ "hex": "#2563eb"
+ }
+ },
+ "cyan": {
+ "$value": {
+ "colorSpace": "srgb",
+ "components": [
+ 0.133,
+ 0.827,
+ 0.933
+ ],
+ "hex": "#22d3ee"
+ }
+ },
+ "navy": {
+ "$value": {
+ "colorSpace": "srgb",
+ "components": [
+ 0.02,
+ 0.043,
+ 0.125
+ ],
+ "hex": "#050b20"
+ }
+ },
+ "ink": {
+ "$value": {
+ "colorSpace": "srgb",
+ "components": [
+ 0.078,
+ 0.125,
+ 0.2
+ ],
+ "hex": "#142033"
+ }
+ },
+ "muted": {
+ "$value": {
+ "colorSpace": "srgb",
+ "components": [
+ 0.278,
+ 0.333,
+ 0.412
+ ],
+ "hex": "#475569"
+ }
+ },
+ "neutral": {
+ "$value": {
+ "colorSpace": "srgb",
+ "components": [
+ 0.965,
+ 0.973,
+ 1
+ ],
+ "hex": "#f6f8ff"
+ }
+ },
+ "white": {
+ "$value": {
+ "colorSpace": "srgb",
+ "components": [
+ 1,
+ 1,
+ 1
+ ],
+ "hex": "#ffffff"
+ }
+ },
+ "border": {
+ "$value": {
+ "colorSpace": "srgb",
+ "components": [
+ 0.796,
+ 0.835,
+ 0.882
+ ],
+ "hex": "#cbd5e1"
+ }
+ },
+ "fox-orange": {
+ "$value": {
+ "colorSpace": "srgb",
+ "components": [
+ 0.949,
+ 0.553,
+ 0.102
+ ],
+ "hex": "#f28d1a"
+ }
+ },
+ "fox-cream": {
+ "$value": {
+ "colorSpace": "srgb",
+ "components": [
+ 1,
+ 0.953,
+ 0.875
+ ],
+ "hex": "#fff3df"
+ }
+ },
+ "fox-outline": {
+ "$value": {
+ "colorSpace": "srgb",
+ "components": [
+ 0.349,
+ 0.176,
+ 0.098
+ ],
+ "hex": "#592d19"
+ }
+ }
+ },
+ "spacing": {
+ "$type": "dimension",
+ "xs": {
+ "$value": {
+ "value": 4,
+ "unit": "px"
+ }
+ },
+ "sm": {
+ "$value": {
+ "value": 8,
+ "unit": "px"
+ }
+ },
+ "md": {
+ "$value": {
+ "value": 16,
+ "unit": "px"
+ }
+ },
+ "lg": {
+ "$value": {
+ "value": 24,
+ "unit": "px"
+ }
+ },
+ "xl": {
+ "$value": {
+ "value": 32,
+ "unit": "px"
+ }
+ },
+ "2xl": {
+ "$value": {
+ "value": 48,
+ "unit": "px"
+ }
+ },
+ "3xl": {
+ "$value": {
+ "value": 64,
+ "unit": "px"
+ }
+ }
+ },
+ "rounded": {
+ "$type": "dimension",
+ "sm": {
+ "$value": {
+ "value": 6,
+ "unit": "px"
+ }
+ },
+ "md": {
+ "$value": {
+ "value": 12,
+ "unit": "px"
+ }
+ },
+ "lg": {
+ "$value": {
+ "value": 20,
+ "unit": "px"
+ }
+ },
+ "pill": {
+ "$value": {
+ "value": 999,
+ "unit": "px"
+ }
+ }
+ },
+ "typography": {
+ "h1": {
+ "$type": "typography",
+ "$value": {
+ "fontFamily": [
+ "system-ui",
+ "-apple-system",
+ "BlinkMacSystemFont",
+ "Segoe UI",
+ "sans-serif"
+ ],
+ "fontSize": {
+ "value": 3,
+ "unit": "rem"
+ },
+ "fontWeight": 750,
+ "letterSpacing": {
+ "value": -0.09,
+ "unit": "rem"
+ },
+ "lineHeight": 1.1
+ }
+ },
+ "h2": {
+ "$type": "typography",
+ "$value": {
+ "fontFamily": [
+ "system-ui",
+ "-apple-system",
+ "BlinkMacSystemFont",
+ "Segoe UI",
+ "sans-serif"
+ ],
+ "fontSize": {
+ "value": 2,
+ "unit": "rem"
+ },
+ "fontWeight": 700,
+ "letterSpacing": {
+ "value": 0,
+ "unit": "px"
+ },
+ "lineHeight": 1.2
+ }
+ },
+ "body-md": {
+ "$type": "typography",
+ "$value": {
+ "fontFamily": [
+ "system-ui",
+ "-apple-system",
+ "BlinkMacSystemFont",
+ "Segoe UI",
+ "sans-serif"
+ ],
+ "fontSize": {
+ "value": 1,
+ "unit": "rem"
+ },
+ "fontWeight": 400,
+ "letterSpacing": {
+ "value": 0,
+ "unit": "px"
+ },
+ "lineHeight": 1.6
+ }
+ },
+ "label": {
+ "$type": "typography",
+ "$value": {
+ "fontFamily": [
+ "system-ui",
+ "-apple-system",
+ "BlinkMacSystemFont",
+ "Segoe UI",
+ "sans-serif"
+ ],
+ "fontSize": {
+ "value": 0.875,
+ "unit": "rem"
+ },
+ "fontWeight": 600,
+ "letterSpacing": {
+ "value": 0,
+ "unit": "px"
+ },
+ "lineHeight": 1.4
+ }
+ },
+ "code": {
+ "$type": "typography",
+ "$value": {
+ "fontFamily": [
+ "ui-monospace",
+ "SFMono-Regular",
+ "Menlo",
+ "Consolas",
+ "monospace"
+ ],
+ "fontSize": {
+ "value": 0.875,
+ "unit": "rem"
+ },
+ "fontWeight": 400,
+ "letterSpacing": {
+ "value": 0,
+ "unit": "px"
+ },
+ "lineHeight": 1.6
+ }
+ }
+ }
+}
diff --git a/composer.json b/composer.json
new file mode 100644
index 0000000..e74210a
--- /dev/null
+++ b/composer.json
@@ -0,0 +1,34 @@
+{
+ "name": "php-fast-forward/brand-kit",
+ "description": "Fast Forward visual identity, assets and PHP publication tooling",
+ "type": "project",
+ "require": {
+ "php": ">=8.4",
+ "ext-dom": "*",
+ "ext-json": "*",
+ "ext-zlib": "*",
+ "symfony/yaml": "^7.4"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^12.5"
+ },
+ "autoload": {
+ "psr-4": {
+ "PhpFastForward\\Brand\\": "scripts/"
+ }
+ },
+ "scripts": {
+ "test": "phpunit",
+ "check": [
+ "@php scripts/validate-brand.php",
+ "@php scripts/build-brand-logos.php --check",
+ "@php scripts/export-design.php --check",
+ "@test"
+ ],
+ "build:pages": "@php scripts/build-brand-pages.php --output-dir _site"
+ },
+ "config": {
+ "allow-plugins": false,
+ "sort-packages": true
+ }
+}
diff --git a/composer.lock b/composer.lock
new file mode 100644
index 0000000..d4d28de
--- /dev/null
+++ b/composer.lock
@@ -0,0 +1,1972 @@
+{
+ "_readme": [
+ "This file locks the dependencies of your project to a known state",
+ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
+ "This file is @generated automatically"
+ ],
+ "content-hash": "3136cd52f8dadaf832420ceee5f64771",
+ "packages": [
+ {
+ "name": "symfony/deprecation-contracts",
+ "version": "v3.7.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/deprecation-contracts.git",
+ "reference": "f3202fa1b5097b0af062dc978b32ecf63404e31d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/f3202fa1b5097b0af062dc978b32ecf63404e31d",
+ "reference": "f3202fa1b5097b0af062dc978b32ecf63404e31d",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.1"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/contracts",
+ "name": "symfony/contracts"
+ },
+ "branch-alias": {
+ "dev-main": "3.7-dev"
+ }
+ },
+ "autoload": {
+ "files": [
+ "function.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "A generic function and convention to trigger deprecation notices",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/deprecation-contracts/tree/v3.7.1"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2026-06-05T06:23:12+00:00"
+ },
+ {
+ "name": "symfony/polyfill-ctype",
+ "version": "v1.37.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-ctype.git",
+ "reference": "141046a8f9477948ff284fa65be2095baafb94f2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/141046a8f9477948ff284fa65be2095baafb94f2",
+ "reference": "141046a8f9477948ff284fa65be2095baafb94f2",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.2"
+ },
+ "provide": {
+ "ext-ctype": "*"
+ },
+ "suggest": {
+ "ext-ctype": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "thanks": {
+ "url": "https://github.com/symfony/polyfill",
+ "name": "symfony/polyfill"
+ }
+ },
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ],
+ "psr-4": {
+ "Symfony\\Polyfill\\Ctype\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Gert de Pagter",
+ "email": "BackEndTea@gmail.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for ctype functions",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "ctype",
+ "polyfill",
+ "portable"
+ ],
+ "support": {
+ "source": "https://github.com/symfony/polyfill-ctype/tree/v1.37.0"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2026-04-10T16:19:22+00:00"
+ },
+ {
+ "name": "symfony/yaml",
+ "version": "v7.4.20",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/yaml.git",
+ "reference": "0222bf4dfaa1e3ceb8fff579635d655f2950d5a7"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/yaml/zipball/0222bf4dfaa1e3ceb8fff579635d655f2950d5a7",
+ "reference": "0222bf4dfaa1e3ceb8fff579635d655f2950d5a7",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.2",
+ "symfony/deprecation-contracts": "^2.5|^3",
+ "symfony/polyfill-ctype": "^1.8"
+ },
+ "conflict": {
+ "symfony/console": "<6.4"
+ },
+ "require-dev": {
+ "symfony/console": "^6.4|^7.0|^8.0"
+ },
+ "bin": [
+ "Resources/bin/yaml-lint"
+ ],
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Yaml\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Loads and dumps YAML files",
+ "homepage": "https://symfony.com",
+ "support": {
+ "source": "https://github.com/symfony/yaml/tree/v7.4.20"
+ },
+ "funding": [
+ {
+ "url": "https://symfony.com/sponsor",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/fabpot",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/nicolas-grekas",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2026-09-26T06:31:10+00:00"
+ }
+ ],
+ "packages-dev": [
+ {
+ "name": "myclabs/deep-copy",
+ "version": "1.14.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/myclabs/DeepCopy.git",
+ "reference": "8680aa248f8e07bc8fb43f56f0f5fc77a0c96aae"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/8680aa248f8e07bc8fb43f56f0f5fc77a0c96aae",
+ "reference": "8680aa248f8e07bc8fb43f56f0f5fc77a0c96aae",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^8.0"
+ },
+ "conflict": {
+ "doctrine/collections": "<1.6.8",
+ "doctrine/common": "<2.13.3 || >=3 <3.2.2"
+ },
+ "require-dev": {
+ "doctrine/collections": "^1.6.8",
+ "doctrine/common": "^2.13.3 || ^3.2.2",
+ "phpspec/prophecy": "^1.10",
+ "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13"
+ },
+ "type": "library",
+ "autoload": {
+ "files": [
+ "src/DeepCopy/deep_copy.php"
+ ],
+ "psr-4": {
+ "DeepCopy\\": "src/DeepCopy/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "Create deep copies (clones) of your objects",
+ "keywords": [
+ "clone",
+ "copy",
+ "duplicate",
+ "object",
+ "object graph"
+ ],
+ "support": {
+ "issues": "https://github.com/myclabs/DeepCopy/issues",
+ "source": "https://github.com/myclabs/DeepCopy/tree/1.14.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/mnapoli",
+ "type": "github"
+ }
+ ],
+ "time": "2026-08-11T10:17:44+00:00"
+ },
+ {
+ "name": "nikic/php-parser",
+ "version": "v5.9.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/nikic/PHP-Parser.git",
+ "reference": "9e33da9553fe7786f0962b35f4e4ecf01be89def"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/9e33da9553fe7786f0962b35f4e4ecf01be89def",
+ "reference": "9e33da9553fe7786f0962b35f4e4ecf01be89def",
+ "shasum": ""
+ },
+ "require": {
+ "ext-json": "*",
+ "ext-tokenizer": "*",
+ "php": ">=7.4"
+ },
+ "require-dev": {
+ "ircmaxell/php-yacc": "^0.0.7",
+ "phpunit/phpunit": "^9.0"
+ },
+ "bin": [
+ "bin/php-parse"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "5.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "PhpParser\\": "lib/PhpParser"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Nikita Popov"
+ }
+ ],
+ "description": "A PHP parser written in PHP",
+ "keywords": [
+ "parser",
+ "php"
+ ],
+ "support": {
+ "issues": "https://github.com/nikic/PHP-Parser/issues",
+ "source": "https://github.com/nikic/PHP-Parser/tree/v5.9.0"
+ },
+ "time": "2026-09-13T18:51:52+00:00"
+ },
+ {
+ "name": "phar-io/manifest",
+ "version": "2.0.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phar-io/manifest.git",
+ "reference": "54750ef60c58e43759730615a392c31c80e23176"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176",
+ "reference": "54750ef60c58e43759730615a392c31c80e23176",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-libxml": "*",
+ "ext-phar": "*",
+ "ext-xmlwriter": "*",
+ "phar-io/version": "^3.0.1",
+ "php": "^7.2 || ^8.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Arne Blankerts",
+ "email": "arne@blankerts.de",
+ "role": "Developer"
+ },
+ {
+ "name": "Sebastian Heuer",
+ "email": "sebastian@phpeople.de",
+ "role": "Developer"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "Developer"
+ }
+ ],
+ "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)",
+ "support": {
+ "issues": "https://github.com/phar-io/manifest/issues",
+ "source": "https://github.com/phar-io/manifest/tree/2.0.4"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/theseer",
+ "type": "github"
+ }
+ ],
+ "time": "2024-03-03T12:33:53+00:00"
+ },
+ {
+ "name": "phar-io/version",
+ "version": "3.2.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phar-io/version.git",
+ "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74",
+ "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.2 || ^8.0"
+ },
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Arne Blankerts",
+ "email": "arne@blankerts.de",
+ "role": "Developer"
+ },
+ {
+ "name": "Sebastian Heuer",
+ "email": "sebastian@phpeople.de",
+ "role": "Developer"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "Developer"
+ }
+ ],
+ "description": "Library for handling version information and constraints",
+ "support": {
+ "issues": "https://github.com/phar-io/version/issues",
+ "source": "https://github.com/phar-io/version/tree/3.2.1"
+ },
+ "time": "2022-02-21T01:04:05+00:00"
+ },
+ {
+ "name": "phpunit/php-code-coverage",
+ "version": "12.5.8",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
+ "reference": "7440368d94738d54f2c1de24dbd3871793bbb0dd"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/7440368d94738d54f2c1de24dbd3871793bbb0dd",
+ "reference": "7440368d94738d54f2c1de24dbd3871793bbb0dd",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-libxml": "*",
+ "ext-xmlwriter": "*",
+ "nikic/php-parser": "^5.9.0",
+ "php": ">=8.3",
+ "phpunit/php-text-template": "^5.0.1",
+ "sebastian/complexity": "^5.0",
+ "sebastian/environment": "^8.1.2",
+ "sebastian/lines-of-code": "^4.0.1",
+ "sebastian/version": "^6.0",
+ "theseer/tokenizer": "^2.0.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^12.5.37"
+ },
+ "suggest": {
+ "ext-pcov": "PHP extension that provides line coverage",
+ "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "12.5.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.",
+ "homepage": "https://github.com/sebastianbergmann/php-code-coverage",
+ "keywords": [
+ "coverage",
+ "testing",
+ "xunit"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues",
+ "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy",
+ "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/12.5.8"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ },
+ {
+ "url": "https://liberapay.com/sebastianbergmann",
+ "type": "liberapay"
+ },
+ {
+ "url": "https://thanks.dev/u/gh/sebastianbergmann",
+ "type": "thanks_dev"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/phpunit/php-code-coverage",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2026-10-03T14:03:50+00:00"
+ },
+ {
+ "name": "phpunit/php-file-iterator",
+ "version": "6.0.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-file-iterator.git",
+ "reference": "a248d1640ab059b075f53a2ef0f9856e864e06b5"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/a248d1640ab059b075f53a2ef0f9856e864e06b5",
+ "reference": "a248d1640ab059b075f53a2ef0f9856e864e06b5",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^12.5.33"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "6.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "FilterIterator implementation that filters files based on a list of suffixes.",
+ "homepage": "https://github.com/sebastianbergmann/php-file-iterator/",
+ "keywords": [
+ "filesystem",
+ "iterator"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues",
+ "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy",
+ "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/6.0.2"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ },
+ {
+ "url": "https://liberapay.com/sebastianbergmann",
+ "type": "liberapay"
+ },
+ {
+ "url": "https://thanks.dev/u/gh/sebastianbergmann",
+ "type": "thanks_dev"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/phpunit/php-file-iterator",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2026-08-25T14:40:53+00:00"
+ },
+ {
+ "name": "phpunit/php-invoker",
+ "version": "6.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-invoker.git",
+ "reference": "12b54e689b07a25a9b41e57736dfab6ec9ae5406"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/12b54e689b07a25a9b41e57736dfab6ec9ae5406",
+ "reference": "12b54e689b07a25a9b41e57736dfab6ec9ae5406",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.3"
+ },
+ "require-dev": {
+ "ext-pcntl": "*",
+ "phpunit/phpunit": "^12.0"
+ },
+ "suggest": {
+ "ext-pcntl": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "6.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Invoke callables with a timeout",
+ "homepage": "https://github.com/sebastianbergmann/php-invoker/",
+ "keywords": [
+ "process"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/php-invoker/issues",
+ "security": "https://github.com/sebastianbergmann/php-invoker/security/policy",
+ "source": "https://github.com/sebastianbergmann/php-invoker/tree/6.0.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2025-02-07T04:58:58+00:00"
+ },
+ {
+ "name": "phpunit/php-text-template",
+ "version": "5.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-text-template.git",
+ "reference": "babab73b7ef9fae406f2eb3ee11323a61caa63d5"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/babab73b7ef9fae406f2eb3ee11323a61caa63d5",
+ "reference": "babab73b7ef9fae406f2eb3ee11323a61caa63d5",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^12.5.37"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "5.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Simple template engine.",
+ "homepage": "https://github.com/sebastianbergmann/php-text-template/",
+ "keywords": [
+ "template"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/php-text-template/issues",
+ "security": "https://github.com/sebastianbergmann/php-text-template/security/policy",
+ "source": "https://github.com/sebastianbergmann/php-text-template/tree/5.0.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ },
+ {
+ "url": "https://liberapay.com/sebastianbergmann",
+ "type": "liberapay"
+ },
+ {
+ "url": "https://thanks.dev/u/gh/sebastianbergmann",
+ "type": "thanks_dev"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/phpunit/php-text-template",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2026-10-03T04:51:29+00:00"
+ },
+ {
+ "name": "phpunit/php-timer",
+ "version": "8.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-timer.git",
+ "reference": "f258ce36aa457f3aa3339f9ed4c81fc66dc8c2cc"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/f258ce36aa457f3aa3339f9ed4c81fc66dc8c2cc",
+ "reference": "f258ce36aa457f3aa3339f9ed4c81fc66dc8c2cc",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^12.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "8.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Utility class for timing",
+ "homepage": "https://github.com/sebastianbergmann/php-timer/",
+ "keywords": [
+ "timer"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/php-timer/issues",
+ "security": "https://github.com/sebastianbergmann/php-timer/security/policy",
+ "source": "https://github.com/sebastianbergmann/php-timer/tree/8.0.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2025-02-07T04:59:38+00:00"
+ },
+ {
+ "name": "phpunit/phpunit",
+ "version": "12.5.38",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/phpunit.git",
+ "reference": "1e87ad87fe57665a7f6e99a6e467329c11e851cc"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/1e87ad87fe57665a7f6e99a6e467329c11e851cc",
+ "reference": "1e87ad87fe57665a7f6e99a6e467329c11e851cc",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-filter": "*",
+ "ext-json": "*",
+ "ext-libxml": "*",
+ "ext-mbstring": "*",
+ "ext-xmlwriter": "*",
+ "myclabs/deep-copy": "^1.14.0",
+ "phar-io/manifest": "^2.0.4",
+ "phar-io/version": "^3.2.1",
+ "php": ">=8.3",
+ "phpunit/php-code-coverage": "^12.5.8",
+ "phpunit/php-file-iterator": "^6.0.2",
+ "phpunit/php-invoker": "^6.0.0",
+ "phpunit/php-text-template": "^5.0.1",
+ "phpunit/php-timer": "^8.0.0",
+ "sebastian/cli-parser": "^4.2.1",
+ "sebastian/comparator": "^7.1.8",
+ "sebastian/diff": "^7.0.1",
+ "sebastian/environment": "^8.1.2",
+ "sebastian/exporter": "^7.0.3",
+ "sebastian/global-state": "^8.0.3",
+ "sebastian/object-enumerator": "^7.0.0",
+ "sebastian/recursion-context": "^7.0.1",
+ "sebastian/type": "^6.0.4",
+ "sebastian/version": "^6.0.1",
+ "staabm/side-effects-detector": "^1.0.5"
+ },
+ "bin": [
+ "phpunit"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "12.5-dev"
+ }
+ },
+ "autoload": {
+ "files": [
+ "src/Framework/Assert/Functions.php"
+ ],
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "The PHP Unit Testing framework.",
+ "homepage": "https://phpunit.de/",
+ "keywords": [
+ "phpunit",
+ "testing",
+ "xunit"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/phpunit/issues",
+ "security": "https://github.com/sebastianbergmann/phpunit/security/policy",
+ "source": "https://github.com/sebastianbergmann/phpunit/tree/12.5.38"
+ },
+ "funding": [
+ {
+ "url": "https://phpunit.de/sponsoring.html",
+ "type": "other"
+ }
+ ],
+ "time": "2026-10-05T05:49:30+00:00"
+ },
+ {
+ "name": "sebastian/cli-parser",
+ "version": "4.2.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/cli-parser.git",
+ "reference": "7d05781b13f7dec9043a629a21d086ed74582a15"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/7d05781b13f7dec9043a629a21d086ed74582a15",
+ "reference": "7d05781b13f7dec9043a629a21d086ed74582a15",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^12.5.25"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "4.2-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library for parsing CLI options",
+ "homepage": "https://github.com/sebastianbergmann/cli-parser",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/cli-parser/issues",
+ "security": "https://github.com/sebastianbergmann/cli-parser/security/policy",
+ "source": "https://github.com/sebastianbergmann/cli-parser/tree/4.2.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ },
+ {
+ "url": "https://liberapay.com/sebastianbergmann",
+ "type": "liberapay"
+ },
+ {
+ "url": "https://thanks.dev/u/gh/sebastianbergmann",
+ "type": "thanks_dev"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/sebastian/cli-parser",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2026-05-17T05:29:34+00:00"
+ },
+ {
+ "name": "sebastian/comparator",
+ "version": "7.1.8",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/comparator.git",
+ "reference": "7c65c1e79836812819705b473a90c12399542485"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/7c65c1e79836812819705b473a90c12399542485",
+ "reference": "7c65c1e79836812819705b473a90c12399542485",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-mbstring": "*",
+ "php": ">=8.3",
+ "sebastian/diff": "^7.0",
+ "sebastian/exporter": "^7.0.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^12.5.25"
+ },
+ "suggest": {
+ "ext-bcmath": "For comparing BcMath\\Number objects"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "7.1-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Volker Dusch",
+ "email": "github@wallbash.com"
+ },
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@2bepublished.at"
+ }
+ ],
+ "description": "Provides the functionality to compare PHP values for equality",
+ "homepage": "https://github.com/sebastianbergmann/comparator",
+ "keywords": [
+ "comparator",
+ "compare",
+ "equality"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/comparator/issues",
+ "security": "https://github.com/sebastianbergmann/comparator/security/policy",
+ "source": "https://github.com/sebastianbergmann/comparator/tree/7.1.8"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ },
+ {
+ "url": "https://liberapay.com/sebastianbergmann",
+ "type": "liberapay"
+ },
+ {
+ "url": "https://thanks.dev/u/gh/sebastianbergmann",
+ "type": "thanks_dev"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/sebastian/comparator",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2026-05-21T04:45:25+00:00"
+ },
+ {
+ "name": "sebastian/complexity",
+ "version": "5.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/complexity.git",
+ "reference": "bad4316aba5303d0221f43f8cee37eb58d384bbb"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/bad4316aba5303d0221f43f8cee37eb58d384bbb",
+ "reference": "bad4316aba5303d0221f43f8cee37eb58d384bbb",
+ "shasum": ""
+ },
+ "require": {
+ "nikic/php-parser": "^5.0",
+ "php": ">=8.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^12.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "5.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library for calculating the complexity of PHP code units",
+ "homepage": "https://github.com/sebastianbergmann/complexity",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/complexity/issues",
+ "security": "https://github.com/sebastianbergmann/complexity/security/policy",
+ "source": "https://github.com/sebastianbergmann/complexity/tree/5.0.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2025-02-07T04:55:25+00:00"
+ },
+ {
+ "name": "sebastian/diff",
+ "version": "7.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/diff.git",
+ "reference": "cd4cabe39f8a4e8ee6818ba99f10a05561ea4ad6"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/cd4cabe39f8a4e8ee6818ba99f10a05561ea4ad6",
+ "reference": "cd4cabe39f8a4e8ee6818ba99f10a05561ea4ad6",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^12.5.33",
+ "symfony/process": "^7.4.17"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "7.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Kore Nordmann",
+ "email": "mail@kore-nordmann.de"
+ }
+ ],
+ "description": "Diff implementation",
+ "homepage": "https://github.com/sebastianbergmann/diff",
+ "keywords": [
+ "diff",
+ "udiff",
+ "unidiff",
+ "unified diff"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/diff/issues",
+ "security": "https://github.com/sebastianbergmann/diff/security/policy",
+ "source": "https://github.com/sebastianbergmann/diff/tree/7.0.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ },
+ {
+ "url": "https://liberapay.com/sebastianbergmann",
+ "type": "liberapay"
+ },
+ {
+ "url": "https://thanks.dev/u/gh/sebastianbergmann",
+ "type": "thanks_dev"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/sebastian/diff",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2026-08-25T15:35:54+00:00"
+ },
+ {
+ "name": "sebastian/environment",
+ "version": "8.1.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/environment.git",
+ "reference": "9d32c685773823b1983e256ae4ecd48a10d6e439"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/9d32c685773823b1983e256ae4ecd48a10d6e439",
+ "reference": "9d32c685773823b1983e256ae4ecd48a10d6e439",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^12.5.26"
+ },
+ "suggest": {
+ "ext-posix": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "8.1-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Provides functionality to handle HHVM/PHP environments",
+ "homepage": "https://github.com/sebastianbergmann/environment",
+ "keywords": [
+ "Xdebug",
+ "environment",
+ "hhvm"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/environment/issues",
+ "security": "https://github.com/sebastianbergmann/environment/security/policy",
+ "source": "https://github.com/sebastianbergmann/environment/tree/8.1.2"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ },
+ {
+ "url": "https://liberapay.com/sebastianbergmann",
+ "type": "liberapay"
+ },
+ {
+ "url": "https://thanks.dev/u/gh/sebastianbergmann",
+ "type": "thanks_dev"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/sebastian/environment",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2026-05-25T13:40:20+00:00"
+ },
+ {
+ "name": "sebastian/exporter",
+ "version": "7.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/exporter.git",
+ "reference": "c5e21b5de653ce0a769fb36f5cdfcb5e7a32cf23"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/c5e21b5de653ce0a769fb36f5cdfcb5e7a32cf23",
+ "reference": "c5e21b5de653ce0a769fb36f5cdfcb5e7a32cf23",
+ "shasum": ""
+ },
+ "require": {
+ "ext-mbstring": "*",
+ "php": ">=8.3",
+ "sebastian/recursion-context": "^7.0.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^12.5.25"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "7.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Volker Dusch",
+ "email": "github@wallbash.com"
+ },
+ {
+ "name": "Adam Harvey",
+ "email": "aharvey@php.net"
+ },
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@gmail.com"
+ }
+ ],
+ "description": "Provides the functionality to export PHP variables for visualization",
+ "homepage": "https://www.github.com/sebastianbergmann/exporter",
+ "keywords": [
+ "export",
+ "exporter"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/exporter/issues",
+ "security": "https://github.com/sebastianbergmann/exporter/security/policy",
+ "source": "https://github.com/sebastianbergmann/exporter/tree/7.0.3"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ },
+ {
+ "url": "https://liberapay.com/sebastianbergmann",
+ "type": "liberapay"
+ },
+ {
+ "url": "https://thanks.dev/u/gh/sebastianbergmann",
+ "type": "thanks_dev"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/sebastian/exporter",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2026-05-20T04:37:17+00:00"
+ },
+ {
+ "name": "sebastian/global-state",
+ "version": "8.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/global-state.git",
+ "reference": "b164d3274d6537ab462591c5755f76a8f5b1aae9"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/b164d3274d6537ab462591c5755f76a8f5b1aae9",
+ "reference": "b164d3274d6537ab462591c5755f76a8f5b1aae9",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.3",
+ "sebastian/object-reflector": "^5.0",
+ "sebastian/recursion-context": "^7.0.1"
+ },
+ "require-dev": {
+ "ext-dom": "*",
+ "phpunit/phpunit": "^12.5.28"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "8.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Snapshotting of global state",
+ "homepage": "https://www.github.com/sebastianbergmann/global-state",
+ "keywords": [
+ "global state"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/global-state/issues",
+ "security": "https://github.com/sebastianbergmann/global-state/security/policy",
+ "source": "https://github.com/sebastianbergmann/global-state/tree/8.0.3"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ },
+ {
+ "url": "https://liberapay.com/sebastianbergmann",
+ "type": "liberapay"
+ },
+ {
+ "url": "https://thanks.dev/u/gh/sebastianbergmann",
+ "type": "thanks_dev"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/sebastian/global-state",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2026-06-01T15:10:33+00:00"
+ },
+ {
+ "name": "sebastian/lines-of-code",
+ "version": "4.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/lines-of-code.git",
+ "reference": "d543b8ef219dcd8da262cbb958639a96bedba10e"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/d543b8ef219dcd8da262cbb958639a96bedba10e",
+ "reference": "d543b8ef219dcd8da262cbb958639a96bedba10e",
+ "shasum": ""
+ },
+ "require": {
+ "nikic/php-parser": "^5.7.0",
+ "php": ">=8.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^12.5.25"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "4.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library for counting the lines of code in PHP source code",
+ "homepage": "https://github.com/sebastianbergmann/lines-of-code",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/lines-of-code/issues",
+ "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy",
+ "source": "https://github.com/sebastianbergmann/lines-of-code/tree/4.0.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ },
+ {
+ "url": "https://liberapay.com/sebastianbergmann",
+ "type": "liberapay"
+ },
+ {
+ "url": "https://thanks.dev/u/gh/sebastianbergmann",
+ "type": "thanks_dev"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/sebastian/lines-of-code",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2026-05-19T16:22:07+00:00"
+ },
+ {
+ "name": "sebastian/object-enumerator",
+ "version": "7.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/object-enumerator.git",
+ "reference": "1effe8e9b8e068e9ae228e542d5d11b5d16db894"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/1effe8e9b8e068e9ae228e542d5d11b5d16db894",
+ "reference": "1effe8e9b8e068e9ae228e542d5d11b5d16db894",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.3",
+ "sebastian/object-reflector": "^5.0",
+ "sebastian/recursion-context": "^7.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^12.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "7.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Traverses array structures and object graphs to enumerate all referenced objects",
+ "homepage": "https://github.com/sebastianbergmann/object-enumerator/",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/object-enumerator/issues",
+ "security": "https://github.com/sebastianbergmann/object-enumerator/security/policy",
+ "source": "https://github.com/sebastianbergmann/object-enumerator/tree/7.0.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2025-02-07T04:57:48+00:00"
+ },
+ {
+ "name": "sebastian/object-reflector",
+ "version": "5.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/object-reflector.git",
+ "reference": "4bfa827c969c98be1e527abd576533293c634f6a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/4bfa827c969c98be1e527abd576533293c634f6a",
+ "reference": "4bfa827c969c98be1e527abd576533293c634f6a",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^12.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "5.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Allows reflection of object attributes, including inherited and non-public ones",
+ "homepage": "https://github.com/sebastianbergmann/object-reflector/",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/object-reflector/issues",
+ "security": "https://github.com/sebastianbergmann/object-reflector/security/policy",
+ "source": "https://github.com/sebastianbergmann/object-reflector/tree/5.0.0"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2025-02-07T04:58:17+00:00"
+ },
+ {
+ "name": "sebastian/recursion-context",
+ "version": "7.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/recursion-context.git",
+ "reference": "0b01998a7d5b1f122911a66bebcb8d46f0c82d8c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/0b01998a7d5b1f122911a66bebcb8d46f0c82d8c",
+ "reference": "0b01998a7d5b1f122911a66bebcb8d46f0c82d8c",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^12.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "7.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Adam Harvey",
+ "email": "aharvey@php.net"
+ }
+ ],
+ "description": "Provides functionality to recursively process PHP variables",
+ "homepage": "https://github.com/sebastianbergmann/recursion-context",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/recursion-context/issues",
+ "security": "https://github.com/sebastianbergmann/recursion-context/security/policy",
+ "source": "https://github.com/sebastianbergmann/recursion-context/tree/7.0.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ },
+ {
+ "url": "https://liberapay.com/sebastianbergmann",
+ "type": "liberapay"
+ },
+ {
+ "url": "https://thanks.dev/u/gh/sebastianbergmann",
+ "type": "thanks_dev"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/sebastian/recursion-context",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2025-08-13T04:44:59+00:00"
+ },
+ {
+ "name": "sebastian/type",
+ "version": "6.0.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/type.git",
+ "reference": "82ff822c2edc46724be9f7411d3163021f602773"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/82ff822c2edc46724be9f7411d3163021f602773",
+ "reference": "82ff822c2edc46724be9f7411d3163021f602773",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^12.5.25"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "6.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Collection of value objects that represent the types of the PHP type system",
+ "homepage": "https://github.com/sebastianbergmann/type",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/type/issues",
+ "security": "https://github.com/sebastianbergmann/type/security/policy",
+ "source": "https://github.com/sebastianbergmann/type/tree/6.0.4"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ },
+ {
+ "url": "https://liberapay.com/sebastianbergmann",
+ "type": "liberapay"
+ },
+ {
+ "url": "https://thanks.dev/u/gh/sebastianbergmann",
+ "type": "thanks_dev"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/sebastian/type",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2026-05-20T06:45:45+00:00"
+ },
+ {
+ "name": "sebastian/version",
+ "version": "6.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/version.git",
+ "reference": "9e935a16187e14f39b0e79910dabd614972cdb26"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/9e935a16187e14f39b0e79910dabd614972cdb26",
+ "reference": "9e935a16187e14f39b0e79910dabd614972cdb26",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=8.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-main": "6.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library that helps with managing the version number of Git-hosted PHP projects",
+ "homepage": "https://github.com/sebastianbergmann/version",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/version/issues",
+ "security": "https://github.com/sebastianbergmann/version/security/policy",
+ "source": "https://github.com/sebastianbergmann/version/tree/6.0.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ },
+ {
+ "url": "https://liberapay.com/sebastianbergmann",
+ "type": "liberapay"
+ },
+ {
+ "url": "https://thanks.dev/u/gh/sebastianbergmann",
+ "type": "thanks_dev"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/sebastian/version",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2026-10-04T05:50:08+00:00"
+ },
+ {
+ "name": "staabm/side-effects-detector",
+ "version": "1.0.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/staabm/side-effects-detector.git",
+ "reference": "d8334211a140ce329c13726d4a715adbddd0a163"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/staabm/side-effects-detector/zipball/d8334211a140ce329c13726d4a715adbddd0a163",
+ "reference": "d8334211a140ce329c13726d4a715adbddd0a163",
+ "shasum": ""
+ },
+ "require": {
+ "ext-tokenizer": "*",
+ "php": "^7.4 || ^8.0"
+ },
+ "require-dev": {
+ "phpstan/extension-installer": "^1.4.3",
+ "phpstan/phpstan": "^1.12.6",
+ "phpunit/phpunit": "^9.6.21",
+ "symfony/var-dumper": "^5.4.43",
+ "tomasvotruba/type-coverage": "1.0.0",
+ "tomasvotruba/unused-public": "1.0.0"
+ },
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "lib/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "A static analysis tool to detect side effects in PHP code",
+ "keywords": [
+ "static analysis"
+ ],
+ "support": {
+ "issues": "https://github.com/staabm/side-effects-detector/issues",
+ "source": "https://github.com/staabm/side-effects-detector/tree/1.0.5"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/staabm",
+ "type": "github"
+ }
+ ],
+ "time": "2024-10-20T05:08:20+00:00"
+ },
+ {
+ "name": "theseer/tokenizer",
+ "version": "2.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/theseer/tokenizer.git",
+ "reference": "7989e43bf381af0eac72e4f0ca5bcbfa81658be4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/theseer/tokenizer/zipball/7989e43bf381af0eac72e4f0ca5bcbfa81658be4",
+ "reference": "7989e43bf381af0eac72e4f0ca5bcbfa81658be4",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-tokenizer": "*",
+ "ext-xmlwriter": "*",
+ "php": "^8.1"
+ },
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Arne Blankerts",
+ "email": "arne@blankerts.de",
+ "role": "Developer"
+ }
+ ],
+ "description": "A small library for converting tokenized PHP source code into XML and potentially other formats",
+ "support": {
+ "issues": "https://github.com/theseer/tokenizer/issues",
+ "source": "https://github.com/theseer/tokenizer/tree/2.0.1"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/theseer",
+ "type": "github"
+ }
+ ],
+ "time": "2025-12-08T11:19:18+00:00"
+ }
+ ],
+ "aliases": [],
+ "minimum-stability": "stable",
+ "stability-flags": {},
+ "prefer-stable": false,
+ "prefer-lowest": false,
+ "platform": {
+ "php": ">=8.4",
+ "ext-dom": "*",
+ "ext-json": "*",
+ "ext-zlib": "*"
+ },
+ "platform-dev": {},
+ "plugin-api-version": "2.9.0"
+}
diff --git a/docs/brand/assessment.md b/docs/brand/assessment.md
new file mode 100644
index 0000000..ecfb777
--- /dev/null
+++ b/docs/brand/assessment.md
@@ -0,0 +1,109 @@
+# Identity assessment — 2026-10-03
+
+## Findings and decisions
+
+The source archive contained a coherent neutral fox, forward chevrons, navy
+speed trails, transparent exports, and landing/docs concepts. The profile used
+a smaller historical set with no asset catalog. Three SVGs embedded raster images
+rather than vector drawing masters. Finder metadata had been committed.
+
+The maintainer selected **Dash** as the character name, the mature developer
+collection as the primary identity, and the newly created cute editorial
+collection as a secondary option. Both now have a selected welcome master and
+reading, guiding, and composing derivatives. Each collection keeps its own face,
+proportions, and finish. Earlier profile imagery remains documented in the archive.
+
+The maintainer subsequently selected logo direction **F**: a fox signature with
+“Fast” in orange `#FF641B`, plus monochrome of the same drawing. The final local
+kit has eight native SVG exports and an editable source/generator. Exo 2 Italic,
+version 2.010, weight 900 provides the outlined lettering; the official font and
+OFL 1.1 notice are pinned with source hashes. Interface typography remains on the
+system-font tokens. This selection does not imply external publication.
+
+The expanded audit inspected 19 local image paths / 16 distinct contents and
+public default-branch trees. Fourteen package sources were curated: three match
+pinned public commits (`framework`, `dev-tools`, `enum`), one is tracked on a
+local task branch (`agents`), and ten were locally supplied untracked files
+including `event-dispatcher` and `fork`. Local checkout HEAD does not imply that
+an untracked file exists in that commit. The manifest records this distinction.
+
+| Family | Observation | Decision |
+| --- | --- | --- |
+| Developer | Upright body, longer muzzle, polished dimensional fur/cloth, purple hoodie and warm eyes | Main Dash identity for packages, documentation and default institutional use. |
+| Newly authored editorial | Rounder face, larger eyes, compact proportions, painted brown contours, purple hoodie | Secondary welcome/community/softer institutional collection. |
+| Package banners | Thirteen hoodie compositions and one older flat framework banner | Costume/context evidence, not interchangeable character masters or API facts. |
+| Older cute source-pack exports | Different face and mixed lockup interpretations | Seven promoted exports archived in local ignored backup, hashes verified before removal. |
+| Selected F signature | Native fox geometry and Exo 2 outlined lettering; light/dark/color/monochrome applications | Current logo system. Master is `assets/brand/logo-source.json`; eight exports come from `scripts/build-brand-logos.php`. |
+| Retired logos and compact chevrons | Earlier identity interpretations and unrecorded legacy lettering | Removed from the visible kit; provenance remains in ignored backup and `archived_sources`. |
+
+Cleaned PNGs have true alpha; their supplied bytes and padding were preserved.
+The new dark-surface SVG signature has light lettering, and ink/white monochrome
+exports cover single-color applications. Thirteen remaining package source
+illustrations provide historical provenance and costume context; they are not
+logo masters or the visible brand gallery. Two retain verified public pins
+(`dev-tools`, `enum`); eleven have explicit local provenance. The older framework
+banner's public pin remains in the archive metadata.
+
+The archived icon sprite is vector geometry, but third-party marks have no
+recorded rights or attribution. Its CSS named a nonexistent image; that URL
+was repaired with the transformation recorded in the manifest. Website concepts
+contain unverified APIs, metrics, versions, dependency claims, and a license
+footer. None were promoted into product facts.
+
+## Delivered foundation
+
+DESIGN.md, STYLE.md, and SOUL.md define one identity contract. The manifest identifies
+reusable exports, references, package costumes, and legacy URLs.
+The visual specimen shows eight reference poses and light/navy contexts.
+The documentation pattern supplies reusable CSS and an executable reading layout;
+the logo board presents the selected F signature and its applications. The vector
+source and standard-library generator reproduce the eight SVGs without a runtime
+font dependency. A portable dash-art skill routes production to the current masters. Token exports
+let future interfaces consume the same values. Portable validation checks
+delivered bytes, metadata, coverage, and SVG safety.
+
+Community defaults cover contribution, support, conduct, security, accessibility,
+and issue/review preparation, with repository overrides. Private vulnerability
+reporting was observed disabled here; the policy explains how to request a
+private route without publishing vulnerability details. No contact or SLA was
+invented. Finder metadata was removed and ignored. Profile surfaces use the
+current logo and approved Dash references; the unrelated local social preview
+was preserved. The shared-workflow issue
+and PR remain outside this change.
+
+## Next artwork work
+
+1. Inspect the selected fox mark at actual small consumer sizes before delivering
+ a favicon or launcher icon. The native master is complete; optical small-size
+ applications still need their own review.
+2. Produce deliberate developer and editorial model/expression sheets: front,
+ profile, back and additional expressions. The delivered pose references do
+ not prove hidden anatomy; new views need review as derivatives.
+3. Normalize future package illustrations around the developer master, warm eyes,
+ markings, and costume rules. Update packages through their own PRs rather
+ than silently rewriting released artwork across repositories.
+4. Resolve remaining historical artwork authorship, generator/source details,
+ and reuse terms. The selected lettering's font provenance and license are recorded.
+ Replace third-party icon approximations with documented upstream assets if
+ they are needed for a production interface.
+
+## Future website implementation
+
+Build a small static landing/docs experience from the documented patterns once
+the real navigation, package states, installation API, and publication target
+are defined. Start with readable installation, a package grid, and actual
+repository links. Check keyboard navigation, mobile layout, contrast, selectable
+code, and reduced motion in the implemented page.
+
+The specimen is a local design artifact. The [Pages setup guide](pages.md)
+documents the publication workflow and prerequisites. Local preparation does
+not prove a deployed website, replace package artwork, or change organization settings.
+
+## Production package responsibility
+
+The supplied bootstrap remains the instruction authority; this repository has
+no scoped AGENTS contracts. The new `skills/dash-art/SKILL.md` owns the portable
+artwork procedure, with linked prompt/receipt and example-brief resources.
+README navigation leads to the package. No host skill installation or agent
+configuration was changed. Rollback removes the package and its navigation
+together; the asset contracts remain in the root identity documents.
diff --git a/docs/brand/dash-generation.json b/docs/brand/dash-generation.json
new file mode 100644
index 0000000..18b9c41
--- /dev/null
+++ b/docs/brand/dash-generation.json
@@ -0,0 +1,772 @@
+{
+ "schema_version": 1,
+ "date": "2026-10-03",
+ "character": "Dash",
+ "primary_collection": "developer",
+ "secondary_collection": "editorial",
+ "records": [
+ {
+ "id": "dash-editorial-hoodie",
+ "collection": "editorial",
+ "status": "selected-reference",
+ "destination": "assets/mascot/dash-editorial-hoodie.png",
+ "generator": {
+ "tool": "image_gen.imagegen",
+ "mode": "built-in",
+ "model": "not exposed by the tool",
+ "version": "not exposed by the tool"
+ },
+ "prompt": "Use case: identity-preserve.\nAsset type: reusable transparent mascot costume illustration for PHP Fast Forward.\nInput image 1 is the primary edit target: the neutral waving fox. Input image 2 is supporting costume context only: purple hoodie from the Dev Tools package banner.\nPrimary request: create the same full-body waving fox as input 1 wearing a simple purple hoodie. Preserve the exact recognizable face, large rounded amber-brown eyes with bright catchlights, warm brown drawing contours, orange forehead tuft, cream muzzle/cheeks, pink-and-cream large ears, tiny dark nose, dark brown paws, seated full-body pose, waving open paw, fluffy sweeping tail with cream tip, and the original hand-painted 2D illustration style and proportions. Remove only the floating heart speech bubble and add the hoodie costume. Use violet fabric around #6D28D9 with darker folds and two subtle cream drawstrings; no chest emblem, text or logos. Retain the visible tail and both feet and do not hide ears or the waving paw. Do not turn this into the glossy 3D style from image 2; image 2 supplies the hoodie concept only. One fox, no props, no background or ground, no border. Real transparent alpha, no baked checkerboard; comfortable clear padding on all four edges. No headphones, extra limbs, duplicated tail, new eye color, watermark or lettering.",
+ "sources": [
+ {
+ "path": "supplied-backup:php_fast_forward_clean_assets_transparent/02_mascots/fox_footer_heart_balloon_transparent_cropped.png",
+ "sha256": "6c8eae7c1987ce8145ef0d6d3a861ec6aadd16d64bec5e2f61f67346425d2e58",
+ "role": "Original neutral face and illustration style; retained in local archive",
+ "included_in_public_kit": false
+ },
+ {
+ "path": "references/ecosystem/dev-tools.png",
+ "sha256": "12fe5ab6b4e53a616c7f2589c0262c9daca98642a4b99a5b048f60ab7fbacdca",
+ "role": "Hoodie concept only",
+ "included_in_public_kit": true
+ }
+ ],
+ "output": {
+ "sha256": "32da08a9e6c868687887e2557885d27e4e1f43b99dddf26787da1d8aa4798090",
+ "bytes": 1244120,
+ "width": 1312,
+ "height": 1199,
+ "mode": "RGBA",
+ "has_alpha": true
+ },
+ "review": {
+ "date": "2026-10-03",
+ "likeness": "Compared visually within collection: face, markings, hoodie, ears, paws and one tail.",
+ "anatomy": "Authored poses; not an orthographic turnaround.",
+ "transparency": "Actual alpha pixels inspected; final light/navy surface review recorded in delivery.",
+ "selection": "Maintainer selected developer as primary; newly authored editorial collection as secondary."
+ }
+ },
+ {
+ "id": "dash-editorial-reading",
+ "collection": "editorial",
+ "status": "selected-reference",
+ "destination": "assets/mascot/dash-editorial-reading.png",
+ "generator": {
+ "tool": "image_gen.imagegen",
+ "mode": "built-in",
+ "model": "not exposed by the tool",
+ "version": "not exposed by the tool"
+ },
+ "prompt": "Use case: identity-preserve.\nAsset type: reusable transparent editorial illustration of Dash, PHP Fast Forward's fox.\nInput image 1 is the sole PRIMARY character and rendering reference: Dash's approved waving purple-hoodie illustration. Create one new pose of exactly this fox. Preserve its round face, large amber-brown eyes with white catchlights, eyebrow shape, small dark nose, orange pointed forehead tuft, pink/cream large triangular ears with brown rims, rounded cream cheeks and muzzle, warm brown outlines, dark brown paws, orange fur, exactly one fluffy sweeping orange tail with its cream tip, and the same hand-painted dimensional 2D shading. Preserve the same purple hoodie and two cream drawstrings with knotted ends, no emblem. Keep the face and body proportions matched to the primary reference; do not use glossy 3D banner rendering or a different fox model.\nReal transparent alpha, no background, floor, rectangular shadow, checkerboard, border, label, lettering, watermark or logo. Comfortable clear padding with complete ears, paws and tail. Exactly one fox, two arms, two feet, one tail; no headphones or shoes.\nSituation: documentation and learning. The fox sits comfortably holding a single open cream-paged book with a plain dark violet cover. Both paws support the book naturally. Head inclined a little toward the pages, attentive warm smile. Keep the eyes visible and face recognizable. Show both seated feet and full sweeping tail. Empty pages: no writing, code, symbols, sparkles or speech bubbles.",
+ "sources": [
+ {
+ "path": "assets/mascot/dash-editorial-hoodie.png",
+ "sha256": "32da08a9e6c868687887e2557885d27e4e1f43b99dddf26787da1d8aa4798090",
+ "role": "Primary editorial identity master",
+ "included_in_public_kit": true
+ }
+ ],
+ "output": {
+ "sha256": "e0389e36c14d7d4176a82db0e08461ec364c4d45c00d31247947970d8d218551",
+ "bytes": 1313121,
+ "width": 1312,
+ "height": 1199,
+ "mode": "RGBA",
+ "has_alpha": true
+ },
+ "review": {
+ "date": "2026-10-03",
+ "likeness": "Compared visually within collection: face, markings, hoodie, ears, paws and one tail.",
+ "anatomy": "Authored poses; not an orthographic turnaround.",
+ "transparency": "Actual alpha pixels inspected; final light/navy surface review recorded in delivery.",
+ "selection": "Maintainer selected developer as primary; newly authored editorial collection as secondary."
+ }
+ },
+ {
+ "id": "dash-editorial-guide",
+ "collection": "editorial",
+ "status": "selected-reference",
+ "destination": "assets/mascot/dash-editorial-guide.png",
+ "generator": {
+ "tool": "image_gen.imagegen",
+ "mode": "built-in",
+ "model": "not exposed by the tool",
+ "version": "not exposed by the tool"
+ },
+ "prompt": "Use case: identity-preserve.\nAsset type: reusable transparent editorial illustration of Dash, PHP Fast Forward's fox.\nInput image 1 is the sole PRIMARY character and rendering reference: Dash's approved waving purple-hoodie illustration. Create one new pose of exactly this fox. Preserve its round face, large amber-brown eyes with white catchlights, eyebrow shape, small dark nose, orange pointed forehead tuft, pink/cream large triangular ears with brown rims, rounded cream cheeks and muzzle, warm brown outlines, dark brown paws, orange fur, exactly one fluffy sweeping orange tail with its cream tip, and the same hand-painted dimensional 2D shading. Preserve the same purple hoodie and two cream drawstrings with knotted ends, no emblem. Keep the face and body proportions matched to the primary reference; do not use glossy 3D banner rendering or a different fox model.\nReal transparent alpha, no background, floor, rectangular shadow, checkerboard, border, label, lettering, watermark or logo. Comfortable clear padding with complete ears, paws and tail. Exactly one fox, two arms, two feet, one tail; no headphones or shoes.\nSituation: explaining the next step. The fox sits in a friendly three-quarter pose, looks toward the viewer and extends one open paw gently toward the side to indicate adjacent content. The other paw rests naturally. Friendly composed smile, no index-finger distortion, no pointing stick, book, interface or props. Keep both feet visible and the whole tail clearly readable.",
+ "sources": [
+ {
+ "path": "assets/mascot/dash-editorial-hoodie.png",
+ "sha256": "32da08a9e6c868687887e2557885d27e4e1f43b99dddf26787da1d8aa4798090",
+ "role": "Primary editorial identity master",
+ "included_in_public_kit": true
+ }
+ ],
+ "output": {
+ "sha256": "30797ab924e979662ce01e47cd101a429b50c8dd854d1f118575f0fcf066401c",
+ "bytes": 1225215,
+ "width": 1312,
+ "height": 1199,
+ "mode": "RGBA",
+ "has_alpha": true
+ },
+ "review": {
+ "date": "2026-10-03",
+ "likeness": "Compared visually within collection: face, markings, hoodie, ears, paws and one tail.",
+ "anatomy": "Authored poses; not an orthographic turnaround.",
+ "transparency": "Actual alpha pixels inspected; final light/navy surface review recorded in delivery.",
+ "selection": "Maintainer selected developer as primary; newly authored editorial collection as secondary."
+ }
+ },
+ {
+ "id": "dash-editorial-build",
+ "collection": "editorial",
+ "status": "selected-reference",
+ "destination": "assets/mascot/dash-editorial-build.png",
+ "generator": {
+ "tool": "image_gen.imagegen",
+ "mode": "built-in",
+ "model": "not exposed by the tool",
+ "version": "not exposed by the tool"
+ },
+ "prompt": "Use case: identity-preserve.\nAsset type: reusable transparent editorial illustration of Dash, PHP Fast Forward's fox.\nInput image 1 is the sole PRIMARY character and rendering reference: Dash's approved waving purple-hoodie illustration. Create one new pose of exactly this fox. Preserve its round face, large amber-brown eyes with white catchlights, eyebrow shape, small dark nose, orange pointed forehead tuft, pink/cream large triangular ears with brown rims, rounded cream cheeks and muzzle, warm brown outlines, dark brown paws, orange fur, exactly one fluffy sweeping orange tail with its cream tip, and the same hand-painted dimensional 2D shading. Preserve the same purple hoodie and two cream drawstrings with knotted ends, no emblem. Keep the face and body proportions matched to the primary reference; do not use glossy 3D banner rendering or a different fox model.\nReal transparent alpha, no background, floor, rectangular shadow, checkerboard, border, label, lettering, watermark or logo. Comfortable clear padding with complete ears, paws and tail. Exactly one fox, two arms, two feet, one tail; no headphones or shoes.\nSituation: composing reusable software components. The fox sits with two simple small geometric rounded cuboid blocks, one violet and one blue, with no markings. The blocks sit together near the fox's paws; one paw calmly places the top block while the other steadies the lower block. This is a small visual metaphor, not a real device. Interested pleased expression, all eyes/ears and full tail visible, same face proportions as the approved illustration. No extra blocks, wires, letters, diagram, UI, or machinery.",
+ "sources": [
+ {
+ "path": "assets/mascot/dash-editorial-hoodie.png",
+ "sha256": "32da08a9e6c868687887e2557885d27e4e1f43b99dddf26787da1d8aa4798090",
+ "role": "Primary editorial identity master",
+ "included_in_public_kit": true
+ }
+ ],
+ "output": {
+ "sha256": "c6bec169f8a014ba3952f65efc254d77c2895ab552726a7e5cb0052a3ca17891",
+ "bytes": 1245674,
+ "width": 1312,
+ "height": 1199,
+ "mode": "RGBA",
+ "has_alpha": true
+ },
+ "review": {
+ "date": "2026-10-03",
+ "likeness": "Compared visually within collection: face, markings, hoodie, ears, paws and one tail.",
+ "anatomy": "Authored poses; not an orthographic turnaround.",
+ "transparency": "Actual alpha pixels inspected; final light/navy surface review recorded in delivery.",
+ "selection": "Maintainer selected developer as primary; newly authored editorial collection as secondary."
+ }
+ },
+ {
+ "id": "dash-developer-welcome",
+ "collection": "developer",
+ "status": "selected-reference",
+ "destination": "assets/mascot/dash-developer-welcome.png",
+ "generator": {
+ "tool": "image_gen.imagegen",
+ "mode": "built-in",
+ "model": "not exposed by the tool",
+ "version": "not exposed by the tool"
+ },
+ "prompt": "Use case: background-extraction.\nEdit target: input image 1. Remove ONLY all atmospheric orange, purple, cream and dark background haze/glow from around this fox. Keep the fox itself, face, fur, purple hoodie, pose, raised paw, feet and tail exactly unchanged. Produce a clean transparent cutout: all pixels outside the character alpha zero, character opaque with natural fur edge antialiasing. Preserve comfortable clear padding, no floor/shadow and no new objects, text, logo or pose change.",
+ "sources": [
+ {
+ "path": "backup/dash/generated-intermediates/developer-welcome-glow.png",
+ "sha256": "430d20cf74eb0c800b8b5f6d709dfeb18fffd44da40a2af99f8c3018e968dceb",
+ "role": "Initial generated developer face/pose master; archived before final cutout review",
+ "included_in_public_kit": false
+ }
+ ],
+ "output": {
+ "sha256": "38b2c5bb87c94326bcab6463f74fc785414d8539e9175e088b5a5c797a466e09",
+ "bytes": 2010542,
+ "width": 1024,
+ "height": 1536,
+ "mode": "RGBA",
+ "has_alpha": true
+ },
+ "review": {
+ "date": "2026-10-03",
+ "likeness": "Compared visually within collection: face, markings, hoodie, ears, paws and one tail.",
+ "anatomy": "Authored poses; not an orthographic turnaround.",
+ "transparency": "Actual alpha pixels inspected; final light/navy surface review recorded in delivery.",
+ "selection": "Maintainer selected developer as primary; newly authored editorial collection as secondary."
+ }
+ },
+ {
+ "id": "dash-developer-reading",
+ "collection": "developer",
+ "status": "selected-reference",
+ "destination": "assets/mascot/dash-developer-reading.png",
+ "generator": {
+ "tool": "image_gen.imagegen",
+ "mode": "built-in",
+ "model": "not exposed by the tool",
+ "version": "not exposed by the tool"
+ },
+ "prompt": "Use case: identity-preserve.\nAsset type: reusable transparent developer illustration of Dash, PHP Fast Forward's main fox mascot.\nInput image 1 is the PRIMARY exact character and rendering reference. Keep its professional polished dimensional fur/cloth rendering, more upright body and longer muzzle, same amber-brown eyes and catchlights, brow shape, small dark nose, orange pointed forehead tuft, tall pink/cream ears with brown rims, cream cheek mask/muzzle, dark paw pads, orange fur, one cream-tipped full orange tail, violet hoodie, same two cream drawstrings/knotted ends and plain chest. Preserve the face proportions, body proportions and clothing details. ONE fox with two arms, two feet and ONE tail.\nBackground constraint: STRICT clean cutout with real transparent alpha. Every pixel outside the fox or specified prop must be completely transparent, with NO atmospheric glow, fog, colored halo, bokeh, scene, black backing, checkerboard, floor or shadow. The character itself is fully opaque. Comfortable padding, no clipped ears, paws, feet or tail. No text, logo, emblem, headphones, shoes, code or watermarks.\nSituation: learning and documentation. Dash sits comfortably, holding a single open book with plain cream pages and a dark violet cover using both paws. Head inclined slightly to the pages while his face and warm eyes remain visible. Attentive composed smile. Retain both feet and full tail. Blank pages, no writing, symbols, speech bubbles or sparkles.",
+ "sources": [
+ {
+ "path": "backup/dash/generated-intermediates/developer-welcome-glow.png",
+ "sha256": "430d20cf74eb0c800b8b5f6d709dfeb18fffd44da40a2af99f8c3018e968dceb",
+ "role": "Initial generated developer face/pose master; archived before final cutout review",
+ "included_in_public_kit": false
+ }
+ ],
+ "output": {
+ "sha256": "bb87dc5d6a8bbcde4510ca5f99e19a6a216a577b9c83aac2c5947454e2b1e982",
+ "bytes": 2214296,
+ "width": 1024,
+ "height": 1536,
+ "mode": "RGBA",
+ "has_alpha": true
+ },
+ "review": {
+ "date": "2026-10-03",
+ "likeness": "Compared visually within collection: face, markings, hoodie, ears, paws and one tail.",
+ "anatomy": "Authored poses; not an orthographic turnaround.",
+ "transparency": "Actual alpha pixels inspected; final light/navy surface review recorded in delivery.",
+ "selection": "Maintainer selected developer as primary; newly authored editorial collection as secondary."
+ }
+ },
+ {
+ "id": "dash-developer-guide",
+ "collection": "developer",
+ "status": "selected-reference",
+ "destination": "assets/mascot/dash-developer-guide.png",
+ "generator": {
+ "tool": "image_gen.imagegen",
+ "mode": "built-in",
+ "model": "not exposed by the tool",
+ "version": "not exposed by the tool"
+ },
+ "prompt": "Use case: identity-preserve.\nAsset type: reusable transparent developer illustration of Dash, PHP Fast Forward's main fox mascot.\nInput image 1 is the PRIMARY exact character and rendering reference. Keep its professional polished dimensional fur/cloth rendering, more upright body and longer muzzle, same amber-brown eyes and catchlights, brow shape, small dark nose, orange pointed forehead tuft, tall pink/cream ears with brown rims, cream cheek mask/muzzle, dark paw pads, orange fur, one cream-tipped full orange tail, violet hoodie, same two cream drawstrings/knotted ends and plain chest. Preserve the face proportions, body proportions and clothing details. ONE fox with two arms, two feet and ONE tail.\nBackground constraint: STRICT clean cutout with real transparent alpha. Every pixel outside the fox or specified prop must be completely transparent, with NO atmospheric glow, fog, colored halo, bokeh, scene, black backing, checkerboard, floor or shadow. The character itself is fully opaque. Comfortable padding, no clipped ears, paws, feet or tail. No text, logo, emblem, headphones, shoes, code or watermarks.\nSituation: navigation and explaining the next step. Dash stands in a calm front three-quarter pose, extending one open paw toward the side as a welcoming guiding gesture. Other paw rests naturally near the hoodie pocket. Look toward the reader with a confident kind smile; warm eyes and exact same face. Keep both feet and full tail visible. No pointing finger distortion or props.",
+ "sources": [
+ {
+ "path": "backup/dash/generated-intermediates/developer-welcome-glow.png",
+ "sha256": "430d20cf74eb0c800b8b5f6d709dfeb18fffd44da40a2af99f8c3018e968dceb",
+ "role": "Initial generated developer face/pose master; archived before final cutout review",
+ "included_in_public_kit": false
+ }
+ ],
+ "output": {
+ "sha256": "84f32b5236d9905f609f379abc15d8ccf1253503e402de658c8005d3923e6e93",
+ "bytes": 2164660,
+ "width": 1024,
+ "height": 1536,
+ "mode": "RGBA",
+ "has_alpha": true
+ },
+ "review": {
+ "date": "2026-10-03",
+ "likeness": "Compared visually within collection: face, markings, hoodie, ears, paws and one tail.",
+ "anatomy": "Authored poses; not an orthographic turnaround.",
+ "transparency": "Actual alpha pixels inspected; final light/navy surface review recorded in delivery.",
+ "selection": "Maintainer selected developer as primary; newly authored editorial collection as secondary."
+ }
+ },
+ {
+ "id": "dash-developer-build",
+ "collection": "developer",
+ "status": "selected-reference",
+ "destination": "assets/mascot/dash-developer-build.png",
+ "generator": {
+ "tool": "image_gen.imagegen",
+ "mode": "built-in",
+ "model": "not exposed by the tool",
+ "version": "not exposed by the tool"
+ },
+ "prompt": "Use case: identity-preserve.\nAsset type: reusable transparent developer illustration of Dash, PHP Fast Forward's main fox mascot.\nInput image 1 is the PRIMARY exact character and rendering reference. Keep its professional polished dimensional fur/cloth rendering, more upright body and longer muzzle, same amber-brown eyes and catchlights, brow shape, small dark nose, orange pointed forehead tuft, tall pink/cream ears with brown rims, cream cheek mask/muzzle, dark paw pads, orange fur, one cream-tipped full orange tail, violet hoodie, same two cream drawstrings/knotted ends and plain chest. Preserve the face proportions, body proportions and clothing details. ONE fox with two arms, two feet and ONE tail.\nBackground constraint: STRICT clean cutout with real transparent alpha. Every pixel outside the fox or specified prop must be completely transparent, with NO atmospheric glow, fog, colored halo, bokeh, scene, black backing, checkerboard, floor or shadow. The character itself is fully opaque. Comfortable padding, no clipped ears, paws, feet or tail. No text, logo, emblem, headphones, shoes, code or watermarks.\nSituation: composing reusable software components. Dash sits, thoughtfully placing one plain violet rounded cuboid block onto a plain blue rounded cuboid block. One paw places the upper block, the other steadies the lower block. Interested pleased smile and the exact same recognizable face as the master. Two small blocks only, no markings or letters; keep his body readable, both ears and feet and full tail visible. No other devices, wires, diagrams, interface or machinery.",
+ "sources": [
+ {
+ "path": "backup/dash/generated-intermediates/developer-welcome-glow.png",
+ "sha256": "430d20cf74eb0c800b8b5f6d709dfeb18fffd44da40a2af99f8c3018e968dceb",
+ "role": "Initial generated developer face/pose master; archived before final cutout review",
+ "included_in_public_kit": false
+ }
+ ],
+ "output": {
+ "sha256": "3cca06ae5f82e33a97855ddcb38b3e59c4b750743e7bdb16103a122c492ea303",
+ "bytes": 2128379,
+ "width": 1024,
+ "height": 1536,
+ "mode": "RGBA",
+ "has_alpha": true
+ },
+ "review": {
+ "date": "2026-10-03",
+ "likeness": "Compared visually within collection: face, markings, hoodie, ears, paws and one tail.",
+ "anatomy": "Authored poses; not an orthographic turnaround.",
+ "transparency": "Actual alpha pixels inspected; final light/navy surface review recorded in delivery.",
+ "selection": "Maintainer selected developer as primary; newly authored editorial collection as secondary."
+ }
+ },
+ {
+ "id": "dash-developer-welcome-initial",
+ "collection": "developer",
+ "status": "archived-intermediate",
+ "destination": "backup/dash/generated-intermediates/developer-welcome-glow.png",
+ "generator": {
+ "tool": "image_gen.imagegen",
+ "mode": "built-in",
+ "model": "not exposed by the tool",
+ "version": "not exposed by the tool"
+ },
+ "prompt": "Use case: illustration-story.\nAsset type: standalone transparent master reference of Dash, the developer mascot of PHP Fast Forward.\nInput image 1: PRIMARY character reference, the fox at the center of the Event Dispatcher banner. Input image 2: supporting reference for the same fox face and purple hoodie in the Fork banner. Input image 3: supporting glossy fabric/fur rendering from Dev Tools.\nCreate ONE clean full-body isolated illustration of that same recognizable fox, in a relaxed front three-quarter standing welcome pose, one paw gently raised with its palm visible. Match the developer-banner rendering family: polished dimensional shaded fur and cloth, a somewhat longer fox muzzle, proportionate warm amber-brown eyes, confident but kind brows and smile, pointed orange forehead tuft, tall triangular ears with dark brown rims and pink/cream interiors, white-cream cheek mask and muzzle, black/dark nose, orange fur and one full fluffy orange tail with a cream tip. Keep the face closest to the Event Dispatcher primary, avoiding the more round oversized chibi face of the neutral editorial kit. Purple hoodie around #6D28D9, cream drawstrings, small realistic fabric folds, no chest emblem. Fur-covered orange legs and brown paws; no pants, shoes, devices or props. Compose a calm capable developer companion rather than a hyperactive baby toy. This is the full-body master pose used for subsequent illustrations, with readable anatomy and exactly two arms, two legs, one tail. Keep all ears, feet, tail and paws inside the canvas with comfortable transparent padding. Real alpha transparency, no ground/shadow rectangle, no checkerboard, background, interface, code, labels, text, logo, badge, headphones or watermark.",
+ "sources": [
+ {
+ "path": "references/ecosystem/event-dispatcher.png",
+ "sha256": "86db340858ffb798d7416601ffef474d020ede1904786ecd7045590a5af3ccaf",
+ "role": "Primary developer character context",
+ "included_in_public_kit": true
+ },
+ {
+ "path": "references/ecosystem/fork.png",
+ "sha256": "fc0812a2bbcaa50eb8a79c361aa95dde11f3b5422b4901527ecdbcc65b68a980",
+ "role": "Corroborating developer face/costume",
+ "included_in_public_kit": true
+ },
+ {
+ "path": "references/ecosystem/dev-tools.png",
+ "sha256": "12fe5ab6b4e53a616c7f2589c0262c9daca98642a4b99a5b048f60ab7fbacdca",
+ "role": "Developer fur/cloth finish",
+ "included_in_public_kit": true
+ }
+ ],
+ "output": {
+ "sha256": "430d20cf74eb0c800b8b5f6d709dfeb18fffd44da40a2af99f8c3018e968dceb",
+ "bytes": 2039085,
+ "width": 1024,
+ "height": 1536,
+ "mode": "RGBA",
+ "has_alpha": true
+ },
+ "review": {
+ "date": "2026-10-03",
+ "likeness": "Compared visually within collection: face, markings, hoodie, ears, paws and one tail.",
+ "anatomy": "Authored poses; not an orthographic turnaround.",
+ "transparency": "Actual alpha pixels inspected; final light/navy surface review recorded in delivery.",
+ "selection": "Maintainer selected developer as primary; newly authored editorial collection as secondary."
+ }
+ },
+ {
+ "id": "dash-developer-coding",
+ "collection": "developer",
+ "status": "review-gallery-proposal",
+ "destination": "assets/mascot/dash-developer-coding.png",
+ "date": "2026-10-03",
+ "generator": {
+ "tool": "image_gen.imagegen",
+ "mode": "built-in",
+ "model": "not exposed by the tool",
+ "version": "not exposed by the tool"
+ },
+ "prompt": "Create ONE new pose of Dash, PHP Fast Forward's established mature developer fox, using the supplied image as the strict identity reference. Preserve this exact character: upright mature proportions, warm dimensional polished illustration, orange fur, cream cheek/muzzle/chest/tail tip, amber-brown eyes, small dark nose, forehead tuft, large triangular ears with dark tips, dark paws, one full fluffy tail. Preserve the same purple pullover hoodie, plain chest, cream drawstrings, kangaroo pocket; no logo or emblem. New scene: Dash is seated comfortably, programming on an open plain charcoal laptop on a small quiet desk, three-quarter view, two anatomically clear paws naturally positioned on the keyboard/trackpad, attentive friendly expression, face/ears and tail visible. Laptop screen is turned mostly toward Dash; any visible screen content is simple abstract colored line shapes, NO readable code, letters, words, numbers, brand marks, or software UI. Preserve the mature style and likeness; do not make the head bigger, eyes rounder, or turn it into a younger chibi character. A useful stand-alone repository illustration with breathing room around the complete silhouette. TRUE TRANSPARENT BACKGROUND, with no glow, floor, room, scenery, vignette, halo, or colored background. Keep only Dash, laptop, restrained desk and simple seat. Clean fully transparent surrounding pixels; professional crisp edges, consistent material rendering. No title, watermark, labels, additional characters, or extra limbs.",
+ "sources": [
+ {
+ "path": "assets/mascot/dash-developer-welcome.png",
+ "sha256": "38b2c5bb87c94326bcab6463f74fc785414d8539e9175e088b5a5c797a466e09",
+ "role": "Primary developer identity master",
+ "included_in_public_kit": true
+ }
+ ],
+ "output": {
+ "sha256": "0df1f8a5c5db602ea649ad716ffe9f5396de849314e8190c74b99248b13c0fba",
+ "bytes": 1989218,
+ "width": 1024,
+ "height": 1536,
+ "mode": "RGBA",
+ "has_alpha": true,
+ "generator_artifact": "exec-fe2e2c32-4229-4655-af3e-1c1a8a38d4bb.png"
+ },
+ "review": {
+ "status": "awaiting-review",
+ "date": "2026-10-03",
+ "selection": "Not selected as canonical. Display in the labeled brand review gallery is authorized separately by the maintainer's Pages request.",
+ "likeness": "Awaiting maintainer review against the developer master.",
+ "anatomy": "Awaiting visual review; not an orthographic turnaround.",
+ "transparency": "PNG loaded with Pillow; native RGBA alpha inspected without changing pixels. The generated output remains exactly as delivered, including any partially opaque pixels or edge contact.",
+ "alpha_inspection": {
+ "alpha_extrema": [
+ 0,
+ 254
+ ],
+ "transparent_pixels": 805352,
+ "opaque_pixels": 0,
+ "partial_alpha_pixels": 767512,
+ "nontransparent_bbox": [
+ 0,
+ 51,
+ 1024,
+ 1504
+ ],
+ "corners_alpha": [
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "edge_inspection": {
+ "top": {
+ "max_alpha": 0,
+ "pixels_above_alpha_16": 0
+ },
+ "bottom": {
+ "max_alpha": 0,
+ "pixels_above_alpha_16": 0
+ },
+ "left": {
+ "max_alpha": 1,
+ "pixels_above_alpha_16": 0
+ },
+ "right": {
+ "max_alpha": 1,
+ "pixels_above_alpha_16": 0
+ }
+ }
+ },
+ "initial_selection": "Local proposal; no canonical selection or publication requested."
+ },
+ "initial_status": "local-not-published",
+ "publication": {
+ "scope": "brand-review-gallery",
+ "authorization": "maintainer-request",
+ "recorded_at": "2026-10-04",
+ "evidence": "Maintainer requested a workflow to publish the asset-visualization HTML on this repository's GitHub Pages. This includes the explicitly labeled proposal gallery.",
+ "deployment": "pending-main",
+ "canonical_selection": false
+ }
+ },
+ {
+ "id": "dash-developer-debugging",
+ "collection": "developer",
+ "status": "review-gallery-proposal",
+ "destination": "assets/mascot/dash-developer-debugging.png",
+ "date": "2026-10-03",
+ "generator": {
+ "tool": "image_gen.imagegen",
+ "mode": "built-in",
+ "model": "not exposed by the tool",
+ "version": "not exposed by the tool"
+ },
+ "prompt": "Create ONE useful new stand-alone Dash pose for a repository reference library. Use the provided mature developer Dash image as the strict character/style reference. Same polished dimensional illustrated orange fox, same mature body/head proportions and longer muzzle, amber-brown eyes, cream cheek/muzzle/chest/tail tip, forehead tuft, dark-tipped triangular ears, dark paws, ONE fluffy tail. Same plain purple pullover hoodie with two cream drawstrings and kangaroo pocket. No redesign, no chibi proportions, no rounder younger face, no added chest emblem. Preserve the exact identity across scenes. TRUE TRANSPARENT BACKGROUND: all empty area fully alpha-zero, no halo, scenery, floor, glow, vignette, background paint, words, numbers, code, brand symbols, watermark, or other characters. The complete silhouette and all props fit comfortably with breathing room. Crisp professional edges and consistent material rendering. New situation: Dash investigates a small abstract component cluster on a plain low charcoal workbench using a simple magnifying glass held naturally in one paw; the other paw rests beside the cluster. Three solid modest geometric violet/blue/cyan blocks sit on the workbench. Dash looks carefully through the glass with a curious calm expression; eyes and face remain recognizable and unobscured. Three-quarter upright stance, full ears and tail visible. The lens is clear with restrained reflections, no huge eye distortion. This symbolizes debugging without depicting any software API or generating a bug insect. Avoid exaggerated detective costume; keep the original developer hoodie.",
+ "sources": [
+ {
+ "path": "assets/mascot/dash-developer-welcome.png",
+ "sha256": "38b2c5bb87c94326bcab6463f74fc785414d8539e9175e088b5a5c797a466e09",
+ "role": "Primary developer identity master",
+ "included_in_public_kit": true
+ }
+ ],
+ "output": {
+ "sha256": "829bb9cc0e9596d0c61d51f5709fa3f0ad6a6558c2fc853c83870a230f00f8c5",
+ "bytes": 2127143,
+ "width": 1024,
+ "height": 1536,
+ "mode": "RGBA",
+ "has_alpha": true,
+ "generator_artifact": "exec-e61e4860-efbf-49a8-8e15-73a02843edbf.png"
+ },
+ "review": {
+ "status": "awaiting-review",
+ "date": "2026-10-03",
+ "selection": "Not selected as canonical. Display in the labeled brand review gallery is authorized separately by the maintainer's Pages request.",
+ "likeness": "Awaiting maintainer review against the developer master.",
+ "anatomy": "Awaiting visual review; not an orthographic turnaround.",
+ "transparency": "PNG loaded with Pillow; native RGBA alpha inspected without changing pixels. The generated output remains exactly as delivered, including any partially opaque pixels or edge contact.",
+ "alpha_inspection": {
+ "alpha_extrema": [
+ 0,
+ 254
+ ],
+ "transparent_pixels": 709001,
+ "opaque_pixels": 0,
+ "partial_alpha_pixels": 863863,
+ "nontransparent_bbox": [
+ 23,
+ 1,
+ 1024,
+ 1536
+ ],
+ "corners_alpha": [
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "edge_inspection": {
+ "top": {
+ "max_alpha": 0,
+ "pixels_above_alpha_16": 0
+ },
+ "bottom": {
+ "max_alpha": 1,
+ "pixels_above_alpha_16": 0
+ },
+ "left": {
+ "max_alpha": 0,
+ "pixels_above_alpha_16": 0
+ },
+ "right": {
+ "max_alpha": 1,
+ "pixels_above_alpha_16": 0
+ }
+ }
+ },
+ "initial_selection": "Local proposal; no canonical selection or publication requested."
+ },
+ "initial_status": "local-not-published",
+ "publication": {
+ "scope": "brand-review-gallery",
+ "authorization": "maintainer-request",
+ "recorded_at": "2026-10-04",
+ "evidence": "Maintainer requested a workflow to publish the asset-visualization HTML on this repository's GitHub Pages. This includes the explicitly labeled proposal gallery.",
+ "deployment": "pending-main",
+ "canonical_selection": false
+ }
+ },
+ {
+ "id": "dash-developer-explaining",
+ "collection": "developer",
+ "status": "review-gallery-proposal",
+ "destination": "assets/mascot/dash-developer-explaining.png",
+ "date": "2026-10-03",
+ "generator": {
+ "tool": "image_gen.imagegen",
+ "mode": "built-in",
+ "model": "not exposed by the tool",
+ "version": "not exposed by the tool"
+ },
+ "prompt": "Create ONE useful new stand-alone Dash pose for a repository reference library. Use the provided mature developer Dash image as the strict character/style reference. Same polished dimensional illustrated orange fox, same mature body/head proportions and longer muzzle, amber-brown eyes, cream cheek/muzzle/chest/tail tip, forehead tuft, dark-tipped triangular ears, dark paws, ONE fluffy tail. Same plain purple pullover hoodie with two cream drawstrings and kangaroo pocket. No redesign, no chibi proportions, no rounder younger face, no added chest emblem. Preserve the exact identity across scenes. TRUE TRANSPARENT BACKGROUND: all empty area fully alpha-zero, no halo, scenery, floor, glow, vignette, background paint, words, numbers, code, brand symbols, watermark, or other characters. The complete silhouette and all props fit comfortably with breathing room. Crisp professional edges and consistent material rendering. New situation: Dash presents a small whiteboard on a minimal charcoal easel. Dash stands beside it in a three-quarter full-body stance, smiling calmly, one open paw indicating the diagram and the other resting naturally near the hoodie pocket. The board contains only FOUR simple solid rounded rectangular components in violet, blue, cyan, and orange, connected with a few plain thin grey lines; no letters, text, numbers, labels, software icons, symbols, or handwritten code. Keep the board subordinate to the fox and make Dash's face/ears and single full cream-tipped tail completely readable. It represents explaining component composition without asserting a real API. Keep both paws anatomically coherent; no extra hands or fingers.",
+ "sources": [
+ {
+ "path": "assets/mascot/dash-developer-welcome.png",
+ "sha256": "38b2c5bb87c94326bcab6463f74fc785414d8539e9175e088b5a5c797a466e09",
+ "role": "Primary developer identity master",
+ "included_in_public_kit": true
+ }
+ ],
+ "output": {
+ "sha256": "b5a2bb951b87d61002fab5a6b3463ce3a7413f63e234e294041f5feb7ab79df2",
+ "bytes": 1845598,
+ "width": 1024,
+ "height": 1536,
+ "mode": "RGBA",
+ "has_alpha": true,
+ "generator_artifact": "exec-1c104031-22c6-444c-826c-ee539548f42b.png"
+ },
+ "review": {
+ "status": "awaiting-review",
+ "date": "2026-10-03",
+ "selection": "Not selected as canonical. Display in the labeled brand review gallery is authorized separately by the maintainer's Pages request.",
+ "likeness": "Awaiting maintainer review against the developer master.",
+ "anatomy": "Awaiting visual review; not an orthographic turnaround.",
+ "transparency": "PNG loaded with Pillow; native RGBA alpha inspected without changing pixels. The generated output remains exactly as delivered, including any partially opaque pixels or edge contact.",
+ "alpha_inspection": {
+ "alpha_extrema": [
+ 0,
+ 254
+ ],
+ "transparent_pixels": 827362,
+ "opaque_pixels": 0,
+ "partial_alpha_pixels": 745502,
+ "nontransparent_bbox": [
+ 0,
+ 59,
+ 1009,
+ 1512
+ ],
+ "corners_alpha": [
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "edge_inspection": {
+ "top": {
+ "max_alpha": 0,
+ "pixels_above_alpha_16": 0
+ },
+ "bottom": {
+ "max_alpha": 0,
+ "pixels_above_alpha_16": 0
+ },
+ "left": {
+ "max_alpha": 4,
+ "pixels_above_alpha_16": 0
+ },
+ "right": {
+ "max_alpha": 0,
+ "pixels_above_alpha_16": 0
+ }
+ }
+ },
+ "initial_selection": "Local proposal; no canonical selection or publication requested."
+ },
+ "initial_status": "local-not-published",
+ "publication": {
+ "scope": "brand-review-gallery",
+ "authorization": "maintainer-request",
+ "recorded_at": "2026-10-04",
+ "evidence": "Maintainer requested a workflow to publish the asset-visualization HTML on this repository's GitHub Pages. This includes the explicitly labeled proposal gallery.",
+ "deployment": "pending-main",
+ "canonical_selection": false
+ }
+ },
+ {
+ "id": "dash-developer-portrait-study",
+ "collection": "developer",
+ "status": "review-gallery-proposal",
+ "destination": "assets/mascot/dash-developer-portrait-study.png",
+ "date": "2026-10-03",
+ "generator": {
+ "tool": "image_gen.imagegen",
+ "mode": "built-in",
+ "model": "not exposed by the tool",
+ "version": "not exposed by the tool"
+ },
+ "prompt": "Create a new logo-composition portrait of the SAME mature developer Dash shown in the supplied reference. Reference is strict identity and rendering guidance. Square composition: an isolated WAIST-UP portrait, facing three-quarter slightly toward camera, calm confident friendly closed-mouth smile, both ears fully visible and hoodie shoulders/chest/forearms fully included. One relaxed paw lightly touches the hoodie's pocket edge; the other rests naturally. Keep orange fur, cream muzzle/cheeks and chest, amber-brown eyes, small dark nose, original forehead tuft, dark-tipped triangular ears, mature face proportions and longer muzzle, refined dimensional fur rendering. Same purple pullover hoodie with two cream drawstrings, plain chest and kangaroo pocket. Preserve mature character and exact likeness, not a chibi fox, not oversized round eyes, not a new species or redesigned head. This is a portrait to be placed within a logo layout later, so DO NOT generate chevrons, lettering, logo graphics, circular frames, badges, text, numbers, symbols, background or scenery. The bottom crop is deliberate at waist level, with clean natural torso edge; nothing cropped at sides or ears. TRUE TRANSPARENT BACKGROUND and alpha-zero empty space; no halo, glow, vignette, floor or colored background. Clean professional cutout edges. NO wordmark, title, emblem, brand markings, other characters or extra limbs.",
+ "sources": [
+ {
+ "path": "assets/mascot/dash-developer-welcome.png",
+ "sha256": "38b2c5bb87c94326bcab6463f74fc785414d8539e9175e088b5a5c797a466e09",
+ "role": "Primary developer identity master",
+ "included_in_public_kit": true
+ }
+ ],
+ "output": {
+ "sha256": "9b4adf163832ba51d2dddc2b043627b3b70cf84b1b98063770f6537dc549e460",
+ "bytes": 1392780,
+ "width": 1254,
+ "height": 1254,
+ "mode": "RGBA",
+ "has_alpha": true,
+ "generator_artifact": "exec-8aa12768-68ea-474c-b733-82efebbe187f.png"
+ },
+ "review": {
+ "status": "awaiting-review",
+ "date": "2026-10-03",
+ "selection": "Not selected as canonical. Display in the labeled brand review gallery is authorized separately by the maintainer's Pages request.",
+ "likeness": "Awaiting maintainer review against the developer master.",
+ "anatomy": "Awaiting visual review; not an orthographic turnaround.",
+ "transparency": "PNG loaded with Pillow; native RGBA alpha inspected without changing pixels. The generated output remains exactly as delivered, including any partially opaque pixels or edge contact.",
+ "alpha_inspection": {
+ "alpha_extrema": [
+ 0,
+ 255
+ ],
+ "transparent_pixels": 858311,
+ "opaque_pixels": 533,
+ "partial_alpha_pixels": 713672,
+ "nontransparent_bbox": [
+ 0,
+ 1,
+ 1234,
+ 1254
+ ],
+ "corners_alpha": [
+ 0,
+ 0,
+ 0,
+ 0
+ ],
+ "edge_inspection": {
+ "top": {
+ "max_alpha": 0,
+ "pixels_above_alpha_16": 0
+ },
+ "bottom": {
+ "max_alpha": 4,
+ "pixels_above_alpha_16": 0
+ },
+ "left": {
+ "max_alpha": 1,
+ "pixels_above_alpha_16": 0
+ },
+ "right": {
+ "max_alpha": 0,
+ "pixels_above_alpha_16": 0
+ }
+ }
+ },
+ "initial_selection": "Local proposal; no canonical selection or publication requested."
+ },
+ "initial_status": "local-not-published",
+ "publication": {
+ "scope": "brand-review-gallery",
+ "authorization": "maintainer-request",
+ "recorded_at": "2026-10-04",
+ "evidence": "Maintainer requested a workflow to publish the asset-visualization HTML on this repository's GitHub Pages. This includes the explicitly labeled proposal gallery.",
+ "deployment": "pending-main",
+ "canonical_selection": false
+ }
+ },
+ {
+ "id": "dash-developer-workstation",
+ "status": "review-gallery-proposal",
+ "destination": "assets/mascot/dash-developer-workstation.png",
+ "date": "2026-10-03",
+ "generator": {
+ "tool": "image_gen.imagegen",
+ "mode": "built-in",
+ "model": "not exposed by the tool",
+ "version": "not exposed by the tool"
+ },
+ "prompt": "Create a new premium illustrated scene starring Dash, the mature developer mascot of PHP Fast Forward. Reference image 1 is the sole identity and anatomy authority: keep exactly that orange fox's mature face, amber/brown eyes, cream muzzle and cheek markings, triangular ears with dark tips, forehead tuft, small dark nose, dark paws, single broad orange tail with a cream tip, and plain purple hoodie with cream drawstrings. Keep the same polished dimensional furry 3D illustration finish, calm confidence and friendly curiosity. Do not use chibi proportions or a different fox design.\n\nReference image 2 is the user's workstation photo. Use it ONLY as inspiration for a robust, equipment-rich desk: not as a room or person to reproduce, and not as a screen-content reference. Create a clean organized enthusiast developer studio. Dash is seated in a comfortable dark ergonomic chair at a wide wooden desk with a large dark desk mat, actively programming, one paw on a white/navy mechanical keyboard and the other on a mouse. Show Dash's face clearly in a three-quarter front-side view, with a thoughtful small smile and a believable comfortable working posture. Show his complete seated body, both feet and his single complete tail curling naturally beside the chair. Hands and limbs must be anatomically consistent with the identity reference.\n\nInclude an ultrawide monitor and a second regular widescreen monitor on articulated arms, with a small third portrait display, a tablet on a stand, a small phone dock, a compact macro keypad, two compact desktop computers, a webcam, a rectangular LED key light above the monitors, a broadcast microphone on a boom arm with restrained purple lighting, headphones on a stand, a spatial/VR headset on a shelf at the desk's side, one game controller, a closed notebook and a simple dark mug. Equipment should feel purposeful and well arranged, with cable management and breathing room; avoid a cluttered pile. Use generic unbranded hardware. Screens show ONLY abstract geometric code-like lines and panels with no readable letters, numbers or copied interfaces.\n\nCompose a wide landscape illustration, suitable for a repository hero or documentation feature image, with all important equipment and Dash comfortably inside the canvas and generous margins. Use a quiet deep navy studio background, soft violet/cyan ambient light, warm highlights on the orange fur and desk, and professional restrained lighting. Dash remains the visual focus despite the impressive setup. Deliver a high resolution PNG with this intentional opaque scene background. No text, letters, generated code, logos, badges, wordmarks, watermarks, copied private UI, medicines, personal labels, extra limbs or tails.",
+ "sources": [
+ {
+ "path": "assets/mascot/dash-developer-welcome.png",
+ "sha256": "38b2c5bb87c94326bcab6463f74fc785414d8539e9175e088b5a5c797a466e09",
+ "role": "Primary developer identity master",
+ "included_in_public_kit": true
+ },
+ {
+ "path": "user-supplied:local-only-workstation-photo",
+ "kind": "user-supplied-local-photo",
+ "sha256": "4da84627c108dbdf21b84d1f0031a6167b51951f3930b3518dc026fcf2794b14",
+ "role": "Equipment density and arrangement only; personal photograph remains outside the repository.",
+ "description": "Equipment density and arrangement only; personal photo remains outside the repository.",
+ "included_in_public_kit": false,
+ "publish_source": false
+ }
+ ],
+ "output": {
+ "sha256": "791cca47c009a14a9d8564d3aa554eba79d3262dbaf4652c978a33ff89cfef45",
+ "bytes": 2180315,
+ "width": 1672,
+ "height": 941,
+ "mode": "RGB",
+ "has_alpha": false,
+ "generator_artifact": "exec-e6fb5c11-ecb9-4075-85fe-5ecd63b0b372.png",
+ "transparent_background": false
+ },
+ "review": {
+ "status": "awaiting-review",
+ "date": "2026-10-03",
+ "selection": "Not selected as canonical. Display in the labeled brand review gallery is authorized separately by the maintainer's Pages request.",
+ "transparency": "Pillow loaded the original PNG; opaque background is intentional; no pixels were modified.",
+ "opacity_inspection": {
+ "alpha_channel": false,
+ "background": "Intentional opaque scene/background, stored as RGB."
+ },
+ "likeness": "Awaiting maintainer review against the developer master.",
+ "anatomy": "Awaiting visual review of scene, body, paws and single tail.",
+ "visual_inspection": {
+ "date": "2026-10-03",
+ "reviewer": "coordinating repository agent",
+ "evidence": "Coordinating repository agent inspected the native generated workstation output. Intentional opaque navy scene remains awaiting maintainer review.",
+ "selection": "Awaiting maintainer review; no direction or scene has been approved as canonical."
+ },
+ "initial_selection": "Local proposal; canonical identity remains unchanged."
+ },
+ "collection": "developer",
+ "initial_status": "local-not-published",
+ "publication": {
+ "scope": "brand-review-gallery",
+ "authorization": "maintainer-request",
+ "recorded_at": "2026-10-04",
+ "evidence": "Maintainer requested a workflow to publish the asset-visualization HTML on this repository's GitHub Pages. This includes the explicitly labeled proposal gallery.",
+ "deployment": "pending-main",
+ "canonical_selection": false
+ }
+ }
+ ]
+}
diff --git a/docs/brand/documentation.html b/docs/brand/documentation.html
new file mode 100644
index 0000000..ab57fe8
--- /dev/null
+++ b/docs/brand/documentation.html
@@ -0,0 +1,245 @@
+
+
+
+
+
+
+ Installation · PHP Fast Forward documentation pattern
+
+
+
+
+ Skip to content
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Getting started
+
Installation
+
Start with the core Fast Forward packages, then compose the services your application needs.
+
+ Packagefast-forward/framework
+ Format Documentation reference
+
+
+
+
Before you start
+
The documented framework example requires PHP 8.3 or higher and Composer. Work in your PHP project's directory.
Composer resolves the package's declared dependencies. Keep the generated lock file with your application's normal dependency workflow.
+
+
+
+
2. Compose the core services
+
Pass the framework provider's class name to the container factory. The example then retrieves the response factory, event dispatcher, and clock through their interfaces.
This example creates the container and obtains services. Add application behavior through the relevant components and their documented contracts.
+
+
+
+
+
Choose your next step
+
Use the package repository to explore the provider and component documentation. Keep the responsibility of each dependency clear as your application grows.
+
+ fast-forward/framework
+
An aggregate metapackage that brings the core stack together through one service-provider entry point.
+
+
+
+
diff --git a/docs/brand/documentation.md b/docs/brand/documentation.md
new file mode 100644
index 0000000..2618e2b
--- /dev/null
+++ b/docs/brand/documentation.md
@@ -0,0 +1,129 @@
+# PHP Fast Forward documentation pattern
+
+The [executable reference](documentation.html) defines the documentation surface:
+a navy navigation rail, a calm reading column, selectable code panels, and a
+secondary table of contents. It evolves the historical documentation concept
+using the current fox signature and selected Dash artwork. Archived concept
+content, requirements, and APIs are not product specifications.
+
+The design repository owns this pattern, [documentation.css](../../assets/styles/documentation.css),
+the [visual tokens](../../DESIGN.md), and cataloged artwork. Package repositories
+own their documentation, release requirements, examples, API behavior, and
+publication. The application or documentation generator owns routes, search,
+content rendering, and runtime integration.
+
+## Consume the style
+
+The reference is static HTML with optional inline JavaScript. Open it directly
+in a browser, or serve the repository with a local static server. It needs no
+dependency installation, build, remote font, or automatic network request.
+External links navigate only when activated.
+
+Copy the stylesheet and the selected assets with their manifest IDs, source
+commit, hashes, and applicable provenance. Load the CSS once and put the
+documentation surface inside `.ff-docs`. All component selectors are scoped to
+that wrapper. Shared token names are global; define an explicit precedence when
+combining this pattern with another design system.
+
+```html
+
+
+
+
+```
+
+The reference defaults to a light reading surface. A compact sun/moon button
+provides the theme action with an accessible label. `data-reading-theme="navy"`
+switches the reading palette; the navigation and code surfaces remain navy.
+The optional toggle uses `aria-pressed`. It does not change a consumer's theme
+preferences or impose persistence.
+
+## Token adapter
+
+`assets/tokens/theme.css` is a generated **Tailwind v4 `@theme` export**, not a
+standalone browser token stylesheet. A Tailwind consumer processes that export
+in its own build. The browser reference instead ships a small `:root` adapter
+inside the `ff-token-adapter` CSS layer, followed by the `ff-documentation` layer.
+It preserves the exported `--color-*`, `--font-*`, `--text-*`, `--radius-*`, and
+`--spacing-*` names and values, including the associated `--text-*--line-height`
+metadata. The export helper normalizes the upstream CLI's font lists before
+writing reusable tokens, so both consumers receive the same fallback order.
+
+When tokens change, run `php scripts/export-design.php --tokens-only` first.
+This explicit preparation mode writes normalized exports without checking the
+browser adapter, which still contains the previous values. Update this
+adapter from `theme.css`, and review the normalization of font stacks. Compare
+every adapted declaration with the export, then inspect both reading palettes.
+Do not hand-edit generated exports to make this reference render.
+Refresh the stylesheet's byte count and digest in the asset manifest, then run
+the asset validator. CI always uses the complete `--check` mode.
+
+## Components
+
+| Component | Contract and classes | Behavior |
+| --- | --- | --- |
+| Page shell | `.ff-docs`, `.ff-docs-shell`, `.ff-docs-content` | Centered, maximum 1200px width. One `main` landmark and one page H1. |
+| Skip link | `.ff-docs-skip`, target `#main` | First focusable link; target can receive focus. |
+| Navigation rail | `.ff-docs-rail`, `.ff-docs-navigation`, `.ff-docs-nav-link` | Semantic `nav` inside native `details`/`summary`. `aria-current="page"` marks the actual page. |
+| Breadcrumb | `.ff-docs-breadcrumb` | A labelled `nav` with an ordered list; the last item identifies the page. |
+| Heading and prose | `.ff-docs-article`, `.ff-docs-kicker`, `.ff-docs-lead`, `.ff-docs-page-meta` | Sentence case, about 70 characters per reading line, system fonts, meaningful heading order. |
+| Code panel | `.ff-docs-code`, `.ff-docs-code-header`, `pre > code` | Selectable, horizontally scrollable text. The scroll area receives keyboard focus. No shell prompt or decoration inside copyable code. |
+| Copy control | `.ff-docs-copy`, `.ff-docs-copy-status` | Optional enhancement: hidden without JS, copies `textContent`, announces results through `role="status"`. Clipboard failure selects code for manual copying. |
+| Callout | `.ff-docs-callout`, optional `data-kind="important"` | A short named note with real text. Important notes have a complete visible boundary. Ordinary notes are not live announcements. |
+| Package card | `.ff-docs-package`, `.ff-docs-package-name` | Exact Composer package name, one responsibility, and a real destination. No unverified badge, metric, or availability claim. |
+| Page contents | `.ff-docs-toc` | Labelled anchor navigation to real section IDs. `aria-current="location"` follows the URL fragment, not an invented scroll position. |
+| Learning companion | `.ff-docs-companion` | The principal developer family of Dash, original proportions, and brief supporting text. Keep the secondary softer family in its own compositions. The mascot does not carry an instruction or replace the page title. |
+| Page footer | `.ff-docs-page-footer` | Useful next-step or source links, with meaningful labels. |
+
+## Responsive and accessible behavior
+
+At wide sizes, navigation, prose, and the secondary column form three zones.
+Below 1080px, the secondary column follows the article. Below 760px, the rail
+becomes a compact header with a native navigation disclosure. The reference
+enhancement initially collapses it on narrow screens and keeps it open on wide
+screens. Without JavaScript, the native disclosure remains open and operable.
+
+Use controls at least 44px high. Preserve visible keyboard focus: violet on
+light reading surfaces and cyan on navy. Keep the reading column first in the
+article/aside source order. Retain text labels alongside any visual state.
+Do not add mascot animation behind prose; the reference has no animation and
+includes a reduced-motion rule for consumers that add motion.
+
+The copy enhancement announces success or a manual fallback. On mobile, choosing
+an in-page navigation link closes the disclosure and focuses its real target.
+Escape closes an open mobile disclosure and returns focus to its summary. Do
+not convert this disclosure into a modal without implementing modal semantics.
+
+Review keyboard order, fragment links, both palettes, enlarged text, narrow
+viewports, no-JS navigation, code selection, and clipboard failure. Text and
+focus contrast must follow `DESIGN.md`; a good token pair alone does not prove
+the complete page meets accessibility requirements.
+
+## Framework adapters
+
+| Consumer | Mapping | Ownership |
+| --- | --- | --- |
+| Plain HTML or a static documentation generator | Render these semantic elements and `ff-docs-*` classes; replace example URLs with real routes. | Consumer owns templates, search, route generation, and release content. |
+| Bootstrap | Keep the scoped shell and reading classes. Map tokens to Bootstrap variables in the consumer's theme; use a local adapter for control semantics rather than stacking conflicting utility rules. | Consumer chooses Bootstrap version and integration. This pattern imports none. |
+| React | Map `class` to `className`; render breadcrumbs/navigation from data, keep code text as a string, and implement copy/theme/disclosure state in the application's components. | Consumer owns state and cleanup of listeners. Do not inject the specimen's inline script into React. |
+| Tailwind | Process the cataloged `@theme` export, then apply or translate the component rules. Resolve token layer precedence once. | Consumer owns Tailwind/build tooling; this reference requires neither. |
+
+Keep framework-specific adapters in the consuming repository until a reusable,
+versioned adapter is deliberately added to this design system. Changing this
+pattern does not deploy a documentation site or modify a package runtime.
+
+## Example provenance and validation
+
+The installation command, PHP minimum, and bootstrap example were checked against
+`php-fast-forward/framework` at commit
+[`dac7ef8e4cfd8d39f36d526a6a4345958bcc83eb`](https://github.com/php-fast-forward/framework/tree/dac7ef8e4cfd8d39f36d526a6a4345958bcc83eb),
+using its [README](https://github.com/php-fast-forward/framework/blob/dac7ef8e4cfd8d39f36d526a6a4345958bcc83eb/README.md),
+`composer.json`, and `FrameworkServiceProvider` source. They were source-verified;
+this reference does not execute the PHP application or install its dependencies.
+Recheck the consumer's target release before publishing the examples there.
+
+The stylesheet and inline enhancement were authored for this repository. The
+reference uses local `fast-forward-logo-dark.svg` and `dash-developer-reading.png`; Dash is
+the Fast Forward fox. Artwork status and reuse rights remain governed by the
+[asset catalog](../../assets/README.md). Root asset validation and final browser
+review belong to the integrated delivery, including its links and manifest.
diff --git a/docs/brand/ecosystem.html b/docs/brand/ecosystem.html
new file mode 100644
index 0000000..124b8fe
--- /dev/null
+++ b/docs/brand/ecosystem.html
@@ -0,0 +1,123 @@
+
+
+
+
+
+
+ Dash ecosystem · PHP Fast Forward
+
+
+
+
+ Skip to content
+
+
+
+
+
+
+
+
+
Developer collection · 19 contextual applications
+
Dash across the ecosystem.
+
A different job in every repository. These reviewed scenes connect Dash to reusable resources, time, services, web messages and the tools that keep development moving.
+
+
+
A familiar developer, with a purpose.
Character anatomy follows the developer welcome/build references. Each scene explains a repository's context through its pose, props and composition.
+
+
+
+ agents
A library of reusable roles
Dash organizes reusable agent roles and skill resources.
The contextual catalog preserves the exact prompts, canonical input hashes, dimensions and pinned consumer source commits.
+
All nineteen central copies match the consumer PNG bytes and generation receipts. The linked consumer PRs were open at the 2026-10-05 audit; the documentation template uses its follow-up PR after the original artwork PR was merged.
+
These are contextual applications of the primary Dash developer collection. The character matrix remains the anatomy reference, and the native fox signature supplies the logo masters.
+
Consumer READMEs use a repository-relative image path. Their package archives exclude /docs/ and /README*.md; prompts, provenance and receipts stay in this identity kit.
Dash developer is the primary reference. The new editorial collection is an intentional softer alternative. Each master keeps its own face, proportions, and finish across poses.
01
Warm, curious face
Amber/brown eyes, a small dark nose, rounded cream cheeks, and a friendly expression.
02
Orange + cream
Orange fur and forehead tuft. Cream muzzle, chest, inner ears, and tail tip.
03
A readable silhouette
Large triangular ears, dark paws, a full sweeping tail, and warm brown contours.
04
Context has a job
Books explain learning. A wave welcomes. The purple hoodie connects Dash to the developer ecosystem.
+
02 / Dash pose matrix
One reference. Different useful moments.
Developer is the main identity. Editorial is the secondary collection for welcoming, community, and softer institutional moments. Choose a collection, then a pose; keep its face and finish together.
A robust developer studio inspired by the equipment in the maintainer's desk reference. This scene has an intentional opaque navy background; the personal source photo stays outside the repository.
Review the face, one-tail anatomy, complete silhouette, props, and light/navy rendering before selecting a cutout. The workstation uses its own opaque studio background. Compose exact code, titles, and reviewed logos separately. The portrait study is an additional proposal for logo applications; it does not join this pose matrix.
+
+
+
03 / Visual system
Forward energy. Calm reading.
Violet, blue, and cyan carry the institutional direction. Warm fox colors bring approachability. Exact UI values live in DESIGN.md.
Signature orange is #FF641B; illustration fur keeps its own warm orange reference. The logo is a native vector asset. Dash illustrations remain raster artwork, with explicit provenance and rights records.
+
+
04 / Shared surfaces
The same identity, where people work.
A shared signature, a quiet documentation surface, and useful character moments. The production examples use the current logo and selected Dash master.
Organization profile
English is the default, with Portuguese and Spanish versions linked from every profile.
Curated roles and skill resources become a clear team map.
A code quality workshop
Tests, style, refactoring and documentation share one purposeful workspace.
+
+
+
+
+
diff --git a/docs/brand/logo-compositions.html b/docs/brand/logo-compositions.html
new file mode 100644
index 0000000..f924ee1
--- /dev/null
+++ b/docs/brand/logo-compositions.html
@@ -0,0 +1,63 @@
+
+
+
+
+
+
+ Logo compositions · PHP Fast Forward
+
+
+
+
+ Skip to content
+
+
+
+
+
+
+
+
+
Selected direction · Fox in motion
+
A familiar face. A forward gesture.
+
The fox links the signature to Dash. Orange gives Fast its energy; compact italic lettering carries the framework's technical character.
+
+
+
The primary signature.
Solid orange, cream and ink. Every letter is a vector path. The signature renders consistently without installed fonts or raster artwork.
+
+
+ Color · light surfacesUse the complete signature when the framework name needs to be read. Keep the fox, PHP line, lettering and spacing together.
+
+
All variants share the same symbol, outlined lettering and spacing. Monochrome muzzle details are transparent cutouts.
+
+
Color · dark surfacesWhite lettering and rear ear retain contrast on navy. Download SVG
+
Ink · one colorFor print, restrained institutional applications and production in a single ink. Download SVG
+
White · one colorFor dark covers and surfaces with sufficient contrast. Download SVG
+
The fox on its ownUse the symbol for avatars and compact contexts where the name is already present. Start at 32 pixels; keep the full signature at least 200 pixels wide.
+
The logo identifies the framework. Mature Dash brings personality to repository covers, documentation and developer stories. Editorial Dash remains available for welcoming community moments.
+ Organization profileA composed raster cover with native vector lettering and the selected mature Dash illustration. View editable composition
+ DocumentationThe same signature and tokens carry into documentation. Open the interactive pattern
+
+
+
Keep it recognizable.
The source file and generator establish the production master. Use the exported variants as a unit.
+
Reserve clear space of at least one quarter of the fox's height on all sides.
Preserve proportions, lettering, orange Fast, and the gap between the two words.
Use the dark-surface or white export on navy. Give the mark a plain, contrasting surface.
Keep Dash's character anatomy anchored to the mascot matrix; the flat symbol is a separate brand asset.
+
+
+
+
+
diff --git a/docs/brand/logo-compositions.md b/docs/brand/logo-compositions.md
new file mode 100644
index 0000000..3d03468
--- /dev/null
+++ b/docs/brand/logo-compositions.md
@@ -0,0 +1,28 @@
+# PHP Fast Forward logo compositions
+
+Direction **F / Fox in motion** was selected by the maintainer on 2026-10-03: the right-facing fox, orange **Fast**, and a matching monochrome signature. The native production reconstruction is presented with its applications before publication.
+
+The fox connects the framework to Dash. It is a flat brand symbol with a forward curl, not a character turnaround. Mature developer Dash remains the primary illustration; editorial Dash remains the secondary collection for welcoming and softer institutional moments.
+
+## Production masters
+
+- [Color signature](../../assets/brand/fast-forward-logo.svg) for light surfaces.
+- [Dark-surface signature](../../assets/brand/fast-forward-logo-dark.svg), with white lettering and rear ear.
+- [Ink signature](../../assets/brand/fast-forward-logo-ink.svg) and [white signature](../../assets/brand/fast-forward-logo-white.svg), each using one visible ink and transparent muzzle cutouts.
+- Matching standalone marks: [color](../../assets/brand/fast-forward-mark.svg), [dark](../../assets/brand/fast-forward-mark-dark.svg), [ink](../../assets/brand/fast-forward-mark-ink.svg), [white](../../assets/brand/fast-forward-mark-white.svg).
+
+All eight exports share geometry and spacing. [logo-source.json](../../assets/brand/logo-source.json) contains authored fox paths, font glyph outlines and layout. [build-brand-logos.php](../../scripts/build-brand-logos.php) generates the exports with native PHP; `--check` verifies reproducibility and source font digests. No installed font, remote font, live text, embedded raster, or generation service is needed to render the SVGs.
+
+Lettering uses **Exo 2 Italic, weight 900**, outlined during authoring with fontTools. This is the selected production typeface, not an identification of the earlier bitmap lettering. Its original variable font, [OFL license](../../assets/brand/source/OFL-Exo2.txt), pinned upstream commit, version and file hashes are preserved in [source/font-source.json](../../assets/brand/source/font-source.json). The temporary authoring tool is not a runtime dependency of the repository.
+
+## Applications and use
+
+The [visual reference](logo-compositions.html) shows color and monochrome masters, symbol sizes, and the updated organization cover and documentation pattern. Use the complete signature at 200 pixels or wider; use the standalone mark at 32 pixels or wider when the name is already present. Reserve clear space of at least one quarter of the symbol height. Preserve the proportions and the gap between Fast and Forward.
+
+The cover is a composed PNG export from [profile-banner.html](profile-banner.html): the reviewed SVG signature and selected raster Dash illustration remain independently editable. Documentation uses the same signature and shared navigation. Profiles use light/dark SVGs and retain English, Portuguese and Spanish language links.
+
+## Retired artwork
+
+Earlier logo files, the concept board and screenshots containing the previous global signature have been removed from the active library. Hash-verified recovery copies exist only in the ignored local backup. `archived_sources` in the asset manifest retains provenance metadata without distributing those files or requiring a local backup in CI. Raw generation briefs remain historical evidence; their source availability is annotated rather than rewriting the original prompt.
+
+The [generation receipt](logo-generation.json) records direction F's selection and the native reconstruction. [GitHub Pages](pages.md) publishes the current preview kit through a staged artifact, excluding recovery backups.
diff --git a/docs/brand/logo-generation.json b/docs/brand/logo-generation.json
new file mode 100644
index 0000000..a00e23b
--- /dev/null
+++ b/docs/brand/logo-generation.json
@@ -0,0 +1,85 @@
+{
+ "schema_version": 1,
+ "date": "2026-10-03",
+ "brand": "PHP Fast Forward",
+ "records": [
+ {
+ "id": "fast-forward-logo-concepts",
+ "status": "direction-selected",
+ "destination": "assets/brand/fast-forward-logo-concepts.png",
+ "date": "2026-10-03",
+ "generator": {
+ "tool": "image_gen.imagegen",
+ "mode": "built-in",
+ "model": "not exposed by the tool",
+ "version": "not exposed by the tool"
+ },
+ "prompt": "Act as a thoughtful identity designer creating a first-round concept sheet for PHP Fast Forward, a PHP framework and ecosystem of small composable libraries. Its enduring ideas are interoperability through shared interfaces, explicit composition, portable boundaries, proven foundations and less ceremony. It helps a developer understand how useful pieces fit together and find the next useful step. The name carries forward movement, but the identity must not imply an unproven benchmark or performance promise. The audience is independent developers and engineering teams; the tone is confident, approachable and technically literate.\n\nCreate THREE DISTINCT NEW LOGO DIRECTIONS, presented as a clean professional landscape identity-study board with three equally sized columns on a pure off-white background. Each column has a large horizontal logo at the top, a standalone symbol at the center, and a smaller one-color black rendition at the bottom. Lots of whitespace and precise optical spacing. Number the columns E, F and G with small restrained labels; no other explanatory paragraphs.\n\nFor inspiration, image 1 is the historical lettering: it has a distinctive heavy slightly oblique technical personality. You may reinterpret that personality in fresh legible lettering, but do NOT preserve its rainbow gradient or copy its existing mark. Image 2 is Dash, the current fox companion; it informs the orange/cream fox identity for an optional simplified flat symbol only. Do NOT put a full rendered 3D mascot into these logos.\n\nExplore genuinely different visual ideas, not just different colors:\nE: an abstract composable forward symbol from a small number of interlocking geometric pieces; disciplined solid violet/ink palette; a distinctive bold technical wordmark.\nF: a memorable professional fox-inspired emblem that subtly incorporates a forward gesture, with orange, cream and deep ink; intelligent clean reduction, avoiding a generic cute cartoon head. Pair it with a coherent distinctive wordmark.\nG: an energetic yet calm typographic or FF monogram direction, using negative space and purposeful motion; keep the mark readable at small sizes and independent of the mascot, with a solid ink/violet palette.\n\nThe exact brand name in every horizontal logo is \"PHP Fast Forward\". PHP may be smaller but must stay readable. Give the wordmark character through proportion, custom-cut details and restrained obliqueness rather than extra decoration. All three directions must remain credible in solid black. Flat graphic shapes, strong silhouettes, no gradients, no 3D effects, no shadows, no mockup merchandise, no badges, no watermarks, no extra slogans. Deliver one high-resolution opaque PNG concept board. These are creative bitmap studies for review, not final vector masters.",
+ "sources": [
+ {
+ "path": "assets/brand/wordmark-light.png",
+ "sha256": "687896b5ff7aa712e5e5d4a60fe11cdf120e24e7fb78a614d5a4c2e7a504f36f",
+ "role": "Historical lettering personality; font name unrecorded",
+ "included_in_public_kit": false,
+ "availability": "local-backup-not-distributed",
+ "archived_source_id": "brand-wordmark-light"
+ },
+ {
+ "path": "assets/mascot/dash-developer-welcome.png",
+ "sha256": "38b2c5bb87c94326bcab6463f74fc785414d8539e9175e088b5a5c797a466e09",
+ "role": "Current Dash orange/cream context for optional simplified emblem",
+ "included_in_public_kit": true
+ }
+ ],
+ "output": {
+ "sha256": "c5586c01fa8d3abe9986d17d3e9a1125ccefd0802f737c90e1c5b4dc9d44be56",
+ "bytes": 1046074,
+ "width": 1774,
+ "height": 887,
+ "mode": "RGB",
+ "has_alpha": false,
+ "generator_artifact": "exec-13e55a13-2ebc-46d2-964c-2adc160e1280.png",
+ "transparent_background": false,
+ "availability": "local-backup-not-distributed",
+ "archived_source_id": "fast-forward-logo-concepts",
+ "included_in_public_kit": false
+ },
+ "review": {
+ "status": "direction-selected",
+ "date": "2026-10-03",
+ "selection": "Direction F selected by the maintainer; this bitmap board is historical concept evidence, not a distributed native master.",
+ "transparency": "Pillow loaded the original PNG; opaque background is intentional; no pixels were modified.",
+ "opacity_inspection": {
+ "alpha_channel": false,
+ "background": "Intentional opaque scene/background, stored as RGB."
+ },
+ "lettering": "Generated raster lettering; font is not identified. Reconstruct and review exact typography before a final logo master.",
+ "geometry": "Review directions separately; create native vector geometry only after selection. This board does not redefine canonical Dash.",
+ "visual_inspection": {
+ "date": "2026-10-03",
+ "reviewer": "coordinating repository agent",
+ "scope": "Render and layout inspection before the maintainer selected direction F; this inspection is not a separate approval decision.",
+ "evidence": "Coordinating repository agent inspected the native generated board and confirmed browser rendering at its 1774:887 aspect ratio without broken images. Logo review page at 390px had no horizontal overflow and exactly one aria-current navigation item.",
+ "selection": "The maintainer subsequently selected direction F on 2026-10-03. The record's selection contains the decision evidence; this bitmap board remains historical concept material, not a distributed native master."
+ }
+ },
+ "directions": [
+ "E",
+ "F",
+ "G"
+ ],
+ "asset_type": "opaque-bitmap-logo-concept-board",
+ "publication": "local-not-published",
+ "availability": "local-backup-not-distributed",
+ "archived_source_id": "fast-forward-logo-concepts",
+ "included_in_public_kit": false,
+ "selection": {
+ "direction": "F",
+ "status": "direction-selected",
+ "date": "2026-10-03",
+ "evidence": "Maintainer selected the fox direction with Fast in orange and its monochromatic rendition.",
+ "publication": "local-not-published"
+ }
+ }
+ ]
+}
diff --git a/docs/brand/mascot-production.md b/docs/brand/mascot-production.md
new file mode 100644
index 0000000..480c006
--- /dev/null
+++ b/docs/brand/mascot-production.md
@@ -0,0 +1,113 @@
+# Producing consistent Dash artwork
+
+Read [DESIGN.md](../../DESIGN.md), [SOUL.md](../../SOUL.md), [STYLE.md](../../STYLE.md),
+and the [pose matrix](index.html#matrix). Use the versioned
+[dash-art skill](../../skills/dash-art/SKILL.md) for a new repository illustration.
+The [manifest](../../assets/manifest.json) resolves each reference to actual bytes.
+
+## Reference hierarchy
+
+| Priority | Manifest ID | What it establishes |
+| --- | --- | --- |
+| Primary developer master | `dash-developer-welcome` | Default face, upright proportions, dimensional fur/cloth, hoodie, one tail. |
+| Same-collection support | `dash-developer-reading`, `dash-developer-guide`, `dash-developer-build` | Learning, presenting, and composing poses with the developer identity. |
+| Secondary editorial master | `dash-editorial-hoodie` | Newly authored cute face, compact proportions, painted contours and hoodie. |
+| Same-collection support | `dash-editorial-reading`, `dash-editorial-guide`, `dash-editorial-build` | Editorial learning, presenting, and composing poses. |
+| Costume/context evidence | `reference-package-event-dispatcher`, `reference-package-fork`, `reference-package-dev-tools` | Established developer banner family; their text is not an API specification. |
+| Historical comparison | `reference-package-enum`, `reference-package-framework`, legacy profile URLs | Recorded older interpretations; not substitutes for the current masters. |
+
+**Developer is the default.** Editorial is a deliberate secondary choice for
+welcoming, community, or a softer institutional application. Supply the actual
+master for the selected collection; a text description alone is insufficient.
+Keep that collection's face, proportions, and rendering together. The original
+cute source-pack exports are archived in the ignored local backup.
+
+## Delivered pose matrix
+
+| Context | Pose / prop | Developer | Editorial |
+| --- | --- | --- | --- |
+| Welcome / appreciation | Open-paw greeting | [Welcome](../../assets/mascot/dash-developer-welcome.png) | [Welcome](../../assets/mascot/dash-editorial-hoodie.png) |
+| Documentation / learning | Plain open book | [Reading](../../assets/mascot/dash-developer-reading.png) | [Reading](../../assets/mascot/dash-editorial-reading.png) |
+| Explanation / next step | Open-paw guiding gesture | [Guiding](../../assets/mascot/dash-developer-guide.png) | [Guiding](../../assets/mascot/dash-editorial-guide.png) |
+| Composition / building | Two plain connected blocks | [Composing](../../assets/mascot/dash-developer-build.png) | [Composing](../../assets/mascot/dash-editorial-build.png) |
+
+These eight images are selected reference poses with real alpha. They are not a
+front/side/back orthographic model sheet. New hidden anatomy remains authored
+interpretation requiring visual review.
+
+## Pose proposals for review
+
+The new developer scenes retain review status `awaiting-review`. They were
+initially local, unpublished drafts; the maintainer's later Pages request
+authorizes display as labeled proposals in the brand review gallery. Catalog
+and generation receipts record this separate publication scope, with deployment
+pending the workflow reaching `main`. They remain exploratory candidates until
+a deliberate selection. The eight selected poses above still define the current
+reference matrix; a generated scene does not replace its identity master.
+
+| Proposal | Intended context | Local PNG |
+| --- | --- | --- |
+| Coding | Programming, tutorials, and practical repository examples | [Coding scene](../../assets/mascot/dash-developer-coding.png) |
+| Debugging | Troubleshooting, diagnosis, and finding a useful next step | [Debugging scene](../../assets/mascot/dash-developer-debugging.png) |
+| Explaining | Teaching a concept or showing component composition | [Explaining scene](../../assets/mascot/dash-developer-explaining.png) |
+| Workstation | Repository features and developer studio scenes with a robust equipment setup | [Workstation scene](../../assets/mascot/dash-developer-workstation.png) |
+
+Compare these four scenes with the selected developer master in the
+[new-pose review section](index.html#new-poses). Check likeness, eyes, limbs,
+single-tail anatomy, complete edges, props, and actual transparency on light
+and navy. Add exact commands, code, labels, and reviewed emblems through
+separate composition; the illustration does not establish an API contract.
+
+Coding, debugging, and explaining are transparent cutouts. The workstation is
+an intentionally opaque navy studio scene with multiple displays, a tablet,
+audio equipment, lighting, and developer peripherals. Its second input was a
+user-supplied desk photo used only for equipment density and arrangement. The
+personal photo remains outside the repository; its receipt records a logical
+local-only reference and hash rather than a personal filesystem path. Screen
+graphics are generated illustration, not executable code or software evidence.
+
+The [developer portrait study](../../assets/mascot/dash-developer-portrait-study.png)
+is an **additional illustration draft**. Compare it with the
+[selected logo applications](logo-compositions.html); the native fox logo does
+not use this portrait. It is not a standalone pose master or a replacement for
+the selected developer welcome reference.
+Existing selected poses remain until deliberate review and an
+explicit catalog update. The maintainer authorized the five review-gallery
+drafts for the public brand gallery on 2026-10-05. The Pages workflow publishes
+that gallery from main; gallery publication does not select a draft as a
+canonical character reference.
+
+## Brief and production
+
+Specify audience, purpose, collection, package, pose, minimal props, background,
+text space, format and destination. Use the matching master plus a relevant
+same-collection pose. Preserve amber/brown eyes, orange and cream markings,
+triangular ears, nose, paws, exactly one cream-tipped tail, and the purple hoodie
+with two cream drawstrings. Keep the shared chest plain; separately compose a
+reviewed package emblem when needed. The skill's
+[prompt/receipt template](../../skills/dash-art/references/prompt-and-receipt.md)
+contains the reusable production fields.
+
+Use the image capability for raster illustration. Add exact titles, commands,
+code and marks through deterministic composition afterward. Reserve clean
+space for this text; do not use banner screenshots as evidence for product APIs.
+New filenames and recorded sources preserve the identity chain.
+
+For a cutout, inspect actual transparent pixels and the silhouette on light and
+navy. Hidden RGB values in alpha-zero pixels do not form a visible background;
+look for visible edge haze, clipping or a painted checkerboard in the rendered
+result. Compare face, markings, eyes, hoodie, limbs, and tail at the intended
+size. A file-integrity pass cannot establish likeness or licensing.
+
+The [generation receipts](dash-generation.json) contain the exact prompts,
+source hashes, tool information exposed, edits, and output identities used for
+this collection. Built-in image generation produced the raster files; no model
+identifier was asserted when the tool did not expose it.
+
+## Next reference work
+
+A deliberate future sheet can add expressions and orthographic front/profile/
+back views per collection. Keep the developer and editorial sheets separate and
+review each new view before promoting it to the kit. Record rights, source/tool
+information and any separately composed font or symbol. Logo lettering masters
+and broader source-rights work remain tracked in issue #8.
diff --git a/docs/brand/pages.md b/docs/brand/pages.md
new file mode 100644
index 0000000..37278dd
--- /dev/null
+++ b/docs/brand/pages.md
@@ -0,0 +1,131 @@
+# Publishing the brand library with GitHub Pages
+
+The [Brand Pages workflow](../../.github/workflows/brand-pages.yml) stages this
+repository's public visual library and deploys it with the official GitHub Pages
+Actions. The [library](index.html), [logo applications](logo-compositions.html),
+and [documentation specimen](documentation.html) keep their repository-relative
+paths, so they work under a project site's base path.
+
+The repository's configured project-site URL is
+`https://php-fast-forward.github.io/.github/`. The deployment job reports the
+actual URL through its `github-pages` environment. If the repository uses a
+custom domain, use that reported URL instead.
+
+## Repository setup
+
+This repository uses **Settings → Pages → Build and deployment → Source →
+GitHub Actions**, with HTTPS enforced. Its `github-pages` environment allows
+deployments from the `main` branch. These settings were verified on 2026-10-04;
+the first publication still requires the workflow to run from `main`.
+
+When adopting this workflow in another repository, an administrator or
+maintainer must enable GitHub Actions as the Pages source and configure its
+deployment environment according to that repository's review and deployment
+policy.
+
+The workflow reads the existing Pages configuration with `enablement: false`.
+It does not enable Pages automatically or require an administration token.
+Deployment fails with a setup message if Pages has not been enabled.
+
+See GitHub's documentation for [publishing sources](https://docs.github.com/en/pages/getting-started-with-github-pages/configuring-a-publishing-source-for-your-github-pages-site)
+and [custom Pages workflows](https://docs.github.com/en/pages/getting-started-with-github-pages/using-custom-workflows-with-github-pages).
+
+## Build and deployment behavior
+
+- Pull requests validate the brand inventory, native logo exports, design token
+ exports and browser adapter, exercise publication boundaries, build the site,
+ and upload an artifact. They do not deploy.
+- Relevant pushes to `main` build and deploy the library.
+- A manual run from **Actions → Brand Pages → Run workflow** deploys only when
+ run from `main`. Runs from another branch build without deploying.
+- The build job has `contents: read`. Only the deployment job also receives
+ `pages: write` and `id-token: write`.
+- Actions are pinned to full commit SHAs. Deployment concurrency does not cancel
+ an active run. Only `main` uses the shared deployment group; PR and manual
+ feature-branch runs have ref-specific groups. Uploaded artifacts expire after
+ one day.
+
+## Publication boundary
+
+The [staging script](../../scripts/build-brand-pages.php) copies the HTML, public
+guides and receipts in `docs/brand`, approved root guides, the asset guide,
+token exports, and cataloged active assets. Canonical, package-variant,
+reference support files, and explicitly labeled exploratory artwork retain
+their classifications in the filtered Pages asset manifest.
+
+Current contextual repository examples under `references/ecosystem/` are
+included only when their manifest records explicitly authorize the public
+library. The ecosystem gallery shows those 19 images. Historical references
+remain repository links, and local archives are excluded.
+
+Exploratory assets awaiting review are excluded unless their catalog records
+explicitly authorize `brand-review-gallery` display through a
+`maintainer-request`. The five developer scene proposals have this separate
+authorization following the request to publish these asset-visualization pages;
+they remain labeled proposals and are not promoted to canonical references.
+
+The two cataloged profile applications, `brand-hero-banner.png` and
+`docs-installation.png`, retain their `profile/assets` paths. Public font
+sources, their license and metadata, and the logo build script are available
+when present. The multilingual profile sources are included for guide links.
+Guides remain readable Markdown source files; this workflow adds no Markdown
+renderer or application runtime.
+
+The eight selected logo exports and both profile applications explicitly record
+the maintainer's authorization for `brand-public-library` publication. Their
+earlier `local-not-published` state remains historical metadata; authorization
+does not claim that a deployment has occurred. Records still carrying the
+current `local-not-published` state are excluded, even when canonical.
+
+When `publication` is present, the builder accepts only an authorization record
+with `maintainer-request`, nonempty `recorded_at` and `evidence`, and a recognized
+scope. `brand-public-library` also requires `status: authorized`.
+`brand-review-gallery` applies only to exploratory, awaiting-review proposals
+with `canonical_selection: false`. Unknown strings, scopes, incomplete records
+and other value types are excluded. Absent metadata retains the existing active
+asset policy; an absent record never authorizes an awaiting-review proposal.
+
+Resources loaded by the HTML specimens must belong to the selected local kit.
+External image, script and stylesheet URLs block the build; external navigation
+links remain available. In the staged Markdown sources, remote badge images
+become their text labels inside the existing links, and other remote Markdown
+images become explicit links. The repository READMEs keep their original badges.
+
+The site does not copy `backup/`, `references/`, private directories, historical
+assets marked `legacy`, uncataloged artwork, or the untracked social preview.
+Reference images in the local specimen become explicit repository links in
+the staged copy, rather than automatically loaded images. Files published in
+the library keep relative links; other public source links point to the exact
+GitHub commit used by the build.
+
+In the filtered manifest, `provenance.source_ids` resolves only to IDs in its
+`assets` or `archived_sources` registry. IDs whose source records remain outside
+the site move to `provenance.repository_source_ids`, with
+`provenance.repository_manifest` pointing to the complete repository manifest at
+the build's source ref. This preserves every source ID without publishing the
+reference files. Source hashes, dates, and rights metadata remain unchanged;
+the repository manifest remains the complete asset record.
+
+Before upload, the builder checks asset hashes, symlink boundaries, local media,
+HTML links, and HTML anchors. It refuses to overwrite a nonempty destination.
+The brand validator remains the source inventory check; building the site does
+not change asset approval or licensing status.
+
+## Preview the staged site locally
+
+From the repository root, with Python 3 available:
+
+```sh
+php scripts/validate-brand.php
+composer test -- --filter BrandPagesTest
+php scripts/build-brand-pages.php --output-dir _site
+php -S 127.0.0.1:8765 -t _site
+```
+
+Open `http://127.0.0.1:8765/`. The root page redirects to
+`docs/brand/index.html`. For another build, choose a new empty destination;
+the script deliberately leaves an existing output directory untouched.
+
+Inspect the staged artifact before adopting workflow changes. A successful
+local build confirms files and links; the Actions deployment result confirms
+publication on GitHub Pages.
diff --git a/docs/brand/profile-banner.html b/docs/brand/profile-banner.html
new file mode 100644
index 0000000..bffe198
--- /dev/null
+++ b/docs/brand/profile-banner.html
@@ -0,0 +1,24 @@
+
+
+
+
+
+ Organization cover · PHP Fast Forward
+
+
+
+
+
+
+
+
Small pieces. Useful progress.
+
A PHP ecosystem built around composition, shared interfaces, and less ceremony.
+
ComposableInteroperablePortable
+
+
+
+
+
+
diff --git a/docs/brand/repository-artwork.json b/docs/brand/repository-artwork.json
new file mode 100644
index 0000000..07e0571
--- /dev/null
+++ b/docs/brand/repository-artwork.json
@@ -0,0 +1,1237 @@
+{
+ "schema_version": 1,
+ "date": "2026-10-05",
+ "description": "Repository-specific applications of the approved Dash developer collection; provenance is maintained in this central kit.",
+ "artwork": [
+ {
+ "pull_request": "https://github.com/php-fast-forward/agents/pull/4",
+ "schema_version": 1,
+ "asset": "docs/_static/mascot-banner.png",
+ "repository": "php-fast-forward/agents",
+ "collection": "developer",
+ "character": "Dash",
+ "source_kit_commit": "654e4a463533f1d8b8223369b3b0bbc1a4a0badf",
+ "references": [
+ {
+ "id": "dash-developer-welcome",
+ "path": "assets/mascot/dash-developer-welcome.png",
+ "sha256": "38b2c5bb87c94326bcab6463f74fc785414d8539e9175e088b5a5c797a466e09"
+ },
+ {
+ "id": "dash-developer-build",
+ "path": "assets/mascot/dash-developer-build.png",
+ "sha256": "3cca06ae5f82e33a97855ddcb38b3e59c4b750743e7bdb16103a122c492ea303"
+ }
+ ],
+ "generation": {
+ "tool": "image_gen.imagegen",
+ "model": "not reported by tool",
+ "prompt": "Use case: stylized-concept. Asset type: contextual repository README illustration, landscape PNG around 1536x1024. Reference image 1 (dash-developer-welcome) is the authoritative face, anatomy and adult developer identity. Reference image 2 (dash-developer-build) only supports the established 3D materials and paws; do not copy its seated pose. Create a unique contextual illustration with one Dash, the PHP Fast Forward fox. Preserve mature developer proportions, amber/brown eyes, orange fur, cream muzzle/cheeks, forehead tuft, triangular dark-tipped ears, small dark nose, one complete fluffy cream-tipped tail, plain purple hoodie with exactly two cream drawstrings, polished 3D shading and detailed soft fur. Keep both ears, all limbs and the entire tail inside the canvas with safe margins. Friendly capable professional, never toddler/chibi. Clean high-end navy/violet developer environment with warm orange key lighting, subtle cyan accent highlights, excellent contrast at an 840px README width. Purposeful props and readable silhouette, restrained detail. No generated text, letters, numbers, code, package labels, hoodie emblems, logos, watermarks or multiple foxes. This must illustrate the specific software concept, not reuse a waving mascot portrait. Scene: Dash is a thoughtful coordinator in an agent-resource library. He arranges reusable role cards and folded instruction booklets on a collaboration planning wall, each card with a different simple abstract role symbol; connections form an organized team map. He selects one booklet from a tidy resource-bundle case. Show packaged prompts and skills as curated resources, not autonomous robots or several cloned foxes. Purpose: reusable Fast Forward agent prompts and skill assets.",
+ "transparent_background": false
+ },
+ "output": {
+ "sha256": "9fba44c597619d136eba58eb1af537226be6914804ae832c52d1dd77a51e2765",
+ "bytes": 2336856,
+ "dimensions": [
+ 1536,
+ 1024
+ ]
+ },
+ "visual_review": {
+ "status": "reviewed",
+ "checks": [
+ "Recognizable orange fox with cream muzzle and tail tip, amber eyes and plain purple hoodie",
+ "Single Dash and repository-specific scene",
+ "Readable at README size; no generated package title or logo"
+ ],
+ "limitations": "Contextual illustration, not an anatomy reference sheet."
+ },
+ "publication": {
+ "status": "authorized",
+ "authority": "maintainer-request",
+ "date": "2026-10-05",
+ "scope": "repository README and documentation",
+ "evidence": "Maintainer requested contextual Dash artwork for each implemented repository, public PRs, and replacement of the previous banner at docs/_static/mascot-banner.png."
+ },
+ "rights": "Generated for authorized repository identity work. Historical reference-art rights remain unrecorded; no independent third-party asset license is asserted.",
+ "id": "reference-dash-package-agents",
+ "context": "Dash organizes reusable agent roles and skill resources",
+ "central_copy": "references/ecosystem/agents.png",
+ "consumer_source": {
+ "repository": "php-fast-forward/agents",
+ "path": "docs/_static/mascot-banner.png",
+ "commit": "cd01df7bc3baa52a4fa91b27ab5d72bc7fa1b048",
+ "git_blob_sha": "3a8fa5aab0c92422aecc1e819ce400f10c9a1413",
+ "url": "https://github.com/php-fast-forward/agents/blob/cd01df7bc3baa52a4fa91b27ab5d72bc7fa1b048/docs/_static/mascot-banner.png",
+ "source_scope": "public-pull-request-head",
+ "verified_on": "2026-10-05"
+ }
+ },
+ {
+ "pull_request": "https://github.com/php-fast-forward/changelog/pull/12",
+ "schema_version": 1,
+ "asset": "docs/_static/mascot-banner.png",
+ "repository": "php-fast-forward/changelog",
+ "collection": "developer",
+ "character": "Dash",
+ "source_kit_commit": "654e4a463533f1d8b8223369b3b0bbc1a4a0badf",
+ "references": [
+ {
+ "id": "dash-developer-welcome",
+ "path": "assets/mascot/dash-developer-welcome.png",
+ "sha256": "38b2c5bb87c94326bcab6463f74fc785414d8539e9175e088b5a5c797a466e09"
+ },
+ {
+ "id": "dash-developer-build",
+ "path": "assets/mascot/dash-developer-build.png",
+ "sha256": "3cca06ae5f82e33a97855ddcb38b3e59c4b750743e7bdb16103a122c492ea303"
+ }
+ ],
+ "generation": {
+ "tool": "image_gen.imagegen",
+ "model": "not reported by tool",
+ "prompt": "Use case: stylized-concept. Asset type: contextual repository README illustration, landscape PNG around 1536x1024. Reference image 1 (dash-developer-welcome) is the authoritative face, anatomy and adult developer identity. Reference image 2 (dash-developer-build) only supports the established 3D materials and paws; do not copy its seated pose. Create a unique contextual illustration with one Dash, the PHP Fast Forward fox. Preserve mature developer proportions, amber/brown eyes, orange fur, cream muzzle/cheeks, forehead tuft, triangular dark-tipped ears, small dark nose, one complete fluffy cream-tipped tail, plain purple hoodie with exactly two cream drawstrings, polished 3D shading and detailed soft fur. Keep both ears, all limbs and the entire tail inside the canvas with safe margins. Friendly capable professional, never toddler/chibi. Clean high-end navy/violet developer environment with warm orange key lighting, subtle cyan accent highlights, excellent contrast at an 840px README width. Purposeful props and readable silhouette, restrained detail. No generated text, letters, numbers, code, package labels, hoodie emblems, logos, watermarks or multiple foxes. This must illustrate the specific software concept, not reuse a waving mascot portrait. Scene: Dash is a release editor assembling a clean history book. He sits on a tall stool at an editorial desk, gathering several separate small Markdown-like paper fragments carrying only abstract colored strokes into one open chronological release ledger. A tidy release timeline of cards arcs behind the desk and a closed review seal tray sits nearby. One paw places a fragment, one holds the ledger. Purpose: independent changelog fragments, reviewed consolidation and exact release notes, not arbitrary code writing.",
+ "transparent_background": false
+ },
+ "output": {
+ "sha256": "a5e740350c79961311f8d12ecac1831c69b5ca59dc86efc80a0109586e2a9239",
+ "bytes": 2033274,
+ "dimensions": [
+ 1536,
+ 1024
+ ]
+ },
+ "visual_review": {
+ "status": "reviewed",
+ "checks": [
+ "Recognizable orange fox with cream muzzle and tail tip, amber eyes and plain purple hoodie",
+ "Single Dash and repository-specific scene",
+ "Readable at README size; no generated package title or logo"
+ ],
+ "limitations": "Contextual illustration, not an anatomy reference sheet."
+ },
+ "publication": {
+ "status": "authorized",
+ "authority": "maintainer-request",
+ "date": "2026-10-05",
+ "scope": "repository README and documentation",
+ "evidence": "Maintainer requested contextual Dash artwork for each implemented repository, public PRs, and replacement of the previous banner at docs/_static/mascot-banner.png."
+ },
+ "rights": "Generated for authorized repository identity work. Historical reference-art rights remain unrecorded; no independent third-party asset license is asserted.",
+ "id": "reference-dash-package-changelog",
+ "context": "Dash consolidates release fragments into a history ledger",
+ "central_copy": "references/ecosystem/changelog.png",
+ "consumer_source": {
+ "repository": "php-fast-forward/changelog",
+ "path": "docs/_static/mascot-banner.png",
+ "commit": "323a35935609fbc4bbaec27490e8710403e69f22",
+ "git_blob_sha": "6c6ad10e9bc9b2a7840028ff38959c379ce58038",
+ "url": "https://github.com/php-fast-forward/changelog/blob/323a35935609fbc4bbaec27490e8710403e69f22/docs/_static/mascot-banner.png",
+ "source_scope": "public-pull-request-head",
+ "verified_on": "2026-10-05"
+ }
+ },
+ {
+ "pull_request": "https://github.com/php-fast-forward/clock/pull/1",
+ "schema_version": 1,
+ "asset": "docs/_static/mascot-banner.png",
+ "repository": "php-fast-forward/clock",
+ "collection": "developer",
+ "character": "Dash",
+ "source_kit_commit": "654e4a463533f1d8b8223369b3b0bbc1a4a0badf",
+ "references": [
+ {
+ "id": "dash-developer-welcome",
+ "path": "assets/mascot/dash-developer-welcome.png",
+ "sha256": "38b2c5bb87c94326bcab6463f74fc785414d8539e9175e088b5a5c797a466e09"
+ },
+ {
+ "id": "dash-developer-build",
+ "path": "assets/mascot/dash-developer-build.png",
+ "sha256": "3cca06ae5f82e33a97855ddcb38b3e59c4b750743e7bdb16103a122c492ea303"
+ }
+ ],
+ "generation": {
+ "tool": "image_gen.imagegen",
+ "model": "not reported by tool",
+ "prompt": "Use case: stylized-concept. Asset type: contextual repository README illustration, landscape PNG around 1536x1024. Reference image 1 (dash-developer-welcome) is the authoritative face, anatomy and adult developer identity. Reference image 2 (dash-developer-build) only supports the established 3D materials and paws; do not copy its seated pose. Create a unique contextual illustration with one Dash, the PHP Fast Forward fox. Preserve mature developer proportions, amber/brown eyes, orange fur, cream muzzle/cheeks, forehead tuft, triangular dark-tipped ears, small dark nose, one complete fluffy cream-tipped tail, plain purple hoodie with exactly two cream drawstrings, polished 3D shading and detailed soft fur. Keep both ears, all limbs and the entire tail inside the canvas with safe margins. Friendly capable professional, never toddler/chibi. Clean high-end navy/violet developer environment with warm orange key lighting, subtle cyan accent highlights, excellent contrast at an 840px README width. Purposeful props and readable silhouette, restrained detail. No generated text, letters, numbers, code, package labels, hoodie emblems, logos, watermarks or multiple foxes. This must illustrate the specific software concept, not reuse a waving mascot portrait. Scene: Dash is a precise timekeeper in a contemporary developer clock workshop. He holds a small warm analog clock with simple tick marks and no numerals in one paw, and adjusts a second glass-encased clock locked inside translucent ice with the other. A flowing warm timeline contrasts with a frozen cyan time marker. Dark violet studio, thoughtful attentive expression, elegant full-body three-quarter pose, complete single tail. The purpose is the distinction between SystemClock and FrozenClock for deterministic tests.",
+ "transparent_background": false
+ },
+ "output": {
+ "sha256": "33d5e5fb41e58824999aad9b2f6ca0ff2b3dd90caf6798072d985b013f019dde",
+ "bytes": 2200571,
+ "dimensions": [
+ 1536,
+ 1024
+ ]
+ },
+ "visual_review": {
+ "status": "reviewed",
+ "checks": [
+ "Recognizable orange fox with cream muzzle and tail tip, amber eyes and plain purple hoodie",
+ "Single Dash and repository-specific scene",
+ "Readable at README size; no generated package title or logo"
+ ],
+ "limitations": "Contextual illustration, not an anatomy reference sheet."
+ },
+ "publication": {
+ "status": "authorized",
+ "authority": "maintainer-request",
+ "date": "2026-10-05",
+ "scope": "repository README and documentation",
+ "evidence": "Maintainer requested contextual Dash artwork for each implemented repository, public PRs, and replacement of the previous banner at docs/_static/mascot-banner.png."
+ },
+ "rights": "Generated for authorized repository identity work. Historical reference-art rights remain unrecorded; no independent third-party asset license is asserted.",
+ "id": "reference-dash-package-clock",
+ "context": "Dash contrasts live and frozen clocks for deterministic tests",
+ "central_copy": "references/ecosystem/clock.png",
+ "consumer_source": {
+ "repository": "php-fast-forward/clock",
+ "path": "docs/_static/mascot-banner.png",
+ "commit": "33be1a9f588a21e5f9523251d9c29c14be2a77db",
+ "git_blob_sha": "32832bddcb6b6c93c791e847ffbac5fa5fe14250",
+ "url": "https://github.com/php-fast-forward/clock/blob/33be1a9f588a21e5f9523251d9c29c14be2a77db/docs/_static/mascot-banner.png",
+ "source_scope": "public-pull-request-head",
+ "verified_on": "2026-10-05"
+ }
+ },
+ {
+ "pull_request": "https://github.com/php-fast-forward/composer-installers/pull/10",
+ "schema_version": 1,
+ "asset": "docs/_static/mascot-banner.png",
+ "repository": "php-fast-forward/composer-installers",
+ "collection": "developer",
+ "character": "Dash",
+ "source_kit_commit": "654e4a463533f1d8b8223369b3b0bbc1a4a0badf",
+ "references": [
+ {
+ "id": "dash-developer-welcome",
+ "path": "assets/mascot/dash-developer-welcome.png",
+ "sha256": "38b2c5bb87c94326bcab6463f74fc785414d8539e9175e088b5a5c797a466e09"
+ },
+ {
+ "id": "dash-developer-build",
+ "path": "assets/mascot/dash-developer-build.png",
+ "sha256": "3cca06ae5f82e33a97855ddcb38b3e59c4b750743e7bdb16103a122c492ea303"
+ }
+ ],
+ "generation": {
+ "tool": "image_gen.imagegen",
+ "model": "not reported by tool",
+ "prompt": "Use case: stylized-concept. Asset type: contextual repository README illustration, landscape PNG around 1536x1024. Reference image 1 (dash-developer-welcome) is the authoritative face, anatomy and adult developer identity. Reference image 2 (dash-developer-build) only supports the established 3D materials and paws; do not copy its seated pose. Create a unique contextual illustration with one Dash, the PHP Fast Forward fox. Preserve mature developer proportions, amber/brown eyes, orange fur, cream muzzle/cheeks, forehead tuft, triangular dark-tipped ears, small dark nose, one complete fluffy cream-tipped tail, plain purple hoodie with exactly two cream drawstrings, polished 3D shading and detailed soft fur. Keep both ears, all limbs and the entire tail inside the canvas with safe margins. Friendly capable professional, never toddler/chibi. Clean high-end navy/violet developer environment with warm orange key lighting, subtle cyan accent highlights, excellent contrast at an 840px README width. Purposeful props and readable silhouette, restrained detail. No generated text, letters, numbers, code, package labels, hoodie emblems, logos, watermarks or multiple foxes. This must illustrate the specific software concept, not reuse a waving mascot portrait. Scene: Dash materializes a resource bundle in a precise package workshop. He opens one clearly bounded shipping box of small resource tiles and carefully places only those tiles into a target folder cabinet, while a separate intact source box remains on a vendor shelf. A small inventory checklist panel has only blank geometric rows. Show copy-to-target with preserved existing folders, not destructive replacement. Wide full-body three-quarter action, violet/orange/cyan accents. Purpose: Composer resource-bundle installers copying declared payloads to consumer-owned paths.",
+ "transparent_background": false
+ },
+ "output": {
+ "sha256": "b4c6e762f7ca106fc17925d2b0742bf8998352b3cad62159edb404520b67d668",
+ "bytes": 2060693,
+ "dimensions": [
+ 1536,
+ 1024
+ ]
+ },
+ "visual_review": {
+ "status": "reviewed",
+ "checks": [
+ "Recognizable orange fox with cream muzzle and tail tip, amber eyes and plain purple hoodie",
+ "Single Dash and repository-specific scene",
+ "Readable at README size; no generated package title or logo"
+ ],
+ "limitations": "Contextual illustration, not an anatomy reference sheet."
+ },
+ "publication": {
+ "status": "authorized",
+ "authority": "maintainer-request",
+ "date": "2026-10-05",
+ "scope": "repository README and documentation",
+ "evidence": "Maintainer requested contextual Dash artwork for each implemented repository, public PRs, and replacement of the previous banner at docs/_static/mascot-banner.png."
+ },
+ "rights": "Generated for authorized repository identity work. Historical reference-art rights remain unrecorded; no independent third-party asset license is asserted.",
+ "id": "reference-dash-package-composer-installers",
+ "context": "Dash copies declared resource-bundle payloads into a target folder",
+ "central_copy": "references/ecosystem/composer-installers.png",
+ "consumer_source": {
+ "repository": "php-fast-forward/composer-installers",
+ "path": "docs/_static/mascot-banner.png",
+ "commit": "924719aab66311217dc92e10b3dc055e53fd935a",
+ "git_blob_sha": "13e9ace487e6de7e790eef5e48a0adacfe1d4914",
+ "url": "https://github.com/php-fast-forward/composer-installers/blob/924719aab66311217dc92e10b3dc055e53fd935a/docs/_static/mascot-banner.png",
+ "source_scope": "public-pull-request-head",
+ "verified_on": "2026-10-05"
+ }
+ },
+ {
+ "pull_request": "https://github.com/php-fast-forward/config/pull/4",
+ "schema_version": 1,
+ "asset": "docs/_static/mascot-banner.png",
+ "repository": "php-fast-forward/config",
+ "collection": "developer",
+ "character": "Dash",
+ "source_kit_commit": "654e4a463533f1d8b8223369b3b0bbc1a4a0badf",
+ "references": [
+ {
+ "id": "dash-developer-welcome",
+ "path": "assets/mascot/dash-developer-welcome.png",
+ "sha256": "38b2c5bb87c94326bcab6463f74fc785414d8539e9175e088b5a5c797a466e09"
+ },
+ {
+ "id": "dash-developer-build",
+ "path": "assets/mascot/dash-developer-build.png",
+ "sha256": "3cca06ae5f82e33a97855ddcb38b3e59c4b750743e7bdb16103a122c492ea303"
+ }
+ ],
+ "generation": {
+ "tool": "image_gen.imagegen",
+ "model": "not reported by tool",
+ "prompt": "Use case: stylized-concept. Asset type: contextual repository README illustration, landscape PNG around 1536x1024. Reference image 1 (dash-developer-welcome) is the authoritative face, anatomy and adult developer identity. Reference image 2 (dash-developer-build) only supports the established 3D materials and paws; do not copy its seated pose. Create a unique contextual illustration with one Dash, the PHP Fast Forward fox. Preserve mature developer proportions, amber/brown eyes, orange fur, cream muzzle/cheeks, forehead tuft, triangular dark-tipped ears, small dark nose, one complete fluffy cream-tipped tail, plain purple hoodie with exactly two cream drawstrings, polished 3D shading and detailed soft fur. Keep both ears, all limbs and the entire tail inside the canvas with safe margins. Friendly capable professional, never toddler/chibi. Clean high-end navy/violet developer environment with warm orange key lighting, subtle cyan accent highlights, excellent contrast at an 840px README width. Purposeful props and readable silhouette, restrained detail. No generated text, letters, numbers, code, package labels, hoodie emblems, logos, watermarks or multiple foxes. This must illustrate the specific software concept, not reuse a waving mascot portrait. Scene: Dash assembles an application configuration at a clean developer control desk. He stands sideways, sliding neatly colored configuration tiles into a central transparent settings board. Tree-shaped nested folder branches feed into the board from the left; a small tuning panel with sliders stands beside him. Show the concrete action of combining several sources into one organized hierarchy, not a package installation factory. Cool navy office, orange rim light, methodical expression and one full tail.",
+ "transparent_background": false
+ },
+ "output": {
+ "sha256": "d42da519e554495d93374013b8a9fafb0a9fcf46ae80db8a6527d287b623cbab",
+ "bytes": 1964606,
+ "dimensions": [
+ 1536,
+ 1024
+ ]
+ },
+ "visual_review": {
+ "status": "reviewed",
+ "checks": [
+ "Recognizable orange fox with cream muzzle and tail tip, amber eyes and plain purple hoodie",
+ "Single Dash and repository-specific scene",
+ "Readable at README size; no generated package title or logo"
+ ],
+ "limitations": "Contextual illustration, not an anatomy reference sheet."
+ },
+ "publication": {
+ "status": "authorized",
+ "authority": "maintainer-request",
+ "date": "2026-10-05",
+ "scope": "repository README and documentation",
+ "evidence": "Maintainer requested contextual Dash artwork for each implemented repository, public PRs, and replacement of the previous banner at docs/_static/mascot-banner.png."
+ },
+ "rights": "Generated for authorized repository identity work. Historical reference-art rights remain unrecorded; no independent third-party asset license is asserted.",
+ "id": "reference-dash-package-config",
+ "context": "Dash combines configuration sources into a nested settings tree",
+ "central_copy": "references/ecosystem/config.png",
+ "consumer_source": {
+ "repository": "php-fast-forward/config",
+ "path": "docs/_static/mascot-banner.png",
+ "commit": "cdeaa55461a6cfa1564183a5a62f3a90d3e75e61",
+ "git_blob_sha": "da4f4112a6c72faba723491fb178d7475ca655d5",
+ "url": "https://github.com/php-fast-forward/config/blob/cdeaa55461a6cfa1564183a5a62f3a90d3e75e61/docs/_static/mascot-banner.png",
+ "source_scope": "public-pull-request-head",
+ "verified_on": "2026-10-05"
+ }
+ },
+ {
+ "pull_request": "https://github.com/php-fast-forward/container/pull/7",
+ "schema_version": 1,
+ "asset": "docs/_static/mascot-banner.png",
+ "repository": "php-fast-forward/container",
+ "collection": "developer",
+ "character": "Dash",
+ "source_kit_commit": "654e4a463533f1d8b8223369b3b0bbc1a4a0badf",
+ "references": [
+ {
+ "id": "dash-developer-welcome",
+ "path": "assets/mascot/dash-developer-welcome.png",
+ "sha256": "38b2c5bb87c94326bcab6463f74fc785414d8539e9175e088b5a5c797a466e09"
+ },
+ {
+ "id": "dash-developer-build",
+ "path": "assets/mascot/dash-developer-build.png",
+ "sha256": "3cca06ae5f82e33a97855ddcb38b3e59c4b750743e7bdb16103a122c492ea303"
+ }
+ ],
+ "generation": {
+ "tool": "image_gen.imagegen",
+ "model": "not reported by tool",
+ "prompt": "Use case: stylized-concept. Asset type: contextual repository README illustration, landscape PNG around 1536x1024. Reference image 1 (dash-developer-welcome) is the authoritative face, anatomy and adult developer identity. Reference image 2 (dash-developer-build) only supports the established 3D materials and paws; do not copy its seated pose. Create a unique contextual illustration with one Dash, the PHP Fast Forward fox. Preserve mature developer proportions, amber/brown eyes, orange fur, cream muzzle/cheeks, forehead tuft, triangular dark-tipped ears, small dark nose, one complete fluffy cream-tipped tail, plain purple hoodie with exactly two cream drawstrings, polished 3D shading and detailed soft fur. Keep both ears, all limbs and the entire tail inside the canvas with safe margins. Friendly capable professional, never toddler/chibi. Clean high-end navy/violet developer environment with warm orange key lighting, subtle cyan accent highlights, excellent contrast at an 840px README width. Purposeful props and readable silhouette, restrained detail. No generated text, letters, numbers, code, package labels, hoodie emblems, logos, watermarks or multiple foxes. This must illustrate the specific software concept, not reuse a waving mascot portrait. Scene: Dash is a services librarian in a stylish modular developer workshop. He reaches to retrieve one glowing component cube from a well-organized cabinet of different modular service cubes; elegant connection lines lead from several separate small cabinets into one central service registry desk. Different shapes fit together without duplication. Three-quarter full-body pose, grown-up confident demeanor. Purpose: PSR-11 aggregate dependency container, resolving and wiring services.",
+ "transparent_background": false
+ },
+ "output": {
+ "sha256": "3a1fd8f79f2c7a87a1d4a76173f8329163c5f51d5864053182d7fe0e88106b36",
+ "bytes": 1980932,
+ "dimensions": [
+ 1536,
+ 1024
+ ]
+ },
+ "visual_review": {
+ "status": "reviewed",
+ "checks": [
+ "Recognizable orange fox with cream muzzle and tail tip, amber eyes and plain purple hoodie",
+ "Single Dash and repository-specific scene",
+ "Readable at README size; no generated package title or logo"
+ ],
+ "limitations": "Contextual illustration, not an anatomy reference sheet."
+ },
+ "publication": {
+ "status": "authorized",
+ "authority": "maintainer-request",
+ "date": "2026-10-05",
+ "scope": "repository README and documentation",
+ "evidence": "Maintainer requested contextual Dash artwork for each implemented repository, public PRs, and replacement of the previous banner at docs/_static/mascot-banner.png."
+ },
+ "rights": "Generated for authorized repository identity work. Historical reference-art rights remain unrecorded; no independent third-party asset license is asserted.",
+ "id": "reference-dash-package-container",
+ "context": "Dash resolves service components from an aggregate registry",
+ "central_copy": "references/ecosystem/container.png",
+ "consumer_source": {
+ "repository": "php-fast-forward/container",
+ "path": "docs/_static/mascot-banner.png",
+ "commit": "ac31a91936a49559d49ab7164e19de8101657e4e",
+ "git_blob_sha": "2321b7fe8a946d73a95fb3efd352a6377e7be673",
+ "url": "https://github.com/php-fast-forward/container/blob/ac31a91936a49559d49ab7164e19de8101657e4e/docs/_static/mascot-banner.png",
+ "source_scope": "public-pull-request-head",
+ "verified_on": "2026-10-05"
+ }
+ },
+ {
+ "pull_request": "https://github.com/php-fast-forward/defer/pull/1",
+ "schema_version": 1,
+ "asset": "docs/_static/mascot-banner.png",
+ "repository": "php-fast-forward/defer",
+ "collection": "developer",
+ "character": "Dash",
+ "source_kit_commit": "654e4a463533f1d8b8223369b3b0bbc1a4a0badf",
+ "references": [
+ {
+ "id": "dash-developer-welcome",
+ "path": "assets/mascot/dash-developer-welcome.png",
+ "sha256": "38b2c5bb87c94326bcab6463f74fc785414d8539e9175e088b5a5c797a466e09"
+ },
+ {
+ "id": "dash-developer-build",
+ "path": "assets/mascot/dash-developer-build.png",
+ "sha256": "3cca06ae5f82e33a97855ddcb38b3e59c4b750743e7bdb16103a122c492ea303"
+ }
+ ],
+ "generation": {
+ "tool": "image_gen.imagegen",
+ "model": "not reported by tool",
+ "prompt": "Use case: stylized-concept. Asset type: contextual repository README illustration, landscape PNG around 1536x1024. Reference image 1 (dash-developer-welcome) is the authoritative face, anatomy and adult developer identity. Reference image 2 (dash-developer-build) only supports the established 3D materials and paws; do not copy its seated pose. Create a unique contextual illustration with one Dash, the PHP Fast Forward fox. Preserve mature developer proportions, amber/brown eyes, orange fur, cream muzzle/cheeks, forehead tuft, triangular dark-tipped ears, small dark nose, one complete fluffy cream-tipped tail, plain purple hoodie with exactly two cream drawstrings, polished 3D shading and detailed soft fur. Keep both ears, all limbs and the entire tail inside the canvas with safe margins. Friendly capable professional, never toddler/chibi. Clean high-end navy/violet developer environment with warm orange key lighting, subtle cyan accent highlights, excellent contrast at an 840px README width. Purposeful props and readable silhouette, restrained detail. No generated text, letters, numbers, code, package labels, hoodie emblems, logos, watermarks or multiple foxes. This must illustrate the specific software concept, not reuse a waving mascot portrait. Scene: Dash finishes work at a scope-bound developer desk and tidies a clearly ordered stack of task tokens. One paw lifts the very top token of a vertical stack while older tokens remain beneath; completed tokens travel down an orderly reverse-order cleanup chute into a safe tray. A small boundary arch around the desk represents leaving a scope, with a subtle hourglass. No arrows implying FIFO. Wide side-view action, calm methodical fox, single complete tail. Purpose: deferred cleanup callbacks in LIFO order at the end of scope.",
+ "transparent_background": false
+ },
+ "output": {
+ "sha256": "d4e00106c2da461663fb8dd0cc2cd2cc2863e8ca12997ed5518c1eee348c3916",
+ "bytes": 2176575,
+ "dimensions": [
+ 1536,
+ 1024
+ ]
+ },
+ "visual_review": {
+ "status": "reviewed",
+ "checks": [
+ "Recognizable orange fox with cream muzzle and tail tip, amber eyes and plain purple hoodie",
+ "Single Dash and repository-specific scene",
+ "Readable at README size; no generated package title or logo"
+ ],
+ "limitations": "Contextual illustration, not an anatomy reference sheet."
+ },
+ "publication": {
+ "status": "authorized",
+ "authority": "maintainer-request",
+ "date": "2026-10-05",
+ "scope": "repository README and documentation",
+ "evidence": "Maintainer requested contextual Dash artwork for each implemented repository, public PRs, and replacement of the previous banner at docs/_static/mascot-banner.png."
+ },
+ "rights": "Generated for authorized repository identity work. Historical reference-art rights remain unrecorded; no independent third-party asset license is asserted.",
+ "id": "reference-dash-package-defer",
+ "context": "Dash performs deferred scope cleanup in reverse stack order",
+ "central_copy": "references/ecosystem/defer.png",
+ "consumer_source": {
+ "repository": "php-fast-forward/defer",
+ "path": "docs/_static/mascot-banner.png",
+ "commit": "ca2453a811b84272a1467c7ca25e8aada2be348c",
+ "git_blob_sha": "1baebbba6424e0684a3ffd984596749c45a95e50",
+ "url": "https://github.com/php-fast-forward/defer/blob/ca2453a811b84272a1467c7ca25e8aada2be348c/docs/_static/mascot-banner.png",
+ "source_scope": "public-pull-request-head",
+ "verified_on": "2026-10-05"
+ }
+ },
+ {
+ "pull_request": "https://github.com/php-fast-forward/enum/pull/5",
+ "schema_version": 1,
+ "asset": "docs/_static/mascot-banner.png",
+ "repository": "php-fast-forward/enum",
+ "collection": "developer",
+ "character": "Dash",
+ "source_kit_commit": "654e4a463533f1d8b8223369b3b0bbc1a4a0badf",
+ "references": [
+ {
+ "id": "dash-developer-welcome",
+ "path": "assets/mascot/dash-developer-welcome.png",
+ "sha256": "38b2c5bb87c94326bcab6463f74fc785414d8539e9175e088b5a5c797a466e09"
+ },
+ {
+ "id": "dash-developer-build",
+ "path": "assets/mascot/dash-developer-build.png",
+ "sha256": "3cca06ae5f82e33a97855ddcb38b3e59c4b750743e7bdb16103a122c492ea303"
+ }
+ ],
+ "generation": {
+ "tool": "image_gen.imagegen",
+ "model": "not reported by tool",
+ "prompt": "Use case: stylized-concept. Asset type: contextual repository README illustration, landscape PNG around 1536x1024. Reference image 1 (dash-developer-welcome) is the authoritative face, anatomy and adult developer identity. Reference image 2 (dash-developer-build) only supports the established 3D materials and paws; do not copy its seated pose. Create a unique contextual illustration with one Dash, the PHP Fast Forward fox. Preserve mature developer proportions, amber/brown eyes, orange fur, cream muzzle/cheeks, forehead tuft, triangular dark-tipped ears, small dark nose, one complete fluffy cream-tipped tail, plain purple hoodie with exactly two cream drawstrings, polished 3D shading and detailed soft fur. Keep both ears, all limbs and the entire tail inside the canvas with safe margins. Friendly capable professional, never toddler/chibi. Clean high-end navy/violet developer environment with warm orange key lighting, subtle cyan accent highlights, excellent contrast at an 840px README width. Purposeful props and readable silhouette, restrained detail. No generated text, letters, numbers, code, package labels, hoodie emblems, logos, watermarks or multiple foxes. This must illustrate the specific software concept, not reuse a waving mascot portrait. Scene: Dash curates a finite collection of precise choices on a designer's taxonomy table. He confidently places one colored rounded choice tile into a fixed three-slot catalog, with small nearby calendar, sorting and state-transition symbols rendered only as abstract geometry. Closed limited choice set, ordered colored swatches, neatly mapped counterparts. Warm amber eyes exactly like the primary master, never purple eyes. Rich navy/violet studio, elegant standing angled pose. Purpose: typed enum cases, catalogs, lookup and mapping.",
+ "transparent_background": false
+ },
+ "output": {
+ "sha256": "c764b8a558442b857ce419e6767a6f5c671de969ab3b26ef2d96c95eeae6ce2f",
+ "bytes": 1910263,
+ "dimensions": [
+ 1536,
+ 1024
+ ]
+ },
+ "visual_review": {
+ "status": "reviewed",
+ "checks": [
+ "Recognizable orange fox with cream muzzle and tail tip, amber eyes and plain purple hoodie",
+ "Single Dash and repository-specific scene",
+ "Readable at README size; no generated package title or logo"
+ ],
+ "limitations": "Contextual illustration, not an anatomy reference sheet."
+ },
+ "publication": {
+ "status": "authorized",
+ "authority": "maintainer-request",
+ "date": "2026-10-05",
+ "scope": "repository README and documentation",
+ "evidence": "Maintainer requested contextual Dash artwork for each implemented repository, public PRs, and replacement of the previous banner at docs/_static/mascot-banner.png."
+ },
+ "rights": "Generated for authorized repository identity work. Historical reference-art rights remain unrecorded; no independent third-party asset license is asserted.",
+ "id": "reference-dash-package-enum",
+ "context": "Dash organizes a finite set of typed choices",
+ "central_copy": "references/ecosystem/enum.png",
+ "consumer_source": {
+ "repository": "php-fast-forward/enum",
+ "path": "docs/_static/mascot-banner.png",
+ "commit": "e43c4fe049a3657cee45fa9ab11a17c092a9c6a5",
+ "git_blob_sha": "e33e66e8ff80058f7cda9d2899381664ff03a342",
+ "url": "https://github.com/php-fast-forward/enum/blob/e43c4fe049a3657cee45fa9ab11a17c092a9c6a5/docs/_static/mascot-banner.png",
+ "source_scope": "public-pull-request-head",
+ "verified_on": "2026-10-05"
+ }
+ },
+ {
+ "pull_request": "https://github.com/php-fast-forward/event-dispatcher/pull/1",
+ "schema_version": 1,
+ "asset": "docs/_static/mascot-banner.png",
+ "repository": "php-fast-forward/event-dispatcher",
+ "collection": "developer",
+ "character": "Dash",
+ "source_kit_commit": "654e4a463533f1d8b8223369b3b0bbc1a4a0badf",
+ "references": [
+ {
+ "id": "dash-developer-welcome",
+ "path": "assets/mascot/dash-developer-welcome.png",
+ "sha256": "38b2c5bb87c94326bcab6463f74fc785414d8539e9175e088b5a5c797a466e09"
+ },
+ {
+ "id": "dash-developer-build",
+ "path": "assets/mascot/dash-developer-build.png",
+ "sha256": "3cca06ae5f82e33a97855ddcb38b3e59c4b750743e7bdb16103a122c492ea303"
+ }
+ ],
+ "generation": {
+ "tool": "image_gen.imagegen",
+ "model": "not reported by tool",
+ "prompt": "Use case: stylized-concept. Asset type: contextual repository README illustration, landscape PNG around 1536x1024. Reference image 1 (dash-developer-welcome) is the authoritative face, anatomy and adult developer identity. Reference image 2 (dash-developer-build) only supports the established 3D materials and paws; do not copy its seated pose. Create a unique contextual illustration with one Dash, the PHP Fast Forward fox. Preserve mature developer proportions, amber/brown eyes, orange fur, cream muzzle/cheeks, forehead tuft, triangular dark-tipped ears, small dark nose, one complete fluffy cream-tipped tail, plain purple hoodie with exactly two cream drawstrings, polished 3D shading and detailed soft fur. Keep both ears, all limbs and the entire tail inside the canvas with safe margins. Friendly capable professional, never toddler/chibi. Clean high-end navy/violet developer environment with warm orange key lighting, subtle cyan accent highlights, excellent contrast at an 840px README width. Purposeful props and readable silhouette, restrained detail. No generated text, letters, numbers, code, package labels, hoodie emblems, logos, watermarks or multiple foxes. This must illustrate the specific software concept, not reuse a waving mascot portrait. Scene: Dash is an event-routing conductor at a modern observability console. In one paw he holds a glowing event capsule shaped like an envelope; with the other paw he directs luminous purple paths from that single source toward three distinct listener terminals. Priority is represented by vertically ordered small terminal lights, and a separate stop switch is visible. Camera three-quarter view, Dash standing slightly left of center, flow diagram taking the right half. The purpose is PHP event dispatch, named events and ordered listeners, not telecommunications.",
+ "transparent_background": false
+ },
+ "output": {
+ "sha256": "9b5e6e4d482ebbe2b427b343e8d2b31209a2b942b92fe9cb202cf2a11b610050",
+ "bytes": 1947485,
+ "dimensions": [
+ 1536,
+ 1024
+ ]
+ },
+ "visual_review": {
+ "status": "reviewed",
+ "checks": [
+ "Recognizable orange fox with cream muzzle and tail tip, amber eyes and plain purple hoodie",
+ "Single Dash and repository-specific scene",
+ "Readable at README size; no generated package title or logo"
+ ],
+ "limitations": "Contextual illustration, not an anatomy reference sheet."
+ },
+ "publication": {
+ "status": "authorized",
+ "authority": "maintainer-request",
+ "date": "2026-10-05",
+ "scope": "repository README and documentation",
+ "evidence": "Maintainer requested contextual Dash artwork for each implemented repository, public PRs, and replacement of the previous banner at docs/_static/mascot-banner.png."
+ },
+ "rights": "Generated for authorized repository identity work. Historical reference-art rights remain unrecorded; no independent third-party asset license is asserted.",
+ "id": "reference-dash-package-event-dispatcher",
+ "context": "Dash routes a named event through ordered listeners",
+ "central_copy": "references/ecosystem/event-dispatcher.png",
+ "consumer_source": {
+ "repository": "php-fast-forward/event-dispatcher",
+ "path": "docs/_static/mascot-banner.png",
+ "commit": "e03e9f30cb42028729c2d073050523468ef0a37b",
+ "git_blob_sha": "1eb2c7db5fe61b99540d199b95c68d68aa357c02",
+ "url": "https://github.com/php-fast-forward/event-dispatcher/blob/e03e9f30cb42028729c2d073050523468ef0a37b/docs/_static/mascot-banner.png",
+ "source_scope": "public-pull-request-head",
+ "verified_on": "2026-10-05"
+ }
+ },
+ {
+ "pull_request": "https://github.com/php-fast-forward/fork/pull/2",
+ "schema_version": 1,
+ "asset": "docs/_static/mascot-banner.png",
+ "repository": "php-fast-forward/fork",
+ "collection": "developer",
+ "character": "Dash",
+ "source_kit_commit": "654e4a463533f1d8b8223369b3b0bbc1a4a0badf",
+ "references": [
+ {
+ "id": "dash-developer-welcome",
+ "path": "assets/mascot/dash-developer-welcome.png",
+ "sha256": "38b2c5bb87c94326bcab6463f74fc785414d8539e9175e088b5a5c797a466e09"
+ },
+ {
+ "id": "dash-developer-build",
+ "path": "assets/mascot/dash-developer-build.png",
+ "sha256": "3cca06ae5f82e33a97855ddcb38b3e59c4b750743e7bdb16103a122c492ea303"
+ }
+ ],
+ "generation": {
+ "tool": "image_gen.imagegen",
+ "model": "not reported by tool",
+ "prompt": "Use case: stylized-concept. Asset type: contextual repository README illustration, landscape PNG around 1536x1024. Reference image 1 (dash-developer-welcome) is the authoritative face, anatomy and adult developer identity. Reference image 2 (dash-developer-build) only supports the established 3D materials and paws; do not copy its seated pose. Create a unique contextual illustration with one Dash, the PHP Fast Forward fox. Preserve mature developer proportions, amber/brown eyes, orange fur, cream muzzle/cheeks, forehead tuft, triangular dark-tipped ears, small dark nose, one complete fluffy cream-tipped tail, plain purple hoodie with exactly two cream drawstrings, polished 3D shading and detailed soft fur. Keep both ears, all limbs and the entire tail inside the canvas with safe margins. Friendly capable professional, never toddler/chibi. Clean high-end navy/violet developer environment with warm orange key lighting, subtle cyan accent highlights, excellent contrast at an 840px README width. Purposeful props and readable silhouette, restrained detail. No generated text, letters, numbers, code, package labels, hoodie emblems, logos, watermarks or multiple foxes. This must illustrate the specific software concept, not reuse a waving mascot portrait. Scene: Dash manages parallel child processes at a spacious workstation. He stands behind a central orchestration console, calmly operating its controls, while three separate worker consoles run independent abstract tasks connected to a parent node above. Thin cyan return paths converge into one output collector below, and a physical stop control sits on the central console. A visual process tree, each worker a terminal, not three fox copies. Wide symmetrical landscape, Dash complete and recognizably the reference. The purpose is forked worker orchestration, signals, groups and captured outputs.",
+ "transparent_background": false
+ },
+ "output": {
+ "sha256": "167b3c043276f8b20afdc3299f4c35c47776a8997b223ea0fb81fbe5b64d908b",
+ "bytes": 1832377,
+ "dimensions": [
+ 1536,
+ 1024
+ ]
+ },
+ "visual_review": {
+ "status": "reviewed",
+ "checks": [
+ "Recognizable orange fox with cream muzzle and tail tip, amber eyes and plain purple hoodie",
+ "Single Dash and repository-specific scene",
+ "Readable at README size; no generated package title or logo"
+ ],
+ "limitations": "Contextual illustration, not an anatomy reference sheet."
+ },
+ "publication": {
+ "status": "authorized",
+ "authority": "maintainer-request",
+ "date": "2026-10-05",
+ "scope": "repository README and documentation",
+ "evidence": "Maintainer requested contextual Dash artwork for each implemented repository, public PRs, and replacement of the previous banner at docs/_static/mascot-banner.png."
+ },
+ "rights": "Generated for authorized repository identity work. Historical reference-art rights remain unrecorded; no independent third-party asset license is asserted.",
+ "id": "reference-dash-package-fork",
+ "context": "Dash coordinates child processes and collected outputs",
+ "central_copy": "references/ecosystem/fork.png",
+ "consumer_source": {
+ "repository": "php-fast-forward/fork",
+ "path": "docs/_static/mascot-banner.png",
+ "commit": "6032d1bc7ddb24cb08bc426b1b8822f6a6e824cd",
+ "git_blob_sha": "ef44517a825c9be68fa1831a0cfd4912432e7514",
+ "url": "https://github.com/php-fast-forward/fork/blob/6032d1bc7ddb24cb08bc426b1b8822f6a6e824cd/docs/_static/mascot-banner.png",
+ "source_scope": "public-pull-request-head",
+ "verified_on": "2026-10-05"
+ }
+ },
+ {
+ "pull_request": "https://github.com/php-fast-forward/framework/pull/9",
+ "schema_version": 1,
+ "asset": "docs/_static/mascot-banner.png",
+ "repository": "php-fast-forward/framework",
+ "collection": "developer",
+ "character": "Dash",
+ "source_kit_commit": "654e4a463533f1d8b8223369b3b0bbc1a4a0badf",
+ "references": [
+ {
+ "id": "dash-developer-welcome",
+ "path": "assets/mascot/dash-developer-welcome.png",
+ "sha256": "38b2c5bb87c94326bcab6463f74fc785414d8539e9175e088b5a5c797a466e09"
+ },
+ {
+ "id": "dash-developer-build",
+ "path": "assets/mascot/dash-developer-build.png",
+ "sha256": "3cca06ae5f82e33a97855ddcb38b3e59c4b750743e7bdb16103a122c492ea303"
+ }
+ ],
+ "generation": {
+ "tool": "image_gen.imagegen",
+ "model": "not reported by tool",
+ "prompt": "Use case: stylized-concept. Asset type: contextual repository README illustration, landscape PNG around 1536x1024. Reference image 1 (dash-developer-welcome) is the authoritative face, anatomy and adult developer identity. Reference image 2 (dash-developer-build) only supports the established 3D materials and paws; do not copy its seated pose. Create a unique contextual illustration with one Dash, the PHP Fast Forward fox. Preserve mature developer proportions, amber/brown eyes, orange fur, cream muzzle/cheeks, forehead tuft, triangular dark-tipped ears, small dark nose, one complete fluffy cream-tipped tail, plain purple hoodie with exactly two cream drawstrings, polished 3D shading and detailed soft fur. Keep both ears, all limbs and the entire tail inside the canvas with safe margins. Friendly capable professional, never toddler/chibi. Clean high-end navy/violet developer environment with warm orange key lighting, subtle cyan accent highlights, excellent contrast at an 840px README width. Purposeful props and readable silhouette, restrained detail. No generated text, letters, numbers, code, package labels, hoodie emblems, logos, watermarks or multiple foxes. This must illustrate the specific software concept, not reuse a waving mascot portrait. Scene: Dash is an architect connecting the Fast Forward framework foundation. He stands on a modular platform, placing a final bridge between component stations representing a service registry, event routing, a clock and paired web message terminals. A single central bootstrap pillar connects the entire compact system. Isometric architectural environment, coherent warm lighting, one mature fox only, all of his silhouette inside the frame. Purpose: aggregate metapackage wiring core components through one service-provider bootstrap.",
+ "transparent_background": false
+ },
+ "output": {
+ "sha256": "e3a2ca0606ab886aa6aea8047a5fef9f5e35cc842321d15a9fbcca7e880491b2",
+ "bytes": 2092421,
+ "dimensions": [
+ 1536,
+ 1024
+ ]
+ },
+ "visual_review": {
+ "status": "reviewed",
+ "checks": [
+ "Recognizable orange fox with cream muzzle and tail tip, amber eyes and plain purple hoodie",
+ "Single Dash and repository-specific scene",
+ "Readable at README size; no generated package title or logo"
+ ],
+ "limitations": "Contextual illustration, not an anatomy reference sheet."
+ },
+ "publication": {
+ "status": "authorized",
+ "authority": "maintainer-request",
+ "date": "2026-10-05",
+ "scope": "repository README and documentation",
+ "evidence": "Maintainer requested contextual Dash artwork for each implemented repository, public PRs, and replacement of the previous banner at docs/_static/mascot-banner.png."
+ },
+ "rights": "Generated for authorized repository identity work. Historical reference-art rights remain unrecorded; no independent third-party asset license is asserted.",
+ "id": "reference-dash-package-framework",
+ "context": "Dash connects framework components through a shared bootstrap",
+ "central_copy": "references/ecosystem/framework.png",
+ "consumer_source": {
+ "repository": "php-fast-forward/framework",
+ "path": "docs/_static/mascot-banner.png",
+ "commit": "bd0d0e1486592d18d9d8db69a7874b6b53823c8d",
+ "git_blob_sha": "7859bbea3e4395f55355ca2118768bee6a15eb7f",
+ "url": "https://github.com/php-fast-forward/framework/blob/bd0d0e1486592d18d9d8db69a7874b6b53823c8d/docs/_static/mascot-banner.png",
+ "source_scope": "public-pull-request-head",
+ "verified_on": "2026-10-05"
+ }
+ },
+ {
+ "pull_request": "https://github.com/php-fast-forward/github-actions/pull/3",
+ "schema_version": 1,
+ "asset": "docs/_static/mascot-banner.png",
+ "repository": "php-fast-forward/github-actions",
+ "collection": "developer",
+ "character": "Dash",
+ "source_kit_commit": "654e4a463533f1d8b8223369b3b0bbc1a4a0badf",
+ "references": [
+ {
+ "id": "dash-developer-welcome",
+ "path": "assets/mascot/dash-developer-welcome.png",
+ "sha256": "38b2c5bb87c94326bcab6463f74fc785414d8539e9175e088b5a5c797a466e09"
+ },
+ {
+ "id": "dash-developer-build",
+ "path": "assets/mascot/dash-developer-build.png",
+ "sha256": "3cca06ae5f82e33a97855ddcb38b3e59c4b750743e7bdb16103a122c492ea303"
+ }
+ ],
+ "generation": {
+ "tool": "image_gen.imagegen",
+ "model": "not reported by tool",
+ "prompt": "Use case: stylized-concept. Asset type: contextual repository README illustration, landscape PNG around 1536x1024. Reference image 1 (dash-developer-welcome) is the authoritative face, anatomy and adult developer identity. Reference image 2 (dash-developer-build) only supports the established 3D materials and paws; do not copy its seated pose. Create a unique contextual illustration with one Dash, the PHP Fast Forward fox. Preserve mature developer proportions, amber/brown eyes, orange fur, cream muzzle/cheeks, forehead tuft, triangular dark-tipped ears, small dark nose, one complete fluffy cream-tipped tail, plain purple hoodie with exactly two cream drawstrings, polished 3D shading and detailed soft fur. Keep both ears, all limbs and the entire tail inside the canvas with safe margins. Friendly capable professional, never toddler/chibi. Clean high-end navy/violet developer environment with warm orange key lighting, subtle cyan accent highlights, excellent contrast at an 840px README width. Purposeful props and readable silhouette, restrained detail. No generated text, letters, numbers, code, package labels, hoodie emblems, logos, watermarks or multiple foxes. This must illustrate the specific software concept, not reuse a waving mascot portrait. Scene: Dash operates a shared CI automation control room. He confidently connects a sequence of stage tiles on an elevated workflow rail: a PHP runtime terminal, a version-selector dial, an output collector and a summary document station. Small reusable modules feed the rail from a library shelf. Distinct from the dev-tools workshop: workflow orchestration and reusable automation stages, not code editing. Purpose: Symfony Console runtime for shared GitHub Actions automation; no invented GitHub or vendor logo.",
+ "transparent_background": false
+ },
+ "output": {
+ "sha256": "970a84991d63709eccd5c9da7c4a346df675ed124fdf682cfc84c44b8b9f1e16",
+ "bytes": 1994037,
+ "dimensions": [
+ 1536,
+ 1024
+ ]
+ },
+ "visual_review": {
+ "status": "reviewed",
+ "checks": [
+ "Recognizable orange fox with cream muzzle and tail tip, amber eyes and plain purple hoodie",
+ "Single Dash and repository-specific scene",
+ "Readable at README size; no generated package title or logo"
+ ],
+ "limitations": "Contextual illustration, not an anatomy reference sheet."
+ },
+ "publication": {
+ "status": "authorized",
+ "authority": "maintainer-request",
+ "date": "2026-10-05",
+ "scope": "repository README and documentation",
+ "evidence": "Maintainer requested contextual Dash artwork for each implemented repository, public PRs, and replacement of the previous banner at docs/_static/mascot-banner.png."
+ },
+ "rights": "Generated for authorized repository identity work. Historical reference-art rights remain unrecorded; no independent third-party asset license is asserted.",
+ "id": "reference-dash-package-github-actions",
+ "context": "Dash connects reusable workflow stages in CI automation",
+ "central_copy": "references/ecosystem/github-actions.png",
+ "consumer_source": {
+ "repository": "php-fast-forward/github-actions",
+ "path": "docs/_static/mascot-banner.png",
+ "commit": "4218dcbaf5e010518016617bee96c3fe6c5a383c",
+ "git_blob_sha": "b2f2641b7758be9ed1227baf9205aa5b08603774",
+ "url": "https://github.com/php-fast-forward/github-actions/blob/4218dcbaf5e010518016617bee96c3fe6c5a383c/docs/_static/mascot-banner.png",
+ "source_scope": "public-pull-request-head",
+ "verified_on": "2026-10-05"
+ }
+ },
+ {
+ "pull_request": "https://github.com/php-fast-forward/http/pull/1",
+ "schema_version": 1,
+ "asset": "docs/_static/mascot-banner.png",
+ "repository": "php-fast-forward/http",
+ "collection": "developer",
+ "character": "Dash",
+ "source_kit_commit": "654e4a463533f1d8b8223369b3b0bbc1a4a0badf",
+ "references": [
+ {
+ "id": "dash-developer-welcome",
+ "path": "assets/mascot/dash-developer-welcome.png",
+ "sha256": "38b2c5bb87c94326bcab6463f74fc785414d8539e9175e088b5a5c797a466e09"
+ },
+ {
+ "id": "dash-developer-build",
+ "path": "assets/mascot/dash-developer-build.png",
+ "sha256": "3cca06ae5f82e33a97855ddcb38b3e59c4b750743e7bdb16103a122c492ea303"
+ }
+ ],
+ "generation": {
+ "tool": "image_gen.imagegen",
+ "model": "not reported by tool",
+ "prompt": "Use case: stylized-concept. Asset type: contextual repository README illustration, landscape PNG around 1536x1024. Reference image 1 (dash-developer-welcome) is the authoritative face, anatomy and adult developer identity. Reference image 2 (dash-developer-build) only supports the established 3D materials and paws; do not copy its seated pose. Create a unique contextual illustration with one Dash, the PHP Fast Forward fox. Preserve mature developer proportions, amber/brown eyes, orange fur, cream muzzle/cheeks, forehead tuft, triangular dark-tipped ears, small dark nose, one complete fluffy cream-tipped tail, plain purple hoodie with exactly two cream drawstrings, polished 3D shading and detailed soft fur. Keep both ears, all limbs and the entire tail inside the canvas with safe margins. Friendly capable professional, never toddler/chibi. Clean high-end navy/violet developer environment with warm orange key lighting, subtle cyan accent highlights, excellent contrast at an 840px README width. Purposeful props and readable silhouette, restrained detail. No generated text, letters, numbers, code, package labels, hoodie emblems, logos, watermarks or multiple foxes. This must illustrate the specific software concept, not reuse a waving mascot portrait. Scene: Dash connects an aggregate web stack in a polished web engineering lab. He stands at the center of an arc of coordinated stations: request builder, paired inbound/outbound web-message lanes, stream reservoir and client transport terminal, all wired into one hub. His paws plug one final connector into the hub. Abstract envelope cards and flowing payload lines, clean distinct modules. Purpose: a unified HTTP provider assembling factories, messages and a PSR-18 client.",
+ "transparent_background": false
+ },
+ "output": {
+ "sha256": "921a9dc1d0c0e7a0a1d9b75f00876be893c3497504aaac3a747ce16242d4beba",
+ "bytes": 2064674,
+ "dimensions": [
+ 1536,
+ 1024
+ ]
+ },
+ "visual_review": {
+ "status": "reviewed",
+ "checks": [
+ "Recognizable orange fox with cream muzzle and tail tip, amber eyes and plain purple hoodie",
+ "Single Dash and repository-specific scene",
+ "Readable at README size; no generated package title or logo"
+ ],
+ "limitations": "Contextual illustration, not an anatomy reference sheet."
+ },
+ "publication": {
+ "status": "authorized",
+ "authority": "maintainer-request",
+ "date": "2026-10-05",
+ "scope": "repository README and documentation",
+ "evidence": "Maintainer requested contextual Dash artwork for each implemented repository, public PRs, and replacement of the previous banner at docs/_static/mascot-banner.png."
+ },
+ "rights": "Generated for authorized repository identity work. Historical reference-art rights remain unrecorded; no independent third-party asset license is asserted.",
+ "id": "reference-dash-package-http",
+ "context": "Dash assembles message, factory and client components",
+ "central_copy": "references/ecosystem/http.png",
+ "consumer_source": {
+ "repository": "php-fast-forward/http",
+ "path": "docs/_static/mascot-banner.png",
+ "commit": "e7db743a9f09b277fc110d2179e8b20f28c3cccf",
+ "git_blob_sha": "ea64ffdbff40bea65985289a6d89d3a6082f54a0",
+ "url": "https://github.com/php-fast-forward/http/blob/e7db743a9f09b277fc110d2179e8b20f28c3cccf/docs/_static/mascot-banner.png",
+ "source_scope": "public-pull-request-head",
+ "verified_on": "2026-10-05"
+ }
+ },
+ {
+ "pull_request": "https://github.com/php-fast-forward/http-client/pull/1",
+ "schema_version": 1,
+ "asset": "docs/_static/mascot-banner.png",
+ "repository": "php-fast-forward/http-client",
+ "collection": "developer",
+ "character": "Dash",
+ "source_kit_commit": "654e4a463533f1d8b8223369b3b0bbc1a4a0badf",
+ "references": [
+ {
+ "id": "dash-developer-welcome",
+ "path": "assets/mascot/dash-developer-welcome.png",
+ "sha256": "38b2c5bb87c94326bcab6463f74fc785414d8539e9175e088b5a5c797a466e09"
+ },
+ {
+ "id": "dash-developer-build",
+ "path": "assets/mascot/dash-developer-build.png",
+ "sha256": "3cca06ae5f82e33a97855ddcb38b3e59c4b750743e7bdb16103a122c492ea303"
+ }
+ ],
+ "generation": {
+ "tool": "image_gen.imagegen",
+ "model": "not reported by tool",
+ "prompt": "Use case: stylized-concept. Asset type: contextual repository README illustration, landscape PNG around 1536x1024. Reference image 1 (dash-developer-welcome) is the authoritative face, anatomy and adult developer identity. Reference image 2 (dash-developer-build) only supports the established 3D materials and paws; do not copy its seated pose. Create a unique contextual illustration with one Dash, the PHP Fast Forward fox. Preserve mature developer proportions, amber/brown eyes, orange fur, cream muzzle/cheeks, forehead tuft, triangular dark-tipped ears, small dark nose, one complete fluffy cream-tipped tail, plain purple hoodie with exactly two cream drawstrings, polished 3D shading and detailed soft fur. Keep both ears, all limbs and the entire tail inside the canvas with safe margins. Friendly capable professional, never toddler/chibi. Clean high-end navy/violet developer environment with warm orange key lighting, subtle cyan accent highlights, excellent contrast at an 840px README width. Purposeful props and readable silhouette, restrained detail. No generated text, letters, numbers, code, package labels, hoodie emblems, logos, watermarks or multiple foxes. This must illustrate the specific software concept, not reuse a waving mascot portrait. Scene: Dash works at a clean client-side networking desk, actively sending one glowing request envelope toward a remote server tower and receiving a differently colored response envelope along a return path. A small application terminal connects through a transport adapter dock. Clear two-way request/response exchange over a bridge, not a full web factory or browser logo. Full-body three-quarter pose, forward open-paw gesture, single tail, warm confident expression. Purpose: PSR-18 HTTP client integration backed by a transport layer.",
+ "transparent_background": false
+ },
+ "output": {
+ "sha256": "5565275d75e23a28e5b6bbb28b99f335d88a8d66ae10655493d8b229b0baf079",
+ "bytes": 1936246,
+ "dimensions": [
+ 1536,
+ 1024
+ ]
+ },
+ "visual_review": {
+ "status": "reviewed",
+ "checks": [
+ "Recognizable orange fox with cream muzzle and tail tip, amber eyes and plain purple hoodie",
+ "Single Dash and repository-specific scene",
+ "Readable at README size; no generated package title or logo"
+ ],
+ "limitations": "Contextual illustration, not an anatomy reference sheet."
+ },
+ "publication": {
+ "status": "authorized",
+ "authority": "maintainer-request",
+ "date": "2026-10-05",
+ "scope": "repository README and documentation",
+ "evidence": "Maintainer requested contextual Dash artwork for each implemented repository, public PRs, and replacement of the previous banner at docs/_static/mascot-banner.png."
+ },
+ "rights": "Generated for authorized repository identity work. Historical reference-art rights remain unrecorded; no independent third-party asset license is asserted.",
+ "id": "reference-dash-package-http-client",
+ "context": "Dash exchanges request and response envelopes",
+ "central_copy": "references/ecosystem/http-client.png",
+ "consumer_source": {
+ "repository": "php-fast-forward/http-client",
+ "path": "docs/_static/mascot-banner.png",
+ "commit": "c605b8b2ba763f5456bd4df989fc58ddd66fb753",
+ "git_blob_sha": "2797a09dc32ecf61ba11c347b30677e8f939c044",
+ "url": "https://github.com/php-fast-forward/http-client/blob/c605b8b2ba763f5456bd4df989fc58ddd66fb753/docs/_static/mascot-banner.png",
+ "source_scope": "public-pull-request-head",
+ "verified_on": "2026-10-05"
+ }
+ },
+ {
+ "pull_request": "https://github.com/php-fast-forward/http-factory/pull/1",
+ "schema_version": 1,
+ "asset": "docs/_static/mascot-banner.png",
+ "repository": "php-fast-forward/http-factory",
+ "collection": "developer",
+ "character": "Dash",
+ "source_kit_commit": "654e4a463533f1d8b8223369b3b0bbc1a4a0badf",
+ "references": [
+ {
+ "id": "dash-developer-welcome",
+ "path": "assets/mascot/dash-developer-welcome.png",
+ "sha256": "38b2c5bb87c94326bcab6463f74fc785414d8539e9175e088b5a5c797a466e09"
+ },
+ {
+ "id": "dash-developer-build",
+ "path": "assets/mascot/dash-developer-build.png",
+ "sha256": "3cca06ae5f82e33a97855ddcb38b3e59c4b750743e7bdb16103a122c492ea303"
+ }
+ ],
+ "generation": {
+ "tool": "image_gen.imagegen",
+ "model": "not reported by tool",
+ "prompt": "Use case: stylized-concept. Asset type: contextual repository README illustration, landscape PNG around 1536x1024. Reference image 1 (dash-developer-welcome) is the authoritative face, anatomy and adult developer identity. Reference image 2 (dash-developer-build) only supports the established 3D materials and paws; do not copy its seated pose. Create a unique contextual illustration with one Dash, the PHP Fast Forward fox. Preserve mature developer proportions, amber/brown eyes, orange fur, cream muzzle/cheeks, forehead tuft, triangular dark-tipped ears, small dark nose, one complete fluffy cream-tipped tail, plain purple hoodie with exactly two cream drawstrings, polished 3D shading and detailed soft fur. Keep both ears, all limbs and the entire tail inside the canvas with safe margins. Friendly capable professional, never toddler/chibi. Clean high-end navy/violet developer environment with warm orange key lighting, subtle cyan accent highlights, excellent contrast at an 840px README width. Purposeful props and readable silhouette, restrained detail. No generated text, letters, numbers, code, package labels, hoodie emblems, logos, watermarks or multiple foxes. This must illustrate the specific software concept, not reuse a waving mascot portrait. Scene: Dash is an HTTP object craftsman at a small elegant fabrication bench. He assembles several distinct web object forms from one shared factory station: envelope-shaped requests, response cards, a coiled stream spool and a polished URI-link loop. The molds are empty abstract shapes without labels; a soft branching tree leads from one factory to these different objects. Purpose: creating PSR-17/PSR-7 HTTP objects and reusable response/stream factories, not sending messages across a network.",
+ "transparent_background": false
+ },
+ "output": {
+ "sha256": "0e63c41e7f841255aa44ec9bfc94312bed1a4c3613ce30947ce4a7ac085d2ca1",
+ "bytes": 2169191,
+ "dimensions": [
+ 1536,
+ 1024
+ ]
+ },
+ "visual_review": {
+ "status": "reviewed",
+ "checks": [
+ "Recognizable orange fox with cream muzzle and tail tip, amber eyes and plain purple hoodie",
+ "Single Dash and repository-specific scene",
+ "Readable at README size; no generated package title or logo"
+ ],
+ "limitations": "Contextual illustration, not an anatomy reference sheet."
+ },
+ "publication": {
+ "status": "authorized",
+ "authority": "maintainer-request",
+ "date": "2026-10-05",
+ "scope": "repository README and documentation",
+ "evidence": "Maintainer requested contextual Dash artwork for each implemented repository, public PRs, and replacement of the previous banner at docs/_static/mascot-banner.png."
+ },
+ "rights": "Generated for authorized repository identity work. Historical reference-art rights remain unrecorded; no independent third-party asset license is asserted.",
+ "id": "reference-dash-package-http-factory",
+ "context": "Dash builds request, response, stream and URI objects",
+ "central_copy": "references/ecosystem/http-factory.png",
+ "consumer_source": {
+ "repository": "php-fast-forward/http-factory",
+ "path": "docs/_static/mascot-banner.png",
+ "commit": "ef11ffc9f314a62d7b051ccf76184cb24c3ea6f8",
+ "git_blob_sha": "c3d77e76d638ad3bd11c7cb246aa3d929c7cb29e",
+ "url": "https://github.com/php-fast-forward/http-factory/blob/ef11ffc9f314a62d7b051ccf76184cb24c3ea6f8/docs/_static/mascot-banner.png",
+ "source_scope": "public-pull-request-head",
+ "verified_on": "2026-10-05"
+ }
+ },
+ {
+ "pull_request": "https://github.com/php-fast-forward/http-message/pull/1",
+ "schema_version": 1,
+ "asset": "docs/_static/mascot-banner.png",
+ "repository": "php-fast-forward/http-message",
+ "collection": "developer",
+ "character": "Dash",
+ "source_kit_commit": "654e4a463533f1d8b8223369b3b0bbc1a4a0badf",
+ "references": [
+ {
+ "id": "dash-developer-welcome",
+ "path": "assets/mascot/dash-developer-welcome.png",
+ "sha256": "38b2c5bb87c94326bcab6463f74fc785414d8539e9175e088b5a5c797a466e09"
+ },
+ {
+ "id": "dash-developer-build",
+ "path": "assets/mascot/dash-developer-build.png",
+ "sha256": "3cca06ae5f82e33a97855ddcb38b3e59c4b750743e7bdb16103a122c492ea303"
+ }
+ ],
+ "generation": {
+ "tool": "image_gen.imagegen",
+ "model": "not reported by tool",
+ "prompt": "Use case: stylized-concept. Asset type: contextual repository README illustration, landscape PNG around 1536x1024. Reference image 1 (dash-developer-welcome) is the authoritative face, anatomy and adult developer identity. Reference image 2 (dash-developer-build) only supports the established 3D materials and paws; do not copy its seated pose. Create a unique contextual illustration with one Dash, the PHP Fast Forward fox. Preserve mature developer proportions, amber/brown eyes, orange fur, cream muzzle/cheeks, forehead tuft, triangular dark-tipped ears, small dark nose, one complete fluffy cream-tipped tail, plain purple hoodie with exactly two cream drawstrings, polished 3D shading and detailed soft fur. Keep both ears, all limbs and the entire tail inside the canvas with safe margins. Friendly capable professional, never toddler/chibi. Clean high-end navy/violet developer environment with warm orange key lighting, subtle cyan accent highlights, excellent contrast at an 840px README width. Purposeful props and readable silhouette, restrained detail. No generated text, letters, numbers, code, package labels, hoodie emblems, logos, watermarks or multiple foxes. This must illustrate the specific software concept, not reuse a waving mascot portrait. Scene: Dash inspects a carefully sealed immutable message capsule on a web communications desk. The capsule has three visible layers: a thin metadata/header card, a thicker payload chamber and a readable flow ribbon made of abstract colored stripes. Several response containers of distinct shapes are neatly arranged nearby, representing structured JSON, document, text, redirect and empty responses without any letters. Dash holds a capsule gently rather than editing its contents. Purpose: immutable PSR-7 messages and payload-aware response types.",
+ "transparent_background": false
+ },
+ "output": {
+ "sha256": "76dfd3ddb316d8196d5316805a6153f8a6d109b8c85ec49de8e2f3ff8557e745",
+ "bytes": 2035002,
+ "dimensions": [
+ 1536,
+ 1024
+ ]
+ },
+ "visual_review": {
+ "status": "reviewed",
+ "checks": [
+ "Recognizable orange fox with cream muzzle and tail tip, amber eyes and plain purple hoodie",
+ "Single Dash and repository-specific scene",
+ "Readable at README size; no generated package title or logo"
+ ],
+ "limitations": "Contextual illustration, not an anatomy reference sheet."
+ },
+ "publication": {
+ "status": "authorized",
+ "authority": "maintainer-request",
+ "date": "2026-10-05",
+ "scope": "repository README and documentation",
+ "evidence": "Maintainer requested contextual Dash artwork for each implemented repository, public PRs, and replacement of the previous banner at docs/_static/mascot-banner.png."
+ },
+ "rights": "Generated for authorized repository identity work. Historical reference-art rights remain unrecorded; no independent third-party asset license is asserted.",
+ "id": "reference-dash-package-http-message",
+ "context": "Dash inspects immutable message layers and response forms",
+ "central_copy": "references/ecosystem/http-message.png",
+ "consumer_source": {
+ "repository": "php-fast-forward/http-message",
+ "path": "docs/_static/mascot-banner.png",
+ "commit": "56c14f67065e444e1d0bde89a19fd63d2eec8cfe",
+ "git_blob_sha": "16063bd2c3694dfa19f5f240b91c7e3e9f2ea212",
+ "url": "https://github.com/php-fast-forward/http-message/blob/56c14f67065e444e1d0bde89a19fd63d2eec8cfe/docs/_static/mascot-banner.png",
+ "source_scope": "public-pull-request-head",
+ "verified_on": "2026-10-05"
+ }
+ },
+ {
+ "pull_request": "https://github.com/php-fast-forward/iterators/pull/1",
+ "schema_version": 1,
+ "asset": "docs/_static/mascot-banner.png",
+ "repository": "php-fast-forward/iterators",
+ "collection": "developer",
+ "character": "Dash",
+ "source_kit_commit": "654e4a463533f1d8b8223369b3b0bbc1a4a0badf",
+ "references": [
+ {
+ "id": "dash-developer-welcome",
+ "path": "assets/mascot/dash-developer-welcome.png",
+ "sha256": "38b2c5bb87c94326bcab6463f74fc785414d8539e9175e088b5a5c797a466e09"
+ },
+ {
+ "id": "dash-developer-build",
+ "path": "assets/mascot/dash-developer-build.png",
+ "sha256": "3cca06ae5f82e33a97855ddcb38b3e59c4b750743e7bdb16103a122c492ea303"
+ }
+ ],
+ "generation": {
+ "tool": "image_gen.imagegen",
+ "model": "not reported by tool",
+ "prompt": "Use case: stylized-concept. Asset type: contextual repository README illustration, landscape PNG around 1536x1024. Reference image 1 (dash-developer-welcome) is the authoritative face, anatomy and adult developer identity. Reference image 2 (dash-developer-build) only supports the established 3D materials and paws; do not copy its seated pose. Create a unique contextual illustration with one Dash, the PHP Fast Forward fox. Preserve mature developer proportions, amber/brown eyes, orange fur, cream muzzle/cheeks, forehead tuft, triangular dark-tipped ears, small dark nose, one complete fluffy cream-tipped tail, plain purple hoodie with exactly two cream drawstrings, polished 3D shading and detailed soft fur. Keep both ears, all limbs and the entire tail inside the canvas with safe margins. Friendly capable professional, never toddler/chibi. Clean high-end navy/violet developer environment with warm orange key lighting, subtle cyan accent highlights, excellent contrast at an 840px README width. Purposeful props and readable silhouette, restrained detail. No generated text, letters, numbers, code, package labels, hoodie emblems, logos, watermarks or multiple foxes. This must illustrate the specific software concept, not reuse a waving mascot portrait. Scene: Dash guides a stream of data beads through a clear sorting workbench. He leans slightly forward while gently inspecting the next bead with a small magnifying lens; a branching filter separates colors and the resulting beads collect into tidy groups of three in modular trays. A looped rail indicates sequential traversal without a chaotic conveyor factory. Sideways full-body pose, all paws/tail visible. Purpose: peeking/lookahead, filtering, grouping and chunking iterators.",
+ "transparent_background": false
+ },
+ "output": {
+ "sha256": "53160b1b44918cde59236a2ee0e47a01b49c13851e87bf8a711e63bb146aa7d4",
+ "bytes": 2176138,
+ "dimensions": [
+ 1536,
+ 1024
+ ]
+ },
+ "visual_review": {
+ "status": "reviewed",
+ "checks": [
+ "Recognizable orange fox with cream muzzle and tail tip, amber eyes and plain purple hoodie",
+ "Single Dash and repository-specific scene",
+ "Readable at README size; no generated package title or logo"
+ ],
+ "limitations": "Contextual illustration, not an anatomy reference sheet."
+ },
+ "publication": {
+ "status": "authorized",
+ "authority": "maintainer-request",
+ "date": "2026-10-05",
+ "scope": "repository README and documentation",
+ "evidence": "Maintainer requested contextual Dash artwork for each implemented repository, public PRs, and replacement of the previous banner at docs/_static/mascot-banner.png."
+ },
+ "rights": "Generated for authorized repository identity work. Historical reference-art rights remain unrecorded; no independent third-party asset license is asserted.",
+ "id": "reference-dash-package-iterators",
+ "context": "Dash traverses, filters and groups a stream of data",
+ "central_copy": "references/ecosystem/iterators.png",
+ "consumer_source": {
+ "repository": "php-fast-forward/iterators",
+ "path": "docs/_static/mascot-banner.png",
+ "commit": "4e422131389727502f01370901f76eeacc2a9ebd",
+ "git_blob_sha": "887163549eadbeec61a9092f22cbfee81480199d",
+ "url": "https://github.com/php-fast-forward/iterators/blob/4e422131389727502f01370901f76eeacc2a9ebd/docs/_static/mascot-banner.png",
+ "source_scope": "public-pull-request-head",
+ "verified_on": "2026-10-05"
+ }
+ },
+ {
+ "pull_request": "https://github.com/php-fast-forward/phpdoc-bootstrap-template/pull/5",
+ "schema_version": 1,
+ "asset": "docs/_static/mascot-banner.png",
+ "repository": "php-fast-forward/phpdoc-bootstrap-template",
+ "collection": "developer",
+ "character": "Dash",
+ "source_kit_commit": "654e4a463533f1d8b8223369b3b0bbc1a4a0badf",
+ "references": [
+ {
+ "id": "dash-developer-welcome",
+ "path": "assets/mascot/dash-developer-welcome.png",
+ "sha256": "38b2c5bb87c94326bcab6463f74fc785414d8539e9175e088b5a5c797a466e09"
+ },
+ {
+ "id": "dash-developer-build",
+ "path": "assets/mascot/dash-developer-build.png",
+ "sha256": "3cca06ae5f82e33a97855ddcb38b3e59c4b750743e7bdb16103a122c492ea303"
+ }
+ ],
+ "generation": {
+ "tool": "image_gen.imagegen",
+ "model": "not reported by tool",
+ "prompt": "Use case: stylized-concept. Asset type: contextual repository README illustration, landscape PNG around 1536x1024. Reference image 1 (dash-developer-welcome) is the authoritative face, anatomy and adult developer identity. Reference image 2 (dash-developer-build) only supports the established 3D materials and paws; do not copy its seated pose. Create a unique contextual illustration with one Dash, the PHP Fast Forward fox. Preserve mature developer proportions, amber/brown eyes, orange fur, cream muzzle/cheeks, forehead tuft, triangular dark-tipped ears, small dark nose, one complete fluffy cream-tipped tail, plain purple hoodie with exactly two cream drawstrings, polished 3D shading and detailed soft fur. Keep both ears, all limbs and the entire tail inside the canvas with safe margins. Friendly capable professional, never toddler/chibi. Clean high-end navy/violet developer environment with warm orange key lighting, subtle cyan accent highlights, excellent contrast at an 840px README width. Purposeful props and readable silhouette, restrained detail. No generated text, letters, numbers, code, package labels, hoodie emblems, logos, watermarks or multiple foxes. This must illustrate the specific software concept, not reuse a waving mascot portrait. Scene: Dash is a documentation designer at a large browser-layout drafting desk. He points to a beautiful open documentation page mockup on a widescreen display: left navigation, central guide cards, a right on-this-page outline, a search field and visually formatted code strips with no letters. A smaller narrow device displays the same responsive layout. Neat books and design rulers on desk, thoughtful full-body stance, professional violet/navy/cyan palette. Purpose: a Bootstrap/Twig phpDocumentor documentation template, navigation and readable responsive API docs.",
+ "transparent_background": false
+ },
+ "output": {
+ "sha256": "7dfd57f6a8df627a41d05e1a8229f6c3602c3fed313fb680241f33f6fe950f82",
+ "bytes": 2021717,
+ "dimensions": [
+ 1536,
+ 1024
+ ]
+ },
+ "visual_review": {
+ "status": "reviewed",
+ "checks": [
+ "Recognizable orange fox with cream muzzle and tail tip, amber eyes and plain purple hoodie",
+ "Single Dash and repository-specific scene",
+ "Readable at README size; no generated package title or logo"
+ ],
+ "limitations": "Contextual illustration, not an anatomy reference sheet."
+ },
+ "publication": {
+ "status": "authorized",
+ "authority": "maintainer-request",
+ "date": "2026-10-05",
+ "scope": "repository README and documentation",
+ "evidence": "Maintainer requested contextual Dash artwork for each implemented repository, public PRs, and replacement of the previous banner at docs/_static/mascot-banner.png."
+ },
+ "rights": "Generated for authorized repository identity work. Historical reference-art rights remain unrecorded; no independent third-party asset license is asserted.",
+ "artwork_pull_request": "https://github.com/php-fast-forward/phpdoc-bootstrap-template/pull/3",
+ "id": "reference-dash-package-phpdoc-bootstrap-template",
+ "context": "Dash drafts responsive documentation navigation and page layouts",
+ "central_copy": "references/ecosystem/phpdoc-bootstrap-template.png",
+ "consumer_source": {
+ "repository": "php-fast-forward/phpdoc-bootstrap-template",
+ "path": "docs/_static/mascot-banner.png",
+ "commit": "a0ebeefda7fc72a8607e4800d8ba2c817a3d870d",
+ "git_blob_sha": "c817b464e0fe72b674e38e5cbf4e9388c322449e",
+ "url": "https://github.com/php-fast-forward/phpdoc-bootstrap-template/blob/a0ebeefda7fc72a8607e4800d8ba2c817a3d870d/docs/_static/mascot-banner.png",
+ "source_scope": "public-pull-request-head",
+ "verified_on": "2026-10-05"
+ }
+ },
+ {
+ "pull_request": "https://github.com/php-fast-forward/dev-tools/pull/360",
+ "schema_version": 1,
+ "asset": "docs/_static/mascot-banner.png",
+ "repository": "php-fast-forward/dev-tools",
+ "collection": "developer",
+ "character": "Dash",
+ "source_kit_commit": "654e4a463533f1d8b8223369b3b0bbc1a4a0badf",
+ "references": [
+ {
+ "id": "dash-developer-welcome",
+ "path": "assets/mascot/dash-developer-welcome.png",
+ "sha256": "38b2c5bb87c94326bcab6463f74fc785414d8539e9175e088b5a5c797a466e09"
+ },
+ {
+ "id": "dash-developer-build",
+ "path": "assets/mascot/dash-developer-build.png",
+ "sha256": "3cca06ae5f82e33a97855ddcb38b3e59c4b750743e7bdb16103a122c492ea303"
+ }
+ ],
+ "generation": {
+ "tool": "image_gen.imagegen",
+ "model": "not reported by tool",
+ "prompt": "Use case: stylized-concept. Asset type: contextual repository README illustration, landscape PNG around 1536x1024. Reference image 1 (dash-developer-welcome) is the authoritative face, anatomy and adult developer identity. Reference image 2 (dash-developer-build) only supports the established 3D materials and paws; do not copy its seated pose. Create a unique contextual illustration with one Dash, the PHP Fast Forward fox. Preserve mature developer proportions, amber/brown eyes, orange fur, cream muzzle/cheeks, forehead tuft, triangular dark-tipped ears, small dark nose, one complete fluffy cream-tipped tail, plain purple hoodie with exactly two cream drawstrings, polished 3D shading and detailed soft fur. Keep both ears, all limbs and the entire tail inside the canvas with safe margins. Friendly capable professional, never toddler/chibi. Clean high-end navy/violet developer environment with warm orange key lighting, subtle cyan accent highlights, excellent contrast at an 840px README width. Purposeful props and readable silhouette, restrained detail. No generated text, letters, numbers, code, package labels, hoodie emblems, logos, watermarks or multiple foxes. This must illustrate the specific software concept, not reuse a waving mascot portrait. Scene: Dash is a developer quality engineer in a robust code workshop. He stands at a multi-monitor workbench and uses a diagnostic stylus to coordinate a pipeline of abstract test-check tiles, code-style alignment rulers, a refactoring puzzle jig and a documentation book station. A central compact console controls all those quality tools. No assertion of real test results; conceptual green geometric check tokens only, no metrics text. Purpose: unified development quality checks, reports, documentation and repository bootstrap.",
+ "transparent_background": false
+ },
+ "output": {
+ "sha256": "b8b569a5cfd84474f3d2d9a6d411bdf0aa00a6188c2e5c0734b1f9ce173c13ec",
+ "bytes": 2092029,
+ "dimensions": [
+ 1536,
+ 1024
+ ]
+ },
+ "visual_review": {
+ "status": "reviewed",
+ "checks": [
+ "Recognizable orange fox with cream muzzle and tail tip, amber eyes and plain purple hoodie",
+ "Single Dash and repository-specific scene",
+ "Readable at README size; no generated package title or logo"
+ ],
+ "limitations": "Contextual illustration, not an anatomy reference sheet."
+ },
+ "publication": {
+ "status": "authorized",
+ "authority": "maintainer-request",
+ "date": "2026-10-05",
+ "scope": "repository README and documentation",
+ "evidence": "Maintainer requested contextual Dash artwork for each implemented repository, public PRs, and replacement of the previous banner at docs/_static/mascot-banner.png."
+ },
+ "rights": "Generated for authorized repository identity work. Historical reference-art rights remain unrecorded; no independent third-party asset license is asserted.",
+ "id": "reference-dash-package-dev-tools",
+ "context": "Dash coordinates testing, style, refactoring and documentation tools",
+ "central_copy": "references/ecosystem/dev-tools.png",
+ "consumer_source": {
+ "repository": "php-fast-forward/dev-tools",
+ "path": "docs/_static/mascot-banner.png",
+ "commit": "1ff10624f08642d50437cd33d337a43972203e7e",
+ "git_blob_sha": "7c9909f8aef76259a0f8f6c070c5f343801c3e7e",
+ "url": "https://github.com/php-fast-forward/dev-tools/blob/1ff10624f08642d50437cd33d337a43972203e7e/docs/_static/mascot-banner.png",
+ "source_scope": "public-pull-request-head",
+ "verified_on": "2026-10-05"
+ }
+ }
+ ],
+ "storage_policy": {
+ "generation_receipts": "central-catalog-only",
+ "contextual_references": "references/ecosystem",
+ "consumer_contract": {
+ "readme_image": "docs/_static/mascot-banner.png",
+ "readme_reference": "repository-relative",
+ "archive_exclusions": [
+ "/docs/",
+ "/README*.md"
+ ]
+ },
+ "verified_on": "2026-10-05"
+ }
+}
diff --git a/docs/brand/repository-rollout.md b/docs/brand/repository-rollout.md
new file mode 100644
index 0000000..d846956
--- /dev/null
+++ b/docs/brand/repository-rollout.md
@@ -0,0 +1,45 @@
+# Dash repository rollout
+
+Audit date: 2026-10-05. This is an implementation receipt; linked PRs and CI states may change after the audit.
+
+The organization had 40 repositories: 16 PHP libraries with source on `main`, one documentation template with Twig/CSS implementation, two resource/runtime projects with submitted implementation PRs, and this central identity repository. All 19 consumer repositories now have an open Dash README PR; this kit already includes Dash in its root and multilingual profiles through [PR #7](https://github.com/php-fast-forward/.github/pull/7).
+
+Each consumer receives a distinct contextual Dash illustration under `docs/_static/mascot-banner.png`, presented at 840 pixels wide in the root README. The README references the image through its repository-relative path. The generic welcome copy is removed. Enum's `enum-mascot-banner.png` and framework's `mascot.png` are removed; Sphinx references use the shared replacement path. Dev-tools replaces its existing `mascot-banner.png` in place.
+
+The [contextual artwork catalog](repository-artwork.json) records all 19 exact prompts, canonical reference hashes, distinct output hashes, dimensions, publication scope and pinned consumer source commits. Its central copies are the nineteen files under [`references/ecosystem/`](../../references/README.md). The earlier thirteen package references were retired into `archived_sources`, with the same source IDs and original bytes retained in the ignored local backup. Generation receipts and character guidance stay in this central kit; consumer artwork PRs contain no generation receipt or brand-provenance README. The developer welcome/build references remain canonical; these scenes are contextual applications. Source kit commit: `654e4a463533f1d8b8223369b3b0bbc1a4a0badf`. Character definitions remain owned by this kit and its [Dash artwork skill](../../skills/dash-art/SKILL.md).
+
+The maintainer explicitly requested repository-specific artwork, public PRs and replacement of the old banners on 2026-10-05, then required a relative README image path and a uniform archive policy. All 19 consumers exclude `/docs/` and `/README*.md` through `.gitattributes`, keeping the README and its banner together outside package archives. The archive check confirmed both exclusions while preserving licenses and runtime files. This scope does not assert a general asset license or settle historical source rights. The documentation template's runtime identity assets belong to its separate design-system PR and remain included in its package.
+
+Existing local working trees and unsubmitted artwork were not modified. All consumer work used isolated checkouts.
+
+| Repository | README PR |
+| --- | --- |
+| `agents` | [#4](https://github.com/php-fast-forward/agents/pull/4) |
+| `changelog` | [#12](https://github.com/php-fast-forward/changelog/pull/12) |
+| `clock` | [#1](https://github.com/php-fast-forward/clock/pull/1) |
+| `composer-installers` | [#10](https://github.com/php-fast-forward/composer-installers/pull/10) |
+| `config` | [#4](https://github.com/php-fast-forward/config/pull/4) |
+| `container` | [#7](https://github.com/php-fast-forward/container/pull/7) |
+| `defer` | [#1](https://github.com/php-fast-forward/defer/pull/1) |
+| `dev-tools` | [#360](https://github.com/php-fast-forward/dev-tools/pull/360) |
+| `enum` | [#5](https://github.com/php-fast-forward/enum/pull/5) |
+| `event-dispatcher` | [#1](https://github.com/php-fast-forward/event-dispatcher/pull/1) |
+| `fork` | [#2](https://github.com/php-fast-forward/fork/pull/2) |
+| `framework` | [#9](https://github.com/php-fast-forward/framework/pull/9) |
+| `github-actions` | [#3](https://github.com/php-fast-forward/github-actions/pull/3) |
+| `http` | [#1](https://github.com/php-fast-forward/http/pull/1) |
+| `http-client` | [#1](https://github.com/php-fast-forward/http-client/pull/1) |
+| `http-factory` | [#1](https://github.com/php-fast-forward/http-factory/pull/1) |
+| `http-message` | [#1](https://github.com/php-fast-forward/http-message/pull/1) |
+| `iterators` | [#1](https://github.com/php-fast-forward/iterators/pull/1) |
+| `phpdoc-bootstrap-template` | [#5](https://github.com/php-fast-forward/phpdoc-bootstrap-template/pull/5) |
+
+The `agents` implementation is a Markdown resource bundle submitted in PR #2; the `github-actions` PHP runtime is submitted in PR #2. Their new README PRs target `main` independently, without modifying or merging those implementation PRs. The documentation template is included because its Twig/CSS is executable template code even though it has no PHP `src/` tree.
+
+The other 20 repositories had no default branch or published tree and received no placeholder PR: `memoize`, `cache`, `logger`, `console`, `template-renderer`, `feature-toggle`, `promises`, `http-middleware`, `scheduler`, `http-content-negotiation`, `http-healthcheck`, `dockerfiles`, `http-cache`, `http-apcu`, `http-phpinfo`, `application`, `http-error-handler`, `runtime`, `php-fast-forward`, `http-server`.
+
+Validation covered distinct PNG hashes and dimensions, canonical input hashes, image path and alt text, relative README targets, archive exclusion rules, stale-banner removal and clean text diffs. All 19 final consumer HEADs matched their push destinations and GitHub PR heads; image bytes remained unchanged during cleanup. The central references match those exact Git blobs and output receipts. `composer-installers` Composer metadata validation and `changelog` skill-link verification also passed. The latter has a unique documentation fragment; `framework` has an Unreleased entry per its contract.
+
+The required local full checks in `framework` and `dev-tools` were attempted but failed in isolated checkouts without project dependencies; the globally resolved tool also had missing dependencies. No consumer PHP-suite or coverage pass is asserted. Repository CI/reviews remain separate from image validation. At the earlier verification, the existing Composer Audit gate failed in `enum`, `framework` and `dev-tools`; `dev-tools` additionally reported an unrelated Rector configuration error. Wiki automation updated only the wiki submodule pointer in `enum` and `dev-tools`; the contextual image hashes remained unchanged. Current check states are available on the linked PRs.
+
+All PRs were opened and attached to the originating task. The documentation template's original artwork PR [#3](https://github.com/php-fast-forward/phpdoc-bootstrap-template/pull/3) was merged; its final README/archive cleanup is the open follow-up [#5](https://github.com/php-fast-forward/phpdoc-bootstrap-template/pull/5). The nineteen PRs linked above were open at the final audit. No release or deployment was performed by this rollout.
diff --git a/phpunit.xml b/phpunit.xml
new file mode 100644
index 0000000..35130e3
--- /dev/null
+++ b/phpunit.xml
@@ -0,0 +1,8 @@
+
+
+
+
+ tests
+
+
+
diff --git a/profile/.DS_Store b/profile/.DS_Store
deleted file mode 100644
index 6506148..0000000
Binary files a/profile/.DS_Store and /dev/null differ
diff --git a/profile/README.es.md b/profile/README.es.md
new file mode 100644
index 0000000..e10ceeb
--- /dev/null
+++ b/profile/README.es.md
@@ -0,0 +1,133 @@
+# PHP Fast Forward
+
+
+ El framework PHP para quienes quieren desarrollar con agilidad sin renunciar a la arquitectura.
+
+
+
+ PSR-first • componible • orientado a eventos • personas + agentes
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+## Por qué existe Fast Forward
+
+PHP Fast Forward se está construyendo para quienes quieren entregar rápido y conservar una arquitectura que puedan evolucionar. La propuesta es reducir la dependencia del framework, el acoplamiento oculto y la configuración repetitiva, manteniendo límites claros para la aplicación.
+
+Una buena experiencia de desarrollo debe surgir de valores predeterminados útiles, estándares de la comunidad y componentes consolidados. Fast Forward parte de interfaces PSR y composición, apoyándose en proyectos como Symfony, Nyholm, PHP-DI y Laminas, sin exigir un vocabulario nuevo para cada problema conocido.
+
+El ecosistema incluye paquetes implementados y repositorios públicos que representan módulos futuros. La misión es construir un ecosistema completo de framework donde escribas menos clases, configures menos cosas a mano y mantengas el control de los componentes que usa tu aplicación. La existencia de un repositorio público no significa que el módulo esté listo para usar; consulta su README y sus releases.
+
+
+
+
+
+## Qué lo hace diferente
+
+- **PSR-first desde el diseño.** HTTP, contenedores, eventos, relojes, factories y abstracciones de cliente usan estándares de la comunidad. Cada paquete documenta las interfaces que implementa.
+- **Pocas clases, poca ceremonia.** El metapaquete del framework instala la base principal, y un service provider del framework ofrece un único punto de inicialización.
+- **Fundamentos componibles.** Los paquetes cubren configuración, contenedores, HTTP, eventos PSR-14, relojes PSR-20, iteradores, creación de procesos con fork y más. Elige las partes que necesita tu aplicación.
+- **Componentes consolidados.** Fast Forward se apoya en componentes establecidos de PHP y concentra su propio código en integración, valores predeterminados prácticos y flujo de desarrollo.
+- **Base para web y eventos.** Los paquetes de HTTP y event-dispatcher disponibles cubren solicitudes/respuestas y aplicaciones orientadas a eventos. Las capacidades asíncronas más amplias forman parte de la hoja de ruta.
+- **Bridges y adapters.** Integra herramientas existentes mediante contratos claros, para que la aplicación dependa de límites estables en lugar de repartir detalles específicos de un proveedor por todo el código.
+- **Flujos para personas y agentes.** Dev Tools incluye skills reutilizables, agentes de proyecto, salida estructurada de comandos y automatizaciones de repositorio que las personas pueden inspeccionar y revisar.
+
+## El ecosistema ya disponible
+
+- [`fast-forward/framework`](https://github.com/php-fast-forward/framework) reúne la base principal en un único service provider del framework.
+- [`fast-forward/dev-tools`](https://github.com/php-fast-forward/dev-tools) estandariza controles de calidad, documentación, preparación de repositorios, releases, skills reutilizables y flujos de agentes de proyecto.
+- [`fast-forward/http`](https://github.com/php-fast-forward/http) ofrece una base HTTP agregada en torno a PSR-7, PSR-17 y PSR-18.
+- [`fast-forward/event-dispatcher`](https://github.com/php-fast-forward/event-dispatcher) ofrece despacho PSR-14, eventos con nombre, subscribers, prioridades y listeners definidos mediante atributos.
+- [`fast-forward/container`](https://github.com/php-fast-forward/container) agrega contenedores PSR-11 y service providers.
+- [`fast-forward/config`](https://github.com/php-fast-forward/config) carga y combina fuentes de configuración, con caché opcional y soporte para providers.
+- [`fast-forward/enum`](https://github.com/php-fast-forward/enum) ofrece helpers reutilizables para enums, catálogos de dominio y helpers para transiciones de flujo.
+- [`fast-forward/clock`](https://github.com/php-fast-forward/clock), [`fast-forward/fork`](https://github.com/php-fast-forward/fork) y [`fast-forward/iterators`](https://github.com/php-fast-forward/iterators) ofrecen herramientas específicas para tiempo, procesos creados con fork y datos iterables. El uso de fork requiere un entorno CLI compatible con Unix y soporte para control de procesos.
+
+## Hoja de ruta pública
+
+Algunos repositorios públicos describen la forma prevista del ecosistema antes de implementar sus módulos. El trabajo planificado incluye:
+
+- utilidades de consola y una capa de CLI más sencilla para aplicaciones
+- primitivas de planificación y orquestación de tareas recurrentes
+- capacidades de colas y event bus para flujos asíncronos desacoplados
+- más módulos orientados a la aplicación para completar la experiencia del framework
+
+La intención arquitectónica sigue siendo la misma: consumir bibliotecas consolidadas mediante bridges, adapters o capas de integración con contratos estables de Fast Forward. El objetivo es ayudar a las aplicaciones a mantener la portabilidad y un bajo acoplamiento cuando cambie la implementación subyacente. Sigue cada repositorio para conocer el estado de su implementación y sus releases.
+
+## El multiplicador de fuerza: Dev Tools
+
+[`fast-forward/dev-tools`](https://github.com/php-fast-forward/dev-tools) se ocupa del mantenimiento repetitivo compartido por muchos repositorios. Funciona como plugin de Composer y como binario local, con una resolución de configuración que prioriza el repositorio consumidor y conserva sus personalizaciones.
+
+Los repositorios pueden sincronizar plantillas, valores predeterminados y convenciones operativas mediante el mismo conjunto de herramientas. Las skills de Fast Forward y los prompts de los agentes de proyecto se encuentran allí junto a los comandos de mantenimiento.
+
+Dev Tools ofrece:
+
+- generación de documentación y wiki, con workflows compartidos de build y publicación
+- pruebas, cobertura, métricas, controles de estilo de código, controles de PHPDoc y refactorización con Rector
+- análisis de dependencias, vistas previas de actualización y actualizaciones asistidas
+- creación y validación de changelog, inferencia de versión, generación de notas de release y automatización de releases
+- generación de CODEOWNERS, metadatos de financiación, Git hooks, preparación de repositorios y sincronización de workflows
+- agentes de proyecto y skills reutilizables para personas y agentes de IA
+
+Una lista de mantenimiento más corta deja menos cosas que recordar a tu yo del futuro.
+
+## La propuesta en un pequeño ejemplo
+
+Con PHP 8.3 o superior, instala el metapaquete del framework en tu proyecto:
+
+```sh
+composer require fast-forward/framework
+```
+
+Después, carga el autoloader de Composer y registra el provider del framework:
+
+```php
+
+
+
diff --git a/profile/README.md b/profile/README.md
index ebedaf9..1b96c29 100644
--- a/profile/README.md
+++ b/profile/README.md
@@ -1,5 +1,15 @@
+# PHP Fast Forward
+
+
@@ -25,74 +35,75 @@
## Why Fast Forward exists
-Fast Forward is being built for developers who love shipping quickly, but refuse to pay for that speed with framework lock-in, hidden coupling, and architecture that gets harder to evolve every month.
+PHP Fast Forward is being built for developers who want to ship quickly and keep an architecture they can evolve. The aim is to reduce framework lock-in, hidden coupling, and repetitive setup while keeping the application's boundaries clear.
-We believe great developer experience should come from excellent defaults, community standards, and battle-tested components. Not from proprietary magic. Not from teaching people to normalize anti-patterns. Not from forcing your application to think like the framework forever.
+Good developer experience should come from useful defaults, community standards, and proven components. Fast Forward starts with PSR interfaces and composition, drawing on projects such as Symfony, Nyholm, PHP-DI, and Laminas instead of asking applications to adopt a new vocabulary for every familiar problem.
-That is why Fast Forward is PSR-first, interface-first, and composition-first. We stand on the shoulders of the PHP community, trusting standards and proven components such as Symfony, Nyholm, PHP-DI, and Laminas, then wiring them together so your application feels smooth from day one.
-
-Fast Forward already spans more than 30 public repositories. Some are active packages shipping today. Others are intentionally public placeholders for modules that belong to the roadmap and will be implemented over time. The mission is bigger than a package collection: we are building a complete framework ecosystem where you write fewer classes, configure less by hand, and still keep clean architectural boundaries.
+The ecosystem includes implemented packages and public repositories that represent future modules. The mission is a complete framework ecosystem where you write fewer classes, configure less by hand, and retain control over the components your application uses. A public repository alone does not mean a module is ready to use; check its README and releases.
-
+
## What makes it different
-- **PSR-first by design.** HTTP, containers, events, clocks, factories, and client abstractions follow community standards instead of inventing new walls around your code.
-- **Few classes, little ceremony.** Install the metapackage, register the framework provider, and get a practical default stack without hand-wiring every moving part.
-- **Composable foundations.** The ecosystem already ships container, config, HTTP, PSR-7/17/18 utilities, PSR-14 events, PSR-20 clocks, iterators, process forking, and more.
-- **Battle-tested internals.** Fast Forward leans on respected components from the wider PHP ecosystem and focuses its own code on orchestration, ergonomics, and developer flow.
-- **Built for web and event-driven apps.** The framework is not limited to request/response work; it is designed to feel natural for event-driven and async-friendly application design too.
-- **Bridge-friendly integration philosophy.** When a great tool already exists, Fast Forward would rather integrate it behind clean contracts and adapters than force your application to depend directly on vendor-specific APIs.
-- **Agent-ready from the start.** We are shaping Fast Forward for the next workflow: humans and AI agents building together with reusable skills, subagents, structured automation, and repo-aware tooling.
+- **PSR-first by design.** HTTP, containers, events, clocks, factories, and client abstractions use community standards. Each package documents the interfaces it implements.
+- **Few classes, little ceremony.** The framework metapackage installs the core stack, and a framework service provider gives it a single bootstrap entrypoint.
+- **Composable foundations.** Packages cover configuration, containers, HTTP, PSR-14 events, PSR-20 clocks, iterators, process forking, and more. Choose the pieces your application needs.
+- **Proven internals.** Fast Forward builds on established PHP components and focuses its own code on integration, practical defaults, and developer flow.
+- **Web and event-driven foundations.** The available HTTP and event-dispatcher packages support request/response and event-driven work. Broader asynchronous capabilities are part of the roadmap.
+- **Bridges and adapters.** Integrate existing tools behind clear contracts so applications can depend on stable boundaries rather than vendor-specific details throughout the codebase.
+- **Human and agent workflows.** Dev Tools packages reusable skills, project agents, structured command output, and repository automation that people can inspect and review.
## The ecosystem already shipping
- [`fast-forward/framework`](https://github.com/php-fast-forward/framework) bundles the core stack behind a single framework service provider.
-- [`fast-forward/dev-tools`](https://github.com/php-fast-forward/dev-tools) turns multi-repository maintenance, quality gates, documentation generation, release work, packaged skills, and project-agent workflows into a repeatable workflow.
-- [`fast-forward/http`](https://github.com/php-fast-forward/http) gives you a ready-to-use HTTP stack built around PSR-7, PSR-17, and PSR-18.
-- [`fast-forward/event-dispatcher`](https://github.com/php-fast-forward/event-dispatcher) brings PSR-14 dispatching, named events, subscribers, priorities, and attribute-based listeners.
-- [`fast-forward/container`](https://github.com/php-fast-forward/container) aggregates PSR-11 containers and service providers with a clean integration story.
-- [`fast-forward/config`](https://github.com/php-fast-forward/config) provides flexible, layered configuration loading with caching and provider support.
-- [`fast-forward/enum`](https://github.com/php-fast-forward/enum) ships domain-first enums, reusable enum helper traits, and state-machine transition helpers.
-- [`fast-forward/clock`](https://github.com/php-fast-forward/clock), [`fast-forward/fork`](https://github.com/php-fast-forward/fork), and [`fast-forward/iterators`](https://github.com/php-fast-forward/iterators) extend the ecosystem with focused, production-friendly building blocks.
+- [`fast-forward/dev-tools`](https://github.com/php-fast-forward/dev-tools) standardizes quality checks, documentation, repository bootstrap, release work, reusable skills, and project-agent workflows.
+- [`fast-forward/http`](https://github.com/php-fast-forward/http) provides an aggregate HTTP stack built around PSR-7, PSR-17, and PSR-18.
+- [`fast-forward/event-dispatcher`](https://github.com/php-fast-forward/event-dispatcher) provides PSR-14 dispatching, named events, subscribers, priorities, and attribute-based listeners.
+- [`fast-forward/container`](https://github.com/php-fast-forward/container) aggregates PSR-11 containers and service providers.
+- [`fast-forward/config`](https://github.com/php-fast-forward/config) loads and combines configuration sources with optional caching and provider support.
+- [`fast-forward/enum`](https://github.com/php-fast-forward/enum) provides reusable enum helpers, domain catalogs, and workflow transition helpers.
+- [`fast-forward/clock`](https://github.com/php-fast-forward/clock), [`fast-forward/fork`](https://github.com/php-fast-forward/fork), and [`fast-forward/iterators`](https://github.com/php-fast-forward/iterators) provide focused tools for time, forked workers, and iterable data. Forking requires a supported Unix-like CLI runtime with process-control support.
## Public roadmap
-Several public repositories in the organization are there because the shape of the ecosystem matters, even before every module is implemented.
-
-The roadmap already includes:
+Some public repositories describe the intended shape of the ecosystem before their modules are implemented. Planned work includes:
-- console utilities and a cleaner CLI layer for application work
+- console utilities and a cleaner CLI layer for applications
- scheduling primitives and orchestration for recurring jobs
-- queue and event-bus capabilities for decoupled async workflows
-- more application-facing modules that complete the end-to-end framework experience
+- queue and event-bus capabilities for decoupled asynchronous workflows
+- more application-facing modules for the complete framework experience
-The architectural intent is consistent across all of them: whenever possible, Fast Forward will consume proven libraries through bridges, adapters, or integration layers that expose stable Fast Forward contracts. The goal is to keep applications portable and low-coupled, even when the underlying engine changes.
+The architectural intent remains the same: consume proven libraries through bridges, adapters, or integration layers with stable Fast Forward contracts. The goal is to help applications remain portable and loosely coupled when an underlying implementation changes. Follow each repository for its implementation and release status.
## The force multiplier: Dev Tools
-One of the strongest parts of the ecosystem is [`fast-forward/dev-tools`](https://github.com/php-fast-forward/dev-tools). It exists to remove the boring, repetitive, easy-to-forget work that slows down maintainers and open-source teams.
+[`fast-forward/dev-tools`](https://github.com/php-fast-forward/dev-tools) handles the repetitive maintenance work shared by many repositories. It works as a Composer plugin and a local binary, with consumer-first configuration that preserves local overrides.
-With Dev Tools, Fast Forward repositories can share and propagate repository templates, defaults, and operational conventions without maintainers manually copying files across every project whenever something changes.
+Repositories can synchronize templates, defaults, and operational conventions through the same toolkit. Fast Forward skills and project-agent prompts live there alongside the maintenance commands.
-For now, Fast Forward skills and project-agent prompts live there as part of the same operational toolkit, instead of being presented as a separate product line.
+Dev Tools provides:
-It also ships serious leverage for consumer repositories:
+- documentation and wiki generation, with shared build and publication workflows
+- tests, coverage, metrics, code-style checks, PHPDoc checks, and Rector-based refactoring
+- dependency analysis, upgrade previews, and assisted upgrades
+- changelog authoring and validation, version inference, release-note rendering, and release automation
+- CODEOWNERS generation, funding metadata, Git hooks, repository bootstrap, and synchronized workflow stubs
+- packaged project agents and reusable skills for people and AI agents
-- documentation generation with pull request previews
-- automated wiki generation with preview branches and publication workflows
-- test coverage, metrics, code-style fixing, and Rector-based refactoring
-- dependency health validation and assisted upgrade workflows
-- changelog authoring, validation, next-version inference, release-note rendering, and release automation
-- CODEOWNERS, funding metadata, git hooks, repository bootstrap, and synchronized workflow stubs
-- packaged project agents, subagents, reusable skills, and automation that works well in both human and AI-agent flows
-
-If you maintain many repositories, this is the kind of tooling that gives you your weekends back.
+A smaller maintenance checklist gives future-you fewer things to remember.
## The promise in one small snippet
+With PHP 8.3 or higher, install the framework metapackage in your project:
+
+```sh
+composer require fast-forward/framework
+```
+
+Then load Composer's autoloader and register the framework provider:
+
```php
-
-
+This bootstraps the core services. The [framework README](https://github.com/php-fast-forward/framework) shows how to retrieve them. That is the direction: fewer classes, less manual plumbing, useful defaults, and clearer boundaries.
## Build with us
-If you have ever wanted the momentum of modern PHP frameworks without the coupling tax they usually ask you to accept, you are exactly who Fast Forward is being built for.
+Dash, the Fast Forward fox, welcomes contributors and accompanies the documentation. The shared [brand and mascot kit](../assets/README.md) defines the character, visual system, reusable assets, and reference artwork. Use it when creating a package banner, documentation page, or community contribution.
+
+The [public visual library](https://php-fast-forward.github.io/.github/) is the GitHub Pages destination for logo variants, mascot poses, and documentation patterns. Its source remains in this repository.
-Explore the organization, star the repositories that resonate with you, open issues, send pull requests, and help shape a PHP ecosystem that moves fast without teaching people to slow their architecture down.
+Explore the [organization](https://github.com/php-fast-forward), read the package guides, open an issue with a reproducible example, or send a focused pull request. Help shape a PHP ecosystem that moves development forward while keeping architecture understandable.
-
+
diff --git a/profile/README.pt-BR.md b/profile/README.pt-BR.md
new file mode 100644
index 0000000..0ee3eca
--- /dev/null
+++ b/profile/README.pt-BR.md
@@ -0,0 +1,133 @@
+# PHP Fast Forward
+
+
+ O framework PHP para quem quer desenvolver com agilidade sem abrir mão da arquitetura.
+
+
+
+ PSR-first • componível • orientado a eventos • pessoas + agentes
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+## Por que o Fast Forward existe
+
+O PHP Fast Forward está sendo construído para quem quer entregar rápido e manter uma arquitetura que possa evoluir. A proposta é reduzir a dependência do framework, o acoplamento oculto e a configuração repetitiva, preservando limites claros para a aplicação.
+
+Uma boa experiência de desenvolvimento deve vir de padrões úteis, convenções da comunidade e componentes consolidados. O Fast Forward parte de interfaces PSR e composição, apoiando-se em projetos como Symfony, Nyholm, PHP-DI e Laminas, sem exigir um vocabulário novo para cada problema conhecido.
+
+O ecossistema inclui pacotes implementados e repositórios públicos que representam módulos futuros. A missão é construir um ecossistema completo de framework em que você escreva menos classes, configure menos coisas à mão e mantenha o controle dos componentes usados pela aplicação. A existência de um repositório público não significa que o módulo esteja pronto para uso; consulte seu README e suas releases.
+
+
+
+
+
+## O que ele tem de diferente
+
+- **PSR-first desde o projeto.** HTTP, containers, eventos, relógios, factories e abstrações de cliente usam padrões da comunidade. Cada pacote documenta as interfaces que implementa.
+- **Poucas classes, pouca cerimônia.** O metapacote do framework instala a base principal, e um service provider do framework oferece um único ponto de inicialização.
+- **Fundamentos componíveis.** Os pacotes cobrem configuração, containers, HTTP, eventos PSR-14, relógios PSR-20, iteradores, criação de processos com fork e mais. Escolha as partes de que sua aplicação precisa.
+- **Componentes consolidados.** O Fast Forward se apoia em componentes estabelecidos do PHP e concentra seu próprio código em integração, padrões práticos e fluxo de desenvolvimento.
+- **Base para web e eventos.** Os pacotes de HTTP e event-dispatcher disponíveis atendem a requisições/respostas e aplicações orientadas a eventos. Capacidades assíncronas mais amplas fazem parte do roadmap.
+- **Bridges e adapters.** Integre ferramentas existentes por meio de contratos claros, para que a aplicação dependa de limites estáveis em vez de espalhar detalhes específicos de um fornecedor pelo código.
+- **Fluxos para pessoas e agentes.** O Dev Tools inclui skills reutilizáveis, agentes de projeto, saída estruturada de comandos e automações de repositório que pessoas podem inspecionar e revisar.
+
+## O ecossistema já disponível
+
+- [`fast-forward/framework`](https://github.com/php-fast-forward/framework) reúne a base principal em um único service provider do framework.
+- [`fast-forward/dev-tools`](https://github.com/php-fast-forward/dev-tools) padroniza verificações de qualidade, documentação, preparação de repositórios, releases, skills reutilizáveis e fluxos de agentes de projeto.
+- [`fast-forward/http`](https://github.com/php-fast-forward/http) oferece uma base HTTP agregada em torno de PSR-7, PSR-17 e PSR-18.
+- [`fast-forward/event-dispatcher`](https://github.com/php-fast-forward/event-dispatcher) oferece despacho PSR-14, eventos nomeados, subscribers, prioridades e listeners definidos por atributos.
+- [`fast-forward/container`](https://github.com/php-fast-forward/container) agrega containers PSR-11 e service providers.
+- [`fast-forward/config`](https://github.com/php-fast-forward/config) carrega e combina fontes de configuração, com cache opcional e suporte a providers.
+- [`fast-forward/enum`](https://github.com/php-fast-forward/enum) oferece helpers reutilizáveis para enums, catálogos de domínio e helpers para transições de fluxo.
+- [`fast-forward/clock`](https://github.com/php-fast-forward/clock), [`fast-forward/fork`](https://github.com/php-fast-forward/fork) e [`fast-forward/iterators`](https://github.com/php-fast-forward/iterators) oferecem ferramentas específicas para tempo, processos criados com fork e dados iteráveis. O uso de fork exige um ambiente CLI compatível com Unix e suporte a controle de processos.
+
+## Roadmap público
+
+Alguns repositórios públicos descrevem a forma pretendida para o ecossistema antes da implementação dos módulos. O trabalho planejado inclui:
+
+- utilitários de console e uma camada de CLI mais simples para aplicações
+- primitivas de agendamento e orquestração de tarefas recorrentes
+- recursos de filas e event bus para fluxos assíncronos desacoplados
+- mais módulos voltados à aplicação para completar a experiência do framework
+
+A intenção arquitetural continua a mesma: consumir bibliotecas consolidadas por meio de bridges, adapters ou camadas de integração com contratos estáveis do Fast Forward. O objetivo é ajudar as aplicações a manter portabilidade e baixo acoplamento quando a implementação subjacente mudar. Acompanhe cada repositório para saber o estado da implementação e das releases.
+
+## O multiplicador de força: Dev Tools
+
+O [`fast-forward/dev-tools`](https://github.com/php-fast-forward/dev-tools) cuida da manutenção repetitiva compartilhada por muitos repositórios. Funciona como plugin do Composer e como binário local, com resolução de configuração que prioriza o repositório consumidor e preserva suas customizações.
+
+Os repositórios podem sincronizar templates, padrões e convenções operacionais usando o mesmo conjunto de ferramentas. As skills do Fast Forward e os prompts dos agentes de projeto ficam ali junto dos comandos de manutenção.
+
+O Dev Tools oferece:
+
+- geração de documentação e wiki, com workflows compartilhados de build e publicação
+- testes, cobertura, métricas, verificações de estilo de código, verificações de PHPDoc e refatoração com Rector
+- análise de dependências, prévias de atualização e atualizações assistidas
+- criação e validação de changelog, inferência de versão, geração de notas de release e automação de releases
+- geração de CODEOWNERS, metadados de financiamento, Git hooks, preparação de repositórios e sincronização de workflows
+- agentes de projeto e skills reutilizáveis para pessoas e agentes de IA
+
+Uma lista menor de manutenção deixa menos coisas para o seu eu do futuro lembrar.
+
+## A proposta em um pequeno exemplo
+
+Com PHP 8.3 ou superior, instale o metapacote do framework no seu projeto:
+
+```sh
+composer require fast-forward/framework
+```
+
+Em seguida, carregue o autoloader do Composer e registre o provider do framework:
+
+```php
+
+
+
diff --git a/profile/assets/brand-hero-banner.png b/profile/assets/brand-hero-banner.png
index 90ed7d1..397cb56 100644
Binary files a/profile/assets/brand-hero-banner.png and b/profile/assets/brand-hero-banner.png differ
diff --git a/profile/assets/brand-wordmark-banner.svg b/profile/assets/brand-wordmark-banner.svg
deleted file mode 100644
index ad7eca3..0000000
--- a/profile/assets/brand-wordmark-banner.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
diff --git a/profile/assets/docs-installation-mockup.svg b/profile/assets/docs-installation-mockup.svg
deleted file mode 100644
index 769396f..0000000
--- a/profile/assets/docs-installation-mockup.svg
+++ /dev/null
@@ -1,121 +0,0 @@
-
diff --git a/profile/assets/docs-installation.png b/profile/assets/docs-installation.png
new file mode 100644
index 0000000..e663f78
Binary files /dev/null and b/profile/assets/docs-installation.png differ
diff --git a/profile/assets/mascot-wordmark-horizontal.svg b/profile/assets/mascot-wordmark-horizontal.svg
deleted file mode 100644
index c693edf..0000000
--- a/profile/assets/mascot-wordmark-horizontal.svg
+++ /dev/null
@@ -1,8 +0,0 @@
-
-
-
diff --git a/references/README.md b/references/README.md
new file mode 100644
index 0000000..5478ced
--- /dev/null
+++ b/references/README.md
@@ -0,0 +1,73 @@
+# Visual references
+
+These files help compare the character and plan future surfaces. They are not
+the token source or a promise of shipped features. The
+[asset manifest](../assets/manifest.json) records their origin and status.
+
+- Archived website concepts: supplied landing and documentation studies remain
+ in the ignored local archive and `archived_sources` metadata, outside the
+ visible brand kit. Layout and atmosphere informed the patterns; versions,
+ statistics, APIs, social destinations, dependencies, and license footers remain
+ unverified concept copy.
+- `ecosystem/`: nineteen reviewed contextual Dash illustrations, copied exactly
+ from the consumer repositories' `docs/_static/mascot-banner.png` files. Each
+ manifest record pins the source commit, image hash, dimensions and central
+ generation receipt. The developer welcome/build references govern the
+ character; these scenes demonstrate repository-specific applications. The
+ original thirteen banners were retired on 2026-10-05 with their source IDs,
+ provenance and bytes preserved in the ignored local archive. The earlier
+ `framework` banner remains in its 2026-10-03 archive entry.
+- `icons/`: archived icon collection/sprite for reference. These SVGs contain
+ vector geometry, but third-party marks and authorship have no recorded usage
+ rights. The sprite CSS now points to the actual `icon_sprite.png` filename;
+ that repair is recorded as a derivative. Prefer accessible labeled icons from
+ a documented source when implementing a production interface.
+
+The 2026-10-03 audit inspected 19 local image paths / 16 distinct contents.
+Fourteen historical package illustrations were curated and are now archived;
+their public pins, local-source distinctions and visual deviations remain in
+the manifest's `archived_sources`. Ignored generated duplicates and older
+divergent renderings were not imported. The original cute source-pack
+exports are archived in the ignored local `backup/dash/legacy-kit/`. Newly
+created Dash reference collections live in `assets/mascot/` instead.
+
+Logo direction F was selected from the local comparison: a fox signature with
+orange “Fast” and monochrome of the same geometry. The generated comparison
+image records exploration; it is not a vector master. The current production
+source is [logo-source.json](../assets/brand/logo-source.json), with eight SVGs
+described in the [asset guide](../assets/README.md#logo-masters). The official
+[Exo 2 source record](../assets/brand/source/font-source.json) establishes the
+selected lettering's provenance; it does not identify or license legacy fonts
+and artwork.
+
+The [contextual artwork catalog](../docs/brand/repository-artwork.json) keeps the
+nineteen exact prompts, canonical input hashes, output receipts and consumer
+source commits centrally. Consumer repositories use a relative README image
+path and exclude `/docs/` and `/README*.md` from package archives. Generation
+receipts stay in this identity repository.
+
+| Repository | Contextual reference |
+| --- | --- |
+| `agents` | [Reusable roles and skill resources](ecosystem/agents.png) |
+| `changelog` | [Release fragments and a history ledger](ecosystem/changelog.png) |
+| `clock` | [Live and frozen clocks](ecosystem/clock.png) |
+| `composer-installers` | [Resource bundles copied into a target folder](ecosystem/composer-installers.png) |
+| `config` | [Configuration sources and a nested settings tree](ecosystem/config.png) |
+| `container` | [Service components and an aggregate registry](ecosystem/container.png) |
+| `defer` | [Scope cleanup in reverse stack order](ecosystem/defer.png) |
+| `enum` | [A finite catalog of typed choices](ecosystem/enum.png) |
+| `event-dispatcher` | [An event routed through ordered listeners](ecosystem/event-dispatcher.png) |
+| `fork` | [Child processes and collected outputs](ecosystem/fork.png) |
+| `framework` | [Components connected through a shared bootstrap](ecosystem/framework.png) |
+| `github-actions` | [Reusable workflow stages](ecosystem/github-actions.png) |
+| `http` | [An assembled HTTP stack](ecosystem/http.png) |
+| `http-client` | [Request and response exchange](ecosystem/http-client.png) |
+| `http-factory` | [Request, response, stream and URI construction](ecosystem/http-factory.png) |
+| `http-message` | [Immutable messages and response forms](ecosystem/http-message.png) |
+| `iterators` | [Traversal, filtering and grouping](ecosystem/iterators.png) |
+| `phpdoc-bootstrap-template` | [Responsive documentation navigation](ecosystem/phpdoc-bootstrap-template.png) |
+| `dev-tools` | [Testing, style, refactoring and documentation](ecosystem/dev-tools.png) |
+
+The [specimen](../docs/brand/index.html) shows the primary developer and secondary
+editorial collections. The [assessment](../docs/brand/assessment.md) records
+remaining design work and provenance limits.
diff --git a/references/ecosystem/agents.png b/references/ecosystem/agents.png
new file mode 100644
index 0000000..3a8fa5a
Binary files /dev/null and b/references/ecosystem/agents.png differ
diff --git a/references/ecosystem/changelog.png b/references/ecosystem/changelog.png
new file mode 100644
index 0000000..6c6ad10
Binary files /dev/null and b/references/ecosystem/changelog.png differ
diff --git a/references/ecosystem/clock.png b/references/ecosystem/clock.png
new file mode 100644
index 0000000..32832bd
Binary files /dev/null and b/references/ecosystem/clock.png differ
diff --git a/references/ecosystem/composer-installers.png b/references/ecosystem/composer-installers.png
new file mode 100644
index 0000000..13e9ace
Binary files /dev/null and b/references/ecosystem/composer-installers.png differ
diff --git a/references/ecosystem/config.png b/references/ecosystem/config.png
new file mode 100644
index 0000000..da4f411
Binary files /dev/null and b/references/ecosystem/config.png differ
diff --git a/references/ecosystem/container.png b/references/ecosystem/container.png
new file mode 100644
index 0000000..2321b7f
Binary files /dev/null and b/references/ecosystem/container.png differ
diff --git a/references/ecosystem/defer.png b/references/ecosystem/defer.png
new file mode 100644
index 0000000..1baebbb
Binary files /dev/null and b/references/ecosystem/defer.png differ
diff --git a/references/ecosystem/dev-tools.png b/references/ecosystem/dev-tools.png
new file mode 100644
index 0000000..7c9909f
Binary files /dev/null and b/references/ecosystem/dev-tools.png differ
diff --git a/references/ecosystem/enum.png b/references/ecosystem/enum.png
new file mode 100644
index 0000000..e33e66e
Binary files /dev/null and b/references/ecosystem/enum.png differ
diff --git a/references/ecosystem/event-dispatcher.png b/references/ecosystem/event-dispatcher.png
new file mode 100644
index 0000000..1eb2c7d
Binary files /dev/null and b/references/ecosystem/event-dispatcher.png differ
diff --git a/references/ecosystem/fork.png b/references/ecosystem/fork.png
new file mode 100644
index 0000000..ef44517
Binary files /dev/null and b/references/ecosystem/fork.png differ
diff --git a/references/ecosystem/framework.png b/references/ecosystem/framework.png
new file mode 100644
index 0000000..7859bbe
Binary files /dev/null and b/references/ecosystem/framework.png differ
diff --git a/references/ecosystem/github-actions.png b/references/ecosystem/github-actions.png
new file mode 100644
index 0000000..b2f2641
Binary files /dev/null and b/references/ecosystem/github-actions.png differ
diff --git a/references/ecosystem/http-client.png b/references/ecosystem/http-client.png
new file mode 100644
index 0000000..2797a09
Binary files /dev/null and b/references/ecosystem/http-client.png differ
diff --git a/references/ecosystem/http-factory.png b/references/ecosystem/http-factory.png
new file mode 100644
index 0000000..c3d77e7
Binary files /dev/null and b/references/ecosystem/http-factory.png differ
diff --git a/references/ecosystem/http-message.png b/references/ecosystem/http-message.png
new file mode 100644
index 0000000..16063bd
Binary files /dev/null and b/references/ecosystem/http-message.png differ
diff --git a/references/ecosystem/http.png b/references/ecosystem/http.png
new file mode 100644
index 0000000..ea64ffd
Binary files /dev/null and b/references/ecosystem/http.png differ
diff --git a/references/ecosystem/iterators.png b/references/ecosystem/iterators.png
new file mode 100644
index 0000000..8871635
Binary files /dev/null and b/references/ecosystem/iterators.png differ
diff --git a/references/ecosystem/phpdoc-bootstrap-template.png b/references/ecosystem/phpdoc-bootstrap-template.png
new file mode 100644
index 0000000..c817b46
Binary files /dev/null and b/references/ecosystem/phpdoc-bootstrap-template.png differ
diff --git a/references/icons/icon_collection_reference_transparent_cropped.png b/references/icons/icon_collection_reference_transparent_cropped.png
new file mode 100644
index 0000000..bbb72d6
Binary files /dev/null and b/references/icons/icon_collection_reference_transparent_cropped.png differ
diff --git a/references/icons/icon_sprite.css b/references/icons/icon_sprite.css
new file mode 100644
index 0000000..d69ccdc
--- /dev/null
+++ b/references/icons/icon_sprite.css
@@ -0,0 +1,46 @@
+:root {
+ --ff-icon-sprite-url: url('./icon_sprite.png');
+ --ff-icon-size: 64px;
+}
+
+.ff-icon {
+ width: var(--ff-icon-size);
+ height: var(--ff-icon-size);
+ display: inline-block;
+ background-image: var(--ff-icon-sprite-url);
+ background-repeat: no-repeat;
+ background-size: 512px 256px;
+}
+
+.ff-icon--docs-book { background-position: -0px -0px; }
+.ff-icon--package-cube { background-position: -64px -0px; }
+.ff-icon--copy { background-position: -128px -0px; }
+.ff-icon--bolt { background-position: -192px -0px; }
+.ff-icon--modular-spark { background-position: -256px -0px; }
+.ff-icon--shield-psr { background-position: -320px -0px; }
+.ff-icon--star-open { background-position: -384px -0px; }
+.ff-icon--globe-http { background-position: -448px -0px; }
+.ff-icon--container-cube { background-position: -0px -64px; }
+.ff-icon--event-bolt { background-position: -64px -64px; }
+.ff-icon--clock { background-position: -128px -64px; }
+.ff-icon--dev-tools { background-position: -192px -64px; }
+.ff-icon--layers-factory { background-position: -256px -64px; }
+.ff-icon--php { background-position: -320px -64px; }
+.ff-icon--puzzle-psr { background-position: -384px -64px; }
+.ff-icon--leaf-lightweight { background-position: -448px -64px; }
+.ff-icon--code { background-position: -0px -128px; }
+.ff-icon--search { background-position: -64px -128px; }
+.ff-icon--home { background-position: -128px -128px; }
+.ff-icon--chevron-right { background-position: -192px -128px; }
+.ff-icon--chevron-down { background-position: -256px -128px; }
+.ff-icon--info { background-position: -320px -128px; }
+.ff-icon--github { background-position: -384px -128px; }
+.ff-icon--discord { background-position: -448px -128px; }
+.ff-icon--x-social { background-position: -0px -192px; }
+.ff-icon--youtube { background-position: -64px -192px; }
+.ff-icon--arrow-forward { background-position: -128px -192px; }
+.ff-icon--terminal { background-position: -192px -192px; }
+.ff-icon--community-users { background-position: -256px -192px; }
+.ff-icon--external-link { background-position: -320px -192px; }
+.ff-icon--security-shield { background-position: -384px -192px; }
+.ff-icon--menu { background-position: -448px -192px; }
diff --git a/references/icons/icon_sprite.png b/references/icons/icon_sprite.png
new file mode 100644
index 0000000..2acd5d1
Binary files /dev/null and b/references/icons/icon_sprite.png differ
diff --git a/references/icons/icon_sprite.svg b/references/icons/icon_sprite.svg
new file mode 100644
index 0000000..be4661d
--- /dev/null
+++ b/references/icons/icon_sprite.svg
@@ -0,0 +1,251 @@
+
+
diff --git a/references/icons/icon_sprite_manifest.json b/references/icons/icon_sprite_manifest.json
new file mode 100644
index 0000000..8f0fdb1
--- /dev/null
+++ b/references/icons/icon_sprite_manifest.json
@@ -0,0 +1,428 @@
+{
+ "name": "PHP Fast Forward icon sprite",
+ "background": "transparent",
+ "width": 1024,
+ "height": 512,
+ "cellSize": 128,
+ "iconSize": 72,
+ "columns": 8,
+ "rows": 4,
+ "icons": [
+ {
+ "name": "docs-book",
+ "description": "Documentação / livro",
+ "symbol": "icon-docs-book",
+ "x": 0,
+ "y": 0,
+ "width": 128,
+ "height": 128,
+ "iconX": 28.0,
+ "iconY": 28.0,
+ "iconWidth": 72,
+ "iconHeight": 72
+ },
+ {
+ "name": "package-cube",
+ "description": "Pacotes / componente",
+ "symbol": "icon-package-cube",
+ "x": 128,
+ "y": 0,
+ "width": 128,
+ "height": 128,
+ "iconX": 156.0,
+ "iconY": 28.0,
+ "iconWidth": 72,
+ "iconHeight": 72
+ },
+ {
+ "name": "copy",
+ "description": "Copiar",
+ "symbol": "icon-copy",
+ "x": 256,
+ "y": 0,
+ "width": 128,
+ "height": 128,
+ "iconX": 284.0,
+ "iconY": 28.0,
+ "iconWidth": 72,
+ "iconHeight": 72
+ },
+ {
+ "name": "bolt",
+ "description": "Blazing fast",
+ "symbol": "icon-bolt",
+ "x": 384,
+ "y": 0,
+ "width": 128,
+ "height": 128,
+ "iconX": 412.0,
+ "iconY": 28.0,
+ "iconWidth": 72,
+ "iconHeight": 72
+ },
+ {
+ "name": "modular-spark",
+ "description": "Modular",
+ "symbol": "icon-modular-spark",
+ "x": 512,
+ "y": 0,
+ "width": 128,
+ "height": 128,
+ "iconX": 540.0,
+ "iconY": 28.0,
+ "iconWidth": 72,
+ "iconHeight": 72
+ },
+ {
+ "name": "shield-psr",
+ "description": "PSR-first",
+ "symbol": "icon-shield-psr",
+ "x": 640,
+ "y": 0,
+ "width": 128,
+ "height": 128,
+ "iconX": 668.0,
+ "iconY": 28.0,
+ "iconWidth": 72,
+ "iconHeight": 72
+ },
+ {
+ "name": "star-open",
+ "description": "Open source",
+ "symbol": "icon-star-open",
+ "x": 768,
+ "y": 0,
+ "width": 128,
+ "height": 128,
+ "iconX": 796.0,
+ "iconY": 28.0,
+ "iconWidth": 72,
+ "iconHeight": 72
+ },
+ {
+ "name": "globe-http",
+ "description": "HTTP",
+ "symbol": "icon-globe-http",
+ "x": 896,
+ "y": 0,
+ "width": 128,
+ "height": 128,
+ "iconX": 924.0,
+ "iconY": 28.0,
+ "iconWidth": 72,
+ "iconHeight": 72
+ },
+ {
+ "name": "container-cube",
+ "description": "Container",
+ "symbol": "icon-container-cube",
+ "x": 0,
+ "y": 128,
+ "width": 128,
+ "height": 128,
+ "iconX": 28.0,
+ "iconY": 156.0,
+ "iconWidth": 72,
+ "iconHeight": 72
+ },
+ {
+ "name": "event-bolt",
+ "description": "Event dispatcher",
+ "symbol": "icon-event-bolt",
+ "x": 128,
+ "y": 128,
+ "width": 128,
+ "height": 128,
+ "iconX": 156.0,
+ "iconY": 156.0,
+ "iconWidth": 72,
+ "iconHeight": 72
+ },
+ {
+ "name": "clock",
+ "description": "Clock",
+ "symbol": "icon-clock",
+ "x": 256,
+ "y": 128,
+ "width": 128,
+ "height": 128,
+ "iconX": 284.0,
+ "iconY": 156.0,
+ "iconWidth": 72,
+ "iconHeight": 72
+ },
+ {
+ "name": "dev-tools",
+ "description": "Dev tools",
+ "symbol": "icon-dev-tools",
+ "x": 384,
+ "y": 128,
+ "width": 128,
+ "height": 128,
+ "iconX": 412.0,
+ "iconY": 156.0,
+ "iconWidth": 72,
+ "iconHeight": 72
+ },
+ {
+ "name": "layers-factory",
+ "description": "HTTP factory / layers",
+ "symbol": "icon-layers-factory",
+ "x": 512,
+ "y": 128,
+ "width": 128,
+ "height": 128,
+ "iconX": 540.0,
+ "iconY": 156.0,
+ "iconWidth": 72,
+ "iconHeight": 72
+ },
+ {
+ "name": "php",
+ "description": "PHP 8.3+",
+ "symbol": "icon-php",
+ "x": 640,
+ "y": 128,
+ "width": 128,
+ "height": 128,
+ "iconX": 668.0,
+ "iconY": 156.0,
+ "iconWidth": 72,
+ "iconHeight": 72
+ },
+ {
+ "name": "puzzle-psr",
+ "description": "Compatibilidade PSR",
+ "symbol": "icon-puzzle-psr",
+ "x": 768,
+ "y": 128,
+ "width": 128,
+ "height": 128,
+ "iconX": 796.0,
+ "iconY": 156.0,
+ "iconWidth": 72,
+ "iconHeight": 72
+ },
+ {
+ "name": "leaf-lightweight",
+ "description": "Lightweight core",
+ "symbol": "icon-leaf-lightweight",
+ "x": 896,
+ "y": 128,
+ "width": 128,
+ "height": 128,
+ "iconX": 924.0,
+ "iconY": 156.0,
+ "iconWidth": 72,
+ "iconHeight": 72
+ },
+ {
+ "name": "code",
+ "description": "Developer ergonomics",
+ "symbol": "icon-code",
+ "x": 0,
+ "y": 256,
+ "width": 128,
+ "height": 128,
+ "iconX": 28.0,
+ "iconY": 284.0,
+ "iconWidth": 72,
+ "iconHeight": 72
+ },
+ {
+ "name": "search",
+ "description": "Busca",
+ "symbol": "icon-search",
+ "x": 128,
+ "y": 256,
+ "width": 128,
+ "height": 128,
+ "iconX": 156.0,
+ "iconY": 284.0,
+ "iconWidth": 72,
+ "iconHeight": 72
+ },
+ {
+ "name": "home",
+ "description": "Home / Introduction",
+ "symbol": "icon-home",
+ "x": 256,
+ "y": 256,
+ "width": 128,
+ "height": 128,
+ "iconX": 284.0,
+ "iconY": 284.0,
+ "iconWidth": 72,
+ "iconHeight": 72
+ },
+ {
+ "name": "chevron-right",
+ "description": "Chevron right",
+ "symbol": "icon-chevron-right",
+ "x": 384,
+ "y": 256,
+ "width": 128,
+ "height": 128,
+ "iconX": 412.0,
+ "iconY": 284.0,
+ "iconWidth": 72,
+ "iconHeight": 72
+ },
+ {
+ "name": "chevron-down",
+ "description": "Chevron down",
+ "symbol": "icon-chevron-down",
+ "x": 512,
+ "y": 256,
+ "width": 128,
+ "height": 128,
+ "iconX": 540.0,
+ "iconY": 284.0,
+ "iconWidth": 72,
+ "iconHeight": 72
+ },
+ {
+ "name": "info",
+ "description": "Info",
+ "symbol": "icon-info",
+ "x": 640,
+ "y": 256,
+ "width": 128,
+ "height": 128,
+ "iconX": 668.0,
+ "iconY": 284.0,
+ "iconWidth": 72,
+ "iconHeight": 72
+ },
+ {
+ "name": "github",
+ "description": "GitHub",
+ "symbol": "icon-github",
+ "x": 768,
+ "y": 256,
+ "width": 128,
+ "height": 128,
+ "iconX": 796.0,
+ "iconY": 284.0,
+ "iconWidth": 72,
+ "iconHeight": 72
+ },
+ {
+ "name": "discord",
+ "description": "Discord",
+ "symbol": "icon-discord",
+ "x": 896,
+ "y": 256,
+ "width": 128,
+ "height": 128,
+ "iconX": 924.0,
+ "iconY": 284.0,
+ "iconWidth": 72,
+ "iconHeight": 72
+ },
+ {
+ "name": "x-social",
+ "description": "X / Twitter",
+ "symbol": "icon-x-social",
+ "x": 0,
+ "y": 384,
+ "width": 128,
+ "height": 128,
+ "iconX": 28.0,
+ "iconY": 412.0,
+ "iconWidth": 72,
+ "iconHeight": 72
+ },
+ {
+ "name": "youtube",
+ "description": "YouTube",
+ "symbol": "icon-youtube",
+ "x": 128,
+ "y": 384,
+ "width": 128,
+ "height": 128,
+ "iconX": 156.0,
+ "iconY": 412.0,
+ "iconWidth": 72,
+ "iconHeight": 72
+ },
+ {
+ "name": "arrow-forward",
+ "description": "Forward arrow",
+ "symbol": "icon-arrow-forward",
+ "x": 256,
+ "y": 384,
+ "width": 128,
+ "height": 128,
+ "iconX": 284.0,
+ "iconY": 412.0,
+ "iconWidth": 72,
+ "iconHeight": 72
+ },
+ {
+ "name": "terminal",
+ "description": "Terminal / Composer command",
+ "symbol": "icon-terminal",
+ "x": 384,
+ "y": 384,
+ "width": 128,
+ "height": 128,
+ "iconX": 412.0,
+ "iconY": 412.0,
+ "iconWidth": 72,
+ "iconHeight": 72
+ },
+ {
+ "name": "community-users",
+ "description": "Comunidade",
+ "symbol": "icon-community-users",
+ "x": 512,
+ "y": 384,
+ "width": 128,
+ "height": 128,
+ "iconX": 540.0,
+ "iconY": 412.0,
+ "iconWidth": 72,
+ "iconHeight": 72
+ },
+ {
+ "name": "external-link",
+ "description": "External link",
+ "symbol": "icon-external-link",
+ "x": 640,
+ "y": 384,
+ "width": 128,
+ "height": 128,
+ "iconX": 668.0,
+ "iconY": 412.0,
+ "iconWidth": 72,
+ "iconHeight": 72
+ },
+ {
+ "name": "security-shield",
+ "description": "Security",
+ "symbol": "icon-security-shield",
+ "x": 768,
+ "y": 384,
+ "width": 128,
+ "height": 128,
+ "iconX": 796.0,
+ "iconY": 412.0,
+ "iconWidth": 72,
+ "iconHeight": 72
+ },
+ {
+ "name": "menu",
+ "description": "Menu",
+ "symbol": "icon-menu",
+ "x": 896,
+ "y": 384,
+ "width": 128,
+ "height": 128,
+ "iconX": 924.0,
+ "iconY": 412.0,
+ "iconWidth": 72,
+ "iconHeight": 72
+ }
+ ]
+}
\ No newline at end of file
diff --git a/references/icons/icon_symbols.svg b/references/icons/icon_symbols.svg
new file mode 100644
index 0000000..d3df407
--- /dev/null
+++ b/references/icons/icon_symbols.svg
@@ -0,0 +1,219 @@
+
+
diff --git a/scripts/BrandLogos.php b/scripts/BrandLogos.php
new file mode 100644
index 0000000..7ab12dd
--- /dev/null
+++ b/scripts/BrandLogos.php
@@ -0,0 +1,127 @@
+ $character) {
+ $glyph = $font['glyphs'][$character];
+ $role = $text === 'FastForward' && $index < 4 ? 'orange' : 'lettering';
+ $paths[] = sprintf('', $colors[$role], $cursor, $baseline, $scale, -$scale, self::xml($glyph['path']));
+ $cursor += $glyph['advance'] * $scale;
+ $cursor += ($font['kerning'][substr($text, $index, 2)] ?? 0) * $scale;
+ if ($text === 'FastForward' && $index === 3) {
+ $cursor += $source['layout']['word_gap'];
+ }
+ }
+
+ return [implode("\n", $paths), $cursor];
+ }
+
+ public static function render(array $source, string $variant, bool $markOnly): string
+ {
+ $colors = $source['variants'][$variant];
+ foreach ($colors as $color) {
+ if (!is_string($color) || !preg_match('/^#[0-9a-f]{3}(?:[0-9a-f]{3})?$/iD', $color)) {
+ throw new RuntimeException('Logo paints must be opaque hexadecimal colors');
+ }
+ }
+ $mono = in_array($variant, ['ink', 'white'], true);
+ $parts = $source['symbol']['paths'];
+ $positive = array_filter($parts, fn ($part) => !in_array($part['role'], ['cream', 'eye', 'nose'], true));
+ $cutouts = array_filter($parts, fn ($part) => $part['role'] === 'cream');
+ $body = [];
+ if ($mono) {
+ $body[] = '';
+ $body[] = '';
+ foreach ($cutouts as $part) {
+ $body[] = '';
+ }
+ $body[] = '';
+ }
+ foreach ($positive as $part) {
+ $body[] = '';
+ }
+ if ($mono) {
+ $body[] = '';
+ } else {
+ foreach ($cutouts as $part) {
+ $body[] = '';
+ }
+ }
+ foreach ($parts as $part) {
+ if (in_array($part['role'], ['eye', 'nose'], true)) {
+ $body[] = '';
+ }
+ }
+ $width = 320;
+ if (!$markOnly) {
+ $layout = $source['layout'];
+ foreach ($layout['lines'] as $line) {
+ [$paths, $right] = self::lettering($source, $line['text'], $layout['x'], $line['baseline'], $line['size'], $colors);
+ $body[] = $paths;
+ $width = max($width, (int) ceil($right + $layout['right_padding']));
+ }
+ }
+ $label = $markOnly ? 'Dash fox mark' : 'PHP Fast Forward';
+
+ return '\n";
+ }
+
+ /** @return array */
+ public static function outputs(string $root): array
+ {
+ $source = json_decode(file_get_contents($root . '/assets/brand/logo-source.json'), true, flags: JSON_THROW_ON_ERROR);
+ foreach ($source['lettering']['source_files'] as $item) {
+ if (!is_file($root . '/' . $item['path']) || hash_file('sha256', $root . '/' . $item['path']) !== $item['sha256']) {
+ throw new RuntimeException('Font source changed: ' . $item['path']);
+ }
+ }
+ $outputs = [];
+ foreach ([false, true] as $markOnly) {
+ $stem = $markOnly ? 'fast-forward-mark' : 'fast-forward-logo';
+ foreach (['color', 'dark', 'ink', 'white'] as $variant) {
+ $suffix = $variant === 'color' ? '' : '-' . $variant;
+ $outputs['assets/brand/' . $stem . $suffix . '.svg'] = self::render($source, $variant, $markOnly);
+ }
+ }
+
+ return $outputs;
+ }
+
+ public static function build(string $root, bool $check): int
+ {
+ $outputs = self::outputs($root);
+ foreach ($outputs as $relative => $content) {
+ $path = $root . '/' . $relative;
+ if ($check) {
+ if (!is_file($path) || file_get_contents($path) !== $content) {
+ throw new RuntimeException('Stale logo export: ' . $relative);
+ }
+ } elseif (file_put_contents($path, $content) === false) {
+ throw new RuntimeException('Cannot write logo export: ' . $relative);
+ }
+ }
+
+ return count($outputs);
+ }
+}
diff --git a/scripts/BrandPages.php b/scripts/BrandPages.php
new file mode 100644
index 0000000..dd10341
--- /dev/null
+++ b/scripts/BrandPages.php
@@ -0,0 +1,644 @@
+getMessage()}", previous: $error);
+ }
+ if (!$document instanceof stdClass && !is_array($document)) {
+ throw new RuntimeException("Public JSON must contain an object or list: {$relative}");
+ }
+
+ return $document;
+ }
+
+ public static function publicationAllowed(stdClass $row): bool
+ {
+ if (!property_exists($row, 'publication')) {
+ return true;
+ }
+ $record = $row->publication;
+ if (!$record instanceof stdClass || ($record->authorization ?? null) !== 'maintainer-request') {
+ return false;
+ }
+ foreach (['recorded_at', 'evidence'] as $field) {
+ if (!is_string($record->$field ?? null) || trim($record->$field) === '') {
+ return false;
+ }
+ }
+ if (($record->scope ?? null) === 'brand-public-library') {
+ return ($record->status ?? null) === 'authorized';
+ }
+
+ return ($record->scope ?? null) === 'brand-review-gallery'
+ && ($row->status ?? null) === 'exploratory'
+ && ($row->review_status ?? null) === 'awaiting-review'
+ && ($record->canonical_selection ?? null) === false
+ && ($record->status ?? 'authorized') === 'authorized';
+ }
+
+ /** @return array{array, stdClass} */
+ private static function inventory(string $root, string $repository, string $ref): array
+ {
+ $manifest = self::readPublicJson($root, 'assets/manifest.json');
+ if (!$manifest instanceof stdClass || !is_array($manifest->assets ?? null)) {
+ throw new RuntimeException('Invalid asset inventory');
+ }
+ $selected = [];
+ $rows = [];
+ foreach ($manifest->assets as $row) {
+ if (!in_array($row->status, self::ACTIVE, true) || !self::publicationAllowed($row)) {
+ continue;
+ }
+ if (($row->status === 'exploratory' && ($row->review_status ?? null) === 'awaiting-review')
+ && ($row->publication->scope ?? null) !== 'brand-review-gallery') {
+ continue;
+ }
+ $relative = $row->path;
+ $ecosystem = str_starts_with($relative, 'references/ecosystem/')
+ && str_ends_with($relative, '.png')
+ && $row->status === 'reference'
+ && ($row->publication->scope ?? null) === 'brand-public-library'
+ && ($row->publication->status ?? null) === 'authorized';
+ if (!str_starts_with($relative, 'assets/') && !in_array($relative, self::PROFILE, true) && !$ecosystem) {
+ continue;
+ }
+ if (hash_file('sha256', self::safeFile($root, $relative)) !== $row->sha256) {
+ throw new RuntimeException("Asset changed after cataloging: {$relative}");
+ }
+ $selected[$relative] = true;
+ $rows[] = $row;
+ }
+ foreach (self::GUIDES as $relative) {
+ if (file_exists($root . '/' . $relative)) {
+ $selected[$relative] = true;
+ }
+ }
+ $selected['assets/README.md'] = $selected['assets/manifest.json'] = true;
+ foreach (new \DirectoryIterator($root . '/docs/brand') as $file) {
+ if (in_array($file->getExtension(), ['html', 'md', 'json'], true)) {
+ $selected['docs/brand/' . $file->getFilename()] = true;
+ }
+ }
+ foreach (['tokens.json', 'exports.json', 'tailwind.theme.json', 'theme.css'] as $name) {
+ if (file_exists($root . '/assets/tokens/' . $name)) {
+ $selected['assets/tokens/' . $name] = true;
+ }
+ }
+ if (is_dir($root . '/assets/brand/source')) {
+ foreach (self::files($root . '/assets/brand/source') as $file) {
+ if (in_array(strtolower(pathinfo($file, PATHINFO_EXTENSION)), ['ttf', 'txt', 'json', 'md'], true) || in_array(basename($file), ['LICENSE', 'OFL', 'COPYING'], true)) {
+ $selected[substr($file, strlen($root) + 1)] = true;
+ }
+ }
+ }
+ // Include the complete standalone logo generator, not an unusable entrypoint.
+ foreach (['scripts/build-brand-logos.php', 'scripts/BrandLogos.php'] as $relative) {
+ if (file_exists($root . '/' . $relative)) {
+ $selected[$relative] = true;
+ }
+ }
+ foreach (['README.md', 'README.pt-BR.md', 'README.es.md'] as $name) {
+ if (file_exists($root . '/profile/' . $name)) {
+ $selected['profile/' . $name] = true;
+ }
+ }
+ foreach ($selected as $relative => $_) {
+ self::safeFile($root, $relative);
+ if (str_ends_with($relative, '.json')) {
+ self::readPublicJson($root, $relative);
+ }
+ }
+ $manifest->assets = $rows;
+ $registry = array_merge($rows, $manifest->archived_sources ?? []);
+ $ids = array_column($registry, 'id');
+ foreach ($registry as $row) {
+ $provenance = $row->provenance ?? null;
+ if (!$provenance instanceof stdClass) {
+ continue;
+ }
+ $sourceIds = $provenance->source_ids ?? [];
+ $external = array_values(array_diff($sourceIds, $ids));
+ if ($external) {
+ $provenance->source_ids = array_values(array_intersect($sourceIds, $ids));
+ $provenance->repository_source_ids = array_merge($provenance->repository_source_ids ?? [], $external);
+ }
+ if ($provenance->repository_source_ids ?? []) {
+ $provenance->repository_manifest = rtrim($repository, '/') . '/blob/' . rawurlencode($ref) . '/assets/manifest.json';
+ }
+ }
+ $manifest->description .= ' Pages export: active public assets only; references remain in the repository.';
+
+ return [$selected, $manifest];
+ }
+
+ private static function files(string $directory): array
+ {
+ $files = [];
+ foreach (new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($directory, \FilesystemIterator::SKIP_DOTS)) as $file) {
+ if ($file->isLink()) {
+ throw new RuntimeException('Symlinks are not publishable');
+ }
+ if ($file->isFile()) {
+ $files[] = $file->getPathname();
+ }
+ }
+
+ return $files;
+ }
+
+ private static function url(string $destination): array
+ {
+ $destination = html_entity_decode($destination, ENT_QUOTES | ENT_HTML5, 'UTF-8');
+ if (preg_match('/[\x00-\x20\x7f]/', $destination)) {
+ throw new RuntimeException('Whitespace/control characters are not supported in URLs');
+ }
+ $parsed = parse_url($destination);
+ if ($parsed === false) {
+ throw new RuntimeException("Invalid URL: {$destination}");
+ }
+
+ return $parsed;
+ }
+
+ public static function localTarget(string $owner, string $destination): ?array
+ {
+ $parsed = self::url($destination);
+ if (isset($parsed['scheme']) || isset($parsed['host']) || ($parsed['path'] ?? '') === '') {
+ return null;
+ }
+ $path = rawurldecode($parsed['path']);
+ if (str_starts_with($path, '/') || str_contains($path, '\\')) {
+ throw new RuntimeException("Use repository-relative URLs in {$owner}: {$destination}");
+ }
+ $parts = [];
+ foreach (explode('/', dirname($owner) . '/' . $path) as $part) {
+ if ($part === '.' || $part === '') {
+ continue;
+ }
+ if ($part === '..') {
+ if (!$parts) {
+ throw new RuntimeException("URL escapes the repository in {$owner}: {$destination}");
+ }
+ array_pop($parts);
+ } else {
+ $parts[] = $part;
+ }
+ }
+
+ return [implode('/', $parts), $parsed];
+ }
+
+ private static function resourceTarget(string $owner, string $destination): array
+ {
+ $parsed = self::url($destination);
+ if (isset($parsed['scheme']) || isset($parsed['host'])) {
+ throw new RuntimeException("External resource in {$owner}: {$destination}");
+ }
+ $target = self::localTarget($owner, $destination);
+ if ($target === null && isset($parsed['fragment']) && $parsed['fragment'] !== '') {
+ return [$owner, $parsed];
+ }
+ if ($target === null) {
+ throw new RuntimeException("Empty resource in {$owner}: {$destination}");
+ }
+
+ return $target;
+ }
+
+ private static function sourceUrl(string $root, string $relative, array $parsed, string $repository, string $ref): string
+ {
+ $parts = explode('/', $relative);
+ if (array_intersect($parts, self::FORBIDDEN)) {
+ throw new RuntimeException("Private/archive links are not publishable: {$relative}");
+ }
+ $source = $root;
+ foreach ($parts as $part) {
+ $source .= '/' . $part;
+ if (is_link($source)) {
+ throw new RuntimeException("Symlinks are not publishable: {$relative}");
+ }
+ }
+ if (!file_exists($source)) {
+ throw new RuntimeException("Missing repository source link: {$relative}");
+ }
+ $url = rtrim($repository, '/') . '/' . (is_dir($source) ? 'tree' : 'blob') . '/' . rawurlencode($ref) . '/' . implode('/', array_map('rawurlencode', $parts));
+
+ return $url . (isset($parsed['query']) ? '?' . $parsed['query'] : '') . (isset($parsed['fragment']) ? '#' . $parsed['fragment'] : '');
+ }
+
+ public static function cssResources(string $owner, string $css): array
+ {
+ if (str_contains($css, '\\')) {
+ throw new RuntimeException("CSS escapes are not supported in {$owner}");
+ }
+ $css = preg_replace('~/\*.*?\*/~s', '', $css);
+ if (preg_match('/@\s*(?:import|font-face)\b|(?:-webkit-)?image-set\s*\(/i', $css)) {
+ throw new RuntimeException("CSS imports, font-face and image-set are not supported in {$owner}");
+ }
+ preg_match_all('/url\s*\((.*?)\)/is', $css, $matches);
+
+ return array_map(fn ($value) => trim(trim(trim($value), '\"\'')), $matches[1]);
+ }
+
+ private static function resourceAttribute(string $tag, string $name): bool
+ {
+ return in_array($name, ['src', 'srcset', 'poster', 'background'], true)
+ || ($name === 'data' && $tag === 'object')
+ || (in_array($name, ['href', 'xlink:href'], true) && !in_array($tag, ['a', 'area'], true));
+ }
+
+ private static function document(string $text): HTMLDocument
+ {
+ return HTMLDocument::createFromString($text, LIBXML_NOERROR, 'UTF-8');
+ }
+
+ /** @return array{list, list} */
+ private static function inspect(HTMLDocument $document, string $owner, ?\Closure $rewrite = null): array
+ {
+ $links = [];
+ $ids = [];
+ foreach ($document->querySelectorAll('*') as $element) {
+ $tag = strtolower($element->localName);
+ if ($tag === 'base' || $element->hasAttribute('srcdoc') || $element->hasAttribute('xml:base')) {
+ throw new RuntimeException("Embedded documents and alternate bases are not supported in {$owner}");
+ }
+ if ($element->hasAttribute('id')) {
+ $ids[] = $element->getAttribute('id');
+ }
+ if ($rewrite && $tag === 'img') {
+ $destination = $element->getAttribute('src');
+ $parsed = self::url($destination);
+ $target = self::localTarget($owner, $destination);
+ $label = $element->getAttribute('alt') ?: 'Reference artwork';
+ if (str_ends_with($owner, '.md') && (isset($parsed['scheme']) || isset($parsed['host']))) {
+ $element->replaceWith($document->createTextNode($label));
+ continue;
+ }
+ if ($target && str_starts_with($target[0], 'references/')) {
+ $referenceUrl = $rewrite($destination, false);
+ if ($referenceUrl !== $destination) {
+ $anchor = $document->createElement('a');
+ $anchor->setAttribute('href', $referenceUrl);
+ $anchor->textContent = 'View reference in the repository: ' . $label;
+ $element->replaceWith($anchor);
+ continue;
+ }
+ }
+ }
+ foreach (iterator_to_array($element->attributes) as $attribute) {
+ $name = strtolower($attribute->name);
+ $value = $attribute->value;
+ if ($name === 'srcset') {
+ $entries = [];
+ foreach (explode(',', $value) as $entry) {
+ $parts = preg_split('/\s+/', trim($entry));
+ if ($parts[0] === '') {
+ continue;
+ }
+ $links[] = [$parts[0], true];
+ if ($rewrite) {
+ $parts[0] = $rewrite($parts[0], true);
+ }
+ $entries[] = implode(' ', $parts);
+ }
+ if (!$entries) {
+ throw new RuntimeException("Empty resource in {$owner}: srcset");
+ }
+ if ($rewrite) {
+ $element->setAttribute($attribute->name, implode(', ', $entries));
+ }
+ } elseif (in_array($name, ['href', 'xlink:href', 'src', 'poster', 'background'], true) || ($name === 'data' && $tag === 'object')) {
+ $resource = self::resourceAttribute($tag, $name);
+ $links[] = [$value, $resource];
+ if ($rewrite) {
+ $element->setAttribute($attribute->name, $rewrite($value, $resource));
+ }
+ } elseif ($name === 'style' || (in_array($name, ['fill', 'stroke', 'filter', 'mask', 'clip-path', 'cursor'], true) && (str_contains($value, '\\') || preg_match('/url\s*\(/i', $value)))) {
+ foreach (self::cssResources($owner, $value) as $reference) {
+ $links[] = [$reference, true];
+ if ($rewrite) {
+ $rewrite($reference, true);
+ }
+ }
+ }
+ }
+ if ($tag === 'style') {
+ foreach (self::cssResources($owner, $element->textContent) as $reference) {
+ $links[] = [$reference, true];
+ if ($rewrite) {
+ $rewrite($reference, true);
+ }
+ }
+ }
+ }
+
+ return [$links, $ids];
+ }
+
+ private static function rewriteDocument(string $root, string $owner, string $text, array $selected, string $repository, string $ref): string
+ {
+ $link = static function (string $destination, bool $resource = false) use ($root, $owner, $selected, $repository, $ref): string {
+ $target = $resource ? self::resourceTarget($owner, $destination) : self::localTarget($owner, $destination);
+ if ($target === null || isset($selected[$target[0]])) {
+ return $destination;
+ }
+ if ($resource) {
+ throw new RuntimeException("Unpublished resource in {$owner}: {$destination}");
+ }
+
+ return self::sourceUrl($root, $target[0], $target[1], $repository, $ref);
+ };
+ if (str_ends_with($owner, '.html')) {
+ $document = self::document($text);
+ self::inspect($document, $owner, $link);
+
+ return $document->saveHtml();
+ }
+ // Markdown is a downloadable source. Protect fences and rewrite only
+ // its explicit HTML fragments, retaining the surrounding source bytes.
+ $parts = preg_split('/(```[\s\S]*?```|~~~[\s\S]*?~~~)/', $text, -1, PREG_SPLIT_DELIM_CAPTURE);
+ for ($index = 0; $index < count($parts); $index += 2) {
+ // Validate all HTML tags in their actual nesting/namespace, including
+ // audio/embed/table/SVG. Serialization of isolated start tags would
+ // corrupt Markdown's original HTML and miss unsupported elements.
+ self::inspect(self::document($parts[$index]), $owner, $link);
+ $parts[$index] = self::rewriteMarkdownHtml($parts[$index], $owner, $link);
+ $parts[$index] = preg_replace_callback('/(!?)\[([^\]]*)\]\(([^\s)]+)([^)]*)\)/', static function ($match) use ($link, $owner): string {
+ [, $image, $label, $destination, $suffix] = $match;
+ $parsed = self::url($destination);
+ $target = self::localTarget($owner, $destination);
+ if ($image && (isset($parsed['scheme']) || isset($parsed['host']))) {
+ return '[View external image: ' . $label . '](' . $link($destination) . $suffix . ')';
+ }
+ if ($image && $target && str_starts_with($target[0], 'references/') && $link($destination) !== $destination) {
+ return '[View reference in the repository: ' . $label . '](' . $link($destination) . $suffix . ')';
+ }
+
+ return $image . '[' . $label . '](' . $link($destination, (bool) $image) . $suffix . ')';
+ }, $parts[$index]);
+ }
+
+ return implode('', $parts);
+ }
+
+ private static function rewriteMarkdownHtml(string $text, string $owner, \Closure $link): string
+ {
+ // Retain comments and raw-text elements as complete tokens. A colon
+ // followed by / cannot form a start tag, so Markdown autolinks survive.
+ $tokens = '~|<(script|style)\b(?:[^>"\']|"[^"]*"|\'[^\']*\')*>.*?\1\s*>|<[A-Za-z][A-Za-z0-9:-]*(?=\s|/?>)(?:[^>"\']|"[^"]*"|\'[^\']*\')*>~is';
+
+ return preg_replace_callback($tokens, static function ($match) use ($owner, $link): string {
+ $token = $match[0];
+ if (str_starts_with($token, '\n", FILE_APPEND);
+ $before = $this->bytes($root);
+ self::assertStringContainsString('Stale logo export:', $this->runBuilder($root, ['--check'], 1));
+ self::assertSame($before, $this->bytes($root));
+ unlink($stale);
+ self::assertStringContainsString('Stale logo export:', $this->runBuilder($root, ['--check'], 1));
+ self::assertFileDoesNotExist($stale);
+ });
+ }
+
+ public function testFontLicenseAndReceiptDriftStopBuildAndCheck(): void
+ {
+ $this->isolated(function (string $root): void {
+ $this->runBuilder($root);
+ $before = $this->bytes($root);
+ foreach ($this->source()['lettering']['source_files'] as $item) {
+ $path = $root . '/' . $item['path'];
+ $original = file_get_contents($path);
+ file_put_contents($path, "\nfixture drift\n", FILE_APPEND);
+ foreach ([['--check'], []] as $arguments) {
+ self::assertStringContainsString('Font source changed: ' . $item['path'], $this->runBuilder($root, $arguments, 1));
+ self::assertSame($before, $this->bytes($root));
+ }
+ file_put_contents($path, $original);
+ }
+ });
+ }
+}
diff --git a/tests/BrandPagesTest.php b/tests/BrandPagesTest.php
new file mode 100644
index 0000000..e13fc5a
--- /dev/null
+++ b/tests/BrandPagesTest.php
@@ -0,0 +1,356 @@
+temporary = sys_get_temp_dir() . '/brand-pages-' . bin2hex(random_bytes(8));
+ $this->root = $this->temporary . '/repository';
+ $this->output = $this->temporary . '/site';
+ $this->rows = [];
+ $this->write('assets/README.md', "# Assets\n\n[Manifest](manifest.json)\n");
+ $this->write('DESIGN.md', "# Design\n");
+ $this->write('docs/brand/index.html', 'DesignCatalog');
+ $this->asset('assets/current.png', 'canonical');
+ $this->manifest();
+ }
+
+ protected function tearDown(): void
+ {
+ $iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($this->temporary, FilesystemIterator::SKIP_DOTS), RecursiveIteratorIterator::CHILD_FIRST);
+ foreach ($iterator as $file) {
+ $file->isDir() && !$file->isLink() ? rmdir($file->getPathname()) : unlink($file->getPathname());
+ }
+ rmdir($this->temporary);
+ }
+
+ private function write(string $relative, string $content): string
+ {
+ $path = $this->root . '/' . $relative;
+ if (!is_dir(dirname($path))) {
+ mkdir(dirname($path), 0777, true);
+ }
+ file_put_contents($path, $content);
+
+ return $path;
+ }
+
+ private function asset(string $relative, string $status): void
+ {
+ $path = $this->write($relative, 'synthetic public fixture');
+ $this->rows[] = ['id' => $relative, 'path' => $relative, 'status' => $status, 'sha256' => hash_file('sha256', $path)];
+ }
+
+ private function manifest(array $extra = []): void
+ {
+ $this->write('assets/manifest.json', json_encode(['schema_version' => 1, 'description' => 'Synthetic inventory.', 'assets' => $this->rows] + $extra, JSON_THROW_ON_ERROR));
+ }
+
+ private function build(string $ref = 'main'): int
+ {
+ return BrandPages::build($this->root, $this->output, self::REPOSITORY, $ref);
+ }
+
+ private function rejects(string $message, ?Closure $operation = null, bool $beforeOutput = true): void
+ {
+ try {
+ ($operation ?? fn () => $this->build())();
+ self::fail('Expected rejected build: ' . $message);
+ } catch (RuntimeException $error) {
+ self::assertStringContainsString($message, $error->getMessage());
+ }
+ if ($beforeOutput) {
+ self::assertDirectoryDoesNotExist($this->output);
+ }
+ }
+
+ public function testExplicitInventoryExcludesPrivateUntrackedAndHistoricalFiles(): void
+ {
+ foreach (['assets/legacy.png' => 'legacy', 'references/source.png' => 'reference', 'assets/study.png' => 'exploratory', 'assets/styles/navigation.css' => 'reference', 'profile/assets/brand-hero-banner.png' => 'canonical', 'profile/assets/docs-installation.png' => 'canonical'] as $path => $status) {
+ $this->asset($path, $status);
+ }
+ foreach (['profile/assets/github-social-preview.jpg', 'assets/untracked-photo.jpg', 'backup/source.png', 'private/photo.jpg', 'assets/brand/source/OFL.txt', 'assets/brand/source/font.ttf', 'scripts/build-brand-logos.php', 'scripts/BrandLogos.php'] as $path) {
+ $this->write($path, 'fixture');
+ }
+ $this->manifest();
+ $count = $this->build();
+ $files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($this->output, FilesystemIterator::SKIP_DOTS));
+ self::assertSame($count, count(iterator_to_array($files)));
+ foreach (['references/source.png', 'assets/legacy.png', 'assets/untracked-photo.jpg', 'profile/assets/github-social-preview.jpg', 'backup/source.png', 'private/photo.jpg'] as $path) {
+ self::assertFileDoesNotExist($this->output . '/' . $path);
+ }
+ foreach (['assets/current.png', 'assets/study.png', 'assets/styles/navigation.css', 'profile/assets/brand-hero-banner.png', 'profile/assets/docs-installation.png', 'assets/brand/source/OFL.txt', 'assets/brand/source/font.ttf', 'scripts/build-brand-logos.php', 'scripts/BrandLogos.php'] as $path) {
+ self::assertFileExists($this->output . '/' . $path);
+ }
+ self::assertStringContainsString('url=docs/brand/index.html', file_get_contents($this->output . '/index.html'));
+ }
+
+ public function testReferenceImagesBecomeLinksAndPublicPathsStayRelative(): void
+ {
+ $this->write('references/source.png', 'reference');
+ $this->write('docs/brand/index.html', 'OriginalDesign');
+ $this->build();
+ $page = file_get_contents($this->output . '/docs/brand/index.html');
+ self::assertStringNotContainsString(' 'authorized', 'scope' => 'brand-public-library', 'authorization' => 'maintainer-request', 'recorded_at' => '2026-10-05', 'evidence' => 'Maintainer requested publication.'];
+ $invalid = ['not-published', 'authorized', null, [], (object) [], array_replace($record, ['scope' => 'unknown']), array_replace($record, ['status' => 'denied']), array_replace($record, ['authorization' => 'unknown']), array_replace($record, ['evidence' => '']), array_replace($record, ['recorded_at' => null]), ['scope' => 'brand-review-gallery', 'authorization' => 'maintainer-request']];
+ foreach (['canonical', 'package-variant', 'reference', 'exploratory'] as $status) {
+ foreach ($invalid as $index => $publication) {
+ $this->asset("assets/{$status}-{$index}.png", $status);
+ $this->rows[array_key_last($this->rows)]['publication'] = $publication;
+ }
+ }
+ $this->asset('assets/authorized.png', 'canonical');
+ $this->rows[array_key_last($this->rows)]['publication'] = $record;
+ $this->manifest();
+ $this->build();
+ $published = json_decode(file_get_contents($this->output . '/assets/manifest.json'), true, flags: JSON_THROW_ON_ERROR);
+ self::assertSame(['assets/current.png', 'assets/authorized.png'], array_column($published['assets'], 'path'));
+ self::assertSame($record, $published['assets'][1]['publication']);
+ }
+
+ public function testOnlyExplicitlyAuthorizedCurrentEcosystemReferencesArePublished(): void
+ {
+ foreach (['current', 'historical', 'denied', 'gallery'] as $name) {
+ $this->asset("references/ecosystem/{$name}.png", 'reference');
+ if ($name !== 'historical') {
+ $this->rows[array_key_last($this->rows)]['publication'] = ['scope' => $name === 'gallery' ? 'brand-review-gallery' : 'brand-public-library', 'status' => $name === 'denied' ? 'denied' : 'authorized', 'authorization' => 'maintainer-request', 'recorded_at' => '2026-10-05', 'evidence' => 'Maintainer requested contextual public examples.'];
+ }
+ }
+ $this->asset('references/unrelated.png', 'reference');
+ $this->rows[array_key_last($this->rows)]['publication'] = $this->rows[1]['publication'];
+ $this->manifest();
+ $this->write('docs/brand/index.html', '');
+ $this->build();
+ self::assertFileExists($this->output . '/references/ecosystem/current.png');
+ foreach (['references/ecosystem/historical.png', 'references/ecosystem/denied.png', 'references/ecosystem/gallery.png', 'references/unrelated.png'] as $path) {
+ self::assertFileDoesNotExist($this->output . '/' . $path);
+ }
+ $page = file_get_contents($this->output . '/docs/brand/index.html');
+ self::assertStringContainsString('src="../../references/ecosystem/current.png"', $page);
+ self::assertStringContainsString('View reference in the repository: Historical source', $page);
+ }
+
+ public function testAwaitingReviewRequiresExplicitUnselectedGalleryAuthorization(): void
+ {
+ $record = ['scope' => 'brand-review-gallery', 'authorization' => 'maintainer-request', 'recorded_at' => '2026-10-05', 'evidence' => 'Requested gallery.', 'canonical_selection' => false];
+ foreach (['draft', 'gallery', 'unconfirmed', 'string', 'selected', 'canonical'] as $name) {
+ $this->asset("assets/{$name}.png", $name === 'canonical' ? 'canonical' : 'exploratory');
+ $row = array_key_last($this->rows);
+ $this->rows[$row]['review_status'] = 'awaiting-review';
+ if ($name !== 'draft') {
+ $this->rows[$row]['publication'] = match ($name) {
+ 'unconfirmed' => ['scope' => 'brand-review-gallery'],
+ 'string' => 'local draft',
+ 'selected' => array_replace($record, ['canonical_selection' => true]),
+ default => $record,
+ };
+ }
+ }
+ $this->manifest();
+ $this->build();
+ foreach (['draft', 'unconfirmed', 'string', 'selected', 'canonical'] as $name) {
+ self::assertFileDoesNotExist("{$this->output}/assets/{$name}.png");
+ }
+ self::assertFileExists($this->output . '/assets/gallery.png');
+ }
+
+ public function testFilteredProvenanceRetainsLineageAndClosesRegistry(): void
+ {
+ $this->asset('references/source.png', 'reference');
+ $this->asset('assets/legacy.png', 'legacy');
+ $this->asset('assets/derived.png', 'canonical');
+ $row = array_key_last($this->rows);
+ $this->rows[$row]['rights'] = ['status' => 'unconfirmed', 'note' => 'Synthetic fixture'];
+ $this->rows[$row]['provenance'] = ['source_ids' => ['assets/current.png', 'references/source.png', 'archived-origin', 'assets/legacy.png'], 'repository_source_ids' => ['already-external'], 'raw_source_sha256' => str_repeat('a', 64), 'created_at' => '2026-10-04'];
+ $this->manifest(['archived_sources' => [['id' => 'archived-origin', 'path' => 'backup/origin.png', 'provenance' => ['source_ids' => ['references/source.png'], 'raw_source_sha256' => str_repeat('b', 64)]]]]);
+ $original = file_get_contents($this->root . '/assets/manifest.json');
+ $ref = str_repeat('a', 40);
+ $this->build($ref);
+ $published = json_decode(file_get_contents($this->output . '/assets/manifest.json'), true, flags: JSON_THROW_ON_ERROR);
+ $derived = $published['assets'][1];
+ self::assertSame(['assets/current.png', 'archived-origin'], $derived['provenance']['source_ids']);
+ self::assertSame(['already-external', 'references/source.png', 'assets/legacy.png'], $derived['provenance']['repository_source_ids']);
+ self::assertSame(self::REPOSITORY . '/blob/' . $ref . '/assets/manifest.json', $derived['provenance']['repository_manifest']);
+ self::assertSame($this->rows[$row]['rights'], $derived['rights']);
+ self::assertSame($this->rows[$row]['sha256'], $derived['sha256']);
+ self::assertSame(str_repeat('a', 64), $derived['provenance']['raw_source_sha256']);
+ self::assertSame([], $published['archived_sources'][0]['provenance']['source_ids']);
+ self::assertSame(['references/source.png'], $published['archived_sources'][0]['provenance']['repository_source_ids']);
+ self::assertSame($original, file_get_contents($this->root . '/assets/manifest.json'));
+ self::assertDirectoryDoesNotExist($this->output . '/references');
+ self::assertDirectoryDoesNotExist($this->output . '/backup');
+ }
+
+ public function testResourceFailuresOccurBeforeOutputAndAllowExternalNavigation(): void
+ {
+ foreach (['', '', '', '', '', '', '', '', '', '', '', '', '