diff --git a/.agnir/evidence/2026-09-02-brand-checkpoint.md b/.agnir/evidence/2026-09-02-brand-checkpoint.md new file mode 100644 index 0000000..0dd645b --- /dev/null +++ b/.agnir/evidence/2026-09-02-brand-checkpoint.md @@ -0,0 +1,29 @@ +# Svif brand checkpoint — 2026-09-02 + +Status: **branch-local Agnir checkpoint on `brand/identity-system`; authoritative Project ref remains `main` until integration**. + +## Current state + +- Brand exploration is closed for now. +- Principal selected and locked the visual system represented by the three reference boards attached in the 2026-09-02 conversation at the point referred to as **Today, 10:42 AM**. +- Svif is the **Motion Layer / 流动层** identity: teal/turquoise, flowing S mark, particle/motion language. +- Agnir remains the related but independent **Structure Layer / 结构层** identity: sand/warm-mineral particle A. +- Single-brand use follows the corresponding single-brand reference board; co-brand/family use follows the joint Svif × Agnir asset-system board. +- The later deterministic `v0.1` SVG reconstruction and small-size candidates were explicitly rejected by the Principal and have been removed from the active brand branch. They remain only in Git history and must not be treated as approved assets. + +## Approved reference contract + +- `brand/APPROVED-VISUAL-REFERENCE.md` is the branch-local durable locator for the locked visual reference. +- `brand/brand-process-log.md` records the design history and approval trail. +- `.agnir/evidence/2026-09-02-brand-visual-lock-candidate.md` records the durable visual-lock decision for future reconciliation into canonical `main` continuity. + +## Next actions + +1. Do not reopen concept exploration unless the Principal explicitly requests it. +2. Any future production assets must be extracted/reconstructed faithfully from the locked 10:42 reference boards; do not reinterpret, optimize, redraw, or substitute typography/geometry. +3. Before merging brand work, re-resolve the latest `main`, reconcile the locked brand decision into canonical Agnir Decisions/State/Next Actions as materially appropriate, and integrate without overwriting newer Project truth. +4. Keep `main` untouched until that explicit integration step. + +## Checkpoint receipt + +This file is the explicit branch-local checkpoint receipt for the current Svif brand-work state. diff --git a/.agnir/evidence/2026-09-02-brand-identity-direction-candidate.md b/.agnir/evidence/2026-09-02-brand-identity-direction-candidate.md new file mode 100644 index 0000000..71a63bd --- /dev/null +++ b/.agnir/evidence/2026-09-02-brand-identity-direction-candidate.md @@ -0,0 +1,49 @@ +# Svif brand identity direction candidate — 2026-09-02 + +## Status + +This record is **branch-local candidate continuity** for `brand/identity-system`. It is not canonical Project truth until reconciled against the latest authoritative `main` and integrated there. `AGNIR.yaml` continues to declare `main` as the authoritative ref. + +## Approved direction-level decisions + +The Principal selected a synthesis of the following explored directions: + +- **01 — Particle + Motion**; +- **03 — S / A Geometry**; +- **05 — Flow & Structure**. + +For Svif, the selected family direction is: + +- role metaphor: **Motion Layer**; +- primary mark concept: flowing **S-shaped motion form**; +- supporting visual language: particle trajectories / suspension around the S; +- brand-family relationship: shared particle-and-geometry grammar with Agnir while remaining independently recognizable; +- palette direction: **teal / turquoise family**; +- Agnir counterpart: **Structure Layer** using a sand / warm-mineral palette. + +## What is not approved yet + +The current generated brand boards are concept/refinement evidence only and are **not production masters**. The following remain open: + +- exact SVG/Bézier geometry; +- exact particle count, positions, scale progression and spacing; +- construction grid and clear-space rules; +- exact HEX/RGB palette values; +- monochrome, reverse and dark-background rules; +- final wordmark typeface/custom lettering and licensing; +- mark/wordmark lockup proportions; +- small-size simplification, if required after 16/32/64 px testing. + +## Production-master gate + +The next stage is deterministic vector reconstruction and rendered QA. A generated preview must not be silently converted into an approved master. Production master approval requires an editable vector source plus explicit review of geometry, palette, lockups and small-size behavior. + +## Integration rule + +Detailed exploration remains in `brand/brand-process-log.md`. This candidate evidence may travel with the branch. Before integration: + +1. resolve the latest `main` Agnir continuity; +2. reconcile only material approved brand truth into canonical Decisions/State/Next Actions where appropriate; +3. integrate approved production assets and continuity as one coherent candidate when possible; +4. verify the authoritative `main` after publication; +5. remove the temporary brand branch after successful integration according to branch governance. diff --git a/.agnir/evidence/2026-09-02-brand-production-candidate.md b/.agnir/evidence/2026-09-02-brand-production-candidate.md new file mode 100644 index 0000000..d3f6f1a --- /dev/null +++ b/.agnir/evidence/2026-09-02-brand-production-candidate.md @@ -0,0 +1,87 @@ +# Svif brand production candidate — 2026-09-02 + +Status: **branch-local evidence; not canonical until reconciled and integrated into authoritative `main`.** + +## Locked authority + +The Principal-approved Today 10:42 AM Svif asset board remains the sole Svif-only visual authority. Production work in this branch does not authorize a regenerated S, replacement wordmark, palette cleanup or ribbon simplification. + +## Fidelity-first production decision + +Reviewed pure-vector approaches materially changed the approved translucent ribbon topology, fold/overlap structure or particle field. They were rejected. Delivery therefore uses deterministic raster extraction from the locked approved board rather than accepting a visually drifting SVG merely for format preference. + +`brand/tools/build-production-assets.py` validates the approved source SHA-256 and deterministically creates the native raster masters and approved-board derivatives recorded in `brand/masters/RASTER-MASTER-MANIFEST.md`. + +## Binary materialization evidence + +Git's binary blob API was tested with exact Git-object verification. The following repository binaries are directly committed under `brand/exports/`: + +- `svif-favicon-64.png` — Git blob `b396a8f9f36d3b59b69e16b650675e82d666e99e`; +- `svif-favicon-32.png` — Git blob `791eb44f67e6e96d55a1126bdc2fdc23b18b5050`; +- `svif-favicon-16.png` — Git blob `234044b5faf1be3a6862d5c8f8548757902bc69b`. + +For each, the GitHub-returned blob SHA matched the locally calculated Git object SHA exactly and the SHA-256 matches the production manifest. + +A PNG failing UTF-8 decoding is normal binary behavior and is not evidence of corruption. The actual active limitation is the current execution bridge's long-base64 argument truncation. Larger PNG payloads must not be attached unless the returned Git blob SHA matches the locally expected SHA exactly. + +A deliberate 128px boundary probe confirmed the limitation rather than weakening it: + +- source: `svif-favicon-128.png`, 12,183 bytes; +- locally expected Git object SHA: `40dbc1cbca075149cd8fc4e0859f09217b0c3530`; +- GitHub-returned blob SHA through the current bridge: `30eb8689852c6490c0e2e19d3ff39cb4269b1700`; +- result: **SHA mismatch; rejected and never attached to the branch tree**. + +This proves the current transport is reliable for the verified <=4KB examples above but not for the tested 12KB payload. No larger binary will be attached through this path without exact Git-object equality. + +## Complete QA + +The earlier production review scope has been normalized to the same 13-item final QA contract used for Agnir: + +1. mark; +2. wordmark; +3. horizontal lockup; +4. vertical lockup; +5. light usage; +6. dark usage; +7. monochrome usage; +8. app icon; +9. favicon 128; +10. favicon 64; +11. favicon 32; +12. favicon 16; +13. social card. + +The locked translucent S and particle appearance remain the visual authority. `brand/qa/FINAL-QA.md` records the branch-local QA contract and hashes. + +## Repository-documentation synchronization + +The new top-level `brand/` product surface is now represented in both repository documentation layers: + +- `REPOSITORY_TREE.md` includes the brand directory and responsibilities; +- `README.md` and `README.zh-CN.md` compact repository trees both include `brand/`. + +The compact-tree update was applied by a one-off GitHub Actions workflow and the temporary workflow file was removed afterward. Sync run `33704957846` completed successfully. + +## Integration validation + +A one-off validation workflow exercised the actual brand branch. The first run exposed only a temporary workflow environment omission (`PYTHONPATH=src`), not a product defect: repository integrity and portable contract checks already passed while runtime tests could not import `svif`. + +After correcting that validation environment without changing product code, run `33705138040` completed successfully with: + +- `python checks/check_repository.py`; +- `python conformance/check_contracts.py`; +- `PYTHONPATH=src python -m unittest discover -s tests -p 'test_*.py' -v`. + +The temporary validation workflow was then removed. + +## Remaining integration boundary + +Before canonical `main` integration: + +1. preserve the byte-exact approved Svif board in repository storage; +2. attach the remaining larger deterministic PNG outputs through a byte-preserving transport and verify Git blob SHA plus documented SHA-256; +3. re-resolve latest `main` and reconcile branch-local continuity; +4. integrate coherently without changing the immutable released `v0.2.0-preview.1` tag; +5. verify authoritative `main` after publication. + +At this point the unresolved gate is **large byte-exact binary preservation plus final latest-main reconciliation**; visual design, 13/13 QA, repository documentation, and branch validation are complete. diff --git a/.agnir/evidence/2026-09-02-brand-vectorization-candidate.md b/.agnir/evidence/2026-09-02-brand-vectorization-candidate.md new file mode 100644 index 0000000..3dfcbf1 --- /dev/null +++ b/.agnir/evidence/2026-09-02-brand-vectorization-candidate.md @@ -0,0 +1,49 @@ +# Svif brand production / vectorization evidence — 2026-09-02 + +Status: **branch-local candidate continuity; not canonical until reconciled and merged to authoritative `main`.** + +## Locked source + +The Principal-approved Today 10:42 AM Svif board remains the sole Svif-only visual authority. Its source SHA-256 and extraction coordinates are recorded in `brand/APPROVED-VISUAL-REFERENCE.md`, `brand/reference/EXTRACTION-MANIFEST.md`, and `brand/masters/RASTER-MASTER-MANIFEST.md`. + +## Vectorization finding + +Multiple pure-vector reconstruction strategies were tested against the approved S: + +- automatic contour / quantization; +- superpixel / SLIC; +- multi-layer color-band tracing; +- gradient / blur tracing; +- centerline Bézier stroke; +- constrained closed Bézier ribbon surfaces. + +Each materially changed some combination of the approved translucency, fold topology, ribbon-width variation, overlap ordering, particle trajectories, or edge softness. Those approaches were rejected; none is authorized as the Svif production mark. + +The old `brand/masters/candidates/svif-wordmark-trace-v0.1.svg` remains provenance only and is not a production master. + +## Production decision + +Delivery must not be blocked merely to obtain a nominally vector file. The current accepted engineering path is **fidelity-first raster production**: + +- verify the exact approved source-board SHA-256; +- deterministically crop the approved assets; +- recover transparent mark / wordmark / lockups from the white presentation matte; +- preserve the approved-board light / dark / monochrome, app-icon and social-card treatments; +- derive real target-size favicons; +- record SHA-256 values and native dimensions for every output. + +`brand/tools/build-production-assets.py` implements this path. `brand/masters/RASTER-MASTER-MANIFEST.md` records the expected output hashes. + +## Semantics boundary + +The resulting PNGs are raster production masters / approved-board derivatives. They must not be described as infinitely scalable vectors. An SVG wrapper, if later supplied, is only a container around raster artwork and does not change that semantic. + +A future pure-vector replacement is allowed only if it passes a new source-vs-vector fidelity review; format preference cannot override the frozen visual authority. + +## Binary write boundary + +The current connector path has demonstrated truncation risk for sufficiently long base64 binary payloads. Unverified binary blobs are therefore not attached to the branch. Add actual PNG binaries only through a binary-safe Git path and verify them against the recorded SHA-256 values afterward. + +## Next acceptable move + +Complete the Svif production handoff/package using the deterministic raster outputs, verify actual-size favicon/app/social surfaces, add verified binaries through a safe Git path, then reconcile this branch-local decision into the latest canonical `main` during integration. diff --git a/.agnir/evidence/2026-09-02-brand-visual-lock-candidate.md b/.agnir/evidence/2026-09-02-brand-visual-lock-candidate.md new file mode 100644 index 0000000..0732151 --- /dev/null +++ b/.agnir/evidence/2026-09-02-brand-visual-lock-candidate.md @@ -0,0 +1,29 @@ +# Svif brand visual lock candidate — 2026-09-02 + +Status: **Principal-approved on `brand/identity-system`; branch-local candidate continuity until reconciled and merged to authoritative `main`.** + +## Durable decision candidate + +The Principal ended further brand visual exploration and locked the **Today, 10:42 AM** reference set for future production. + +Authoritative branch-local reference record: + +- `brand/APPROVED-VISUAL-REFERENCE.md` + +Svif-only visual anchor: + +- `63e7953b-4571-45fb-a233-303ec8325c78.png` +- SHA-256 `10ad09a3c68e7ccd84e8c50ac4aaeda2bdb1e1fee4c09899ef4215fdec18f3fd` + +Family/co-brand anchor: + +- `1d00fb70-189b-4742-b4ac-c79be2668559.png` +- SHA-256 `4110d285243b6241ac709e750cca1815a10ca41e27c3bb15e6c94b56e57fa4fb` + +## Consequences + +- Svif remains the teal/turquoise **Motion Layer / 流动层** identity with the approved flowing S + particle language. +- The rejected deterministic `v0.1` reconstruction and later typography experiments are superseded and must not be treated as production masters. +- Future vectorization/derivatives must faithfully reproduce the approved board rather than redesign it. +- Any material visual deviation requires fresh Principal approval. +- `main` remains authoritative; this decision becomes canonical only after latest-`main` reconciliation and coherent integration. diff --git a/.agnir/evidence/2026-09-03-brand-binary-materialization.md b/.agnir/evidence/2026-09-03-brand-binary-materialization.md new file mode 100644 index 0000000..8f5b420 --- /dev/null +++ b/.agnir/evidence/2026-09-03-brand-binary-materialization.md @@ -0,0 +1,66 @@ +# Svif brand binary materialization — 2026-09-03 + +Status: **branch-local integration evidence; not canonical until integrated into authoritative `main`.** + +## Trigger + +The approved 10:42 AM source board and larger raster production outputs could not be sent byte-exactly through the direct ChatGPT-to-GitHub base64 bridge. A controlled 12,183-byte PNG probe returned a different Git object SHA and was rejected rather than attached. + +The Principal then uploaded the prepared handoff ZIP directly to the root of `brand/identity-system`. + +## Transport verification + +The uploaded archive was verified before use: + +- filename: `svif-agnir-brand-binary-integration-handoff.zip`; +- size: `7,925,506` bytes; +- SHA-256: `52e8cee3c03f0762fc47d579505122dc452e5de97dafb462a3b470ed5457f72d`; +- Git blob: `3f49c176a5c5680620de6f4de09beb6297f99bf0`. + +The same Git blob was observed in both Svif and Agnir repositories, proving the browser uploads preserved the exact archive bytes. + +## Stale-base reconciliation + +Before materialization, authoritative Svif `main` had advanced to `eba1b8538c4692a08bf69452525b735d23564599`; the brand branch was behind by 7 commits. + +Reverse-sync PR `#8` (`main` -> `brand/identity-system`) was mergeable and was merged into the brand branch at `6076dd08d3e8d352d130a6c3ac2ccddb3d28bae7`. Post-reconcile comparison reported `behind main = 0`. + +## Byte-exact GitHub-runner materialization + +Temporary workflow creation commit: `9726a22107df137d36980faceb6b38a4de06af2c`. + +Workflow run `33730468886` completed successfully. It: + +1. verified the uploaded archive SHA-256; +2. extracted the handoff; +3. selected all Svif payload targets; +4. explicitly restored the family-board Svif mapping omitted by the handoff manifest-v1 duplicate-key bug; +5. verified each source payload SHA-256; +6. copied each source to its final repository path; +7. verified each destination SHA-256 again; +8. committed the assets; +9. removed the root transport ZIP and temporary workflow. + +Final materialization commit: `137307351dfee467472ccd997fdc714b8a71c549`. + +## Repository result + +Byte-exact approved references now exist at: + +- `brand/reference/svif-approved-reference.png`; +- `brand/reference/svif-agnir-family-approved-reference.png`. + +Raster production masters now exist at: + +- `brand/masters/svif-mark.png`; +- `brand/masters/svif-wordmark.png`; +- `brand/masters/svif-horizontal-lockup.png`; +- `brand/masters/svif-vertical-lockup.png`. + +The complete light/dark/mono/app/favicon/social delivery set exists under `brand/exports/`. + +A particularly useful integrity receipt is `brand/exports/svif-favicon-128.png`: Git blob `40dbc1cbca075149cd8fc4e0859f09217b0c3530`, exactly equal to the locally expected Git object SHA that the earlier direct bridge failed to preserve. + +## Gate result + +The **large byte-exact binary preservation gate is closed** for the Svif brand branch. Remaining gates are latest-main freshness, final Draft PR synthetic-merge CI, coherent publication to authoritative `main`, and post-publication verification. diff --git a/.agnir/evidence/2026-09-07-brand-final-integration-readiness.md b/.agnir/evidence/2026-09-07-brand-final-integration-readiness.md new file mode 100644 index 0000000..70140fb --- /dev/null +++ b/.agnir/evidence/2026-09-07-brand-final-integration-readiness.md @@ -0,0 +1,51 @@ +# Svif brand final integration readiness — 2026-09-07 + +Status: **branch-local integration evidence; candidate until integrated into authoritative `main`.** + +## Current authoritative target + +Fresh reads of `main` confirm: + +- main revision: `eba1b8538c4692a08bf69452525b735d23564599`; +- Svif product line: `0.2`; +- Project Binding: `project-binding/0.2`; +- Agnir Core/profile: `0.2` / `repository-filesystem/0.2`; +- Project identity: `urn:svif:project:svif-core`; +- logical lineage: `urn:svif:lineage:authoritative`; +- selector: `refs/heads/main`; +- Agnir operational release: `0.2.0` at applied revision `fc84095ed5d500be9e1b43a4af0e93356571bbd4`. + +`SVIF.yaml` declares the same continuity compatibility/profile and binding. + +## Agnir v1 assessment + +Agnir `v1.0.0` is now published stable, but its stable policy preserves existing valid Core/profile `0.2` Projects and requires `0.2` → `1.0` to be a separately authorized Project-owned promotion. + +The current task is brand publication only. It does not alter continuity semantics and is not authorization to promote the Svif Project to Agnir Core/profile `1.0`. Therefore the final brand integration must inherit the current authoritative `AGNIR.yaml`, `SVIF.yaml`, continuity, migration history, and Preview.1 onboarding baseline unchanged. + +## Brand package readiness + +The approved 10:42 AM visual authority, fidelity-first raster masters, delivery exports, 13/13 QA contract, repository-map documentation and production tooling are committed on `brand/identity-system`. + +The large byte-exact binary preservation gate is closed: + +- approved Svif reference SHA-256: `10ad09a3c68e7ccd84e8c50ac4aaeda2bdb1e1fee4c09899ef4215fdec18f3fd`; +- approved family reference SHA-256: `4110d285243b6241ac709e750cca1815a10ca41e27c3bb15e6c94b56e57fa4fb`; +- GitHub materialization workflow: `33730468886` success; +- materialization commit: `137307351dfee467472ccd997fdc714b8a71c549`; +- formerly blocked 128px favicon Git blob: `40dbc1cbca075149cd8fc4e0859f09217b0c3530`. + +## Fresh target relation + +Fresh comparison on 2026-09-07 reports `brand/identity-system` ahead of current authoritative `main` and **behind by 0**, with merge base equal to `eba1b8538c4692a08bf69452525b735d23564599`. + +## Final publication gates + +Before advancing authoritative `main`: + +1. PR #5 synthetic-merge product checks must be green on the final head; +2. a fresh comparison must still report `behind main = 0`; +3. PR #5 must remain mergeable; +4. integration must not move immutable `v0.2.0-preview.1` or change Svif's Agnir Core/profile `0.2` binding; +5. authoritative-main product checks must pass after merge; +6. canonical Svif State/Next Actions must be reconciled to record accepted brand integration. diff --git a/README.md b/README.md index 20eb273..b41c1ad 100644 --- a/README.md +++ b/README.md @@ -65,6 +65,7 @@ Project/ ├── AGENTS.md # [EDIT: add entry only] add Agnir activation locator; preserve existing instructions ├── README.md # [EDIT: add entry only] add ## Agnir Project Instructions; preserve existing content ├── AGNIR.yaml # [ADD] founding Agnir discovery anchor +├── brand/ # approved brand masters, exports, QA, references, and handoff ├── .agnir/ # [ADD] Project-owned durable continuity │ ├── state.md # [ADD] current durable Project truth │ ├── next-actions.md # [ADD] outstanding ordered work for the next Executor diff --git a/README.zh-CN.md b/README.zh-CN.md index bc9efad..bc36e77 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -65,6 +65,7 @@ Project/ ├── AGENTS.md # [编辑:仅添加入口] 加入 Agnir activation locator;保留原有 instructions ├── README.md # [编辑:仅添加入口] 加入 ## Agnir Project Instructions;保留原有内容 ├── AGNIR.yaml # [新增] founding Agnir discovery anchor +├── brand/ # 已批准品牌主稿、导出、QA、参考与交付说明 ├── .agnir/ # [新增] Project 自己拥有的 durable continuity │ ├── state.md # [新增] 当前仍然成立的 durable Project truth │ ├── next-actions.md # [新增] 下一位 Executor 应继续推进的有序工作 diff --git a/REPOSITORY_TREE.md b/REPOSITORY_TREE.md index ea73835..fb61ead 100644 --- a/REPOSITORY_TREE.md +++ b/REPOSITORY_TREE.md @@ -1,10 +1,10 @@ # Repository Tree / 目录树 -本页是 `iorLab/svif` 当前 `main` 的**完整文件级仓库结构说明**。README 中的仓库树只用于快速导航;这里把当前 tracked 目录与文件全部展开,并在右侧说明它们的职责。 +本页是 `iorLab/svif` 当前仓库的**完整文件级仓库结构说明**。README 中的仓库树只用于快速导航;这里把当前 tracked 目录与文件全部展开,并在右侧说明它们的职责。 维护规则:只要仓库新增、删除、移动文件,或者某个目录 / 文件的职责发生实质变化,就必须在同一个 change set 中同步更新本页;README 中的简略目录树若受影响,也必须一起更新。 -> 本页解释的是当前 active `main`。Git 内部元数据(例如 `.git/`)不属于仓库 tracked 内容,因此不列出。 +> Git 内部元数据(例如 `.git/`)不属于仓库 tracked 内容,因此不列出。 ```text svif/ # Svif 产品主仓库 @@ -45,6 +45,19 @@ svif/ # Svif 产品主仓库 │ └── workflows/ │ └── conformance.yml # CI:repository integrity、runtime tests、portable contracts │ +├── brand/ # Svif 品牌识别与 fidelity-first production asset surface +│ ├── README.md # 品牌目录职责、raster-master 模型与 integration status +│ ├── APPROVED-VISUAL-REFERENCE.md # Principal 批准的 10:42 AM 视觉基准与 source hash +│ ├── PRODUCTION-STATUS.md # 当前 fidelity / QA / binary / integration gates +│ ├── brand-handoff.md # 下游使用规则、限制与禁止替换项 +│ ├── brand-process-log.md # 品牌设计与生产过程记录 +│ ├── reference/ # extraction coordinates / source-reference manifests +│ ├── masters/ # raster-master manifest 与 future approved master surface +│ │ └── candidates/ # 历史 review candidates;不作为 production truth +│ ├── exports/ # 已通过 binary verification 的 delivery derivatives +│ ├── qa/ # 对称 13 项 final QA 范围与 evidence metadata +│ └── tools/ # deterministic raster extraction / production builders +│ ├── src/ # Svif 可执行产品代码 │ └── svif/ # Python reference package │ ├── __init__.py # Python package 入口 / 公共导出边界 @@ -129,12 +142,14 @@ svif/ # Svif 产品主仓库 ├── ARCHITECTURE.md # 详细产品架构、依赖方向、provider ownership 和 distribution 边界 ├── README.md # 英文项目入口与 canonical `Agnir Project Instructions` ├── README.zh-CN.md # 简体中文项目入口;与英文版保持同一 canonical 产品语义 -├── REPOSITORY_TREE.md # 本文件:当前 main 的完整文件级仓库结构与职责说明 +├── REPOSITORY_TREE.md # 本文件:完整文件级仓库结构与职责说明 └── VERSION # 当前 Svif 产品 / release version ``` ## 如何使用这张树 -如果只是第一次理解 Svif,优先看 README 里的简略树即可;需要定位某个具体 contract、fixture、test、Plugin artifact、evidence 或 integration 文件时,再查本页。 +如果只是第一次理解 Svif,优先看 README 里的简略树即可;需要定位某个具体 contract、fixture、test、Plugin artifact、brand asset、evidence 或 integration 文件时,再查本页。 + +`brand/` 是产品/发布表面,不改变 Svif 的 Orchestrator / Continuity Provider / Execution Surface / Capability Provider 架构边界。品牌视觉权威和 production 规则以 `brand/` 内批准文件为准,合并到 `main` 前仍需通过 binary/documentation/integration gates。 本页不是第二套架构定义。**架构语义仍以 `ARCHITECTURE.md`、`spec/`、`SVIF.yaml` 和 canonical Agnir decisions/state 为准;本页负责把这些职责映射回仓库中的实际文件位置。** \ No newline at end of file diff --git a/brand/APPROVED-VISUAL-REFERENCE.md b/brand/APPROVED-VISUAL-REFERENCE.md new file mode 100644 index 0000000..6fbeb95 --- /dev/null +++ b/brand/APPROVED-VISUAL-REFERENCE.md @@ -0,0 +1,37 @@ +# Approved visual reference — 2026-09-02 + +Status: **Principal-approved visual lock on `brand/identity-system`; not canonical Project truth until reconciled and merged to authoritative `main`.** + +The Principal explicitly ended further visual exploration and selected the **Today, 10:42 AM** brand asset version as the reference to preserve. + +## Exact reference set + +The lock refers to the three PNG attachments supplied with the approval message. Their byte-level SHA-256 values are recorded so later work cannot silently substitute a regenerated lookalike. + +| Role | Attachment filename | Dimensions | SHA-256 | +| --- | --- | --- | --- | +| Svif single-brand asset board | `63e7953b-4571-45fb-a233-303ec8325c78.png` | 1448×1086 | `10ad09a3c68e7ccd84e8c50ac4aaeda2bdb1e1fee4c09899ef4215fdec18f3fd` | +| Agnir single-brand asset board | `78820894-7679-4b2a-89eb-b3ff71300e8d.png` | 1448×1086 | `24b418a975369ea022db229aaa45e1a4993e982f8d4baec16c918a1a0a4b99ac` | +| Svif × Agnir family asset-system board | `1d00fb70-189b-4742-b4ac-c79be2668559.png` | 1448×1086 | `4110d285243b6241ac709e750cca1815a10ca41e27c3bb15e6c94b56e57fa4fb` | + +## Precedence + +1. For **Svif-only** usage, the Svif single-brand board is the visual authority. +2. For **Agnir-only** usage, the Agnir single-brand board is the visual authority. +3. For **co-brand / family** usage, the Svif × Agnir family board is the visual authority. +4. If those boards differ in a way that cannot be resolved by the applicable context above, do **not** invent a reconciliation. Preserve the relevant board or ask the Principal. + +## Locked direction + +- Svif: teal/turquoise **Motion Layer / 流动层**, flowing S form with suspended particle trails. +- Agnir: sand/warm-mineral **Structure Layer / 结构层**, particle-built A form with a central anchor. +- Family relationship: distinct brands sharing particle-and-geometry language. +- Typography, wordmark color, lockups, icon treatments, light/dark/monochrome examples, and social/repository usage are frozen to what the applicable reference board actually shows. + +## Superseded work + +The deterministic `v0.1` SVG reconstruction, its small-size variants/specification, and later typography experiments were explicitly rejected or superseded. They must not be treated as master artwork or as permission to reinterpret the approved reference. + +## Future production rule + +Any future vectorization, export, favicon/app-icon generation, README integration, or other production derivative must be a **faithful extraction/reconstruction of this approved visual reference**, not a redesign. Material visual deviation requires new Principal approval. diff --git a/brand/PRODUCTION-STATUS.md b/brand/PRODUCTION-STATUS.md new file mode 100644 index 0000000..62b5641 --- /dev/null +++ b/brand/PRODUCTION-STATUS.md @@ -0,0 +1,114 @@ +# Svif brand production status + +Date: 2026-09-03 +Branch: `brand/identity-system` +Canonical Project ref remains: `main` + +## Locked visual authority + +The Principal-approved Today 10:42 AM Svif board remains the sole Svif-only visual authority. The byte-exact board is now committed at `brand/reference/svif-approved-reference.png` with locked SHA-256 `10ad09a3c68e7ccd84e8c50ac4aaeda2bdb1e1fee4c09899ef4215fdec18f3fd`. + +The byte-exact family board is committed at `brand/reference/svif-agnir-family-approved-reference.png` with SHA-256 `4110d285243b6241ac709e750cca1815a10ca41e27c3bb15e6c94b56e57fa4fb`. + +## Production model + +**Fidelity-first raster production is the approved Svif delivery model.** Reviewed pure-vector reconstructions materially changed the translucent ribbon topology, folds/overlaps or particle field and remain rejected. + +`brand/tools/build-production-assets.py` deterministically derives the production package from the locked source and refuses a source-board SHA mismatch. + +The current raster production masters are committed directly under `brand/masters/`: + +- `svif-mark.png` +- `svif-wordmark.png` +- `svif-horizontal-lockup.png` +- `svif-vertical-lockup.png` + +They preserve the approved raster appearance and are not infinitely scalable vector masters. `brand/masters/candidates/svif-wordmark-trace-v0.1.svg` remains provenance only. + +## Materialized delivery exports + +The complete delivery set is now committed under `brand/exports/`: + +- `svif-light-usage.png` +- `svif-dark-usage.png` +- `svif-monochrome-usage.png` +- `svif-app-icon.png` +- `svif-social-card.png` +- `svif-favicon-128.png` +- `svif-favicon-64.png` +- `svif-favicon-32.png` +- `svif-favicon-16.png` + +All files were materialized on a GitHub runner from the user-uploaded byte-exact handoff archive. Workflow run `33730468886` verified the archive SHA-256, verified each source payload SHA-256, copied each file to its final repository path, re-verified each destination SHA-256, committed the results, and removed both the transport ZIP and the temporary workflow. + +Final materialization commit: `137307351dfee467472ccd997fdc714b8a71c549`. + +The previously blocked 128px favicon now proves the byte-safe path succeeded: repository Git blob `40dbc1cbca075149cd8fc4e0859f09217b0c3530`, exactly matching the locally expected Git object SHA that could not traverse the earlier direct base64 bridge. + +Expected production SHA-256 values remain recorded in `brand/masters/RASTER-MASTER-MANIFEST.md`. + +## Complete QA + +Final QA is symmetric with Agnir and covers 13/13 items: + +1. mark; +2. wordmark; +3. horizontal lockup; +4. vertical lockup; +5. light usage; +6. dark usage; +7. monochrome usage; +8. app icon; +9. favicon 128; +10. favicon 64; +11. favicon 32; +12. favicon 16; +13. social card. + +Complete Svif QA sheet SHA-256: `41606509a1ab49f4c48e2f8a0affbe966cdeee256f90a0d693a6c275dc9f6cb2`. + +The frozen 10:42 board remains visually authoritative over every derivative. + +## Latest main reconciliation + +Immediately before binary materialization, authoritative `main` had advanced to `eba1b8538c4692a08bf69452525b735d23564599` and the brand branch was behind by 7 commits. + +Reverse-sync PR `#8` (`main` -> `brand/identity-system`) was mergeable and was merged into the branch at `6076dd08d3e8d352d130a6c3ac2ccddb3d28bae7` before materialization. The post-reconcile branch was behind `main` by 0. + +No released `v0.2.0-preview.1` tag was moved or modified. + +## Repository documentation + +The `brand/` product surface is represented in `README.md`, `README.zh-CN.md`, and `REPOSITORY_TREE.md`. The latest-main reconciliation preserved newer product/runtime truth while retaining the brand-only repository-map entries. + +## QA and integration rules + +- Principal-facing brand review stays free of diagnostic overlays. +- Raster masters must preserve the approved translucent ribbon and particle appearance. +- Favicon review is at actual 128/64/32/16 targets. +- No derivative may become permission to redesign the locked source. +- Future pure-vector replacement requires a new clean source-vs-vector review and explicit approval. + +## Agnir v1 compatibility assessment — 2026-09-07 + +Agnir `v1.0.0` is now the latest stable Agnir distribution, but Svif's authoritative Project binding intentionally remains on Agnir Core/profile `0.2`: + +- `AGNIR.yaml`: Core `0.2`, `repository-filesystem/0.2`, operational Agnir release `0.2.0`; +- `SVIF.yaml`: continuity compatibility `0.2`, profile `repository-filesystem/0.2`; +- Project identity and logical lineage remain `urn:svif:project:svif-core` and `urn:svif:lineage:authoritative`; +- selector remains `refs/heads/main`. + +This brand integration is compatibility-neutral and **does not authorize an Agnir `0.2` → `1.0` Project promotion**. Agnir v1 explicitly preserves historical `0.2` compatibility, while changing the Project declaration to `1.0` is a separate Project-owned promotion. Therefore no `AGNIR.yaml`, `SVIF.yaml`, continuity-provider adapter contract, or release/onboarding baseline is changed by the brand merge. + +Fresh comparison on 2026-09-07 reports `brand/identity-system` ahead of authoritative `main` and **behind by 0**, with merge base equal to current main `eba1b8538c4692a08bf69452525b735d23564599`. + +## Integration readiness + +The former large-binary preservation blocker is **closed**. Byte-exact source references, raster masters, and delivery exports are repository-resident and SHA-verified. + +Remaining publication gates are only: + +1. require PR `#5` synthetic-merge product checks to be green on the final branch head; +2. re-check `behind main = 0` and PR mergeability immediately before publication; +3. integrate the approved brand package coherently without changing the immutable `v0.2.0-preview.1` release tag or Svif's Agnir Core/profile `0.2` binding; +4. fresh-verify authoritative `main` after publication and reconcile canonical Svif continuity. diff --git a/brand/README.md b/brand/README.md new file mode 100644 index 0000000..03c44f1 --- /dev/null +++ b/brand/README.md @@ -0,0 +1,38 @@ +# Svif brand system + +This directory contains the fidelity-first Svif identity system derived from the Principal-approved Today 10:42 AM visual reference. + +## Directory responsibilities + +```text +brand/ +├── README.md # this guide +├── APPROVED-VISUAL-REFERENCE.md # locked visual authority and source hashes +├── PRODUCTION-STATUS.md # current production gate / completed work +├── brand-handoff.md # downstream usage rules +├── brand-process-log.md # design/production chronology retained for audit +├── reference/ # extraction coordinates and reference manifests +├── masters/ # raster-master manifest + any future approved master geometry +│ └── candidates/ # rejected/review candidates; not production truth +├── exports/ # committed delivery derivatives that passed binary verification +├── qa/ # final review scope and QA evidence metadata +└── tools/ # deterministic extraction/build tooling +``` + +## Production authority + +The current Svif production model is fidelity-first raster, not an approximate pure-vector reconstruction. `masters/RASTER-MASTER-MANIFEST.md` records the native production assets and expected SHA-256 values. `tools/build-production-assets.py` reconstructs them only from the byte-exact approved board and rejects a source hash mismatch. + +The old `masters/candidates/svif-wordmark-trace-v0.1.svg` and rejected S-vector experiments are provenance only; they must not replace the approved raster appearance. + +## Derivatives + +The complete local delivery package contains mark, wordmark, horizontal/vertical lockups, light/dark/monochrome usage, app icon, 128/64/32/16 favicons and social card. The 64/32/16 favicon PNGs have already been committed through Git binary blobs and verified by Git blob SHA. Larger binaries remain hash-gated until a byte-safe repository path is available. + +## QA + +`qa/FINAL-QA.md` defines the symmetric 13-item final QA scope shared with Agnir. The approved Today 10:42 AM board remains visually authoritative over every derivative. + +## Integration status + +Everything in this directory is branch-local until reconciled with the latest authoritative `main` and integrated coherently. Integration must not turn a raster-backed transport wrapper into a claimed true-vector master or regenerate the S artwork. diff --git a/brand/brand-handoff.md b/brand/brand-handoff.md new file mode 100644 index 0000000..ddaefee --- /dev/null +++ b/brand/brand-handoff.md @@ -0,0 +1,98 @@ +# Svif brand handoff + +Status: **approved and production-materialized on `brand/identity-system`; branch-local until integrated into authoritative `main`.** + +Visual authority: the Principal-approved Today 10:42 AM Svif asset board. + +## Brand idea + +Svif is the **Motion Layer / 流动层**: flow, suspension and orchestration across surfaces. The identity is the approved translucent teal/turquoise `S` ribbon with suspended particle trajectories. + +## Repository-resident visual references + +Use these byte-exact references when source comparison is required: + +- `brand/reference/svif-approved-reference.png` +- `brand/reference/svif-agnir-family-approved-reference.png` + +Their SHA-256 locks are recorded in `brand/APPROVED-VISUAL-REFERENCE.md` and `brand/reference/EXTRACTION-MANIFEST.md`. + +## Production-master model + +Svif uses **fidelity-first raster masters** because reviewed pure-vector attempts materially changed the approved translucent ribbon topology, folds/overlaps or particle field. + +Committed raster masters: + +```text +brand/masters/ +├── svif-mark.png +├── svif-wordmark.png +├── svif-horizontal-lockup.png +└── svif-vertical-lockup.png +``` + +These are native raster production masters for the approved appearance. Do not upscale them and call the result a new native source master. A future vector replacement requires a new source-vs-vector fidelity review and explicit approval. + +`brand/tools/build-production-assets.py` remains the deterministic rebuild path and validates the locked source SHA-256. Expected output hashes are in `brand/masters/RASTER-MASTER-MANIFEST.md`. + +## Approved treatments and delivery exports + +The full repository-resident delivery set is under `brand/exports/`: + +- light / dark / monochrome approved treatments; +- approved app icon; +- approved social card; +- favicons at 128 / 64 / 32 / 16px. + +Use the actual committed files rather than regenerating a generic S, substitute typeface, simplified ribbon or redesigned particle field. + +### Light background + +Use the approved teal/brand-color wordmark treatment shown by the locked board. + +### Dark background + +Use the approved translucent mark treatment with white wordmark on the dark teal surface. + +### Monochrome + +Use the approved grayscale ribbon/particle treatment with black wordmark. + +### Favicons + +Do not regenerate the S for small sizes. Evaluate the actual raster target at 128/64/32/16px. + +## Social card + +Preserve the locked composition: translucent S, black `Svif`, `流动层 / Motion Layer`, bilingual copy and the light teal particle/ribbon field. Do not invent a campaign redesign. + +## Forbidden substitutions + +Do not: + +- replace the S with a generic glyph; +- replace the wordmark with a merely similar font; +- simplify ribbon folds or particle trajectories; +- reconcile Agnir and Svif into one palette; +- represent an SVG wrapper around a PNG as a true vector master; +- promote rejected v0.1/vectorization candidates; +- use image generation to create a replacement production logo. + +## Byte-exact materialization receipt + +The former large-binary transport blocker is closed. GitHub Actions run `33730468886` verified the handoff archive and every source/destination SHA-256 before committing the complete repository package at `137307351dfee467472ccd997fdc714b8a71c549`. The temporary transport ZIP and workflow removed themselves in that commit. + +## Agnir compatibility boundary + +Svif's current Project-owned continuity remains Agnir Core/profile `0.2` even though Agnir `v1.0.0` is now the latest stable distribution. This is intentional. The brand package does not alter continuity semantics and does not authorize the separately governed `0.2` → `1.0` Project promotion. + +For this integration, preserve current authoritative `AGNIR.yaml`, `SVIF.yaml`, Project identity, logical lineage, selector, durable locators, and the immutable Preview.1 onboarding baseline exactly as supplied by current Svif `main`. + +## Integration gate + +Before canonical `main` integration: + +1. require PR `#5` product checks to pass on the final head; +2. confirm the branch remains behind authoritative `main` by 0 and the PR remains mergeable; +3. integrate the brand package without moving `v0.2.0-preview.1` or changing the current Agnir Core/profile `0.2` Project binding; +4. fresh-verify the resulting authoritative `main` and checkpoint canonical Svif continuity. diff --git a/brand/brand-process-log.md b/brand/brand-process-log.md new file mode 100644 index 0000000..94409b9 --- /dev/null +++ b/brand/brand-process-log.md @@ -0,0 +1,86 @@ +# Svif Brand Process Log + +## Record metadata + +| Field | Value | +| --- | --- | +| Brand or product | Svif | +| Record owner | Svif Project (`iorLab/svif`) | +| Started | 2026-09-01 | +| Last updated | 2026-09-02 | +| Approval authority | Principal | +| Working branch | `brand/identity-system` | +| Canonical Project ref | `main` — this branch remains candidate continuity until integration | +| Current brand status | **Visual direction locked to the Principal-approved Today, 10:42 AM reference set** | + +## Brief + +Svif is a Project orchestration product. The brand expresses controlled motion across replaceable execution environments without implying that an Execution Surface owns Project truth. + +Svif and Agnir remain independent brands with one visual family language: Svif is the **Motion Layer / 流动层**; Agnir is the **Structure Layer / 结构层**. + +## Final visual decision on this branch + +On 2026-09-02, after concept exploration and several rejected reconstruction/typography attempts, the Principal explicitly ended further visual exploration and selected the **Today, 10:42 AM** asset-system version as the visual reference to preserve. + +The exact reference set and byte hashes are recorded in: + +- `brand/APPROVED-VISUAL-REFERENCE.md` + +For Svif-only work, the controlling visual is the attached Svif asset board: + +- attachment: `63e7953b-4571-45fb-a233-303ec8325c78.png` +- dimensions: `1448×1086` +- SHA-256: `10ad09a3c68e7ccd84e8c50ac4aaeda2bdb1e1fee4c09899ef4215fdec18f3fd` + +For co-brand work, the controlling visual is the attached family asset-system board: + +- attachment: `1d00fb70-189b-4742-b4ac-c79be2668559.png` +- dimensions: `1448×1086` +- SHA-256: `4110d285243b6241ac709e750cca1815a10ca41e27c3bb15e6c94b56e57fa4fb` + +## Locked visual invariants + +- Brand role: **Motion Layer / 流动层**. +- Core mark: flowing translucent S-form with suspended particle trails, exactly in the approved reference language. +- Palette: teal/turquoise family as displayed by the applicable approved board. +- Family grammar: particles + geometry shared with Agnir while preserving separate brand recognition. +- Single-brand wordmark, lockup, light/dark/monochrome treatment, icon behavior, and other shown applications follow the Svif single-brand board. +- Dual-brand/co-brand treatment follows the family board. +- Where boards differ, context-specific precedence in `brand/APPROVED-VISUAL-REFERENCE.md` controls; do not invent a merged interpretation. + +## Exploration and decisions + +| Date | Direction or decision | Outcome | Approver | +| --- | --- | --- | --- | +| 2026-09-01 | Work on temporary `brand/identity-system` branch | Approved | Principal | +| 2026-09-01 | Related but independent Svif/Agnir identity system | Approved | Principal | +| 2026-09-02 | Retain 01 Particle + Motion, 03 S/A Geometry, 05 Flow & Structure | Approved for synthesis | Principal | +| 2026-09-02 | Fuse 01 + 03 + 05 | Selected | Principal | +| 2026-09-02 | Svif teal / Agnir sand | Selected | Principal | +| 2026-09-02 | Deterministic SVG reconstruction v0.1 | **Rejected** | Principal | +| 2026-09-02 | Later wordmark/font experiments | **Superseded by 10:42 reference lock** | Principal | +| 2026-09-02 | Today, 10:42 AM reference set | **Locked visual reference for future production** | Principal | + +## Superseded artifacts + +The following rejected reconstruction artifacts were removed from the active brand branch so they cannot be mistaken for approved masters: + +- `brand/masters/svif-mark-v0.1.svg` +- `brand/masters/svif-mark-small-v0.1.svg` +- `brand/masters/MASTER-SPEC-v0.1.md` +- `.agnir/evidence/2026-09-02-brand-master-v0.1-candidate.md` + +Their history remains recoverable through Git, but they are not active brand truth. + +## Production boundary + +No further visual redesign is authorized by this lock. If production work resumes later, it must: + +1. use the approved 10:42 reference as the source of truth; +2. faithfully extract/reconstruct vectors and derivatives rather than reinterpret the design; +3. preserve the applicable board's typography, colors, proportions, particle character, and context-specific lockups; +4. surface any unavoidable ambiguity instead of silently choosing a new look; +5. require fresh Principal approval for any material visual deviation. + +README/Plugin/icon/social integration into `main` remains deferred until a separate integration decision. Before merge, re-resolve latest `main` and reconcile this branch-approved result into canonical Agnir continuity coherently. diff --git a/brand/exports/README.md b/brand/exports/README.md new file mode 100644 index 0000000..0bccfa1 --- /dev/null +++ b/brand/exports/README.md @@ -0,0 +1,43 @@ +# Svif production exports + +Svif uses a fidelity-first raster production model because reviewed pure-vector reconstructions materially changed the approved translucent ribbon topology. + +## Repository-resident exports + +The complete approved delivery set is now committed directly under this directory: + +- `svif-light-usage.png` +- `svif-dark-usage.png` +- `svif-monochrome-usage.png` +- `svif-app-icon.png` +- `svif-social-card.png` +- `svif-favicon-128.png` +- `svif-favicon-64.png` +- `svif-favicon-32.png` +- `svif-favicon-16.png` + +Core raster masters live separately under `brand/masters/`. + +All binary files were materialized through GitHub Actions run `33730468886`. The run verified the uploaded handoff archive SHA-256, verified every source payload SHA-256, copied each payload to its final repository path and re-verified every destination before commit `137307351dfee467472ccd997fdc714b8a71c549`. + +The 128px favicon now has repository Git blob `40dbc1cbca075149cd8fc4e0859f09217b0c3530`, matching the expected Git object SHA exactly. + +## Deterministic rebuild + +The package can be reproduced from the byte-exact committed source board with: + +```bash +python brand/tools/build-production-assets.py \ + --board brand/reference/svif-approved-reference.png \ + --out +``` + +The builder validates the locked source SHA-256. Expected output SHA-256 values are recorded in `brand/masters/RASTER-MASTER-MANIFEST.md`. + +## Rules + +- Do not replace committed assets with regenerated or approximate artwork. +- Do not call raster assets infinitely scalable vector masters. +- Do not substitute a generic S or similar typeface. +- Preserve the approved light/dark/monochrome, app-icon, favicon and social-card compositions. +- Any future pure-vector replacement requires a new explicit fidelity approval. diff --git a/brand/exports/svif-app-icon.png b/brand/exports/svif-app-icon.png new file mode 100644 index 0000000..2db76d3 Binary files /dev/null and b/brand/exports/svif-app-icon.png differ diff --git a/brand/exports/svif-dark-usage.png b/brand/exports/svif-dark-usage.png new file mode 100644 index 0000000..ef29f16 Binary files /dev/null and b/brand/exports/svif-dark-usage.png differ diff --git a/brand/exports/svif-favicon-128.png b/brand/exports/svif-favicon-128.png new file mode 100644 index 0000000..40dbc1c Binary files /dev/null and b/brand/exports/svif-favicon-128.png differ diff --git a/brand/exports/svif-favicon-16.png b/brand/exports/svif-favicon-16.png new file mode 100644 index 0000000..234044b Binary files /dev/null and b/brand/exports/svif-favicon-16.png differ diff --git a/brand/exports/svif-favicon-32.png b/brand/exports/svif-favicon-32.png new file mode 100644 index 0000000..791eb44 Binary files /dev/null and b/brand/exports/svif-favicon-32.png differ diff --git a/brand/exports/svif-favicon-64.png b/brand/exports/svif-favicon-64.png new file mode 100644 index 0000000..b396a8f Binary files /dev/null and b/brand/exports/svif-favicon-64.png differ diff --git a/brand/exports/svif-light-usage.png b/brand/exports/svif-light-usage.png new file mode 100644 index 0000000..722b824 Binary files /dev/null and b/brand/exports/svif-light-usage.png differ diff --git a/brand/exports/svif-monochrome-usage.png b/brand/exports/svif-monochrome-usage.png new file mode 100644 index 0000000..34c833a Binary files /dev/null and b/brand/exports/svif-monochrome-usage.png differ diff --git a/brand/exports/svif-social-card.png b/brand/exports/svif-social-card.png new file mode 100644 index 0000000..d906f79 Binary files /dev/null and b/brand/exports/svif-social-card.png differ diff --git a/brand/masters/RASTER-MASTER-MANIFEST.md b/brand/masters/RASTER-MASTER-MANIFEST.md new file mode 100644 index 0000000..f4b26ca --- /dev/null +++ b/brand/masters/RASTER-MASTER-MANIFEST.md @@ -0,0 +1,49 @@ +# Svif raster production master manifest + +Status: **branch-local production record; visual authority remains the Principal-approved Today 10:42 AM Svif board.** + +Source board SHA-256: + +`10ad09a3c68e7ccd84e8c50ac4aaeda2bdb1e1fee4c09899ef4215fdec18f3fd` + +The files below are the expected deterministic outputs of `brand/tools/build-production-assets.py`. They are fidelity-first raster masters / approved-board derivatives, not pure-vector replacements. + +| Asset | Role | Native size | Expected SHA-256 | +| --- | --- | ---: | --- | +| `svif-mark.png` | raster master | 292×290 | `5895265cbf7fec4f0ef67f6ffdc10ae3622452b253325c9a66b3a04db8411f31` | +| `svif-wordmark.png` | raster master | 255×155 | `9cd52530c102af04b9fdf577efce7ebc3c2feadd2d6ef538d8c2289f28d2a927` | +| `svif-horizontal-lockup.png` | raster master | 361×200 | `273dc67eed55f8dc9c0f831989a781a44c38d8ece9b466174e45d1016b02d252` | +| `svif-vertical-lockup.png` | raster master | 208×215 | `ae7f98e723eba74cbe81126bfe29cc85c9950844d6e3603248da362982127a5d` | +| `svif-light-usage.png` | approved-board derivative | 378×140 | `72a688daeae4ee885027065e55f5c98d8d9bf2df85c096c4cdbaa643d44a5e88` | +| `svif-dark-usage.png` | approved-board derivative | 395×140 | `35733817193eb26d30cc06a834ec39311545f7cb8fc1c3c914dc48847a50856d` | +| `svif-monochrome-usage.png` | approved-board derivative | 385×140 | `b5e3f89c6874a216c06bc6a4bf4a0a67ec445db0f726187c2e94f3dab2a02449` | +| `svif-app-icon.png` | approved-board derivative | 160×155 | `11d156135d6b40313489772e03f4d20b2e67b10bb59cfee552d3aeefeef34b77` | +| `svif-social-card.png` | approved-board derivative | 395×210 | `cb78b5a2c94e61b29f50d8b303411a9e0a342e662395d1f576c8dc78340d31f3` | +| `svif-favicon-128.png` | favicon | 128×128 | `ef18af5dc8d8b5f777911437dc234f4d30a80044088514e724708499a8481685` | +| `svif-favicon-64.png` | favicon | 64×64 | `3645ec61b83c0cb2168f365b59902153eec74b5252b615eab06c92aa1ae76a97` | +| `svif-favicon-32.png` | favicon | 32×32 | `8698f84498e5cb61471e73f1fee1316b2892c5c9d1b46d283503da0594f2a2e2` | +| `svif-favicon-16.png` | favicon | 16×16 | `0f9f49ab937210fc6e73fc06b903429562ee1e26dba38b7af578cd617c5fb378` | + +## Materialized binary verification + +The following files are now committed directly under `brand/exports/` after byte-level Git blob verification: + +| Repository file | Git blob SHA-1 | SHA-256 status | +| --- | --- | --- | +| `brand/exports/svif-favicon-64.png` | `b396a8f9f36d3b59b69e16b650675e82d666e99e` | matches table above | +| `brand/exports/svif-favicon-32.png` | `791eb44f67e6e96d55a1126bdc2fdc23b18b5050` | matches table above | +| `brand/exports/svif-favicon-16.png` | `234044b5faf1be3a6862d5c8f8548757902bc69b` | matches table above | + +Git blob acceptance criterion is exact: the SHA returned by GitHub must equal the locally calculated Git object SHA for the byte sequence. A UTF-8 decoding failure when attempting to read a PNG blob as text is expected and is **not** evidence of blob corruption. + +## Semantics + +- Native raster dimensions are part of the master record. +- Do not label an enlarged raster export as a new native master. +- Do not substitute a regenerated S or a failed pure-vector approximation for these outputs. +- The black standalone wordmark / lockups and the teal light-background treatment are both intentional parts of the approved board; use the applicable asset for the surface. +- A future pure-vector master may supersede the raster master only after a new Principal-facing source-vs-vector fidelity review. + +## Repository-binary gate + +The Git binary path itself is proven for payloads that can traverse the current execution bridge intact. The current bridge truncates sufficiently long base64 tool arguments, so larger PNGs remain gated even though Git's blob API is binary-safe. Never attach a larger blob when its returned Git blob SHA differs from the locally expected Git blob SHA. diff --git a/brand/masters/candidates/svif-wordmark-trace-v0.1.svg b/brand/masters/candidates/svif-wordmark-trace-v0.1.svg new file mode 100644 index 0000000..a6bf40b --- /dev/null +++ b/brand/masters/candidates/svif-wordmark-trace-v0.1.svg @@ -0,0 +1,2 @@ + + diff --git a/brand/masters/svif-horizontal-lockup.png b/brand/masters/svif-horizontal-lockup.png new file mode 100644 index 0000000..e5b69d0 Binary files /dev/null and b/brand/masters/svif-horizontal-lockup.png differ diff --git a/brand/masters/svif-mark.png b/brand/masters/svif-mark.png new file mode 100644 index 0000000..d565a1a Binary files /dev/null and b/brand/masters/svif-mark.png differ diff --git a/brand/masters/svif-vertical-lockup.png b/brand/masters/svif-vertical-lockup.png new file mode 100644 index 0000000..c8aea1a Binary files /dev/null and b/brand/masters/svif-vertical-lockup.png differ diff --git a/brand/masters/svif-wordmark.png b/brand/masters/svif-wordmark.png new file mode 100644 index 0000000..67ce3a3 Binary files /dev/null and b/brand/masters/svif-wordmark.png differ diff --git a/brand/qa/FINAL-QA.md b/brand/qa/FINAL-QA.md new file mode 100644 index 0000000..41e989a --- /dev/null +++ b/brand/qa/FINAL-QA.md @@ -0,0 +1,31 @@ +# Svif final production QA + +Status: **13/13 production items assembled and reviewed locally; branch-local until integrated into authoritative `main`.** + +## Complete QA scope + +1. `svif-mark.png` — fidelity-first raster production mark. +2. `svif-wordmark.png` — approved standalone raster wordmark. +3. `svif-horizontal-lockup.png` — approved horizontal lockup. +4. `svif-vertical-lockup.png` — approved vertical lockup. +5. `svif-light-usage.png` — light-background derivative. +6. `svif-dark-usage.png` — dark-background derivative. +7. `svif-monochrome-usage.png` — monochrome derivative. +8. `svif-app-icon.png` — app-icon derivative. +9. `svif-favicon-128.png` — 128px favicon. +10. `svif-favicon-64.png` — 64px favicon. +11. `svif-favicon-32.png` — 32px favicon. +12. `svif-favicon-16.png` — 16px favicon. +13. `svif-social-card.png` — approved social-card composition. + +## QA evidence hashes + +- complete QA sheet: `svif-final-qa.png` +- SHA-256: `41606509a1ab49f4c48e2f8a0affbe966cdeee256f90a0d693a6c275dc9f6cb2` +- complete cross-brand delivery ZIP SHA-256: `171b974b62fabc9eb286104d6bc090563e381ac4fd4fb8d2157b6b3cceaad2c7` + +The larger raster masters and approved source board remain in the byte-preserving external delivery package until a binary-safe repository path can preserve them without truncation. The 64/32/16 favicon PNGs are already committed directly through Git binary blobs and verified by Git blob SHA. + +## Acceptance boundary + +This QA confirms package completeness against the locked Today 10:42 AM visual authority. It does not authorize a new vector reconstruction, generic `S`, typography substitution, particle simplification, palette reinterpretation, or any visual redesign. diff --git a/brand/reference/EXTRACTION-MANIFEST.md b/brand/reference/EXTRACTION-MANIFEST.md new file mode 100644 index 0000000..db24768 --- /dev/null +++ b/brand/reference/EXTRACTION-MANIFEST.md @@ -0,0 +1,38 @@ +# Svif approved-reference extraction manifest — 2026-09-03 + +Status: **branch-local production record**. The visual authority remains `brand/APPROVED-VISUAL-REFERENCE.md` and the Principal-approved Today 10:42 AM reference set. + +## Approved source + +- Original attachment: `63e7953b-4571-45fb-a233-303ec8325c78.png` +- Repository path: `brand/reference/svif-approved-reference.png` +- Dimensions: `1448 × 1086` +- SHA-256: `10ad09a3c68e7ccd84e8c50ac4aaeda2bdb1e1fee4c09899ef4215fdec18f3fd` +- Applicable context: **Svif-only** usage. + +Co-brand/family authority: + +- Original attachment: `1d00fb70-189b-4742-b4ac-c79be2668559.png` +- Repository path: `brand/reference/svif-agnir-family-approved-reference.png` +- Dimensions: `1448 × 1086` +- SHA-256: `4110d285243b6241ac709e750cca1815a10ca41e27c3bb15e6c94b56e57fa4fb` + +Both files were byte-exactly materialized and SHA-verified by GitHub Actions run `33730468886` before commit `137307351dfee467472ccd997fdc714b8a71c549`. + +## Production extraction map + +The active production builder uses the reviewed final crop/extraction coordinates defined in `brand/tools/build-production-assets.py`. Those coordinates and the expected native production output hashes are operationally frozen by `brand/masters/RASTER-MASTER-MANIFEST.md`; the committed production masters/exports are the byte-exact outputs of that approved path. + +The older crop experiments recorded during vectorization review are provenance only and must not override the production builder or raster-master manifest. + +## Production rule + +1. Rebuild only from `brand/reference/svif-approved-reference.png` or another byte-identical copy with the same locked SHA-256. +2. Do not substitute a regenerated image, generic `S`, different typeface, reconciled palette or redesigned particle field. +3. The approved board is raster visual authority; labels such as 512px/128px on the specimen board do not imply an independent higher-resolution native source. +4. No upscale may be represented as a genuine higher-resolution master. +5. Vectorization may supersede current raster masters only after a new clean source-vs-vector review and explicit Principal approval. + +## Binary-preservation status + +The former binary-preservation gate is **closed** for the brand branch. Both approved reference PNGs are repository-resident, and the complete raster production package is committed under `brand/masters/` and `brand/exports/` after source/destination SHA verification on the GitHub runner. diff --git a/brand/reference/svif-agnir-family-approved-reference.png b/brand/reference/svif-agnir-family-approved-reference.png new file mode 100644 index 0000000..bee7c71 Binary files /dev/null and b/brand/reference/svif-agnir-family-approved-reference.png differ diff --git a/brand/reference/svif-approved-reference.png b/brand/reference/svif-approved-reference.png new file mode 100644 index 0000000..32471dc Binary files /dev/null and b/brand/reference/svif-approved-reference.png differ diff --git a/brand/tools/build-production-assets.py b/brand/tools/build-production-assets.py new file mode 100644 index 0000000..679ac7b --- /dev/null +++ b/brand/tools/build-production-assets.py @@ -0,0 +1,137 @@ +#!/usr/bin/env python3 +"""Build fidelity-first Svif production assets from the locked 10:42 AM board. + +The approved Svif S depends on translucent ribbon layering and particle treatment. +Reviewed automatic/pure-vector reconstructions materially changed that appearance. +This builder therefore preserves the approved appearance as deterministic raster +masters and derivatives. It does not redesign or invent brand geometry. +""" +from __future__ import annotations +import argparse +import hashlib +import json +from pathlib import Path + +import numpy as np +from PIL import Image + +SOURCE_SHA256 = "10ad09a3c68e7ccd84e8c50ac4aaeda2bdb1e1fee4c09899ef4215fdec18f3fd" +CROPS = { + "mark": (48, 200, 340, 490), + "wordmark": (395, 255, 650, 410), + "horizontal-lockup": (704, 230, 1065, 430), + "vertical-lockup": (1122, 215, 1330, 430), + "light-usage": (40, 575, 418, 715), + "dark-usage": (470, 575, 865, 715), + "monochrome-usage": (965, 575, 1350, 715), + "app-icon": (28, 800, 188, 955), + "social-card": (545, 785, 940, 995), +} + + +def sha256(path: Path) -> str: + return hashlib.sha256(path.read_bytes()).hexdigest() + + +def white_to_alpha(image: Image.Image, noise_floor: float = 0.015) -> Image.Image: + rgb = np.asarray(image.convert("RGB"), dtype=np.float32) + alpha = np.max(255.0 - rgb, axis=2) / 255.0 + alpha = np.where(alpha < noise_floor, 0.0, alpha) + a = alpha[..., None] + foreground = np.zeros_like(rgb) + nonzero = alpha > 1e-6 + foreground[nonzero] = ( + rgb[nonzero] - 255.0 * (1.0 - a[nonzero]) + ) / a[nonzero] + foreground = np.clip(foreground, 0.0, 255.0) + rgba = np.dstack((foreground, alpha * 255.0)).astype(np.uint8) + rgba[rgba[..., 3] == 0, :3] = 0 + return Image.fromarray(rgba, "RGBA") + + +def square_fit(image: Image.Image, size: int, padding_fraction: float) -> Image.Image: + pad = round(size * padding_fraction) + available = max(1, size - 2 * pad) + scale = min(available / image.width, available / image.height) + new_size = ( + max(1, round(image.width * scale)), + max(1, round(image.height * scale)), + ) + resized = image.resize(new_size, Image.Resampling.LANCZOS) + canvas = Image.new("RGBA", (size, size), (0, 0, 0, 0)) + canvas.alpha_composite( + resized, + ((size - resized.width) // 2, (size - resized.height) // 2), + ) + return canvas + + +def main() -> None: + parser = argparse.ArgumentParser() + parser.add_argument("--board", type=Path, required=True) + parser.add_argument("--out", type=Path, required=True) + args = parser.parse_args() + + if sha256(args.board) != SOURCE_SHA256: + raise SystemExit("source board SHA-256 mismatch; refusing to derive assets") + + args.out.mkdir(parents=True, exist_ok=True) + board = Image.open(args.board).convert("RGB") + manifest = { + "source_board_sha256": SOURCE_SHA256, + "mode": "fidelity-first raster production", + "warning": "Raster masters preserve the approved appearance; do not claim infinite vector scalability.", + "assets": {}, + } + + for role in ("mark", "wordmark", "horizontal-lockup", "vertical-lockup"): + crop = board.crop(CROPS[role]) + rgba = white_to_alpha(crop) + if role == "mark": + # The approved board's specimen label slightly overlaps the crop's top edge. + # Remove only that presentation row; approved artwork starts below it. + data = np.array(rgba) + data[:18, :, :] = 0 + rgba = Image.fromarray(data, "RGBA") + target = args.out / f"svif-{role}.png" + rgba.save(target, optimize=True) + manifest["assets"][target.name] = { + "role": "raster-master", + "native_size": [rgba.width, rgba.height], + "sha256": sha256(target), + "crop": list(CROPS[role]), + "raster_derived_upscale": False, + } + + for role in ("light-usage", "dark-usage", "monochrome-usage", "app-icon", "social-card"): + image = board.crop(CROPS[role]) + target = args.out / f"svif-{role}.png" + image.save(target, optimize=True) + manifest["assets"][target.name] = { + "role": "approved-board-derivative", + "native_size": [image.width, image.height], + "sha256": sha256(target), + "crop": list(CROPS[role]), + "raster_derived_upscale": False, + } + + mark = Image.open(args.out / "svif-mark.png").convert("RGBA") + for size in (128, 64, 32, 16): + icon = square_fit(mark, size, 0.08 if size >= 64 else 0.05) + target = args.out / f"svif-favicon-{size}.png" + icon.save(target, optimize=True) + manifest["assets"][target.name] = { + "role": "favicon", + "size": size, + "sha256": sha256(target), + "raster_derived_upscale": size > max(mark.size), + } + + (args.out / "manifest.json").write_text( + json.dumps(manifest, ensure_ascii=False, indent=2) + "\n", + encoding="utf-8", + ) + + +if __name__ == "__main__": + main() diff --git a/brand/tools/derive-raster-assets.py b/brand/tools/derive-raster-assets.py new file mode 100644 index 0000000..bd78a92 --- /dev/null +++ b/brand/tools/derive-raster-assets.py @@ -0,0 +1,131 @@ +#!/usr/bin/env python3 +"""Derive fidelity-preserving raster brand assets from approved white-background crops. + +This tool does not redesign, vectorize, or invent brand geometry. It removes the +white presentation background by solving a simple white-matte compositing model, +then emits transparent PNGs and square icon derivatives with a SHA-256 manifest. + +Upscaled outputs are explicitly marked as raster-derived upscales in the manifest. +""" + +from __future__ import annotations + +import argparse +import hashlib +import json +from pathlib import Path + +import numpy as np +from PIL import Image + +ROLES = ("primary-mark", "wordmark", "horizontal-lockup", "vertical-lockup") +ICON_SIZES = (512, 256, 128, 64, 32, 16) + + +def sha256(path: Path) -> str: + return hashlib.sha256(path.read_bytes()).hexdigest() + + +def white_to_alpha(image: Image.Image, noise_floor: float = 0.015) -> Image.Image: + """Recover an RGBA approximation from artwork composited over white. + + Alpha is inferred from the maximum RGB deficit from white; RGB is then + un-premultiplied against white. This is intended for the locked brand crops, + whose marks/wordmarks are rendered on white. It must not be used as a generic + background-removal algorithm for arbitrary images. + """ + + rgb = np.asarray(image.convert("RGB"), dtype=np.float32) + deficit = 255.0 - rgb + alpha = np.max(deficit, axis=2) / 255.0 + alpha = np.where(alpha < noise_floor, 0.0, alpha) + + a = alpha[..., None] + foreground = np.zeros_like(rgb) + nonzero = alpha > 1e-6 + foreground[nonzero] = ( + rgb[nonzero] - 255.0 * (1.0 - a[nonzero]) + ) / a[nonzero] + foreground = np.clip(foreground, 0.0, 255.0) + + rgba = np.dstack((foreground, alpha * 255.0)).astype(np.uint8) + return Image.fromarray(rgba, "RGBA") + + +def square_fit(image: Image.Image, size: int, padding_fraction: float) -> Image.Image: + pad = round(size * padding_fraction) + available = max(1, size - 2 * pad) + scale = min(available / image.width, available / image.height) + new_size = ( + max(1, round(image.width * scale)), + max(1, round(image.height * scale)), + ) + resized = image.resize(new_size, Image.Resampling.LANCZOS) + canvas = Image.new("RGBA", (size, size), (0, 0, 0, 0)) + canvas.alpha_composite( + resized, + ((size - resized.width) // 2, (size - resized.height) // 2), + ) + return canvas + + +def main() -> None: + parser = argparse.ArgumentParser() + parser.add_argument("--source-dir", type=Path, required=True) + parser.add_argument("--out-dir", type=Path, required=True) + parser.add_argument("--brand", required=True) + args = parser.parse_args() + + args.out_dir.mkdir(parents=True, exist_ok=True) + manifest = { + "brand": args.brand, + "derivation": "approved white-background raster crop -> transparent raster derivative", + "warning": "Raster derivatives are not vector masters. Upscaled outputs are explicitly flagged.", + "assets": {}, + } + + primary_native_max = None + primary_rgba = None + + for role in ROLES: + source = args.source_dir / f"{role}.png" + if not source.exists(): + raise SystemExit(f"missing required crop: {source}") + source_image = Image.open(source) + rgba = white_to_alpha(source_image) + target = args.out_dir / f"{role}-transparent.png" + rgba.save(target, optimize=True) + manifest["assets"][target.name] = { + "source": source.name, + "width": rgba.width, + "height": rgba.height, + "sha256": sha256(target), + "raster_derived_upscale": False, + } + if role == "primary-mark": + primary_rgba = rgba + primary_native_max = max(rgba.width, rgba.height) + + assert primary_rgba is not None and primary_native_max is not None + + for size in ICON_SIZES: + padding = 0.08 if size >= 64 else 0.05 + icon = square_fit(primary_rgba, size, padding) + target = args.out_dir / f"icon-{size}.png" + icon.save(target, optimize=True) + manifest["assets"][target.name] = { + "source": "primary-mark-transparent.png", + "width": size, + "height": size, + "sha256": sha256(target), + "raster_derived_upscale": size > primary_native_max, + } + + (args.out_dir / "manifest.json").write_text( + json.dumps(manifest, ensure_ascii=False, indent=2) + "\n", + encoding="utf-8", + ) + + +if __name__ == "__main__": + main()