# Landometer Design System v0.9.7

**Normative · Standalone · Human + Machine**

เอกสารฉบับนี้รวมข้อกำหนดปัจจุบันของ Landometer Design System 0.9.7 ไว้ในไฟล์เดียว ทั้งเนื้อหาสำหรับคน กฎสำหรับเครื่อง token และตารางสีจริง ใช้อัปโหลดเป็น Project Source ได้โดยไม่ต้องอ่าน master รุ่นก่อนหรือประกอบ patch เพิ่ม โครงสร้าง Brand, Visual foundations, Navigation, Actions, Motion, Evidence, Output formats และ QA สืบต่อจาก master เดิม โดยปรับข้อกำหนดที่เปลี่ยนไว้ในหัวข้อของมันแล้ว

| Identity | Exact value |
|---|---|
| DS version | `0.9.7` |
| Document ID | `lds-0.9.7-landometer-standalone-r1` |
| Release | `v0.9.7-owner.1` |
| Standalone document | `standalone-0.9.7-r1` |
| Color set | `color-srgb-10` |
| Categorical registry | `landometer-series-10-v8` |
| Approval | Owner-approved 1 October 2026 |
| Signature | Unsigned owner distribution; no cryptographic 0.9.7 release attestation |

เริ่มงาน: เลือกขอบเขต portfolio/product → บันทึก Build Card ตาม §2 → ใช้กฎของ format และ capability ที่มีจริง → อ่านค่าจาก machine payload ในไฟล์นี้ → ตรวจงานที่ส่งจริงตาม §14 และ §19. Brand voice, protected wording, official identity, typography, foundations และ atmosphere ทั้งเจ็ดสูตรยังอยู่ครบ งานที่ล็อกรุ่นเก่าไว้อย่างชัดเจนคงใช้รุ่นนั้นจนได้รับอนุญาตให้ย้าย

คำว่า `machine.*` ในเอกสารนี้อ้างถึง JSON payload ตอนท้าย **ของไฟล์เดียวกัน** ไม่ใช่ไฟล์ที่ต้องอัปโหลดเพิ่ม Schema references resolve ด้วย `$id` ที่อยู่ใน `machine.schemas`; immutable schema ID อาจสะท้อนรุ่นที่สร้าง schema นั้น โดยไม่ได้เปลี่ยน DS release ของงาน โลโก้ ฟอนต์ ไอคอน และ runtime เป็น binary/code assets: ใช้ URL, role และ SHA-256 จาก `machine.assetFiles` เพื่อรับ bytes จริงเมื่อผลิตงาน ห้ามสร้างภาพหรือฟอนต์แทนจากคำอธิบาย

ชื่อ `*.schema.json` ในหัวข้อต่อไปนี้หมายถึง schema ที่รวมอยู่ใน `machine.schemas` โดยตรง ชื่อ `*.example.json` หรือ reference-example ที่กล่าวถึงเป็น optional learning references: ไม่เป็นข้อกำหนดให้โหลดไฟล์เก่า ไม่เป็น evidence/approval และไม่จำเป็นต่อการสร้าง record จาก embedded schema งานจริงต้องใช้ค่ากับหลักฐานของงานนั้นเอง

เมื่อเครื่องมืออ่าน Source คืนข้อความเพียงบางส่วน ให้ค้นต่อด้วย stable rule ID ของข้อกำหนด หรือ `scaleId` + `theme` และ field path ที่ต้องใช้ เช่น `machine.analyticalScales.scales` → `density.capita` / `dark` → `classes["7"]`. ตรวจค่าจากผลค้นที่อ่านได้จริงและอ้างตำแหน่งนั้น; ห้ามอ้างว่าอ่านครบทั้งไฟล์จากผลที่ถูกตัด หรือเดาค่าในส่วนที่เครื่องมือยังไม่คืนมา

---

## 0. Release Card และข้อกำหนดของ v0.9.7

### 0.1 Release tuple เดียว

`machine.release` เป็น source ของ release identity; `machine.document` ระบุ identity และ provenance ของเอกสาร standalone นี้ กฎและค่าในหัวข้อปัจจุบัน resolve ไปยัง payload ที่รวมไว้แล้ว ผู้ใช้ไม่ต้องจัดลำดับ master กับ addendum เอง

| Registry | Identifier | Current contract |
|---|---|---|
| Color | `color-srgb-10` | exact approved per-theme LUTs, warm density families, current dark categorical values |
| Motion | `motion-riddim-approach-03` | approach timing + identity lifecycle + six motifs and measured carriers |
| Icon | `icon-rounded-outline-01` | interface icons; identity icon sets remain separate |
| Typography | `type-script-aware-02` | approved script-aware fonts and role scales |
| Layout | `layout-cross-format-01` | responsive/format composition and owner-selected visual constraints |

**RELEASE-01 — Release identifiers have one source.** Release, schema, set, kit และ package identifiers MUST resolve จาก `machine.release` และ embedded contracts; published identities are immutable. Canonical schema `$id` MUST include the schema version and MUST NOT be reused for an incompatible contract. Generated artifacts MUST NOT contain conflicting current release identifiers. This document uses DS `0.9.7`, release `v0.9.7-owner.1`, color set `color-srgb-10` and document `standalone-0.9.7-r1`; document consolidation does not relabel historical signed subjects.

Acceptance:

- RELEASE-01-A — automated: human master, embedded catalog/contracts, current tokens and artifact binding resolve the same release; unchanged schema `$id` identities remain exact and locally resolvable in the embedded schema collection
- RELEASE-01-B — manual: provenance/change record identifies each consolidated rule, schema or value projection and its migration effect without claiming an unperformed approval or signature

**GOV-01 — Release state is truthful and audience-bounded.** Artifact manifests, receipts and sidecars MUST bind exact `releaseRef` and a canonical tuple hash derived from the active contract. `machine.release` records owner-approved status, approver, date and unsigned signature status. Approval does not certify every artifact or activate every account. Internal approval workflow, rule/schema identifiers and package state MUST NOT appear on an ordinary audience-facing product surface. A DS-reference or provenance document MAY show only the identifiers/facts necessary for that purpose under its recorded disclosure authority; unresolved dependencies, debug details, placeholders and local/source paths remain prohibited on audience-facing output.

Acceptance:

- GOV-01-A — automated: release binding resolves `v0.9.7-owner.1`, owner/date, color set and `signedRelease: false`; artifact tuple/hash resolves that exact release, without inherited or fabricated 0.9.7 signing claims
- GOV-01-B — manual: ordinary audience-facing surfaces contain no internal approval workflow or irrelevant machine identifiers; DS/provenance disclosure stays within its declared purpose and actual evidence

### 0.2 Version policy

| Identifier | เปลี่ยนเมื่อ |
|---|---|
| DS version | normative behavior, requirement, acceptance gate, profile หรือ format contract เปลี่ยน |
| Document revision | consolidation/editorial/provenance packaging เปลี่ยนโดยไม่เปลี่ยน approved normative meaning |
| Schema version | field, enum, structure หรือ validation semantics เปลี่ยน |
| Set ID | ค่า หรือ semantic ownership ภายใน set เปลี่ยน |
| Machine package | generated package, validator, schema projection หรือ packaging เปลี่ยน |
| Artifact build | implementation ของงานหนึ่ง build เปลี่ยน |
| Product content/data release | product-owned evidence หรือ content เปลี่ยน แยกจาก DS |

Retained identity clarification from LDS 0.9.5: Revision r3 explicitly records the owner’s 30 September 2026 clarification: wordmark colour is flexible, including per-letter colours; gray is optional; the official logo is permitted on readable light and dark backgrounds. It corrects the inherited blanket recolour wording and prevents motif carrier restrictions from being misapplied to official logos. This is an owner-directed policy clarification, not an editorial-only or cryptographically signed change; DS 0.9.5, its approved colour sets, original assets and unchanged schema identities remain in place.

Normative change MUST NOT hide in an editorial revision. `latest` is a discovery convenience, never a receipt identity. Preserve exact published source bytes and their signatures; historical signatures apply only to their original subjects. Package integrity, final-artifact quality and account/team activation are distinct evidence.

### 0.3 One-file reading and source provenance

Read current rules in their normal chapters. The machine block contains current policies, the stable rule catalog, tokens, exact 41-stop LUTs, format/component/motif contracts and schema resources. Historical source hashes and the deterministic consolidation record are provenance in Appendix A, not extra reading or installation dependencies. The complete shared foundation is `Landometer-Design-System-v0.9.7.md`; it needs no earlier LDS master or overlay. For product-scoped work, load this same complete LDS foundation plus the separate current product Add-on. An Add-on contains product-specific rules and depends on the shared foundation; it does not duplicate or replace the complete LDS. Product facts, identity assets and permissions remain product-owned under LAYER-01. For new work adopting 0.9.7, replace earlier LDS Project Source normative/overlay copies with this complete file and the applicable separate 0.9.7-bound Add-on. Keep business evidence and explicitly pinned historical work. Do not load 0.9.6, 0.9.5 or 0.9.4 as extra design authorities for a 0.9.7 artifact.

## 1. วิธีอ่านและบังคับใช้

### 1.1 Normative vocabulary

| Term | ผลบังคับ |
|---|---|
| MUST / MUST NOT | required/prohibited; failure blocks conformance และ release |
| SHOULD / SHOULD NOT | recommendation ที่ควรทำเมื่อเหมาะกับบริบท; การไม่ทำไม่ทำให้ conformance fail แต่ MUST บันทึกเหตุผลเมื่อ rule ขอ decision record |
| MAY | optional; ห้ามใช้สิ่งที่ไม่มีจริงมา claim capability |

เอกสารนี้เป็น **Normative** ทั้งฉบับโดย default ข้อความ imperative จึงเป็น MUST ภายใน scope ของย่อหน้าหรือ rule block นั้น เว้นแต่ clause ใช้คำ MAY/SHOULD โดยตรง หรือติดป้าย **Reference, Example, Candidate** หรือ **Historical** อย่างชัดเจน Section 16 ทั้ง section เป็น **Example — non-normative**: ใช้เพื่อเรียนรู้เท่านั้น ไม่สร้าง requirement, default, acceptance criterion หรือสิทธิ์ยกเว้นใหม่

### 1.2 ป้ายสถานะของเนื้อหา

- **Normative** — บังคับทุก artifact ที่เข้าเงื่อนไข
- **Conditional normative** — บังคับเมื่อ profile/capability/format trigger ถูก resolve
- **Reference** — อธิบายเหตุผลหรือแนวทาง ไม่มีสิทธิ์ override rule
- **Example** — ต้องแทน content, claim, evidence และ asset ด้วยของที่ approved จริง
- **Candidate** — ทดลองได้ใน sandbox แต่ claim conformance ไม่ได้
- **Historical** — ใช้ migration/audit เท่านั้น

### 1.3 Authority ไม่ใช่ลำดับแบนเดียว

อำนาจต้อง resolve ตาม domain:

| Domain | Authority |
|---|---|
| portfolio identity, protected wording, shared architecture | owner-approved Landometer portfolio truth |
| product fact, capability, audience, evidence, permission | approved product truth และ evidence release ของ product นั้น |
| visual, interaction, accessibility, format equivalence | effective DS release และ triggered packs |
| artifact intent, audience, one job, delivery | approved Build Card ภายในขอบเขตด้านบน |
| experiment/example | ไม่มีสิทธิ์ override; ต้องขอ promote อย่างชัดเจน |

**AUTHORITY-01 — Resolve authority before design.** Build Card MUST ระบุ content sources, claim owner, evidence boundary และ applicable release ก่อนเริ่ม composition; example/proposal MUST NOT override approved truth เงียบ ๆ

ข้อความที่ติดป้าย Example/Reference/Candidate/Historical MUST NOT ถูกคัดลอกไปใช้เป็น authority หากขัดกับ numbered rule block, `machine.ruleCatalog` หรือ approved product/portfolio truth ให้ใช้ authority เหล่านั้นและแก้ตัวอย่าง ไม่ตีความตัวอย่างเป็นข้อยกเว้น

Acceptance:

- AUTHORITY-01-A — automated: required authority fields มีค่าและ resolve ได้
- AUTHORITY-01-B — manual: conflict ถูกตัดสินตาม domain authority และมี record
- AUTHORITY-01-C — automated: pre-generation plan records authority, product scope, job, object, AHA, actions, format, capabilities, claims, assets, assumptions, blockers and QA without invented approval/evidence

**LAYER-01 — Keep shared and product-specific layers separate.** Shared Landometer language MUST product-neutral across Land, Location และ Living ส่วน named-product fact, audience, sector, data และ permission MUST อยู่ใน product-specific layer

Acceptance:

- LAYER-01-A — manual: capability และ claim ทุกอันติดป้าย shared หรือ named product
- LAYER-01-B — manual: ไม่มี municipality, retail, F&B, ijji หรือ CityWiki example ถูกเหมารวมเป็น portfolio truth โดยไร้ approval

**COMPARE-01 — Comparisons disclose compatibility.** การเปรียบเทียบข้าม product หรือ city MUST ใช้ schema และ compatible release เดียวกัน มิฉะนั้น MUST แสดง incompatibility ก่อนผู้อ่านตีความ

Acceptance:

- COMPARE-01-A — automated: compared series ทุกชุดมี schemaRelease
- COMPARE-01-B — manual: mismatch แสดงข้าง comparison และใน machine record

### 1.4 ทางลัดตามงาน

| ถ้ากำลังจะ… | เริ่มที่ | แล้ว resolve |
|---|---|---|
| วางโครงงานใหม่ | §2 Build Card | experience profile + format pack + capability config refs |
| เขียน portfolio/methodology/product story | §3–4 | authority, product boundary, claim records, protected role |
| ออกแบบหน้า/แอป | §5–9 | target profile, navbar/bookmark, CTA, states, motion benefit |
| ทำ SEO/AI/agent discoverability | §10 | discovery + readability + action แยกผลและ receipt |
| แปลง web เป็น document/PDF/deck/social | §11 | semantic equivalence, target profile และ format implementation controls |
| ให้ AI วางแผนหรือ QC | §12–14 | rule catalog, schemas, validator และ final-artifact receipts |
| ย้ายงานจากรุ่นเดิม | §15 | ใช้ข้อกำหนดที่รวมแล้วในฉบับนี้; lineage เป็นหลักฐานประวัติ ไม่ใช่ไฟล์ที่ต้องอัปโหลดเพิ่ม |

| ทำงานตามบทบาท (AI/agent, dev, designer, product, marketing, sales, ผู้อ่านทั่วไป) | §20 | ทางเริ่มตามบทบาทและ embedded records ที่ต้องใช้ในไฟล์นี้ |
| วาง motif หรือโลโก้ขยับ | §8.5–8.6 | MotifFrame + MotionController, job จาก manifest, สามจังหวะ, joy budget ≤ 3 ต่อเส้นทาง, product overlay register |

คำย่อที่ใช้บ่อย: **Build Card** คือ intent/authority input; **format pack** คือข้อกำหนดตามสื่อ; **target profile** คือ geometry/หน่วย/fixture; **capability pack** คือกฎที่เปิดเมื่อมี feature จริง; **receipt** คือหลักฐานผลตรวจที่ลงวันที่ ไม่ใช่ข้อความว่า “ผ่าน” เฉย ๆ

---

## 2. Build Contract: จากเจตนาไปสู่ artifact

### 2.1 Resolution pipeline

ทุกงาน production ใช้เส้นทางเดียว:

**Approved truth → Build Card → one primary format pack → triggered capabilities → rules/tokens/components → QA receipts → immutable artifact manifest**

ผู้สร้างกรอก intent และ authority AI/resolver คำนวณ derived rule list, set IDs และ test matrix ผู้สร้าง MUST NOT เลือกตัด rule ที่ไม่สะดวกออกเอง

### 2.2 Build Card minimum

Build Card schema ฉบับเต็มอยู่ใน `machine.schemas["build-card.schema.json"]`; สร้าง record ของงานจาก schema ที่รวมไว้แล้ว Example fixture เมื่อมีเป็น optional reference เท่านั้นและไม่ใช่ product evidence ค่า `schemaVersion`, version-qualified schema ID และ hash MUST resolve จาก `machine.release`, embedded active schema และ bytes ของ binding ปัจจุบัน ไม่ใช่คัดจาก prose หรือ historical fixture

| Field group | Human orientation; machine schema remains exact |
|---|---|
| release + artifact | exact release binding, artifact identity, owner, portfolio/product scope และ one primary job |
| authority | content source, claim/evidence owner, evidence boundary และ shared-vs-named-product boundary |
| experience + locale | audience, entry question, desired outcome, dominant object, first AHA/evidence, primary/next action, resolvable typed reading-order refs, primary locale และ locale states |
| output + composition | one format profile, selected target profile, delivery mode, ordered sections/anchors, exact `componentIds` inventory, headline role, density และ side-bookmark eligibility |
| identity + navigation + actions | exactly one approved `identityImplementation` + exact typography binding; typed destination IDs/roles, `brandDestinationRef`, level/kind/group/breakpoint exposure/current state/control budgets, selected/omitted bookmark contract; one locale-complete `destinationBinding` per action with governed kind and format presentation; labels/outcomes; availability, permission, orthogonal consequence, confirmation และ typed progress/result/recovery/receipt contracts |
| motion | explicit `motionDecision`; every assignment binds a real subject, proposal role, user benefit, final-state fallback, reduced-motion behavior และ deep-link/focus protection; browser assignment bind observer-failure behavior ส่วน native assignment bind interruption/final-state behavior ตาม runtime ที่เลือก |
| capabilities | declared capability IDs exactly match hash-bound `{ref, sha256, schemaRef}` configs that validate against the governed capability contract and selected format |
| publication + claims | canonical/locale/social/structured/crawler bindings for public web; all three universal layer requirements; claim manifest ref/hash/as-of chain; public/indexing state |
| assets | artifact-owned registry bindings and exact role/surface/rights/approval/hash records; empty only when the artifact truly uses no governed asset |
| audience output | `resolved_only`, declared audience/purpose, hidden internal governance, zero blocking dependencies/placeholders และ proximal locale-complete material limitations |
| QA | nonempty automated/manual/production plans, resolver-derived test IDs, criterion-bound evidence, required accessibility fixtures/receipts, and exact empty exception list |

ถ้าไม่มีสมมติฐานที่ต้องควบคุม ให้ใช้ exact empty state `assumptions: []` ถ้ามี ทุกรายการ MUST มี stable ID, statement, impact domain, status และ rationale ตาม active schema; unresolved blocker ต้องปรากฏใน audience-output blocker refs และสมมติฐานที่กระทบ truth, identity, rights, accessibility, locale completeness, primary action หรือ evidence interpretation ห้ามถูกจัดเป็น non-blocking

ทุก hash หมายถึง bytes จริงของ artifact bundle ปัจจุบัน และทุก version/schema identity ต้องมาจาก `machine.release` + active schema เท่านั้น ชื่อไฟล์ `example` ไม่ให้สถานะ pass; validator และ receipt ของ bytes จริงเท่านั้นที่ให้สถานะได้

### 2.3 Common design contract

ทุก artifact MUST กำหนด:

1. one job — งานหลักหนึ่งอย่างที่ผู้ใช้ควรทำสำเร็จ
2. dominant object — สิ่งหลักที่กำลังมอง/อ่าน/ตัดสิน
3. first AHA — ความเข้าใจแรกที่ต้องเกิด พร้อม evidence cue
4. primary action — การกระทำสำคัญหนึ่งอย่าง พร้อม outcome จริง
5. next useful action — ก้าวถัดไปที่ช่วยผู้ใช้ ไม่ใช่ conversion บังคับ
6. clean completion — ผู้ใช้รู้ว่าทำสำเร็จหรือจบการอ่านแล้วอย่างไร
7. evidence boundary — สิ่งที่รู้, ไม่รู้, ประมาณ, หมดอายุ หรือ product-specific
8. audience output — declare `deliveryAudience`, ใช้ `disclosurePurpose: ordinary_experience` เป็น default และ bind disclosure authority เมื่อเลือก nonordinary purpose; unresolved dependency อยู่ได้เฉพาะ internal preview record ส่วนงานที่ส่งให้คนใช้มีเฉพาะ resolved meaning และ material limitation ที่เขียนให้เข้าใจ
9. immutable bundle bindings — ทุก capability config ใช้ `{ref, sha256, schemaRef}`; `publication` bind claim manifest ด้วย ref + hash และ `assetRegistries` bind registry ของ artifact ด้วย `{registryRef, sha256, schemaRef}` แม้ fixture ที่ไม่มี governed asset จะใช้ array ว่าง

หนึ่ง screen/scene MUST มี primary reading path เดียว แต่ MAY มี supporting paths ที่ hierarchy ต่ำกว่า ไม่ออกแบบด้วยการกระจาย component เท่ากันทั่วหน้า `experience.readingOrder[]` MUST เป็น typed refs `{kind: section | action | component, ref}` และทุก ref ต้อง resolve exactly once ไป `composition.sections[].id`, `actions[].id` หรือ `composition.componentIds[]` ตาม kind ลำดับที่ derive ไป `accessibilityProjection.readingOrder` MUST ตรงกันพอดี; free-text label ที่ไม่ resolve ห้ามใช้แทน reading order

### 2.4 Conformance levels

| Level | ความหมาย |
|---|---|
| authoring_aligned | Build Card และ source records resolve แต่ยังไม่ตรวจ final output |
| package_validated | machine package integrity ผ่าน; ไม่เท่ากับ artifact QA |
| artifact_qa_passed | automated + required human/visual/interaction checks ของ final artifact ผ่าน |
| production_verified | deployed/distributed bytes และ real route/device/export checks ผ่าน |

คำว่า machine validation MUST NOT ใช้รวม package integrity กับ artifact quality Conformance computed จาก receipts; ผู้สร้างเลื่อน level ด้วยมือไม่ได้ Receipt ทุกใบ MUST เป็น bundle-local object ที่ bind subject และ bytes ด้วย SHA-256 Manifest layer/gate result ที่เป็น `pass` MUST bind receipt + hash ตั้งแต่ `artifact_qa_passed` ขึ้นไป และทั้งสาม universal layers MUST เป็น `pass`; กฎที่ไม่ใช้ระบุด้วย `resolution.nonApplicableRuleIds` ไม่ใช้ layer/gate result receipt ของ OUTPUT-CLARITY-01-A MUST cover `delivery.files` และ hash ทุกรายการเป็น exact set พร้อม cite evidence ของ `delivery.contentInspections[]` ครบทุกไฟล์; เมื่ออ้าง `production_verified` receipt ของ OUTPUT-CLARITY-01-B MUST cover exact set, hashes และ inspection evidence ชุดเดียวกัน โดยไม่มีตกหล่นหรือเพิ่มไฟล์นอก manifest

---

## 3. Core contract: Truth before treatment

### 3.0 First useful value

**AHA-01 — First useful value precedes nonessential gates.** First useful proof, understanding หรือ task value MUST มาก่อน nonessential registration, personal-data collection, permission request, sharing prompt หรือ promotional interruption ถ้า prerequisite จำเป็นจริง ต้องอธิบายเหตุผล ขอ minimum และมี denial-safe/read-only alternative เมื่อ feasible

Acceptance:

- AHA-01-A — automated: Build Card ระบุ first AHA, evidence cue และ prerequisite ทุกอันก่อน AHA
- AHA-01-B — interaction: first-run, denied-permission, unauthenticated และ no-sharing fixtures ยังให้ earliest feasible value + safe next path

### 3.1 Evidence และ certainty

**EVIDENCE-01 — Claims retain evidence boundaries.** Material factual claim ทุกอัน MUST resolve stable claim record ที่มี scope, source, method, time basis, status และ owner Limitation หรือ uncertainty ที่มีผลต่อการตีความ MUST มองเห็นใกล้ claim ในภาษาของผู้ใช้ ส่วน missing evidence ที่ทำให้ claim ไม่ปลอดภัยต้อง block claim/output ไม่ใช่กลายเป็นข้อความแก้ตัว

Acceptance:

- EVIDENCE-01-A — automated: displayed material claimId resolve record เดียวที่มี required fields
- EVIDENCE-01-B — manual: wording ไม่เกิน scope/certainty ของ evidence

Observation, interpretation, recommendation และ commitment MUST แยก label กัน เส้น, สี, animation, copy หรือ structured data ห้ามทำให้ estimate ดูเหมือน measured fact และ missing data ห้ามแสดงเป็น zero — ค่าทุกช่องต้องถือหนึ่งในหกสถานะของ EVID-05 ด้านล่าง

**EVID-05 — Zero is a fact; missing is a question.** Every governed value cell, map unit and machine field carries one of six states: `measured`, `measured_zero`, `no_data`, `out_of_scope`, `suppressed`, `not_yet`. `measured` carries a finite nonzero number; `measured_zero` carries numeric `0`; the four exceptional states carry `null`. Do not collapse missing, suppression or scope into zero. Suppressed underlying values MUST NOT leak through HTML attributes, JSON or hidden exports. Agents receive the explicit state with every governed numeric/null value.

| State | ป้ายไทย · English | Machine value | Visible / map treatment | Required context |
|---|---|---|---|---|
| `measured` | ค่าที่วัดได้ · Measured | finite nonzero number | exact value + unit; approved analytical class | unit, source, time, scope, denominator when relevant |
| `measured_zero` | ศูนย์ (สำรวจแล้ว) · Zero (measured) | `0` | numeral 0 + unit; lowest-class fill + `dataState.zero` outline 2px | unit, survey completeness |
| `no_data` | ไม่มีข้อมูล · No data | `null` | — + short reason; 135° hatch + `border.emphasis`; sort last | reason, latest available value when there is one |
| `out_of_scope` | นอกขอบเขตข้อมูล · Out of scope | `null` | scope text; bare basemap, no fill/hatch | scope statement |
| `suppressed` | ปิดค่า · Suppressed | `null` | `‹n` + threshold; `surface.soft` + dashed `border.emphasis` | threshold, aggregation level permitting disclosure |
| `not_yet` | ยังไม่ถึงรอบข้อมูล · Not yet available | `null` | … + expected date; pending surface + dotted pending ink | expected date, source cycle |

The exact typed contract is `machine.schemas["evidence-value.schema.json"]`; values/cues are in `machine.tokens.dataState.valueStates`. Labels use `text.metadata`, never disabled-hint `text.muted`, and must reach 4.5:1 on the actual label surface. Do not place labels directly over the no-data hatch; put them in a readable legend/table/caption. "N/A", a bare dash without explanation and rendering missing as 0 are prohibited. EvidenceCard's nonzero `data-value` must equal the exact visible number.

Sentences retain claim context: TH “ปี 2568 ไม่พบโรงงานใหม่ในตำบลนี้ (0 แห่ง)” / “ยังไม่มีข้อมูลปี 2568 — ล่าสุดคือปี 2567”; EN “No new factories were registered here in 2025 (0).” / “No 2025 figure — latest available is 2024.” These are examples, not product evidence.

Acceptance:

- EVID-05-A — automated: every governed value has exactly one of six states and the corresponding finite nonzero/zero/null type; no suppressed value appears in delivered bytes; no unlabelled N/A, bare dash or missing-as-zero; EvidenceCard visible/machine values agree and DataTable/MapLegend bindings resolve the same state contract
- EVID-05-B — visual: measured, zero and four exceptional states remain distinguishable through text, pattern, outline and labels in light, dark, print and static export; labels use `text.metadata` and pass 4.5:1 on their actual surface
- EVID-05-C — manual: visible copy communicates the state, reason and latest value or expected date when applicable in the user's language, with specific context instead of a generic disclaimer

**EvidenceCard** เป็น component ใหม่สำหรับฝังในคำตอบของ AI เจ้าอื่นและ link preview ที่ต้องพิสูจน์ที่มา: เส้นสี่สี 3px · TrustBadge · ค่า + หน่วย + state · dataset · source · date · boundary · limitation · measure line 3 × 3px · URL ถาวร · เลขใบรับ ไม่มีโลโก้ แผง หรือ gradient และมี text-only fallback หนึ่งบรรทัด สัญญาเต็มอยู่ใน `machine.contracts.componentContracts#component.evidence-card.01` ป้ายหลักฐานบนการ์ดใช้ชุดของ Master Brand Brief v0.5.3 §3.7 (Observed fact · Benchmark interpretation · Owner-stated · Inference · Hypothesis · Project evidence) ไม่ใช่ป้ายที่คิดขึ้นใหม่

### 3.2 Resolved-only audience output

**OUTPUT-CLARITY-01 — Ship resolved audience meaning, not workflow residue.** Public, client-facing หรือ production output MUST มีเฉพาะสิ่งที่ผู้ใช้ต้องใช้เพื่อเข้าใจ ตัดสินใจ หรือทำงานต่อ ได้แก่ content, state, ข้อจำกัดจริง และ action ที่พร้อมใช้ คำว่า `workflow residue` ใน machine contract หมายถึงข้อความเกี่ยวกับขั้นตอนทำงานภายใน เช่น รออนุมัติ, ยังไม่ตรวจ, schema/rule/package ID, local/source path, debug/validator text, TODO/TBD/FIXME และ placeholder สิ่งเหล่านี้ MUST อยู่ใน internal record เท่านั้นและ MUST NOT ปรากฏในงานที่ส่งให้ผู้ใช้

ถ้าข้อมูลหรือสิทธิ์ที่ยังขาดอาจเปลี่ยนความจริง, identity, rights, accessibility, ความครบของภาษา, primary action หรือการตีความ evidence งานนั้น MUST หยุดส่งและอยู่เป็น internal preview จนแก้เสร็จ ห้ามส่งข้อความเกี่ยวกับการผลิตงาน เช่น “ยังไม่ยืนยันเพื่อเผยแพร่” หรือ “รอข้อมูลจากทีม” เพื่อให้ผู้ใช้รับภาระแทนทีม ข้อจำกัดจริงที่ผู้ใช้ต้องรู้—เช่นช่วงเวลาข้อมูล, พื้นที่ครอบคลุม หรือสิ่งที่ข้อมูลนี้ใช้สรุปไม่ได้—ยัง MUST แสดงใกล้ claim/action ที่เกี่ยวข้อง ด้วยภาษาตรงเรื่องและบอกผลต่อการตัดสินใจ ห้ามใช้ disclaimer รวมกว้าง ๆ หรือคำเตือนหลายชั้นแทนคำอธิบายเฉพาะเรื่อง

`audienceOutput.disclosurePurpose: ordinary_experience` เป็น default สำหรับ output ที่คนใช้ตามปกติ Purpose แบบ nonordinary ได้แก่ `design_system_reference` และ `provenance_record` เท่านั้น และ MUST bind `disclosureAuthorityRef` กับ `disclosureAuthoritySha256` คู่กัน Authority ต้องอยู่ใน bundle, hash-bound และเปิดได้เฉพาะ field class ที่ schema อนุญาต: DS reference ใช้ `release_identifiers | schema_examples`; provenance record ใช้ `provenance_facts | approval_facts` เท่านั้น Immutable approval fact ที่ได้รับอนุญาตไม่ใช่ mutable approval workflow คำว่า draft/candidate/pending/unverified ถูกห้ามเฉพาะเมื่อเป็น **internal approval/release workflow residue**; state ที่เป็นความจริงของงานผู้ใช้ เช่น draft content, pending transaction หรือ unverified audience-domain datum ยังคงแสดงได้เมื่อจำเป็นและต้องมี label/behavior ที่ตรงความหมาย Authority ทุกแบบยังห้าม debug/validator text, local path, placeholder และ unresolved dependency Artifact manifest `representation.outputClarity` MUST carry `deliveryAudience`, `disclosurePurpose` และ authority ref/hash เดียวกันเมื่อ applicable

Residue scan ครอบคลุม Build Card `navigation.destinations[]` ใน `target`, `label`, `labelByLocale`, `compactLabel`, `compactLabelByLocale` และ Artifact Manifest ใน `representation.navigation`, audience fields ของ `delivery.metadataProjection` กับ `delivery.accessibilityProjection` ตลอดจน final audience bytes ทุกไฟล์ผ่าน `delivery.contentInspections[]` แบบ exact one-per-file ห้าม skip ตาม media type หรือ skip บาง rendered unit: text-readable format เทียบ extracted text กับ bytes โดยตรง; DOCX, PPTX และ PDF MUST bind จำนวน page/slide, render ทุก unit เป็น raster ที่ path/hash/media bytes ตรงกัน และตรวจด้วย text extraction + OCR + visual review พร้อม flag ว่าได้ตรวจ image-only/outlined text แล้ว ข้อความแต่ละ channel รวมด้วยลำดับและ label ที่ deterministic ก่อน hash/scan; raster social ใช้ OCR พร้อม visual review และ media อื่นใช้ transcript/content review ที่ตรงชนิด ไฟล์ evidence ทุกใบ MUST อยู่ใน bundle, bind path/media type/subject hash/byte count/method/time และมี SHA-256 ของตัว evidence เอง การย้าย draft/review/debug/local-path wording เข้า label, target, export หรือภาพยังคงเป็น workflow residue; nonordinary authority เปิดได้เฉพาะ allowed field class ที่ระบุ และไม่เคยเปิด universal workflow residue

Acceptance:

- OUTPUT-CLARITY-01-A — automated: Build Card ใช้ `audienceOutput.mode: resolved_only`, declare delivery audience/purpose และ bind nonordinary authority เมื่อ applicable; client/public/internal-operational หรือ artifact ที่ claim `artifact_qa_passed` ขึ้นไปมี `blockingDependencyRefs: []`, ใช้เฉพาะ asset ที่ bind exact role/rights/receipt/hash และ claim ที่ approved, current-at-`claimAsOf`, locale-complete, manifest-record-hash-bound/public-eligible; audience projection ไม่มี placeholder หรือ internal-governance marker; `delivery.contentInspections[]` ครอบคลุม `delivery.files` เท่ากันพอดีและใช้ method ตาม media type; DOCX/PPTX/PDF ครบทุก page/slide ด้วย extraction + OCR + visual review, raster render hash และ explicit image-only/outlined-text review; receipt ของ acceptance นี้ MUST bind exact file set/hash และ cite inspection evidence ทุกใบ
- OUTPUT-CLARITY-01-B — production: final visible bytes, metadata, preview, export และ machine projection ผ่าน format-aware residue scan รวม combined rendered-unit text; dated receipt MUST bind exact `delivery.files` set/hash และ cite inspection evidence ชุดเดียวกันก่อน `production_verified`
- OUTPUT-CLARITY-01-C — manual: limitation ที่มองเห็นทุกอัน material, specific, proximal และเข้าใจได้; ไม่มี disclaimer กว้าง ๆ หรือคำอธิบายขั้นตอนภายในแทนข้อจำกัดจริง

### 3.3 Locale Insight และ portfolio boundary

Locale Insight ใช้ระดับ portfolio, methodology และ product architecture ครอบคลุม Land, Location และ Living ด้วยภาษา product-neutral Capability ใดที่แชร์ได้ต้องประกาศใน shared layer; workflow, data, role, sector หรือ claim ที่เฉพาะ product ต้องอยู่ใน product pack

คำแปล MUST native ต่อ locale และ preserve proposition ไม่ใช่ word-for-word copy ถ้ายังไม่มี approved translation ให้แสดง missing-locale state ห้ามผสมสองภาษาเพื่อสร้างภาพว่าครบ `locale.states[]` MUST มี locale ไม่ซ้ำและครอบคลุม `locale.available` เท่ากันพอดี: งานหลายภาษากำหนด primary เป็น `source` และ secondary เป็น `reviewed_translation | native_parallel`; งานภาษาเดียวใช้ `single_locale` Action labels/outcomes/destinations/reasons, navigation labels, discovery/social text และ projected claim text ต้องมี key ครบ locale ชุดเดียวกันและ scalar หลักต้องเท่าค่า primary-locale Artifact Manifest `representation.localeStates` MUST เท่ากับ Build Card states ทั้ง array ไม่ใช่เพียงมีอย่างน้อยหนึ่งแถว

### 3.4 Accessibility, resilience, privacy

**A11Y-01 — Semantics and direct operation survive every state.** ทุก applicable artifact MUST meet WCAG 2.2 Level AA เป็น floor Information structure, names, roles, values, focus order, alternatives, status announcements และ direct operation MUST equivalent ใน initial, hydrated, loading, success, empty, error, reduced-motion, high-zoom, keyboard, touch, print และ export states ที่ applicable Native HTML/format-native structure comes first; ARIA supplements rather than repairs wrong semantics

Acceptance:

- A11Y-01-A — automated: zero critical/serious release-blocking errors; normal text ≥4.5:1, large text ≥3:1 และ required non-text/focus ≥3:1 ในทุก applicable state
- A11Y-01-B — manual: keyboard, screen-reader, zoom, reflow, reduced-motion และ touch checks มี receipts

Artifact Manifest ห้ามใช้ accessibility summary แบบเหมารวมว่า verified ทุกช่อง `machine.contracts.formatPacks.accessibilityProjectionContract` เป็น source เดียวของ summary ต่อ format: web public ต้อง verify headings, landmarks, controls, keyboard, focus, touch, zoom 200% และ reflow 400%; app interactive ต้อง verify semantic structure กับ keyboard/focus/touch แต่ไม่อ้าง zoom/reflow หาก fixture profile ไม่ได้ทดสอบ; document/PDF ใช้เฉพาะ native heading/link structure ที่ fixture รองรับ; deck และ social static ใช้ `not_applicable` สำหรับ headings/landmarks/controls แบบ semantic runtime ไม่อ้างว่า raster หรือ slide มีโครงสร้าง HTML Social static ยังคงต้องผ่าน contrast, safe area, Thai/Latin, crop และ destination-cue fixtures `not_applicable` ในช่องที่ format ไม่มีไม่ได้ลด accessibility obligation ของช่องทางที่มีจริง

ค่า `alternatives.images`, `alternatives.data` และ `alternatives.motion` MUST derive จาก asset roles/capabilities จริง ถ้าไม่มี trigger ต้องเป็น `not_applicable`; ถ้ามี trigger ต้องเป็น `verified` พร้อม exact governed fixture receipts Motion summary แยกตาม runtime: `web_public.browser` และ `app_interactive.browser` ต้องมี reduced-motion + observer-failure final state; `app_interactive.native` ต้องมี reduced-motion + native interruption/complete-final-state evidence และตั้ง `observerFailure: not_applicable`; deck motion ใช้ static alternative โดยไม่สร้าง runtime claim Accessibility fixture report MUST repeat summary เดียวกันกับ projection และ bind exact evidence ของ fixture ทุก ID จึงห้ามนำ summary ของ browser ไปคัดลอกใส่ native, social, PDF หรือ deck

**SECURITY-01 — Public presentation cannot reveal restricted evidence.** Output, metadata, preview, source map, machine projection, log และ agent receipt MUST เคารพ data classification และ MUST NOT เปิดเผย restricted evidence, personal data, credential หรือ internal-only source detail

Acceptance:

- SECURITY-01-A — automated: secret, personal-data, private-URL และ restricted-field scans ผ่าน
- SECURITY-01-B — manual: disclosure ยังมีประโยชน์โดยไม่ข้าม evidence boundary

`client` และ `public` delivery รับเฉพาะ `privacySecurity.dataClassification: public` เท่านั้น งาน `internal_operational` ที่เป็น `confidential | restricted` ต้องมี `permissionsRequired` อย่างน้อยหนึ่งรายการและ `redactionPolicy: required_before_delivery`; public fixture ใช้ `redactionPolicy: not_required`

---

## 4. Brand, voice และ protected language

### 4.1 Brand lines และบทบาท

Protected brand lines:

| Role | Canonical line |
|---|---|
| North Star | Visualize City, Shape Tomorrow. |
| Promise | Measure What Matters. Make It Actionable. |
| Cultural activation | Let us cultivate our city with data. |

Supporting systems are exact explanatory structures, not peer slogans:

| Role | Canonical system line | Use |
|---|---|---|
| Ecosystem | Land · Location · Living · Local Decisions. | explain shared portfolio scope |
| Product loop | See → Understand → Decide → Act → Learn. | explain behavioral sequence |

**BRAND-01 — Protected brand lines retain roles.** การใช้ protected line เป็น optional เว้นแต่ Build Card จะ select ไว้ เมื่อใช้ แต่ละ protected line MUST ปรากฏ verbatim พร้อม canonical punctuation และคง recorded role ของตน หนึ่ง scene ใช้ได้เพียงหนึ่ง protected line เป็น headline ห้าม stack เป็น peer slogans Supporting systems MAY appear only when explaining scope/behavior and MUST NOT become a headline slogan by default

Protected wording ใช้ canonical punctuation ตาม registry ในทุก locale เว้นแต่ registry มี owner-approved locale-specific record แยกต่างหาก การแปลหรือ adaptation ที่ปรากฏใน implementation—even เมื่อดูดี—MUST NOT ถูกใช้เป็น protected line, metadata title หรือ portfolio authority โดยอัตโนมัติ

ในกฎนี้ **scene** คือ composition ที่ผู้ใช้รับรู้เป็นหน่วยหนึ่ง มี primary proposition และ reading/action path ของตัวเอง ขอบเขตใช้ดังนี้:

- web/app: route, view, dialog หรือ top-level section ที่มี primary heading ของตัวเอง;
- deck: หนึ่ง slide;
- document/PDF: cover, chapter opener หรือ titled section ระหว่าง peer headings;
- social static: หนึ่ง creative.

Card, column, tab panel, animation state หรือ DOM wrapper ไม่กลายเป็น scene ใหม่เพียงเพื่อใช้ protected line เพิ่ม เว้นแต่ผู้ใช้เข้าถึงเป็นหน่วยอิสระที่มี primary heading และ path ของตัวเอง Navbar, footer, metadata, source note และ repeated running header ไม่สร้าง scene และ MUST NOT host protected line เพิ่มเป็น headline ภายใน scene เดิม การนับ scene ยึดสิ่งที่ผู้ใช้เห็น/อ่าน ไม่ยึดชื่อ component หรือโครงสร้างไฟล์

Acceptance:

- BRAND-01-A — automated: text ตรง canonical registry exact
- BRAND-01-B — manual: scene ไม่วาง protected lines หลายอันแข่งกัน

### 4.2 Voice

Landometer voice คือ calm, clear, evidence-aware, civic-minded และ action-capable ใช้ประโยคสั้นเมื่อสั่งงาน ใช้ plain language ก่อน terminology และบอก limit ใกล้ claim ที่มันจำกัด ห้าม urgency, certainty, official status หรือ scale ที่หลักฐานไม่รองรับ

CTA/copy สำหรับ Thai MUST ผ่าน native review; การตัดคำและ line break ต้องคำนึงถึง phrase ไม่ใช่ความยาวตัวอักษรเท่านั้น Metadata และ machine wording ห้ามมี claim มากกว่า visible wording

### 4.3 Identity roles

**LOGO-01 — Use an approved identity implementation.** Landometer wordmark MAY change colour, including a different colour for each letter, while preserving its letterforms and proportions. Gray is an optional versatile default, not a required identity colour. This owner-authorized wordmark colour treatment does not require separate permission for each colour. The official logo MAY appear on light or dark backgrounds when the complete name and symbol remain legible at the actual size. Evaluate a Brand Blue visibility problem for that specific pairing; it does not prohibit dark backgrounds generally. MOTIF-06 full/quiet carrier restrictions apply to registered motifs, not official logo PNGs. This permission changes wordmark colour only; it does not authorize symbol recolouring, redrawing or distortion, or change interface/data colour contracts.

ทุก output ที่ `brandRequired: true` MUST bind `identityImplementation` ที่ approved หนึ่งรายการ Logo, wordmark, symbol, favicon และ social mark MUST ใช้ owner-approved asset ตรง declared role หากยังไม่มี logo asset ที่ approved สำหรับ role/surface นั้น MAY ใช้ canonical portfolio name เป็น governed live-text identity ที่ bind approved fonts ได้ แต่ MUST ระบุ `kind: governed_text_identity`, ใช้ canonical text ครบทุก delivered locale, ตั้ง `logoAssetId: null` และ `logoReconstructionAllowed: false`; MUST NOT ทำ live type ให้เลียนแบบ wordmark หรือ invent compact mark

Acceptance:

- LOGO-01-A — automated: brand-required output resolve identity implementation หนึ่งรายการพอดี—approved asset identity ต้องตรง role/surface/rights/SHA-256/receipt/minimum-size/clear-space; wordmark colour rendition ที่ LOGO-01 อนุญาตคง source provenance และบันทึก hash ของไฟล์ผลลัพธ์จริง ห้ามอ้าง hash เดิมแทนไฟล์ที่เปลี่ยน และไม่ต้องขอ approval ใหม่แยกต่อสี; governed text identity ต้องตรง canonical locale text, approved font bindings, null `logoAssetId`, disabled reconstruction และ artifact-resolved format-implementation record ต้อง bind implementation ID เดียวกัน
- LOGO-01-B — visual: asset identity ใช้ clear space/minimum size/contrast/direct surface ตรง approved variant และ wordmark colour permission ของ LOGO-01; light/dark ทั้งสองใช้ได้เมื่อชื่อและสัญลักษณ์อ่านได้ครบ ห้ามใช้ MOTIF-06 เป็น blanket dark-background ban ของ official logo; governed text identity ยังคงเป็น live text ที่อ่านได้และไม่ impersonate wordmark ที่ไม่ได้รับอนุมัติ

Logo ไม่ใช่ interface icon และ interface icon ไม่ใช่ product identity ถ้าไม่มี approved contrast-safe variant สำหรับ surface นั้น ให้เปลี่ยน surface/variant หรือไม่ใช้ ห้ามรับ contrast risk เพราะ implementation สวยใน screenshot เดียว

Default identity mapping: normal header ใช้ approved horizontal lockup เมื่อ role/surface approval นั้นมีอยู่จริง; compact app, tab/favicon, social avatar และ constrained mark ใช้ได้เฉพาะ separately approved asset ของ role นั้น (ชุดไอคอนของเว็บ resolve ผ่าน FAVICON-01) ห้าม crop header lockup หรือประกอบ symbol + live type ใหม่ เมื่อไม่มี approved logo role ให้ใช้ governed text identity `Landometer` ตาม registry ไม่ใช่ใช้ candidate logo และไม่ใช่สร้าง logo ใหม่ Build Card MUST bind artifact-owned registry ด้วย `{registryRef, sha256, schemaRef}`; artifact-resolved format-implementation record MUST bind `identityImplementationIds` อย่างน้อยหนึ่ง ID และ `identityAssetIds` อาจว่างได้เฉพาะเมื่อ governed text identity เป็นตัวที่ใช้งานจริง Identity asset ต้องมี role, SHA-256, `licenseOrPermission`, `fallback`, `altOrTextEquivalent`, `approvalReceiptRef` และ `approvalReceiptSha256`; registry owns rights/approval, exact hash, clear-space และ minimum-size contract ส่วน manifest `assetBindings` MUST bind ID/role/surface/ref เดียวกันกับ exact emitted hash

Governed text identity MUST select one exact registry `typographyBindingId` for the delivered surface/runtime. Binding นั้นกำหนด font source, family, PostScript name เมื่อเป็น native font, weight, style, size, minimum size, tracking, line height, clear space, substitution policy, final-output policy และ fixture IDs แบบครบชุด `fontAssetIds` ใน Build Card MUST เท่ากับ packaged-font IDs ของ binding นั้นพอดี; native binding MUST ใช้ `nativeMappingId` ที่ตรง platform และห้าม silent substitution Static export MUST เก็บ canonical text เป็น live text ใน editable source และ final bytes ต้องใช้ exact embedded font, approved generated-vector projection ที่มี asset record/hash/text equivalent หรือ verified raster pixels ตาม binding—ห้ามแปลง text เป็นโลโก้หรือ vector ที่ไม่มี authority

#### Icon set ของเว็บ

**FAVICON-01 — Every web build binds one approved icon set.** A web build ships one icon set chosen by property — portfolio: the symbol on transparent; product: the product's identity-gradient tile with the symbol in that gradient's foreground contract (`symbol-white` on onDeep, `symbol-color` on onLight). Six sizes: 16 · 32 · 48 · 180 (apple-touch) · 192 · 512 (maskable, safe zone 80%). Corners 25% at 16/32; maskable sizes ship full-square. The icon never changes per page and never signals status. `<title>` is `[page] · [product]`, ≤ 60 characters, page first. A missing icon set is a WEBFMT-01 blocker, not a caveat. Icon sets live in the asset register with hashes.

ชุดไอคอนเป็น identity asset role ใหม่ `icon_set` ใน `machine.contracts.assetRegistry#/iconSets` แต่ละไฟล์ต้องมี role ตามขนาด, exact SHA-256, `approvalReceiptRef` และ `approvalReceiptSha256` ตาม ASSET-DELIVERY-01 ชุด portfolio `iconset.landometer.portfolio.symbol.01` (generator deterministic จาก symbol PNG ทางการ `b818eeb6…`; 16/32/48/192 บนพื้นใส, 180/512 เป็น tile `brand.beige`; hash ทั้งหกไฟล์ใน `machine.contracts.assetRegistry#/iconSets`) ได้รับการอนุมัติ role `icon_set` จากเจ้าของเมื่อ 15 กันยายน 2569 (`owner-message:2026-09-15:0.9.3-answers`) ส่วน product tile ต้อง resolve identity gradient และ asset bytes ที่อนุมัติต่อผลิตภัณฑ์จาก Add-on แยกของผลิตภัณฑ์ปัจจุบัน ซึ่งใช้ร่วมกับ LDS ฉบับเต็มนี้ motif หรือ animated variant ห้ามใช้เป็นไอคอน (MOTION-04, MOTIF-02)

Acceptance:

- FAVICON-01-A — automated: initial HTML ของทุก route มี icon set ครบหกขนาดที่ resolve จาก asset registry ด้วย hash ตรง, web manifest ที่ประกาศ 192/512 (512 maskable), `theme-color` light/dark และ `<title>` ตาม pattern `[page] · [product]` ≤ 60 ตัวอักษร; ขาดข้อใดข้อหนึ่งเป็น WEBFMT-01 blocker
- FAVICON-01-B — visual: ไอคอน 16/32 อ่านออกที่ขนาดจริงบน light/dark tab strip, 180 บน iOS home, 192/512 maskable ไม่ถูกตัดใน safe zone 80% และไอคอนไม่เปลี่ยนตามหน้าหรือสถานะ

---

## 5. Visual foundations

### 5.1 Color: semantic before decorative

**COLOR-01 — Use semantic color tokens.** Authored UI, text, surface, state and data colors MUST resolve governed roles in `color-srgb-10`. Use exact values from `machine.colorRegistry`, `machine.tokens` and `machine.analyticalScales`; do not approximate by eye. State, category and magnitude MUST NOT rely on color alone, and contrast MUST be checked in the actual output context. Approved identity artwork and governed evidence/editorial media retain their approved source pixels and MUST NOT be sampled/reconstructed as interface tokens.

Acceptance:

- COLOR-01-A — automated: authored colors resolve current approved roles or exact LUT/class records; ordinary audience output contains the sanitized values/assets it needs, not internal provenance or approval metadata; no forbidden old series/density/product alias is emitted
- COLOR-01-B — visual: text, controls, focus, graphics and data marks pass their declared contrast requirements in light, dark and print-relevant states at actual size

Production websites use the exact `lds-0.9.7.css` build-kit and its pinned dependencies or a separately verified equivalent projection of the embedded current roles. Charts use exact LUT samples rather than three-anchor interpolation. A DS-reference download such as this document intentionally contains rules and machine records; that purpose does not permit publishing its internal provenance as ordinary product UI. Seven atmosphere gradients are decorative identity assets and MUST NOT encode quantity, category or evidence state.

Forbidden aliases in current work: `--ldm-series-NN-light`, `--ldm-series-NN-dark`, ambiguous `--scale-density-*`, and retired warm `--ldm-product-ijji-*`. Use explicit series fill/ink roles and the denominator-specific analytical family. Approved ijji identity remains `ground.mist` in light and `#59C7E8 → #3BD3CB` in dark; other product identity requires its product-owned approval.

#### Canonical brand และ energy colors

| Token | Value | Role |
|---|---:|---|
| brand.blue | #1D4497 | portfolio identity; ไม่ใช่ default body text |
| brand.beige | #F2F1DF | warm identity surface |
| energy.sky | #59D2FE | restrained accent |
| energy.mint | #0AD69C | restrained accent |
| energy.coral | #FF5A5F | restrained accent; ไม่เท่ากับ danger โดยอัตโนมัติ |
| energy.yellow | #FFBC1F | restrained accent; ไม่เท่ากับ warning โดยอัตโนมัติ |

#### Story supporting vocabulary — 17 values

Story is a supporting editorial vocabulary. These exact HEX values remain unchanged on both themes. Use quiet structure, supporting context and focused accents by composition; role names do not guarantee a strict global chroma ladder. Brand Energy and the official logo artwork remain separate. The logo spectrum belongs to identity-asset reference, not automatic chart assignment.

| ID | Name | HEX |
|---|---|---|
| `story.paper` | Paper / กระดาษ | `#F4F0E7` |
| `story.navy` | Editorial navy / น้ำเงินหมึก | `#213E70` |
| `story.blue` | Active blue / ฟ้ากิจกรรม | `#25659A` |
| `story.cyan` | Water cyan / ฟ้าน้ำ | `#3DBBCD` |
| `story.mint` | Exchange mint / มิ้นต์ | `#60C9AD` |
| `story.leaf` | Leaf / ใบไม้ | `#2B702F` |
| `story.gold` | Built gold / ทอง | `#BFA000` |
| `story.coral` | Signal coral / คอรัล | `#F27642` |
| `story.rose` | People rose / กุหลาบ | `#B72B63` |
| `story.red` | Risk red / แดงความเสี่ยง | `#A40822` |
| `story.teal` | Teal / ทีล | `#278E94` |
| `story.amber` | Amber / อำพัน | `#DDA527` |
| `story.azure` | Azure / ฟ้า | `#4B8FD8` |
| `story.lime-leaf` | Lime leaf / เขียวอ่อน | `#92B847` |
| `story.scarlet` | Scarlet / แดงส้ม | `#E45244` |
| `story.orange` | Orange / ส้ม | `#D6600C` |
| `story.pine` | Pine / เขียวสน | `#216D58` |

Seventeen vocabulary values do not require seventeen simultaneous series or supply unique colors for every possible metric. Quantitative displays still use named analytical ramps. Location Intelligence has a separate optional profile with 16 named roles, 12 quantitative recipes and four evidence-led SWOT lenses. Its business definitions are not generic LDS rules.

#### Foundation pairs: light / dark

| Semantic token | Light | Dark |
|---|---:|---:|
| surface.canvas | #F6F7F3 | #11191D |
| surface.alt | #EEF1EE | #172126 |
| surface.card | #FCFCFA | #20292D |
| surface.raised | #FFFFFF | #293337 |
| surface.soft | #E5E9E6 | #2B3534 |
| surface.blueTint | #E2E9ED | #18333E |
| surface.beigeTint | #F2F1DF | #2C2A22 |
| text.primary | #182327 | #F1F4EF |
| text.secondary | #5F635A | #C4CECA |
| text.metadata | #5C6A61 | #A6B5B1 |
| text.muted | #7B877D | #8D9D99 |
| text.disabled | #A7B3A9 | #71817D |
| border.hairline | #DCE1DD | #33403D |
| border.default | #C9D0CB | #46524F |
| border.emphasis | #7D877F | #7C8A84 |
| interaction.accent | #176B82 | #68C4E2 |
| interaction.focus.ring | #176B82 | #68C4E2 |

State tokens success, warning, danger, info, neutral, pending และ assisted จาก color-srgb-05 ยังคงเป็น canonical ค่า energy color ห้ามใช้แทน state token เพียงเพราะดูคล้ายกัน State MUST มี text/icon/pattern หรือ programmatic name ร่วมด้วย

Dataviz และ map MUST ใช้ approved scale registry แยก semantic state, categorical series และ magnitude scale ไม่ให้สีเดียวรับหลายความหมายใน scene เดียว Palette ที่สวยแต่ label ไม่พอถือว่า fail Registry ของ release นี้คือ `machine.analyticalScales` (DATAVIZ-02; exact dark LUT ตาม DATAVIZ-03) และ `machine.tokens.categoricalSeries` (DATAVIZ-05); ทุกค่าวิเคราะห์ทั้งสองธีมต้องผ่านหน้าต่างสีที่กำหนดใน DATAVIZ-04; ผลตรวจ GATE-01 ต้อง bind ค่าปัจจุบันและ reported scope จริง; energy color เป็น restrained accent เท่านั้น ห้ามเป็นสีกลางของสเกล และห้ามอยู่ร่วม surface กับ categorical chart แบบ vivid

#### Governed atmosphere retained from v0.9.0-r7

**SURFACE-01 — Atmosphere surfaces have a declared job.** Brand-atmosphere surface MUST ใช้ exact recipe จาก landometer-atmosphere-gradient-v2 หรือ approved flat/photo treatment เพื่อ job ที่ประกาศ: entry, orientation, transition, momentum หรือ closure ต้อง record focal target, reading direction, foreground contract, contrast evidence, cadence และ deletion test Gradients MUST NOT decorate every card หรือ encode data, product capability, status หรือ magnitude

| Recipe | Exact CSS | Semantic job | Foreground |
|---|---|---|---|
| atmosphere.gradient.measure.deep | linear-gradient(135deg, #1D4497 0%, #176B82 54%, #08756F 100%) | high-confidence entry, direction, closure | onDeep |
| atmosphere.gradient.measure.luminous | linear-gradient(135deg, #89CEF6 0%, #5ECAD6 50%, #6CD5B3 100%) | orientation, measurement becoming action | onLight |
| atmosphere.gradient.ground.current | linear-gradient(135deg, #0F5773 0%, #006A6A 50%, #1F744F 100%) | context/evidence becoming understandable | onDeep |
| atmosphere.gradient.ground.mist | linear-gradient(135deg, #C4E0EE 0%, #B2E2E2 50%, #CCE6D0 100%) | calm context, collaboration | onLight |
| atmosphere.gradient.cultivate.glow | linear-gradient(135deg, #EB8182 0%, #F5A06F 50%, #EBC573 100%) | action and credible momentum | onLight |
| atmosphere.gradient.cultivate.mist | linear-gradient(135deg, #F7CBC7 0%, #FBD1B6 50%, #F1E0B4 100%) | completion and handoff | onLight |
| atmosphere.gradient.diversity.spectrum | linear-gradient(135deg, #89CEF6 0%, #6CD5B3 34%, #EBC573 67%, #EB8182 100%) | rare evidenced participation/co-creation | onLight |

Foreground contracts: onDeep primary/icon #FFFFFF, secondary #F1F4EF; onLight primary/icon #182327, secondary #293337 Focus uses an inner/outer pair that remains visible on both field and adjacent surface Contrast MUST sample actual rendered glyph/icon bounds across the gradient, not endpoints only

Long public/adoption/campaign routes MUST either resolve atmosphere at opening, one major transition and closing through a mix of exact gradient, large approved photo with deterministic scrim หรือ bold flat field, or record a deliberate zero-atmosphere decision A smaller task surface MUST NOT manufacture all moments One dominant gradient per viewport is the default cadence Diversity spectrum appears at most once and only for evidenced multi-perspective content

Deletion test: if removing the treatment does not weaken its declared entry/orientation/transition/momentum/closure job, remove it Product gradients remain named-product identity only and never become shared portfolio or analytical color

Acceptance:

- SURFACE-01-A — automated: exact recipe ID, role, foreground, focal target, direction and color-set record resolve
- SURFACE-01-B — visual: local contrast/cadence/deletion tests pass; no quota or data/status use

### 5.2 Typography: role, script, stress fixture

**TYPE-01 — Typography is script-aware and output-aware.** Type roles MUST ใช้ approved Latin/Thai families, รักษา hierarchy และผ่าน script-specific collision, clipping, fallback และ export checks ในทุก size ที่ใช้ ค่า Thai display line-height 1.16 เดิม MUST NOT ถือว่าปลอดภัยทั่วโลก

Acceptance:

- TYPE-01-A — automated: font roles/fallbacks resolve type-script-aware-02
- TYPE-01-B — visual: Thai/Latin stress fixtures ไม่มี clipping, collision, tofu หรือ unintended substitution ในแต่ละ format

#### Font roles

| Role | Latin | Thai | Weight |
|---|---|---|---:|
| display/headline | Arvo | IBM Plex Sans Thai Looped | 700 |
| body/UI | Bai Jamjuree | Bai Jamjuree | 400 / 600 |
| technical/data | JetBrains Mono | IBM Plex Sans Thai | 400 |
| interface symbol | Material Symbols Rounded approved subset | same glyph system | 300 |

Fallback บน interactive web MAY preserve script legibility โดยไม่เลียนรูปร่าง exact ของ primary family ระหว่าง load failure แต่ห้ามทำให้ action หาย ส่วน output non-web ที่ส่งมอบ MUST เลือก exact `nonWebPortability.nativeFontMappings` ตาม platform และ format, ตั้ง `substitutionAllowed: false`, ตรวจ availability/no-substitution และปฏิบัติตาม fixed-export policy; mapping ที่ไม่มีหรือ font ที่ไม่พร้อมเป็น delivery blocker ไม่ใช่เหตุให้เปลี่ยน family เงียบ ๆ

Font asset binding ใน Build Card MUST ใช้ descriptor names ตรง machine contract: `fontRole`, `fontFamily`, `fontSubset`, `fontWeight`, `fontFallback` และ `licenseOrPermission` พร้อม exact SHA-256 และ `approvalReceiptRef` + `approvalReceiptSha256` ห้ามสร้างชื่อ field ทางเลือกหรือเดา descriptor จากชื่อไฟล์

#### Type scale

ค่าตารางนี้เป็น **browser/screen primitives** ในหน่วย `rem`, `vw` และ `clamp()` เท่านั้น ไม่ใช่ค่า point สำหรับเอกสารหรือสไลด์ งาน non-web MUST ใช้ `typeAdapter`, grid, safe area และหน่วยจาก selected target profile โดยตรง และ MUST ผ่าน fixture ของ target นั้น ห้ามแปลง `rem` หรือ CSS pixel เป็น pt/mm/authoring-tool units แบบเดาเอง

| Role | Size |
|---|---|
| caption | 0.75rem |
| label | 0.8125rem |
| body-sm | 0.875rem |
| body | 1rem |
| body-lg | 1.125rem |
| h3 | clamp(1.35rem, 2vw, 1.75rem) |
| h2 | clamp(2rem, 4vw, 3.25rem) |
| h1 Latin | clamp(3.25rem, 7vw, 6.5rem) |
| h1 Thai | clamp(2.5rem, 6vw, 5rem) |

Display line-height ต้องเลือกจาก approved size/script registry หลัง stress test หากไม่มี fixture pass ให้ใช้ safe fallback 1.25 และ artifact นั้นยังผ่าน typography gate ไม่ได้จนกว่าจะมี fixture ห้ามบีบ line-height, letter-spacing หรือ glyph scale เพียงเพื่อให้ copy ที่ยาวเกิน fit

### 5.3 Interface icons

**ICON-01 — Interface icons are simplified rounded outlines.** UI icons MUST simplified, outline, rounded จาก approved subset และคง FILL 0 / wght 300 ทุก state; selected state MUST แสดงด้วย semantic surface, color, visible label หรือ outline-container treatment ไม่เปลี่ยน glyph fill/weight Identity marks และ data symbols MUST เป็นคนละระบบ

Canonical variable axes:

| Axis | Value |
|---|---:|
| FILL | 0 |
| wght | 300 |
| GRAD | 0 |
| optical size | match rendered size from approved subset |

Acceptance:

- ICON-01-A — automated: icon name อยู่ใน approved subset และ FILL คง 0 ทุก state
- ICON-01-B — visual: icon อ่านออกและมี style เดียวกันใน rendered/exported size ทุกขนาด

Icon-only control MAY ใช้เมื่อ symbol เป็น conventional และมี accessible name/tooltip ที่ชัด ถ้า intent คลุมเครือ MUST ใช้ text label Icon ห้ามใช้เป็นหลักฐาน, rating หรือ category แทน label และห้ามนำ logo asset ไปวาดใหม่ให้เข้าระบบ icon

Icon asset binding MUST declare `glyphs`, `licenseOrPermission` และ `fallback` พร้อม role, exact SHA-256, `approvalReceiptRef` และ `approvalReceiptSha256`; glyph ที่ไม่อยู่ใน approved subset ห้าม substitute เงียบ ๆ สำหรับ document/PDF/deck/social ให้ใช้ visible text label เป็น default; icon visual เป็น optional และใช้ได้เฉพาะ registered generated-vector asset ที่มี exact hash + text equivalent ตาม `nonWebPortability.interfaceIconPolicy` ห้ามใช้ native symbol font เป็น fallback โดยอัตโนมัติ

### 5.4 Layout, space และ responsive composition

**LAYOUT-01 — Layout preserves hierarchy across formats.** Composition MUST รักษา primary reading path, responsive/page-safe gutters, deliberate density และความสัมพันธ์ที่รับรู้ได้ระหว่าง question, evidence, interpretation และ next action

Selected navigation, tabs, cards and callouts MUST NOT use decorative bracket-shaped highlights or colored left-rail accents. Use restrained background, text weight and spacing. Keep visible keyboard focus outlines and meaningful chart/table borders. Review actual rendered Thai/English text at narrow and desktop widths, including every newly added section, for squeezed headings and overlapping siblings; token/hash checks do not establish readable composition.

Acceptance:

- LAYOUT-01-A — visual: reading order ชัดที่ minimum, nominal และ maximum target sizes; actual Thai/English narrow/desktop content has no squeezed heading or sibling overlap, including newly added sections
- LAYOUT-01-B — manual: essential content ไม่ clipped, orphaned, ซ่อนหลัง navigation หรือ split โดยไม่มี continuation cue; selected states contain no decorative brackets/colored left rails, while keyboard focus and meaningful chart/table borders remain visible

#### Browser/screen primitive scales

ค่าต่อไปนี้เป็น CSS/browser primitives สำหรับ responsive screen composition ไม่ใช่ global physical units งาน document, PDF, deck, social และ native authoring MUST ใช้ selected target profile's `typeAdapter`, grid, safe area, canvas และ unit contract; ห้ามใช้ตาราง px นี้เป็น conversion table หรือสร้างค่า pt/mm/pixel ใหม่โดยไม่มี target record

| Scale | Values |
|---|---|
| spacing | 0, 4, 8, 12, 16, 24, 32, 48, 64, 96, 128 px |
| radius | 6, 10, 16, 24, 32 px และ pill |
| content containers | reading 760, default 1120, wide 1280 px |
| gutters | 16, 24, 32 px ตาม viewport |
| breakpoints | 360, 600, 900, 1200, 1600 px |

Breakpoint คือจุดที่ content ต้อง recompose ไม่ใช่ device label Design MUST ทดสอบช่วงระหว่าง breakpoint ด้วย ไม่ใช่เพียง six screenshots

Component ที่แน่นเกินแก้ตามลำดับ: ลด nonessential content → เปลี่ยน composition → stack → เลื่อน lower-priority action → ใช้ approved compact locale copy ห้ามเริ่มด้วยลด font ต่ำกว่า role, ตัด label หรือซ่อน evidence

### 5.5 Media และ visual evidence

**MEDIA-01 — Media treatment follows semantic role.** Crop, animation และ decorative treatment MUST gated ด้วย semantic role ของ asset Identity, evidence, maps, charts, UI captures และ provider content MUST fixed เว้นแต่ approved role อนุญาต transformation; alternative และ attribution MUST survive export

Acceptance:

- MEDIA-01-A — automated: asset ทุกชิ้นมี governed role, source, rights, exact SHA-256, approval status, fallback และ text equivalent เมื่อ required; เฉพาะ `approvalStatus: approved` MUST มี `approvalReceiptRef` + `approvalReceiptSha256` ส่วน non-approved asset เป็น blocker และอยู่ได้เฉพาะ internal preview
- MEDIA-01-B — visual: responsive/export crops รักษา evidence-bearing subject, identity geometry และ attribution

Governed roles:

- identity — ห้าม crop หรือ distort; เปลี่ยนสีเฉพาะ wordmark ได้ตาม LOGO-01 รวมถึงตัวอักษรละสี โดยคง letterforms/proportions; ข้อห้าม recolor ส่วนอื่นยังคงเดิม; ไฟล์อัตลักษณ์ทางการไม่เคลื่อนไหว ส่วน animated variant ของ mark มีทางเดียวคือ `motif.v3` kind `logo` ตาม MOTION-04 ซึ่งเป็น generated_vector ไม่ใช่ identity file
- evidence — ห้ามเปลี่ยนส่วนที่ทำให้ข้อสรุปเปลี่ยน; caption/source อยู่ใกล้
- editorial — crop ได้ตาม focal point และ rights record
- atmosphere — decorate ได้แต่ subordinate และ aria-hidden เมื่อไม่มี meaning
- data_visualization — fixed truth-bearing; transformation ต้องไม่เปลี่ยน value, scale, unit หรือ state
- map — รักษา geography, coverage, projection, attribution และ nonspatial alternative
- social_preview — ต้องตรง visible page/locale และใช้ได้เฉพาะ approved surface
- ui_capture — รักษา state, label, privacy และ product boundary ของ capture
- provider_content — รักษา provider boundary, ไม่ใช้ CSS inversion ที่เปลี่ยน identity/meaning
- generated_vector — bind generator/source, rights, exact bytes, text equivalent และห้ามใช้แทน unapproved identity/evidence

### 5.6 Component anatomy

**COMPONENT-01 — Reusable components declare a complete semantic contract.** Build Card `composition.componentIds` MUST inventory exact reusable component IDs ที่ implementation source ใช้ และ artifact-resolved implementation record `requirements.componentIds` MUST เท่ากับ inventory นี้พอดี ทุก ID ต้องมี machine-valid `componentContract` หนึ่งรายการพอดีสำหรับ selected `formatProfile`; cross-format parity ใช้ FORMAT-PARITY-01 และ format pack ไม่ใช่การใส่ `formatBehavior` หกรูปแบบลงใน resolved contract เดียว Visual similarity อย่างเดียวไม่เพียงพอให้ component ใช้แทนกัน ถ้า semantic intent, consequence หรือ evidence role ต่างกัน

Acceptance:

- COMPONENT-01-A — automated: Build Card inventory, artifact-resolved implementation `componentIds` และ contract IDs เท่ากันพอดี ไม่มี duplicate/missing/extra; governing rules ของ contract เป็น subset ของ resolved rules; token refs resolve ไป exact governed token bytes และ fixture refs resolve ไป active acceptance/resolved-test set
- COMPONENT-01-B — manual: rendered fixtures รักษา semantic intent, locale content, state, evidence/permission boundary, accessibility behavior และ static-format equivalent ตาม contract

Contract ทุกตัว MUST มี `componentClass` และ:

1. purpose และ non-purpose
2. semantic element/landmark
3. content contract และ locale stress state
4. states: default, hover ถ้ามี, focus, active/pressed, selected/current, disabled, loading, empty, error, success
5. responsive/page/export behavior
6. accessibility name, role, value, order และ status
7. token mapping
8. evidence/permission boundary ถ้าเกี่ยวข้อง
9. acceptance fixtures และ anti-pattern

State ที่ไม่เกิดกับ component นั้น MUST ระบุ `not_applicable` พร้อม behavior/rationale ที่ชัด ห้ามลบ state ออกจาก contract เพื่อหลบการตรวจ `navigational_cta` MUST ใช้ default/hover/focus/active และ selected/disabled/loading/empty/error/success เป็น `not_applicable`; `stateful_cta` MUST มี disabled/loading/error/success และกำหนด recovery/result status ส่วน empty/selected ระบุตาม behavior จริง Disclosure และ side bookmark ต้องมี contract แยก ไม่ถือว่าถูก cover ด้วย navbar contract Current governed component contracts ห้ารายการใน `machine.contracts.componentContracts`: `component.evidence-card.01` (EvidenceCard ใหม่ตาม EVID-05), `component.motif-frame.01` (MotifFrame ใหม่ตาม MOTION-04 และ MOTIF-01…06: mount `<lm-motif kind="dial|rings|layers|slice|cultivate|logo">` จาก runtime bytes ที่ hash ตรง พร้อม final-state SVG ของ kind นั้นเป็น no-JS fallback, prop `job` ที่ต้องอยู่ใน allowedJobs ของ manifest, `beat`, `variant`, `data-host-surface` ที่ต้องอยู่ในตาราง carrier ของ MOTIF-06 พร้อม `data-variant-dark` ที่เลือกได้ และ observer contract ของ OWNER-MOTION-01) และ `component.motion-controller.01` (ปุ่ม pause/resume ระดับหน้าที่ MotifFrame ทุกตัวแชร์), `component.data-table.01` (prop `cellStates` uses all six EVID-05 states) และ `component.map-legend.01` (แสดง `noData`, `zero`, `outOfScope`, `suppressed`, `notYet` rows เมื่อมี) BrandSignature docstring อ้าง MOTION-04 แทนคำว่า never animated

### 5.7 Control geometry retained

**CTRL-01 — Control geometry stays direct and recognizable.** กฎนี้ใช้กับ direct controls ใน `web_public` และ `app_interactive` เท่านั้น Build Card `navigation.controlBudgets.minimumDirectTarget` MUST เท่ากับ selected target profile พอดี: browser ใช้ `{value: 44, unit: css_px}` กับ semantic browser element/DOM order; native app ใช้ `{value: 44, unit: platform_dp}` กับ native semantic view/platform accessibility order Discrete action target ทุกอัน MUST มีขนาดอย่างน้อย 44 × 44 ในหน่วยของ branch นั้นทุก state Text และ icon+label button ใช้ approved capsule; icon-only button ใช้ approved circle Padding/gap/border/focus/loading/disabled resolve component tokens และห้าม proxy click-forward งาน document, PDF, deck และ social ใช้ static action equivalent ตาม §7.1/§11 และ selected target profile โดยไม่สร้าง interactive target ปลอม

Canonical geometry:

| Control | Geometry |
|---|---|
| text or icon+label button | browser: min-height 44 CSS px; native: min-height 44 platform dp; capsule geometry จาก runtime adapter โดย label ต้องไม่ถูกตัด |
| icon-only button | browser: 44 × 44 CSS px; native: 44 × 44 platform dp; circle geometry และ accessible name required |
| inline link in running text | not forced into a 44px box; follows WCAG text-link exception/spacing branch and visible focus |

Acceptance:

- CTRL-01-A — automated: exact target-profile value/unit, browser element + DOM order หรือ native view + platform accessibility order, tokens และ accessible names pass every state
- CTRL-01-B — visual: capsule/circle/label/icon/focus/loading/disabled fixtures remain intact across locale, width and zoom

### 5.8 Theme behavior

**THEME-01 — Theme changes presentation without changing meaning.** Light, dark, auto, forced-color และ fixed-export states MUST preserve content, identity, evidence, control meaning and state parity Auto follows platform preference unless reversible explicit user choice exists Static export MUST declare/verify one fixed theme

Interactive HTML MUST offer Auto when both themes exist User choice persists without a first-paint flash that exposes wrong meaning Controls have accessible labels and do not use sun/moon icon alone to imply current vs next state If theme storage fails, system preference/fallback still yields usable content

Acceptance:

- THEME-01-A — automated: theme, explicit preference, metadata and token resolution deterministic; no action/content differs by theme
- THEME-01-B — visual: light/dark/auto/forced-color/export fixtures preserve identity and all contrast gates

### 5.9 Deterministic asset delivery

**ASSET-DELIVERY-01 — Font and icon delivery is deterministic.** Delivered font, interface-icon subset, identity, governed media และ generated vector MUST resolve artifact-owned registry, approved role, source, rights, exact byte hash, typed approval receipt และ fallback Web subsets record glyph map; non-web selects one exact platform mapping, forbids substitution, and final export embeds the exact font or uses an approved vector/raster projection under recorded fixtures

Build Card `assetRegistries` MUST bind each registry by `registryRef`, `sha256`, `schemaRef`; each approved asset MUST bind `approvalReceiptRef` and `approvalReceiptSha256` Receipt grant ต้อง match exact `assetId`, `role`, `sha256`, `allowedFormatProfiles`, `allowedSurfaceRoles`, `allowedAudiences`, `publicationPermission`, `licenseOrPermission` และ `fallback`; interface icon เพิ่ม exact `glyphs` ส่วน identity และ governed media เพิ่ม `altOrTextEquivalent` Identity requires `licenseOrPermission`, `fallback`, `altOrTextEquivalent`; icon requires `glyphs`, `licenseOrPermission`, `fallback`; font requires `fontRole`, `fontFamily`, `fontSubset`, `fontWeight`, `fontFallback`, `licenseOrPermission` Production manifest MUST include matching identity/font/icon/media registry references and exact emitted asset bindings Fonts/icons load from first-party-controlled or explicitly approved durable assets when deterministic delivery is required If delayed/blocked/offline, Thai/Latin text and controls remain readable and actions stay identifiable

Acceptance:

- ASSET-DELIVERY-01-A — automated: file, role, source, approval, rights, hash, Unicode/glyph coverage and fallback resolve; non-web mapping ID/platform/format, substitution policy, embedding/vector policy and fixture IDs resolve exactly
- ASSET-DELIVERY-01-B — visual: delayed/blocked/offline/print/export fixtures have no tofu, identity reconstruction or substitution drift; non-web output retains complete labels and exact selected typography

---

## 6. Navigation และ page orientation

Navigation มีสามระดับที่ต้องไม่ปน:

1. ecosystem — ความสัมพันธ์ระหว่าง Land, Location, Living และ shared Landometer destinations
2. property/product — navigation ของ product หรือ property นั้น
3. page — headings/anchors ภายในหน้า

ระบบ MAY รวมระดับใน disclosure เดียวเมื่อ label และ grouping ชัด แต่ MUST NOT ทำให้ page anchor ดูเหมือน destination ข้าม property หรือทำให้ product-specific route ดูเป็น shared portfolio route

`navigation.destinations[].current` เป็น scoped enum ไม่ใช่ boolean: `none` = ไม่ใช่สถานะปัจจุบัน, `page` = route ของหน้าปัจจุบัน และ `location` = anchor ของตำแหน่งภายในหน้าปัจจุบัน งาน interactive ที่ `mode` ไม่ใช่ `none` MUST มี `page` exactly one และ `location` zero or one; เมื่อเปิด side bookmark ต้องมี `location` exactly one จึงแสดง current page route และ current in-page location พร้อมกันได้โดยไม่ conflation งาน static document/PDF/deck/social MUST ใช้ `none` ทุก destination เพราะไม่มี live current state; `mode: none` ต้องมี destinations ว่างและไม่สร้าง current ปลอม

### 6.1 Unified navbar

**NAV-01 — Navigation exposes a small set of direct destinations.** Unified navigation MUST preserve ecosystem, property และ page levels โดยไม่ conflation `navigation.brandDestinationRef` MUST resolve exactly one destination `id` whose `role: brand` binds the approved identity control and direct destination; brand consumes one control in every header budget Desktop แสดง visible header controls รวม brand ไม่เกิน 4 และ mobile รวม brand ไม่เกิน 2 ทุก visible control MUST เป็น direct semantic target อย่างน้อย 44 × 44 ตาม selected target profile: CSS px สำหรับ browser และ platform dp สำหรับ native app แม้ใน calmest state

Acceptance:

- NAV-01-A — automated: exactly one brand destination resolves, binds identity, and is counted with every visible header control; control count และ exact target-profile value/unit ผ่าน desktop/mobile budgets ในทุก header state
- NAV-01-B — interaction: `current: page` และ `current: location` อยู่คนละ scope; hover, focus, pressed, open, scroll-calm และ history-restored states รักษา label, destination และ keyboard operation
- NAV-01-C — manual: ไม่มี coordinate click-forward overlay หรือ wake-first target substitution

#### Navbar anatomy

| Zone | Contract |
|---|---|
| brand | approved identity implementation, direct destination, clear current relation |
| primary destinations | no more than remaining control budget; descriptive text preferred |
| utility | language/theme/login/menu only when needed; each consumes budget |
| disclosure | contains overflow ecosystem/property/page groups with headings |
| status | current location is visible and programmatic; not color alone |

Header MAY change surface opacity, spacing หรือ visual emphasis while scrolling แต่ semantic targets, accessible names, focus ring, order และ 44 × 44 geometry ใน selected unit MUST remain direct and stable Calm state MUST NOT shrink target ลงครึ่งหนึ่ง, require first wake click หรือ forward coordinates to hidden targets

At narrow widths preserve in this order: brand recognition → current location → primary task → language/access needs → lower-priority routes inside disclosure

### 6.2 Disclosure behavior

**NAV-02 — Navigation uses disclosure semantics.** Browser navigation disclosure MUST ใช้ button ใน DOM order ที่สัมพันธ์กับ trigger มี accessible name และ synchronized `aria-expanded`, keyboard-operable, predictable focus restoration และ MUST NOT ใช้ menu roles เว้นแต่ implement full application-menu keyboard model Native app disclosure MUST ใช้ platform-native disclosure control/view ที่มี name, expanded/collapsed meaning, operation และ focus restoration เทียบเท่ากันใน native view order + platform accessibility traversal order; native branch ไม่รับข้อบังคับ browser DOM/ARIA

Acceptance:

- NAV-02-A — automated: browser button/name/DOM order/`aria-expanded` หรือ native control role/name/state/view/accessibility order ถูกต้องตาม runtime
- NAV-02-B — interaction: browser Enter, Space, Escape, Tab, outside activation และ route change หรือ native equivalent inputs/lifecycle ให้ open/close/order/focus behavior ที่คาดเดาได้

Browser disclosure content MUST อยู่ใน DOM order ที่สัมพันธ์กับ trigger, ไม่ trap focus โดยไม่จำเป็น, ปิดด้วย Escape และคืน focus ไป trigger เมื่อเหมาะสม Native disclosure content MUST อยู่ใน native view order และ platform accessibility order ที่สัมพันธ์กับ trigger, รองรับ platform-equivalent close/back action และคืน focus ตาม platform convention Link/navigation view เป็น destination; button/action view เป็น state/action ห้าม styling generic container เป็น primary control

### 6.3 Side bookmark

**BOOKMARK-01 — Side bookmark is a secondary page index.** Build Card MUST declare sibling fields `navigation.sideBookmark: selected | omitted` และ `navigation.sideBookmarkUserBenefit` เสมอ Selection กับ reusable-component inventory เป็น contract เดียวกัน: `selected` MUST มี `component.bookmark.side.01` ใน `composition.componentIds` พอดีหนึ่งครั้ง ส่วน `omitted` MUST ไม่มี ID นี้ เมื่อเป็น `selected` ใช้ได้เมื่อมี useful stable sections อย่างน้อย 2 และ `navigation.sideBookmarkUserBenefit` MUST เป็น nonempty string ที่อธิบาย orientation value ต่อผู้ใช้; เมื่อเป็น `omitted` ค่า `navigation.sideBookmarkUserBenefit` MUST เป็น `null` ห้ามละ field นี้และห้ามสร้าง object ซ้อน `sideBookmark.selection` หรือ `sideBookmark.userBenefit` เมื่อ selected แล้ว bookmark MUST mirror real heading anchors, แสดง `current: location` โดยไม่พึ่งสีอย่างเดียวเมื่อเป็น interactive, ไม่บัง content และ resolve exact format/runtime component contract ก่อน degrade เป็น mobile disclosure, TOC, PDF bookmark หรือ deck section marker ตาม format Static equivalents รักษา structure/order แต่ใช้ `current: none` เพราะไม่มี live location

Acceptance:

- BOOKMARK-01-A — automated: sibling fields `navigation.sideBookmark` / `navigation.sideBookmarkUserBenefit` ผ่าน branch ที่ active schema กำหนด; `selected` เป็นจริงก็ต่อเมื่อ `composition.componentIds` มี `component.bookmark.side.01` พอดีหนึ่งครั้ง, `omitted` ไม่มี ID นี้, artifact-resolved record มี exact format/runtime contract ที่ตรงกัน และ selected target ทุกอันมีอยู่ครั้งเดียว, accessible label และ current state ที่ programmatic เมื่อ interactive
- BOOKMARK-01-B — visual: rail หายเมื่อ empty และไม่บัง content, controls, browser UI หรือ safe areas

Side bookmark เป็น orientation aid ไม่ใช่ global nav:

- desktop: fixed/sticky rail ได้เมื่อพื้นที่พอและ 44 × 44 direct targets ไม่บังเนื้อหา
- mobile: entries ย้ายเข้า page section ของ navbar disclosure หรือ local TOC ไม่ย่อเป็น rail จิ๋ว
- deep link: landing target ต้องมองเห็น ไม่ถูก reveal-hide และมี scroll offset ชดเชย sticky header
- interactive current state: route ที่เป็นหน้าปัจจุบันใช้ `current: page`; anchor ที่อยู่ใน viewport/history-restored location ใช้ `current: location`; project เป็น `aria-current="page"` หรือ `aria-current="location"`/equivalent พร้อม shape/surface/label ไม่ใช้สีหรือ filled icon อย่างเดียว
- page ที่มี anchor เดียวหรือ headings ไม่ stable: omit rail

---

## 7. Actions และ CTA

### 7.1 Action taxonomy

ทุก Build Card action record MUST declare intent: navigate, inspect, submit, create, save, share, download, external_handoff, draft, confirm หรือ destructive พร้อม hierarchy: primary, secondary, quiet หรือ utility

หนึ่ง scene MUST มี primary CTA ไม่เกินหนึ่ง Secondary action ต้องไม่แข่งขันด้วยขนาด/สี/motion เท่ากัน Evidence links, navigation links และ CTA เป็นคนละ role แม้ใช้ element เป็น link เหมือนกัน

**CTA-01 — Every CTA has one truthful outcome.** CTA ทุกอัน MUST ใช้ specific verb-led label, outcome และ `destinationBinding` จริงหนึ่งอย่าง โดย `kind` ต้องเป็น `anchor | route | external | download | form | contact | command`, target และ `targetByLocale` ต้องตรง syntax/locale/section ที่อ้าง และ `presentation.mode` + `presentation.technique` ต้องตรง selected format; CTA ต้องตรง availability/permission และแยกออกจาก navigation, evidence link และ decoration ได้

Acceptance:

- CTA-01-A — automated: CTA record มี label, outcome, availability และ locale-complete `destinationBinding` ซึ่ง kind, target syntax, resolved anchor, presentation mode และ technique ตรง selected format
- CTA-01-B — interaction: activation ให้ outcome ที่ระบุเพียงครั้งเดียว, เก็บ input/state เมื่อ fail และแสดง result ที่รับรู้ได้
- CTA-01-C — automated: intent, priority, availability, orthogonal consequence, permission/confirmation policy, immutable progress/result/recovery/receipt contracts และ locale-specific label/outcome/destination fields satisfy action schema

`web_public` และ `app_interactive` ใช้ `presentation.mode: direct` + `direct_control` เท่านั้น ส่วน `document_flow`, `pdf_fixed`, `deck_presentation` และ `social_static` MUST ใช้ `static_equivalent` ตาม `machine.contracts.formatPacks.ctaDestinationContract` งาน static ห้ามวาด fake button เพื่อสื่อว่ากดได้ `command` ใน static format แสดงได้เฉพาะ explicit `instruction`; social static ไม่รองรับ `anchor` หรือ `command` และใช้ได้เฉพาะ route/external/download/form/contact เป็น `destination_cue`

Examples:

| Weak | Better | เหตุผล |
|---|---|---|
| Learn more | อ่านวิธีการ | ระบุสิ่งที่จะเปิด |
| Submit | ส่งคำขอรับข้อมูล | ระบุ consequence |
| Click here | ดูหลักฐานของคะแนนนี้ | ระบุ object |
| AI ready | ตรวจสิ่งที่ agent อ่านได้ | ไม่รวม permission/action readiness |

`consequence` MUST เป็น object `{class, external, cost, reversible}` โดย `class` ใช้ `none | reversible | irreversible | destructive`, `external` เป็น boolean, `cost` ใช้ `none | possible | known` และ `reversible` เป็น boolean ห้ามใช้ `external` หรือ `costly` เป็น class

Consequential Build Card action—เมื่อ class ไม่ใช่ `none`, `external: true` หรือ cost ไม่ใช่ `none`—MUST มี confirmation proportional to risk และ bind immutable definition objects: `permissionContract`, `progressPresentationContract`, `resultPresentationContract`, `recoveryContract` และ `receiptSchemaBinding` สี่ action-contract bindings แรกใช้ `{ref, sha256, schemaRef, schemaSha256}` โดย `ref` MAY ชี้ JSON Pointer fragment ที่ resolve ได้ในไฟล์ที่ hash-bound; receipt binding ใช้ `{ref, sha256, schemaId}` ค่าเหล่านี้ bind contract/schema definitions ที่จะใช้ ไม่ใช่ runtime permission, progress, result, recovery หรือ receipt instance Action ที่ไม่ available ต้องบอกเหตุผล ไม่ใช้ disabled mystery control Result contract MUST ครอบคลุม `succeeded`, `failed`, `cancelled`; recovery contract MUST ครอบคลุม `failed` และ `cancelled`

### 7.2 Label integrity

**CTA-02 — CTA labels remain intact.** CTA labels MUST อยู่หนึ่งบรรทัดเมื่อ format รองรับ และ MUST NOT truncated, ellipsized หรือ illegible แก้ pressure ตามลำดับ: approved compact locale label → ลด padding ภายใน target rule → full-width/stack → ย้าย lower-priority action → recompose

Acceptance:

- CTA-02-A — visual: label ครบและอ่านได้ใน supported locale, width, zoom และ export
- CTA-02-B — manual: compact label เป็น approved locale equivalent ไม่ใช่ตัวย่อกำกวม

### 7.3 CTA emphasis

เฉพาะงาน `web_public.browser` หรือ `app_interactive.browser` ที่ interactive เท่านั้น CTA MAY ใช้ observer-based `motion.cta.discovery-cue.01` เพื่อช่วยค้นพบ **primary navigational CTA** ครั้งแรกเมื่อ Build Card ระบุ `requiredUserBenefit: discoverability` การประกาศ cue นี้ trigger `motion` capability และจึง MUST มี `motionDecision: assigned`, motion assignment และ hash-bound browser motion config ครบ Recipe ต้อง bind `machine.tokens#/motion/ctaDiscoveryCue` และใช้ trigger, repeat count, duration ceiling, easing และ geometry ตรง token; stateful/consequential CTA, repeated exposure หรือ cue ที่ไม่มี benefit record ห้ามใช้ แต่:

- real label/background/border ต้องอ่านได้โดยไม่พึ่ง effect
- effect layer ต้อง aria-hidden และ pointer-inert
- run exactly once on first visible entry per page load; re-entry MUST NOT repeat และห้าม loop/flicker — MOTION-04 และ MOTIF-04 ไม่เปลี่ยน cue นี้ เพราะเป็น motion เหนือ primary action ซึ่งยังห้ามเป็น ambience (เจ้าของยืนยัน 15 กันยายน 2569)
- browser reduced-motion/observer failure ใช้ `no_cue_final_state`; `staticEquivalent: emphasis_without_motion` อธิบายความหมาย fallback ของ cue เมื่อแปล format เท่านั้น
- effect ห้ามบัง focus, progress, error หรือ confirmation
- ถ้าทดสอบ user benefit ไม่ได้ ให้ omit

งาน `app_interactive.native`, document, PDF, deck และ social MUST มี `ctaDiscoveryCueAssignments: []` แม้ source experience เคยมี animated cue Native app ที่ต้องการ emphasis ใช้ finite native-state feedback จาก selected `native_state` config โดยไม่อ้าง observer recipe; static format ใช้ hierarchy ปกติ เช่น weight, surface, border, spacing, working link, destination cue หรือ instruction โดยไม่ประกาศเป็น motion assignment และไม่วาด fake button

---

## 8. Motion และ interaction for user benefit

### 8.1 Benefit gate

**MOTION-01 — Motion must serve the user.** Motion MUST clarify state, sequence, progress, spatial relationship หรือ cause/effect Decorative motion MUST เป็น finite play ที่ subordinate และไม่มี perpetual flicker; การเล่นซ้ำขณะมองเห็นตาม MOTION-04 ใช้ finite play ซ้ำเป็นรอบ ≥ 2,000 ms ไม่ใช่ `animation-iteration-count: infinite`; essential content/action ห้าม depend on animation

Acceptance:

- MOTION-01-A — manual: motion role ทุกอันระบุ user benefit และ static final-state equivalent
- MOTION-01-B — automated: ไม่มี `animation-iteration-count: infinite`, infinite attention animation หรือ unbounded CTA sweep; การเล่นซ้ำที่มีอยู่เป็น finite play ที่ผูกกับ viewport ตาม MOTION-04

Motion decision:

1. ถ้าไม่มี motion ผู้ใช้เสียความเข้าใจหรือ feedback หรือไม่
2. motion เชื่อม cause → effect, source → destination หรือ state A → B ชัดหรือไม่
3. static/reduced version ให้ meaning เดียวกันหรือไม่
4. motion ทำให้ช้าลง, distract, nausea, layout shift หรือ focus drift หรือไม่

ถ้าข้อ 1–3 ตอบไม่ได้ หรือข้อ 4 เป็นจริง ให้ใช้ static state

### 8.2 Riddim Approach Motion

**MOTION-02 — Approach motion is role-gated and fail-open.** ข้อกำหนดแยกตาม runtime อย่างเด็ดขาด Browser approach reveal MAY ใช้ explicit semantic roles จาก motion-riddim-approach-03 แต่ source HTML MUST render final visible state และ enhancement MUST fail open ใน no JavaScript, reduced motion, observer failure, initialization timeout, hidden tabs, focus, deep links, history restoration, back-forward cache และ print Native app motion MUST resolve `native_state` config และใช้ native state-transition lifecycle: platform reduced motion, backgrounding, interruption, cancellation, restoration, view disposal, native view order, platform accessibility traversal order และ complete final state; native branch MUST NOT require HTML, JavaScript, IntersectionObserver, browser history/BFCache หรือ print behavior

Acceptance:

- MOTION-02-A — automated: browser source/reduced states และ native reduced/complete-final states expose all content; hero, LCP media, page title, first answer, primary proof, primary action, task-critical state, status, focus target และ deep-link target never reveal-hidden
- MOTION-02-B — interaction: browser observer/lifecycle failure หรือ native background/interruption/cancellation/restoration/view-disposal fixture settle complete visible usable final state; native view/accessibility order ไม่เปลี่ยน meaning

Explicit reveal roles:

| Role | Use | From |
|---|---|---|
| approach.soft | supporting section group | opacity + 32px block rise + scale 0.985 |
| approach.inline-start | paired comparison/relationship | opacity + 36px logical inline offset |
| approach.inline-end | paired comparison/relationship | opacity + 36px opposite logical inline offset |
| media.arrival | non-LCP editorial/atmosphere media | opacity + transform only |
| stagger.child | small related group after parent is settled | 150ms step, cap 450ms |

Never apply broad selector เช่น every card/every heading และไม่ซ้อน parent/child reveal ที่เวลาไม่ sync First answer/proof/action ไม่ใช่ decorative reveal role

#### Browser observer motion tokens

| Token | Value |
|---|---:|
| approach.opacity.duration | 760ms |
| approach.transform.duration | 920ms |
| media.arrival.duration | 900ms |
| approach.block.distance | 32px |
| approach.inline.distance | 36px logical |
| approach.scale.from | 0.985 |
| approach.stagger.step | 150ms |
| approach.stagger.cap | 450ms |
| approach.stagger.beatCount | 4 |
| approach.stagger.formula | `min(zeroBasedSiblingIndex, 3) × 150ms` |
| approach.opacity.easing | cubic-bezier(.16,1,.3,1) |
| approach.transform.easing | cubic-bezier(.2,.9,.25,1.08) |
| interaction.press.easing | cubic-bezier(.3,0,.6,1) |
| observer.threshold | 0.14 |
| observer.rootMargin | 0px 0px -12% 0px |
| initialization.watchdog | 2400ms |
| reached-content failsafe | two animation frames after passive audit |

Browser runtime เท่านั้น: หนึ่ง document root ใช้ shared IntersectionObserver หนึ่งตัว; approach reveal เล่นซ้ำเมื่อ element กลับเข้า viewport (replay on re-entry ตาม OWNER-MOTION-01) และไม่วนซ้ำขณะ element ยังอยู่นิ่งในจอ เพราะ content reveal ที่วนจะกลายเป็น perpetual flicker ซึ่งยังห้ามอยู่ Within each declared stagger group, zero-based sibling index `i` MUST receive delay `min(i, 3) × 150ms` จึงมี four beats 0/150/300/450ms และ item ที่ 4 ขึ้นไปใช้ cap 450ms; group order MUST follow semantic reading order Pre-paint bootstrap MAY arm pending state เฉพาะ normal motion + observer available และ MUST start 2400ms watchdog Ongoing passive scroll/resize/pageshow audit waits two frames after a target reaches/passes effective root, then forces final state if callback missed Adapter MUST NOT render source final → hidden → final flash

Native runtime ใช้ `capability-config.schema.json#/$defs/motionNativeState` โดยต้องมี `mode: native_state`, `feedbackDurationMs`, `stateDurationMs`, `maximumTransitionMs`, `reducedMotionFinalState: final_state`, `layoutGeometry: stable` และ `interruptionFinalState: final_state` งาน QA MUST ทดสอบ platform reduced motion, backgrounding, interruption, cancellation, restoration, view disposal, complete final state และ native view/platform accessibility traversal order หลักฐาน native ห้ามอ้าง no-JS, observer, BFCache หรือ print fixture แทน

CTA discovery cue เป็น browser-only recipe: first visible entry, one run per page load, 540ms with 600ms ceiling, `cubic-bezier(.16,1,.3,1)`, inline highlight sweep from −120% to 120% with 28% band, content opacity never below 1, zero layout movement, pointer-inert; re-entry does not repeat Browser reduced motion/observer failure uses no-cue final state Native app ไม่ใช้ cue นี้และ static format uses non-moving emphasis

Timing เป็น ceiling recipe ไม่ใช่ข้อบังคับให้ทุก scene animate ความเร็วของ feedback/state ยังใช้ token ที่สั้นกว่าตาม consequence

### 8.3 Layout/focus stability

**MOTION-03 — Motion does not disturb layout or reading.** กฎนี้แยกตาม runtime อย่างเด็ดขาด: `browser_observer` entry motion MUST ใช้ opacity และ transform เท่านั้น, zero layout shift, หลีกเลี่ยง nested unsynchronized reveals และใช้ exact motion-riddim-approach-03 timing/distance/logical-direction/four-beat-stagger/reduced-motion recipe; `native_state` MUST ใช้เฉพาะ selected native config + native state-transition lifecycle, รักษา layout geometry, native view order และ platform accessibility traversal order และ MUST NOT require browser observer fields, opacity/transform approach recipe, Riddim distance token หรือ stagger formula; `presenter_sequence` MUST ใช้เฉพาะ selected presenter config, รักษา slide-object order กับ complete governed final frame และ MUST NOT require browser observer, browser approach properties หรือ Riddim stagger tokens

Acceptance:

- MOTION-03-A — automated: runtime class resolve exact branch ของตน—browser ใช้ opacity/transform + exact four-beat Riddim recipe, native ใช้เฉพาะ native config/lifecycle fields, presenter ใช้เฉพาะ presenter config/final-frame fields—ทุก branch รักษา stable layout geometry และ reject field/recipe/test ของอีก branch
- MOTION-03-B — visual: browser reading/focus/scroll order, native view/platform-accessibility order หรือ presenter slide-object order/final frame stable ระหว่างและหลัง motion ตาม branch ที่เลือก

Reduced motion ไม่ใช่ช้าลงแต่คือ final-state-first: remove approach/parallax/sweep, keep necessary state change instant หรือ minimal non-spatial feedback และ preserve progress/status

### 8.4 Other motion modules

- parallax MUST remain disabled in v0.9.7 (MOTIF-03 ห้าม parallax ใน motif ด้วย) Future candidate MAY enable only through named recipe defining purpose, semantic role, maximum travel/rate, input behavior, reduced-motion final state, performance budget and lifecycle QA; identity, evidence, map, chart, UI capture and provider content remain fixed
- data transition MAY เมื่อติดตาม same object/state; exit/enter ห้ามทำให้เทียบค่าผิด
- loading motion MUST มี text/status และ timeout/failure state
- carousel MUST ไม่ autoplay default; user controls visible และ reduced motion usable
- page transition MUST ไม่ delay navigation หรือ hide history-restored content

### 8.5 Identity motion และการเล่นซ้ำตาม OWNER-MOTION-01

**MOTION-04 — Identity motion uses the approved runtime and replays while visible.** The official artwork files never animate. The mark's parts may assemble only through `landometer.motif.v3` kind="logo" (montri-th/motif release 1.2.1; js SHA-256 `3a5caef7918a85885b61dd53e049ea8bf2b0a3cea508f587bb14970bfe6deaf2`, css `7cc2deb475a8d6e4af331407b2b4b741716c458a8ce885e2fb2859374b93912e`) with `logo-full.svg` / `logo-quiet.svg` as the final-state fallback. Bytes are never edited; the wedge stays token-derived (`color-mix(in lch, energy.sky 48%, brand.blue)`), never a sampled hex.

**Repetition (OWNER-MOTION-01, 11 September 2026, outranks every LDS version).** Every animation plays as soon as ≥ 14% of it is in the viewport and replays for as long as it stays visible; it stops when it leaves the viewport. Cycles are repeated finite plays (never `animation-iteration-count: infinite`), ≥ 2,000 ms; the logo cycle is 6,000 ms so its final state stays visible between plays. One page-level pause/resume control exists. `prefers-reduced-motion: reduce`, no-JavaScript and print routes render the final state and start no cycle. State-bound motifs (`motif.progress`) still appear only while the real state runs.

**Still prohibited.** Hue cycling, shape distortion, motion carrying evidence or meaning, motion over the first answer or the primary action, motifs in navigation, favicon or OG images (official identity files only).

ขอบเขตตามคำตัดสินของเจ้าของ 15 กันยายน 2569: กฎนี้ใช้กับ `web_public`, `app_interactive.browser` และ document/PDF/deck ที่ render ในเบราว์เซอร์; ไฟล์ static ที่ export แล้ว (PDF, PPTX, PNG, email) ใช้ final state เท่านั้น การเล่นซ้ำครอบคลุม decorative และ identity motion (motif runtime ทุก kind และ approach reveal เมื่อกลับเข้า viewport) ส่วน CTA discovery cue ยังคงเล่นครั้งเดียวต่อ page load ตาม §7.3 เพราะเป็น motion เหนือ primary action ซึ่งข้อห้ามของกฎนี้ยังคงอยู่ (ยืนยันแล้ว 15 กันยายน 2569) motif อีกห้าตัว (dial, rings, layers, slice, cultivate) และ product overlay อยู่ใต้ §8.6

Machine binding: `machine.tokens#/motion/identity` (runtime ids, hashes, cycle 6,000 ms, observer threshold 0.14 กับ rootMargin `0px 0px -8% 0px`, page control, reduced-motion และ no-JS behavior) และ `machine.contracts.componentContracts#component.motif-frame.01` MotifFrame wrapper ใช้ observer ของตัวเองแล้วเรียก `play()` ของ runtime ทุกรอบขณะมองเห็น (runtime ตั้ง `autoplay="false"`) จึงไม่แก้ byte ของ runtime และไม่พึ่ง attribute `loop` ซึ่งไม่ผูกกับ viewport เมื่อ autoplay ปิด; ปุ่ม pause/resume ระดับหน้าเป็นของ `component.motion-controller.01` ตัวเดียวที่ทุก MotifFrame บนหน้าแชร์

ความต่างที่เจ้าของยอมรับและบันทึกไว้ (15 กันยายน 2569): ไฟล์อัตลักษณ์ PNG มีลิ่ม `#0195CB` และหมุด `#1E4497` ส่วน motif v3 ใช้ลิ่ม token-derived ที่เบราว์เซอร์แสดง ≈ `#1F87CE` และหมุด `#1D4497` (token) รัศมีต่างกัน ≤ 0.6% ไฟล์ PNG ทางการยังเป็น identity of record; motif เป็น animated assembly reference ไม่ใช่ identity file และไม่มีการ re-export PNG

Acceptance:

- MOTION-04-A — automated: runtime js/css bytes ที่ deliver มี SHA-256 ตรงค่าข้างบน; fallback svg ตรง `governance/SHA256SUMS.txt` ของ motif 1.2.1 (`90e9543f…`, `5b6798cd…`); ไม่มี `animation-iteration-count: infinite` ใน delivered CSS; observer threshold/rootMargin/cycle ตรง token; page-level pause control มีอยู่; identity PNG ไม่ถูก animate หรือ redraw; wordmark colour changes ตาม LOGO-01 ใช้ได้ โดยคงรูปทรงและไม่เปลี่ยนสี symbol
- MOTION-04-B — interaction: เข้า viewport ≥ 14% แล้วเล่นทันทีและเล่นซ้ำทุก 6,000 ms ขณะยังมองเห็น; ออกจาก viewport แล้วหยุดค้าง final state; pause แสดง final state ครบ; reduced motion, no-JS และ print แสดง final state โดยไม่เริ่มรอบ
- MOTION-04-C — manual: motion ไม่ทับ first answer, primary action, navigation, favicon หรือ OG image และไม่ถือความหมาย หลักฐาน หรือสถานะใด ๆ

---
### 8.6 ระบบ motion identity: motif หกตัว, สามจังหวะ และ product overlay

กฎหกข้อนี้ถอด spirit ของ Motif Studio (montri-th/motif 1.2.1 · Studio 1.3.0) เป็นข้อบังคับ: motion แสดงวิธีทำงานของ Landometer ไม่ใช่การประดับ ทุก motif ประกาศ job จาก registry ของ manifest, ใช้ byte ตรง, มีฟิสิกส์ที่ร่าเริงแต่มีขอบ, วางตามจังหวะเรื่อง, แยกชั้นร่วมออกจาก product overlay และวางบนพื้นที่วัดค่าแล้วเท่านั้น ข้อความกฎของ MOTIF-01…05 เป็น verbatim จาก rule-drafts r2 ยกเว้นประโยคสุดท้ายของ MOTIF-04 ที่ย้ายไปเป็น MOTIF-06 ตามคำตัดสินของเจ้าของ 16 กันยายน 2569

**MOTIF-01 — Motion shows the method.** Landometer motion enacts the method: parts arrive in the order the work happens — the pin lands (place), the plates set (measure), the wedge points (act). Every motif declares one job from the registry (`orientation`, `opening`, `spatial_transition`, `section_orientation`, `layering`, `quiet_divider`, `action_closure`, `cultural_closure`, `handoff`, `animated_brand_opening`). Motion that enacts no registered job is not used.

Job ต่อ kind ตาม `assets/motif-library.json` (1.2.1, `77e81851…`): dial → orientation, opening · rings → spatial_transition, section_orientation · layers → layering, quiet_divider · slice → action_closure · cultivate → cultural_closure, handoff · logo → animated_brand_opening prohibitedJobs ของทุก kind (data_encoding, evidence, measured_state, loading_state, official_navigation_identity, favicon, co_brand_lockup) ใช้ตามตัวอักษร MotifFrame ปฏิเสธ `job` ที่ไม่อยู่ใน allowedJobs ของ kind นั้น (throw) และ preflight ตรวจซ้ำ

Acceptance:

- MOTIF-01-A — automated: ทุก `<lm-motif>` ที่ deliver อยู่ใน MotifFrame ที่ประกาศ `job` ซึ่งอยู่ใน allowedJobs ของ kind ใน `machine.contracts.motifRegister`; Build Card `motionMoments[]` ระบุ kind, job และ beat ของทุก moment
- MOTIF-01-B — manual: job ที่ประกาศตรงกับสิ่งที่ผู้ใช้ทำอยู่ตรงนั้น (orient, move, layer, close, hand off) ไม่ใช่การตกแต่ง

**MOTIF-02 — Exact bytes, exact landing.** Motifs and the animated mark exist only as registered runtime bytes (`landometer.motif.v3`, montri-th/motif ≥ 1.2.1) with a final-state SVG whose geometry equals the last frame. No redraw, recolor, crop, distortion or tracing from screenshots. `prefers-reduced-motion`, no-JavaScript, print, PDF, deck, email and social routes render the final state. Motion never carries evidence, data, measured state, completion or product capability (prohibitedJobs in the manifest apply verbatim).

Acceptance:

- MOTIF-02-A — automated: runtime js/css และ final-state SVG ทั้ง 12 ไฟล์ที่ deliver มี SHA-256 ตรง `machine.contracts.motifRegister` (ค่าจาก manifest 1.2.1 ตรวจกับไฟล์ใน repo แล้ว); ทุก MotifFrame มี `<noscript>` final-state SVG ของ kind และ variant เดียวกัน
- MOTIF-02-B — manual/visual: เฟรมสุดท้ายของ runtime ทับ SVG final state ได้พอดี; ไม่มีการ recolor หรือ crop

**MOTIF-03 — Joyful physics, bounded.** The motion vocabulary is physical and finite: drop with squash and stretch, pop-overshoot placement, four-beat stagger (0/150/300/450 ms), step-out-and-return finale, hop (product stings). Not permitted: hue cycling, identity morphing, geometry distortion, parallax, unbounded ambient loops, scale overshoot beyond 1.16. A motif runs 1.2–3.4 s; a cycle is ≥ 2,000 ms (logo 6,000 ms) under OWNER-MOTION-01; one page-level pause/resume control exists.

Acceptance:

- MOTIF-03-A — automated: ไม่มี `animation-iteration-count: infinite`; MotifFrame `data-cycle-ms` ≥ 2000 (logo 6000); MotionController หนึ่งตัวต่อหน้า; ไม่มี transform scale > 1.16 ใน CSS ที่ deliver นอก runtime bytes
- MOTIF-03-B — interaction: เข้าจอ ≥ 14% แล้วเล่นทันทีและเล่นซ้ำตามรอบ; พ้นจอแล้วหยุดค้าง final state; pause ค้าง final state; reduced motion/no-JS/print ไม่เริ่มรอบ

**MOTIF-04 — Three beats, three moments — the joy budget.** Motifs are placed at the story beats INTENT → AHA → NEXT ACTION, aligned with the BRAND rhythm's Opening / Transition / Closing: Opening = `logo` (animated brand opening) or `dial` (orientation); Transition = `rings` (spatial transition) or `layers` (layering / quiet divider); Closing = `slice` (action closure) or `cultivate` (cultural closure / handoff). A long route carries at most three motion moments; a task surface carries one. Motifs never sit on the first answer, the primary proof or the primary action. Where a motif may sit is governed by MOTIF-06.

Acceptance:

- MOTIF-04-A — automated: Build Card `motionMoments[]` ≤ 3 ต่อ route (≤ 1 ต่อ task surface) และแต่ละ moment มี beat ที่ตรงกับ kind ตามตารางข้างบน; ไม่มี MotifFrame ในบริเวณที่ทำเครื่องหมาย `data-region="first_answer|primary_proof|primary_action"`
- MOTIF-04-B — manual: จังหวะที่วางตรงกับเรื่อง (INTENT → AHA → NEXT ACTION); พื้นที่วางตรวจตาม MOTIF-06

**MOTIF-05 — Shared layer versus product overlay.** `landometer.motif.v3` is the product-neutral shared layer. Product animated identities are separately registered overlays with their own final fallback, duration, minimum size and host surface (`ijji.logo-sting.r3` exists: Hop → Bodies → Tagline → Hello → Hold, 9.0 s full / 6.4 s mark-only, ≥ 320 / 160 px). CityMETER, CityWiki and CityChat stings are produced in the Motif Studio under the same contract and enter the manifest with SHA-256 and owner approval before the DS references them. Families are never mixed in one lockup; navigation, favicon and OG images use official identity files, never motifs.

ทะเบียน product overlay ของ release นี้อยู่ใน `machine.contracts.motifRegister#/productOverlays` ตามคำตัดสินของเจ้าของ 15 กันยายน 2569: `ijji.logo-sting.r3` (runtime `1a1d1bc2…`, stills `bb1bc80e…` / `acac2c65…`) และ `ijji.four-beat.selected-3.r3` (state-bound: graph-b, rings-c, rotate-b; ใช้เฉพาะขณะมี pending operation จริง มี status text และปุ่ม cancel) อนุมัติแล้วใน manifest 1.2.1 · CityChat conversation set (SVG 7 ไฟล์ + `citychat-motif-motion.js/.css`) อนุมัติโดยเจ้าของตาม bytes ปัจจุบันของ repo (commit a99f3c1e) โดยป้าย candidate ของทะเบียนต้นทางเป็นบันทึกประวัติ ณ วันที่รับ bytes ไม่ใช่ข้อสรุปสถานะเว็บปัจจุบัน; ใช้ approval/hash record ที่ส่งพร้อม Add-on แยกของผลิตภัณฑ์ · CityMETER และ CityWiki stings มี historical pre-approval; ใช้ได้ต่อเมื่อ current product registry มี approved bytes และ exact hash จริง overlay ทุกตัวใช้ได้เฉพาะงานของผลิตภัณฑ์นั้น ไม่ผสมกับ shared motif ใน lockup เดียว และไม่สร้าง product fact ใด ๆ (สี ความหมาย ความสามารถของผลิตภัณฑ์อยู่ใน Product Brief/Add-on ของผลิตภัณฑ์นั้น)

Candidate briefs สำหรับ Studio 1.4 (ยังไม่ได้วาด ไม่ใช่ asset): `receipt` — closure เมื่อออกใบรับตัวเลข/decision log (job: handoff) · `compare` — transition ของสองพื้นที่เคียงกัน (job: spatial_transition) · `citymeter.pending` — ตระกูล state-bound (ต้องมี status text และ cancel ที่ทำงานจริง) · product stings ของ CityMETER / CityWiki / CityChat

Acceptance:

- MOTIF-05-A — automated: overlay ที่ deliver อยู่ใน `machine.contracts.motifRegister#/productOverlays` ด้วย hash ตรงและ `approval.status: owner_approved`; productScope ของ overlay ตรงกับ product layer ของ Build Card; ไม่มี overlay กับ shared motif ใน lockup เดียว
- MOTIF-05-B — manual: overlay ไม่ถูกใช้แทน official identity ใน navigation, favicon หรือ OG image และไม่สื่อความหมายเชิงหลักฐาน

**MOTIF-06 — Every motif sits on a measured carrier.** A motif's colours are fixed by its governed file, so its legibility is decided by the ground it sits on. Every placement — a MotifFrame or a static final-state image — declares that ground, and a placement is allowed only when `machine.contracts.motifRegister#/carrierPolicy` lists its kind × variant × carrier for every theme the output renders: every visible authored paint composites at 1.30:1 or more on the carrier (a gradient at its worst stop). `full` variants (Brand Blue ink) sit only on plain light carriers; `quiet` variants (one sky ink) sit only on deep carriers, Brand Blue included. A `full` variant never sits on Brand Blue, on a dark surface or on any atmosphere gradient. Runtime renditions keep the governed inks (`ink="blue"` for full, the default sky for quiet). A failing pair is fixed by changing the carrier, then the variant, then the size or spacing, then by removing the motif — never on the asset: no recolour, plate, scrim, new tint, or opacity carrying meaning.

ที่มา: `motif-quiet-fallback.json` (landometer-quiet-fallback/1.0) ที่เจ้าของอนุมัติ 11 กันยายน 2569 เป็น normative ของงานที่ใช้ Motif Library 1.2.1 และคำตัดสินของเจ้าของ 16 กันยายน 2569 ให้นำเข้า DS ในรอบนี้แทนประโยคพื้นของแพตช์ r2 ใน MOTIF-04 ซึ่งวัดแล้วขัดกับ bytes: SVG แบบ full ทั้งหกมี Brand Blue `#1D4497` อยู่ในตัว จึงเหลือ 1.00:1 บน Brand Blue (หมุดโลโก้ เส้นฐาน วงใน แผ่นฐาน ตัวพาย และต้นกล้าหายไป) และบน atmosphere ทั้งสี่ชุดมีบางส่วนต่ำกว่า 1.30:1 ส่วน quiet ใช้หมึก energy.sky `#59D2FE` สีเดียว บนพื้นสว่างทุกแบบส่วนที่เข้มที่สุดได้เพียง 1.23–1.74:1 แต่บนพื้นทึบธีมมืดได้ 3.37–10.23:1 และบน Brand Blue 2.74–5.19:1 ครบรูป ตัวเลขทุกค่าวัดใหม่จาก bytes ที่ hash ตรงด้วย `measure-motif-carriers-0.9.4.mjs` (composite 8-bit เหมือนที่จอแสดง) และตรงกับตารางของ ladder ทุกค่า

| variant | วางได้ (ทุก kind เว้นที่ระบุ) | ห้าม |
|---|---|---|
| `full` | `surface.canvas`, `surface.card`, `surface.raised`, `surface.alt`, `surface.soft`, `surface.blueTint`, `surface.beigeTint` ของธีมสว่าง และ `brand.beige` — `layers` ได้เฉพาะ canvas, card และ raised (แถวจางของมันได้ 1.21–1.26:1 บนพื้นสว่างอื่น และ 1.30:1 พอดีเกณฑ์บน canvas) | Brand Blue · พื้นธีมมืดทุกแบบ · atmosphere ทุกชุด · ภาพถ่าย · พื้นของ semantic state |
| `quiet` | `surface.*` ทุกตัวของธีมมืด, `brand.blue`, `atmosphere.ground.current`, `atmosphere.measure.deep` — `layers` ได้เฉพาะพื้นทึบ (บน atmosphere เข้มวงจางที่สุดได้ 1.27–1.28:1) | พื้นสว่างทุกแบบ · `atmosphere.ground.mist`, `atmosphere.measure.luminous` · gradient ของ cultivate, diversity และ product · ภาพถ่าย |

การประกาศ: ทุก MotifFrame และทุกภาพ motif แบบนิ่งบนเว็บ (`data-motif-static="<kind>-<variant>"`) มี `data-host-surface` เป็น carrier id จาก `carrierPolicy.carriers` — id ที่เปลี่ยนตามธีม (เช่น `surface.card`) ถูกตรวจแยกทุกธีมที่งานรองรับ (`<meta name="color-scheme">`; ไม่ประกาศ = ทั้งสองธีม), รูป `<id>@light` หรือ `<id>@dark` หมายถึงพื้นที่ทาค่าธีมนั้นคงที่ทั้งสองธีม และ id ที่ไม่เปลี่ยนตามธีม (`brand.beige`, `brand.blue`, `atmosphere.*`) ใช้ค่าเดียว · `data-variant` คือ variant ของธีมสว่าง และ `data-variant-dark="quiet"` สลับ frame แบบ full บนพื้นที่เปลี่ยนตามธีมให้เป็น quiet ในธีมมืด (MotifFrame สลับ attribute `quiet` ของ runtime และ `<noscript>` มี SVG ทั้งสองแบบใน wrapper `.lds-motif-noscript` ที่ติด `data-theme-variant="light|dark"` ซึ่งเลือกธีมแบบเดียวกับหน้า — `data-theme` ก่อน แล้วจึงค่าของระบบ; `<picture>` ที่ตามเฉพาะค่าของระบบใช้แทนไม่ได้) ซึ่งเป็นการสลับแบบเดียวที่ตารางวัดยอมรับ · MotifFrame ปฏิเสธคู่ที่ไม่อยู่ในทะเบียน พื้นที่ทาจริงที่ไม่ตรงกับที่ประกาศ และค่า `ink` ที่ไม่มีไฟล์รองรับ แล้วถอด frame ออกจากการแสดงผล (ขั้น L5) · งาน export แบบนิ่ง (PDF, deck, social, email) ใช้ตารางเดียวกันกับพื้นของหน้านั้น · Build Card `motionMoments[]` และ `staticMotifPlacements[]` บันทึก `hostSurface`, ค่าพื้นต่อธีม, คอนทราสต์ที่วัด, verdict และขั้นของ ladder ที่ใช้

ลำดับการแก้เมื่อคู่ไม่ผ่าน (ladder L1–L5 ของไฟล์ที่อนุมัติ): L1 วัดกับพื้นจริงที่ขนาดจริง · L2 ย้ายไปพื้นอื่นในตาราง · L3 เปลี่ยน variant (เป็นการเลือก record ไม่ใช่การเปลี่ยนสี) · L4 เพิ่มขนาดหรือระยะว่าง · L5 ถอดลายออก — ถ้าความจริงบนหน้าเปลี่ยนเมื่อถอดลาย แปลว่าลายกำลังทำงานที่ไม่ได้รับอนุญาต ถ้าต้องการ `full` บนพื้นเข้มหรือ Brand Blue ในอนาคต Motif Studio ต้องผลิต final-state record เฉพาะพื้นเข้มแล้วลงทะเบียนพร้อม hash ก่อน (แบบที่ `ijji.four-beat.selected-3.r3` มี record หกพื้น) โลโก้ทำแบบนี้ไม่ได้เพราะหมุดต้องเป็น `#1D4497`

Acceptance:

- MOTIF-06-A — automated: ทุก `.lds-motif-frame` และ `[data-motif-static]` มี `data-host-surface` ที่ resolve ได้ใน `machine.contracts.motifRegister#/carrierPolicy/carriers`; คู่ kind × variant × carrier ของทุกธีมที่งาน render อยู่ใน `carrierPolicy.allowed`; frame แบบ full มี `ink="blue"` และ frame แบบ quiet ไม่มี ink อื่นนอกจาก sky; frame ที่สลับธีมมี SVG ทั้งสองแบบใน `<noscript>` แยก wrapper ตามธีม; `measure-motif-carriers-0.9.4.mjs --register` วัด 12 ไฟล์ × 20 carrier ใหม่แล้วตรงกับทะเบียน; preflight PF-MOTIF-06-CARRIER ผ่าน
- MOTIF-06-B — interaction/visual: ในเบราว์เซอร์ทั้งธีมสว่างและธีมมืด สีพื้นที่ render จริงหลังทุก frame และทุกภาพนิ่งเท่ากับ carrier ที่ประกาศ และทุก paint ของ final-state SVG ได้ 1.30:1 ขึ้นไปบนพื้นนั้น; สลับธีมแล้ว variant เปลี่ยนตาม `data-variant-dark`; frame ที่ถูกปฏิเสธไม่แสดงผล
- MOTIF-06-C — manual: เมื่อคู่ไม่ผ่าน การแก้เดินตาม L1–L5 และบันทึก `quietFallbackRung` ใน Build Card; ไม่มีการ recolor, แผ่นรอง, scrim, สีใหม่ หรือ opacity ที่ถือความหมาย

Machine binding: `machine.tokens#/motion/motifs` (kinds, jobs, beats, cycle, vocabulary, joy budget) และ `#/motion/productOverlays`, `machine.contracts.motifRegister` (ทุกไฟล์พร้อม SHA-256 และสถานะอนุมัติ; `#/carrierPolicy` ถือ carrier, ตารางที่วัด 240 คู่, คู่ที่อนุญาต, ladder, agent fields และ hash ของ ladder กับหลักฐาน), `machine.tokens#/motion/motifs/carrierPolicy`, `measure-motif-carriers-0.9.4.mjs`, `machine.contracts.componentContracts#component.motif-frame.01` และ `#component.motion-controller.01`, `capability-config.schema.json` (`motion.motionMoments[]` พร้อม `hostSurface`, `staticMotifPlacements[]`), `build-kit/preflight-0.9.4.mjs` (job, budget, placement, carrier, hash)

---

## 9. Reusable interaction modules

### 9.1 Loop carousel

**CAROUSEL-01 — Looping carousels keep one semantic cycle.** Loop carousel MUST มี semantic source cycle เดียว Visual clones MUST hidden from accessibility, inert, ไม่มี IDs/IDREF, non-focusable และไม่มี repeated meaningful alternative User controls MUST visible และ autoplay MUST off by default

Acceptance:

- CAROUSEL-01-A — automated: clone audit ผ่าน aria-hidden/equivalent, inert, no duplicate IDs, no focus descendants และ no repeated alternatives
- CAROUSEL-01-B — interaction: previous, next, focus, resize, touch, reduced-motion และ end-to-start preserve context

ถ้ารายการมีเนื้อหาสำคัญต่อการเปรียบเทียบ ใช้ grid/list เป็น default Carousel เป็น progressive presentation ไม่ใช่วิธีซ่อน content density

### 9.2 External social feed

**SOCIAL-FEED-01 — External feeds expose truthful states.** External feed MUST declare idle, loading, loaded, empty, failed และ stale states ตาม applicable, รักษา provider boundary, โหลดหลัง primary content, มี direct fallback และใช้ recency wording เมื่อ freshness verified เท่านั้น

Acceptance:

- SOCIAL-FEED-01-A — interaction: success, timeout, blocked provider, empty/stale response และ no-script มี truthful state/fallback
- SOCIAL-FEED-01-B — visual: provider content ไม่ถูก invert/recolor จน meaning/identity เปลี่ยน

Primary answer, evidence, CTA และ layout MUST ไม่ depend on third-party feed Feed timeout ห้ามทำให้ page loading ไม่จบ

---

## 10. SEO, search, AI และ agent discoverability

### 10.1 แยก Discovery, Readability และ Action

คำว่า SEO-ready, AI-ready หรือ Agent-ready อย่างเดียวห้ามใช้เป็น conformance claim ทุก public artifact MUST รายงานสามชั้นแยกกัน:

| Layer | คำถาม | ไม่ได้พิสูจน์ |
|---|---|---|
| Discovery | audience/crawler ที่ตั้งใจเข้าถึง route ที่ถูกได้หรือไม่ | accuracy, rights, readability หรือ permission |
| Readability | คนและเครื่องตีความ identity, structure, claim และ evidence boundary ได้หรือไม่ | authorization หรือ ability to act |
| Action | คนหรือ authorized agent ทำ task ที่ประกาศอย่างปลอดภัยและได้ receipt หรือไม่ | indexability, ranking หรือ trust |

ก่อน `artifact_qa_passed` ทั้งสามชั้นเป็น universal และ MUST applicable + `pass` พร้อม bundle-local receipt ที่ bind bytes จริง ห้ามใช้ `not_applicable` แทนการตรวจ Action ของ information page; artifact แบบ read-only ต้องพิสูจน์ว่า destination/outcome ที่ประกาศตรงจริง, ไม่มี mutation ที่ซ่อนอยู่ และขอบเขต permission ชัด `fail` หรือ `not_tested` ใช้ได้เฉพาะก่อนถึง artifact QA และต้องมี reason/owner ตาม schema

### 10.2 Stable claims และ machine projection

**CLAIM-MACHINE-01 — Claims have stable machine-readable records.** Material public claim ทุกอัน MUST มี stable claimId และ machine-readable record ซึ่ง wording, entity, locale, scope, explicit authority class/boundary, value/assertion, unit, geography, time basis, source, method, status, confidence/limitation, owner และ last-reviewed date ตรง visible claim

Acceptance:

- CLAIM-MACHINE-01-A — automated: claim IDs unique และ required field มีค่าหรือ explicit not_applicable; public-eligible evidence/provenance refs เป็น stable public HTTPS URL หรือ URN ไม่ใช่ local path
- CLAIM-MACHINE-01-B — manual: sample visible-to-machine comparison ไม่มี scope, value, date, status หรือ evidence drift

#### Claim Record orientation (non-copyable)

ตัวอย่าง YAML นี้ใช้อ่าน field groups เท่านั้น ค่า placeholder ไม่ใช่ valid production data และห้ามคัดลอกไปอ้าง conformance Exact copyable shape อยู่ใน `claim-record.schema.json` และ `claim-record.example.json`

~~~yaml
claimId: immutable-id
textByLocale:
  th-TH: approved visible proposition
  en: approved equivalent proposition
claimType: fact | measurement | estimate | comparison | interpretation | commitment | capability | status
entity:
  entityId: stable-entity-id
  entityType: governed-entity-type
  name: approved-entity-name
proposition:
  assertion: approved proposition independent of layout
  valueState: not_applicable | stated | measured | estimated
  value: null
  unit: null
scope:
  productScope: shared_landometer | named_product
  portfolioDomain: shared | land | location | living
  product: null
  geography: null
  audience: declared-audience
  timeWindow: declared-time-window
authority:
  class: portfolio_owner_approval | product_owner_approval | implementation_observation
  authorityRef: stable-public-https-or-urn
  authorizes: portfolio_truth | named_product_truth | observed_usage_only
  observedSubjectId: null
status: approved
evidenceRefs: [stable-evidence-id]
methodologyRef: stable-method-id
dataGrain:
  entity: governed-entity-type
  geography: null
  time: declared-time-window
  unitOfObservation: null
  denominator: null
  aggregation: null
schemaRelease: null
contentRelease: exact-content-release
provenance:
  source: approved-source
  transformation: concise-summary
  owner: accountable-owner
  reviewedAt: ISO-8601
  integrityRef: sha256:64-lowercase-hex
rights:
  status: public | internal | restricted | licensed | unknown
  publicationPermission: true | false
  conditions: null
confidence:
  kind: not_applicable | qualitative | quantitative
  value: null
  explanation: null
limitations:
  - id: stable-limitation-id
    textByLocale:
      th-TH: ข้อจำกัดที่เฉพาะเจาะจงและจำเป็นต่อการตีความ
      en: specific limitation required for interpretation
lastReviewed: ISO-8601
validityBasis: timeless | bounded_interval | until_superseded
validFrom: null
validUntil: null
supersedes: []
publicProjectionEligible: true | false
~~~

Canonical schema and fixtures are `claim-record.schema.json`, `claim-record.example.json` (portfolio protected-line authority) และ `claim-record-rebuild02-usage.example.json` (named implementation observation) `validityBasis: timeless` requires both dates null; `bounded_interval` requires `validFrom` and `validUntil` and the artifact `claimAsOf` must fall inside; `until_superseded` requires a reached `validFrom` and null `validUntil` Measurement/estimate/comparison types trigger stricter value, unit, evidence, method, schema-release and confidence constraints An empty evidence list requires `noPublicEvidenceReason` and can never become a public-eligible projection Changing punctuation/layout MAY keep claimId Changing proposition, authority, scope, denominator, geography, time window หรือ method MUST create new claimId Superseded/withdrawn/expired claim remains auditable but not current Machine projection MUST NOT broaden scope Public/indexable projection requires approved status, at least one stable public evidence reference, public provenance reference, verifiable SHA-256 integrity, current validity at `claimAsOf`, locale text covering every delivered locale exactly, and rights public or licensed with explicit publication permission; unknown/restricted, expired, locale-incomplete or local-only references block it

`portfolio_owner_approval` เท่านั้นที่ authorize protected portfolio wording; record นั้นใช้ `portfolio_truth` และ `observedSubjectId: null` `implementation_observation` ต้องใช้ `observed_usage_only`, ระบุ named observed subject/product/time window และห้าม entity type `protected_brand_line` Rebuild02 observation จึงพิสูจน์ได้เพียงว่าหน้านั้นใช้ข้อความอะไร ณ เวลาที่สังเกต ไม่อาจอนุมัติ portfolio line, product capability หรือ cross-portfolio conformance

Claim ไม่มี asset-style approval receipt และ MUST NOT ใช้ `approvalReceiptRef`/`approvalReceiptSha256` เป็นหลักฐาน claim eligibility Public/eligible claim resolve ผ่าน hash chain เท่านั้น: Build Card `publication.claimManifestRef` + `claimManifestSha256` → manifest `records[].claimId`, `recordRef`, `sha256`, `status`, `publicProjectionEligible` → exact claim-record bytes พร้อม status, rights/publication permission และ scope ที่อนุญาต Manifest hash หรือ record hash ที่ mismatch blocks projection

### 10.3 Initial HTML และ hydrated parity

**DISCOVERY-01 — Initial and hydrated meaning are equivalent.** Public page MUST expose title, primary answer, headings, material claims, evidence links, destinations และ language relationship ใน initial semantic HTML; hydration MUST NOT replace, contradict หรือ hide meaning นั้น

Artifact ที่ claim `artifact_qa_passed` หรือสูงกว่าสำหรับ `web_public` MUST มี `delivery.primaryHtmlBinding` ซึ่งตรงกับ entry `text/html` หนึ่งไฟล์ใน `delivery.files` ทั้ง path, media type และ SHA-256 Validator MUST parse bytes ของไฟล์นั้นจริงและเทียบ `html lang`, unique title/description/robots, canonical, hreflang, Open Graph, strict JSON-LD, visible H1, marked primary answer, exact claim + limitation text, evidence destination, navigation/action label + destination และ visible locale links กับ discovery/structured-data/claim/action contracts Content ที่ hidden, inert, `aria-hidden`, non-rendered, transparent, clipped หรือ visually hidden MUST NOT satisfy visible truth การมี declaration ที่ถูกต้องแต่ final initial HTML ไม่ตรงยังเป็น failure `delivery.webDiscoveryEvidence` MUST bind artifact/build/primary HTML identity และ exact no-script, hydrated-DOM, accessibility-tree, internal-locale-link กับ sitemap evidence; Production probe และ resolved production evidence MUST bind hash ของ primary HTML นี้โดยตรง

Acceptance:

- DISCOVERY-01-A — automated: exact hash-bound delivered primary initial HTML parse แล้วตรง governed lang, unique metadata, canonical/hreflang/social, strict JSON-LD, visible H1, exact marked primary answer, claim/limitation, evidence และ action/navigation destinations; hidden/non-rendered truth ใช้ผ่านไม่ได้; hash-bound no-script, hydrated DOM และ accessibility-tree snapshots ยังรักษา exact primary meaning/destinations และ receipt cite evidence ทั้งสาม
- DISCOVERY-01-B — production: deployed canonical URL ตอบ crawlable success, observed content hash เท่า bound primary initial HTML และมี primary content เดียวกัน

Equivalent หมายถึง approved proposition และ destination เดียว ไม่ต้อง byte-identical Primary H1, first answer, primary proof/action, canonical, locale, robots, structured claims และ evidence scope ห้ามรอ JavaScript Fonts, analytics, embeds, personalization และ motion fail แล้ว core meaning/action ยัง usable `data-primary-answer`, `data-claim-id`, `data-evidence-for` และ `data-action-id` เป็น machine anchors ของ visible contract: ต้องอยู่บน element ที่มองเห็นและ text/target ต้องตรง exact governed projection Source DOM snapshot, accessibility summary หรือ metadata declaration ที่ไม่ได้ bind exact delivered primary HTML/build/observation bytes ไม่ใช่หลักฐานผ่าน

### 10.4 Canonical, locale และ route graph

**DISCOVERY-02 — Canonical, locale, index, and sitemap signals agree.** Indexable page ทุกหน้า MUST มี stable self-canonical URL หนึ่งอัน, explicit language alternates เมื่อมี equivalent, consistent robots/sitemap treatment, working language links และไม่มี automatic language redirect ที่ขัด discovery/user choice

Acceptance:

- DISCOVERY-02-A — automated: canonical, hreflang, HTML lang, robots, social metadata, JSON-LD identity, hash-bound delivered sitemap, visible internal locale links และ hash-bound internal-locale-link snapshot เป็น exact governed graph; sitemap loc set เท่ากับ governed locale route URLs และ receipt cite no-script/hydrated/accessibility/sitemap/internal-locale evidence ครบ
- DISCOVERY-02-B — production: canonical/alternate URLs resolve โดยไม่มี loop, soft error หรือ locale-forcing redirect

Rules:

- one public concept → one canonical route per locale
- canonical ต้อง absolute, final-success และอยู่ใน initial HTML
- internal links กับ sitemap ใช้ canonical routes ไม่ใช้ tracking/preview/redirect URLs; visible internal links และ sidecar snapshot ต้อง bind exact locale/destination set เดียวกัน
- equivalent locale pages มี distinct stable URLs, self-canonical และ reciprocal hreflang
- language control มองเห็นและใช้ ordinary links; missing translation explicit
- x-default MAY ใช้กับ neutral selector ที่เป็นจริงเท่านั้น
- MUST NOT redirect จาก Accept-Language, IP guess หรือ crawler locale อย่างบังคับ Remembered preference MAY เสนอแบบ reversible โดย requested URL ยังเข้าถึงได้
- sitemap ที่ governed contract รวมไว้ MUST เป็น delivered file, hash-bound และมี exact governed locale-route `loc` set; lastmod เปลี่ยนเมื่อ meaningful content/structured-data/link change ไม่ใช่ทุก deployment
- removed route ใช้ intentional redirect, gone หรือ not-found; ห้าม unrelated success page

### 10.5 Page identity, page kind และ structured data

Indexable page MUST มี unique descriptive title, matching description, one primary H1, correct lang, canonical/alternates, route-appropriate index policy และ share metadata ที่ตรง visible page

เลือก human archetype ก่อน แล้ว map ไปยังค่า machine `pageKind` ที่ schema อนุญาตเท่านั้น: `portfolio_home | product_landing | detail | article | index | tool | dataset | search_results | utility`

| Human archetype | Allowed machine `pageKind` | Visible requirement | Typical projection; only when truthful |
|---|---|---|---|
| portfolio home | `portfolio_home` | identity, scope, product architecture, primary routes | page entity includes `WebSite`, `WebPage`, or `CollectionPage`; `Organization` is a separate approved subject when applicable |
| product overview | `product_landing` | product scope, audience, capability boundary, evidence, next action | page entity includes `WebPage`; product/application identity is a claim-bound subject, not an inferred page type |
| methodology | `article` or `detail` | question, input, grain, method, limits, version, example | `Article`/`BlogPosting` for `article`; `WebPage` for `detail` |
| evidence/report | `dataset`, `article`, or `detail` | question, evidence, method, result, limits, source trail | `Dataset`/`DataCatalog`, `Article`/`BlogPosting`, or `WebPage` according to the selected kind |
| collection/index | `index` | purpose, membership, relationships | page entity includes `CollectionPage` or `ItemList` |
| place profile | `detail` | verified geography, boundary, time, grain, evidence | page entity includes `WebPage`; `Place` is a claim-bound subject when verified |
| article/update | `article` | author/publisher/date/body/references | page entity includes `Article` or `BlogPosting` |
| FAQ | `article` or `detail` | genuine visible current questions/answers | governed page type is `Article`/`BlogPosting` or `WebPage`; `FAQPage` is not in this release's type enum |
| interactive tool | `tool` | declared input, output, limitations, privacy and safe action | page entity includes `WebApplication` or `SoftwareApplication` |
| search results | `search_results` | query context, result scope, empty/error state | page entity includes `SearchResultsPage` |
| contact or other utility | `utility` | responsible party, channel, expectation, privacy | page entity includes `WebPage` or `ContactPage` |
| authenticated utility | `utility` | private task/state/evidence | normally no public projection beyond approved shell; if projected, page entity includes `WebPage` or `ContactPage` |

**DISCOVERY-03 — Machine discovery never overstates permission or quality.** Structured data MUST describe visible approved truth และ match page kind Sitemap, robots, crawler access และ optional llms navigation เป็น discovery controls เท่านั้น ไม่ใช่ evidence, permission, licensing, readiness, ranking หรือ quality guarantee

Acceptance:

- DISCOVERY-03-A — automated: initial HTML มี JSON-LD document เดียวที่ root มีเฉพาะ `@context` + `@graph`, context เป็น `https://schema.org`, graph entity set ตรง governed projection และแต่ละ entity มีเฉพาะ exact `@id`, `@type`, `name`, `url`; property/entity/type/claim/permission/readiness/ranking/quality ที่เพิ่มเองเป็น blocking overclaim
- DISCOVERY-03-B — manual: ไม่มี discovery file/crawler directive ถูกอ้างเป็น authorization, evidence หรือ ranking promise
- DISCOVERY-03-C — manual: indexable route passes distinct question, answer/task, material content, evidence and maintained-owner useful-page test
- DISCOVERY-03-D — automated: crawler decisions purpose-separated; optional AI navigation derives canonical public routes only and carries no permission/readiness meaning

Structured data:

- ต้องมี `role: page` เพียงหนึ่ง entity และใช้ `identityBasis: canonical_page`; `url` ต้องเท่า projection `canonicalUrl`, `nameByLocale` ต้องเท่า visible `titleByLocale` และ `types` มีอย่างน้อยหนึ่งค่าที่ตรง strict `pageKind` mapping ในตารางด้านบน
- `role: subject` ทุก entity ใช้ `identityBasis: projected_claim_entity`; `claimIds` ทุกตัวต้อง resolve approved record และ subject `entityId` ต้องเท่า `record.entity.entityId`
- use stable entity IDs and approved identity/claim records; entity ID ห้ามเดาจาก page copy หรือ schema type
- initial HTML JSON-LD ใช้เฉพาะ property ที่ structured projection นี้ govern; ห้ามเติม date, image, status, rating, review หรือ field อื่นแม้ค่าดูจริง จนกว่าจะเพิ่มเข้า active governed schema/projection/visible-truth contract
- omit unknown; never invent rating, review, price, award, audience reach, coverage หรือ capability
- valid syntax ไม่เท่ากับ eligibility/ranking/endorsement
- remain equivalent before/after hydration

สำหรับ `web_public`, `publication.discovery.structuredDataBindings[]` และ `crawlerPurposePolicy` MUST เป็น bundle-local `{ref, sha256, schemaRef}` ที่ resolve active schema/bytes จริง Structured entity names ครบทุก delivered locale และ union ของ `entities[].claimIds` ต้องครอบคลุม projected claim IDs เท่ากันพอดี Crawler policy ต้องตัดสิน `search_indexing`, `ai_search_retrieval`, `model_training`, `archival`, `monitoring`, `agent_action` อย่างละหนึ่งครั้ง; `agent_action` ใช้ได้เพียง `disallow` หรือ `conditional` และไม่เคยเป็น execution authority Active Artifact Manifest contract สำหรับ web MUST project `delivery.metadataProjection` เท่ากับ Build Card `publication.discovery` ทุก field และ MUST prove projection parity จาก parsed `delivery.primaryHtmlBinding` bytes พร้อม hash-bound `webDiscoveryEvidence`; การ drift ของ canonical, locale, visible answer/claim/action/evidence, social preview, JSON-LD entity/property, sitemap/internal locale, structured binding หรือ crawler policy blocks conformance

### 10.6 Useful page test

Route ที่ตั้งใจ index MUST มี distinct user question, distinct answer/task, material visible content, adequate evidence และ maintained owner Keyword, city, audience หรือ query variant อย่างเดียวไม่พอสร้างหน้าใหม่

Reject:

- near-duplicate page factory
- AI rewrite ที่ไม่มี evidence/user benefit ใหม่
- location page นอก approved data coverage
- hidden text หรือ crawler-only claim
- page ที่มีไว้ชี้ machine ไปหน้าอื่นอย่างเดียว
- FAQ variants ที่สร้างเพื่อ coverage โดยไม่มี genuine user need

Similar routes MUST ผ่าน differentiation test หรือ consolidate/redirect/noindex/remove ตามจริง จำนวนหน้า/URL/keyword ไม่ใช่ DS quality target

### 10.7 Crawler purpose, robots และ optional llms navigation

Search discovery, AI search retrieval, model training, archival access, monitoring และ agent action เป็นคนละ purpose Owner ต้องอนุมัติ policy ตาม crawler purpose + route class

- robots is not access control; restricted content ต้องใช้ authorization จริง
- allowing crawler A ไม่ได้ allow crawler B หรือ another purpose
- OAI-SearchBot กับ GPTBot ต้องแยก decision เมื่อเกี่ยวข้อง
- crawler access ห้ามถูกอ้างว่า guarantees indexing, citation หรือ use
- llms.txt MAY เป็น navigation aid ที่ derive canonical public route registry
- llms.txt MUST NOT เป็น ranking factor claim, evidence ledger, rights statement, readiness certificate หรือ sitemap replacement
- optional file ต้อง exclude private, preview, draft, withdrawn, noindex และ rights-restricted entries

### 10.8 Agent-readable และ agent-authorized

**AGENT-01 — Agent-readable does not mean agent-authorized.** Agent interface MUST แยก readable information, available capability, required permission, confirmation, execution และ receipt Agent MUST NOT infer authorization จาก discoverability, UI affordance, credential หรือ absence of denial

Acceptance:

- AGENT-01-A — automated: machine action ทุกอัน hash-bind immutable definition, typed input schema/value, actor-scoped authority, side-effect/confirmation policy และ exact bytes ของ result/receipt schemas; definition, runtime และ Build Card ต้องตรงกันทั้ง `productScope` และ conditional `namedProduct`; runtime state ห้าม redefine authority
- AGENT-01-B — interaction: mutation fixtures block execution เมื่อ actor scope, unexpired authority, input classification, operation, permission, confirmation หรือ external/costly authority class ไม่ตรง; ทุก execution ที่เริ่มแล้วต้องมี signed `pre_start` revocation decision ซึ่ง bind nonce/build/artifact/action/actor สดภายในห้านาทีก่อนเริ่ม และออก attestation ไม่ช้ากว่า `startedAt` ส่วน `succeeded | failed | cancelled` MUST เพิ่ม signed `terminal_boundary` decision ที่มีคนละ `revocationId`, record และ attestation ซึ่งตรวจตั้งแต่ applicable effect-or-terminal boundary จนไม่เกินห้านาทีหลัง boundary; terminal receipt MUST bind decision หลังนี้ ตรง runtime ทั้ง operation/status/timestamps/side effect/result/recovery และมี externally pinned `agent_execution` attestation

Visible UI, keyboard model, accessibility tree และ agent interpretation MUST ใช้ control names, state, order และ outcome เดียวกัน Links navigate; buttons change state/submit Disclosure exposes expanded state Forms expose labels, purpose, required state, error, privacy context และ receipt

Agent Action ใช้ active machine contract โดยตรง ไม่ใช้ prose/YAML นี้เป็น copyable shape ตารางนี้เป็น normative field map; required/conditional shape ที่ exact อยู่ใน JSON schemas และ version/schema identity resolve จาก `machine.release`:

| Object | Normative field map; JSON schema remains exact |
|---|---|
| definition binding | Runtime `schemaVersion`, `releaseRef`, `definitionRef`, `definitionSha256`, `definitionSchemaRef`, `actionId` และ Build Card `capabilityConfigRefs.agent_action` bind immutable definition bytes เดียวกัน |
| immutable definition | `schemaVersion`, `releaseRef`, `definitionId`, `artifactId`, `actionId`, `allowedActorClasses`, `productScope` และ conditional `namedProduct`, `operation`, `input.{schemaRef,schemaSha256,schemaId,allowedClassifications}`, `permissionPolicy`, `sideEffect`, `confirmationPolicy`, `resultSchemaRef`, `resultSchemaSha256`, `receiptSchemaRef`, `receiptSchemaSha256`, `errorBehavior`, `recoveryPolicy`; operation taxonomy is `read`, `inspect`, `draft`, `submit`, `create`, `save`, `share`, `download`, `external_handoff`, `confirm`, or `destructive` |
| typed runtime input | `inputs.{schemaRef,schemaSha256,schemaId,valueRef,valueSha256,classification}` bind both schema and value bytes; value MUST validate and classification MUST be allowed by definition and authority |
| runtime scope | `scope.{artifactId,actor,actorClass,productScope,allowedOperation}` และ conditional `namedProduct`; `artifactId`, actor/class และ operation ต้องตรง definition/authority ตาม field ที่มี ส่วน `productScope`/`namedProduct` ต้องตรง immutable definition และ Build Card; named-product scope ห้ามขยายหรือลดใน runtime |
| runtime permission | `permission.{policy,status,authorityRef,authoritySha256,authoritySchemaRef}` binds authority under permission, never at root; permission remains separate from discoverability and credentials |
| authority record | `schemaVersion`, `releaseRef`, `authorityId`, `artifactId`, `actionId`, `authorizedActorId`, `authorizedActorClass`, `inputSchemaRef`, `inputSchemaSha256`, `inputSchemaId`, `allowedInputClassifications`, active `status`, `policy`, `authorizedOperations`, `authorizedSideEffectClasses`, `validity.{notBefore,expiresAt,revocationRef,revocationSha256,revocationSchemaRef,revocationAttestationRef,revocationAttestationSha256}`, `authorizedBy`, `authorizedAt`, `authorityEvidenceRef`; `validity.revocation*` binds the execution-specific `pre_start` decision and detached `agent_revocation` attestation, both of which MUST resolve and match authority, nonce, exact Build Card, artifact, action and actor |
| side effect | runtime/definition/receipt use orthogonal `{class, external, cost, summary, reversible}`; `class` is `none`, `reversible`, `irreversible`, or `destructive`; `external` is boolean; `cost` is `none`, `possible`, or `known` |
| confirmation | `confirmation.{required,state,confirmedBy,confirmedAt}` must match immutable `confirmationPolicy`; consequential execution requires confirmed identity/time before effect |
| execution | `execution.{executionId,executionNonce,buildCardRef,buildCardSha256,terminalRevocationRef,terminalRevocationSha256,terminalRevocationSchemaRef,terminalRevocationAttestationRef,terminalRevocationAttestationSha256,status,startedAt,effectAt,completedAt,resultSchemaRef,resultSchemaSha256,receiptSchemaRef,receiptSchemaSha256,resultRef,errorBehavior,recoveryRef,receiptRef,receiptAttestationRef,receiptAttestationSha256}`; `terminalRevocation*` MUST be null before terminal state and MUST bind a distinct signed `terminal_boundary` decision at terminal state; both result/receipt schema ref/hash pairs MUST equal the immutable definition and resolve declared package schema bytes; `status` is `not_started`, `blocked`, `running`, `succeeded`, `failed`, or `cancelled`; chronology MUST be coherent และ applicable result/recovery/receipt refs+hashes bind every non-null runtime ref Terminal status MUST bind detached `agent_execution` attestation to exact receipt bytes |
| execution receipt | `schemaVersion`, `releaseRef`, `executionId`, `executionNonce`, `buildCardRef`, `buildCardSha256`, `terminalRevocationRef`, `terminalRevocationSha256`, `terminalRevocationSchemaRef`, `terminalRevocationAttestationRef`, `terminalRevocationAttestationSha256`, `artifactId`, `actionId`, `actor`, `operation`, terminal `status`, `startedAt`, `effectAt`, `completedAt`, `classification`, `allowedAudience`, `redactionState`, authority/input/result/recovery refs + hashes, `sideEffect`, `errorCode`, `audienceMessage`, `diagnosticsRef`, `diagnosticsSha256`; subject/actor/authority/input/build/nonce and terminal-revocation bindings MUST match runtime, while operation, status, all three timestamps, side effect, result and recovery MUST be exact runtime parity; `agent_execution` signs the exact receipt bytes and therefore transitively protects the terminal decision binding; diagnostics remain internal and hash-bound when present |

Permission is conditional on execution state: execution that has started or produced an outcome MUST resolve `granted`, except exact `read_only + not_required`; denied/pending/expired cannot run Authority validity และ revocation state MUST remain valid through the applicable boundary Revocation decision ทั้งสอง phase MUST bind execution nonce, exact Build Card hash, artifact, action และ actor: `pre_start` ตรวจในช่วงห้านาทีก่อน `startedAt` และ attestation MUST issue ไม่ช้ากว่า `startedAt`; `terminal_boundary` ต้องมีคนละ `revocationId`, record และ attestation ตรวจตั้งแต่ `effectAt` (เมื่อมี effect) หรือ terminal `completedAt` (เมื่อไม่มี effect) จนไม่เกินห้านาทีหลัง boundary และต้องแสดงว่า authority ยังไม่ถูก revoke ณ boundary Causal order MUST เป็น pre-start decision check ≤ pre-start attestation ≤ authority attestation ≤ `startedAt` และ terminal decision check ≤ terminal-revocation attestation ≤ terminal-receipt attestation ทั้งสอง record ต้องมี detached `agent_revocation` attestation จาก externally pinned operator key ที่ยัง valid/current เมื่อ verify จึงห้าม backdate/back-sign/replay จาก execution อื่น Consequential execution MUST also resolve proportional confirmation no later than `effectAt`, or no later than the terminal boundary when no effect occurred Destructive definition requires `owner_authorized + step_up` Definition และ runtime MUST bind `resultSchemaRef` + `resultSchemaSha256` และ `receiptSchemaRef` + `receiptSchemaSha256` ไปยัง declared package schema bytes เดียวกัน Active schemas never substitute for runtime result/recovery bytes or receipts Succeeded, failed และ cancelled execution always emits a typed, hash-bound receipt ที่ parity กับ runtime terminal state รวม terminal-revocation binding และมี detached `agent_execution` attestation จาก externally pinned operator key

Exact copyable contracts/fixtures are `agent-action.schema.json`, `agent-action.example.json`, `agent-action-definition.schema.json`, `agent-action-definition.example.json`, `agent-action-authority.schema.json`, `agent-action-authority.example.json`, `agent-action-revocation.schema.json`, `agent-action-revocation.example.json`, `agent-action-input.example.schema.json`, `agent-action-input.example.json` และ `agent-action-receipt.schema.json` Build Card `capabilityConfigRefs.agent_action` MUST bind the definition with `{ref, sha256, schemaRef}` whenever `agent_action` is declared

Full `agent-action-receipt` เป็น internal execution record เท่านั้น: `allowedAudience` MUST เป็น `internal_preview` หรือ `internal_operational` Public/client output MUST NOT embed, attach หรือ link full receipt, authority, typed input, diagnostics หรือ internal recovery record งานสำหรับผู้ใช้อาจแสดงเฉพาะ outcome, progress, error และ next/recovery action ที่ได้รับอนุญาต แยกจาก internal receipt และเขียนด้วยภาษาผู้ใช้

Public page MUST NOT expose private mutation merelyเพื่อดู agent-ready Agent execution ต้อง respect idempotency, duplicate-submission protection, consequence-aware confirmation และ audit log ตาม risk

### 10.9 Discoverability release gates

| Gate | Automated minimum | Human/production minimum |
|---|---|---|
| DISC-G01 route integrity | status/canonical/internal links/redirect loops | hierarchy serves audience |
| DISC-G02 locale integrity | lang/canonical/hreflang reciprocal graph | translations answer same question |
| DISC-G03 initial-hydrated parity | governed-field diff | primary meaning/task equivalent |
| DISC-G04 claim/evidence | all IDs resolve | scope/limits understood |
| DISC-G05 structured truth | syntax + field mapping | type describes real page |
| DISC-G06 crawl policy | robots/meta/auth/sitemap agree | purpose owner approves |
| DISC-G07 accessible interpretation | landmarks/names/states/focus | keyboard/screen-reader critical paths |
| DISC-G08 action safety | destination/result/receipt | consent/privacy/consequence suitable |
| DISC-G09 freshness truth | dates resolve releases | latest/live wording justified |
| DISC-G10 public-only projection | restricted/draft absent | no sensitive inference leak |

---

## 11. Output-format architecture

### 11.1 Semantic source, faithful renderings

ทุก production output MUST resolve approved semantic artifact, exact DS tuple, one primary format pack, zero or more compatible capabilities/overlays, locale, claim/evidence/identity/rights records และ QA profile

Design System package นี้ส่ง semantic format-kit/target contracts และ governed reference implementation records; ไม่ได้อ้างว่ามี native template ทุกชนิดอยู่ใน package `requiredImplementationControls` ของ kit คือ checklist ของสิ่งที่ implementation ต้องควบคุม ไม่ใช่รายการ template bytes ที่ package อ้างว่าส่งมาแล้ว งานปลายทางแต่ละชิ้น MUST bind selected format-kit record, target-profile record และ artifact-resolved format-implementation record ผ่าน `delivery.implementationBindings`; bind exact audience-delivered bytes ทุกไฟล์ใน `delivery.files`; bind native editable/source asset ที่ใช้จริงทุกชิ้นใน `delivery.implementationSourceBindings` โดย `audienceDelivered: true` ได้ต่อเมื่อ ref/hash/media type เดียวกันอยู่ใน `delivery.files`; และ bind fixture reports/receipts ครบ exact set ที่ resolved record และ target กำหนด ก่อน `artifact_qa_passed` web/app MUST มี `component_source`; document/PDF/deck/social MUST มีทั้ง `editable_source` และ `export_preset` ที่ resolve และ hash ตรง ห้ามอนุมานว่า semantic kit description หรือ reference example คือหลักฐานของ native bytes

**FORMAT-PARITY-01 — Meaning and action survive format translation.** Format translation MUST preserve content truth, hierarchy, evidence boundary, action outcome, locale status และ release identity พร้อมแทน unsupported interaction ด้วย governed static/structural equivalent; visual sameness ไม่ required

Acceptance:

- FORMAT-PARITY-01-A — automated: equivalence map resolve identity, navigation, bookmark, CTA, motion, evidence และ receipt roles ที่ใช้ และทุก CTA destination binding ใช้ direct/static-equivalent presentation ตรง format
- FORMAT-PARITY-01-B — manual: side-by-side review ไม่พบ claim scope, decision meaning, primary path หรือ action promise เปลี่ยน
- FORMAT-PARITY-01-C — automated: triggered dataviz/map overlay resolves analytical, geographic, evidence, accessibility, fallback and export fields in host format

### 11.2 Equivalence map

| Semantic role | Web | Interactive product | Flow document | PDF | Presentation | Social static |
|---|---|---|---|---|---|---|
| identity | approved asset หรือ governed live text | approved asset หรือ governed live text | approved asset หรือ governed native text | approved asset หรือ tagged/extractable governed text | approved asset หรือ governed text บน title/closing | approved channel asset หรือ governed text; never reconstruct logo |
| global navigation | semantic navbar | product/task nav | ecosystem/property route directory or related-destination group | ecosystem/property route directory or related-destination group | opening/closing ecosystem-property route group | omit; one destination cue |
| side bookmark | anchored page index | stable task/section index | page-heading outline/TOC | page-anchor bookmarks/visible contents | page-section agenda/marker | omit |
| primary CTA | typed destination + direct control | typed destination + direct control/recovery/receipt | typed working link หรือ instruction | typed working link + visible destination หรือ instruction | typed visible link/verified QR+text/instruction | typed destination cue; no fake control |
| motion | role-gated enhancement | state/cause feedback | final state/sequence | final state/frames | presenter sequence + static equivalent | final state |
| evidence | visible disclosure/source page | in-context evidence/data receipt | note/appendix | tagged note/bibliography | source line/appendix | compact cue + destination/sidecar |
| hover/focus detail | focus/disclosure equivalent | keyboard disclosure | visible note/glossary | annotation/legend | visible note according to mode | caption/destination |
| receipt | runtime state/reference | result/recovery/durable receipt | metadata/version record | final-byte validation | version/source slide | publication sidecar |
| icon | approved FILL 0 glyph | approved FILL 0 glyph | vector/font-safe + text equivalent | embedded vector | editable approved vector | approved outline vector; never logo substitute |

เมื่อ source มีทั้ง global navigation และ side bookmark งาน document/PDF/deck MUST แยกด้วยชนิดและระดับของ destination แบบ deterministic: global group รับเฉพาะ ecosystem/property route หรือ external destination และใช้ `staticExposure: destination_cue`; page-index group รับเฉพาะ page/page_local anchor จาก heading จริง โดย document ใช้ `toc`, PDF ใช้ `pdf_bookmark` และ deck ใช้ `deck_section_marker` Destination ID หนึ่งแสดงได้เพียงกลุ่มเดียว แต่ละกลุ่มรักษา source-relative order และ exact id/kind/level/group/target/locale labels หาก format มี navigation container เดียวให้แบ่งสองกลุ่มด้วย heading ที่ชัด ห้ามรวม order, ทำ route ให้ดูเป็น anchor, ทำ anchor ให้ดูเป็น route หรือทำรายการซ้ำ

#### 11.2.1 Seven reference records and one resolved record per artifact

The seven reference-example positions below cover six primary formats, including square and OG social targets. Example files are optional, non-normative learning aids; create the artifact record from the embedded format/target/schema contracts โดย interactive app แยก browser และ native runtime แต่ reference เหล่านี้เป็นตัวอย่างโครงสร้างที่ complete สำหรับ context ที่บันทึกไว้เท่านั้น ไม่ใช่ universal preset และห้ามเลือก copy ไปใช้กับงานจริงโดยไม่ resolve ใหม่ ใช้ `(formatProfile, runtime)` เพื่อหา starting point:

| Output | Reference example only |
|---|---|
| public web · browser | `format-implementation.example.json` |
| interactive app · browser | `format-implementation.app-browser.example.json` |
| interactive app · native | `format-implementation.app-native.example.json` |
| flow document · static | `format-implementation.document-flow.example.json` |
| fixed PDF · static | `format-implementation.pdf-fixed.example.json` |
| presentation deck · static | `format-implementation.deck-presentation.example.json` |
| social static · static | `format-implementation.social-static.example.json` |

งานปลายทาง MUST สร้างและ hash-bind format-implementation v1.6 record ใหม่ที่มี `recordKind: artifact_resolved`, `recordId: implementation.<artifactId>.<artifactBuildId>` และ `artifactBinding` ตรง exact Build Card bytes `resolutionContext` MUST เท่ากับ primary/secondary experience profiles, capabilities, side-bookmark selection และ `composition.componentIds` ของ Build Card `requirements` MUST resolve identity typography, exact asset IDs, component contracts, rules, common/experience/format/capability/target/kit/accessibility tests และ platform portability fixtures จากงานชิ้นนั้นพอดี

Component contract ทุกตัวใน resolved record MUST มาจาก reference record ที่ตรง exact `(formatProfile, runtime)` หรือจาก `machine.contracts.formatPacks.componentContractTemplates` ที่ตรง exact format/runtime/component ID เท่านั้น สำหรับ document/PDF/deck ที่เลือก `component.bookmark.side.01` ให้ใช้ template ของ format นั้นเพื่อได้ TOC/PDF-bookmark/deck-section-marker behavior ที่ถูกต้อง ห้ามแก้ reference record ให้กลายเป็น preset, ห้ามยืม template ข้าม format และห้ามสร้าง contract เองเพื่อให้ component ID ผ่าน หาก component ใด resolve ไม่ได้หรือจำนวน/ลำดับ contract ไม่เท่ากับ `composition.componentIds` ต้อง block promotion

Browser ใช้ `authoringPlatform: browser` และห้ามมี native mapping งาน native/static non-browser MUST เลือก `authoringPlatform: macos | windows` หนึ่งค่า แล้วใช้ identity typography binding, native font mappings และ portability fixtures ของ platform เดียวกันทั้งหมด ห้าม mix platform หรือ copy macOS example ไปใช้ Windows Machine MUST block `reference_example` ที่ถูกใช้ใน `artifact_qa_passed` / `production_verified`, record ID ที่ไม่ deterministic, Build Card hash drift, experience/component/asset mismatch และ portability fixture ที่ขาด

Legacy key ใน Artifact Manifest ยังคงชื่อ `delivery.implementationBindings.preset` เพื่อ compatibility แต่ค่าที่ bind คือ resolved format-implementation record ไม่ใช่ reusable preset Reference และ resolved records ไม่ใช่ใบรับรองว่างานผ่าน และไม่ใช่คำกล่าวว่ามี native authoring template ทุกชนิดอยู่ใน package

### 11.3 Public web pack

**WEBFMT-01 — Public web output remains semantic and resilient.** Public web MUST provide semantic initial HTML, responsive layout, keyboard/touch operation, no-script primary meaning, stable URLs, discoverability signals, share preview (square feed creative และ OG link preview 1200 × 630 ตาม SOCIALFMT-01), one approved icon set ตาม FAVICON-01, `<title>` ตาม pattern `[page] · [product]` และ production verification

Acceptance:

- WEBFMT-01-A — automated: required rules pass supported viewport, locale, theme, no-script และ reduced-motion fixtures; icon set หกขนาด, web manifest, theme-color และ title pattern resolve (FAVICON-01-A); OG image resolve `target.social.og.1200x630.01` และ og:title/og:description ตรง template ของ SOCIALFMT-01
- WEBFMT-01-B — production: deployed routes, assets, metadata, forms/actions และ monitoring receipts pass

Required outputs: semantic initial HTML, responsive + print styles, canonical/locale graph, page-kind projection, social preview (feed square + OG 1200 × 630), icon set หกขนาด + web manifest + theme-color, `<title>` ตาม pattern, optional `llms.txt` navigation aid ตาม §10.7, no-script core meaning และ deployed-origin receipt Third-party embeds deferred และมี failure fallback `build-kit/skeleton.html` ของ release นี้มี head block ที่ครบตามรายการนี้ให้คัดลอกได้ตรง

### 11.4 Interactive product pack

**APPFMT-01 — Interactive product output exposes system state.** Interactive product MUST preserve task state, loading, success, empty, partial, stale, permission และ error meaning Navigation/actions direct, undoable เมื่อเหมาะ และ receipted เมื่อ consequential

Acceptance:

- APPFMT-01-A — interaction: declared states understandable/operable ด้วย keyboard, touch และ assistive technology
- APPFMT-01-B — manual: consequential action มี confirmation, progress, result, recovery และ receipt proportional to risk

Build Card MUST declare role, authorization, privacy, data-as-of, schema/method release, filters, geography, denominator และ unit เมื่อ applicable Export ต้อง freeze/record selected state; ห้าม sitemap user-specific/private URLs

### 11.5 Flow document pack

**DOCFMT-01 — Flowing documents preserve structure and working references.** Flow document MUST ใช้ real heading hierarchy, readable pagination, working links, labelled figures/tables, source notes, accessible reading order, document properties และ version identity

Acceptance:

- DOCFMT-01-A — automated: heading/list/table/figure/link/language/title/reading-order structure pass
- DOCFMT-01-B — visual: no clipped content, accidental blanks, stranded headings หรือ unreadable notes

Use native styles, lists, tables, captions, links, footnotes/endnotes และ cross-references ห้าม manual spaces/line breaks เป็น layout หรือ screenshot text เป็นเนื้อหาหลัก CTA becomes labeled working link with outcome Motion becomes reading order, key frames หรือ final state

### 11.6 Fixed PDF pack

**PDFFMT-01 — Fixed PDF preserves visual and semantic access.** PDF MUST preserve tagged reading order when required, bookmarks for long documents, selectable text where possible, embedded/approved fallback fonts, working links, alt text, page identity, evidence references และ print-safe contrast/margins

Acceptance:

- PDFFMT-01-A — automated: metadata, pages, fonts, links, tags, bookmarks, extraction และ integrity pass as applicable
- PDFFMT-01-B — visual: all pages inspected at screen/print size ไม่มี clipping, substitution, low contrast หรือ broken hierarchy

CTA uses a working link and a human-readable destination A QR code MAY supplement, but MUST NOT replace either the working link or the human-readable destination Final produced PDF ต้องตรวจจริง ไม่อาศัย authoring file preview Image-only PDF fail เมื่อ structured text feasible

### 11.7 Presentation pack

**DECKFMT-01 — Presentation decks express one idea per scene.** Presentation MUST preserve one primary idea/reading path per slide, distance-legible sizing, section progress, source cues, speaker-independent key meaning, editable structure when required และ equivalent สำหรับ action/motion

Acceptance:

- DECKFMT-01-A — visual: montage, distance legibility, overflow, contrast และ narrative continuity pass
- DECKFMT-01-B — automated: titles, sources, links/QR, alt text, fonts และ hidden-slide state validate

Declare audience, room/screen, duration, presenter/self-guided mode, locale และ dimensions Conclusion อยู่ใกล้ chart/map/evidence Dense evidence moves to governed appendix โดย proposition ไม่เปลี่ยน Meaning ห้ามอยู่ใน entrance animation หรือ speaker notes อย่างเดียวเมื่อ self-guided

### 11.8 Static social pack

**SOCIALFMT-01 — Social outputs are self-contained and destination-aware.** Static social ใน v0.9.7 MUST ใช้หนึ่งในสอง governed targets: `target.social.square.1080.01` ขนาด 1080 × 1080 สำหรับ feed post และ `target.social.og.1200x630.01` ขนาด 1200 × 630 สำหรับ link preview ที่ผูกกับ `publication.discovery.social` ของหน้า, communicate one approved message โดยไม่พึ่ง animation, preserve safe area, identify source/destination, use approved identity implementation และ legible at feed size Release นี้ยังไม่มี extension registry; social ratio/target อื่นนอกสองรายการนี้จึง unknown และ MUST block

Acceptance:

- SOCIALFMT-01-A — automated: output resolve governed target หนึ่งรายการพอดี (square 1080 × 1080 1:1 หรือ og 1200 × 630 40:21); dimensions, format, size, color profile, safe-area และ metadata pass โดยไม่มี undeclared target/extension; OG creative มี recogniser ครบสามอย่างและ og:title ≤ 60 / og:description ≤ 155 ตาม template
- SOCIALFMT-01-B — visual: square feed-size, center-crop และ safe-area fixtures (1080) และ text-safe 1000 × 560, central 630 square (LINE) และ 2:1 crop (X) fixtures (1200 × 630) preserve message, identity, evidence cue และ destination cue ≥ 22px; OCR + visual review ครอบคลุม OG image

**Amendment — link-preview target.** `social_static` gains a second target `target.social.og.1200x630.01`, bound to the page's `publication.discovery.social`; 1080×1080 remains for feed posts. The 1200×630 image carries three recognisers: the 8px four-colour rule on the top edge, a Brand Blue panel or one declared atmosphere, and the 3×5px measure line; the symbol or lockup is ≤ 56px tall. Text on the image states what the reader will see when they open the link and a destination cue at ≥ 22px; source, date and limitation appear when needed to interpret. Safe areas: text within 1000×560, symbol and first title line within the central 630 square (LINE), 2:1 crop tolerant (X). `og:title` = `[object] [period/scope] · [product]` ≤ 60; `og:description` = `[what you will see] · [source · date] · [limitation]` ≤ 155; post copy = observation / question the reader can answer / verb + destination. No exclamation marks, no "click now", no emoji, no unitless numbers. OCR and visual review cover the OG image.

OG image เป็น `social_preview` asset ของหน้าที่มัน represent: bind ผ่าน `discovery.socialPreview.imageAssetId` พร้อม `imageAltByLocale` และต้องตรง visible page/locale ตาม MEDIA-01; ห้ามใช้ motif หรือ animated variant บน OG image (MOTION-04) แม่แบบ `build-kit/og-1200x630.template.html` ของ release นี้วาง recogniser ทั้งสามและ safe areas ไว้แล้ว

ทุก `social_static` artifact MUST มี publication sidecar ที่ validate ด้วย current `social-sidecar.schema.json` in `machine.schemas` และ Artifact Manifest MUST bind exact `socialSidecarBinding` ref/hash/schema กับ creative path/hash เดียวกัน Sidecar MUST record artifact/build, claim/evidence, locale, campaign, rights, expiry, destination และ output-clarity state; campaign ID/channel/expiry MUST เท่ากับ Build Card `social_context` และ action MUST เท่ากับ available `experience.primaryActionRef` ที่มี `priority: primary` สร้าง shape จาก embedded current social-sidecar schema; example เมื่อมีเป็น optional reference ไม่ใช่ข้อมูลอนุมัติสำหรับงานใหม่ `builtAt`, promotion time และ production observation time เมื่อ applicable MUST อยู่ภายในทั้ง campaign window และ rights-validity window Destination verification MUST สำเร็จด้วยวิธีที่ตรง destination kind, bind exact evidence bytes และยังสดไม่เกิน declared TTL ซึ่ง MUST ไม่เกิน 24 ชั่วโมงทั้ง ณ promotion และ production boundary Visible `destinationCue` MUST derive แบบ deterministic: route/contact ใช้ target ตรงตัว; HTTPS external/download/form ตัดได้เฉพาะ `https://` โดยคง canonical host, non-default port, path, query และ fragment ทั้งหมด Creative bytes MUST decode เป็น canvas ตรง selected target profile: 1080 × 1080 สำหรับ square หรือ 1200 × 630 สำหรับ OG ไม่ใช่เชื่อ metadata declaration หรือ raster header อย่างเดียว

Creative MUST มี general audience-content inspection หนึ่งใบตาม `delivery.contentInspections[]` และ specialized social visible-copy inspection แยกอีกหนึ่งใบ ทั้งสอง bind creative subject/method/time เดียวกันแต่ห้ามใช้ record ชนิดหนึ่งแทนอีกชนิด Specialized record MUST ใช้ hash-bound OCR + visual review ที่ normalize ด้วย algorithm เดียวกับ sidecar แล้วเท่ากับ governed visible-copy projection พอดี: exact claim, material limitation ทุกข้อ, evidence cue ทุกอัน, CTA label/outcome และ destination cue ห้ามขาด เปลี่ยน หรือเพิ่ม visible overclaim/uncategorized claim CTA บน creative เป็น destination cue ที่ derive ตามกฎด้านบน ไม่ใช่ fake button หาก canonical cue ยาวเกิน layout ให้เปลี่ยน action ไปยัง approved short destination ก่อนผลิต ห้ามย่อ cue ให้ชี้คนละ target Sidecar ไม่แทน visible truth: หาก denominator/time/geography/source จำเป็นต่อการตีความ สิ่งนั้น MUST อยู่บน creative ด้วยขนาดอ่านได้ มิฉะนั้น artifact fail

### 11.9 Dataviz และ map overlays

Dataviz/map เป็น overlays บน primary format ไม่ใช่ format ที่แทน web/PDF/deck

**DATAVIZ-01 — Data visualization preserves analytical meaning.** Chart, score, comparison หรือ quantitative diagram MUST declare question, measure, unit, denominator, time, geography, grain, transform, uncertainty, schema release, claim/evidence IDs, scale และ accessible alternative Color ไม่เป็น carrier เดียว Truncated axis ต้องมีเหตุผล Observation แยก interpretation และ incompatible series ห้าม normalize เพื่อความสวย

Acceptance:

- DATAVIZ-01-A — automated: required overlay fields, scale (family จาก `machine.tokens#/analyticalScales` หรือ series จาก `machine.tokens#/categoricalSeries`), Build Card `scaleFamilies[]` และ `seriesVariant`, non-color cues, value states ของ EVID-05, claim/evidence IDs and accessible data alternative resolve
- DATAVIZ-01-B — manual: form, scale, baseline, ordering, annotation, uncertainty and conclusion preserve meaning in format

**DATAVIZ-02 — Sequential scales use three distinct-hue anchors and exact approved samples.** Select the family from the metric and denominator. Each of the 20 analytical families has three explicit approved anchors at 0%, 50%, 100% (LUT indices 0, 20, 40), summarized below and fully specified in machine.analyticalScales. Consume the exact 41-sample sRGB table and its class projections. Do not interpolate a new palette from endpoints or three anchors at consumption.

Every sequential midpoint MUST turn toward a visibly different hue from the end, not merely a lighter end tint. Starts are the approved family-specific semantic near-whites; universal cream is not required. The midpoint is a perceptual turn within a single numerical direction, not zero, balance or a threshold. OKLab lightness and relative luminance strictly decrease from low to high on BOTH themes. The exact approved LIGHT anchors, LUT and class colors are used unchanged on a dark surface with the same direction. Activity uses cool mint/blue; water remains aquatic rather than lime-dominant; density families stay warm.

| Family | Kind | Same anchors on light and dark |
|---|---|---|
| `activity` | sequential | `#F1F5E5` → `#60C9AD` → `#25659A` |
| `density.area` | sequential | `#FFF1D9` → `#E6AB30` → `#D6600C` |
| `heat` | sequential | `#FFF6CF` → `#F5B323` → `#C72D10` |
| `risk` | sequential | `#FFF0E5` → `#F27642` → `#A40822` |
| `price` | sequential | `#F4F4DD` → `#74C4C2` → `#216D58` |
| `age` | sequential | `#F5F0DF` → `#9DBACB` → `#526832` |
| `density.household` | sequential | `#FFF2E4` → `#EF84A3` → `#DF491F` |
| `growth` | sequential | `#EEF5E5` → `#B2C75B` → `#2B702F` |
| `confidence` | sequential | `#EEF4EB` → `#66AEDF` → `#236A5E` |
| `count` | sequential | `#F4F0E7` → `#7DBAC0` → `#213E70` |
| `water` | sequential | `#EEF7FC` → `#3DBBCD` → `#073E78` |
| `density.capita` | sequential | `#FFF0ED` → `#F3A076` → `#B72B63` |
| `built` | sequential | `#FFF5D8` → `#F3BC93` → `#BFA000` |
| `duration` | sequential | `#EEF2F5` → `#98B1A4` → `#33433E` |
| `balance` | diverging | `#CF5148` → `#F1F3EC` → `#3B87BF` |
| `delta` | diverging | `#CF5420` → `#F1F3EC` → `#3C9278` |
| `tradeoff` | diverging | `#B79900` → `#F1F3EC` → `#739CDE` |
| `flow` | diverging | `#C95368` → `#F1F3EC` → `#2E9095` |
| `sentiment` | diverging | `#C95170` → `#F1F3EC` → `#49944D` |
| `anomaly` | diverging | `#4084C7` → `#F1F3EC` → `#D44C3A` |

Fourteen sequential families retain explicit metric meaning: activity for activity/usage; density.area for a declared area denominator; heat for measured heat; risk for source-supported risk; price for monetary quantities; age for elapsed age; density.household for a household denominator; growth for a nonnegative cumulative magnitude (signed change uses delta); confidence for stated uncertainty/quality; count for totals, not density; water for water measurements; density.capita for a population/person denominator; built for governed footprint, height or coverage including explicitly defined built-density; duration for travel, waiting or inundation time.

Density areas remain orange, per-capita rose, household scarlet and built-form gold. Legends MUST show the actual unit and denominator; a color never establishes official population, eligibility, risk or behavior. A topic alone does not choose a denominator.

One analytical surface uses at most one family per hue zone. Independently labelled panels with their own metric, legend and reading path are separate surfaces. A reference atlas compares families rather than overlaying unrelated measurements. Names, units, thresholds and non-color cues remain necessary: neither the 20 families nor the 17 supporting colors are guaranteed to be universally distinguishable by color alone.

The six diverging families are balance, delta, tradeoff, flow, sentiment and anomaly. Their midpoint MUST be meaningful and named; both themes use the same approved light table and signed direction. The neutral class spans a declared interval, not automatically only exact zero. Do not infer equal perceptual weight, goodness or danger from either arm.

Discrete classes use n ∈ {3,5,7,9} and exact indices round(i × 40 / (n − 1)), i = 0…n−1. Prefer 5–7 for compact marks. Adjacent class ΔE OKLab is a diagnostic, not an accessibility certificate; the supplied sets meet the retained 2.2 threshold.

The consumer supplies domain, classification method, exact thresholds, unit, direction and outlier policy. No-domain selection MUST NOT invent thresholds. Continuous intervals are [lower, upper) except the closed last interval; a displayed integer and its class must agree. Outliers need explicit rejection, approved extension or a declared end-bin, never silent clamping. Renderer, legend, table and export MUST use identical values, thresholds and colors.

Acceptance:

- DATAVIZ-02-A — automated: selected family resolves its exact approved light-source LUT with 41 samples and three anchors at 0/20/40; light and dark anchors/LUT/classes are equal; sequential lightness and relative luminance decrease on both themes; class indices and renderer/legend/table values agree; no endpoint interpolation or silent normalization
- DATAVIZ-02-B — visual: the actual continuous ramp and selected classes are readable without band/hue reversal at their delivered sizes in each offered theme/print context; independent analytical panels preserve clear family/denominator labels and accessible non-color alternatives

**DATAVIZ-03 — Analytical values and their direction are invariant across themes.** The owner explicitly adopts the original LIGHT HEX values on dark backgrounds unchanged. Every dark analytical anchor, LUT sample and class MUST equal the corresponding light value and index. Story supporting colors and Location role accents also retain their original light HEX on both themes. No derived dark formula, HEX inversion, per-theme recoloring, opacity adjustment that changes encoded color, direction reversal or alternate normalization is allowed.

Keep the data colors when improving contrast: use readable numerical/text labels, meaningful boundaries or a neutral backplate/plot surface. Check the actual displayed size and surface. Known examples on dark.canvas #11191D are water high #073E78 (about 1.67:1), count high #213E70 (about 1.68:1) and duration high #33433E (about 1.71:1); these fills need visible boundaries, labels or a suitable neutral plot backplate in the artifact. This rule is not a claim that all fills attain 3:1 on dark, that 16 roles are color-only distinguishable, or that package checks establish accessibility. The original categorical soft/vivid/ink palettes, foundation pairs, seven decorative gradients and product identity/motif contracts retain their separate existing theme behavior; they are outside this analytical same-HEX decision.

Acceptance:

- DATAVIZ-03-A — automated: light and dark anchors, LUTs, classes, indices and value direction match exactly; supporting and Location role HEX are unchanged across themes; no derived dark formula or custom interpolation is used
- DATAVIZ-03-B — automated: sequential lightness decreases in both themes, diverging arms preserve the approved light-source directions, applicable hue gates pass for every sample, and CSS/token/profile projections bind exact delivered bytes
- DATAVIZ-03-C — visual: text, values, sign, zero, missing states and boundaries remain readable on actual light/dark surfaces; labels or neutral backplates solve insufficient contrast without recoloring encoded values; report CVD/grayscale and actual-size review separately

**GATE-01 — Data-colour gates run for both themes on every release.** Validate the current approved snapshot, exact token/LUT/production-CSS projections, all 20 families × 2 themes × 41 samples, categorical fill/ink and declared step/hue diagnostics. A mismatch or undeclared failure blocks package use. Save scoped, dated evidence bound to the exact files/hashes; historical gate reports do not certify new bytes. Package checks MUST NOT be described as complete artifact, native-language, CVD or account-installation validation.

The current package verifier checks immutable-source integrity, approved color snapshot parity, typed policy, complete assets and analytical mathematics. The artifact checker separately inspects supported delivered formats and reports its limits. Actual foreground/background contrast, gray/CVD usability, thresholds, native Thai/English composition, keyboard/zoom and export review remain artifact-specific. No new exception may be invented to bypass a failed MUST; any proposed normative change requires owner decision and the version policy in §0.2.

Acceptance:

- GATE-01-A — automated: current exact snapshot, token/LUT/CSS parity, 40 records/1,640 samples, approved class indices/steps and applicable hue checks pass with hash-bound evidence; failed or untested checks are not reported as pass
- GATE-01-B — manual: the release record accurately distinguishes owner approval, package diagnostics and artifact review; no new exception, signature, conformance level or platform activation is claimed without its actual authority/evidence

**DATAVIZ-04 — Analytical values stay out of the retired hue windows.** Every delivered analytical LUT sample, class, anchor and categorical fill/ink in both themes must satisfy the applicable retired-color gates. Earth: OKLCh H 30–100°, C .035–.145, L ≤ .62. Violet: H 285–345°, C ≥ .04. Light clay band H 22–100°, C .09–.145, L .62–.74 is a warning. Proximity to the eight retired earth/taupe values within a 20° hue lane must not be below ΔE 6. The ten exact retired values remain prohibited. Warm pink H 350–20° is allowed; no new token may be minted to escape a gate. The exact retired-value list and gate parameters are in the embedded machine contract.

The scope includes all 41 samples, not only three displayed anchors. Governed semantic states and approved image pixels keep their own role-specific contracts; the analytical ban does not authorize recoloring identity artwork or evidence media.

Acceptance:

- DATAVIZ-04-A — automated: all current analytical samples/classes and categorical values satisfy the applicable earth/violet/proximity/exact-retired-value gates; light clay warnings are recorded; overrides pass the same checks and do not invent escape tokens
- DATAVIZ-04-B — visual: delivered ramps/categories do not read as rejected brown, terracotta or violet; legal warm pink reads as intended in both offered themes on the actual screen/export

**DATAVIZ-05 — Categorical series are luminous and edge-separated.** Use `landometer-series-10-v8`, ten stable category IDs with exact theme-specific soft/vivid fill and ink roles. Current light values are retained; current dark soft/vivid/ink values are the approved redesigned set. Assignments persist by category ID through filtering and sorting. Default is soft; vivid is an explicit surface choice. Vivid charts and energy accents MUST NOT compete on the same surface. The governed sky energy-accent cue retains its surface constraints even in soft.

Fills need not reach 3:1 against canvas: adjacent areas require a ≥1px `border.default` edge or an ink outline; legend swatches require a hairline border. Text, lines and marks thinner than 3px use the ink tier, with ≥4.5:1 for normal text on its actual canvas/card. Where ink falls back to `text.primary`, category identity remains in fill plus cue. Preserve the ten cue assignments: circle, square, triangle, diamond, cross, star, hexagon, ring, dash, plus. Every use needs a non-color cue; slots 7–10 require their shape cue. Do not restore old v5 aliases or substitute old dark values.

Acceptance:

- DATAVIZ-05-A — automated: colors resolve the exact v8 category/theme/variant/ink records by stable category ID; normal ink reaches 4.5:1 on its actual surface; required edges/legend borders and shape cues are present; thin marks use ink; delivered variant agrees with the Build Card and does not share a surface with a forbidden energy accent
- DATAVIZ-05-B — visual: categories remain distinguishable at actual feed/print/dark sizes through labels/shapes/position as well as color; category-ID assignments do not change when filtered or sorted; no universal color-vision-accessibility claim is inferred from hue differences

**MAP-01 — Maps preserve geography and coverage truth.** Map overlay MUST declare geography ID, boundary source, purpose, covered area, grain, time, unit, schema release, attribution/rights, projection เมื่อมีผล, หกสถานะของค่าตาม EVID-05 (`measured`, `measured_zero`, `no_data`, `out_of_scope`, `suppressed`, `not_yet`) รวมทั้ง low-confidence/selected/focus states และ nonspatial alternative Export records viewport/zoom/filters/data receipt It MUST NOT imply unsupported coverage, treat missing as zero or generalize product classification

Acceptance:

- MAP-01-A — automated: fields/states/attribution/alternative/export receipt resolve; `dataStates` ครอบคลุม enum หกค่าของ EVID-05 ที่เกิดจริงในข้อมูล และ MapLegend แสดง state rows ที่มี
- MAP-01-B — manual: boundary, context, legend, orientation, uncertainty and coverage remain truthful/readable

ทั้งสอง MUST NOT normalize incompatible products, cities, releases หรือ geographic grains เพื่อให้ chart สวย หาก resolve compatible basis ไม่ได้ ให้ incompatibility เป็นผลลัพธ์

---

## 12. Machine and AI authoring contract

AI MAY plan, resolve, compose, adapt และ preflight แต่ MUST ทำงานจาก Build Card + approved registries + exact release tuple และ MUST แยก unknown จาก inferred/approved

### 12.1 Required AI plan output

ก่อนสร้าง artifact AI MUST emit หรือบันทึก:

1. resolved authority และ product layer
2. one job, audience, dominant object, first AHA และ primary action
3. primary format pack + triggered capabilities
4. included claim/evidence IDs และ incompatibilities
5. identity/font/icon/media assets ที่ approved
6. navigation/bookmark/CTA representation
7. motion roles พร้อม user benefit หรือ explicit no-motion decision
8. locale state และ native review need
9. automated/manual/production gates
10. assumptions, unresolved fields และ blocking unknowns
11. scale families ต่อ surface (`scaleFamilies[]` ไม่เกินหนึ่งต่อโซน) และ `seriesVariant` เมื่อมี categorical chart
12. value state ของทุกค่าที่เป็น 0 หรือว่าง (EVID-05) และแหล่ง/วันที่ที่ EvidenceCard จะพิมพ์
13. icon set, `<title>` และ OG preview ของงานเว็บ; runtime hash และ pause control ของงานที่มี identity motion
14. motion moments ของเส้นทาง (`motionMoments[]`: kind, job จาก manifest, beat; ≤ 3 ต่อ route, ≤ 1 ต่อ task surface) และการยืนยันว่าไม่มี motif บน first answer, primary proof หรือ primary action; product overlay ที่ใช้ต้องอ้าง `machine.contracts.motifRegister` ด้วย hash
15. LUT, class indices และ categorical values ตรง approved records ทุกค่า โดย analytical light/dark ใช้ HEX เดียวกัน; domain, denominator, thresholds และ outlier policy ตรง renderer/legend/accessible table/export; ตรวจทั้งสองธีมตาม GATE-01

AI MUST NOT invent approval, asset, data, proof, capability, locale equivalence, schema compatibility หรือ production pass หาก required authority missing ให้บันทึก blocker ใน Build Card/manifest และหยุดที่ internal preview ห้ามแสดง blocker, placeholder หรือ workflow explanation นั้นเป็นส่วนหนึ่งของ public/client output

### 12.2 Deterministic resolution

- exactly one primary output.formatProfile
- common rules always apply
- format required rules add automatically
- capability rules add only from explicit declarations/truth
- stricter applicable rule wins; conflict requires owner record
- MUST/MUST NOT failure blocks; unmet SHOULD is advisory and does not affect conformance unless a separate MUST requires a decision record
- format adaptation changes representation, not proposition/permission
- conformance computed from receipts, not confidence score

### 12.3 Human–machine parity

**PARITY-01 — Human and machine rules remain one contract.** ทุก normative clause MUST อยู่ภายใน scope ของ stable rule block; human master กับ machine catalog MUST มี structural rule ID/title block และ acceptance-ID containment หนึ่งต่อหนึ่ง และการเปลี่ยน meaning MUST เปลี่ยน normative release ไม่ใช่ drift ฝั่งเดียว Automated parity พิสูจน์ได้เฉพาะโครงสร้างนี้ ไม่ได้พิสูจน์ criterion, method, trigger, scope หรือ Thai/English semantic equivalence

Acceptance:

- PARITY-01-A — automated: ทุก catalog rule ID/title มี normative master block เดียว, master ไม่มี extra rule block นอก catalog และ catalog acceptance ID ทุกตัวอยู่ใน matching rule block; pass นี้เป็น structural/acceptance-ID parity เท่านั้น
- PARITY-01-B — manual owner review: English machine requirement/acceptance กับ Thai/English human rule มี obligation, criterion, method, meaning, trigger, explicit absence of an exception path และ scope เดียวกัน; automated pass ห้ามใช้แทน bilingual semantic approval

Owner-recorded bilingual semantic review applies only to the exact reviewed text and machine projection. This consolidated document preserves current obligations and records the source and changed ranges; generation or automated parity MUST NOT be presented as a fresh owner bilingual review. Validator ตรวจได้เฉพาะสิ่งที่รายงานว่าตรวจจริง; ผลผ่าน MUST NOT ถูกอ้างว่าได้ตรวจความหมายหรือคุณภาพภาษาแล้ว การเปลี่ยน normative meaning หลัง owner review ต้องมี owner-recorded review ใหม่ก่อนอ้าง semantic approval.

Machine-friendly ไม่ได้แปลว่าทุกอย่าง automate ได้ Visual hierarchy, Thai native quality, evidence interpretation, context-specific contrast และ user benefit ต้องมี human review

---

## 13. Experience profiles และ capability triggers

Experience profile ตอบว่า artifact กำลังช่วยใครในสถานการณ์ใด Format pack ตอบว่าจะส่งมอบผ่านสื่ออะไร ทั้งสองแกนห้ามรวมกัน

**PROFILE-01 — Experience profile is distinct from output format.** Build Card MUST resolve exactly one primary experience.profile และ one output.formatProfile Experience profile describes audience/job; format describes representation Secondary experience profile MAY add requirements but MUST NOT introduce a competing primary job

Acceptance:

- PROFILE-01-A — automated: Build Card/manifest มี allowed primary experience + format อย่างละหนึ่งและ known rule sets
- PROFILE-01-B — manual: profile, audience, one job, first AHA and completion coherent in format

| Profile | Primary job | Required emphasis | Typical format; not a limit |
|---|---|---|---|
| portfolio_orientation | เข้าใจ Landometer architecture และเลือกเส้นทาง | shared/product boundary, protected identity, destination clarity | web, deck, document |
| methodology_learning | เข้าใจ question → input → method → limit → use | evidence, grain, version, constructive example | web, document, PDF, deck |
| product_orientation | เข้าใจ product scope/capability และ next step | named-product truth, audience, proof, availability | web, deck, social |
| evidence_report | ตรวจ claim/result และ source trail | claim records, uncertainty, compatible schema, as-of | web, document, PDF, deck |
| interactive_task | สำรวจ/ตัดสิน/กระทำภายใต้ state และ permission | system states, filters, recovery, receipt | app, web shell, export formats |
| editorial_place_story | เข้าใจบริบทโดยไม่ทำให้ illustration เป็น proof | narrative, media roles, evidence cues, locale | web, document, social |
| adoption_change | นำวิธีหรือ product ไปใช้โดยรู้ effort/limit | sequence, role, readiness, action, support | deck, document, web |
| campaign | จำหนึ่ง message แล้วไป durable destination | one approved message, crop, expiry, source cue | social, web landing, deck |

**CAPABILITY-01 — Capabilities resolve explicit rule packs.** Declared capability ทุกอัน MUST resolve known rule set, required fields, fallback and test matrix Unknown capability/unsupported format blocks resolution Side effect, authorization, autoplay, public indexing and nonessential motion default off until approved truth enables `machine.contracts.formatPacks.overlays` MUST cover capability enum ทั้ง 16 ค่าพอดีแบบไม่ซ้ำและไม่ขาด

Acceptance:

- CAPABILITY-01-A — automated: every Build Card capability maps exactly once to an overlay; overlay มี nonempty unique `compatibleFormatProfiles`, `requiredRuleIds`, `requiredFields`, `testMatrix` และมี `configRefContract` + `fallback`; selected format ต้อง compatible, every rule ID มีจริง และ hash-bound resolved capability config มี required field ครบ
- CAPABILITY-01-B — manual: capability is supported by approved product truth and does not broaden evidence, permission or product scope

Capability triggers:

| Capability ID | Trigger | Adds |
|---|---|---|
| claims | material factual claim | EVIDENCE-01 + CLAIM-MACHINE-01 |
| evidence | evidence disclosure/source trail | EVIDENCE-01 |
| data_table | material tabular data | evidence + accessible structure + format parity |
| data_visualization | chart/score/quantitative diagram | DATAVIZ-01 overlay and accessible data alternative |
| map | geographic display/spatial claim | boundary, coverage, legend, nonspatial alternative |
| form | collects/submits user input | CTA, A11Y, privacy/security states |
| authentication | identity gates access | unauthorized/expired/step-up states |
| permissions | capability differs by authorization | permission/denial/recovery states |
| sharing | creates share destination/payload | CTA, security, format parity |
| download | produces file | CTA, security, final-byte receipt |
| external_effect | sends/changes/publishes/charges | confirmation, permission, recovery, receipt |
| carousel | looped visual sequence | CAROUSEL-01 semantic-cycle contract |
| social_feed | third-party changing provider content | SOCIAL-FEED-01 state/freshness/provider contract |
| motion | beneficial motion beyond necessary feedback | MOTION-01..03 and lifecycle matrix |
| agent_action | machine may execute, not merely read | AGENT-01 action contract and adversarial fixtures |
| telemetry | sends governed measurement | privacy/security + QA purpose/retention |

Build Card `capabilities` และ key ของ `capabilityConfigRefs` MUST เท่ากันพอดี ทุก binding ต้อง resolve ไฟล์ bundle-local ด้วย exact SHA-256 และ fragment ที่อ้างต้องมี direct field ครบตาม `overlay.requiredFields` ของ capability นั้น Claims/evidence bindings ต้องตรง publication claim-manifest ref/hash เดียวกัน Nested claim, evidence, boundary, form submission/privacy, recovery, share object, download resource, social-feed source และ export-receipt refs MUST resolve ตามชนิดของ field ไปยัง bound claim graph, declared destination, stable HTTPS/URN resource หรือ exact bundle bytes; download เพิ่ม exact byte size, file name และ SHA-256 หาก ref ใด dangling การ resolution MUST block หาก overlay ไม่รองรับ selected format หรือ config ขาด required field การ resolution MUST block แม้ rule mapping จะมีอยู่

Defaults are conservative: no external effect, no agent action, no autoplay, no motion enhancement และ no public indexing until declared by authority

---

## 14. QA และ release — zero-exception conformance

### 14.1 Receipt-based conformance

**QA-01 — Conformance is receipt-based.** Conformance MUST computed จาก applicable automated, manual, visual, interaction, accessibility และ production checks ที่มี dated receipts v0.9.7 ไม่รับ exception reference ใน artifact conformance: Build Card `qa.exceptionIds` และ Artifact Manifest `resolution.exceptionRefs` MUST เป็น `[]` ทั้งคู่

Acceptance:

- QA-01-A — automated: applicable required check ทุกอันมี current passing receipt และไม่มี blocking failure
- QA-01-B — manual: arrays ทั้งสองเป็นศูนย์และไม่มี MUST หรือ MUST NOT deviation ถูกนำเสนอว่า conforming; SHOULD recommendations are reported separately when useful

ผลของ resolved acceptance/layer/gate ใช้ `pass`, `fail` หรือ `not_tested` เท่านั้น; `not_tested` ไม่สามารถนับเป็น pass กฎที่ไม่ใช้ระบุแยกใน `resolution.nonApplicableRuleIds` และต้องอธิบาย trigger/owner ตาม machine contract Aggregate score ห้ามซ่อน failed MUST

Conformance receipt MUST เป็น bundle-local, validate ด้วย `conformance-receipt.schema.json` และ bind subject/file bytes ด้วย SHA-256 Manifest layer หรือ gate claim ที่เป็น `pass` MUST มี receipt ref + hash ที่ resolve ได้; คำว่า pass ใน prose หรือ dashboard ไม่พอ ก่อน claim `artifact_qa_passed` ทั้ง discovery/readability/action MUST `pass`, resolved non-production acceptances ทั้งหมด MUST `pass`, และ receipt ของ OUTPUT-CLARITY-01-A MUST list exact `delivery.files` set พร้อม SHA-256 ครบทุกรายการ ก่อน claim `production_verified` resolved production acceptances ทั้งหมด MUST `pass` และ receipt ของ OUTPUT-CLARITY-01-B MUST cover exact set และ hashes ชุดเดียวกัน; coverage ที่ขาดหรือเกินล้วน blocks level claim

แต่ receipt ที่ signed แยกชิ้นยังห้ามใช้ replay หลัง Build Card หรือ governance เปลี่ยน `artifact_qa_passed` และ `production_verified` MUST bind `validation.promotionSnapshot` ที่ validate ด้วย `promotion-snapshot.schema.json` และมี detached `promotion_snapshot` attestation จาก externally pinned operator key Snapshot เป็น non-circular record ที่ bind exact Build Card bytes, canonical Artifact Manifest promotion projection, artifact-resolved format-implementation record, social sidecar เมื่อมี, implementation source + lineage receipts/attestations, final outputs และ receipt/attestation ทุกใบของ phase นั้น Snapshot ที่ขาด/เกิน, hash drift หรือใช้กับ artifact/build อื่น MUST block promotion

Approval, conformance, promotion, confirmation, execution และ source-lineage result ที่ใช้เลื่อนสถานะหรืออนุญาตการกระทำ MUST มี detached Ed25519 attestation ที่ validate ด้วย `verification-attestation.schema.json` v1.1 และ bind exact purpose, subject ref/hash/media type, issuer, key และเวลา Signature MUST verify ด้วย purpose-authorized, unrevoked, unexpired key ที่ caller-controlled policy pin exact `trustStoreId`, `issuerId`, `keyId` และ public-key SPKI SHA-256

- This release is an unsigned owner-approved distribution. Its package checksum and exact source parity MUST be verified when execution is available; these checks do not create a cryptographic signature or authorize artifact promotion. Historical signatures authenticate only their original subjects. A consumer requiring signed package authority MUST report that requirement unsatisfied for this distribution. The package MUST NOT create a trust anchor that authorizes itself.
- downstream artifact promotion/conformance, source lineage, agent confirmation และ terminal execution MUST ใช้ separate `operator_external` trust store + matching pinned policy ที่ผู้ตรวจควบคุมและได้รับจากช่องทางอิสระจาก artifact bundle
- การวาง trust JSON ไว้นอก bundle หรือเป็น sibling file อย่างเดียวไม่สร้าง authority; policy key fingerprint ต้องตรงทุก key และ key ที่ revoked/expired ณ current verification time MUST fail หากต้องยอมรับประวัติหลัง key ถูก revoke ต้องมี independent trusted timestamp contract ซึ่ง v0.9.7 ยังไม่ให้ exception path
- key, trust store หรือ trust policy ที่ artifact สร้างและแนบมาเอง MUST NOT ให้อำนาจรับรอง artifact นั้น

`machine.ruleCatalog.resolvedAcceptancePolicy: every_resolved_acceptance_must_pass` ร่วมกับการวาง OUTPUT-CLARITY-01 และ QA-01 ใน common rule set ทำให้ OUTPUT-CLARITY-01-A/C และ QA-01-A เป็น non-waivable receipts ที่ต้อง `pass` ก่อน `artifact_qa_passed`; OUTPUT-CLARITY-01-B ต้อง `pass` เพิ่มก่อน `production_verified` และห้ามเปลี่ยนเป็น `not_applicable`

### 14.2 Common gates

| Gate | Required evidence |
|---|---|
| QG-01 authority | Build Card refs resolve; no candidate overrides approved truth |
| QG-02 layer/evidence | shared vs product-specific, claim scope, rights, compatibility checked |
| QG-03 identity | approved logo roles/assets, protected wording and fonts verified |
| QG-04 semantic visual | color/type/icon/layout/media tokens and roles resolve |
| QG-05 primary path | one job/AHA/action/completion understandable |
| QG-06 state/access | names, roles, focus, alternatives, target, zoom, locale and failure states pass |
| QG-07 action truth | label, destination/effect, availability, permission, result and recovery pass |
| QG-08 format parity | navigation/bookmark/motion/evidence/receipt equivalents resolved |
| QG-09 privacy/security | public bytes/metadata/logs/receipts cross no boundary |
| QG-10 final artifact | actual deployed/exported/distributed bytes inspected and hashed/versioned |
| QG-11 audience clarity | visible bytes/metadata ไม่มี dependency ที่ยังแก้ไม่เสร็จ, placeholder หรือข้อความขั้นตอนผลิต/อนุมัติภายใน; ข้อจำกัดจริงอยู่ใกล้เรื่องที่จำกัดและใช้ plain language |
| QG-12 data colour (GATE-01) | Exact LUT/class/series parity ทั้งสองธีม, 41 samples ต่อ family/theme, approved step/hue checks และ evidence ที่ bind hashes ของค่าที่ส่งจริง; ไม่มี runtime interpolation หรือ alias ที่ห้ามใช้; contrast/legend/CVD และขนาดจริงตรวจแยกใน artifact |
| QG-13 motion budget (MOTIF-01…06) | ทุก motif มี job ที่ลงทะเบียน, byte ตรง hash, moments ≤ 3 ต่อ route, ไม่มี motif บนบริเวณต้องห้าม, overlay ตรง product layer, ทุกการวางอยู่บนพื้นที่วัดแล้วในทุกธีมที่ render (MOTIF-06) |

### 14.3 Required test matrix

Apply only states relevant to the artifact, but MUST document omissions:

- viewport/canvas: minimum, nominal, maximum และ intermediate stress width
- locale: Thai, English และ explicit missing translation
- theme: light/dark/print when offered
- input: keyboard, touch, pointer, assistive tech
- zoom/reflow: supported high zoom and text spacing
- runtime: browser ใช้ initial, hydrated, no JS, slow, offline, interrupted และ restored history/BFCache; native ใช้ launch, active/background, interruption, cancellation, restoration และ view disposal; static ใช้ editable/open/export/render lifecycle ตาม format
- data/state: idle, loading, success, empty, partial, stale, permission, error
- motion: browser ใช้ normal, reduced, observer unavailable, hidden-tab/focus/deep-link/history-restoration; native ใช้ normal, platform reduced motion, background/interruption/cancellation/restoration/view disposal, complete final state และ native view/accessibility order; static/presenter ใช้ final-frame/static-equivalent fixture ตาม format
- media/provider: delayed, blocked, failed, unsafe crop
- output: editable source, final export, share preview, print/room/feed size
- production: canonical route, CDN/assets, forms/actions, monitoring/freshness
- dataviz/data states: exact approved theme LUTs and class indices, no analytical sample inside an applicable retired hue window, current GATE-01 evidence, scale family per analytical surface/zone, series variant versus energy accent, six labelled value states, and no numeric/null machine value without its state
- web identity (v0.9.7): six icon sizes + manifest + theme-color, title pattern, OG 1200 × 630 recognisers and safe areas
- identity motion and motifs (v0.9.7): runtime and SVG hash parity, registered job per motif, ≤ 3 moments per route and none in forbidden regions, replay while ≥ 14% visible, stop off-screen, page pause, reduced-motion/no-JS/print final state, no infinite iteration

### 14.4 No artifact exception channel in v0.9.7

Active machine contracts enforce `qa.exceptionIds: []` and `resolution.exceptionRefs: []` with `maxItems: 0` ไม่มี prose record, owner note หรือ approval message ใด bypass เงื่อนไขนี้ได้ ถ้าจำเป็นต้องรองรับ deviation แบบ typed ในอนาคต ต้องออก normative Design System release ใหม่ที่เพิ่ม schema, authority, expiry/removal test และ migration อย่างชัดเจน ก่อนหน้านั้น artifact ที่มี deviation ยังเป็น failed/blocked/internal preview ตามผลกระทบ ไม่ใช่ conforming output

### 14.5 Release activation และ artifact production boundary

This document is the consolidated normative reference for owner-approved `v0.9.7-owner.1`. It is an unsigned distribution. Its package verifier checks the scope declared in `machine.release`; successful checks do not create a signature, a fresh bilingual approval or a final-artifact receipt. Preserve actual results and report unavailable checks as pending/not tested.

Each artifact still needs applicable evidence before claiming `artifact_qa_passed` or `production_verified`:

1. exact role-scoped identity/media/font/icon asset authority and byte hashes;
2. selected format kit, target profile and artifact-resolved implementation record, final delivery files, required fixture reports/receipts, and the actual editable/source assets used;
3. Thai/Latin typography, navigation/bookmark/CTA, accessibility, motion/fail-open and format-parity checks;
4. claim/evidence/rights/product-boundary checks;
5. deployed-origin or final-export verification for the selected format;
6. automated, manual and production OUTPUT-CLARITY-01 evidence.

Formal signed artifact promotion retains the operator trust/attestation obligations in QA-01. If that evidence is absent, report the concrete checks performed without assigning the formal conformance level. A package check, upload or successful generation is not artifact promotion.

Semantic kit/target records and reference examples are starting points. Resolve an `artifact_resolved` record from the real Build Card; examples are not universal templates or product evidence. Source assets actually used require their own exact bindings.

For ChatGPT/Claude Project Sources, upload this one-file edition and set project instructions to use its exact release for new relevant work. Open a new conversation and verify that it can identify the release, protected brand lines, six value states and exact requested scale samples from the file. For coding/design clients, load the same document or verified package plus the binary assets needed by that output. Upload success alone does not prove retrieval, tool use, account policy or team-wide installation. Each relevant project/client needs its own activation evidence.

## 15. Migration to v0.9.7

LDS 0.9.7 adopts the owner-approved Story light colors for all 20 analytical families, including sequential and diverging ramps. The same exact anchors, 41 samples and class sets apply on both themes with the same direction; prototype dark renditions are superseded. It adds the 17-value Story supporting vocabulary and a separate optional Location Intelligence profile. Categorical values, seven atmosphere recipes, foundations, fonts, identity artwork, brand voice and motif/animation behavior remain unchanged. Separate product Add-ons bind this complete base. Historical 0.9.6 and earlier release bytes remain unchanged.

Owner instruction for 0.9.7 supersedes every earlier requirement to start all sequential ramps with cream or derive/approve independent dark analytical renditions. Those historical constructions are provenance only.

### 15.1 Retained foundations

Retain approved brand voice, protected wording and roles, identity artwork, script-aware typography, foundations, semantic states, seven atmosphere recipes, layout, navigation, actions, truthful evidence, accessibility, output-format equivalence and motion lifecycle. The full current requirements remain in their chapters above; this migration section does not substitute for them.

### 15.2 Current replacements

| Area | Current v0.9.7 behavior |
|---|---|
| Analytical colors | exact approved 41-sample table per family/theme; no runtime palette reconstruction |
| Density | warm distinct area/orange, people/rose, households/scarlet and built/gold; denominator stays visible |
| Dark analytical theme | exact light HEX, anchors, LUT and classes unchanged; preserve direction; improve labels, boundaries or neutral plot backplates without recoloring |
| Category colors | v8 stable IDs/cues, retained light and redesigned dark soft/vivid/ink |
| Value states | measured finite nonzero, measured_zero numeric0, four exceptional states null |
| Social | decoded creative matches either square1080×1080 or OG1200×630; full sidecar/visible-copy obligations remain |
| Visual selection | restrained background/text/spacing; no decorative bracket or colored left rail; visible focus remains |
| Distribution | owner-approved unsigned0.9.7; exact checks reported separately from formal artifact certification |
| Project Source | one complete shared LDS normative file with embedded machine records; product-scoped work adds a separate current product Add-on; no earlier LDS master or overlay is required |

### 15.3 Migration procedure

Declare the migration in the artifact's Build Card and replace its current release binding, controlled color projection, LUTs, classes and state contract together. Remove old analytical aliases and duplicate current rules from the active instruction layer. Preserve exact historical sources for explicitly pinned artifacts and audit. Do not relabel old signed bytes, overwrite published registry identities or copy an old pass receipt to a new build.

Recheck actual Thai/English composition and every new section at narrow/desktop sizes in all offered themes. Revalidate analytical meaning, output format, accessibility, asset bytes and production routes. A token replacement does not prove that layout or meaning survived.

### 15.4 Historical provenance

Source and supersession records are in Appendix A and the document's embedded provenance. They explain how this edition was consolidated; they are not additional normative files or instructions to restore historical formulas, colors or signing claims.

## 16. Learning cases — Example, non-normative

**Status of this whole section: Example — non-normative.** Cases A–F and the three rejected cases illustrate how existing rules can be applied. They do not create requirements, defaults, acceptance criteria, evidence, product facts or exception paths. Project truth and obligations come only from the resolved normative Build Card, authority, claims, assets, artifact-resolved format-implementation record and rule catalog; copied case content establishes none of them.

Case metadata shared by every example: `sourceVersion: v0.9.7-owner.1`; `mediaStatus: conceptual_no_product_evidence`. Each case lists the active rule blocks it illustrates as `ruleAuthority`; those blocks—not the case—remain authoritative.

### Example A — Good: methodology page becomes a PDF

`ruleAuthority: FORMAT-PARITY-01, PDFFMT-01, EVIDENCE-01`

Problem: web page has navbar, side bookmark, evidence disclosures and Read the method CTA

Apply:

1. keep same methodology, claim/evidence IDs and locale proposition
2. global navbar ecosystem/property routes → related-destination group ที่แยกจากโครงหน้า; page-heading anchors/side bookmark → heading hierarchy, TOC และ native PDF bookmarks โดยไม่ทำซ้ำ destination เดียวกันสองระบบ
3. essential disclosure → visible tagged note/appendix
4. CTA → working labelled link + readable destination
5. motion → final state
6. verify final PDF tags, order, Thai glyphs, links, evidence trail and metadata

Pass because representation changes but truth, identity, evidence and action intent do not

### Example B — Good: interactive Location view becomes a board deck

`ruleAuthority: FORMAT-PARITY-01, DECKFMT-01, DATAVIZ-01, MAP-01`

Freeze filters, geography, time, denominator, schema release and data-as-of Carry exact claim/evidence set Put conclusion beside chart/map Move method details to governed appendix Convert hover/motion to visible annotation Record deck export as a new output of the same governed snapshot

Pass because audience cannot mistake frozen result for live or infer an unstated filter

### Example C — Good: calm navbar after scroll

`ruleAuthority: NAV-01, NAV-02, BOOKMARK-01, CTRL-01, A11Y-01`

Header may reduce height/background prominence, but the desktop header keeps no more than four controls total including brand; every control retains its direct 44 × 44 semantic target, name, destination and focus geometry Side bookmark current state remains visible without filled icon Deep-link target lands below header

Pass because calmness comes from surface/hierarchy, not removal of operability

### Example D — Good: social card derived from an evidence report

`ruleAuthority: SOCIALFMT-01, CLAIM-MACHINE-01, EVIDENCE-01`

Choose one approved claim with visible scope/date/unit Add compact evidence cue and durable destination Use approved identity/crop Create Thai and English variants independently Sidecar carries claim/evidence IDs, rights and expiry

Pass because static format stays self-contained while the destination preserves depth

### Example E — Incompatibility is a correct result

`ruleAuthority: COMPARE-01`

Land และ Living show similarly named scores but schema, unit or grain differs Do not normalize for visual convenience Recompute under one approved schema or state incompatible beside the chart and in machine record

Pass because consistency means consistent truth, not forced comparability

### Rejected example — AI-discoverability page factory

`ruleAuthority: DISCOVERY-01, DISCOVERY-02, DISCOVERY-03, AGENT-01, EVIDENCE-01`

Generate hundreds of thin city/query pages, auto-redirect locale, add FAQ schema + llms.txt, allow crawler and call system agent-ready

Reject: page volume adds no user value; scope/evidence blur; locale route unstable; schema/navigation file cannot fix thin content; crawler allow is not permission; no authorization/result/receipt model exists

Correct path: smaller governed page inventory driven by real questions, approved coverage, stable claims, explicit locale routes, truthful projections, accessible controls and separate layer receipts

### Rejected example — animated proof cards

`ruleAuthority: MOTION-01, MOTION-02, MOTION-03, A11Y-01`

Hide every card and chart until it enters viewport, nest stagger, sweep CTA forever and leave source HTML hidden

Reject: proof/action can disappear with JS/lifecycle failure; reading/focus position becomes unstable; motion has no unique user benefit

Correct browser path: source final state, explicit supporting roles only, first proof/action never hidden, finite approach, reduced-motion final state and observer-failure fixture

### Example F — Good: an EvidenceCard inside a third-party AI answer

`ruleAuthority: EVID-05, EVIDENCE-01, CLAIM-MACHINE-01, DATAVIZ-02`

A chat assistant quotes a Living figure "0 new factories registered in this sub-district in 2025" The card carries the 3px four-colour rule, TrustBadge, `0 แห่ง` with state `measured_zero`, dataset, source, date, boundary, the limitation "survey covers registered factories only", the 3 × 3px measure line, the permanent URL and the receipt id; the text-only fallback is one line with the same fields No logo, no panel, no gradient, no motion

Pass because the reader can tell zero from missing, can open the source, and nothing on the card claims more than the record

### Rejected example — vivid series beside an energy hero

`ruleAuthority: DATAVIZ-04, COLOR-01, SURFACE-01`

A product page places a `dial-vivid` categorical chart under a hero that uses `energy.mint` and `energy.sky` accents, and colours the sixth to tenth categories by hue only

Reject: vivid coral/yellow/mint/sky sit within ΔE 6 of the energy tokens, so accents and categories read as one system; slots 7–10 lose identification without shape cues

Correct path: `dial-soft` on that surface (or move the chart to a surface without energy accents), ink tier for labels and thin marks, shape cues from slot 7, hairline legend borders

---

## 17. Embedded machine contract และ asset delivery

The final standalone Markdown contains one parseable JSON object in its final labelled machine-data block. Read that object's fields directly; do not scrape approximate numbers from prose or load a predecessor master. A JSON edition, when supplied, is a generated projection of the same contract rather than a competing source.

| Payload key | Purpose |
|---|---|
| `document` | standalone identity, source provenance and consolidation metadata |
| `release` | exact owner-approved unsigned release identity |
| `policy` | current semantic/analytical/category/verification constraints |
| `ruleCatalog` | 64 stable rule IDs, triggers, methods and acceptance criteria corresponding to this human master |
| `tokens` | current brand, atmosphere, foundation, semantic/data state, typography, controls, layout, theme and motion roles |
| `colorRegistry` | exact current governed color roles |
| `analyticalScales` | all 20 families × 2 themes × 41 exact samples, class records, meaning/unit and outlier policy |
| `contracts.componentContracts` | EvidenceCard, MotifFrame, MotionController, DataTable and MapLegend |
| `contracts.formatPacks` / `formatKits` / `targetProfiles` | selected-format requirements, geometry, fixtures and implementation equivalence |
| `contracts.motifRegister` | exact shared/product registrations, jobs, beats, measured carrier restrictions and source hashes |
| `contracts.assetRegistry` | identity/font/icon/media roles, permissions, exact hashes and permitted delivery contexts |
| `schemas` | complete named schema resources and their exact canonical `$id` values |
| `assetFiles` | exact downloadable binary/code files with URLs, SHA-256 and sizes |

The document can stand alone as a normative Project Source. Real font/image/runtime bytes are delivered as assets because Markdown descriptions cannot replace them. Retrieve the exact bytes for the selected role/output, verify their hashes, and retain all required relative dependencies. A missing mandatory asset remains a missing dependency; do not draw an equivalent logo, synthesize a font or substitute a different product symbol.

Examples and historical provenance are labelled. They never supply product fact, evidence, permission, external trust authority or an artifact pass. Operators' private-key tools MUST NOT be run by an agent; the document does not grant signing authority.

### 17.1 Artifact manifest contract

ใช้ schema identity และ contract ของ Artifact Manifest จาก `machine.schemas["artifact-manifest.schema.json"]` ห้ามคัดลอก version, schema ID หรือ hash จาก prose Example fixture เมื่อมีเป็น optional reference ไม่ให้สถานะ pass แก่งานใหม่ ตารางนี้เป็น human field map; สร้างและตรวจ record ของงานกับ embedded schema และ bytes ของงานจริง

| Object | Required contract |
|---|---|
| root | `schemaVersion`, `release`, `artifact`, `resolution`, `representation`, `delivery`, `validation` |
| release | `releaseRef`, canonical `releaseTupleSha256` |
| artifact | `id`, `buildCardRef`, exact `buildCardSha256`, immutable `artifactBuildId` |
| resolution | `experienceProfile`, exact Build Card `secondaryExperienceProfiles`, `formatPack`, `targetProfileRef`, `capabilityPacks`, `resolvedRuleIds`, resolver-derived `resolvedTestIds`, `nonApplicableRuleIds`, exact `exceptionRefs: []`; resolved + non-applicable rule IDs partition the catalog exactly, while resolved tests exactly cover common, experience, format, capability, target, kit, accessibility and selected-platform portability requirements in that deterministic order |
| representation | exact Build Card `navigation`, including every destination's scoped `current: none \| page \| location`; interactive non-empty navigation has exactly one page route and at most one location anchor, interactive side bookmark has exactly one location, while static formats and `mode: none` never invent current state; exact `actionIds`, `claimIds`; non-empty claims require `claimManifestRef`, `claimManifestSha256`, `claimAsOf`; `localeStates` equals Build Card `locale.states` exactly; and `outputClarity` |
| outputClarity | อยู่ใต้ `representation`; `mode: resolved_only`, `deliveryAudience`, `disclosurePurpose`, `internalGovernanceVisible: false`, blocker refs, zero placeholder count, material-limitation refs; nonordinary purpose adds `disclosureAuthorityRef` + `disclosureAuthoritySha256`, production adds residue-scan receipt |
| delivery | exact audience-delivered `files`; exact one-per-file `contentInspections` with subject hash/media type, format-bound method, dated result and hash-bound evidence—DOCX/PPTX/PDF additionally bind page/slide kind and count, `every_page_or_slide` coverage, combined extraction+OCR+visual method, explicit image-only/outlined-text review, deterministic combined-text hash และ hash-bound raster per unit; `implementationBindings` for selected format-kit record, target-profile record and artifact-resolved format-implementation record; `implementationSourceBindings` for every editable source, template, export preset, style map, component source, or other governed production file actually used, with `audienceDelivered: true` exactly when the same ref/hash/media type is also in `files`; ID-bound `assetBindings`; audience `metadataProjection`; and audience `accessibilityProjection` whose reading order, semantic/interaction/text-layout states, capability-derived alternatives/motion, contrast minima, fixture IDs และ fixture-report summary exactly match `machine.contracts.formatPacks.accessibilityProjectionContract`—static social therefore cannot claim headings, landmarks or controls verified; web additionally binds the exact delivered primary initial document through `primaryHtmlBinding` and `webDiscoveryEvidence` for no-script, hydrated DOM, accessibility tree, internal locale links and sitemap; parsed/evidenced surfaces must equal Build Card discovery/claim/action contracts exactly; social additionally binds time-valid campaign/rights/destination evidence and normalized exact-copy OCR+visual parity; non-web uses `format_metadata` with exact format/primary locale; `files` rejects both canonical paths and exact hashes of every raw color registry file (raw registries with internal provenance from any release; the standalone DS reference itself is purpose-scoped documentation, while ordinary product outputs emit only the necessary sanitized roles/values); every asset binding matches the Build Card asset and artifact-owned registry entry, while an approved asset's receipt grant matches exact `assetId`, `role`, `sha256`, `allowedFormatProfiles`, `allowedSurfaceRoles`, `allowedAudiences`, `publicationPermission`, `licenseOrPermission`, `fallback`, and role-specific `glyphs` or `altOrTextEquivalent` |
| validation | package/artifact/production phase states, computed conformance level, three universal layer results, `resolvedTestResults` that exactly cover the phase's `resolvedTestIds` with unique bundle-local evidence bound to test ID, artifact build, governed method, pass result, observation time, and exact criterion text + SHA-256 derived from common, experience, format, capability, target, kit, accessibility and selected-platform portability registries in deterministic order (generic self-authored summaries do not pass), and dated acceptance/gate receipts keyed by catalog acceptance ID with criterion assertion + hash; at `artifact_qa_passed` discovery/readability/action, every resolved non-production test and acceptance are `pass`, required accessibility and portability fixture receipts exactly match the artifact-resolved implementation record, and OUTPUT-CLARITY-01-A covers the exact `delivery.files` set/hashes and cites every content-inspection evidence file; at `production_verified` every resolved production test and acceptance also passes, the returned web bytes equal `primaryHtmlBinding.sha256`, and OUTPUT-CLARITY-01-B covers that same exact file/inspection set |

Phase states use `pending`, `passed`, `failed` หรือ `not_applicable`; resolved acceptance/layer/gate results use `pass`, `fail` หรือ `not_tested` เท่านั้น การไม่ใช้กฎอยู่ใน `resolution.nonApplicableRuleIds` ไม่ใช่ layer/gate result ก่อน `artifact_qa_passed` ทั้ง discovery/readability/action MUST เป็น required + `pass` และ resolved non-production acceptance ทุกอัน MUST `pass`; information/read-only artifact พิสูจน์ action layer ด้วยขอบเขตที่ซื่อตรง ไม่ใช้ `not_applicable` `fail` หรือ `not_tested` blocks artifact-QA promotion

`releaseTupleSha256` MUST คำนวณจาก tuple fields และ canonicalization algorithm ที่ active validator บังคับ แล้ว bind ค่าที่ได้ใน manifest ห้ามคัดลอก digest จาก prose หรือจาก artifact อื่น

### 17.2 Current catalog coverage

The current machine catalog covers the following 64 stable rule IDs. Coverage is not an assertion that every final artifact has passed their applicable checks:

GOV-01, AUTHORITY-01, LAYER-01, COMPARE-01, EVIDENCE-01, EVID-05, OUTPUT-CLARITY-01, AHA-01, BRAND-01, LOGO-01, FAVICON-01, COLOR-01, SURFACE-01, TYPE-01, ICON-01, LAYOUT-01, CTRL-01, THEME-01, ASSET-DELIVERY-01, PROFILE-01, CAPABILITY-01, PARITY-01, NAV-01, NAV-02, BOOKMARK-01, CTA-01, CTA-02, MOTION-01, MOTION-02, MOTION-03, MOTION-04, MOTIF-01, MOTIF-02, MOTIF-03, MOTIF-04, MOTIF-05, MOTIF-06, A11Y-01, CLAIM-MACHINE-01, DISCOVERY-01, DISCOVERY-02, DISCOVERY-03, AGENT-01, SECURITY-01, DATAVIZ-01, DATAVIZ-02, DATAVIZ-03, DATAVIZ-04, DATAVIZ-05, GATE-01, MAP-01, WEBFMT-01, APPFMT-01, DOCFMT-01, PDFFMT-01, DECKFMT-01, SOCIALFMT-01, FORMAT-PARITY-01, COMPONENT-01, MEDIA-01, CAROUSEL-01, SOCIAL-FEED-01, QA-01 และ RELEASE-01

---

## 18. Primary external references

External references inform this release but do not supersede owner-approved Landometer truth, product evidence or the effective DS package

- Google Search Central, AI features and your website: https://developers.google.com/search/docs/fundamentals/ai-optimization-guide
- Google Search Central, multilingual sites: https://developers.google.com/search/docs/specialty/international/managing-multi-regional-sites
- Google Search Central, canonical URLs: https://developers.google.com/search/docs/crawling-indexing/consolidate-duplicate-urls
- Google Search Central, sitemaps: https://developers.google.com/search/docs/crawling-indexing/sitemaps/build-sitemap
- Google Search Central, structured data guidelines: https://developers.google.com/search/docs/appearance/structured-data/sd-policies
- Google Search Central, JavaScript SEO: https://developers.google.com/search/docs/crawling-indexing/javascript/javascript-seo-basics
- RFC 9309 Robots Exclusion Protocol: https://www.rfc-editor.org/rfc/rfc9309
- OpenAI Publishers and Developers FAQ: https://help.openai.com/en/articles/12627856-publishers-and-developers-faq
- W3C WAI-ARIA disclosure pattern: https://www.w3.org/WAI/ARIA/apg/patterns/disclosure/
- W3C disclosure navigation example: https://www.w3.org/WAI/ARIA/apg/patterns/disclosure/examples/disclosure-navigation/
- W3C WCAG 2.2: https://www.w3.org/TR/WCAG22/
- W3C animation from interactions: https://www.w3.org/WAI/WCAG22/Understanding/animation-from-interactions.html
- W3C target size minimum: https://www.w3.org/WAI/WCAG22/Understanding/target-size-minimum.html
- montri-th/motif release 1.2.1 (runtime, final-state SVG, motif-library.json, OWNER-MOTION-01): https://github.com/montri-th/motif · https://montri-th.github.io/motif/
- Björn Ottosson, OKLab colour space (basis of approved LUT construction and ΔE measurements; runtime uses exact samples): https://bottosson.github.io/posts/oklab/
- Web app manifest, maskable icons: https://www.w3.org/TR/appmanifest/ · https://web.dev/articles/maskable-icon
- The Open Graph protocol: https://ogp.me/

---

## 19. Definition of Done

An artifact is done only when:

1. exact release, profile, format and capability configs resolve through ref + hash + schema bindings
2. authority, product layer, claim manifest/record hashes, evidence, rights and artifact-owned asset registries resolve
3. one job, primary path, AHA, action and completion are clear
4. approved identity, color, type, icon, layout and media roles are used
5. navigation/bookmark/CTA direct semantics pass where applicable
6. motion has user benefit, static equivalent and lifecycle/reduced-motion pass
7. discovery/readability/action remain separate and truthful, and all three universal layers are required + `pass` with bundle-local receipts at artifact QA
8. selected kit, target and artifact-resolved format-implementation record; required fixture receipts; exact final delivery bytes; every required web discovery surface; every Office/PDF rendered page or slide; and every native editable/source asset actually used are resolved and hash-verified through their distinct delivery/source bindings while target-format semantic parity passes
9. privacy/security and product/evidence boundaries pass
10. every resolved applicable MUST/MUST NOT acceptance passes through bundle-local receipt hashes; non-applicable rules are declared only in `resolution.nonApplicableRuleIds`; OUTPUT-CLARITY-01-A covers the exact `delivery.files` set and hashes from `artifact_qa_passed`, and OUTPUT-CLARITY-01-B covers the same set before `production_verified`
11. generated machine record agrees exactly with the visible artifact; hidden governed truth, JSON-LD overclaim, action/evidence destination drift, missing locale/sitemap evidence, or an uninspected rendered unit blocks completion
12. Build Card/Artifact Manifest declare delivery audience/purpose; audience-visible bytes/metadata contain only resolved audience meaning, with no internal approval/release text, placeholder or explanation of unfinished production work; any nonordinary DS/provenance disclosure has hash-bound authority and material limitations remain specific and proximal
13. production verification is not claimed before it occurs
14. Every chart or map resolves its scale families per analytical surface/zone and series variant; every governed value carries one of the six EVID-05 states, with finite nonzero/zero/null machine values as defined.
15. (v0.9.7) every web build binds one approved icon set, a pattern-conformant title and an OG 1200 × 630 preview; identity motion, when used, ships the exact runtime bytes, replays only while visible, stops off-screen, and holds the final state under reduced motion, no-JavaScript and print
16. (v0.9.7) every motif carries a registered job, a beat and a hash-exact final state; a route carries at most three motion moments and none on the first answer, the primary proof or the primary action; every motif placement declares its host surface and passes the measured carrier table in every theme it renders (MOTIF-06); every delivered scale sample/class and series value equals the approved record (analytical HEX invariant across themes), no analytical value sits in an applicable retired hue window (DATAVIZ-04), and GATE-01 evidence binds the exact delivered asset hashes

---

## 20. Roles: ใครใช้ release นี้อย่างไร

ทุกบทบาทใช้กติกาชุดเดียวในไฟล์นี้ เริ่มจากหัวข้อที่เกี่ยวข้อง แล้วเปิด machine records ตามงาน ไม่ต้องประกอบ master รุ่นเก่ากับส่วนเพิ่ม

| Role | Start | Use and verify |
|---|---|---|
| AI / agent | §0–3, §12–14 | resolve release/product/job; use exact embedded values; preserve evidence and product boundaries; never invent approvals, retrieval, installation or a test pass |
| Developer | §5–12, §17 | exact assets/build-kit and scale tables, current component/schema contracts; run available package/artifact checks and inspect actual runtime/output |
| Designer | §4–9, §11.9 | brand voice/identity, type/layout, exact current colors, six evidence states, measured motif carriers and actual-size visual review |
| Product | §2–3, §7, §11 | one job/first useful value/action, real capabilities and permissions, denominator/threshold/state requirements and truthful outcomes |
| Marketing | §3–5, §8.6, §11.8 | supported claims, approved protected wording, static social/OG safe areas, exact visible destination and current evidence |
| Sales | §3–4, §7 | EvidenceCard and claim/source/limitation, action promise and real product availability; no unsupported price, contract, pipeline or traction claim |
| Reader / project maintainer | §0, §15, §19 | add the complete shared LDS file to Project Sources; for product-scoped work also add the separate current product Add-on; retire superseded design instructions, then verify retrieval in a new conversation |

Product status and evidence labels come from the product's approved truth and the governed label set; tester counts are not traction, an LOI is not a contract, and candidate examples do not authorize external claims. The complete LDS is the common foundation for every product. Product-specific rules belong in a separate Add-on used alongside this foundation, with the ownership boundaries of LAYER-01; the Add-on does not reproduce the shared DS.

Successful adoption means a person or agent can identify the current shared source and any required product Add-on, use exact ready assets and learn from actionable check results. A local install does not establish ChatGPT or Claude organization activation. Verify each relevant project and client separately and report the actual coverage.

## 21. Release boundaries and recorded follow-ups

This edition consolidates the approved DS 0.9.7 contract without making the user load predecessor rules. Approved colors, category IDs, protected language, six value states and social targets are authoritative as printed and embedded here. It does not silently resolve unrelated product-asset, external-repository, source-reconstruction, key-revocation or artifact-specific governance work.

Product icons, stings and overlays require actual product-approved bytes and their role/hash record. A pre-approval without bytes is not a ready asset. Verify the separate current product Add-on and its approved asset records before using a product-specific identity; historical open-item wording is not a current claim that every product remains unfinished.

Automated structural parity is not native Thai/English semantic review. Numeric palette diagnostics are not actual-size, low-brightness, gray/CVD or assistive-technology review. A published file is not proof that every ChatGPT/Claude project or every team member is using it. Record each check and activation with its observed coverage.

The Design System succeeds when teams and AI systems can make different compositions for different formats while preserving the same truth, identity, evidence boundary, action promise and quality bar.

---

## Appendix A. Source lineage — Historical / Reference, non-normative

The full human master follows the established chapter structure. Its unchanged obligations come from the archived full successor of the 0.9.1 master; changed 0.9.7 obligations have been substituted inline. No predecessor document is a required reading dependency for this file.

| Source | Provenance role |
|---|---|
| archived `Landometer Design System v0.9.4.md` | full successor master carrying the retained 0.9.1 structure and rules; SHA-256 `8e6e89a52b6a1ba0dc3c39f4f51b6b82e84e1281811713bd14fd36ab0f2d1886` |
| DS 0.9.5 GUIDE / BRAND / policy / release | historical baseline: retained protected brand wording and non-gradient obligations; identity of that historical baseline came from 0.9.6; current identity is 0.9.7 |
| DS 0.9.5 tokens / color-srgb-08 registries | historical baseline: predecessor diverging values (superseded in 0.9.7), retained categorical, atmosphere and foundation values; six-state contract and all other preserved tokens |
| Owner-approved sequential R2 / DS 0.9.6 color-srgb-09 | historical 0.9.6 sequential records, superseded by the 0.9.7 light-source decision; approval source SHA-256 `0ae97bf20fe51521ddb71aed3f5ae99f5206cd934492eff4934e97a29765e4fa` |
| Owner-approved Story r4 / DS 0.9.7 color-srgb-10 | current 40 analytical records: original LIGHT anchors, LUTs and classes unchanged on both themes; Story SHA-256 `be696bc8f41520f85167678634407838ac5ed5c9bb9a802585146b0b2f36415f` |
| Owner-approved Location r2 / separate optional 0.9.7 profile | current 16 roles and 12 quantitative recipes use original LIGHT values on both themes; four SWOT evidence lenses have no gradient; Location SHA-256 `0906c14107ef20a2a42a5d1c830ffa56c0a88caca34d54096dc58b346faba279` |
| current evidence-value / social-sidecar schemas | typed nonzero/zero/null contract and square/OG output targets |
| owner instruction, 29–30 September 2026 | no decorative bracket/left-rail treatment; preserve full normative structure; consolidate one-file adoption |

Historical release signatures remain attached only to their original immutable subjects. They do not sign this document or the current owner distribution. The deterministic builder records every replaced range, exact source/output hashes, all 64 rule IDs and all acceptance IDs. That provenance supports audit and reproducibility; it does not claim a new cryptographic signature or an unperformed bilingual review.

The machine payload that follows is part of this same normative document. Its current fields implement the current chapters; historical source identities remain explicitly provenance.

Current color provenance: Story r4 LIGHT source SHA-256 `be696bc8f41520f85167678634407838ac5ed5c9bb9a802585146b0b2f36415f`; Location r2 LIGHT role/scale source `0906c14107ef20a2a42a5d1c830ffa56c0a88caca34d54096dc58b346faba279`; the 1 October 2026 owner instruction selects these exact light values for both themes. Prototype dark formulas and their contrast claims are not adopted.

<!-- LDS_MACHINE_BEGIN -->
```json
{
"document":{"schemaVersion":"lds-standalone-document-1","documentId":"lds-0.9.7-landometer-standalone-r1","documentRevision":"standalone-0.9.7-r1","title":"Landometer Design System v0.9.7","dsVersion":"0.9.7","releaseRef":"v0.9.7-owner.1","colorSetId":"color-srgb-10","product":"landometer","structureBaseline":"Landometer Design System v0.9.1","humanSha256":"f3f67736c9d27c05e96c60254dffc9fd51002400f4d9cea46bf860e370934200","requiredNormativeFiles":1,"supersedes":"Previous LDS Project Source masters, overlays and fragmented machine sources for new work in this scope."},
"release":{
"dsVersion":"0.9.7",
"releaseRef":"v0.9.7-owner.1",
"machinePackage":"v0.9.7-owner.1",
"authoringRevision":"0.9.7-owner.1",
"colorSetId":"color-srgb-10",
"status":"owner-approved",
"effectiveFor":"work explicitly adopting this owner distribution",
"signatureStatus":"unsigned",
"signedRelease":false,
"ownerApproval":{"authority":"Montri","date":"2026-10-01","reference":"owner-message:2026-10-01:release-0.9.7-original-light-hex-on-both-themes","decision":"Adopt Story r4 and Location r2 LIGHT colors. Use each exact light anchor/LUT/class and role HEX unchanged on dark, with the same data direction; no derived dark formulas. Existing categorical palettes and decorative gradients retain their own contracts."},
"documentRevision":"standalone-0.9.7-r1",
"normativeDependency":"none",
"consolidationApproval":{"date":"2026-10-01","authority":"Montri","scope":"Publish owner-approved Story and Location LIGHT values unchanged on both themes, preserving numerical direction and the complete chapter structure; keep product profiles separate."},
"identityClarification":{"date":"2026-09-30","authority":"Montri","basis":"Current owner messages permit wordmark colour changes including per-letter colours and confirm the official logo on a dark background.","statements":["wordmark ผมให้เปลี่ยนสีได้นะ ไม่ซีเรียส จะเอาตัวอักษรละสีเลยก็ได้ไม่ติด ดูส่งเสริมความหลากหลายดี ที่เลือกสีเทาทีแรกเพราะจะได้ ใช้ได้ทั้ง background สว่างและมืดใน logo แบบเดียว","logo on dark background แสดงได้สิ มีปัญหาอะไรครับ"]}
},
"policy":{
"schemaVersion":"lds-standalone-policy-0.9.7-r1",
"releaseRef":"v0.9.7-owner.1",
"colorSetId":"color-srgb-10",
"approval":{"authority":"Montri","date":"2026-10-01","reference":"owner-message:2026-10-01:release-0.9.7-original-light-hex-on-both-themes","decision":"Adopt Story r4 and Location r2 LIGHT colors. Use each exact light anchor/LUT/class and role HEX unchanged on dark, with the same data direction; no derived dark formulas. Existing categorical palettes and decorative gradients retain their own contracts.","inputs":{"approved-story-r4.json":"be696bc8f41520f85167678634407838ac5ed5c9bb9a802585146b0b2f36415f","approved-location-r2.json":"0906c14107ef20a2a42a5d1c830ffa56c0a88caca34d54096dc58b346faba279","approved-location-metrics.json":"44ad44d254262932812b61a5ca9e7a4b27c6ec89c7bfdc7da9eb0bb081a387e7"},"signatureStatus":"unsigned-owner-approved","cryptographicReleaseAttestation":false},
"precedence":["The current standalone document supplies the complete LDS 0.9.7 normative rules and embedded exact machine contracts.","A separate named-product Add-on applies alongside the complete LDS base, only to that product and its declared permitted scope.","Content truth, source evidence, rights and action authority remain independent of visual design authority.","Superseded design-system files are historical only. A historical release is used only when the user explicitly pins historical work."],
"sourceRules":{
"COLOR-01":"Use exact color-srgb-10 analytical tables and approved 17-value Story vocabulary. Original categorical and decorative roles remain separate.",
"DATAVIZ-02":"Three explicit anchors at 0/20/40; use exact approved 41 samples and classes 3/5/7/9. A sequential midpoint changes hue, not numerical direction. Start colors are semantic near-whites, not a compulsory universal cream.",
"DATAVIZ-03":"Analytical light and dark anchors, LUTs and classes are byte-for-byte equal in numerical values. Preserve value direction. No dark derivation, inversion, recoloring or theme-dependent numerical normalization. Use labels, borders and a neutral backplate for actual-surface contrast.",
"DATAVIZ-04":"Every delivered analytical sample must avoid the applicable earth and violet windows; pink is allowed. Domain, unit and redundant cues remain mandatory.",
"DATAVIZ-05":"Stable 10 IDs and cues; exact unchanged light values plus approved dark soft/vivid/ink. Deprecated v5 aliases prohibited.",
"EVID-05":"Six value states: measured, measured_zero, no_data, out_of_scope, suppressed, not_yet; finite nonzero, zero, or null respectively.",
"SOCIALFMT-01":"Full inherited sidecar contract admits square1080x1080 and OG1200x630 using the new schema; creative hash and dimensions required.",
"GOV-01/RELEASE-01":"This owner-approved distribution is unsigned. An artifact may pin this exact channel and report scoped checks, but MUST NOT fabricate or inherit a signed 0.9.7 receipt or call itself fully conformant from package verification.",
"LAYOUT-01":"No decorative bracket-shaped highlights or colored left rails for selected navigation, tabs, cards or callouts. Use restrained background, text weight and spacing. Preserve visible keyboard focus and meaningful data borders.",
"LOGO-01":"Landometer wordmark MAY change colour, including a different colour for each letter, while preserving its letterforms and proportions. Gray is an optional versatile default, not a required identity colour. This owner-authorized wordmark colour treatment does not require separate permission for each colour. The official logo MAY appear on light or dark backgrounds when the complete name and symbol remain legible at the actual size. Evaluate a Brand Blue visibility problem for that specific pairing; it does not prohibit dark backgrounds generally. MOTIF-06 full/quiet carrier restrictions apply to registered motifs, not official logo PNGs. This permission changes wordmark colour only; it does not authorize symbol recolouring, redrawing or distortion, or change interface/data colour contracts.",
"QA-01":"Review actual rendered Thai and English content at narrow and desktop widths, including every new section, squeezed headings and sibling overlap. Exact package checks do not replace artifact review or prove signed conformance."
},
"analytical":{
"families":20,
"themes":["light","dark"],
"samplesPerTheme":41,
"classCounts":[3,5,7,9],
"recommendedClassCounts":[5,7],
"selection":"round(i * 40 / (n - 1))",
"minAdjacentClassDeltaEOK":2.2,
"fixedLutRequired":true,
"runtimeInterpolation":"forbidden",
"noDataSeparateFromZero":true,
"domainAndThresholds":"consumer supplied; never silently normalized or clamped",
"outlierPolicy":"consumer must declare reject, extend with approved scale, or explicit end-bin; never silently clamp",
"divergingMidpoint":"must be meaningful and named; no equal-brightness arm claim",
"warmDensity":{"density.area":"orange","density.capita":"rose","density.household":"scarlet","built":"gold"},
"semanticCuesRequired":["metric label","unit","denominator when density","legend","accessible values/table"],
"dataRolesCannotUseAtmosphere":true,
"sequentialAnchors":{"count":3,"indices":[0,20,40],"start":"exact family-specific approved semantic near-white","middleHue":"distinct from the end hue, never merely its lighter tint","singleDirection":true,"lightness":"strictly decreasing on both themes","relativeLuminance":"strictly decreasing on both themes","approvalSourceSha256":"be696bc8f41520f85167678634407838ac5ed5c9bb9a802585146b0b2f36415f","constructionOnly":"authoring construction only; consumers use exact LUT samples","notDiverging":"The middle colour is a perceptual turn, not zero, balance or a second data direction."},
"themeInvariant":{"required":true,"sourceTheme":"light","anchorsEqual":true,"lutEqual":true,"classesEqual":true,"valueDirectionEqual":true,"darkDerivationForbidden":true,"contrastRemedy":"Keep data HEX; use labels, meaningful boundaries or a neutral backplate. Test actual surfaces and sizes. No automatic 3:1, CVD or full accessibility claim."},
"semanticZones":{"activity":"cool mint/blue","water":"aquatic blue/cyan","density":"warm with explicit denominators"},
"bannedHue":{
"earth":{"hue":[30,100],"C":[0.035,0.145],"Lmax":0.62},
"violet":{"hue":[285,345],"Cmin":0.04},
"clay":{"hue":[22,100],"C":[0.09,0.145],"L":[0.62,0.74]},
"purgedEarthTaupe":["#795300","#846100","#686354","#8B877A","#B6AD98","#A59A80","#827C68","#85837A"],
"retiredExact":["#795300","#846100","#686354","#8B877A","#B6AD98","#A59A80","#9E476F","#E982AE","#827C68","#85837A"],
"proximity":{"dE":6,"hueLane":20},
"pinkRuling":{"hue":[350,20],"legal":true,"decidedOn":"2026-09-17"},
"scope":"Every categorical and analytical color, including all 1640 fixed LUT entries in both themes.",
"earthRule":"Fail when hue, chroma and lightness simultaneously match the earth window, or within the declared proximity to a purged earth/taupe color.",
"violetRule":"Fail when hue and chroma simultaneously match the violet window.",
"clayRule":"Warning on light surfaces only; other earth/violet/proximity/exact-retired gates still apply in both themes.",
"retiredExactRule":"Fail any exact retired color match.",
"lutAudit":"All current fixed LUT entries are gates. Runtime HSL interpolation, lightness transforms or hue substitution are forbidden."
}
},
"categorical":{"stableIds":true,"bindBy":"category ID","nonColorCuesRequired":true,"darkInkMinContrastOnCanvas":4.5,"fillSeparation":">=1px border.default or ink outline; do not imply all light fills meet3:1","vividAndEnergyAccentShareSurface":false},
"forbiddenAliases":["--ldm-series-NN-light","--ldm-series-NN-dark","--ldm-product-ijji-*","--scale-density-*"],
"brand":{"voice":["calm","clear","evidence-aware","civic-minded","action-capable"],"preserve":["protected lines and roles","brand core","foundation","semantic states","typography","logo assets","7 atmosphere recipes","layout and motion contracts"],"ijjiIdentity":"ground.mist for light; #59C7E8 to #3BD3CB for dark. Retired warm product aliases must not be used as identity."},
"verificationBounds":["Package parity and analytical math are automated.","Rendering, actual surface contrast, native Thai copy, source truth, threshold semantics, CVD/grayscale usability and each output format require artifact review.","No claim of signed 0.9.7 release, complete conformance, universal platform enforcement or team installation.","Inherited open governance/product-icon/motif/signing follow-ups remain open unless specifically resolved here.","Dark numerical colors intentionally equal light values; actual-surface contrast and CVD usability are artifact checks, not universal package guarantees."],
"supportingPalette":{"name":"Story","count":17,"themeInvariant":true,"scope":"supporting editorial vocabulary; not 17 simultaneously distinguishable chart series","locationRules":"Optional separate Location Intelligence profile; not shared LDS business semantics"},
"identity":{
"scope":"Landometer official logo and wordmark",
"ownerDirection":{"date":"2026-09-30","authority":"Montri","basis":"Current owner messages permit wordmark colour changes including per-letter colours and confirm the official logo on a dark background.","statements":["wordmark ผมให้เปลี่ยนสีได้นะ ไม่ซีเรียส จะเอาตัวอักษรละสีเลยก็ได้ไม่ติด ดูส่งเสริมความหลากหลายดี ที่เลือกสีเทาทีแรกเพราะจะได้ ใช้ได้ทั้ง background สว่างและมืดใน logo แบบเดียว","logo on dark background แสดงได้สิ มีปัญหาอะไรครับ"]},
"wordmark":{"colourChangeAllowed":true,"perLetterColourAllowed":true,"grayRequired":false,"preserveLetterforms":true,"preserveProportions":true,"perColourApprovalRequired":false},
"officialLogo":{"lightBackgroundAllowed":true,"darkBackgroundAllowed":true,"actualSizeLegibilityRequired":true,"brandBlueAssessedPerPairing":true,"blanketDarkBan":false,"motifCarrierRulesApply":false},
"scopeBoundary":"Wordmark colour permission does not recolour the symbol or modify interface, analytical or registered motif colour contracts."
}
},
"resourceAliases":{
"policy.json":"#/machine/policy",
"tokens.v0.9.7.json":"#/machine/tokens",
"rule-catalog.json":"#/machine/ruleCatalog",
"component-contracts.json":"#/machine/contracts/componentContracts",
"format-packs.json":"#/machine/contracts/formatPacks",
"format-kits.json":"#/machine/contracts/formatKits",
"target-profiles.json":"#/machine/contracts/targetProfiles",
"asset-registry.json":"#/machine/contracts/assetRegistry",
"motif-register.v0.9.7.json":"#/machine/contracts/motifRegister",
"color-srgb-10.tokens.json":"#/machine/colorRegistry",
"color-srgb-10.scales.json":"#/machine/analyticalScales",
"action-contracts.schema.json":"#/machine/schemas/action-contracts.schema.json",
"agent-action-authority.schema.json":"#/machine/schemas/agent-action-authority.schema.json",
"agent-action-definition.schema.json":"#/machine/schemas/agent-action-definition.schema.json",
"agent-action-receipt.schema.json":"#/machine/schemas/agent-action-receipt.schema.json",
"agent-action-revocation.schema.json":"#/machine/schemas/agent-action-revocation.schema.json",
"agent-action.schema.json":"#/machine/schemas/agent-action.schema.json",
"agent-confirmation-receipt.schema.json":"#/machine/schemas/agent-confirmation-receipt.schema.json",
"artifact-manifest.schema.json":"#/machine/schemas/artifact-manifest.schema.json",
"asset-approval-receipt.schema.json":"#/machine/schemas/asset-approval-receipt.schema.json",
"asset-registry.schema.json":"#/machine/schemas/asset-registry.schema.json",
"build-card.schema.json":"#/machine/schemas/build-card.schema.json",
"capability-config.schema.json":"#/machine/schemas/capability-config.schema.json",
"claim-evidence-capture.schema.json":"#/machine/schemas/claim-evidence-capture.schema.json",
"claim-manifest.schema.json":"#/machine/schemas/claim-manifest.schema.json",
"claim-record.schema.json":"#/machine/schemas/claim-record.schema.json",
"conformance-receipt.schema.json":"#/machine/schemas/conformance-receipt.schema.json",
"crawler-purpose-policy.schema.json":"#/machine/schemas/crawler-purpose-policy.schema.json",
"disclosure-authority.schema.json":"#/machine/schemas/disclosure-authority.schema.json",
"format-implementation.schema.json":"#/machine/schemas/format-implementation.schema.json",
"format-kits.schema.json":"#/machine/schemas/format-kits.schema.json",
"migration-ledger.schema.json":"#/machine/schemas/migration-ledger.schema.json",
"motif-register.schema.json":"#/machine/schemas/motif-register.schema.json",
"promotion-snapshot.schema.json":"#/machine/schemas/promotion-snapshot.schema.json",
"social-sidecar.schema.json":"#/machine/schemas/social-sidecar.schema.json",
"source-lineage-receipt.schema.json":"#/machine/schemas/source-lineage-receipt.schema.json",
"structured-data-projection.schema.json":"#/machine/schemas/structured-data-projection.schema.json",
"target-profiles.schema.json":"#/machine/schemas/target-profiles.schema.json",
"verification-attestation.schema.json":"#/machine/schemas/verification-attestation.schema.json",
"verification-trust-policy.schema.json":"#/machine/schemas/verification-trust-policy.schema.json",
"verification-trust-store.schema.json":"#/machine/schemas/verification-trust-store.schema.json",
"evidence-value.schema.json":"#/machine/schemas/evidence-value.schema.json",
"scoped-check-receipt.schema.json":"#/machine/schemas/scoped-check-receipt.schema.json"
},
"ruleCatalog":{
"schemaVersion":"1.9",
"releaseRef":"v0.9.7-owner.1",
"status":"active",
"protectedBrandLines":{"north_star":"Visualize City, Shape Tomorrow.","promise":"Measure What Matters. Make It Actionable.","cultural_activation":"Let us cultivate our city with data."},
"normativeVocabulary":{"MUST":"Required. A failure blocks conformance and release.","MUST_NOT":"Prohibited. A failure blocks conformance and release.","SHOULD":"Recommended when contextually appropriate. An unmet SHOULD does not fail conformance unless a separate MUST requires a decision record.","MAY":"Optional; it cannot be used to claim a capability that is absent."},
"requiredCoreRuleIds":["GOV-01","AUTHORITY-01","LAYER-01","COMPARE-01","EVIDENCE-01","OUTPUT-CLARITY-01","AHA-01","BRAND-01","LOGO-01","COLOR-01","SURFACE-01","TYPE-01","ICON-01","LAYOUT-01","THEME-01","ASSET-DELIVERY-01","PROFILE-01","CAPABILITY-01","PARITY-01","CTA-01","CTA-02","A11Y-01","CLAIM-MACHINE-01","SECURITY-01","FORMAT-PARITY-01","MEDIA-01","COMPONENT-01","QA-01","RELEASE-01"],
"resolvedAcceptancePolicy":"every_resolved_acceptance_must_pass",
"rules":[
{
"id":"GOV-01",
"title":"Release state is truthful and audience-bounded",
"section":"governance",
"normativeLevel":"MUST",
"scope":"all",
"requirement":"Artifact manifests, receipts and sidecars MUST bind exact `releaseRef` and a canonical tuple hash derived from the active contract. `machine.release` records owner-approved status, approver, date and unsigned signature status. Approval does not certify every artifact or activate every account. Internal approval workflow, rule/schema identifiers and package state MUST NOT appear on an ordinary audience-facing product surface. A DS-reference or provenance document MAY show only the identifiers/facts necessary for that purpose under its recorded disclosure authority; unresolved dependencies, debug details, placeholders and local/source paths remain prohibited on audience-facing output.",
"acceptance":[{"checkId":"GOV-01-A","method":"automated","criterion":"release binding resolves `v0.9.7-owner.1`, owner/date, color set and `signedRelease: false`; artifact tuple/hash resolves that exact release, without inherited or fabricated 0.9.7 signing claims"},{"checkId":"GOV-01-B","method":"manual","criterion":"ordinary audience-facing surfaces contain no internal approval workflow or irrelevant machine identifiers; DS/provenance disclosure stays within its declared purpose and actual evidence"}],
"sourceTextSha256":"9828b60e56ce6e1f5d906bfc485749e04ecc8be95e5777203e5767393c99fe61",
"sourceRuleId":"GOV-01"
},
{
"id":"AUTHORITY-01",
"title":"Resolve authority before design",
"section":"governance",
"normativeLevel":"MUST",
"scope":"all",
"requirement":"Build Card MUST ระบุ content sources, claim owner, evidence boundary และ applicable release ก่อนเริ่ม composition; example/proposal MUST NOT override approved truth เงียบ ๆ\n\n\nข้อความที่ติดป้าย Example/Reference/Candidate/Historical MUST NOT ถูกคัดลอกไปใช้เป็น authority หากขัดกับ numbered rule block, `machine.ruleCatalog` หรือ approved product/portfolio truth ให้ใช้ authority เหล่านั้นและแก้ตัวอย่าง ไม่ตีความตัวอย่างเป็นข้อยกเว้น",
"acceptance":[{"checkId":"AUTHORITY-01-A","method":"automated","criterion":"required authority fields มีค่าและ resolve ได้"},{"checkId":"AUTHORITY-01-B","method":"manual","criterion":"conflict ถูกตัดสินตาม domain authority และมี record"},{"checkId":"AUTHORITY-01-C","method":"automated","criterion":"pre-generation plan records authority, product scope, job, object, AHA, actions, format, capabilities, claims, assets, assumptions, blockers and QA without invented approval/evidence"}],
"sourceTextSha256":"50a79eb7b9a6114dec2ad513ac1d39798d4d3805a84755ed22cea12e26820844",
"sourceRuleId":"AUTHORITY-01"
},
{"id":"LAYER-01","title":"Keep shared and product-specific layers separate","section":"architecture","normativeLevel":"MUST","scope":"all","requirement":"Shared Landometer language MUST product-neutral across Land, Location และ Living ส่วน named-product fact, audience, sector, data และ permission MUST อยู่ใน product-specific layer","acceptance":[{"checkId":"LAYER-01-A","method":"manual","criterion":"capability และ claim ทุกอันติดป้าย shared หรือ named product"},{"checkId":"LAYER-01-B","method":"manual","criterion":"ไม่มี municipality, retail, F&B, ijji หรือ CityWiki example ถูกเหมารวมเป็น portfolio truth โดยไร้ approval"}],"sourceTextSha256":"563751989be8c6a6af7d70c631c7e33f0ff99f497508ba30d97942dd084adb62","sourceRuleId":"LAYER-01"},
{"id":"COMPARE-01","title":"Comparisons disclose compatibility","section":"evidence","normativeLevel":"MUST","scope":"all","requirement":"การเปรียบเทียบข้าม product หรือ city MUST ใช้ schema และ compatible release เดียวกัน มิฉะนั้น MUST แสดง incompatibility ก่อนผู้อ่านตีความ","acceptance":[{"checkId":"COMPARE-01-A","method":"automated","criterion":"compared series ทุกชุดมี schemaRelease"},{"checkId":"COMPARE-01-B","method":"manual","criterion":"mismatch แสดงข้าง comparison และใน machine record"}],"sourceTextSha256":"6c5b75b6b9d05cc576fdff99cf27a8d78880fd30ca2f908bf7f5ed935c8e9b46","sourceRuleId":"COMPARE-01"},
{"id":"EVIDENCE-01","title":"Claims retain evidence boundaries","section":"evidence","normativeLevel":"MUST","scope":"all","requirement":"Material factual claim ทุกอัน MUST resolve stable claim record ที่มี scope, source, method, time basis, status และ owner Limitation หรือ uncertainty ที่มีผลต่อการตีความ MUST มองเห็นใกล้ claim ในภาษาของผู้ใช้ ส่วน missing evidence ที่ทำให้ claim ไม่ปลอดภัยต้อง block claim/output ไม่ใช่กลายเป็นข้อความแก้ตัว","acceptance":[{"checkId":"EVIDENCE-01-A","method":"automated","criterion":"displayed material claimId resolve record เดียวที่มี required fields"},{"checkId":"EVIDENCE-01-B","method":"manual","criterion":"wording ไม่เกิน scope/certainty ของ evidence"}],"sourceTextSha256":"56d8d62cde1baa05c1d03d4e3a5cb610520d5d6b590a42a79ead81c2e35b3792","sourceRuleId":"EVIDENCE-01"},
{
"id":"EVID-05",
"title":"Zero is a fact; missing is a question",
"section":"evidence",
"normativeLevel":"MUST",
"scope":"data_table,data_visualization,map,agent_readable",
"requirement":"Every governed value cell, map unit and machine field carries one of six states: `measured`, `measured_zero`, `no_data`, `out_of_scope`, `suppressed`, `not_yet`. `measured` carries a finite nonzero number; `measured_zero` carries numeric `0`; the four exceptional states carry `null`. Do not collapse missing, suppression or scope into zero. Suppressed underlying values MUST NOT leak through HTML attributes, JSON or hidden exports. Agents receive the explicit state with every governed numeric/null value.\n\n\n| State | ป้ายไทย · English | Machine value | Visible / map treatment | Required context |\n|---|---|---|---|---|\n| `measured` | ค่าที่วัดได้ · Measured | finite nonzero number | exact value + unit; approved analytical class | unit, source, time, scope, denominator when relevant |\n| `measured_zero` | ศูนย์ (สำรวจแล้ว) · Zero (measured) | `0` | numeral 0 + unit; lowest-class fill + `dataState.zero` outline 2px | unit, survey completeness |\n| `no_data` | ไม่มีข้อมูล · No data | `null` | — + short reason; 135° hatch + `border.emphasis`; sort last | reason, latest available value when there is one |\n| `out_of_scope` | นอกขอบเขตข้อมูล · Out of scope | `null` | scope text; bare basemap, no fill/hatch | scope statement |\n| `suppressed` | ปิดค่า · Suppressed | `null` | `‹n` + threshold; `surface.soft` + dashed `border.emphasis` | threshold, aggregation level permitting disclosure |\n| `not_yet` | ยังไม่ถึงรอบข้อมูล · Not yet available | `null` | … + expected date; pending surface + dotted pending ink | expected date, source cycle |\n\nThe exact typed contract is `machine.schemas[\"evidence-value.schema.json\"]`; values/cues are in `machine.tokens.dataState.valueStates`. Labels use `text.metadata`, never disabled-hint `text.muted`, and must reach 4.5:1 on the actual label surface. Do not place labels directly over the no-data hatch; put them in a readable legend/table/caption. \"N/A\", a bare dash without explanation and rendering missing as 0 are prohibited. EvidenceCard's nonzero `data-value` must equal the exact visible number.\n\nSentences retain claim context: TH “ปี 2568 ไม่พบโรงงานใหม่ในตำบลนี้ (0 แห่ง)” / “ยังไม่มีข้อมูลปี 2568 — ล่าสุดคือปี 2567”; EN “No new factories were registered here in 2025 (0).” / “No 2025 figure — latest available is 2024.” These are examples, not product evidence.",
"acceptance":[{"checkId":"EVID-05-A","method":"automated","criterion":"every governed value has exactly one of six states and the corresponding finite nonzero/zero/null type; no suppressed value appears in delivered bytes; no unlabelled N/A, bare dash or missing-as-zero; EvidenceCard visible/machine values agree and DataTable/MapLegend bindings resolve the same state contract"},{"checkId":"EVID-05-B","method":"visual","criterion":"measured, zero and four exceptional states remain distinguishable through text, pattern, outline and labels in light, dark, print and static export; labels use `text.metadata` and pass 4.5:1 on their actual surface"},{"checkId":"EVID-05-C","method":"manual","criterion":"visible copy communicates the state, reason and latest value or expected date when applicable in the user's language, with specific context instead of a generic disclaimer"}],
"sourceTextSha256":"5112fd3880484a557a165702ab6bb1472057493de35b870b853c878849060e3c",
"sourceRuleId":"EVID-05"
},
{
"id":"OUTPUT-CLARITY-01",
"title":"Ship resolved audience meaning, not workflow residue",
"section":"evidence",
"normativeLevel":"MUST",
"scope":"all",
"requirement":"Public, client-facing หรือ production output MUST มีเฉพาะสิ่งที่ผู้ใช้ต้องใช้เพื่อเข้าใจ ตัดสินใจ หรือทำงานต่อ ได้แก่ content, state, ข้อจำกัดจริง และ action ที่พร้อมใช้ คำว่า `workflow residue` ใน machine contract หมายถึงข้อความเกี่ยวกับขั้นตอนทำงานภายใน เช่น รออนุมัติ, ยังไม่ตรวจ, schema/rule/package ID, local/source path, debug/validator text, TODO/TBD/FIXME และ placeholder สิ่งเหล่านี้ MUST อยู่ใน internal record เท่านั้นและ MUST NOT ปรากฏในงานที่ส่งให้ผู้ใช้\n\n\nถ้าข้อมูลหรือสิทธิ์ที่ยังขาดอาจเปลี่ยนความจริง, identity, rights, accessibility, ความครบของภาษา, primary action หรือการตีความ evidence งานนั้น MUST หยุดส่งและอยู่เป็น internal preview จนแก้เสร็จ ห้ามส่งข้อความเกี่ยวกับการผลิตงาน เช่น “ยังไม่ยืนยันเพื่อเผยแพร่” หรือ “รอข้อมูลจากทีม” เพื่อให้ผู้ใช้รับภาระแทนทีม ข้อจำกัดจริงที่ผู้ใช้ต้องรู้—เช่นช่วงเวลาข้อมูล, พื้นที่ครอบคลุม หรือสิ่งที่ข้อมูลนี้ใช้สรุปไม่ได้—ยัง MUST แสดงใกล้ claim/action ที่เกี่ยวข้อง ด้วยภาษาตรงเรื่องและบอกผลต่อการตัดสินใจ ห้ามใช้ disclaimer รวมกว้าง ๆ หรือคำเตือนหลายชั้นแทนคำอธิบายเฉพาะเรื่อง\n\n`audienceOutput.disclosurePurpose: ordinary_experience` เป็น default สำหรับ output ที่คนใช้ตามปกติ Purpose แบบ nonordinary ได้แก่ `design_system_reference` และ `provenance_record` เท่านั้น และ MUST bind `disclosureAuthorityRef` กับ `disclosureAuthoritySha256` คู่กัน Authority ต้องอยู่ใน bundle, hash-bound และเปิดได้เฉพาะ field class ที่ schema อนุญาต: DS reference ใช้ `release_identifiers | schema_examples`; provenance record ใช้ `provenance_facts | approval_facts` เท่านั้น Immutable approval fact ที่ได้รับอนุญาตไม่ใช่ mutable approval workflow คำว่า draft/candidate/pending/unverified ถูกห้ามเฉพาะเมื่อเป็น **internal approval/release workflow residue**; state ที่เป็นความจริงของงานผู้ใช้ เช่น draft content, pending transaction หรือ unverified audience-domain datum ยังคงแสดงได้เมื่อจำเป็นและต้องมี label/behavior ที่ตรงความหมาย Authority ทุกแบบยังห้าม debug/validator text, local path, placeholder และ unresolved dependency Artifact manifest `representation.outputClarity` MUST carry `deliveryAudience`, `disclosurePurpose` และ authority ref/hash เดียวกันเมื่อ applicable\n\nResidue scan ครอบคลุม Build Card `navigation.destinations[]` ใน `target`, `label`, `labelByLocale`, `compactLabel`, `compactLabelByLocale` และ Artifact Manifest ใน `representation.navigation`, audience fields ของ `delivery.metadataProjection` กับ `delivery.accessibilityProjection` ตลอดจน final audience bytes ทุกไฟล์ผ่าน `delivery.contentInspections[]` แบบ exact one-per-file ห้าม skip ตาม media type หรือ skip บาง rendered unit: text-readable format เทียบ extracted text กับ bytes โดยตรง; DOCX, PPTX และ PDF MUST bind จำนวน page/slide, render ทุก unit เป็น raster ที่ path/hash/media bytes ตรงกัน และตรวจด้วย text extraction + OCR + visual review พร้อม flag ว่าได้ตรวจ image-only/outlined text แล้ว ข้อความแต่ละ channel รวมด้วยลำดับและ label ที่ deterministic ก่อน hash/scan; raster social ใช้ OCR พร้อม visual review และ media อื่นใช้ transcript/content review ที่ตรงชนิด ไฟล์ evidence ทุกใบ MUST อยู่ใน bundle, bind path/media type/subject hash/byte count/method/time และมี SHA-256 ของตัว evidence เอง การย้าย draft/review/debug/local-path wording เข้า label, target, export หรือภาพยังคงเป็น workflow residue; nonordinary authority เปิดได้เฉพาะ allowed field class ที่ระบุ และไม่เคยเปิด universal workflow residue",
"acceptance":[
{"checkId":"OUTPUT-CLARITY-01-A","method":"automated","criterion":"Build Card ใช้ `audienceOutput.mode: resolved_only`, declare delivery audience/purpose และ bind nonordinary authority เมื่อ applicable; client/public/internal-operational หรือ artifact ที่ claim `artifact_qa_passed` ขึ้นไปมี `blockingDependencyRefs: []`, ใช้เฉพาะ asset ที่ bind exact role/rights/receipt/hash และ claim ที่ approved, current-at-`claimAsOf`, locale-complete, manifest-record-hash-bound/public-eligible; audience projection ไม่มี placeholder หรือ internal-governance marker; `delivery.contentInspections[]` ครอบคลุม `delivery.files` เท่ากันพอดีและใช้ method ตาม media type; DOCX/PPTX/PDF ครบทุก page/slide ด้วย extraction + OCR + visual review, raster render hash และ explicit image-only/outlined-text review; receipt ของ acceptance นี้ MUST bind exact file set/hash และ cite inspection evidence ทุกใบ"},
{"checkId":"OUTPUT-CLARITY-01-B","method":"production","criterion":"final visible bytes, metadata, preview, export และ machine projection ผ่าน format-aware residue scan รวม combined rendered-unit text; dated receipt MUST bind exact `delivery.files` set/hash และ cite inspection evidence ชุดเดียวกันก่อน `production_verified`"},
{"checkId":"OUTPUT-CLARITY-01-C","method":"manual","criterion":"limitation ที่มองเห็นทุกอัน material, specific, proximal และเข้าใจได้; ไม่มี disclaimer กว้าง ๆ หรือคำอธิบายขั้นตอนภายในแทนข้อจำกัดจริง"}
],
"sourceTextSha256":"5413469effbf49ad6a260a8061970d6f48aba94ce641fd4ce1ae6ed1caa33281",
"sourceRuleId":"OUTPUT-CLARITY-01"
},
{"id":"AHA-01","title":"First useful value precedes nonessential gates","section":"experience-architecture","normativeLevel":"MUST","scope":"all","requirement":"First useful proof, understanding หรือ task value MUST มาก่อน nonessential registration, personal-data collection, permission request, sharing prompt หรือ promotional interruption ถ้า prerequisite จำเป็นจริง ต้องอธิบายเหตุผล ขอ minimum และมี denial-safe/read-only alternative เมื่อ feasible","acceptance":[{"checkId":"AHA-01-A","method":"automated","criterion":"Build Card ระบุ first AHA, evidence cue และ prerequisite ทุกอันก่อน AHA"},{"checkId":"AHA-01-B","method":"interaction","criterion":"first-run, denied-permission, unauthenticated และ no-sharing fixtures ยังให้ earliest feasible value + safe next path"}],"sourceTextSha256":"57900d819b3c629a1c37920312fdc227539372f7553d315b8e03c507dbbdf3cf","sourceRuleId":"AHA-01"},
{
"id":"BRAND-01",
"title":"Protected brand lines retain roles",
"section":"brand",
"normativeLevel":"MUST",
"scope":"all",
"requirement":"การใช้ protected line เป็น optional เว้นแต่ Build Card จะ select ไว้ เมื่อใช้ แต่ละ protected line MUST ปรากฏ verbatim พร้อม canonical punctuation และคง recorded role ของตน หนึ่ง scene ใช้ได้เพียงหนึ่ง protected line เป็น headline ห้าม stack เป็น peer slogans Supporting systems MAY appear only when explaining scope/behavior and MUST NOT become a headline slogan by default\n\n\nProtected wording ใช้ canonical punctuation ตาม registry ในทุก locale เว้นแต่ registry มี owner-approved locale-specific record แยกต่างหาก การแปลหรือ adaptation ที่ปรากฏใน implementation—even เมื่อดูดี—MUST NOT ถูกใช้เป็น protected line, metadata title หรือ portfolio authority โดยอัตโนมัติ\n\nในกฎนี้ **scene** คือ composition ที่ผู้ใช้รับรู้เป็นหน่วยหนึ่ง มี primary proposition และ reading/action path ของตัวเอง ขอบเขตใช้ดังนี้:\n\n- web/app: route, view, dialog หรือ top-level section ที่มี primary heading ของตัวเอง;\n- deck: หนึ่ง slide;\n- document/PDF: cover, chapter opener หรือ titled section ระหว่าง peer headings;\n- social static: หนึ่ง creative.\n\nCard, column, tab panel, animation state หรือ DOM wrapper ไม่กลายเป็น scene ใหม่เพียงเพื่อใช้ protected line เพิ่ม เว้นแต่ผู้ใช้เข้าถึงเป็นหน่วยอิสระที่มี primary heading และ path ของตัวเอง Navbar, footer, metadata, source note และ repeated running header ไม่สร้าง scene และ MUST NOT host protected line เพิ่มเป็น headline ภายใน scene เดิม การนับ scene ยึดสิ่งที่ผู้ใช้เห็น/อ่าน ไม่ยึดชื่อ component หรือโครงสร้างไฟล์",
"acceptance":[{"checkId":"BRAND-01-A","method":"automated","criterion":"text ตรง canonical registry exact"},{"checkId":"BRAND-01-B","method":"manual","criterion":"scene ไม่วาง protected lines หลายอันแข่งกัน"}],
"sourceTextSha256":"6b930bdc05b70a9b2b7c9f4085669d53f7139d7fefed8eb4bd696b04c02ac616",
"sourceRuleId":"BRAND-01"
},
{
"id":"LOGO-01",
"title":"Use an approved identity implementation",
"section":"identity",
"normativeLevel":"MUST",
"scope":"all",
"requirement":"Landometer wordmark MAY change colour, including a different colour for each letter, while preserving its letterforms and proportions. Gray is an optional versatile default, not a required identity colour. This owner-authorized wordmark colour treatment does not require separate permission for each colour. The official logo MAY appear on light or dark backgrounds when the complete name and symbol remain legible at the actual size. Evaluate a Brand Blue visibility problem for that specific pairing; it does not prohibit dark backgrounds generally. MOTIF-06 full/quiet carrier restrictions apply to registered motifs, not official logo PNGs. This permission changes wordmark colour only; it does not authorize symbol recolouring, redrawing or distortion, or change interface/data colour contracts.\n\n\nทุก output ที่ `brandRequired: true` MUST bind `identityImplementation` ที่ approved หนึ่งรายการ Logo, wordmark, symbol, favicon และ social mark MUST ใช้ owner-approved asset ตรง declared role หากยังไม่มี logo asset ที่ approved สำหรับ role/surface นั้น MAY ใช้ canonical portfolio name เป็น governed live-text identity ที่ bind approved fonts ได้ แต่ MUST ระบุ `kind: governed_text_identity`, ใช้ canonical text ครบทุก delivered locale, ตั้ง `logoAssetId: null` และ `logoReconstructionAllowed: false`; MUST NOT ทำ live type ให้เลียนแบบ wordmark หรือ invent compact mark",
"acceptance":[
{"checkId":"LOGO-01-A","method":"automated","criterion":"brand-required output resolve identity implementation หนึ่งรายการพอดี—approved asset identity ต้องตรง role/surface/rights/SHA-256/receipt/minimum-size/clear-space; wordmark colour rendition ที่ LOGO-01 อนุญาตคง source provenance และบันทึก hash ของไฟล์ผลลัพธ์จริง ห้ามอ้าง hash เดิมแทนไฟล์ที่เปลี่ยน และไม่ต้องขอ approval ใหม่แยกต่อสี; governed text identity ต้องตรง canonical locale text, approved font bindings, null `logoAssetId`, disabled reconstruction และ artifact-resolved format-implementation record ต้อง bind implementation ID เดียวกัน"},
{"checkId":"LOGO-01-B","method":"visual","criterion":"asset identity ใช้ clear space/minimum size/contrast/direct surface ตรง approved variant และ wordmark colour permission ของ LOGO-01; light/dark ทั้งสองใช้ได้เมื่อชื่อและสัญลักษณ์อ่านได้ครบ ห้ามใช้ MOTIF-06 เป็น blanket dark-background ban ของ official logo; governed text identity ยังคงเป็น live text ที่อ่านได้และไม่ impersonate wordmark ที่ไม่ได้รับอนุมัติ"}
],
"sourceTextSha256":"2c75f4b3ff9c7bc027c48d948cb465739ae4f6d9c9b7aa58a19de06d0e5607d3",
"sourceRuleId":"LOGO-01"
},
{
"id":"FAVICON-01",
"title":"Every web build binds one approved icon set",
"section":"identity",
"normativeLevel":"MUST",
"scope":"web_public,app_interactive",
"requirement":"A web build ships one icon set chosen by property — portfolio: the symbol on transparent; product: the product's identity-gradient tile with the symbol in that gradient's foreground contract (`symbol-white` on onDeep, `symbol-color` on onLight). Six sizes: 16 · 32 · 48 · 180 (apple-touch) · 192 · 512 (maskable, safe zone 80%). Corners 25% at 16/32; maskable sizes ship full-square. The icon never changes per page and never signals status. `<title>` is `[page] · [product]`, ≤ 60 characters, page first. A missing icon set is a WEBFMT-01 blocker, not a caveat. Icon sets live in the asset register with hashes.\n\n\nชุดไอคอนเป็น identity asset role ใหม่ `icon_set` ใน `machine.contracts.assetRegistry#/iconSets` แต่ละไฟล์ต้องมี role ตามขนาด, exact SHA-256, `approvalReceiptRef` และ `approvalReceiptSha256` ตาม ASSET-DELIVERY-01 ชุด portfolio `iconset.landometer.portfolio.symbol.01` (generator deterministic จาก symbol PNG ทางการ `b818eeb6…`; 16/32/48/192 บนพื้นใส, 180/512 เป็น tile `brand.beige`; hash ทั้งหกไฟล์ใน `machine.contracts.assetRegistry#/iconSets`) ได้รับการอนุมัติ role `icon_set` จากเจ้าของเมื่อ 15 กันยายน 2569 (`owner-message:2026-09-15:0.9.3-answers`) ส่วน product tile ต้อง resolve identity gradient และ asset bytes ที่อนุมัติต่อผลิตภัณฑ์จาก Add-on แยกของผลิตภัณฑ์ปัจจุบัน ซึ่งใช้ร่วมกับ LDS ฉบับเต็มนี้ motif หรือ animated variant ห้ามใช้เป็นไอคอน (MOTION-04, MOTIF-02)",
"acceptance":[{"checkId":"FAVICON-01-A","method":"automated","criterion":"initial HTML ของทุก route มี icon set ครบหกขนาดที่ resolve จาก asset registry ด้วย hash ตรง, web manifest ที่ประกาศ 192/512 (512 maskable), `theme-color` light/dark และ `<title>` ตาม pattern `[page] · [product]` ≤ 60 ตัวอักษร; ขาดข้อใดข้อหนึ่งเป็น WEBFMT-01 blocker"},{"checkId":"FAVICON-01-B","method":"visual","criterion":"ไอคอน 16/32 อ่านออกที่ขนาดจริงบน light/dark tab strip, 180 บน iOS home, 192/512 maskable ไม่ถูกตัดใน safe zone 80% และไอคอนไม่เปลี่ยนตามหน้าหรือสถานะ"}],
"sourceTextSha256":"079ae3446942e05d8a0eb9e8ddb424064bf2007deef327e6f0160e0963c07f38",
"sourceRuleId":"FAVICON-01"
},
{
"id":"COLOR-01",
"title":"Use semantic color tokens",
"section":"visual-foundations",
"normativeLevel":"MUST",
"scope":"all",
"requirement":"Authored UI, text, surface, state and data colors MUST resolve governed roles in `color-srgb-10`. Use exact values from `machine.colorRegistry`, `machine.tokens` and `machine.analyticalScales`; do not approximate by eye. State, category and magnitude MUST NOT rely on color alone, and contrast MUST be checked in the actual output context. Approved identity artwork and governed evidence/editorial media retain their approved source pixels and MUST NOT be sampled/reconstructed as interface tokens.",
"acceptance":[{"checkId":"COLOR-01-A","method":"automated","criterion":"authored colors resolve current approved roles or exact LUT/class records; ordinary audience output contains the sanitized values/assets it needs, not internal provenance or approval metadata; no forbidden old series/density/product alias is emitted"},{"checkId":"COLOR-01-B","method":"visual","criterion":"text, controls, focus, graphics and data marks pass their declared contrast requirements in light, dark and print-relevant states at actual size"}],
"sourceTextSha256":"32fb490f8616db88a4b988a377ab6a8bc17bb71661bf2175970de1b86738cd64",
"sourceRuleId":"COLOR-01"
},
{
"id":"SURFACE-01",
"title":"Atmosphere surfaces have a declared job",
"section":"visual-foundations",
"normativeLevel":"MUST",
"scope":"all",
"requirement":"Brand-atmosphere surface MUST ใช้ exact recipe จาก landometer-atmosphere-gradient-v2 หรือ approved flat/photo treatment เพื่อ job ที่ประกาศ: entry, orientation, transition, momentum หรือ closure ต้อง record focal target, reading direction, foreground contract, contrast evidence, cadence และ deletion test Gradients MUST NOT decorate every card หรือ encode data, product capability, status หรือ magnitude\n\n\n| Recipe | Exact CSS | Semantic job | Foreground |\n|---|---|---|---|\n| atmosphere.gradient.measure.deep | linear-gradient(135deg, #1D4497 0%, #176B82 54%, #08756F 100%) | high-confidence entry, direction, closure | onDeep |\n| atmosphere.gradient.measure.luminous | linear-gradient(135deg, #89CEF6 0%, #5ECAD6 50%, #6CD5B3 100%) | orientation, measurement becoming action | onLight |\n| atmosphere.gradient.ground.current | linear-gradient(135deg, #0F5773 0%, #006A6A 50%, #1F744F 100%) | context/evidence becoming understandable | onDeep |\n| atmosphere.gradient.ground.mist | linear-gradient(135deg, #C4E0EE 0%, #B2E2E2 50%, #CCE6D0 100%) | calm context, collaboration | onLight |\n| atmosphere.gradient.cultivate.glow | linear-gradient(135deg, #EB8182 0%, #F5A06F 50%, #EBC573 100%) | action and credible momentum | onLight |\n| atmosphere.gradient.cultivate.mist | linear-gradient(135deg, #F7CBC7 0%, #FBD1B6 50%, #F1E0B4 100%) | completion and handoff | onLight |\n| atmosphere.gradient.diversity.spectrum | linear-gradient(135deg, #89CEF6 0%, #6CD5B3 34%, #EBC573 67%, #EB8182 100%) | rare evidenced participation/co-creation | onLight |\n\nForeground contracts: onDeep primary/icon #FFFFFF, secondary #F1F4EF; onLight primary/icon #182327, secondary #293337 Focus uses an inner/outer pair that remains visible on both field and adjacent surface Contrast MUST sample actual rendered glyph/icon bounds across the gradient, not endpoints only\n\nLong public/adoption/campaign routes MUST either resolve atmosphere at opening, one major transition and closing through a mix of exact gradient, large approved photo with deterministic scrim หรือ bold flat field, or record a deliberate zero-atmosphere decision A smaller task surface MUST NOT manufacture all moments One dominant gradient per viewport is the default cadence Diversity spectrum appears at most once and only for evidenced multi-perspective content\n\nDeletion test: if removing the treatment does not weaken its declared entry/orientation/transition/momentum/closure job, remove it Product gradients remain named-product identity only and never become shared portfolio or analytical color",
"acceptance":[{"checkId":"SURFACE-01-A","method":"automated","criterion":"exact recipe ID, role, foreground, focal target, direction and color-set record resolve"},{"checkId":"SURFACE-01-B","method":"visual","criterion":"local contrast/cadence/deletion tests pass; no quota or data/status use"}],
"sourceTextSha256":"0b8e04f0844594a49fb05c6d6f7009c03ffe08f97e4abb60e0eefe7d3ce51236",
"sourceRuleId":"SURFACE-01"
},
{"id":"TYPE-01","title":"Typography is script-aware and output-aware","section":"visual-foundations","normativeLevel":"MUST","scope":"all","requirement":"Type roles MUST ใช้ approved Latin/Thai families, รักษา hierarchy และผ่าน script-specific collision, clipping, fallback และ export checks ในทุก size ที่ใช้ ค่า Thai display line-height 1.16 เดิม MUST NOT ถือว่าปลอดภัยทั่วโลก","acceptance":[{"checkId":"TYPE-01-A","method":"automated","criterion":"font roles/fallbacks resolve type-script-aware-02"},{"checkId":"TYPE-01-B","method":"visual","criterion":"Thai/Latin stress fixtures ไม่มี clipping, collision, tofu หรือ unintended substitution ในแต่ละ format"}],"sourceTextSha256":"28f66fd563bdbe0c0921cb86f1b5c8500448751fa8575269a549a212ba5f0a57","sourceRuleId":"TYPE-01"},
{"id":"ICON-01","title":"Interface icons are simplified rounded outlines","section":"visual-foundations","normativeLevel":"MUST","scope":"all","requirement":"UI icons MUST simplified, outline, rounded จาก approved subset และคง FILL 0 / wght 300 ทุก state; selected state MUST แสดงด้วย semantic surface, color, visible label หรือ outline-container treatment ไม่เปลี่ยน glyph fill/weight Identity marks และ data symbols MUST เป็นคนละระบบ\n\n\nCanonical variable axes:\n\n| Axis | Value |\n|---|---:|\n| FILL | 0 |\n| wght | 300 |\n| GRAD | 0 |\n| optical size | match rendered size from approved subset |","acceptance":[{"checkId":"ICON-01-A","method":"automated","criterion":"icon name อยู่ใน approved subset และ FILL คง 0 ทุก state"},{"checkId":"ICON-01-B","method":"visual","criterion":"icon อ่านออกและมี style เดียวกันใน rendered/exported size ทุกขนาด"}],"sourceTextSha256":"3cac52e03895903a8fb597ebd36c1438fbba69ba71eb0211c0008b20b8640b14","sourceRuleId":"ICON-01"},
{
"id":"LAYOUT-01",
"title":"Layout preserves hierarchy across formats",
"section":"visual-foundations",
"normativeLevel":"MUST",
"scope":"all",
"requirement":"Composition MUST รักษา primary reading path, responsive/page-safe gutters, deliberate density และความสัมพันธ์ที่รับรู้ได้ระหว่าง question, evidence, interpretation และ next action\n\n\nSelected navigation, tabs, cards and callouts MUST NOT use decorative bracket-shaped highlights or colored left-rail accents. Use restrained background, text weight and spacing. Keep visible keyboard focus outlines and meaningful chart/table borders. Review actual rendered Thai/English text at narrow and desktop widths, including every newly added section, for squeezed headings and overlapping siblings; token/hash checks do not establish readable composition.",
"acceptance":[{"checkId":"LAYOUT-01-A","method":"visual","criterion":"reading order ชัดที่ minimum, nominal และ maximum target sizes; actual Thai/English narrow/desktop content has no squeezed heading or sibling overlap, including newly added sections"},{"checkId":"LAYOUT-01-B","method":"manual","criterion":"essential content ไม่ clipped, orphaned, ซ่อนหลัง navigation หรือ split โดยไม่มี continuation cue; selected states contain no decorative brackets/colored left rails, while keyboard focus and meaningful chart/table borders remain visible"}],
"sourceTextSha256":"d67ce9d399dbce24f64894e2fe0200caf18f05d6f65b9e648ab27424c6d3ab1c",
"sourceRuleId":"LAYOUT-01"
},
{
"id":"CTRL-01",
"title":"Control geometry stays direct and recognizable",
"section":"components",
"normativeLevel":"MUST",
"scope":"interactive",
"requirement":"กฎนี้ใช้กับ direct controls ใน `web_public` และ `app_interactive` เท่านั้น Build Card `navigation.controlBudgets.minimumDirectTarget` MUST เท่ากับ selected target profile พอดี: browser ใช้ `{value: 44, unit: css_px}` กับ semantic browser element/DOM order; native app ใช้ `{value: 44, unit: platform_dp}` กับ native semantic view/platform accessibility order Discrete action target ทุกอัน MUST มีขนาดอย่างน้อย 44 × 44 ในหน่วยของ branch นั้นทุก state Text และ icon+label button ใช้ approved capsule; icon-only button ใช้ approved circle Padding/gap/border/focus/loading/disabled resolve component tokens และห้าม proxy click-forward งาน document, PDF, deck และ social ใช้ static action equivalent ตาม §7.1/§11 และ selected target profile โดยไม่สร้าง interactive target ปลอม\n\n\nCanonical geometry:\n\n| Control | Geometry |\n|---|---|\n| text or icon+label button | browser: min-height 44 CSS px; native: min-height 44 platform dp; capsule geometry จาก runtime adapter โดย label ต้องไม่ถูกตัด |\n| icon-only button | browser: 44 × 44 CSS px; native: 44 × 44 platform dp; circle geometry และ accessible name required |\n| inline link in running text | not forced into a 44px box; follows WCAG text-link exception/spacing branch and visible focus |",
"acceptance":[{"checkId":"CTRL-01-A","method":"automated","criterion":"exact target-profile value/unit, browser element + DOM order หรือ native view + platform accessibility order, tokens และ accessible names pass every state"},{"checkId":"CTRL-01-B","method":"visual","criterion":"capsule/circle/label/icon/focus/loading/disabled fixtures remain intact across locale, width and zoom"}],
"sourceTextSha256":"962ae8f68e1b164205863b88f2fd9d700c901bf8d3d53b78f653bf108a9475de",
"sourceRuleId":"CTRL-01"
},
{
"id":"THEME-01",
"title":"Theme changes presentation without changing meaning",
"section":"visual-foundations",
"normativeLevel":"MUST",
"scope":"all",
"requirement":"Light, dark, auto, forced-color และ fixed-export states MUST preserve content, identity, evidence, control meaning and state parity Auto follows platform preference unless reversible explicit user choice exists Static export MUST declare/verify one fixed theme\n\n\nInteractive HTML MUST offer Auto when both themes exist User choice persists without a first-paint flash that exposes wrong meaning Controls have accessible labels and do not use sun/moon icon alone to imply current vs next state If theme storage fails, system preference/fallback still yields usable content",
"acceptance":[{"checkId":"THEME-01-A","method":"automated","criterion":"theme, explicit preference, metadata and token resolution deterministic; no action/content differs by theme"},{"checkId":"THEME-01-B","method":"visual","criterion":"light/dark/auto/forced-color/export fixtures preserve identity and all contrast gates"}],
"sourceTextSha256":"8be258ae11863a754c742b55ac973510992a2a0b565e5f1bbed052a09d33e2a0",
"sourceRuleId":"THEME-01"
},
{
"id":"ASSET-DELIVERY-01",
"title":"Font and icon delivery is deterministic",
"section":"visual-foundations",
"normativeLevel":"MUST",
"scope":"all",
"requirement":"Delivered font, interface-icon subset, identity, governed media และ generated vector MUST resolve artifact-owned registry, approved role, source, rights, exact byte hash, typed approval receipt และ fallback Web subsets record glyph map; non-web selects one exact platform mapping, forbids substitution, and final export embeds the exact font or uses an approved vector/raster projection under recorded fixtures\n\n\nBuild Card `assetRegistries` MUST bind each registry by `registryRef`, `sha256`, `schemaRef`; each approved asset MUST bind `approvalReceiptRef` and `approvalReceiptSha256` Receipt grant ต้อง match exact `assetId`, `role`, `sha256`, `allowedFormatProfiles`, `allowedSurfaceRoles`, `allowedAudiences`, `publicationPermission`, `licenseOrPermission` และ `fallback`; interface icon เพิ่ม exact `glyphs` ส่วน identity และ governed media เพิ่ม `altOrTextEquivalent` Identity requires `licenseOrPermission`, `fallback`, `altOrTextEquivalent`; icon requires `glyphs`, `licenseOrPermission`, `fallback`; font requires `fontRole`, `fontFamily`, `fontSubset`, `fontWeight`, `fontFallback`, `licenseOrPermission` Production manifest MUST include matching identity/font/icon/media registry references and exact emitted asset bindings Fonts/icons load from first-party-controlled or explicitly approved durable assets when deterministic delivery is required If delayed/blocked/offline, Thai/Latin text and controls remain readable and actions stay identifiable",
"acceptance":[{"checkId":"ASSET-DELIVERY-01-A","method":"automated","criterion":"file, role, source, approval, rights, hash, Unicode/glyph coverage and fallback resolve; non-web mapping ID/platform/format, substitution policy, embedding/vector policy and fixture IDs resolve exactly"},{"checkId":"ASSET-DELIVERY-01-B","method":"visual","criterion":"delayed/blocked/offline/print/export fixtures have no tofu, identity reconstruction or substitution drift; non-web output retains complete labels and exact selected typography"}],
"sourceTextSha256":"0d9647664ba01e216e5ae39d802e3b7050bc5b80a17c0e393c9466161b3bc710",
"sourceRuleId":"ASSET-DELIVERY-01"
},
{"id":"PROFILE-01","title":"Experience profile is distinct from output format","section":"resolution","normativeLevel":"MUST","scope":"all","requirement":"Build Card MUST resolve exactly one primary experience.profile และ one output.formatProfile Experience profile describes audience/job; format describes representation Secondary experience profile MAY add requirements but MUST NOT introduce a competing primary job","acceptance":[{"checkId":"PROFILE-01-A","method":"automated","criterion":"Build Card/manifest มี allowed primary experience + format อย่างละหนึ่งและ known rule sets"},{"checkId":"PROFILE-01-B","method":"manual","criterion":"profile, audience, one job, first AHA and completion coherent in format"}],"sourceTextSha256":"1ca8e8312649d3c8ea359992068df1f9d6390e0954ee27796b34dc55650ecfd2","sourceRuleId":"PROFILE-01"},
{
"id":"CAPABILITY-01",
"title":"Capabilities resolve explicit rule packs",
"section":"resolution",
"normativeLevel":"MUST",
"scope":"all",
"requirement":"Declared capability ทุกอัน MUST resolve known rule set, required fields, fallback and test matrix Unknown capability/unsupported format blocks resolution Side effect, authorization, autoplay, public indexing and nonessential motion default off until approved truth enables `machine.contracts.formatPacks.overlays` MUST cover capability enum ทั้ง 16 ค่าพอดีแบบไม่ซ้ำและไม่ขาด",
"acceptance":[{"checkId":"CAPABILITY-01-A","method":"automated","criterion":"every Build Card capability maps exactly once to an overlay; overlay มี nonempty unique `compatibleFormatProfiles`, `requiredRuleIds`, `requiredFields`, `testMatrix` และมี `configRefContract` + `fallback`; selected format ต้อง compatible, every rule ID มีจริง และ hash-bound resolved capability config มี required field ครบ"},{"checkId":"CAPABILITY-01-B","method":"manual","criterion":"capability is supported by approved product truth and does not broaden evidence, permission or product scope"}],
"sourceTextSha256":"845815cd3d7acea7203ecf6f9f348991d210fbaeed303c3a6db5950cfe8dca27",
"sourceRuleId":"CAPABILITY-01"
},
{
"id":"PARITY-01",
"title":"Human and machine rules remain one contract",
"section":"machine-authoring",
"normativeLevel":"MUST",
"scope":"all",
"requirement":"ทุก normative clause MUST อยู่ภายใน scope ของ stable rule block; human master กับ machine catalog MUST มี structural rule ID/title block และ acceptance-ID containment หนึ่งต่อหนึ่ง และการเปลี่ยน meaning MUST เปลี่ยน normative release ไม่ใช่ drift ฝั่งเดียว Automated parity พิสูจน์ได้เฉพาะโครงสร้างนี้ ไม่ได้พิสูจน์ criterion, method, trigger, scope หรือ Thai/English semantic equivalence",
"acceptance":[{"checkId":"PARITY-01-A","method":"automated","criterion":"ทุก catalog rule ID/title มี normative master block เดียว, master ไม่มี extra rule block นอก catalog และ catalog acceptance ID ทุกตัวอยู่ใน matching rule block; pass นี้เป็น structural/acceptance-ID parity เท่านั้น"},{"checkId":"PARITY-01-B","method":"manual","methodDetail":"manual owner review","criterion":"English machine requirement/acceptance กับ Thai/English human rule มี obligation, criterion, method, meaning, trigger, explicit absence of an exception path และ scope เดียวกัน; automated pass ห้ามใช้แทน bilingual semantic approval"}],
"sourceTextSha256":"52de09de04ebb72044ff2c9c9105b4839375f074a69fc26386b6d984541a95a1",
"sourceRuleId":"PARITY-01"
},
{
"id":"NAV-01",
"title":"Navigation exposes a small set of direct destinations",
"section":"experience-architecture",
"normativeLevel":"MUST",
"scope":"web_public,app_interactive",
"requirement":"Unified navigation MUST preserve ecosystem, property และ page levels โดยไม่ conflation `navigation.brandDestinationRef` MUST resolve exactly one destination `id` whose `role: brand` binds the approved identity control and direct destination; brand consumes one control in every header budget Desktop แสดง visible header controls รวม brand ไม่เกิน 4 และ mobile รวม brand ไม่เกิน 2 ทุก visible control MUST เป็น direct semantic target อย่างน้อย 44 × 44 ตาม selected target profile: CSS px สำหรับ browser และ platform dp สำหรับ native app แม้ใน calmest state",
"acceptance":[{"checkId":"NAV-01-A","method":"automated","criterion":"exactly one brand destination resolves, binds identity, and is counted with every visible header control; control count และ exact target-profile value/unit ผ่าน desktop/mobile budgets ในทุก header state"},{"checkId":"NAV-01-B","method":"interaction","criterion":"`current: page` และ `current: location` อยู่คนละ scope; hover, focus, pressed, open, scroll-calm และ history-restored states รักษา label, destination และ keyboard operation"},{"checkId":"NAV-01-C","method":"manual","criterion":"ไม่มี coordinate click-forward overlay หรือ wake-first target substitution"}],
"sourceTextSha256":"f73ace36bb7144df192fdf442554edf3c02802b90d94426e3097732c054be053",
"sourceRuleId":"NAV-01"
},
{
"id":"NAV-02",
"title":"Navigation uses disclosure semantics",
"section":"experience-architecture",
"normativeLevel":"MUST",
"scope":"web_public,app_interactive",
"requirement":"Browser navigation disclosure MUST ใช้ button ใน DOM order ที่สัมพันธ์กับ trigger มี accessible name และ synchronized `aria-expanded`, keyboard-operable, predictable focus restoration และ MUST NOT ใช้ menu roles เว้นแต่ implement full application-menu keyboard model Native app disclosure MUST ใช้ platform-native disclosure control/view ที่มี name, expanded/collapsed meaning, operation และ focus restoration เทียบเท่ากันใน native view order + platform accessibility traversal order; native branch ไม่รับข้อบังคับ browser DOM/ARIA",
"acceptance":[{"checkId":"NAV-02-A","method":"automated","criterion":"browser button/name/DOM order/`aria-expanded` หรือ native control role/name/state/view/accessibility order ถูกต้องตาม runtime"},{"checkId":"NAV-02-B","method":"interaction","criterion":"browser Enter, Space, Escape, Tab, outside activation และ route change หรือ native equivalent inputs/lifecycle ให้ open/close/order/focus behavior ที่คาดเดาได้"}],
"sourceTextSha256":"b758c1adc7f0e36985390f263ed6724438b57fe620efe77a52d7b4a74424cff9",
"sourceRuleId":"NAV-02"
},
{
"id":"BOOKMARK-01",
"title":"Side bookmark is a secondary page index",
"section":"experience-architecture",
"normativeLevel":"MUST",
"scope":"web_public,app_interactive,document_flow,pdf_fixed,deck_presentation",
"requirement":"Build Card MUST declare sibling fields `navigation.sideBookmark: selected | omitted` และ `navigation.sideBookmarkUserBenefit` เสมอ Selection กับ reusable-component inventory เป็น contract เดียวกัน: `selected` MUST มี `component.bookmark.side.01` ใน `composition.componentIds` พอดีหนึ่งครั้ง ส่วน `omitted` MUST ไม่มี ID นี้ เมื่อเป็น `selected` ใช้ได้เมื่อมี useful stable sections อย่างน้อย 2 และ `navigation.sideBookmarkUserBenefit` MUST เป็น nonempty string ที่อธิบาย orientation value ต่อผู้ใช้; เมื่อเป็น `omitted` ค่า `navigation.sideBookmarkUserBenefit` MUST เป็น `null` ห้ามละ field นี้และห้ามสร้าง object ซ้อน `sideBookmark.selection` หรือ `sideBookmark.userBenefit` เมื่อ selected แล้ว bookmark MUST mirror real heading anchors, แสดง `current: location` โดยไม่พึ่งสีอย่างเดียวเมื่อเป็น interactive, ไม่บัง content และ resolve exact format/runtime component contract ก่อน degrade เป็น mobile disclosure, TOC, PDF bookmark หรือ deck section marker ตาม format Static equivalents รักษา structure/order แต่ใช้ `current: none` เพราะไม่มี live location",
"acceptance":[{"checkId":"BOOKMARK-01-A","method":"automated","criterion":"sibling fields `navigation.sideBookmark` / `navigation.sideBookmarkUserBenefit` ผ่าน branch ที่ active schema กำหนด; `selected` เป็นจริงก็ต่อเมื่อ `composition.componentIds` มี `component.bookmark.side.01` พอดีหนึ่งครั้ง, `omitted` ไม่มี ID นี้, artifact-resolved record มี exact format/runtime contract ที่ตรงกัน และ selected target ทุกอันมีอยู่ครั้งเดียว, accessible label และ current state ที่ programmatic เมื่อ interactive"},{"checkId":"BOOKMARK-01-B","method":"visual","criterion":"rail หายเมื่อ empty และไม่บัง content, controls, browser UI หรือ safe areas"}],
"sourceTextSha256":"2b69a182464f41f78e6d3968cf1dcb9dc3cd7d6e1fdb56da3758cecd8917c959",
"sourceRuleId":"BOOKMARK-01"
},
{
"id":"CTA-01",
"title":"Every CTA has one truthful outcome",
"section":"actions",
"normativeLevel":"MUST",
"scope":"all",
"requirement":"CTA ทุกอัน MUST ใช้ specific verb-led label, outcome และ `destinationBinding` จริงหนึ่งอย่าง โดย `kind` ต้องเป็น `anchor | route | external | download | form | contact | command`, target และ `targetByLocale` ต้องตรง syntax/locale/section ที่อ้าง และ `presentation.mode` + `presentation.technique` ต้องตรง selected format; CTA ต้องตรง availability/permission และแยกออกจาก navigation, evidence link และ decoration ได้",
"acceptance":[{"checkId":"CTA-01-A","method":"automated","criterion":"CTA record มี label, outcome, availability และ locale-complete `destinationBinding` ซึ่ง kind, target syntax, resolved anchor, presentation mode และ technique ตรง selected format"},{"checkId":"CTA-01-B","method":"interaction","criterion":"activation ให้ outcome ที่ระบุเพียงครั้งเดียว, เก็บ input/state เมื่อ fail และแสดง result ที่รับรู้ได้"},{"checkId":"CTA-01-C","method":"automated","criterion":"intent, priority, availability, orthogonal consequence, permission/confirmation policy, immutable progress/result/recovery/receipt contracts และ locale-specific label/outcome/destination fields satisfy action schema"}],
"sourceTextSha256":"25f88d0c550357c65bd55e08f0b2ad884092420dc722e55a164db838b3e9062a",
"sourceRuleId":"CTA-01"
},
{"id":"CTA-02","title":"CTA labels remain intact","section":"actions","normativeLevel":"MUST","scope":"all","requirement":"CTA labels MUST อยู่หนึ่งบรรทัดเมื่อ format รองรับ และ MUST NOT truncated, ellipsized หรือ illegible แก้ pressure ตามลำดับ: approved compact locale label → ลด padding ภายใน target rule → full-width/stack → ย้าย lower-priority action → recompose","acceptance":[{"checkId":"CTA-02-A","method":"visual","criterion":"label ครบและอ่านได้ใน supported locale, width, zoom และ export"},{"checkId":"CTA-02-B","method":"manual","criterion":"compact label เป็น approved locale equivalent ไม่ใช่ตัวย่อกำกวม"}],"sourceTextSha256":"155466f44779aef073d8bfc350b8668498e8c153088cbbcbd5911002ae78e97a","sourceRuleId":"CTA-02"},
{"id":"MOTION-01","title":"Motion must serve the user","section":"motion","normativeLevel":"MUST","scope":"screen","requirement":"Motion MUST clarify state, sequence, progress, spatial relationship หรือ cause/effect Decorative motion MUST เป็น finite play ที่ subordinate และไม่มี perpetual flicker; การเล่นซ้ำขณะมองเห็นตาม MOTION-04 ใช้ finite play ซ้ำเป็นรอบ ≥ 2,000 ms ไม่ใช่ `animation-iteration-count: infinite`; essential content/action ห้าม depend on animation","acceptance":[{"checkId":"MOTION-01-A","method":"manual","criterion":"motion role ทุกอันระบุ user benefit และ static final-state equivalent"},{"checkId":"MOTION-01-B","method":"automated","criterion":"ไม่มี `animation-iteration-count: infinite`, infinite attention animation หรือ unbounded CTA sweep; การเล่นซ้ำที่มีอยู่เป็น finite play ที่ผูกกับ viewport ตาม MOTION-04"}],"sourceTextSha256":"c65f7d993ee9f61b854be5b046f2738cab7af59c02ab00b49ee165bf38e16cd8","sourceRuleId":"MOTION-01"},
{
"id":"MOTION-02",
"title":"Approach motion is role-gated and fail-open",
"section":"motion",
"normativeLevel":"MUST",
"scope":"web_public,app_interactive",
"requirement":"ข้อกำหนดแยกตาม runtime อย่างเด็ดขาด Browser approach reveal MAY ใช้ explicit semantic roles จาก motion-riddim-approach-03 แต่ source HTML MUST render final visible state และ enhancement MUST fail open ใน no JavaScript, reduced motion, observer failure, initialization timeout, hidden tabs, focus, deep links, history restoration, back-forward cache และ print Native app motion MUST resolve `native_state` config และใช้ native state-transition lifecycle: platform reduced motion, backgrounding, interruption, cancellation, restoration, view disposal, native view order, platform accessibility traversal order และ complete final state; native branch MUST NOT require HTML, JavaScript, IntersectionObserver, browser history/BFCache หรือ print behavior",
"acceptance":[{"checkId":"MOTION-02-A","method":"automated","criterion":"browser source/reduced states และ native reduced/complete-final states expose all content; hero, LCP media, page title, first answer, primary proof, primary action, task-critical state, status, focus target และ deep-link target never reveal-hidden"},{"checkId":"MOTION-02-B","method":"interaction","criterion":"browser observer/lifecycle failure หรือ native background/interruption/cancellation/restoration/view-disposal fixture settle complete visible usable final state; native view/accessibility order ไม่เปลี่ยน meaning"}],
"sourceTextSha256":"f8b84d825133e683d203ffebd5f4622c3a522be8770662d3add8ab6e06616fdf",
"sourceRuleId":"MOTION-02"
},
{
"id":"MOTION-03",
"title":"Motion does not disturb layout or reading",
"section":"motion",
"normativeLevel":"MUST",
"scope":"screen",
"requirement":"กฎนี้แยกตาม runtime อย่างเด็ดขาด: `browser_observer` entry motion MUST ใช้ opacity และ transform เท่านั้น, zero layout shift, หลีกเลี่ยง nested unsynchronized reveals และใช้ exact motion-riddim-approach-03 timing/distance/logical-direction/four-beat-stagger/reduced-motion recipe; `native_state` MUST ใช้เฉพาะ selected native config + native state-transition lifecycle, รักษา layout geometry, native view order และ platform accessibility traversal order และ MUST NOT require browser observer fields, opacity/transform approach recipe, Riddim distance token หรือ stagger formula; `presenter_sequence` MUST ใช้เฉพาะ selected presenter config, รักษา slide-object order กับ complete governed final frame และ MUST NOT require browser observer, browser approach properties หรือ Riddim stagger tokens",
"acceptance":[{"checkId":"MOTION-03-A","method":"automated","criterion":"runtime class resolve exact branch ของตน—browser ใช้ opacity/transform + exact four-beat Riddim recipe, native ใช้เฉพาะ native config/lifecycle fields, presenter ใช้เฉพาะ presenter config/final-frame fields—ทุก branch รักษา stable layout geometry และ reject field/recipe/test ของอีก branch"},{"checkId":"MOTION-03-B","method":"visual","criterion":"browser reading/focus/scroll order, native view/platform-accessibility order หรือ presenter slide-object order/final frame stable ระหว่างและหลัง motion ตาม branch ที่เลือก"}],
"sourceTextSha256":"4ee35c6f6d85f49c5ee663e557e486c307267d0ae267fa7ccb6370966e0009cf",
"sourceRuleId":"MOTION-03"
},
{
"id":"MOTION-04",
"title":"Identity motion uses the approved runtime and replays while visible",
"section":"motion",
"normativeLevel":"MUST",
"scope":"web_public,app_interactive,document_flow,pdf_fixed,deck_presentation",
"requirement":"The official artwork files never animate. The mark's parts may assemble only through `landometer.motif.v3` kind=\"logo\" (montri-th/motif release 1.2.1; js SHA-256 `3a5caef7918a85885b61dd53e049ea8bf2b0a3cea508f587bb14970bfe6deaf2`, css `7cc2deb475a8d6e4af331407b2b4b741716c458a8ce885e2fb2859374b93912e`) with `logo-full.svg` / `logo-quiet.svg` as the final-state fallback. Bytes are never edited; the wedge stays token-derived (`color-mix(in lch, energy.sky 48%, brand.blue)`), never a sampled hex.\n\n\n**Repetition (OWNER-MOTION-01, 11 September 2026, outranks every LDS version).** Every animation plays as soon as ≥ 14% of it is in the viewport and replays for as long as it stays visible; it stops when it leaves the viewport. Cycles are repeated finite plays (never `animation-iteration-count: infinite`), ≥ 2,000 ms; the logo cycle is 6,000 ms so its final state stays visible between plays. One page-level pause/resume control exists. `prefers-reduced-motion: reduce`, no-JavaScript and print routes render the final state and start no cycle. State-bound motifs (`motif.progress`) still appear only while the real state runs.\n\n**Still prohibited.** Hue cycling, shape distortion, motion carrying evidence or meaning, motion over the first answer or the primary action, motifs in navigation, favicon or OG images (official identity files only).\n\nขอบเขตตามคำตัดสินของเจ้าของ 15 กันยายน 2569: กฎนี้ใช้กับ `web_public`, `app_interactive.browser` และ document/PDF/deck ที่ render ในเบราว์เซอร์; ไฟล์ static ที่ export แล้ว (PDF, PPTX, PNG, email) ใช้ final state เท่านั้น การเล่นซ้ำครอบคลุม decorative และ identity motion (motif runtime ทุก kind และ approach reveal เมื่อกลับเข้า viewport) ส่วน CTA discovery cue ยังคงเล่นครั้งเดียวต่อ page load ตาม §7.3 เพราะเป็น motion เหนือ primary action ซึ่งข้อห้ามของกฎนี้ยังคงอยู่ (ยืนยันแล้ว 15 กันยายน 2569) motif อีกห้าตัว (dial, rings, layers, slice, cultivate) และ product overlay อยู่ใต้ §8.6\n\nMachine binding: `machine.tokens#/motion/identity` (runtime ids, hashes, cycle 6,000 ms, observer threshold 0.14 กับ rootMargin `0px 0px -8% 0px`, page control, reduced-motion และ no-JS behavior) และ `machine.contracts.componentContracts#component.motif-frame.01` MotifFrame wrapper ใช้ observer ของตัวเองแล้วเรียก `play()` ของ runtime ทุกรอบขณะมองเห็น (runtime ตั้ง `autoplay=\"false\"`) จึงไม่แก้ byte ของ runtime และไม่พึ่ง attribute `loop` ซึ่งไม่ผูกกับ viewport เมื่อ autoplay ปิด; ปุ่ม pause/resume ระดับหน้าเป็นของ `component.motion-controller.01` ตัวเดียวที่ทุก MotifFrame บนหน้าแชร์\n\nความต่างที่เจ้าของยอมรับและบันทึกไว้ (15 กันยายน 2569): ไฟล์อัตลักษณ์ PNG มีลิ่ม `#0195CB` และหมุด `#1E4497` ส่วน motif v3 ใช้ลิ่ม token-derived ที่เบราว์เซอร์แสดง ≈ `#1F87CE` และหมุด `#1D4497` (token) รัศมีต่างกัน ≤ 0.6% ไฟล์ PNG ทางการยังเป็น identity of record; motif เป็น animated assembly reference ไม่ใช่ identity file และไม่มีการ re-export PNG",
"acceptance":[{"checkId":"MOTION-04-A","method":"automated","criterion":"runtime js/css bytes ที่ deliver มี SHA-256 ตรงค่าข้างบน; fallback svg ตรง `governance/SHA256SUMS.txt` ของ motif 1.2.1 (`90e9543f…`, `5b6798cd…`); ไม่มี `animation-iteration-count: infinite` ใน delivered CSS; observer threshold/rootMargin/cycle ตรง token; page-level pause control มีอยู่; identity PNG ไม่ถูก animate หรือ redraw; wordmark colour changes ตาม LOGO-01 ใช้ได้ โดยคงรูปทรงและไม่เปลี่ยนสี symbol"},{"checkId":"MOTION-04-B","method":"interaction","criterion":"เข้า viewport ≥ 14% แล้วเล่นทันทีและเล่นซ้ำทุก 6,000 ms ขณะยังมองเห็น; ออกจาก viewport แล้วหยุดค้าง final state; pause แสดง final state ครบ; reduced motion, no-JS และ print แสดง final state โดยไม่เริ่มรอบ"},{"checkId":"MOTION-04-C","method":"manual","criterion":"motion ไม่ทับ first answer, primary action, navigation, favicon หรือ OG image และไม่ถือความหมาย หลักฐาน หรือสถานะใด ๆ"}],
"sourceTextSha256":"3365e51d1fb147f2a57f60f53346ec65d4b4cc29f282649c3688ccc8388ab706",
"sourceRuleId":"MOTION-04"
},
{
"id":"MOTIF-01",
"title":"Motion shows the method",
"section":"motion",
"normativeLevel":"MUST",
"scope":"web_public,app_interactive,document_flow,pdf_fixed,deck_presentation",
"requirement":"Landometer motion enacts the method: parts arrive in the order the work happens — the pin lands (place), the plates set (measure), the wedge points (act). Every motif declares one job from the registry (`orientation`, `opening`, `spatial_transition`, `section_orientation`, `layering`, `quiet_divider`, `action_closure`, `cultural_closure`, `handoff`, `animated_brand_opening`). Motion that enacts no registered job is not used.\n\n\nJob ต่อ kind ตาม `assets/motif-library.json` (1.2.1, `77e81851…`): dial → orientation, opening · rings → spatial_transition, section_orientation · layers → layering, quiet_divider · slice → action_closure · cultivate → cultural_closure, handoff · logo → animated_brand_opening prohibitedJobs ของทุก kind (data_encoding, evidence, measured_state, loading_state, official_navigation_identity, favicon, co_brand_lockup) ใช้ตามตัวอักษร MotifFrame ปฏิเสธ `job` ที่ไม่อยู่ใน allowedJobs ของ kind นั้น (throw) และ preflight ตรวจซ้ำ",
"acceptance":[{"checkId":"MOTIF-01-A","method":"automated","criterion":"ทุก `<lm-motif>` ที่ deliver อยู่ใน MotifFrame ที่ประกาศ `job` ซึ่งอยู่ใน allowedJobs ของ kind ใน `machine.contracts.motifRegister`; Build Card `motionMoments[]` ระบุ kind, job และ beat ของทุก moment"},{"checkId":"MOTIF-01-B","method":"manual","criterion":"job ที่ประกาศตรงกับสิ่งที่ผู้ใช้ทำอยู่ตรงนั้น (orient, move, layer, close, hand off) ไม่ใช่การตกแต่ง"}],
"sourceTextSha256":"7b5eee4a05f62d3eb1947b85c1f3653099837fa9642e29242d0cb4a31dd363f4",
"sourceRuleId":"MOTIF-01"
},
{
"id":"MOTIF-02",
"title":"Exact bytes, exact landing",
"section":"motion",
"normativeLevel":"MUST",
"scope":"web_public,app_interactive,document_flow,pdf_fixed,deck_presentation,social_static",
"requirement":"Motifs and the animated mark exist only as registered runtime bytes (`landometer.motif.v3`, montri-th/motif ≥ 1.2.1) with a final-state SVG whose geometry equals the last frame. No redraw, recolor, crop, distortion or tracing from screenshots. `prefers-reduced-motion`, no-JavaScript, print, PDF, deck, email and social routes render the final state. Motion never carries evidence, data, measured state, completion or product capability (prohibitedJobs in the manifest apply verbatim).",
"acceptance":[{"checkId":"MOTIF-02-A","method":"automated","criterion":"runtime js/css และ final-state SVG ทั้ง 12 ไฟล์ที่ deliver มี SHA-256 ตรง `machine.contracts.motifRegister` (ค่าจาก manifest 1.2.1 ตรวจกับไฟล์ใน repo แล้ว); ทุก MotifFrame มี `<noscript>` final-state SVG ของ kind และ variant เดียวกัน"},{"checkId":"MOTIF-02-B","method":"manual","methodDetail":"manual/visual","criterion":"เฟรมสุดท้ายของ runtime ทับ SVG final state ได้พอดี; ไม่มีการ recolor หรือ crop"}],
"sourceTextSha256":"a9af44157779416b9841c7511aafc710404773d3e1a5f138bdc345802a047a29",
"sourceRuleId":"MOTIF-02"
},
{
"id":"MOTIF-03",
"title":"Joyful physics, bounded",
"section":"motion",
"normativeLevel":"MUST",
"scope":"web_public,app_interactive,document_flow,pdf_fixed,deck_presentation",
"requirement":"The motion vocabulary is physical and finite: drop with squash and stretch, pop-overshoot placement, four-beat stagger (0/150/300/450 ms), step-out-and-return finale, hop (product stings). Not permitted: hue cycling, identity morphing, geometry distortion, parallax, unbounded ambient loops, scale overshoot beyond 1.16. A motif runs 1.2–3.4 s; a cycle is ≥ 2,000 ms (logo 6,000 ms) under OWNER-MOTION-01; one page-level pause/resume control exists.",
"acceptance":[{"checkId":"MOTIF-03-A","method":"automated","criterion":"ไม่มี `animation-iteration-count: infinite`; MotifFrame `data-cycle-ms` ≥ 2000 (logo 6000); MotionController หนึ่งตัวต่อหน้า; ไม่มี transform scale > 1.16 ใน CSS ที่ deliver นอก runtime bytes"},{"checkId":"MOTIF-03-B","method":"interaction","criterion":"เข้าจอ ≥ 14% แล้วเล่นทันทีและเล่นซ้ำตามรอบ; พ้นจอแล้วหยุดค้าง final state; pause ค้าง final state; reduced motion/no-JS/print ไม่เริ่มรอบ"}],
"sourceTextSha256":"55b409245e1602a88e212984df89e143b3d5ae1c6f015a4ef92d4acc08a7b2e5",
"sourceRuleId":"MOTIF-03"
},
{
"id":"MOTIF-04",
"title":"Three beats, three moments — the joy budget",
"section":"motion",
"normativeLevel":"MUST",
"scope":"web_public,app_interactive,document_flow,pdf_fixed,deck_presentation",
"requirement":"Motifs are placed at the story beats INTENT → AHA → NEXT ACTION, aligned with the BRAND rhythm's Opening / Transition / Closing: Opening = `logo` (animated brand opening) or `dial` (orientation); Transition = `rings` (spatial transition) or `layers` (layering / quiet divider); Closing = `slice` (action closure) or `cultivate` (cultural closure / handoff). A long route carries at most three motion moments; a task surface carries one. Motifs never sit on the first answer, the primary proof or the primary action. Where a motif may sit is governed by MOTIF-06.",
"acceptance":[{"checkId":"MOTIF-04-A","method":"automated","criterion":"Build Card `motionMoments[]` ≤ 3 ต่อ route (≤ 1 ต่อ task surface) และแต่ละ moment มี beat ที่ตรงกับ kind ตามตารางข้างบน; ไม่มี MotifFrame ในบริเวณที่ทำเครื่องหมาย `data-region=\"first_answer|primary_proof|primary_action\"`"},{"checkId":"MOTIF-04-B","method":"manual","criterion":"จังหวะที่วางตรงกับเรื่อง (INTENT → AHA → NEXT ACTION); พื้นที่วางตรวจตาม MOTIF-06"}],
"sourceTextSha256":"82213883e89c24c233a7f5d7244b3ec9744fbff5c17790a4eba19cc2a8449183",
"sourceRuleId":"MOTIF-04"
},
{
"id":"MOTIF-05",
"title":"Shared layer versus product overlay",
"section":"motion",
"normativeLevel":"MUST",
"scope":"web_public,app_interactive,document_flow,pdf_fixed,deck_presentation",
"requirement":"`landometer.motif.v3` is the product-neutral shared layer. Product animated identities are separately registered overlays with their own final fallback, duration, minimum size and host surface (`ijji.logo-sting.r3` exists: Hop → Bodies → Tagline → Hello → Hold, 9.0 s full / 6.4 s mark-only, ≥ 320 / 160 px). CityMETER, CityWiki and CityChat stings are produced in the Motif Studio under the same contract and enter the manifest with SHA-256 and owner approval before the DS references them. Families are never mixed in one lockup; navigation, favicon and OG images use official identity files, never motifs.\n\n\nทะเบียน product overlay ของ release นี้อยู่ใน `machine.contracts.motifRegister#/productOverlays` ตามคำตัดสินของเจ้าของ 15 กันยายน 2569: `ijji.logo-sting.r3` (runtime `1a1d1bc2…`, stills `bb1bc80e…` / `acac2c65…`) และ `ijji.four-beat.selected-3.r3` (state-bound: graph-b, rings-c, rotate-b; ใช้เฉพาะขณะมี pending operation จริง มี status text และปุ่ม cancel) อนุมัติแล้วใน manifest 1.2.1 · CityChat conversation set (SVG 7 ไฟล์ + `citychat-motif-motion.js/.css`) อนุมัติโดยเจ้าของตาม bytes ปัจจุบันของ repo (commit a99f3c1e) โดยป้าย candidate ของทะเบียนต้นทางเป็นบันทึกประวัติ ณ วันที่รับ bytes ไม่ใช่ข้อสรุปสถานะเว็บปัจจุบัน; ใช้ approval/hash record ที่ส่งพร้อม Add-on แยกของผลิตภัณฑ์ · CityMETER และ CityWiki stings มี historical pre-approval; ใช้ได้ต่อเมื่อ current product registry มี approved bytes และ exact hash จริง overlay ทุกตัวใช้ได้เฉพาะงานของผลิตภัณฑ์นั้น ไม่ผสมกับ shared motif ใน lockup เดียว และไม่สร้าง product fact ใด ๆ (สี ความหมาย ความสามารถของผลิตภัณฑ์อยู่ใน Product Brief/Add-on ของผลิตภัณฑ์นั้น)\n\nCandidate briefs สำหรับ Studio 1.4 (ยังไม่ได้วาด ไม่ใช่ asset): `receipt` — closure เมื่อออกใบรับตัวเลข/decision log (job: handoff) · `compare` — transition ของสองพื้นที่เคียงกัน (job: spatial_transition) · `citymeter.pending` — ตระกูล state-bound (ต้องมี status text และ cancel ที่ทำงานจริง) · product stings ของ CityMETER / CityWiki / CityChat",
"acceptance":[{"checkId":"MOTIF-05-A","method":"automated","criterion":"overlay ที่ deliver อยู่ใน `machine.contracts.motifRegister#/productOverlays` ด้วย hash ตรงและ `approval.status: owner_approved`; productScope ของ overlay ตรงกับ product layer ของ Build Card; ไม่มี overlay กับ shared motif ใน lockup เดียว"},{"checkId":"MOTIF-05-B","method":"manual","criterion":"overlay ไม่ถูกใช้แทน official identity ใน navigation, favicon หรือ OG image และไม่สื่อความหมายเชิงหลักฐาน"}],
"sourceTextSha256":"ff2be4f2b65b3bd51de3cd9c2bc1618308273af08fdc9a3a371bd79854fb13db",
"sourceRuleId":"MOTIF-05"
},
{
"id":"MOTIF-06",
"title":"Every motif sits on a measured carrier",
"section":"motion",
"normativeLevel":"MUST",
"scope":"web_public,app_interactive,document_flow,pdf_fixed,deck_presentation,social_static",
"requirement":"A motif's colours are fixed by its governed file, so its legibility is decided by the ground it sits on. Every placement — a MotifFrame or a static final-state image — declares that ground, and a placement is allowed only when `machine.contracts.motifRegister#/carrierPolicy` lists its kind × variant × carrier for every theme the output renders: every visible authored paint composites at 1.30:1 or more on the carrier (a gradient at its worst stop). `full` variants (Brand Blue ink) sit only on plain light carriers; `quiet` variants (one sky ink) sit only on deep carriers, Brand Blue included. A `full` variant never sits on Brand Blue, on a dark surface or on any atmosphere gradient. Runtime renditions keep the governed inks (`ink=\"blue\"` for full, the default sky for quiet). A failing pair is fixed by changing the carrier, then the variant, then the size or spacing, then by removing the motif — never on the asset: no recolour, plate, scrim, new tint, or opacity carrying meaning.\n\n\nที่มา: `motif-quiet-fallback.json` (landometer-quiet-fallback/1.0) ที่เจ้าของอนุมัติ 11 กันยายน 2569 เป็น normative ของงานที่ใช้ Motif Library 1.2.1 และคำตัดสินของเจ้าของ 16 กันยายน 2569 ให้นำเข้า DS ในรอบนี้แทนประโยคพื้นของแพตช์ r2 ใน MOTIF-04 ซึ่งวัดแล้วขัดกับ bytes: SVG แบบ full ทั้งหกมี Brand Blue `#1D4497` อยู่ในตัว จึงเหลือ 1.00:1 บน Brand Blue (หมุดโลโก้ เส้นฐาน วงใน แผ่นฐาน ตัวพาย และต้นกล้าหายไป) และบน atmosphere ทั้งสี่ชุดมีบางส่วนต่ำกว่า 1.30:1 ส่วน quiet ใช้หมึก energy.sky `#59D2FE` สีเดียว บนพื้นสว่างทุกแบบส่วนที่เข้มที่สุดได้เพียง 1.23–1.74:1 แต่บนพื้นทึบธีมมืดได้ 3.37–10.23:1 และบน Brand Blue 2.74–5.19:1 ครบรูป ตัวเลขทุกค่าวัดใหม่จาก bytes ที่ hash ตรงด้วย `measure-motif-carriers-0.9.4.mjs` (composite 8-bit เหมือนที่จอแสดง) และตรงกับตารางของ ladder ทุกค่า\n\n| variant | วางได้ (ทุก kind เว้นที่ระบุ) | ห้าม |\n|---|---|---|\n| `full` | `surface.canvas`, `surface.card`, `surface.raised`, `surface.alt`, `surface.soft`, `surface.blueTint`, `surface.beigeTint` ของธีมสว่าง และ `brand.beige` — `layers` ได้เฉพาะ canvas, card และ raised (แถวจางของมันได้ 1.21–1.26:1 บนพื้นสว่างอื่น และ 1.30:1 พอดีเกณฑ์บน canvas) | Brand Blue · พื้นธีมมืดทุกแบบ · atmosphere ทุกชุด · ภาพถ่าย · พื้นของ semantic state |\n| `quiet` | `surface.*` ทุกตัวของธีมมืด, `brand.blue`, `atmosphere.ground.current`, `atmosphere.measure.deep` — `layers` ได้เฉพาะพื้นทึบ (บน atmosphere เข้มวงจางที่สุดได้ 1.27–1.28:1) | พื้นสว่างทุกแบบ · `atmosphere.ground.mist`, `atmosphere.measure.luminous` · gradient ของ cultivate, diversity และ product · ภาพถ่าย |\n\nการประกาศ: ทุก MotifFrame และทุกภาพ motif แบบนิ่งบนเว็บ (`data-motif-static=\"<kind>-<variant>\"`) มี `data-host-surface` เป็น carrier id จาก `carrierPolicy.carriers` — id ที่เปลี่ยนตามธีม (เช่น `surface.card`) ถูกตรวจแยกทุกธีมที่งานรองรับ (`<meta name=\"color-scheme\">`; ไม่ประกาศ = ทั้งสองธีม), รูป `<id>@light` หรือ `<id>@dark` หมายถึงพื้นที่ทาค่าธีมนั้นคงที่ทั้งสองธีม และ id ที่ไม่เปลี่ยนตามธีม (`brand.beige`, `brand.blue`, `atmosphere.*`) ใช้ค่าเดียว · `data-variant` คือ variant ของธีมสว่าง และ `data-variant-dark=\"quiet\"` สลับ frame แบบ full บนพื้นที่เปลี่ยนตามธีมให้เป็น quiet ในธีมมืด (MotifFrame สลับ attribute `quiet` ของ runtime และ `<noscript>` มี SVG ทั้งสองแบบใน wrapper `.lds-motif-noscript` ที่ติด `data-theme-variant=\"light|dark\"` ซึ่งเลือกธีมแบบเดียวกับหน้า — `data-theme` ก่อน แล้วจึงค่าของระบบ; `<picture>` ที่ตามเฉพาะค่าของระบบใช้แทนไม่ได้) ซึ่งเป็นการสลับแบบเดียวที่ตารางวัดยอมรับ · MotifFrame ปฏิเสธคู่ที่ไม่อยู่ในทะเบียน พื้นที่ทาจริงที่ไม่ตรงกับที่ประกาศ และค่า `ink` ที่ไม่มีไฟล์รองรับ แล้วถอด frame ออกจากการแสดงผล (ขั้น L5) · งาน export แบบนิ่ง (PDF, deck, social, email) ใช้ตารางเดียวกันกับพื้นของหน้านั้น · Build Card `motionMoments[]` และ `staticMotifPlacements[]` บันทึก `hostSurface`, ค่าพื้นต่อธีม, คอนทราสต์ที่วัด, verdict และขั้นของ ladder ที่ใช้\n\nลำดับการแก้เมื่อคู่ไม่ผ่าน (ladder L1–L5 ของไฟล์ที่อนุมัติ): L1 วัดกับพื้นจริงที่ขนาดจริง · L2 ย้ายไปพื้นอื่นในตาราง · L3 เปลี่ยน variant (เป็นการเลือก record ไม่ใช่การเปลี่ยนสี) · L4 เพิ่มขนาดหรือระยะว่าง · L5 ถอดลายออก — ถ้าความจริงบนหน้าเปลี่ยนเมื่อถอดลาย แปลว่าลายกำลังทำงานที่ไม่ได้รับอนุญาต ถ้าต้องการ `full` บนพื้นเข้มหรือ Brand Blue ในอนาคต Motif Studio ต้องผลิต final-state record เฉพาะพื้นเข้มแล้วลงทะเบียนพร้อม hash ก่อน (แบบที่ `ijji.four-beat.selected-3.r3` มี record หกพื้น) โลโก้ทำแบบนี้ไม่ได้เพราะหมุดต้องเป็น `#1D4497`",
"acceptance":[
{"checkId":"MOTIF-06-A","method":"automated","criterion":"ทุก `.lds-motif-frame` และ `[data-motif-static]` มี `data-host-surface` ที่ resolve ได้ใน `machine.contracts.motifRegister#/carrierPolicy/carriers`; คู่ kind × variant × carrier ของทุกธีมที่งาน render อยู่ใน `carrierPolicy.allowed`; frame แบบ full มี `ink=\"blue\"` และ frame แบบ quiet ไม่มี ink อื่นนอกจาก sky; frame ที่สลับธีมมี SVG ทั้งสองแบบใน `<noscript>` แยก wrapper ตามธีม; `measure-motif-carriers-0.9.4.mjs --register` วัด 12 ไฟล์ × 20 carrier ใหม่แล้วตรงกับทะเบียน; preflight PF-MOTIF-06-CARRIER ผ่าน"},
{"checkId":"MOTIF-06-B","method":"interaction","methodDetail":"interaction/visual","criterion":"ในเบราว์เซอร์ทั้งธีมสว่างและธีมมืด สีพื้นที่ render จริงหลังทุก frame และทุกภาพนิ่งเท่ากับ carrier ที่ประกาศ และทุก paint ของ final-state SVG ได้ 1.30:1 ขึ้นไปบนพื้นนั้น; สลับธีมแล้ว variant เปลี่ยนตาม `data-variant-dark`; frame ที่ถูกปฏิเสธไม่แสดงผล"},
{"checkId":"MOTIF-06-C","method":"manual","criterion":"เมื่อคู่ไม่ผ่าน การแก้เดินตาม L1–L5 และบันทึก `quietFallbackRung` ใน Build Card; ไม่มีการ recolor, แผ่นรอง, scrim, สีใหม่ หรือ opacity ที่ถือความหมาย"}
],
"sourceTextSha256":"9d8511234895472dac10052112be19fd9e298aa575b44b4ef5cc59d837d44c11",
"sourceRuleId":"MOTIF-06"
},
{
"id":"A11Y-01",
"title":"Semantics and direct operation survive every state",
"section":"accessibility",
"normativeLevel":"MUST",
"scope":"all",
"requirement":"ทุก applicable artifact MUST meet WCAG 2.2 Level AA เป็น floor Information structure, names, roles, values, focus order, alternatives, status announcements และ direct operation MUST equivalent ใน initial, hydrated, loading, success, empty, error, reduced-motion, high-zoom, keyboard, touch, print และ export states ที่ applicable Native HTML/format-native structure comes first; ARIA supplements rather than repairs wrong semantics",
"acceptance":[{"checkId":"A11Y-01-A","method":"automated","criterion":"zero critical/serious release-blocking errors; normal text ≥4.5:1, large text ≥3:1 และ required non-text/focus ≥3:1 ในทุก applicable state"},{"checkId":"A11Y-01-B","method":"manual","criterion":"keyboard, screen-reader, zoom, reflow, reduced-motion และ touch checks มี receipts"}],
"sourceTextSha256":"9f3b853fdad7a1f66dcc5b10cc137cf9535eb00dff4f9a769bc7c6aabb71b142",
"sourceRuleId":"A11Y-01"
},
{"id":"CLAIM-MACHINE-01","title":"Claims have stable machine-readable records","section":"discovery","normativeLevel":"MUST","scope":"public,agent_readable","requirement":"Material public claim ทุกอัน MUST มี stable claimId และ machine-readable record ซึ่ง wording, entity, locale, scope, explicit authority class/boundary, value/assertion, unit, geography, time basis, source, method, status, confidence/limitation, owner และ last-reviewed date ตรง visible claim","acceptance":[{"checkId":"CLAIM-MACHINE-01-A","method":"automated","criterion":"claim IDs unique และ required field มีค่าหรือ explicit not_applicable; public-eligible evidence/provenance refs เป็น stable public HTTPS URL หรือ URN ไม่ใช่ local path"},{"checkId":"CLAIM-MACHINE-01-B","method":"manual","criterion":"sample visible-to-machine comparison ไม่มี scope, value, date, status หรือ evidence drift"}],"sourceTextSha256":"d6335f128667b691fc9cb3840a3856ebf98ab1c1e2b39afd10d30108ae3eed34","sourceRuleId":"CLAIM-MACHINE-01"},
{
"id":"DISCOVERY-01",
"title":"Initial and hydrated meaning are equivalent",
"section":"discovery",
"normativeLevel":"MUST",
"scope":"web_public,app_interactive",
"requirement":"Public page MUST expose title, primary answer, headings, material claims, evidence links, destinations และ language relationship ใน initial semantic HTML; hydration MUST NOT replace, contradict หรือ hide meaning นั้น\n\n\nArtifact ที่ claim `artifact_qa_passed` หรือสูงกว่าสำหรับ `web_public` MUST มี `delivery.primaryHtmlBinding` ซึ่งตรงกับ entry `text/html` หนึ่งไฟล์ใน `delivery.files` ทั้ง path, media type และ SHA-256 Validator MUST parse bytes ของไฟล์นั้นจริงและเทียบ `html lang`, unique title/description/robots, canonical, hreflang, Open Graph, strict JSON-LD, visible H1, marked primary answer, exact claim + limitation text, evidence destination, navigation/action label + destination และ visible locale links กับ discovery/structured-data/claim/action contracts Content ที่ hidden, inert, `aria-hidden`, non-rendered, transparent, clipped หรือ visually hidden MUST NOT satisfy visible truth การมี declaration ที่ถูกต้องแต่ final initial HTML ไม่ตรงยังเป็น failure `delivery.webDiscoveryEvidence` MUST bind artifact/build/primary HTML identity และ exact no-script, hydrated-DOM, accessibility-tree, internal-locale-link กับ sitemap evidence; Production probe และ resolved production evidence MUST bind hash ของ primary HTML นี้โดยตรง",
"acceptance":[{"checkId":"DISCOVERY-01-A","method":"automated","criterion":"exact hash-bound delivered primary initial HTML parse แล้วตรง governed lang, unique metadata, canonical/hreflang/social, strict JSON-LD, visible H1, exact marked primary answer, claim/limitation, evidence และ action/navigation destinations; hidden/non-rendered truth ใช้ผ่านไม่ได้; hash-bound no-script, hydrated DOM และ accessibility-tree snapshots ยังรักษา exact primary meaning/destinations และ receipt cite evidence ทั้งสาม"},{"checkId":"DISCOVERY-01-B","method":"production","criterion":"deployed canonical URL ตอบ crawlable success, observed content hash เท่า bound primary initial HTML และมี primary content เดียวกัน"}],
"sourceTextSha256":"6643e251bbc0ba428e97bc07d8252507e9725b80d534f3e131ab5e0d285c394d",
"sourceRuleId":"DISCOVERY-01"
},
{
"id":"DISCOVERY-02",
"title":"Canonical, locale, index, and sitemap signals agree",
"section":"discovery",
"normativeLevel":"MUST",
"scope":"web_public,app_interactive",
"requirement":"Indexable page ทุกหน้า MUST มี stable self-canonical URL หนึ่งอัน, explicit language alternates เมื่อมี equivalent, consistent robots/sitemap treatment, working language links และไม่มี automatic language redirect ที่ขัด discovery/user choice",
"acceptance":[{"checkId":"DISCOVERY-02-A","method":"automated","criterion":"canonical, hreflang, HTML lang, robots, social metadata, JSON-LD identity, hash-bound delivered sitemap, visible internal locale links และ hash-bound internal-locale-link snapshot เป็น exact governed graph; sitemap loc set เท่ากับ governed locale route URLs และ receipt cite no-script/hydrated/accessibility/sitemap/internal-locale evidence ครบ"},{"checkId":"DISCOVERY-02-B","method":"production","criterion":"canonical/alternate URLs resolve โดยไม่มี loop, soft error หรือ locale-forcing redirect"}],
"sourceTextSha256":"acfa18386a55a990d323cc0d26c08cf7e536a5ed01f4cb4f1e86a5009ccf5df7",
"sourceRuleId":"DISCOVERY-02"
},
{
"id":"DISCOVERY-03",
"title":"Machine discovery never overstates permission or quality",
"section":"discovery",
"normativeLevel":"MUST",
"scope":"web_public,agent_readable",
"requirement":"Structured data MUST describe visible approved truth และ match page kind Sitemap, robots, crawler access และ optional llms navigation เป็น discovery controls เท่านั้น ไม่ใช่ evidence, permission, licensing, readiness, ranking หรือ quality guarantee",
"acceptance":[{"checkId":"DISCOVERY-03-A","method":"automated","criterion":"initial HTML มี JSON-LD document เดียวที่ root มีเฉพาะ `@context` + `@graph`, context เป็น `https://schema.org`, graph entity set ตรง governed projection และแต่ละ entity มีเฉพาะ exact `@id`, `@type`, `name`, `url`; property/entity/type/claim/permission/readiness/ranking/quality ที่เพิ่มเองเป็น blocking overclaim"},{"checkId":"DISCOVERY-03-B","method":"manual","criterion":"ไม่มี discovery file/crawler directive ถูกอ้างเป็น authorization, evidence หรือ ranking promise"},{"checkId":"DISCOVERY-03-C","method":"manual","criterion":"indexable route passes distinct question, answer/task, material content, evidence and maintained-owner useful-page test"},{"checkId":"DISCOVERY-03-D","method":"automated","criterion":"crawler decisions purpose-separated; optional AI navigation derives canonical public routes only and carries no permission/readiness meaning"}],
"sourceTextSha256":"bc046b7a1e798f203b390530b81e30f726f1eb582de8f8f1598a9194410f150a",
"sourceRuleId":"DISCOVERY-03"
},
{
"id":"AGENT-01",
"title":"Agent-readable does not mean agent-authorized",
"section":"agents",
"normativeLevel":"MUST",
"scope":"agent_readable,agent_action",
"requirement":"Agent interface MUST แยก readable information, available capability, required permission, confirmation, execution และ receipt Agent MUST NOT infer authorization จาก discoverability, UI affordance, credential หรือ absence of denial",
"acceptance":[
{"checkId":"AGENT-01-A","method":"automated","criterion":"machine action ทุกอัน hash-bind immutable definition, typed input schema/value, actor-scoped authority, side-effect/confirmation policy และ exact bytes ของ result/receipt schemas; definition, runtime และ Build Card ต้องตรงกันทั้ง `productScope` และ conditional `namedProduct`; runtime state ห้าม redefine authority"},
{"checkId":"AGENT-01-B","method":"interaction","criterion":"mutation fixtures block execution เมื่อ actor scope, unexpired authority, input classification, operation, permission, confirmation หรือ external/costly authority class ไม่ตรง; ทุก execution ที่เริ่มแล้วต้องมี signed `pre_start` revocation decision ซึ่ง bind nonce/build/artifact/action/actor สดภายในห้านาทีก่อนเริ่ม และออก attestation ไม่ช้ากว่า `startedAt` ส่วน `succeeded | failed | cancelled` MUST เพิ่ม signed `terminal_boundary` decision ที่มีคนละ `revocationId`, record และ attestation ซึ่งตรวจตั้งแต่ applicable effect-or-terminal boundary จนไม่เกินห้านาทีหลัง boundary; terminal receipt MUST bind decision หลังนี้ ตรง runtime ทั้ง operation/status/timestamps/side effect/result/recovery และมี externally pinned `agent_execution` attestation"}
],
"sourceTextSha256":"14121a98c34dc9dc3152f53fa053a35708f3c809ebcb328c9c49a4f9c684e054",
"sourceRuleId":"AGENT-01"
},
{"id":"SECURITY-01","title":"Public presentation cannot reveal restricted evidence","section":"privacy-security","normativeLevel":"MUST","scope":"all","requirement":"Output, metadata, preview, source map, machine projection, log และ agent receipt MUST เคารพ data classification และ MUST NOT เปิดเผย restricted evidence, personal data, credential หรือ internal-only source detail","acceptance":[{"checkId":"SECURITY-01-A","method":"automated","criterion":"secret, personal-data, private-URL และ restricted-field scans ผ่าน"},{"checkId":"SECURITY-01-B","method":"manual","criterion":"disclosure ยังมีประโยชน์โดยไม่ข้าม evidence boundary"}],"sourceTextSha256":"f43247a3b4dbb4fc9301465be72c58955e448612434b4bdf2e433ee6b52adfb0","sourceRuleId":"SECURITY-01"},
{
"id":"DATAVIZ-01",
"title":"Data visualization preserves analytical meaning",
"section":"capability-packs",
"normativeLevel":"MUST",
"scope":"data_visualization",
"requirement":"Chart, score, comparison หรือ quantitative diagram MUST declare question, measure, unit, denominator, time, geography, grain, transform, uncertainty, schema release, claim/evidence IDs, scale และ accessible alternative Color ไม่เป็น carrier เดียว Truncated axis ต้องมีเหตุผล Observation แยก interpretation และ incompatible series ห้าม normalize เพื่อความสวย",
"acceptance":[{"checkId":"DATAVIZ-01-A","method":"automated","criterion":"required overlay fields, scale (family จาก `machine.tokens#/analyticalScales` หรือ series จาก `machine.tokens#/categoricalSeries`), Build Card `scaleFamilies[]` และ `seriesVariant`, non-color cues, value states ของ EVID-05, claim/evidence IDs and accessible data alternative resolve"},{"checkId":"DATAVIZ-01-B","method":"manual","criterion":"form, scale, baseline, ordering, annotation, uncertainty and conclusion preserve meaning in format"}],
"sourceTextSha256":"7260458ff77f38e5a07e202e2067f9c8d07b0fda9b73527ef0a44f78a91d1524",
"sourceRuleId":"DATAVIZ-01"
},
{
"id":"DATAVIZ-02",
"title":"Sequential scales use three distinct-hue anchors and exact approved samples",
"section":"capability-packs",
"normativeLevel":"MUST",
"scope":"data_visualization,map",
"requirement":"Select the family from the metric and denominator. Each of the 20 analytical families has three explicit approved anchors at 0%, 50%, 100% (LUT indices 0, 20, 40), summarized below and fully specified in machine.analyticalScales. Consume the exact 41-sample sRGB table and its class projections. Do not interpolate a new palette from endpoints or three anchors at consumption.\n\n\nEvery sequential midpoint MUST turn toward a visibly different hue from the end, not merely a lighter end tint. Starts are the approved family-specific semantic near-whites; universal cream is not required. The midpoint is a perceptual turn within a single numerical direction, not zero, balance or a threshold. OKLab lightness and relative luminance strictly decrease from low to high on BOTH themes. The exact approved LIGHT anchors, LUT and class colors are used unchanged on a dark surface with the same direction. Activity uses cool mint/blue; water remains aquatic rather than lime-dominant; density families stay warm.\n\n| Family | Kind | Same anchors on light and dark |\n|---|---|---|\n| `activity` | sequential | `#F1F5E5` → `#60C9AD` → `#25659A` |\n| `density.area` | sequential | `#FFF1D9` → `#E6AB30` → `#D6600C` |\n| `heat` | sequential | `#FFF6CF` → `#F5B323` → `#C72D10` |\n| `risk` | sequential | `#FFF0E5` → `#F27642` → `#A40822` |\n| `price` | sequential | `#F4F4DD` → `#74C4C2` → `#216D58` |\n| `age` | sequential | `#F5F0DF` → `#9DBACB` → `#526832` |\n| `density.household` | sequential | `#FFF2E4` → `#EF84A3` → `#DF491F` |\n| `growth` | sequential | `#EEF5E5` → `#B2C75B` → `#2B702F` |\n| `confidence` | sequential | `#EEF4EB` → `#66AEDF` → `#236A5E` |\n| `count` | sequential | `#F4F0E7` → `#7DBAC0` → `#213E70` |\n| `water` | sequential | `#EEF7FC` → `#3DBBCD` → `#073E78` |\n| `density.capita` | sequential | `#FFF0ED` → `#F3A076` → `#B72B63` |\n| `built` | sequential | `#FFF5D8` → `#F3BC93` → `#BFA000` |\n| `duration` | sequential | `#EEF2F5` → `#98B1A4` → `#33433E` |\n| `balance` | diverging | `#CF5148` → `#F1F3EC` → `#3B87BF` |\n| `delta` | diverging | `#CF5420` → `#F1F3EC` → `#3C9278` |\n| `tradeoff` | diverging | `#B79900` → `#F1F3EC` → `#739CDE` |\n| `flow` | diverging | `#C95368` → `#F1F3EC` → `#2E9095` |\n| `sentiment` | diverging | `#C95170` → `#F1F3EC` → `#49944D` |\n| `anomaly` | diverging | `#4084C7` → `#F1F3EC` → `#D44C3A` |\n\nFourteen sequential families retain explicit metric meaning: activity for activity/usage; density.area for a declared area denominator; heat for measured heat; risk for source-supported risk; price for monetary quantities; age for elapsed age; density.household for a household denominator; growth for a nonnegative cumulative magnitude (signed change uses delta); confidence for stated uncertainty/quality; count for totals, not density; water for water measurements; density.capita for a population/person denominator; built for governed footprint, height or coverage including explicitly defined built-density; duration for travel, waiting or inundation time.\n\nDensity areas remain orange, per-capita rose, household scarlet and built-form gold. Legends MUST show the actual unit and denominator; a color never establishes official population, eligibility, risk or behavior. A topic alone does not choose a denominator.\n\nOne analytical surface uses at most one family per hue zone. Independently labelled panels with their own metric, legend and reading path are separate surfaces. A reference atlas compares families rather than overlaying unrelated measurements. Names, units, thresholds and non-color cues remain necessary: neither the 20 families nor the 17 supporting colors are guaranteed to be universally distinguishable by color alone.\n\nThe six diverging families are balance, delta, tradeoff, flow, sentiment and anomaly. Their midpoint MUST be meaningful and named; both themes use the same approved light table and signed direction. The neutral class spans a declared interval, not automatically only exact zero. Do not infer equal perceptual weight, goodness or danger from either arm.\n\nDiscrete classes use n ∈ {3,5,7,9} and exact indices round(i × 40 / (n − 1)), i = 0…n−1. Prefer 5–7 for compact marks. Adjacent class ΔE OKLab is a diagnostic, not an accessibility certificate; the supplied sets meet the retained 2.2 threshold.\n\nThe consumer supplies domain, classification method, exact thresholds, unit, direction and outlier policy. No-domain selection MUST NOT invent thresholds. Continuous intervals are [lower, upper) except the closed last interval; a displayed integer and its class must agree. Outliers need explicit rejection, approved extension or a declared end-bin, never silent clamping. Renderer, legend, table and export MUST use identical values, thresholds and colors.",
"acceptance":[{"checkId":"DATAVIZ-02-A","method":"automated","criterion":"selected family resolves its exact approved light-source LUT with 41 samples and three anchors at 0/20/40; light and dark anchors/LUT/classes are equal; sequential lightness and relative luminance decrease on both themes; class indices and renderer/legend/table values agree; no endpoint interpolation or silent normalization"},{"checkId":"DATAVIZ-02-B","method":"visual","criterion":"the actual continuous ramp and selected classes are readable without band/hue reversal at their delivered sizes in each offered theme/print context; independent analytical panels preserve clear family/denominator labels and accessible non-color alternatives"}],
"sourceTextSha256":"41b94e249f69785a091653ba32b34184fbb55525baf676a19612823db9073d9c",
"sourceRuleId":"DATAVIZ-02"
},
{
"id":"DATAVIZ-03",
"title":"Analytical values and their direction are invariant across themes",
"section":"capability-packs",
"normativeLevel":"MUST",
"scope":"data_visualization,map",
"requirement":"The owner explicitly adopts the original LIGHT HEX values on dark backgrounds unchanged. Every dark analytical anchor, LUT sample and class MUST equal the corresponding light value and index. Story supporting colors and Location role accents also retain their original light HEX on both themes. No derived dark formula, HEX inversion, per-theme recoloring, opacity adjustment that changes encoded color, direction reversal or alternate normalization is allowed.\n\n\nKeep the data colors when improving contrast: use readable numerical/text labels, meaningful boundaries or a neutral backplate/plot surface. Check the actual displayed size and surface. Known examples on dark.canvas #11191D are water high #073E78 (about 1.67:1), count high #213E70 (about 1.68:1) and duration high #33433E (about 1.71:1); these fills need visible boundaries, labels or a suitable neutral plot backplate in the artifact. This rule is not a claim that all fills attain 3:1 on dark, that 16 roles are color-only distinguishable, or that package checks establish accessibility. The original categorical soft/vivid/ink palettes, foundation pairs, seven decorative gradients and product identity/motif contracts retain their separate existing theme behavior; they are outside this analytical same-HEX decision.",
"acceptance":[{"checkId":"DATAVIZ-03-A","method":"automated","criterion":"light and dark anchors, LUTs, classes, indices and value direction match exactly; supporting and Location role HEX are unchanged across themes; no derived dark formula or custom interpolation is used"},{"checkId":"DATAVIZ-03-B","method":"automated","criterion":"sequential lightness decreases in both themes, diverging arms preserve the approved light-source directions, applicable hue gates pass for every sample, and CSS/token/profile projections bind exact delivered bytes"},{"checkId":"DATAVIZ-03-C","method":"visual","criterion":"text, values, sign, zero, missing states and boundaries remain readable on actual light/dark surfaces; labels or neutral backplates solve insufficient contrast without recoloring encoded values; report CVD/grayscale and actual-size review separately"}],
"sourceTextSha256":"83a3c0d334dc2890a7cdebde27edd63cce5e99ef885f8fd2fe4323f00b6df6ad",
"sourceRuleId":"DATAVIZ-03"
},
{
"id":"GATE-01",
"title":"Data-colour gates run for both themes on every release",
"section":"quality",
"normativeLevel":"MUST",
"scope":"release",
"requirement":"Validate the current approved snapshot, exact token/LUT/production-CSS projections, all 20 families × 2 themes × 41 samples, categorical fill/ink and declared step/hue diagnostics. A mismatch or undeclared failure blocks package use. Save scoped, dated evidence bound to the exact files/hashes; historical gate reports do not certify new bytes. Package checks MUST NOT be described as complete artifact, native-language, CVD or account-installation validation.\n\n\nThe current package verifier checks immutable-source integrity, approved color snapshot parity, typed policy, complete assets and analytical mathematics. The artifact checker separately inspects supported delivered formats and reports its limits. Actual foreground/background contrast, gray/CVD usability, thresholds, native Thai/English composition, keyboard/zoom and export review remain artifact-specific. No new exception may be invented to bypass a failed MUST; any proposed normative change requires owner decision and the version policy in §0.2.",
"acceptance":[{"checkId":"GATE-01-A","method":"automated","criterion":"current exact snapshot, token/LUT/CSS parity, 40 records/1,640 samples, approved class indices/steps and applicable hue checks pass with hash-bound evidence; failed or untested checks are not reported as pass"},{"checkId":"GATE-01-B","method":"manual","criterion":"the release record accurately distinguishes owner approval, package diagnostics and artifact review; no new exception, signature, conformance level or platform activation is claimed without its actual authority/evidence"}],
"sourceTextSha256":"af8afb668c5a371cd6f5552c564f2f32cbcdcf8b54464835d7933b1605ff2ec3",
"sourceRuleId":"GATE-01"
},
{
"id":"DATAVIZ-04",
"title":"Analytical values stay out of the retired hue windows",
"section":"capability-packs",
"normativeLevel":"MUST",
"scope":"data_visualization,map,release",
"requirement":"Every delivered analytical LUT sample, class, anchor and categorical fill/ink in both themes must satisfy the applicable retired-color gates. Earth: OKLCh H 30–100°, C .035–.145, L ≤ .62. Violet: H 285–345°, C ≥ .04. Light clay band H 22–100°, C .09–.145, L .62–.74 is a warning. Proximity to the eight retired earth/taupe values within a 20° hue lane must not be below ΔE 6. The ten exact retired values remain prohibited. Warm pink H 350–20° is allowed; no new token may be minted to escape a gate. The exact retired-value list and gate parameters are in the embedded machine contract.\n\n\nThe scope includes all 41 samples, not only three displayed anchors. Governed semantic states and approved image pixels keep their own role-specific contracts; the analytical ban does not authorize recoloring identity artwork or evidence media.",
"acceptance":[{"checkId":"DATAVIZ-04-A","method":"automated","criterion":"all current analytical samples/classes and categorical values satisfy the applicable earth/violet/proximity/exact-retired-value gates; light clay warnings are recorded; overrides pass the same checks and do not invent escape tokens"},{"checkId":"DATAVIZ-04-B","method":"visual","criterion":"delivered ramps/categories do not read as rejected brown, terracotta or violet; legal warm pink reads as intended in both offered themes on the actual screen/export"}],
"sourceTextSha256":"dc55ceee9a8a8c6cc3d4073ffd61357250ae6329e25fa5f9fbaa769e07141171",
"sourceRuleId":"DATAVIZ-04"
},
{
"id":"DATAVIZ-05",
"title":"Categorical series are luminous and edge-separated",
"section":"capability-packs",
"normativeLevel":"MUST",
"scope":"data_visualization,map",
"requirement":"Use `landometer-series-10-v8`, ten stable category IDs with exact theme-specific soft/vivid fill and ink roles. Current light values are retained; current dark soft/vivid/ink values are the approved redesigned set. Assignments persist by category ID through filtering and sorting. Default is soft; vivid is an explicit surface choice. Vivid charts and energy accents MUST NOT compete on the same surface. The governed sky energy-accent cue retains its surface constraints even in soft.\n\n\nFills need not reach 3:1 against canvas: adjacent areas require a ≥1px `border.default` edge or an ink outline; legend swatches require a hairline border. Text, lines and marks thinner than 3px use the ink tier, with ≥4.5:1 for normal text on its actual canvas/card. Where ink falls back to `text.primary`, category identity remains in fill plus cue. Preserve the ten cue assignments: circle, square, triangle, diamond, cross, star, hexagon, ring, dash, plus. Every use needs a non-color cue; slots 7–10 require their shape cue. Do not restore old v5 aliases or substitute old dark values.",
"acceptance":[{"checkId":"DATAVIZ-05-A","method":"automated","criterion":"colors resolve the exact v8 category/theme/variant/ink records by stable category ID; normal ink reaches 4.5:1 on its actual surface; required edges/legend borders and shape cues are present; thin marks use ink; delivered variant agrees with the Build Card and does not share a surface with a forbidden energy accent"},{"checkId":"DATAVIZ-05-B","method":"visual","criterion":"categories remain distinguishable at actual feed/print/dark sizes through labels/shapes/position as well as color; category-ID assignments do not change when filtered or sorted; no universal color-vision-accessibility claim is inferred from hue differences"}],
"sourceTextSha256":"7971a878627962235a61c3c9ffb61abbe8a52d3cab8efc78483d478f25b368fb",
"sourceRuleId":"DATAVIZ-05"
},
{
"id":"MAP-01",
"title":"Maps preserve geography and coverage truth",
"section":"capability-packs",
"normativeLevel":"MUST",
"scope":"map",
"requirement":"Map overlay MUST declare geography ID, boundary source, purpose, covered area, grain, time, unit, schema release, attribution/rights, projection เมื่อมีผล, หกสถานะของค่าตาม EVID-05 (`measured`, `measured_zero`, `no_data`, `out_of_scope`, `suppressed`, `not_yet`) รวมทั้ง low-confidence/selected/focus states และ nonspatial alternative Export records viewport/zoom/filters/data receipt It MUST NOT imply unsupported coverage, treat missing as zero or generalize product classification",
"acceptance":[{"checkId":"MAP-01-A","method":"automated","criterion":"fields/states/attribution/alternative/export receipt resolve; `dataStates` ครอบคลุม enum หกค่าของ EVID-05 ที่เกิดจริงในข้อมูล และ MapLegend แสดง state rows ที่มี"},{"checkId":"MAP-01-B","method":"manual","criterion":"boundary, context, legend, orientation, uncertainty and coverage remain truthful/readable"}],
"sourceTextSha256":"73d5301cd85d5bcd13e1376ad0a11eeb35186abe79a0cda76a1318a690dd6a88",
"sourceRuleId":"MAP-01"
},
{
"id":"WEBFMT-01",
"title":"Public web output remains semantic and resilient",
"section":"format-packs",
"normativeLevel":"MUST",
"scope":"web_public",
"requirement":"Public web MUST provide semantic initial HTML, responsive layout, keyboard/touch operation, no-script primary meaning, stable URLs, discoverability signals, share preview (square feed creative และ OG link preview 1200 × 630 ตาม SOCIALFMT-01), one approved icon set ตาม FAVICON-01, `<title>` ตาม pattern `[page] · [product]` และ production verification",
"acceptance":[{"checkId":"WEBFMT-01-A","method":"automated","criterion":"required rules pass supported viewport, locale, theme, no-script และ reduced-motion fixtures; icon set หกขนาด, web manifest, theme-color และ title pattern resolve (FAVICON-01-A); OG image resolve `target.social.og.1200x630.01` และ og:title/og:description ตรง template ของ SOCIALFMT-01"},{"checkId":"WEBFMT-01-B","method":"production","criterion":"deployed routes, assets, metadata, forms/actions และ monitoring receipts pass"}],
"sourceTextSha256":"36d1ae8713b4a9381a2262593272cb26fb3822204de418951667e09880ef939c",
"sourceRuleId":"WEBFMT-01"
},
{"id":"APPFMT-01","title":"Interactive product output exposes system state","section":"format-packs","normativeLevel":"MUST","scope":"app_interactive","requirement":"Interactive product MUST preserve task state, loading, success, empty, partial, stale, permission และ error meaning Navigation/actions direct, undoable เมื่อเหมาะ และ receipted เมื่อ consequential","acceptance":[{"checkId":"APPFMT-01-A","method":"interaction","criterion":"declared states understandable/operable ด้วย keyboard, touch และ assistive technology"},{"checkId":"APPFMT-01-B","method":"manual","criterion":"consequential action มี confirmation, progress, result, recovery และ receipt proportional to risk"}],"sourceTextSha256":"cc89d5ff8b3d8430d8666a0436545734394401b7f6434ce3ab552477be111bb1","sourceRuleId":"APPFMT-01"},
{"id":"DOCFMT-01","title":"Flowing documents preserve structure and working references","section":"format-packs","normativeLevel":"MUST","scope":"document_flow","requirement":"Flow document MUST ใช้ real heading hierarchy, readable pagination, working links, labelled figures/tables, source notes, accessible reading order, document properties และ version identity","acceptance":[{"checkId":"DOCFMT-01-A","method":"automated","criterion":"heading/list/table/figure/link/language/title/reading-order structure pass"},{"checkId":"DOCFMT-01-B","method":"visual","criterion":"no clipped content, accidental blanks, stranded headings หรือ unreadable notes"}],"sourceTextSha256":"caecb5fe6f8e7611e8cba6a43f9cd7b318a126a04e1388020fbb493dc6624fa2","sourceRuleId":"DOCFMT-01"},
{"id":"PDFFMT-01","title":"Fixed PDF preserves visual and semantic access","section":"format-packs","normativeLevel":"MUST","scope":"pdf_fixed","requirement":"PDF MUST preserve tagged reading order when required, bookmarks for long documents, selectable text where possible, embedded/approved fallback fonts, working links, alt text, page identity, evidence references และ print-safe contrast/margins","acceptance":[{"checkId":"PDFFMT-01-A","method":"automated","criterion":"metadata, pages, fonts, links, tags, bookmarks, extraction และ integrity pass as applicable"},{"checkId":"PDFFMT-01-B","method":"visual","criterion":"all pages inspected at screen/print size ไม่มี clipping, substitution, low contrast หรือ broken hierarchy"}],"sourceTextSha256":"30577cffd472cbcaa85f04eb5b5a89743094c06cbc2ff2097b09370ca7693b25","sourceRuleId":"PDFFMT-01"},
{"id":"DECKFMT-01","title":"Presentation decks express one idea per scene","section":"format-packs","normativeLevel":"MUST","scope":"deck_presentation","requirement":"Presentation MUST preserve one primary idea/reading path per slide, distance-legible sizing, section progress, source cues, speaker-independent key meaning, editable structure when required และ equivalent สำหรับ action/motion","acceptance":[{"checkId":"DECKFMT-01-A","method":"visual","criterion":"montage, distance legibility, overflow, contrast และ narrative continuity pass"},{"checkId":"DECKFMT-01-B","method":"automated","criterion":"titles, sources, links/QR, alt text, fonts และ hidden-slide state validate"}],"sourceTextSha256":"11ea0145ac338c549745d948754a7581822bb6c7057fc56807dca6cd819f9480","sourceRuleId":"DECKFMT-01"},
{
"id":"SOCIALFMT-01",
"title":"Social outputs are self-contained and destination-aware",
"section":"format-packs",
"normativeLevel":"MUST",
"scope":"social_static",
"requirement":"Static social ใน v0.9.7 MUST ใช้หนึ่งในสอง governed targets: `target.social.square.1080.01` ขนาด 1080 × 1080 สำหรับ feed post และ `target.social.og.1200x630.01` ขนาด 1200 × 630 สำหรับ link preview ที่ผูกกับ `publication.discovery.social` ของหน้า, communicate one approved message โดยไม่พึ่ง animation, preserve safe area, identify source/destination, use approved identity implementation และ legible at feed size Release นี้ยังไม่มี extension registry; social ratio/target อื่นนอกสองรายการนี้จึง unknown และ MUST block",
"acceptance":[{"checkId":"SOCIALFMT-01-A","method":"automated","criterion":"output resolve governed target หนึ่งรายการพอดี (square 1080 × 1080 1:1 หรือ og 1200 × 630 40:21); dimensions, format, size, color profile, safe-area และ metadata pass โดยไม่มี undeclared target/extension; OG creative มี recogniser ครบสามอย่างและ og:title ≤ 60 / og:description ≤ 155 ตาม template"},{"checkId":"SOCIALFMT-01-B","method":"visual","criterion":"square feed-size, center-crop และ safe-area fixtures (1080) และ text-safe 1000 × 560, central 630 square (LINE) และ 2:1 crop (X) fixtures (1200 × 630) preserve message, identity, evidence cue และ destination cue ≥ 22px; OCR + visual review ครอบคลุม OG image"}],
"sourceTextSha256":"2fdf4e9bcb5030f1bf39890ea3068ded191bfc17ffba615d2afa60e447e88d4b",
"sourceRuleId":"SOCIALFMT-01"
},
{
"id":"FORMAT-PARITY-01",
"title":"Meaning and action survive format translation",
"section":"format-packs",
"normativeLevel":"MUST",
"scope":"all",
"requirement":"Format translation MUST preserve content truth, hierarchy, evidence boundary, action outcome, locale status และ release identity พร้อมแทน unsupported interaction ด้วย governed static/structural equivalent; visual sameness ไม่ required",
"acceptance":[{"checkId":"FORMAT-PARITY-01-A","method":"automated","criterion":"equivalence map resolve identity, navigation, bookmark, CTA, motion, evidence และ receipt roles ที่ใช้ และทุก CTA destination binding ใช้ direct/static-equivalent presentation ตรง format"},{"checkId":"FORMAT-PARITY-01-B","method":"manual","criterion":"side-by-side review ไม่พบ claim scope, decision meaning, primary path หรือ action promise เปลี่ยน"},{"checkId":"FORMAT-PARITY-01-C","method":"automated","criterion":"triggered dataviz/map overlay resolves analytical, geographic, evidence, accessibility, fallback and export fields in host format"}],
"sourceTextSha256":"5752738f18411b65802412f493a2a1f64e6fdc1db892cb14a5b4bf944a1e8ebb",
"sourceRuleId":"FORMAT-PARITY-01"
},
{
"id":"COMPONENT-01",
"title":"Reusable components declare a complete semantic contract",
"section":"components",
"normativeLevel":"MUST",
"scope":"all",
"requirement":"Build Card `composition.componentIds` MUST inventory exact reusable component IDs ที่ implementation source ใช้ และ artifact-resolved implementation record `requirements.componentIds` MUST เท่ากับ inventory นี้พอดี ทุก ID ต้องมี machine-valid `componentContract` หนึ่งรายการพอดีสำหรับ selected `formatProfile`; cross-format parity ใช้ FORMAT-PARITY-01 และ format pack ไม่ใช่การใส่ `formatBehavior` หกรูปแบบลงใน resolved contract เดียว Visual similarity อย่างเดียวไม่เพียงพอให้ component ใช้แทนกัน ถ้า semantic intent, consequence หรือ evidence role ต่างกัน",
"acceptance":[{"checkId":"COMPONENT-01-A","method":"automated","criterion":"Build Card inventory, artifact-resolved implementation `componentIds` และ contract IDs เท่ากันพอดี ไม่มี duplicate/missing/extra; governing rules ของ contract เป็น subset ของ resolved rules; token refs resolve ไป exact governed token bytes และ fixture refs resolve ไป active acceptance/resolved-test set"},{"checkId":"COMPONENT-01-B","method":"manual","criterion":"rendered fixtures รักษา semantic intent, locale content, state, evidence/permission boundary, accessibility behavior และ static-format equivalent ตาม contract"}],
"sourceTextSha256":"a9ad6882a900b22e8bd295fcf53da11fd8fae5feaef44a4a91765fbb49c3d721",
"sourceRuleId":"COMPONENT-01"
},
{
"id":"MEDIA-01",
"title":"Media treatment follows semantic role",
"section":"components",
"normativeLevel":"MUST",
"scope":"all",
"requirement":"Crop, animation และ decorative treatment MUST gated ด้วย semantic role ของ asset Identity, evidence, maps, charts, UI captures และ provider content MUST fixed เว้นแต่ approved role อนุญาต transformation; alternative และ attribution MUST survive export",
"acceptance":[{"checkId":"MEDIA-01-A","method":"automated","criterion":"asset ทุกชิ้นมี governed role, source, rights, exact SHA-256, approval status, fallback และ text equivalent เมื่อ required; เฉพาะ `approvalStatus: approved` MUST มี `approvalReceiptRef` + `approvalReceiptSha256` ส่วน non-approved asset เป็น blocker และอยู่ได้เฉพาะ internal preview"},{"checkId":"MEDIA-01-B","method":"visual","criterion":"responsive/export crops รักษา evidence-bearing subject, identity geometry และ attribution"}],
"sourceTextSha256":"d429de3bbffbf49754df4fde6bb014cc032002552d2440764dc667be2bf114bf",
"sourceRuleId":"MEDIA-01"
},
{"id":"CAROUSEL-01","title":"Looping carousels keep one semantic cycle","section":"components","normativeLevel":"MUST","scope":"screen","requirement":"Loop carousel MUST มี semantic source cycle เดียว Visual clones MUST hidden from accessibility, inert, ไม่มี IDs/IDREF, non-focusable และไม่มี repeated meaningful alternative User controls MUST visible และ autoplay MUST off by default","acceptance":[{"checkId":"CAROUSEL-01-A","method":"automated","criterion":"clone audit ผ่าน aria-hidden/equivalent, inert, no duplicate IDs, no focus descendants และ no repeated alternatives"},{"checkId":"CAROUSEL-01-B","method":"interaction","criterion":"previous, next, focus, resize, touch, reduced-motion และ end-to-start preserve context"}],"sourceTextSha256":"169af7273e04c802fd13e8d2a42f1525455295d9ba66428daf2674d5d9eb3e6b","sourceRuleId":"CAROUSEL-01"},
{"id":"SOCIAL-FEED-01","title":"External feeds expose truthful states","section":"components","normativeLevel":"MUST","scope":"web_public,app_interactive","requirement":"External feed MUST declare idle, loading, loaded, empty, failed และ stale states ตาม applicable, รักษา provider boundary, โหลดหลัง primary content, มี direct fallback และใช้ recency wording เมื่อ freshness verified เท่านั้น","acceptance":[{"checkId":"SOCIAL-FEED-01-A","method":"interaction","criterion":"success, timeout, blocked provider, empty/stale response และ no-script มี truthful state/fallback"},{"checkId":"SOCIAL-FEED-01-B","method":"visual","criterion":"provider content ไม่ถูก invert/recolor จน meaning/identity เปลี่ยน"}],"sourceTextSha256":"93a786919266cf2bb3b72fca854303997163641235bb7ae8f1f89cfa990e1395","sourceRuleId":"SOCIAL-FEED-01"},
{"id":"QA-01","title":"Conformance is receipt-based","section":"quality","normativeLevel":"MUST","scope":"all","requirement":"Conformance MUST computed จาก applicable automated, manual, visual, interaction, accessibility และ production checks ที่มี dated receipts v0.9.7 ไม่รับ exception reference ใน artifact conformance: Build Card `qa.exceptionIds` และ Artifact Manifest `resolution.exceptionRefs` MUST เป็น `[]` ทั้งคู่","acceptance":[{"checkId":"QA-01-A","method":"automated","criterion":"applicable required check ทุกอันมี current passing receipt และไม่มี blocking failure"},{"checkId":"QA-01-B","method":"manual","criterion":"arrays ทั้งสองเป็นศูนย์และไม่มี MUST หรือ MUST NOT deviation ถูกนำเสนอว่า conforming; SHOULD recommendations are reported separately when useful"}],"sourceTextSha256":"e48cc91c082ebd7c6505cd3b1b7c88be1eddd366b90e7bbae135792428c5105d","sourceRuleId":"QA-01"},
{
"id":"RELEASE-01",
"title":"Release identifiers have one source",
"section":"release",
"normativeLevel":"MUST",
"scope":"all",
"requirement":"Release, schema, set, kit และ package identifiers MUST resolve จาก `machine.release` และ embedded contracts; published identities are immutable. Canonical schema `$id` MUST include the schema version and MUST NOT be reused for an incompatible contract. Generated artifacts MUST NOT contain conflicting current release identifiers. This document uses DS `0.9.7`, release `v0.9.7-owner.1`, color set `color-srgb-10` and document `standalone-0.9.7-r1`; document consolidation does not relabel historical signed subjects.",
"acceptance":[{"checkId":"RELEASE-01-A","method":"automated","criterion":"human master, embedded catalog/contracts, current tokens and artifact binding resolve the same release; unchanged schema `$id` identities remain exact and locally resolvable in the embedded schema collection"},{"checkId":"RELEASE-01-B","method":"manual","criterion":"provenance/change record identifies each consolidated rule, schema or value projection and its migration effect without claiming an unperformed approval or signature"}],
"sourceTextSha256":"00d2716c8573ae6e660a978ebdab60614fa86dc581fee3edea7731e8936e19b1",
"sourceRuleId":"RELEASE-01"
}
]
},
"tokens":{
"brand":{"blue":"#1D4497","beige":"#F2F1DF","logoCyan":"#0194CA","logoGray":"#757575","energy":{"sky":"#59D2FE","mint":"#0AD69C","coral":"#FF5A5F","yellow":"#FFBC1F"}},
"atmosphere":{
"registryId":"landometer-atmosphere-gradient-v2",
"gradientOnlyValues":["#89CEF6","#5ECAD6","#6CD5B3","#0F5773","#006A6A","#1F744F","#C4E0EE","#B2E2E2","#CCE6D0","#EB8182","#F5A06F","#EBC573","#F7CBC7","#FBD1B6","#F1E0B4"],
"recipes":{"atmosphere.gradient.measure.deep":"linear-gradient(135deg, #1D4497 0%, #176B82 54%, #08756F 100%)","atmosphere.gradient.measure.luminous":"linear-gradient(135deg, #89CEF6 0%, #5ECAD6 50%, #6CD5B3 100%)","atmosphere.gradient.ground.current":"linear-gradient(135deg, #0F5773 0%, #006A6A 50%, #1F744F 100%)","atmosphere.gradient.ground.mist":"linear-gradient(135deg, #C4E0EE 0%, #B2E2E2 50%, #CCE6D0 100%)","atmosphere.gradient.cultivate.glow":"linear-gradient(135deg, #EB8182 0%, #F5A06F 50%, #EBC573 100%)","atmosphere.gradient.cultivate.mist":"linear-gradient(135deg, #F7CBC7 0%, #FBD1B6 50%, #F1E0B4 100%)","atmosphere.gradient.diversity.spectrum":"linear-gradient(135deg, #89CEF6 0%, #6CD5B3 34%, #EBC573 67%, #EB8182 100%)"},
"surfaceAliases":{"surfaceAtmosphere.measure.light":"atmosphere.gradient.measure.deep","surfaceAtmosphere.measure.dark":"atmosphere.gradient.measure.luminous","surfaceAtmosphere.ground.light":"atmosphere.gradient.ground.mist","surfaceAtmosphere.ground.dark":"atmosphere.gradient.ground.current","surfaceAtmosphere.cultivate.light":"atmosphere.gradient.cultivate.glow","surfaceAtmosphere.cultivate.dark":"atmosphere.gradient.cultivate.mist","surfaceAtmosphere.diversity":"atmosphere.gradient.diversity.spectrum"},
"foreground":{"onDeep":{"primaryAndIcon":"#FFFFFF","secondaryAndMetadata":"#F1F4EF","meaningfulSeparator":"#F1F4EF","focusInner":"#182327","focusOuter":"#FFFFFF"},"onLight":{"primaryAndIcon":"#182327","secondaryAndMetadata":"#293337","meaningfulSeparator":"#182327","focusInner":"#FFFFFF","focusOuter":"#182327"}},
"constraints":{"oneDominantGradientPerViewport":true,"diversityMaximumPerLongRoute":1,"dataOrStateEncodingForbidden":true,"deletionTestRequired":true}
},
"foundation":{"surface.canvas":{"light":"#F6F7F3","dark":"#11191D"},"surface.alt":{"light":"#EEF1EE","dark":"#172126"},"surface.card":{"light":"#FCFCFA","dark":"#20292D"},"surface.raised":{"light":"#FFFFFF","dark":"#293337"},"surface.soft":{"light":"#E5E9E6","dark":"#2B3534"},"surface.blueTint":{"light":"#E2E9ED","dark":"#18333E"},"surface.beigeTint":{"light":"#F2F1DF","dark":"#2C2A22"},"text.primary":{"light":"#182327","dark":"#F1F4EF"},"text.secondary":{"light":"#5F635A","dark":"#C4CECA"},"text.metadata":{"light":"#5C6A61","dark":"#A6B5B1"},"text.muted":{"light":"#7B877D","dark":"#8D9D99"},"text.disabled":{"light":"#A7B3A9","dark":"#71817D"},"border.hairline":{"light":"#DCE1DD","dark":"#33403D"},"border.default":{"light":"#C9D0CB","dark":"#46524F"},"border.emphasis":{"light":"#7D877F","dark":"#7C8A84"},"interaction.accent":{"light":"#176B82","dark":"#68C4E2"},"interaction.focus.ring":{"light":"#176B82","dark":"#68C4E2"}},
"semanticState":{"success":{"light":{"surface":"#E2F4E5","content":"#126B49"},"dark":{"surface":"#17362D","content":"#72E8C4"}},"warning":{"light":{"surface":"#FFF1D1","content":"#A64A00"},"dark":{"surface":"#3B2E16","content":"#F5C15C"}},"danger":{"light":{"surface":"#FCE5DF","content":"#B43A3A"},"dark":{"surface":"#3A1F21","content":"#FF7C72"}},"info":{"light":{"surface":"#E8EEF0","content":"#176B82"},"dark":{"surface":"#18333E","content":"#68C4E2"}},"neutral":{"light":{"surface":"#ECE4D2","content":"#5F635A"},"dark":{"surface":"#2B3534","content":"#C4CECA"}},"pending":{"light":{"surface":"#F3EEDB","content":"#5C6A61"},"dark":{"surface":"#2C2A22","content":"#D8CFB2"}},"assisted":{"light":{"surface":"#DFF3F1","content":"#176C67"},"dark":{"surface":"#163331","content":"#79D9D1"}}},
"dataState":{
"noData":{"light":"#D5DAD6","dark":"#404844","cue":"diagonal-pattern-plus-label"},
"zero":{"light":"#7D877F","dark":"#93A398","cue":"distinct-outline-only-when-zero-is-a-fact"},
"valueStates":{
"rule":"EVID-05 as amended in DS0.9.5: six states, never collapse missing into zero",
"labelInk":"text.metadata",
"disabledHintOnly":"text.muted",
"labelPlacement":"legend or table cell, never on the no-data hatch fill (owner decision 15 September 2026)",
"states":[
{"id":"measured","th":"ค่าที่มีข้อมูล","en":"Measured value","glyph":null,"map":"appropriate analytical class with label and unit","table":"exact finite nonzero number with unit","requires":["unit","source","date","boundary","limitation"]},
{"id":"measured_zero","th":"ศูนย์ (สำรวจแล้ว)","en":"Zero (measured)","glyph":"0","map":"lowest class fill + --dataviz-zero-outline 2px","table":"numeric 0 with unit","requires":["unit","survey completeness"]},
{"id":"no_data","th":"ไม่มีข้อมูล","en":"No data","glyph":"—","map":"--data-no-data-pattern 135° hatch + --border-emphasis","table":"— + short reason, sorted last","requires":["reason","latest available value"]},
{"id":"out_of_scope","th":"นอกขอบเขตข้อมูล","en":"Out of scope","glyph":"นอกขอบเขต","map":"bare basemap (no fill, no hatch)","table":"text label","requires":["scope statement"]},
{"id":"suppressed","th":"ปิดค่า (n<5)","en":"Suppressed (n<5)","glyph":"‹5","map":"--surface-soft + dashed --border-emphasis","table":"‹5 + rule","requires":["threshold","aggregation level that unlocks"]},
{"id":"not_yet","th":"ยังไม่ถึงรอบข้อมูล","en":"Not yet available","glyph":"…","map":"--semantic-pending-fill + dotted --semantic-pending-ink","table":"… + expected date","requires":["expected date","source cadence"]}
],
"treatments":{"measured_zero":{"map":{"fill":"scale lowest class","outline":"dataState.zero","outlineWidthPx":2},"table":"numeric 0 with unit"},"no_data":{"map":{"fill":"dataState.noData","pattern":"135deg hatch","stroke":"border.emphasis"},"table":"— plus short reason; sorted last"},"out_of_scope":{"map":{"fill":"none (bare basemap)"},"table":"text label"},"suppressed":{"map":{"fill":"surface.soft","stroke":"border.emphasis","strokeStyle":"dashed"},"table":"‹n plus threshold"},"not_yet":{"map":{"fill":"semantic.pending.surface","stroke":"semantic.pending.content","strokeStyle":"dotted"},"table":"… plus expected date"}},
"agentContract":"Every governed numeric value carries measured (finite nonzero), measured_zero (0), or an exceptional state (null)."
}
},
"map":{"activeLayer":{"light":"#347DA8","dark":"#65B6DB"},"hoverStroke":{"light":"#347DA8","dark":"#65B6DB"},"selectedStroke":{"light":"#176B82","dark":"#68C4E2"},"focusStroke":{"light":"#176B82","dark":"#68C4E2"},"markerHalo":{"light":"#FFFFFF","dark":"#101318"},"markerStroke":{"light":"#182327","dark":"#F1F4EF"}},
"typography":{"families":{"displayLatin":"Arvo","displayThai":"IBM Plex Sans Thai Looped","body":"Bai Jamjuree","technicalLatin":"JetBrains Mono","technicalThai":"IBM Plex Sans Thai","symbols":"Material Symbols Rounded"},"weights":{"regular":400,"semibold":600,"display":700,"symbol":300},"sizes":{"caption":"0.75rem","label":"0.8125rem","bodySm":"0.875rem","body":"1rem","bodyLg":"1.125rem","h3":"clamp(1.35rem, 2vw, 1.75rem)","h2":"clamp(2rem, 4vw, 3.25rem)","h1Latin":"clamp(3.25rem, 7vw, 6.5rem)","h1Thai":"clamp(2.5rem, 6vw, 5rem)"},"thaiDisplayLineHeight":{"status":"size-and-script-fixture-required","deprecatedUniversalValue":1.16,"safeFallbackWhenUnvalidated":1.25}},
"icon":{
"family":"Material Symbols Rounded",
"axes":{"FILL":0,"wght":300,"GRAD":0},
"stateChannels":["semantic-surface","semantic-color","visible-label","outline-container"],
"prohibited":["FILL-1-selected-state","weight-change-by-state","identity-as-interface-icon","unapproved-glyph"],
"iconSet":{
"ruleId":"FAVICON-01",
"sizesPx":[16,32,48,180,192,512],
"roles":{"16":"favicon","32":"favicon","48":"favicon","180":"apple-touch","192":"manifest","512":"manifest-maskable"},
"cornerRadiusPercent":{"16":25,"32":25,"48":0,"180":0,"192":0,"512":0},
"maskableSafeZonePercent":80,
"byProperty":{"portfolio":"symbol on transparent (16/32/48/192); brand.beige tile (180/512)","product":"product identity-gradient tile with the symbol in that gradient's foreground contract (symbol-white on onDeep, symbol-color on onLight) — open until each product's gradient is approved"},
"portfolioSet":{
"id":"iconset.landometer.portfolio.symbol.01",
"approval":{"status":"owner_approved","decidedOn":"2026-09-15","evidenceRef":"owner-message:2026-09-15:0.9.3-answers"},
"sourceSymbolSha256":"b818eeb6a6f4abeb7a8fac2b858de0e7a03a662dff371842a29ebfe4c21d12f6",
"files":[
{"sizePx":16,"role":"favicon","file":"icon-portfolio-16.png","background":"transparent","sha256":"c100627d5e8fc9d21d168dbf15f9fdab7f5d6931b04df5164e58137df77feca8","bytes":768},
{"sizePx":32,"role":"favicon","file":"icon-portfolio-32.png","background":"transparent","sha256":"5cd19dee724f1a72b2bdcd41467a26e03f76a4bc2d7bd1fe12de6b8b5de665c9","bytes":1773},
{"sizePx":48,"role":"favicon","file":"icon-portfolio-48.png","background":"transparent","sha256":"443857069292f6910b9e5cc0383cab6da4273acf1e18a47745864729fc46e08e","bytes":2897},
{"sizePx":180,"role":"apple-touch","file":"icon-portfolio-180.png","background":"brand.beige #F2F1DF","sha256":"41ac1e302345d29d791fcc26a5e7111aeb3a4e222dff63685743b43d0fdd6ef0","bytes":8893},
{"sizePx":192,"role":"manifest","file":"icon-portfolio-192.png","background":"transparent","sha256":"1d8bbd3d8656a83f33c51364d333bba7ca328faf3ae713238fa9450f7810bf8e","bytes":11929},
{"sizePx":512,"role":"manifest-maskable","file":"icon-portfolio-512.png","background":"brand.beige #F2F1DF","sha256":"d8939f6cc7891c47bbb3dce1ddb04d4c30ce4c7e78e29f6fb0061858dafc881f","bytes":28124}
]
},
"neverChangesPerPage":true,
"neverSignalsStatus":true,
"titlePattern":{"form":"[page] · [product]","maxCharacters":60,"order":"page first"},
"missingIconSetIs":"WEBFMT-01 blocker",
"registry":"asset-registry.json#/iconSets"
}
},
"control":{"discreteTargetMinCssPx":44,"textOrIconLabelButton":{"shape":"capsule","minHeightCssPx":44,"paddingInlineCssPx":24,"gapCssPx":8,"borderCssPx":2,"radiusRef":"layout.radiusPx.pill"},"iconOnlyButton":{"shape":"circle","widthCssPx":44,"heightCssPx":44,"borderCssPx":2,"accessibleNameRequired":true},"inlineTextLink":{"forcedInto44Box":false,"usesTextLinkExceptionAndSpacingBranch":true}},
"theme":{"interactiveModes":["auto","light","dark"],"autoSource":"prefers-color-scheme-unless-explicit-user-choice","explicitChoiceReversible":true,"meaningParityRequired":true,"forcedColorCheckRequired":true,"staticExportRequiresFixedDeclaredTheme":true},
"layout":{"spacingPx":[0,4,8,12,16,24,32,48,64,96,128],"radiusPx":{"xs":6,"sm":10,"md":16,"lg":24,"xl":32,"pill":999},"containerPx":{"reading":760,"default":1120,"wide":1280},"gutterPx":[16,24,32],"breakpointPx":{"xs":360,"sm":600,"md":900,"lg":1200,"xl":1600},"directTargetMinCssPx":{"width":44,"height":44}},
"motion":{
"feedback":{"durationMs":120,"distancePx":2},
"state":{"durationMs":200,"easing":"cubic-bezier(.2,0,0,1)"},
"map":{"durationMs":280},
"chart":{"durationMs":360},
"approach":{"mode":"browser_observer","opacityDurationMs":760,"transformDurationMs":920,"mediaDurationMs":900,"blockDistancePx":32,"inlineDistancePx":36,"scaleFrom":0.985,"staggerStepMs":150,"staggerCapMs":450,"staggerBeatCount":4,"staggerDelayFormula":"min(zeroBasedSiblingIndex,3)*150ms","opacityEasing":"cubic-bezier(.16,1,.3,1)","transformEasing":"cubic-bezier(.2,.9,.25,1.08)","pressEasing":"cubic-bezier(.3,0,.6,1)","observerThreshold":0.14,"observerRootMargin":"0px 0px -12% 0px","observersPerDocumentRoot":1,"onceOnlyUnobserve":false,"initializationWatchdogMs":2400,"reachedContentFailsafeFrames":2,"prePaintArmingRequiresNormalMotionAndObserver":true,"finalHiddenFinalFlashForbidden":true,"reentryBehavior":"replay_on_reentry_while_visible","cycleWhileStill":false,"repetitionAuthority":"OWNER-MOTION-01 (2026-09-11) — replaces once-only; cycle length unchanged; owner confirmed the reveal-on-re-entry interpretation on 2026-09-15"},
"ctaDiscoveryCue":{"recipeId":"motion.cta.discovery-cue.01","eligibleRole":"primary_navigational_cta","requiredUserBenefit":"discoverability","trigger":"first_visible_entry","repeatCountPerPageLoad":1,"reentryBehavior":"do_not_repeat","durationMs":540,"durationCeilingMs":600,"delayMs":0,"easing":"cubic-bezier(.16,1,.3,1)","geometry":{"kind":"inline_highlight_sweep","startPercent":-120,"endPercent":120,"bandWidthPercent":28},"contentOpacityMinimum":1,"layoutGeometryStable":true,"pointerEvents":"none","reducedMotion":"no_cue_final_state","observerFailure":"no_cue_final_state","staticEquivalent":"emphasis_without_motion","repetitionNote":"once per page load (owner confirmed 2026-09-15): the cue is motion over the primary action, which MOTION-04 / MOTIF-04 prohibit as ambience"},
"reducedMotion":"render-final-state-remove-nonessential-spatial-motion",
"identity":{
"recipeId":"motion.identity.logo-assembly.01",
"ruleId":"MOTION-04",
"component":"component.motif-frame.01",
"runtime":{"family":"landometer.motif.v3","element":"lm-motif","kind":"logo","motifRelease":"1.2.1","repository":"https://github.com/montri-th/motif","repositoryCommit":"a99f3c1e0250da91c7f13af8fe3ab8ad03b73e82","js":{"assetId":"landometer.motif.runtime.js.v3","path":"assets/landometer/landometer-motifs.js","sha256":"3a5caef7918a85885b61dd53e049ea8bf2b0a3cea508f587bb14970bfe6deaf2","bytes":17845},"css":{"assetId":"landometer.motif.runtime.css.v3","path":"assets/landometer/landometer-motifs.css","sha256":"7cc2deb475a8d6e4af331407b2b4b741716c458a8ce885e2fb2859374b93912e","bytes":11190},"manifest":{"path":"assets/motif-library.json","sha256":"77e8185104751e2c21c2e10fb8c5d771821bcb8123e02f116638fdbf3968d483"},"bytesEditable":false},
"finalStateFallback":{"full":{"assetId":"landometer.logo.full","path":"assets/landometer/svg/logo-full.svg","sha256":"90e9543f2f86a18f891331c13be25038b4334ca7dbe55b194650bc441e3558e1","bytes":1252},"quiet":{"assetId":"landometer.logo.quiet","path":"assets/landometer/svg/logo-quiet.svg","sha256":"5b6798cdb6c3ada246286e6ce3386644f383c4f987a267e5c5db392809403e14","bytes":1979}},
"wedge":{"derivation":"color-mix(in lch, energy.sky 48%, brand.blue)","browserSrgbReference":"#1F87CE","sampledHexForbidden":true},
"identityFileDeltasAccepted":{"decidedOn":"2026-09-15","wedge":{"officialPng":"#0195CB","motifV3":"#1F87CE"},"pin":{"officialPng":"#1E4497","motifV3Token":"#1D4497"},"radiusDeltaMax":"0.6%","disposition":"accepted_and_recorded; official PNG files remain the identity of record"},
"hostInkForThemeInvariantPreview":"blue",
"authoredEndMs":{"full":2870,"quiet":3360},
"settleAtMs":3400,
"cycleMs":6000,
"minimumCycleMs":2000,
"observer":{"threshold":0.14,"rootMargin":"0px 0px -8% 0px","onEnter":"play immediately then repeat every cycle","onExit":"clear the timer and hold the final state"},
"technique":"repeated finite plays; animation-iteration-count: infinite is forbidden",
"pageControl":"one page-level pause/resume control (MotionController); pause shows the complete final state",
"reducedMotion":"final state, no cycle",
"noJavaScript":"final-state SVG",
"print":"final-state SVG",
"stateBoundMotifsUnchanged":true,
"prohibited":["hue cycling","shape distortion","motion carrying evidence or meaning","motion over the first answer, the primary proof or the primary action","motifs in navigation, favicon or OG images"],
"scope":["web_public","app_interactive.browser","document_flow, pdf_fixed and deck_presentation only when rendered in a browser"],
"staticFormats":"final state only"
},
"motifs":{
"ruleIds":["MOTIF-01","MOTIF-02","MOTIF-03","MOTIF-04","MOTIF-05","MOTIF-06"],
"family":"landometer.motif.v3",
"component":"component.motif-frame.01",
"runtime":{"js":{"assetId":"landometer.motif.runtime.js.v3","path":"assets/landometer/landometer-motifs.js","sha256":"3a5caef7918a85885b61dd53e049ea8bf2b0a3cea508f587bb14970bfe6deaf2","bytes":17845},"css":{"assetId":"landometer.motif.runtime.css.v3","path":"assets/landometer/landometer-motifs.css","sha256":"7cc2deb475a8d6e4af331407b2b4b741716c458a8ce885e2fb2859374b93912e","bytes":11190},"manifest":{"path":"assets/motif-library.json","sha256":"77e8185104751e2c21c2e10fb8c5d771821bcb8123e02f116638fdbf3968d483"},"release":"1.2.1","repositoryCommit":"a99f3c1e0250da91c7f13af8fe3ab8ad03b73e82"},
"jobRegistry":["orientation","opening","spatial_transition","section_orientation","layering","quiet_divider","action_closure","cultural_closure","handoff","animated_brand_opening"],
"beats":{"INTENT":"opening","AHA":"transition","NEXT_ACTION":"closing"},
"beatKinds":{"opening":["logo","dial"],"transition":["rings","layers"],"closing":["slice","cultivate"]},
"kinds":{
"dial":{
"beat":"opening",
"allowedJobs":["orientation","opening"],
"prohibitedJobs":["data_encoding","evidence","measured_state","loading_state","official_navigation_identity","favicon","co_brand_lockup"],
"allowedFormats":["web_public","deck_16x9","document_pdf","video_owner_extension"],
"variants":{"full":{"assetId":"landometer.dial.full","path":"assets/landometer/svg/dial-full.svg","sha256":"7ecfd1165a3e7ad25a0bb01b9680c35f71ff8a98edfd411dfe1b712cee12654d","bytes":674},"quiet":{"assetId":"landometer.dial.quiet","path":"assets/landometer/svg/dial-quiet.svg","sha256":"2e624d80b604891ad2ed3e4d5cc6268d2383f39f740ef1def5012c49aee0da1f","bytes":733}},
"cycleMs":3000,
"authoredEndMs":null,
"allowedCarriers":{"full":["brand.beige","surface.alt@light","surface.beigeTint@light","surface.blueTint@light","surface.canvas@light","surface.card@light","surface.raised@light","surface.soft@light"],"quiet":["atmosphere.ground.current","atmosphere.measure.deep","brand.blue","surface.alt@dark","surface.beigeTint@dark","surface.blueTint@dark","surface.canvas@dark","surface.card@dark","surface.raised@dark","surface.soft@dark"]}
},
"rings":{
"beat":"transition",
"allowedJobs":["spatial_transition","section_orientation"],
"prohibitedJobs":["data_encoding","evidence","measured_state","loading_state","official_navigation_identity","favicon","co_brand_lockup"],
"allowedFormats":["web_public","deck_16x9","document_pdf","video_owner_extension"],
"variants":{"full":{"assetId":"landometer.rings.full","path":"assets/landometer/svg/rings-full.svg","sha256":"b50ec8fa3828ee5b3504ff05e0c47c1ae55f6b644225482454ec319809552286","bytes":552},"quiet":{"assetId":"landometer.rings.quiet","path":"assets/landometer/svg/rings-quiet.svg","sha256":"d494be1f72e833704cd3c20d9d41f60599991d6efd5f670a86e40a7296eb566b","bytes":833}},
"cycleMs":3000,
"authoredEndMs":null,
"allowedCarriers":{"full":["brand.beige","surface.alt@light","surface.beigeTint@light","surface.blueTint@light","surface.canvas@light","surface.card@light","surface.raised@light","surface.soft@light"],"quiet":["atmosphere.ground.current","atmosphere.measure.deep","brand.blue","surface.alt@dark","surface.beigeTint@dark","surface.blueTint@dark","surface.canvas@dark","surface.card@dark","surface.raised@dark","surface.soft@dark"]}
},
"layers":{"beat":"transition","allowedJobs":["layering","quiet_divider"],"prohibitedJobs":["data_encoding","evidence","measured_state","loading_state","official_navigation_identity","favicon","co_brand_lockup"],"allowedFormats":["web_public","deck_16x9","document_pdf","video_owner_extension"],"variants":{"full":{"assetId":"landometer.layers.full","path":"assets/landometer/svg/layers-full.svg","sha256":"a94a59a342df39591f490deec960bba2263bc1c453620c557ff84a1c47901843","bytes":741},"quiet":{"assetId":"landometer.layers.quiet","path":"assets/landometer/svg/layers-quiet.svg","sha256":"e3e2bf65bcd38d34d0a07910bef44917eab76fdaf097131ec133d163f6a65a03","bytes":1274}},"cycleMs":3000,"authoredEndMs":null,"allowedCarriers":{"full":["surface.canvas@light","surface.card@light","surface.raised@light"],"quiet":["brand.blue","surface.alt@dark","surface.beigeTint@dark","surface.blueTint@dark","surface.canvas@dark","surface.card@dark","surface.raised@dark","surface.soft@dark"]}},
"slice":{
"beat":"closing",
"allowedJobs":["action_closure"],
"prohibitedJobs":["data_encoding","evidence","measured_state","loading_state","official_navigation_identity","favicon","co_brand_lockup"],
"allowedFormats":["web_public","deck_16x9","document_pdf","video_owner_extension"],
"variants":{"full":{"assetId":"landometer.slice.full","path":"assets/landometer/svg/slice-full.svg","sha256":"8d0dfb62d1ac92738afcd76e8b61b544a5c72bf10b165983235900558447b2df","bytes":280},"quiet":{"assetId":"landometer.slice.quiet","path":"assets/landometer/svg/slice-quiet.svg","sha256":"c72114d43b81584cbb46251a5519f768087259bf135216f6ea7933a83df4de6b","bytes":350}},
"cycleMs":3000,
"authoredEndMs":null,
"allowedCarriers":{"full":["brand.beige","surface.alt@light","surface.beigeTint@light","surface.blueTint@light","surface.canvas@light","surface.card@light","surface.raised@light","surface.soft@light"],"quiet":["atmosphere.ground.current","atmosphere.measure.deep","brand.blue","surface.alt@dark","surface.beigeTint@dark","surface.blueTint@dark","surface.canvas@dark","surface.card@dark","surface.raised@dark","surface.soft@dark"]}
},
"cultivate":{
"beat":"closing",
"allowedJobs":["cultural_closure","handoff"],
"prohibitedJobs":["data_encoding","evidence","measured_state","loading_state","official_navigation_identity","favicon","co_brand_lockup"],
"allowedFormats":["web_public","deck_16x9","document_pdf","video_owner_extension"],
"variants":{"full":{"assetId":"landometer.cultivate.full","path":"assets/landometer/svg/cultivate-full.svg","sha256":"ce494d792c12d73949a3dc8e6d18f6f93faa6aeab33d18b2de0889ab4af5af12","bytes":984},"quiet":{"assetId":"landometer.cultivate.quiet","path":"assets/landometer/svg/cultivate-quiet.svg","sha256":"edf8538107d30b078f0d7657bac054722ee88bdc10ddf7db00e63f44d077935f","bytes":1190}},
"cycleMs":3000,
"authoredEndMs":null,
"allowedCarriers":{"full":["brand.beige","surface.alt@light","surface.beigeTint@light","surface.blueTint@light","surface.canvas@light","surface.card@light","surface.raised@light","surface.soft@light"],"quiet":["atmosphere.ground.current","atmosphere.measure.deep","brand.blue","surface.alt@dark","surface.beigeTint@dark","surface.blueTint@dark","surface.canvas@dark","surface.card@dark","surface.raised@dark","surface.soft@dark"]}
},
"logo":{
"beat":"opening",
"allowedJobs":["animated_brand_opening"],
"prohibitedJobs":["data_encoding","evidence","measured_state","loading_state","official_navigation_identity","favicon","co_brand_lockup"],
"allowedFormats":["web_public","deck_16x9","document_pdf","video_owner_extension"],
"variants":{"full":{"assetId":"landometer.logo.full","path":"assets/landometer/svg/logo-full.svg","sha256":"90e9543f2f86a18f891331c13be25038b4334ca7dbe55b194650bc441e3558e1","bytes":1252},"quiet":{"assetId":"landometer.logo.quiet","path":"assets/landometer/svg/logo-quiet.svg","sha256":"5b6798cdb6c3ada246286e6ce3386644f383c4f987a267e5c5db392809403e14","bytes":1979}},
"cycleMs":6000,
"authoredEndMs":{"full":2870,"quiet":3360},
"allowedCarriers":{"full":["brand.beige","surface.alt@light","surface.beigeTint@light","surface.blueTint@light","surface.canvas@light","surface.card@light","surface.raised@light","surface.soft@light"],"quiet":["atmosphere.ground.current","atmosphere.measure.deep","brand.blue","surface.alt@dark","surface.beigeTint@dark","surface.blueTint@dark","surface.canvas@dark","surface.card@dark","surface.raised@dark","surface.soft@dark"]}
}
},
"defaultReplayIntervalMs":3000,
"minimumCycleMs":2000,
"runDurationMs":[1200,3400],
"vocabulary":{"allowed":["drop with squash and stretch","pop-overshoot placement","four-beat stagger 0/150/300/450 ms","step-out-and-return finale","hop (product stings)"],"forbidden":["hue cycling","identity morphing","geometry distortion","parallax","unbounded ambient loops","scale overshoot beyond 1.16"]},
"joyBudget":{"perLongRoute":3,"perTaskSurface":1,"forbiddenRegions":["first_answer","primary_proof","primary_action"],"buildCardField":"motionMoments[] (beat + kind + job)"},
"prohibitedJobsVerbatimFromManifest":["data_encoding","evidence","measured_state","loading_state","official_navigation_identity","favicon","co_brand_lockup"],
"carrierPolicy":{
"ruleId":"MOTIF-06",
"decision":{"decidedOn":"2026-09-16","evidenceRef":"owner-message:2026-09-16:motif-carrier-answers"},
"registerRef":"motif-register.v0.9.7.json#/carrierPolicy",
"tool":"measure-motif-carriers-0.9.4.mjs",
"shapeIntactMin":1.3,
"bands":{"meaningCapableMin":3,"decorativeOnlyMin":1.3,"invisibleMax":1.29},
"placement":{"full":{"carrierClasses":["light_plain"],"ink":"blue","inkNote":"runtime renditions keep the governed light-reference ink: <lm-motif ink=\"blue\">"},"quiet":{"carrierClasses":["deep_plain","deep_atmosphere"],"ink":"sky","inkNote":"runtime default quiet ink (energy.sky); no other ink value has a governed file"}},
"carrierClasses":{"light_plain":["brand.beige","surface.alt@light","surface.beigeTint@light","surface.blueTint@light","surface.canvas@light","surface.card@light","surface.raised@light","surface.soft@light"],"deep_plain":["brand.blue","surface.alt@dark","surface.beigeTint@dark","surface.blueTint@dark","surface.canvas@dark","surface.card@dark","surface.raised@dark","surface.soft@dark"],"light_atmosphere":["atmosphere.ground.mist","atmosphere.measure.luminous"],"deep_atmosphere":["atmosphere.ground.current","atmosphere.measure.deep"]},
"neverFull":["brand.blue","every atmosphere gradient","every dark surface"],
"neverQuiet":["every light surface","light atmospheres (ground.mist, measure.luminous)"],
"declaration":"data-host-surface on every MotifFrame and static motif placement: a carrier id (themed ids resolve per theme), a theme-fixed form <id>@light|@dark, or an invariant id",
"themeSwap":"data-variant is the light-theme variant; data-variant-dark=\"quiet\" switches a full frame on a themed surface to quiet in the dark theme — the only swap the measured policy admits",
"fixOrder":["change the carrier","change the variant","change the size or spacing","remove the motif"],
"neverOnTheAsset":["recolour","plate or tile under the mark","scrim over a gradient","new tint","opacity carrying meaning"]
}
},
"productOverlays":{"ruleId":"MOTIF-05","register":"motif-register.v0.9.7.json","principle":"product animated identities are separately registered overlays with their own final fallback, duration, minimum size and host surface; families are never mixed in one lockup; navigation, favicon and OG images use official identity files","ownerApproval":{"decidedOn":"2026-09-15","evidenceRef":"owner-message:2026-09-15:0.9.3-answers","scope":"ijji.logo-sting.r3, ijji.four-beat.selected-3.r3, CityChat conversation set (current montri-th/motif bytes), CityMETER and CityWiki stings pre-approved pending Studio 1.4 production"}},
"repetition":{"authority":"OWNER-MOTION-01","decidedOn":"2026-09-11","rank":"above_design_system_all_versions","appliesTo":"decorative and identity motion (motif runtime, approach reveal on re-entry); not the CTA discovery cue","minimumCycleMs":2000,"infiniteIterationForbidden":true,"pageLevelPauseRequired":true}
},
"constraints":{"colorAloneForbidden":true,"visualSamenessAcrossFormatsRequired":false,"semanticParityAcrossFormatsRequired":true,"motionMayHideEssentialContent":false,"interfaceIconFillMayChangeByState":false,"candidateMaySelfPromote":false,"publicWorkflowResidueAllowed":false,"unresolvedDependencyBehavior":"block_or_internal_preview","darkAnchorsHandEditedForbidden":true,"forbiddenHueWindows":"machine.policy.analytical.bannedHue","brandBlueFilledButtonsForbidden":true,"colourValuesOutsideApprovedRegistryForbidden":true,"runtimeDarkAnchorDerivationForbidden":true,"runtimeAnalyticalInterpolationForbidden":true,"approvedThemeLutRequired":true,"analyticalLightDarkHexIdentical":true,"analyticalDirectionInvariantAcrossThemes":true,"pinkAllowedOutsideVioletWindow":true},
"socialPreview":{"targets":{"feed":"target.social.square.1080.01","linkPreview":"target.social.og.1200x630.01"},"recognisers":{"fourColourRulePx":8,"panel":"brand.blue or one declared atmosphere recipe","measureLine":"3×5px","identityMaxHeightPx":56},"safeAreas":{"textPx":[1000,560],"centralSquarePx":630,"cropTolerant":"2:1"},"destinationCueMinPx":22,"metadata":{"ogTitle":"[object] [period/scope] · [product] ≤ 60","ogDescription":"[what you will see] · [source · date] · [limitation] ≤ 155","post":"observation / question the reader can answer / verb + destination"},"forbidden":["exclamation marks","click now","emoji","unitless numbers"],"motifsForbidden":true},
"evidenceCard":{"fourColourRulePx":3,"measureLinePx":3,"logo":"none","panel":"none","gradient":"none","motion":"none","required":["TrustBadge","value + unit + state","dataset","source","date","boundary","limitation","permanent URL","receipt id"],"textOnlyFallback":"one line","valueStateContractRef":"evidence-value.schema.json"},
"schemaVersion":"13-owner.1",
"releaseRef":"v0.9.7-owner.1",
"status":"owner-approved-unsigned",
"sets":{"color":"color-srgb-10","motion":"motion-riddim-approach-03","icon":"icon-rounded-outline-01","typography":"type-script-aware-02","layout":"layout-cross-format-01"},
"projection":{"registry":"color-srgb-10.tokens.json","scales":"color-srgb-10.scales.json","productionCss":"color-srgb-10.production.css","policy":"policy.json","rawRegistryAudienceEmission":"forbidden"},
"categoricalSeries":{
"registryId":"landometer-series-10-v8",
"values":[
{"id":"series.01","name":"coral","cue":"circle","light":{"fill":"#D88381","ink":"#963538","vivid":"#F66C6D"},"dark":{"fill":"#E37A84","vivid":"#FF4F6D","ink":"#FF4F6D"}},
{"id":"series.02","name":"apricot","cue":"square","light":{"fill":"#E39B6E","ink":"#182327","vivid":"#FF8A36"},"dark":{"fill":"#F59B62","vivid":"#FF8A37","ink":"#FF8A37"}},
{"id":"series.03","name":"yellow","cue":"triangle","light":{"fill":"#EAC578","ink":"#182327","vivid":"#FDC010"},"dark":{"fill":"#ECCB67","vivid":"#FFD242","ink":"#FFD242"}},
{"id":"series.04","name":"lime","cue":"diamond","light":{"fill":"#BECE7E","ink":"#606E00","vivid":"#BBD23C"},"dark":{"fill":"#A9C065","vivid":"#A9CB00","ink":"#A9CB00"}},
{"id":"series.05","name":"mint","cue":"cross","light":{"fill":"#7BD0A3","ink":"#007047","vivid":"#2ADB94"},"dark":{"fill":"#6EC69D","vivid":"#00E39D","ink":"#00E39D"}},
{"id":"series.06","name":"sky","cue":"star","light":{"fill":"#6ACCF0","ink":"#006580","vivid":"#36D0FF"},"dark":{"fill":"#62BEE6","vivid":"#54CDFF","ink":"#54CDFF"}},
{"id":"series.07","name":"teal","cue":"hexagon","light":{"fill":"#49C0BC","ink":"#006967","vivid":"#00C4BF"},"dark":{"fill":"#2DA096","vivid":"#00B6AB","ink":"#00B6AB"}},
{"id":"series.08","name":"blue","cue":"ring","light":{"fill":"#6196D1","ink":"#0E599D","vivid":"#3295F6"},"dark":{"fill":"#5A8CDA","vivid":"#5396FF","ink":"#5396FF"}},
{"id":"series.09","name":"slate","cue":"dash","light":{"fill":"#8AA4AA","ink":"#355F6A","vivid":"#7FA6B0"},"dark":{"fill":"#BFD4E7","vivid":"#C0DBF4","ink":"#C0DBF4"}},
{"id":"series.10","name":"green","cue":"plus","light":{"fill":"#82AC79","ink":"#34622A","vivid":"#71B262"},"dark":{"fill":"#5B9455","vivid":"#3CA633","ink":"#3CA633"}}
],
"defaultVariant":"soft",
"variants":["soft","vivid"],
"policyRef":"policy.json#/categorical"
},
"analyticalScales":{
"activity":{"kind":"sequential","light":["#F1F5E5","#60C9AD","#25659A"],"dark":["#F1F5E5","#60C9AD","#25659A"],"use":"activity, transactions, usage","lutRef":"color-srgb-10.scales.json","sampleCount":41},
"density.area":{"kind":"sequential","light":["#FFF1D9","#E6AB30","#D6600C"],"dark":["#FFF1D9","#E6AB30","#D6600C"],"use":"per km², per rai (denominator = area)","lutRef":"color-srgb-10.scales.json","sampleCount":41},
"heat":{"kind":"sequential","light":["#FFF6CF","#F5B323","#C72D10"],"dark":["#FFF6CF","#F5B323","#C72D10"],"use":"surface temperature, hotspots, fire","lutRef":"color-srgb-10.scales.json","sampleCount":41},
"risk":{"kind":"sequential","light":["#FFF0E5","#F27642","#A40822"],"dark":["#FFF0E5","#F27642","#A40822"],"use":"risk level, hazard probability","lutRef":"color-srgb-10.scales.json","sampleCount":41},
"price":{"kind":"sequential","light":["#F4F4DD","#74C4C2","#216D58"],"dark":["#F4F4DD","#74C4C2","#216D58"],"use":"appraisal, rent, revenue, registered capital","lutRef":"color-srgb-10.scales.json","sampleCount":41},
"age":{"kind":"sequential","light":["#F5F0DF","#9DBACB","#526832"],"dark":["#F5F0DF","#9DBACB","#526832"],"use":"building age, business age","lutRef":"color-srgb-10.scales.json","sampleCount":41},
"density.household":{"kind":"sequential","light":["#FFF2E4","#EF84A3","#DF491F"],"dark":["#FFF2E4","#EF84A3","#DF491F"],"use":"per 100 households (denominator = household · Living)","lutRef":"color-srgb-10.scales.json","sampleCount":41},
"growth":{"kind":"sequential","light":["#EEF5E5","#B2C75B","#2B702F"],"dark":["#EEF5E5","#B2C75B","#2B702F"],"use":"cumulative index, growth rate","lutRef":"color-srgb-10.scales.json","sampleCount":41},
"confidence":{"kind":"sequential","light":["#EEF4EB","#66AEDF","#236A5E"],"dark":["#EEF4EB","#66AEDF","#236A5E"],"use":"estimate confidence, data quality","lutRef":"color-srgb-10.scales.json","sampleCount":41},
"count":{"kind":"sequential","light":["#F4F0E7","#7DBAC0","#213E70"],"dark":["#F4F0E7","#7DBAC0","#213E70"],"use":"population, number of firms, vehicles (totals)","lutRef":"color-srgb-10.scales.json","sampleCount":41},
"water":{"kind":"sequential","light":["#EEF7FC","#3DBBCD","#073E78"],"dark":["#EEF7FC","#3DBBCD","#073E78"],"use":"water level, depth, flood frequency","lutRef":"color-srgb-10.scales.json","sampleCount":41},
"density.capita":{"kind":"sequential","light":["#FFF0ED","#F3A076","#B72B63"],"dark":["#FFF0ED","#F3A076","#B72B63"],"use":"per 1,000 people (denominator = people)","lutRef":"color-srgb-10.scales.json","sampleCount":41},
"built":{"kind":"sequential","light":["#FFF5D8","#F3BC93","#BFA000"],"dark":["#FFF5D8","#F3BC93","#BFA000"],"use":"building footprint, height, coverage","lutRef":"color-srgb-10.scales.json","sampleCount":41},
"duration":{"kind":"sequential","light":["#EEF2F5","#98B1A4","#33433E"],"dark":["#EEF2F5","#98B1A4","#33433E"],"use":"travel time, waiting time, inundation duration","lutRef":"color-srgb-10.scales.json","sampleCount":41},
"balance":{"kind":"diverging","light":["#CF5148","#F1F3EC","#3B87BF"],"dark":["#CF5148","#F1F3EC","#3B87BF"],"use":"deficit ↔ surplus","lutRef":"color-srgb-10.scales.json","sampleCount":41},
"delta":{"kind":"diverging","light":["#CF5420","#F1F3EC","#3C9278"],"dark":["#CF5420","#F1F3EC","#3C9278"],"use":"decrease ↔ increase vs previous period","lutRef":"color-srgb-10.scales.json","sampleCount":41},
"tradeoff":{"kind":"diverging","light":["#B79900","#F1F3EC","#739CDE"],"dark":["#B79900","#F1F3EC","#739CDE"],"use":"cost ↔ benefit","lutRef":"color-srgb-10.scales.json","sampleCount":41},
"flow":{"kind":"diverging","light":["#C95368","#F1F3EC","#2E9095"],"dark":["#C95368","#F1F3EC","#2E9095"],"use":"out-migration ↔ in-migration · closures ↔ openings","lutRef":"color-srgb-10.scales.json","sampleCount":41},
"sentiment":{"kind":"diverging","light":["#C95170","#F1F3EC","#49944D"],"dark":["#C95170","#F1F3EC","#49944D"],"use":"negative ↔ positive","lutRef":"color-srgb-10.scales.json","sampleCount":41},
"anomaly":{"kind":"diverging","light":["#4084C7","#F1F3EC","#D44C3A"],"dark":["#4084C7","#F1F3EC","#D44C3A"],"use":"below normal (cool/dry) ↔ above normal (hot/wet)","lutRef":"color-srgb-10.scales.json","sampleCount":41}
},
"supportingPalette":{
"name":"Story",
"themeInvariant":true,
"values":[
{"id":"paper","name":"Paper / กระดาษ","hex":"#F4F0E7","role":"Quiet editorial ground"},
{"id":"navy","name":"Editorial navy / น้ำเงินหมึก","hex":"#213E70","role":"Deep typographic weight"},
{"id":"blue","name":"Active blue / ฟ้ากิจกรรม","hex":"#25659A","role":"Focused cool accent"},
{"id":"cyan","name":"Water cyan / ฟ้าน้ำ","hex":"#3DBBCD","role":"Clear aquatic accent"},
{"id":"mint","name":"Exchange mint / มิ้นต์","hex":"#60C9AD","role":"Energetic exchange"},
{"id":"leaf","name":"Leaf / ใบไม้","hex":"#2B702F","role":"Organic depth"},
{"id":"gold","name":"Built gold / ทอง","hex":"#BFA000","role":"Warm structural accent"},
{"id":"coral","name":"Signal coral / คอรัล","hex":"#F27642","role":"Focused warm signal"},
{"id":"rose","name":"People rose / กุหลาบ","hex":"#B72B63","role":"Warm human-scale accent"},
{"id":"red","name":"Risk red / แดงความเสี่ยง","hex":"#A40822","role":"Urgent evidence-bound emphasis"},
{"id":"teal","name":"Teal / ทีล","hex":"#278E94","role":"Supporting editorial accent; assignment requires a named context, not automatic metric meaning."},
{"id":"amber","name":"Amber / อำพัน","hex":"#DDA527","role":"Supporting editorial accent; assignment requires a named context, not automatic metric meaning."},
{"id":"azure","name":"Azure / ฟ้า","hex":"#4B8FD8","role":"Supporting editorial accent; assignment requires a named context, not automatic metric meaning."},
{"id":"lime-leaf","name":"Lime leaf / เขียวอ่อน","hex":"#92B847","role":"Supporting editorial accent; assignment requires a named context, not automatic metric meaning."},
{"id":"scarlet","name":"Scarlet / แดงส้ม","hex":"#E45244","role":"Supporting editorial accent; assignment requires a named context, not automatic metric meaning."},
{"id":"orange","name":"Orange / ส้ม","hex":"#D6600C","role":"Supporting editorial accent; assignment requires a named context, not automatic metric meaning."},
{"id":"pine","name":"Pine / เขียวสน","hex":"#216D58","role":"Supporting editorial accent; assignment requires a named context, not automatic metric meaning."}
]
}
},
"colorRegistry":{
"schemaVersion":"lds-colors-0.9.7-1",
"releaseRef":"v0.9.7-owner.1",
"colorSetId":"color-srgb-10",
"scope":"implementation registry; avoid embedding full raw registry in audience UI",
"values":{
"brand":{"blue":"#1D4497","beige":"#F2F1DF","darkBeige":"#D8CFB2"},
"energy":{"sky":"#59D2FE","mint":"#0AD69C","coral":"#FF5A5F","yellow":"#FFBC1F"},
"foundation":{"surface.canvas":["#F6F7F3","#11191D"],"surface.alt":["#EEF1EE","#172126"],"surface.card":["#FCFCFA","#20292D"],"surface.raised":["#FFFFFF","#293337"],"surface.soft":["#E5E9E6","#2B3534"],"surface.blueTint":["#E2E9ED","#18333E"],"surface.beigeTint":["#F2F1DF","#2C2A22"],"text.primary":["#182327","#F1F4EF"],"text.secondary":["#5F635A","#C4CECA"],"text.metadata":["#5C6A61","#A6B5B1"],"text.muted":["#7B877D","#8D9D99"],"text.disabled":["#A7B3A9","#71817D"],"border.hairline":["#DCE1DD","#33403D"],"border.default":["#C9D0CB","#46524F"],"border.emphasis":["#7D877F","#7C8A84"],"interaction.accent":["#176B82","#68C4E2"],"interaction.focus.ring":["#176B82","#68C4E2"]},
"semantic":{"success":{"light":["#E2F4E5","#126B49"],"dark":["#17362D","#72E8C4"]},"warning":{"light":["#FFF1D1","#A64A00"],"dark":["#3B2E16","#F5C15C"]},"danger":{"light":["#FCE5DF","#B43A3A"],"dark":["#3A1F21","#FF7C72"]},"info":{"light":["#E8EEF0","#176B82"],"dark":["#18333E","#68C4E2"]},"neutral":{"light":["#ECE4D2","#5F635A"],"dark":["#2B3534","#C4CECA"]},"pending":{"light":["#F3EEDB","#5C6A61"],"dark":["#2C2A22","#D8CFB2"]},"assisted":{"light":["#DFF3F1","#176C67"],"dark":["#163331","#79D9D1"]}},
"signature":{"closingLight":"linear-gradient(135deg, #1D4497 0%, #176B82 54%, #08756F 100%)","closingDark":"linear-gradient(135deg, #68C4E2 0%, #15919A 52%, #08756F 100%)"},
"product":{"citymeter":{"light":["#12669B","#36BCE4"],"dark":["#4C99D5","#59C7E8"]},"citywiki":{"light":["#176B82","#007E79"],"dark":["#59C7E8","#3BD3CB"]},"citychat":{"light":["#007A58","#007E79"],"dark":["#3BD19B","#3BD3CB"]}},
"dataState":{"noData":{"light":"#D5DAD6","dark":"#404844","cue":"diagonal pattern + label"},"zero":{"light":"#7D877F","dark":"#93A398","cue":"distinct outline only when zero is a fact"}},
"map":{"activeLayer":["#347DA8","#65B6DB"],"hoverStroke":["#347DA8","#65B6DB"],"selectedStroke":["#176B82","#68C4E2"],"focusStroke":["#176B82","#68C4E2"],"markerHalo":["#FFFFFF","#101318"],"markerStroke":["#182327","#F1F4EF"]},
"type":{"caption":".75rem","label":".8125rem","bodySm":".875rem","body":"1rem","bodyLg":"1.125rem","h3":"clamp(1.35rem, 2vw, 1.75rem)","h2":"clamp(2rem, 4vw, 3.25rem)","h1En":"clamp(3.25rem, 7vw, 6.5rem)","h1Th":"clamp(2.5rem, 6vw, 5rem)"},
"spacing":[0,4,8,12,16,24,32,48,64,96,128],
"radius":{"xs":6,"sm":10,"md":16,"lg":24,"xl":32,"pill":999},
"container":{"reading":760,"default":1120,"wide":1280},
"breakpoint":{"xs":360,"sm":600,"md":900,"lg":1200,"xl":1600},
"motion":{"durationFeedback":120,"durationState":200,"durationMap":280,"durationChart":360,"durationReveal":640,"durationEmphasis":560,"delayStagger":120,"delayStaggerCap":600,"distanceFeedback":2,"distanceReveal":20,"easeState":"cubic-bezier(.2,0,0,1)","easeEnter":"cubic-bezier(.16,1,.3,1)"},
"series":{
"registryId":"landometer-series-10-v8",
"values":[
{"id":"series.01","name":"coral","cue":"circle","light":{"fill":"#D88381","ink":"#963538","vivid":"#F66C6D"},"dark":{"fill":"#E37A84","vivid":"#FF4F6D","ink":"#FF4F6D"}},
{"id":"series.02","name":"apricot","cue":"square","light":{"fill":"#E39B6E","ink":"#182327","vivid":"#FF8A36"},"dark":{"fill":"#F59B62","vivid":"#FF8A37","ink":"#FF8A37"}},
{"id":"series.03","name":"yellow","cue":"triangle","light":{"fill":"#EAC578","ink":"#182327","vivid":"#FDC010"},"dark":{"fill":"#ECCB67","vivid":"#FFD242","ink":"#FFD242"}},
{"id":"series.04","name":"lime","cue":"diamond","light":{"fill":"#BECE7E","ink":"#606E00","vivid":"#BBD23C"},"dark":{"fill":"#A9C065","vivid":"#A9CB00","ink":"#A9CB00"}},
{"id":"series.05","name":"mint","cue":"cross","light":{"fill":"#7BD0A3","ink":"#007047","vivid":"#2ADB94"},"dark":{"fill":"#6EC69D","vivid":"#00E39D","ink":"#00E39D"}},
{"id":"series.06","name":"sky","cue":"star","light":{"fill":"#6ACCF0","ink":"#006580","vivid":"#36D0FF"},"dark":{"fill":"#62BEE6","vivid":"#54CDFF","ink":"#54CDFF"}},
{"id":"series.07","name":"teal","cue":"hexagon","light":{"fill":"#49C0BC","ink":"#006967","vivid":"#00C4BF"},"dark":{"fill":"#2DA096","vivid":"#00B6AB","ink":"#00B6AB"}},
{"id":"series.08","name":"blue","cue":"ring","light":{"fill":"#6196D1","ink":"#0E599D","vivid":"#3295F6"},"dark":{"fill":"#5A8CDA","vivid":"#5396FF","ink":"#5396FF"}},
{"id":"series.09","name":"slate","cue":"dash","light":{"fill":"#8AA4AA","ink":"#355F6A","vivid":"#7FA6B0"},"dark":{"fill":"#BFD4E7","vivid":"#C0DBF4","ink":"#C0DBF4"}},
{"id":"series.10","name":"green","cue":"plus","light":{"fill":"#82AC79","ink":"#34622A","vivid":"#71B262"},"dark":{"fill":"#5B9455","vivid":"#3CA633","ink":"#3CA633"}}
],
"defaultVariant":"soft",
"variants":["soft","vivid"],
"policyRef":"policy.json#/categorical"
},
"atmosphere":{
"registryId":"landometer-atmosphere-gradient-v2",
"gradientOnlyValues":["#89CEF6","#5ECAD6","#6CD5B3","#0F5773","#006A6A","#1F744F","#C4E0EE","#B2E2E2","#CCE6D0","#EB8182","#F5A06F","#EBC573","#F7CBC7","#FBD1B6","#F1E0B4"],
"recipes":{"atmosphere.gradient.measure.deep":"linear-gradient(135deg, #1D4497 0%, #176B82 54%, #08756F 100%)","atmosphere.gradient.measure.luminous":"linear-gradient(135deg, #89CEF6 0%, #5ECAD6 50%, #6CD5B3 100%)","atmosphere.gradient.ground.current":"linear-gradient(135deg, #0F5773 0%, #006A6A 50%, #1F744F 100%)","atmosphere.gradient.ground.mist":"linear-gradient(135deg, #C4E0EE 0%, #B2E2E2 50%, #CCE6D0 100%)","atmosphere.gradient.cultivate.glow":"linear-gradient(135deg, #EB8182 0%, #F5A06F 50%, #EBC573 100%)","atmosphere.gradient.cultivate.mist":"linear-gradient(135deg, #F7CBC7 0%, #FBD1B6 50%, #F1E0B4 100%)","atmosphere.gradient.diversity.spectrum":"linear-gradient(135deg, #89CEF6 0%, #6CD5B3 34%, #EBC573 67%, #EB8182 100%)"},
"surfaceAliases":{"surfaceAtmosphere.measure.light":"atmosphere.gradient.measure.deep","surfaceAtmosphere.measure.dark":"atmosphere.gradient.measure.luminous","surfaceAtmosphere.ground.light":"atmosphere.gradient.ground.mist","surfaceAtmosphere.ground.dark":"atmosphere.gradient.ground.current","surfaceAtmosphere.cultivate.light":"atmosphere.gradient.cultivate.glow","surfaceAtmosphere.cultivate.dark":"atmosphere.gradient.cultivate.mist","surfaceAtmosphere.diversity":"atmosphere.gradient.diversity.spectrum"},
"foreground":{"onDeep":{"primaryAndIcon":"#FFFFFF","secondaryAndMetadata":"#F1F4EF","meaningfulSeparator":"#F1F4EF","focusInner":"#182327","focusOuter":"#FFFFFF"},"onLight":{"primaryAndIcon":"#182327","secondaryAndMetadata":"#293337","meaningfulSeparator":"#182327","focusInner":"#FFFFFF","focusOuter":"#182327"}},
"constraints":{"oneDominantGradientPerViewport":true,"diversityMaximumPerLongRoute":1,"dataOrStateEncodingForbidden":true,"deletionTestRequired":true}
},
"scaleRegistry":"color-srgb-10.scales.json",
"supportingPalette":[
{"id":"paper","name":"Paper / กระดาษ","hex":"#F4F0E7","role":"Quiet editorial ground"},
{"id":"navy","name":"Editorial navy / น้ำเงินหมึก","hex":"#213E70","role":"Deep typographic weight"},
{"id":"blue","name":"Active blue / ฟ้ากิจกรรม","hex":"#25659A","role":"Focused cool accent"},
{"id":"cyan","name":"Water cyan / ฟ้าน้ำ","hex":"#3DBBCD","role":"Clear aquatic accent"},
{"id":"mint","name":"Exchange mint / มิ้นต์","hex":"#60C9AD","role":"Energetic exchange"},
{"id":"leaf","name":"Leaf / ใบไม้","hex":"#2B702F","role":"Organic depth"},
{"id":"gold","name":"Built gold / ทอง","hex":"#BFA000","role":"Warm structural accent"},
{"id":"coral","name":"Signal coral / คอรัล","hex":"#F27642","role":"Focused warm signal"},
{"id":"rose","name":"People rose / กุหลาบ","hex":"#B72B63","role":"Warm human-scale accent"},
{"id":"red","name":"Risk red / แดงความเสี่ยง","hex":"#A40822","role":"Urgent evidence-bound emphasis"},
{"id":"teal","name":"Teal / ทีล","hex":"#278E94","role":"Supporting editorial accent; assignment requires a named context, not automatic metric meaning."},
{"id":"amber","name":"Amber / อำพัน","hex":"#DDA527","role":"Supporting editorial accent; assignment requires a named context, not automatic metric meaning."},
{"id":"azure","name":"Azure / ฟ้า","hex":"#4B8FD8","role":"Supporting editorial accent; assignment requires a named context, not automatic metric meaning."},
{"id":"lime-leaf","name":"Lime leaf / เขียวอ่อน","hex":"#92B847","role":"Supporting editorial accent; assignment requires a named context, not automatic metric meaning."},
{"id":"scarlet","name":"Scarlet / แดงส้ม","hex":"#E45244","role":"Supporting editorial accent; assignment requires a named context, not automatic metric meaning."},
{"id":"orange","name":"Orange / ส้ม","hex":"#D6600C","role":"Supporting editorial accent; assignment requires a named context, not automatic metric meaning."},
{"id":"pine","name":"Pine / เขียวสน","hex":"#216D58","role":"Supporting editorial accent; assignment requires a named context, not automatic metric meaning."}
]
}
},
"analyticalScales":{
"schemaVersion":"lds-scales-0.9.7-1",
"releaseRef":"v0.9.7-owner.1",
"colorSetId":"color-srgb-10",
"records":40,
"families":{"sequential":14,"diverging":6},
"lutSteps":41,
"sourceSnapshotSha256":"a1f8d12b7efb4f782f04c19057cd95d424143b12c86c5c5991bd91b01e37ccb0",
"approvedStorySourceSha256":"be696bc8f41520f85167678634407838ac5ed5c9bb9a802585146b0b2f36415f",
"themePolicy":{"required":true,"sourceTheme":"light","anchorsEqual":true,"lutEqual":true,"classesEqual":true,"valueDirectionEqual":true,"darkDerivationForbidden":true,"contrastRemedy":"Keep data HEX; use labels, meaningful boundaries or a neutral backplate. Test actual surfaces and sizes. No automatic 3:1, CVD or full accessibility claim."},
"scales":[
{
"scaleId":"activity",
"kind":"sequential",
"theme":"light",
"label":"กิจกรรม",
"meaning":"ปริมาณกิจกรรมในช่วงเวลาที่กำหนด",
"unitExample":"ดัชนีกิจกรรมตัวอย่าง",
"use":"activity, transactions, usage",
"directionLabel":"mint / energetic blue",
"designNote":"Move activity out of the hazard/heat lane. A higher-chroma mint middle suggests active exchange; a clear blue end carries magnitude. This adopts a cool-zone reassignment, not a claim that activity is good. Same approved light colors and value direction on both themes; use readable labels, boundaries or a neutral backplate without recoloring the data.",
"anchors":["#F1F5E5","#60C9AD","#25659A"],
"knots":null,
"positions":[0,20,40],
"interpolation":"none at consumption; exact approved 41-sample sRGB lookup table",
"lut":["#F1F5E5","#EAF3E2","#E4F1DF","#DDEFDC","#D7ECDA","#D0EAD7","#C9E8D4","#C3E6D1","#BCE4CE","#B5E2CB","#AEDFC9","#A7DDC6","#A0DBC3","#99D9C0","#91D7BD","#8AD4BB","#82D2B8","#7AD0B5","#72CEB2","#69CBB0","#60C9AD","#5DC4AC","#59BFAC","#56BAAB","#53B5AB","#4FB0AA","#4CABA9","#49A6A8","#46A1A7","#439CA7","#4097A6","#3D92A5","#3A8DA4","#3788A3","#3483A1","#317EA0","#2F799F","#2C749E","#2A6F9D","#276A9B","#25659A"],
"classes":{"3":["#F1F5E5","#60C9AD","#25659A"],"5":["#F1F5E5","#AEDFC9","#60C9AD","#4097A6","#25659A"],"7":["#F1F5E5","#C3E6D1","#99D9C0","#60C9AD","#49A6A8","#3788A3","#25659A"],"9":["#F1F5E5","#D0EAD7","#AEDFC9","#8AD4BB","#60C9AD","#4FB0AA","#4097A6","#317EA0","#25659A"]},
"canvas":"#F6F7F3",
"noData":"#D5DAD6",
"zeroOutline":"#7D877F",
"classificationMethod":"consumer supplied with exact thresholds and unit",
"outlierPolicy":"explicit; never silently clamp",
"scaleVersion":"b1cf83edb8a7a0ad787c032feae9d65fa3a1674daf419412c7e6db78cddfb485",
"themePolicy":"identical-light-values-on-both-themes"
},
{
"scaleId":"activity",
"kind":"sequential",
"theme":"dark",
"label":"กิจกรรม",
"meaning":"ปริมาณกิจกรรมในช่วงเวลาที่กำหนด",
"unitExample":"ดัชนีกิจกรรมตัวอย่าง",
"use":"activity, transactions, usage",
"directionLabel":"mint / energetic blue",
"designNote":"Move activity out of the hazard/heat lane. A higher-chroma mint middle suggests active exchange; a clear blue end carries magnitude. This adopts a cool-zone reassignment, not a claim that activity is good. Same approved light colors and value direction on both themes; use readable labels, boundaries or a neutral backplate without recoloring the data.",
"anchors":["#F1F5E5","#60C9AD","#25659A"],
"knots":null,
"positions":[0,20,40],
"interpolation":"none at consumption; exact approved 41-sample sRGB lookup table",
"lut":["#F1F5E5","#EAF3E2","#E4F1DF","#DDEFDC","#D7ECDA","#D0EAD7","#C9E8D4","#C3E6D1","#BCE4CE","#B5E2CB","#AEDFC9","#A7DDC6","#A0DBC3","#99D9C0","#91D7BD","#8AD4BB","#82D2B8","#7AD0B5","#72CEB2","#69CBB0","#60C9AD","#5DC4AC","#59BFAC","#56BAAB","#53B5AB","#4FB0AA","#4CABA9","#49A6A8","#46A1A7","#439CA7","#4097A6","#3D92A5","#3A8DA4","#3788A3","#3483A1","#317EA0","#2F799F","#2C749E","#2A6F9D","#276A9B","#25659A"],
"classes":{"3":["#F1F5E5","#60C9AD","#25659A"],"5":["#F1F5E5","#AEDFC9","#60C9AD","#4097A6","#25659A"],"7":["#F1F5E5","#C3E6D1","#99D9C0","#60C9AD","#49A6A8","#3788A3","#25659A"],"9":["#F1F5E5","#D0EAD7","#AEDFC9","#8AD4BB","#60C9AD","#4FB0AA","#4097A6","#317EA0","#25659A"]},
"canvas":"#11191D",
"noData":"#3B4849",
"zeroOutline":"#BAC6C0",
"classificationMethod":"consumer supplied with exact thresholds and unit",
"outlierPolicy":"explicit; never silently clamp",
"scaleVersion":"b1cf83edb8a7a0ad787c032feae9d65fa3a1674daf419412c7e6db78cddfb485",
"themePolicy":"identical-light-values-on-both-themes"
},
{
"scaleId":"density.area",
"kind":"sequential",
"theme":"light",
"label":"ความหนาแน่นต่อพื้นที่",
"meaning":"จำนวนต่อหน่วยพื้นที่ ต้องระบุหน่วยพื้นที่",
"unitExample":"แห่ง / ตร.กม.",
"use":"per km², per rai (denominator = area)",
"directionLabel":"gold / orange",
"designNote":"Land-area denominator stays orange. The golden middle and clean orange high avoid borrowing the urgent red reserved for risk. Always state km², rai or the actual area denominator. Same approved light colors and value direction on both themes; use readable labels, boundaries or a neutral backplate without recoloring the data.",
"anchors":["#FFF1D9","#E6AB30","#D6600C"],
"knots":null,
"positions":[0,20,40],
"interpolation":"none at consumption; exact approved 41-sample sRGB lookup table",
"lut":["#FFF1D9","#FEEED2","#FDEACA","#FCE7C3","#FAE3BC","#F9E0B5","#F8DCAD","#F7D9A6","#F6D59E","#F4D297","#F3CF8F","#F2CB87","#F1C87F","#EFC477","#EEC06F","#EDBD66","#EBB95D","#EAB653","#E9B249","#E7AF3D","#E6AB30","#E5A72E","#E5A42D","#E4A02B","#E49D2A","#E39928","#E29526","#E29225","#E18E23","#E08A21","#DF8720","#DF831E","#DE7F1C","#DD7B1A","#DC7818","#DB7417","#DA7015","#D96C13","#D86811","#D7640E","#D6600C"],
"classes":{"3":["#FFF1D9","#E6AB30","#D6600C"],"5":["#FFF1D9","#F3CF8F","#E6AB30","#DF8720","#D6600C"],"7":["#FFF1D9","#F7D9A6","#EFC477","#E6AB30","#E29225","#DD7B1A","#D6600C"],"9":["#FFF1D9","#F9E0B5","#F3CF8F","#EDBD66","#E6AB30","#E39928","#DF8720","#DB7417","#D6600C"]},
"canvas":"#F6F7F3",
"noData":"#D5DAD6",
"zeroOutline":"#7D877F",
"classificationMethod":"consumer supplied with exact thresholds and unit",
"outlierPolicy":"explicit; never silently clamp",
"scaleVersion":"554812a7c19107b3a9b8658ba541fc8e13519cb19708e885a425f32d5b30f101",
"themePolicy":"identical-light-values-on-both-themes"
},
{
"scaleId":"density.area",
"kind":"sequential",
"theme":"dark",
"label":"ความหนาแน่นต่อพื้นที่",
"meaning":"จำนวนต่อหน่วยพื้นที่ ต้องระบุหน่วยพื้นที่",
"unitExample":"แห่ง / ตร.กม.",
"use":"per km², per rai (denominator = area)",
"directionLabel":"gold / orange",
"designNote":"Land-area denominator stays orange. The golden middle and clean orange high avoid borrowing the urgent red reserved for risk. Always state km², rai or the actual area denominator. Same approved light colors and value direction on both themes; use readable labels, boundaries or a neutral backplate without recoloring the data.",
"anchors":["#FFF1D9","#E6AB30","#D6600C"],
"knots":null,
"positions":[0,20,40],
"interpolation":"none at consumption; exact approved 41-sample sRGB lookup table",
"lut":["#FFF1D9","#FEEED2","#FDEACA","#FCE7C3","#FAE3BC","#F9E0B5","#F8DCAD","#F7D9A6","#F6D59E","#F4D297","#F3CF8F","#F2CB87","#F1C87F","#EFC477","#EEC06F","#EDBD66","#EBB95D","#EAB653","#E9B249","#E7AF3D","#E6AB30","#E5A72E","#E5A42D","#E4A02B","#E49D2A","#E39928","#E29526","#E29225","#E18E23","#E08A21","#DF8720","#DF831E","#DE7F1C","#DD7B1A","#DC7818","#DB7417","#DA7015","#D96C13","#D86811","#D7640E","#D6600C"],
"classes":{"3":["#FFF1D9","#E6AB30","#D6600C"],"5":["#FFF1D9","#F3CF8F","#E6AB30","#DF8720","#D6600C"],"7":["#FFF1D9","#F7D9A6","#EFC477","#E6AB30","#E29225","#DD7B1A","#D6600C"],"9":["#FFF1D9","#F9E0B5","#F3CF8F","#EDBD66","#E6AB30","#E39928","#DF8720","#DB7417","#D6600C"]},
"canvas":"#11191D",
"noData":"#3B4849",
"zeroOutline":"#BAC6C0",
"classificationMethod":"consumer supplied with exact thresholds and unit",
"outlierPolicy":"explicit; never silently clamp",
"scaleVersion":"554812a7c19107b3a9b8658ba541fc8e13519cb19708e885a425f32d5b30f101",
"themePolicy":"identical-light-values-on-both-themes"
},
{
"scaleId":"heat",
"kind":"sequential",
"theme":"light",
"label":"ความร้อน",
"meaning":"ระดับความร้อนตามหน่วยที่กำหนด",
"unitExample":"°C ตัวอย่าง",
"use":"surface temperature, hotspots, fire",
"directionLabel":"yellow / vermilion",
"designNote":"Sunlit yellow turns through orange to vermilion on both light and dark surfaces, with decreasing lightness as temperature increases. Temperature units and thresholds remain necessary; hue is not a warning classification. Same approved light colors and value direction on both themes; use readable labels, boundaries or a neutral backplate without recoloring the data.",
"anchors":["#FFF6CF","#F5B323","#C72D10"],
"knots":null,
"positions":[0,20,40],
"interpolation":"none at consumption; exact approved 41-sample sRGB lookup table",
"lut":["#FFF6CF","#FFF3C8","#FEF0C1","#FEECBA","#FEE9B3","#FDE6AC","#FDE2A5","#FCDF9E","#FCDC97","#FCD88F","#FBD588","#FBD280","#FACE78","#F9CB70","#F9C868","#F8C45F","#F8C156","#F7BD4C","#F6BA41","#F6B634","#F5B323","#F3AD22","#F1A721","#EFA120","#EE9B1F","#EC951E","#E98F1D","#E7891C","#E5821B","#E37C1A","#E17619","#DE7018","#DC6917","#DA6316","#D75C16","#D55515","#D24E14","#CF4713","#CD3F12","#CA3611","#C72D10"],
"classes":{"3":["#FFF6CF","#F5B323","#C72D10"],"5":["#FFF6CF","#FBD588","#F5B323","#E17619","#C72D10"],"7":["#FFF6CF","#FCDF9E","#F9CB70","#F5B323","#E7891C","#DA6316","#C72D10"],"9":["#FFF6CF","#FDE6AC","#FBD588","#F8C45F","#F5B323","#EC951E","#E17619","#D55515","#C72D10"]},
"canvas":"#F6F7F3",
"noData":"#D5DAD6",
"zeroOutline":"#7D877F",
"classificationMethod":"consumer supplied with exact thresholds and unit",
"outlierPolicy":"explicit; never silently clamp",
"scaleVersion":"c86da61ba8d2b9fc1e032c12a5cd4699676ba73aa289caa5cc25ea452fc6a5fc",
"themePolicy":"identical-light-values-on-both-themes"
},
{
"scaleId":"heat",
"kind":"sequential",
"theme":"dark",
"label":"ความร้อน",
"meaning":"ระดับความร้อนตามหน่วยที่กำหนด",
"unitExample":"°C ตัวอย่าง",
"use":"surface temperature, hotspots, fire",
"directionLabel":"yellow / vermilion",
"designNote":"Sunlit yellow turns through orange to vermilion on both light and dark surfaces, with decreasing lightness as temperature increases. Temperature units and thresholds remain necessary; hue is not a warning classification. Same approved light colors and value direction on both themes; use readable labels, boundaries or a neutral backplate without recoloring the data.",
"anchors":["#FFF6CF","#F5B323","#C72D10"],
"knots":null,
"positions":[0,20,40],
"interpolation":"none at consumption; exact approved 41-sample sRGB lookup table",
"lut":["#FFF6CF","#FFF3C8","#FEF0C1","#FEECBA","#FEE9B3","#FDE6AC","#FDE2A5","#FCDF9E","#FCDC97","#FCD88F","#FBD588","#FBD280","#FACE78","#F9CB70","#F9C868","#F8C45F","#F8C156","#F7BD4C","#F6BA41","#F6B634","#F5B323","#F3AD22","#F1A721","#EFA120","#EE9B1F","#EC951E","#E98F1D","#E7891C","#E5821B","#E37C1A","#E17619","#DE7018","#DC6917","#DA6316","#D75C16","#D55515","#D24E14","#CF4713","#CD3F12","#CA3611","#C72D10"],
"classes":{"3":["#FFF6CF","#F5B323","#C72D10"],"5":["#FFF6CF","#FBD588","#F5B323","#E17619","#C72D10"],"7":["#FFF6CF","#FCDF9E","#F9CB70","#F5B323","#E7891C","#DA6316","#C72D10"],"9":["#FFF6CF","#FDE6AC","#FBD588","#F8C45F","#F5B323","#EC951E","#E17619","#D55515","#C72D10"]},
"canvas":"#11191D",
"noData":"#3B4849",
"zeroOutline":"#BAC6C0",
"classificationMethod":"consumer supplied with exact thresholds and unit",
"outlierPolicy":"explicit; never silently clamp",
"scaleVersion":"c86da61ba8d2b9fc1e032c12a5cd4699676ba73aa289caa5cc25ea452fc6a5fc",
"themePolicy":"identical-light-values-on-both-themes"
},
{
"scaleId":"risk",
"kind":"sequential",
"theme":"light",
"label":"ระดับความเสี่ยง",
"meaning":"ใช้กับดัชนีความเสี่ยงที่มีหลักฐานและวิธีวัด",
"unitExample":"ดัชนีตัวอย่าง ไม่ใช่การประเมินพื้นที่จริง",
"use":"risk level, hazard probability",
"directionLabel":"coral orange / clean red",
"designNote":"Evidence-backed risk receives a coral-orange middle and clean red high on both themes; no wine, muddy brown or cheerful pink detour. Severity requires labelled thresholds, a distinct warning symbol and text. The unchanged high color needs actual-surface contrast review on dark backgrounds. Same approved light colors and value direction on both themes; use readable labels, boundaries or a neutral backplate without recoloring the data.",
"anchors":["#FFF0E5","#F27642","#A40822"],
"knots":null,
"positions":[0,20,40],
"interpolation":"none at consumption; exact approved 41-sample sRGB lookup table",
"lut":["#FFF0E5","#FFEADD","#FFE4D6","#FFDFCE","#FFD9C6","#FFD3BE","#FFCDB6","#FEC7AE","#FEC1A6","#FDBB9E","#FDB596","#FCAF8F","#FBA987","#FAA37F","#F99D76","#F8966E","#F79066","#F68A5D","#F58355","#F37D4C","#F27642","#EE7140","#EA6D3F","#E6683D","#E2643B","#DF5F3A","#DB5B38","#D75636","#D35135","#CF4D33","#CB4832","#C74330","#C33E2E","#BF392D","#BB342B","#B82E2A","#B42928","#B02227","#AC1B25","#A81324","#A40822"],
"classes":{"3":["#FFF0E5","#F27642","#A40822"],"5":["#FFF0E5","#FDB596","#F27642","#CB4832","#A40822"],"7":["#FFF0E5","#FEC7AE","#FAA37F","#F27642","#D75636","#BF392D","#A40822"],"9":["#FFF0E5","#FFD3BE","#FDB596","#F8966E","#F27642","#DF5F3A","#CB4832","#B82E2A","#A40822"]},
"canvas":"#F6F7F3",
"noData":"#D5DAD6",
"zeroOutline":"#7D877F",
"classificationMethod":"consumer supplied with exact thresholds and unit",
"outlierPolicy":"explicit; never silently clamp",
"scaleVersion":"c1430bb4611a58b1f2f6589cfd4f8ea707ae4e038365ad93e6cdbf9c2da44889",
"themePolicy":"identical-light-values-on-both-themes"
},
{
"scaleId":"risk",
"kind":"sequential",
"theme":"dark",
"label":"ระดับความเสี่ยง",
"meaning":"ใช้กับดัชนีความเสี่ยงที่มีหลักฐานและวิธีวัด",
"unitExample":"ดัชนีตัวอย่าง ไม่ใช่การประเมินพื้นที่จริง",
"use":"risk level, hazard probability",
"directionLabel":"coral orange / clean red",
"designNote":"Evidence-backed risk receives a coral-orange middle and clean red high on both themes; no wine, muddy brown or cheerful pink detour. Severity requires labelled thresholds, a distinct warning symbol and text. The unchanged high color needs actual-surface contrast review on dark backgrounds. Same approved light colors and value direction on both themes; use readable labels, boundaries or a neutral backplate without recoloring the data.",
"anchors":["#FFF0E5","#F27642","#A40822"],
"knots":null,
"positions":[0,20,40],
"interpolation":"none at consumption; exact approved 41-sample sRGB lookup table",
"lut":["#FFF0E5","#FFEADD","#FFE4D6","#FFDFCE","#FFD9C6","#FFD3BE","#FFCDB6","#FEC7AE","#FEC1A6","#FDBB9E","#FDB596","#FCAF8F","#FBA987","#FAA37F","#F99D76","#F8966E","#F79066","#F68A5D","#F58355","#F37D4C","#F27642","#EE7140","#EA6D3F","#E6683D","#E2643B","#DF5F3A","#DB5B38","#D75636","#D35135","#CF4D33","#CB4832","#C74330","#C33E2E","#BF392D","#BB342B","#B82E2A","#B42928","#B02227","#AC1B25","#A81324","#A40822"],
"classes":{"3":["#FFF0E5","#F27642","#A40822"],"5":["#FFF0E5","#FDB596","#F27642","#CB4832","#A40822"],"7":["#FFF0E5","#FEC7AE","#FAA37F","#F27642","#D75636","#BF392D","#A40822"],"9":["#FFF0E5","#FFD3BE","#FDB596","#F8966E","#F27642","#DF5F3A","#CB4832","#B82E2A","#A40822"]},
"canvas":"#11191D",
"noData":"#3B4849",
"zeroOutline":"#BAC6C0",
"classificationMethod":"consumer supplied with exact thresholds and unit",
"outlierPolicy":"explicit; never silently clamp",
"scaleVersion":"c1430bb4611a58b1f2f6589cfd4f8ea707ae4e038365ad93e6cdbf9c2da44889",
"themePolicy":"identical-light-values-on-both-themes"
},
{
"scaleId":"price",
"kind":"sequential",
"theme":"light",
"label":"ราคา",
"meaning":"มูลค่าภายใต้หน่วยและช่วงเวลาเดียวกัน",
"unitExample":"บาท / หน่วย ตัวอย่าง",
"use":"appraisal, rent, revenue, registered capital",
"directionLabel":"mint cyan / forest",
"designNote":"A mint-cyan middle turns toward forest green, suggesting value without using brand energy mint. Higher price is magnitude, not automatically benefit or desirability. Same approved light colors and value direction on both themes; use readable labels, boundaries or a neutral backplate without recoloring the data.",
"anchors":["#F4F4DD","#74C4C2","#216D58"],
"knots":null,
"positions":[0,20,40],
"interpolation":"none at consumption; exact approved 41-sample sRGB lookup table",
"lut":["#F4F4DD","#EEF2DC","#E8EFDA","#E2EDD9","#DCEBD8","#D6E8D6","#D0E6D5","#C9E3D4","#C3E1D2","#BDDFD1","#B7DCD0","#B0DACE","#AAD7CD","#A4D5CC","#9DD3CA","#97D0C9","#90CEC8","#89CBC6","#82C9C5","#7BC6C3","#74C4C2","#70BFBC","#6CBBB7","#68B6B1","#63B2AC","#5FADA6","#5BA9A1","#57A59B","#53A096","#4F9C91","#4B978B","#479386","#438F81","#3F8B7C","#3B8676","#368271","#327E6C","#2E7A67","#2A7562","#25715D","#216D58"],
"classes":{"3":["#F4F4DD","#74C4C2","#216D58"],"5":["#F4F4DD","#B7DCD0","#74C4C2","#4B978B","#216D58"],"7":["#F4F4DD","#C9E3D4","#A4D5CC","#74C4C2","#57A59B","#3F8B7C","#216D58"],"9":["#F4F4DD","#D6E8D6","#B7DCD0","#97D0C9","#74C4C2","#5FADA6","#4B978B","#368271","#216D58"]},
"canvas":"#F6F7F3",
"noData":"#D5DAD6",
"zeroOutline":"#7D877F",
"classificationMethod":"consumer supplied with exact thresholds and unit",
"outlierPolicy":"explicit; never silently clamp",
"scaleVersion":"a4fcda655f3e10c43e8deab212d7da20335392a87c823a390ab81a69d38cfccc",
"themePolicy":"identical-light-values-on-both-themes"
},
{
"scaleId":"price",
"kind":"sequential",
"theme":"dark",
"label":"ราคา",
"meaning":"มูลค่าภายใต้หน่วยและช่วงเวลาเดียวกัน",
"unitExample":"บาท / หน่วย ตัวอย่าง",
"use":"appraisal, rent, revenue, registered capital",
"directionLabel":"mint cyan / forest",
"designNote":"A mint-cyan middle turns toward forest green, suggesting value without using brand energy mint. Higher price is magnitude, not automatically benefit or desirability. Same approved light colors and value direction on both themes; use readable labels, boundaries or a neutral backplate without recoloring the data.",
"anchors":["#F4F4DD","#74C4C2","#216D58"],
"knots":null,
"positions":[0,20,40],
"interpolation":"none at consumption; exact approved 41-sample sRGB lookup table",
"lut":["#F4F4DD","#EEF2DC","#E8EFDA","#E2EDD9","#DCEBD8","#D6E8D6","#D0E6D5","#C9E3D4","#C3E1D2","#BDDFD1","#B7DCD0","#B0DACE","#AAD7CD","#A4D5CC","#9DD3CA","#97D0C9","#90CEC8","#89CBC6","#82C9C5","#7BC6C3","#74C4C2","#70BFBC","#6CBBB7","#68B6B1","#63B2AC","#5FADA6","#5BA9A1","#57A59B","#53A096","#4F9C91","#4B978B","#479386","#438F81","#3F8B7C","#3B8676","#368271","#327E6C","#2E7A67","#2A7562","#25715D","#216D58"],
"classes":{"3":["#F4F4DD","#74C4C2","#216D58"],"5":["#F4F4DD","#B7DCD0","#74C4C2","#4B978B","#216D58"],"7":["#F4F4DD","#C9E3D4","#A4D5CC","#74C4C2","#57A59B","#3F8B7C","#216D58"],"9":["#F4F4DD","#D6E8D6","#B7DCD0","#97D0C9","#74C4C2","#5FADA6","#4B978B","#368271","#216D58"]},
"canvas":"#11191D",
"noData":"#3B4849",
"zeroOutline":"#BAC6C0",
"classificationMethod":"consumer supplied with exact thresholds and unit",
"outlierPolicy":"explicit; never silently clamp",
"scaleVersion":"a4fcda655f3e10c43e8deab212d7da20335392a87c823a390ab81a69d38cfccc",
"themePolicy":"identical-light-values-on-both-themes"
},
{
"scaleId":"age",
"kind":"sequential",
"theme":"light",
"label":"อายุ",
"meaning":"อายุหรือระยะเวลาตั้งแต่เกิดเหตุการณ์",
"unitExample":"ปี",
"use":"building age, business age",
"directionLabel":"mineral blue / olive leaf",
"designNote":"Mineral blue turning into olive leaf gives elapsed age a quiet archival character. Old is not automatically damaged, unsafe or obsolete. Distinguish from duration by units and legend labels. Same approved light colors and value direction on both themes; use readable labels, boundaries or a neutral backplate without recoloring the data.",
"anchors":["#F5F0DF","#9DBACB","#526832"],
"knots":null,
"positions":[0,20,40],
"interpolation":"none at consumption; exact approved 41-sample sRGB lookup table",
"lut":["#F5F0DF","#F1EDDE","#ECEBDD","#E8E8DC","#E3E5DB","#DFE2DA","#DAE0D9","#D6DDD8","#D2DAD7","#CDD8D6","#C9D5D5","#C4D2D4","#C0D0D3","#BCCDD2","#B7CAD1","#B3C7D0","#AEC5CF","#AAC2CE","#A6BFCD","#A1BDCC","#9DBACB","#99B6C3","#95B2BB","#91AEB4","#8DA9AC","#89A5A4","#85A19D","#819D95","#7D998E","#7A9586","#76917F","#728D77","#6E8970","#6B8468","#678061","#637C59","#607851","#5C744A","#597042","#556C3A","#526832"],
"classes":{"3":["#F5F0DF","#9DBACB","#526832"],"5":["#F5F0DF","#C9D5D5","#9DBACB","#76917F","#526832"],"7":["#F5F0DF","#D6DDD8","#BCCDD2","#9DBACB","#819D95","#6B8468","#526832"],"9":["#F5F0DF","#DFE2DA","#C9D5D5","#B3C7D0","#9DBACB","#89A5A4","#76917F","#637C59","#526832"]},
"canvas":"#F6F7F3",
"noData":"#D5DAD6",
"zeroOutline":"#7D877F",
"classificationMethod":"consumer supplied with exact thresholds and unit",
"outlierPolicy":"explicit; never silently clamp",
"scaleVersion":"269647c059f5c80228ddc30e8d906d61096df9b628b3607d91c96ea881129e57",
"themePolicy":"identical-light-values-on-both-themes"
},
{
"scaleId":"age",
"kind":"sequential",
"theme":"dark",
"label":"อายุ",
"meaning":"อายุหรือระยะเวลาตั้งแต่เกิดเหตุการณ์",
"unitExample":"ปี",
"use":"building age, business age",
"directionLabel":"mineral blue / olive leaf",
"designNote":"Mineral blue turning into olive leaf gives elapsed age a quiet archival character. Old is not automatically damaged, unsafe or obsolete. Distinguish from duration by units and legend labels. Same approved light colors and value direction on both themes; use readable labels, boundaries or a neutral backplate without recoloring the data.",
"anchors":["#F5F0DF","#9DBACB","#526832"],
"knots":null,
"positions":[0,20,40],
"interpolation":"none at consumption; exact approved 41-sample sRGB lookup table",
"lut":["#F5F0DF","#F1EDDE","#ECEBDD","#E8E8DC","#E3E5DB","#DFE2DA","#DAE0D9","#D6DDD8","#D2DAD7","#CDD8D6","#C9D5D5","#C4D2D4","#C0D0D3","#BCCDD2","#B7CAD1","#B3C7D0","#AEC5CF","#AAC2CE","#A6BFCD","#A1BDCC","#9DBACB","#99B6C3","#95B2BB","#91AEB4","#8DA9AC","#89A5A4","#85A19D","#819D95","#7D998E","#7A9586","#76917F","#728D77","#6E8970","#6B8468","#678061","#637C59","#607851","#5C744A","#597042","#556C3A","#526832"],
"classes":{"3":["#F5F0DF","#9DBACB","#526832"],"5":["#F5F0DF","#C9D5D5","#9DBACB","#76917F","#526832"],"7":["#F5F0DF","#D6DDD8","#BCCDD2","#9DBACB","#819D95","#6B8468","#526832"],"9":["#F5F0DF","#DFE2DA","#C9D5D5","#B3C7D0","#9DBACB","#89A5A4","#76917F","#637C59","#526832"]},
"canvas":"#11191D",
"noData":"#3B4849",
"zeroOutline":"#BAC6C0",
"classificationMethod":"consumer supplied with exact thresholds and unit",
"outlierPolicy":"explicit; never silently clamp",
"scaleVersion":"269647c059f5c80228ddc30e8d906d61096df9b628b3607d91c96ea881129e57",
"themePolicy":"identical-light-values-on-both-themes"
},
{
"scaleId":"density.household",
"kind":"sequential",
"theme":"light",
"label":"ต่อครัวเรือน",
"meaning":"ระบุตัวหารเป็นครัวเรือน",
"unitExample":"หน่วย / ครัวเรือน",
"use":"per 100 households (denominator = household · Living)",
"directionLabel":"rose / scarlet coral",
"designNote":"Household density uses a rose middle and a lighter scarlet/coral high than risk. This warm living-related lane is not a hazard code. Always name the household denominator. Same approved light colors and value direction on both themes; use readable labels, boundaries or a neutral backplate without recoloring the data.",
"anchors":["#FFF2E4","#EF84A3","#DF491F"],
"knots":null,
"positions":[0,20,40],
"interpolation":"none at consumption; exact approved 41-sample sRGB lookup table",
"lut":["#FFF2E4","#FFEDE1","#FFE7DD","#FEE2DA","#FEDCD7","#FDD7D3","#FDD1D0","#FCCCCD","#FCC7CA","#FBC1C6","#FABCC3","#F9B6C0","#F8B1BD","#F7ABB9","#F6A6B6","#F5A0B3","#F49BB0","#F395AD","#F28FA9","#F08AA6","#EF84A3","#EE819D","#EE7F98","#ED7C92","#EC7A8C","#EB7787","#EB7481","#EA727B","#E96F75","#E86C70","#E8696A","#E76664","#E6635D","#E56057","#E45D51","#E35A4A","#E35743","#E2543B","#E15033","#E04D2A","#DF491F"],
"classes":{"3":["#FFF2E4","#EF84A3","#DF491F"],"5":["#FFF2E4","#FABCC3","#EF84A3","#E8696A","#DF491F"],"7":["#FFF2E4","#FCCCCD","#F7ABB9","#EF84A3","#EA727B","#E56057","#DF491F"],"9":["#FFF2E4","#FDD7D3","#FABCC3","#F5A0B3","#EF84A3","#EB7787","#E8696A","#E35A4A","#DF491F"]},
"canvas":"#F6F7F3",
"noData":"#D5DAD6",
"zeroOutline":"#7D877F",
"classificationMethod":"consumer supplied with exact thresholds and unit",
"outlierPolicy":"explicit; never silently clamp",
"scaleVersion":"4219491ca990af391a4d5320183601149b86bc19b0cc4da5a575c95673d2c843",
"themePolicy":"identical-light-values-on-both-themes"
},
{
"scaleId":"density.household",
"kind":"sequential",
"theme":"dark",
"label":"ต่อครัวเรือน",
"meaning":"ระบุตัวหารเป็นครัวเรือน",
"unitExample":"หน่วย / ครัวเรือน",
"use":"per 100 households (denominator = household · Living)",
"directionLabel":"rose / scarlet coral",
"designNote":"Household density uses a rose middle and a lighter scarlet/coral high than risk. This warm living-related lane is not a hazard code. Always name the household denominator. Same approved light colors and value direction on both themes; use readable labels, boundaries or a neutral backplate without recoloring the data.",
"anchors":["#FFF2E4","#EF84A3","#DF491F"],
"knots":null,
"positions":[0,20,40],
"interpolation":"none at consumption; exact approved 41-sample sRGB lookup table",
"lut":["#FFF2E4","#FFEDE1","#FFE7DD","#FEE2DA","#FEDCD7","#FDD7D3","#FDD1D0","#FCCCCD","#FCC7CA","#FBC1C6","#FABCC3","#F9B6C0","#F8B1BD","#F7ABB9","#F6A6B6","#F5A0B3","#F49BB0","#F395AD","#F28FA9","#F08AA6","#EF84A3","#EE819D","#EE7F98","#ED7C92","#EC7A8C","#EB7787","#EB7481","#EA727B","#E96F75","#E86C70","#E8696A","#E76664","#E6635D","#E56057","#E45D51","#E35A4A","#E35743","#E2543B","#E15033","#E04D2A","#DF491F"],
"classes":{"3":["#FFF2E4","#EF84A3","#DF491F"],"5":["#FFF2E4","#FABCC3","#EF84A3","#E8696A","#DF491F"],"7":["#FFF2E4","#FCCCCD","#F7ABB9","#EF84A3","#EA727B","#E56057","#DF491F"],"9":["#FFF2E4","#FDD7D3","#FABCC3","#F5A0B3","#EF84A3","#EB7787","#E8696A","#E35A4A","#DF491F"]},
"canvas":"#11191D",
"noData":"#3B4849",
"zeroOutline":"#BAC6C0",
"classificationMethod":"consumer supplied with exact thresholds and unit",
"outlierPolicy":"explicit; never silently clamp",
"scaleVersion":"4219491ca990af391a4d5320183601149b86bc19b0cc4da5a575c95673d2c843",
"themePolicy":"identical-light-values-on-both-themes"
},
{
"scaleId":"growth",
"kind":"sequential",
"theme":"light",
"label":"การเติบโต",
"meaning":"ปริมาณการเติบโตที่มีทิศทางเพิ่มขึ้น",
"unitExample":"ดัชนีการเติบโตตัวอย่าง",
"use":"cumulative index, growth rate",
"directionLabel":"yellow green / leaf",
"designNote":"A sunny yellow-green middle turns to leaf green for one-way growth. Use only when the mapped variable is a nonnegative magnitude; signed change belongs to delta with a meaningful zero. Same approved light colors and value direction on both themes; use readable labels, boundaries or a neutral backplate without recoloring the data.",
"anchors":["#EEF5E5","#B2C75B","#2B702F"],
"knots":null,
"positions":[0,20,40],
"interpolation":"none at consumption; exact approved 41-sample sRGB lookup table",
"lut":["#EEF5E5","#EBF3DF","#E8F1D8","#E5EED2","#E2ECCB","#DEEAC5","#DBE8BE","#D8E5B8","#D5E3B1","#D2E1AA","#CFDEA4","#CCDC9D","#C9DA96","#C6D78F","#C3D588","#C0D381","#BDD07A","#BBCE73","#B8CC6B","#B5C963","#B2C75B","#ABC359","#A5BE56","#9EBA54","#98B552","#91B150","#8BAC4D","#84A84B","#7EA349","#779F47","#719B44","#6A9642","#649240","#5D8E3E","#56893C","#50853A","#498137","#427D35","#3A7833","#337431","#2B702F"],
"classes":{"3":["#EEF5E5","#B2C75B","#2B702F"],"5":["#EEF5E5","#CFDEA4","#B2C75B","#719B44","#2B702F"],"7":["#EEF5E5","#D8E5B8","#C6D78F","#B2C75B","#84A84B","#5D8E3E","#2B702F"],"9":["#EEF5E5","#DEEAC5","#CFDEA4","#C0D381","#B2C75B","#91B150","#719B44","#50853A","#2B702F"]},
"canvas":"#F6F7F3",
"noData":"#D5DAD6",
"zeroOutline":"#7D877F",
"classificationMethod":"consumer supplied with exact thresholds and unit",
"outlierPolicy":"explicit; never silently clamp",
"scaleVersion":"be3bab88185bea67cdd2e96560e4edc292c705f379531f45c4590a07915dd1ec",
"themePolicy":"identical-light-values-on-both-themes"
},
{
"scaleId":"growth",
"kind":"sequential",
"theme":"dark",
"label":"การเติบโต",
"meaning":"ปริมาณการเติบโตที่มีทิศทางเพิ่มขึ้น",
"unitExample":"ดัชนีการเติบโตตัวอย่าง",
"use":"cumulative index, growth rate",
"directionLabel":"yellow green / leaf",
"designNote":"A sunny yellow-green middle turns to leaf green for one-way growth. Use only when the mapped variable is a nonnegative magnitude; signed change belongs to delta with a meaningful zero. Same approved light colors and value direction on both themes; use readable labels, boundaries or a neutral backplate without recoloring the data.",
"anchors":["#EEF5E5","#B2C75B","#2B702F"],
"knots":null,
"positions":[0,20,40],
"interpolation":"none at consumption; exact approved 41-sample sRGB lookup table",
"lut":["#EEF5E5","#EBF3DF","#E8F1D8","#E5EED2","#E2ECCB","#DEEAC5","#DBE8BE","#D8E5B8","#D5E3B1","#D2E1AA","#CFDEA4","#CCDC9D","#C9DA96","#C6D78F","#C3D588","#C0D381","#BDD07A","#BBCE73","#B8CC6B","#B5C963","#B2C75B","#ABC359","#A5BE56","#9EBA54","#98B552","#91B150","#8BAC4D","#84A84B","#7EA349","#779F47","#719B44","#6A9642","#649240","#5D8E3E","#56893C","#50853A","#498137","#427D35","#3A7833","#337431","#2B702F"],
"classes":{"3":["#EEF5E5","#B2C75B","#2B702F"],"5":["#EEF5E5","#CFDEA4","#B2C75B","#719B44","#2B702F"],"7":["#EEF5E5","#D8E5B8","#C6D78F","#B2C75B","#84A84B","#5D8E3E","#2B702F"],"9":["#EEF5E5","#DEEAC5","#CFDEA4","#C0D381","#B2C75B","#91B150","#719B44","#50853A","#2B702F"]},
"canvas":"#11191D",
"noData":"#3B4849",
"zeroOutline":"#BAC6C0",
"classificationMethod":"consumer supplied with exact thresholds and unit",
"outlierPolicy":"explicit; never silently clamp",
"scaleVersion":"be3bab88185bea67cdd2e96560e4edc292c705f379531f45c4590a07915dd1ec",
"themePolicy":"identical-light-values-on-both-themes"
},
{
"scaleId":"confidence",
"kind":"sequential",
"theme":"light",
"label":"ความเชื่อมั่น",
"meaning":"ระดับความเชื่อมั่นของแบบจำลองหรือหลักฐาน",
"unitExample":"คะแนนตัวอย่าง",
"use":"estimate confidence, data quality",
"directionLabel":"sky blue / deep teal green",
"designNote":"Sky-blue-to-teal-green suggests increasingly supported evidence without imitating a red/green pass/fail signal. Confidence is not truth, causality or permission; show uncertainty and the estimation method. Same approved light colors and value direction on both themes; use readable labels, boundaries or a neutral backplate without recoloring the data.",
"anchors":["#EEF4EB","#66AEDF","#236A5E"],
"knots":null,
"positions":[0,20,40],
"interpolation":"none at consumption; exact approved 41-sample sRGB lookup table",
"lut":["#EEF4EB","#E7F1EB","#E1EDEA","#DAEAEA","#D4E6EA","#CDE3E9","#C6DFE9","#C0DCE8","#B9D8E8","#B2D5E7","#ACD1E6","#A5CEE6","#9ECAE5","#97C7E4","#91C3E4","#8AC0E3","#83BCE2","#7CB9E1","#75B5E1","#6DB2E0","#66AEDF","#63ABD8","#5FA7D1","#5CA4CB","#58A0C4","#559DBD","#5299B7","#4E96B0","#4B93AA","#488FA3","#448C9D","#418896","#3E8590","#3A828A","#377E83","#347B7D","#307777","#2D7470","#2A716A","#266D64","#236A5E"],
"classes":{"3":["#EEF4EB","#66AEDF","#236A5E"],"5":["#EEF4EB","#ACD1E6","#66AEDF","#448C9D","#236A5E"],"7":["#EEF4EB","#C0DCE8","#97C7E4","#66AEDF","#4E96B0","#3A828A","#236A5E"],"9":["#EEF4EB","#CDE3E9","#ACD1E6","#8AC0E3","#66AEDF","#559DBD","#448C9D","#347B7D","#236A5E"]},
"canvas":"#F6F7F3",
"noData":"#D5DAD6",
"zeroOutline":"#7D877F",
"classificationMethod":"consumer supplied with exact thresholds and unit",
"outlierPolicy":"explicit; never silently clamp",
"scaleVersion":"9cba2ee7c73f4370ec3efa23bce9ababe31ea46a5767b0cef3b05dbdf2bd2756",
"themePolicy":"identical-light-values-on-both-themes"
},
{
"scaleId":"confidence",
"kind":"sequential",
"theme":"dark",
"label":"ความเชื่อมั่น",
"meaning":"ระดับความเชื่อมั่นของแบบจำลองหรือหลักฐาน",
"unitExample":"คะแนนตัวอย่าง",
"use":"estimate confidence, data quality",
"directionLabel":"sky blue / deep teal green",
"designNote":"Sky-blue-to-teal-green suggests increasingly supported evidence without imitating a red/green pass/fail signal. Confidence is not truth, causality or permission; show uncertainty and the estimation method. Same approved light colors and value direction on both themes; use readable labels, boundaries or a neutral backplate without recoloring the data.",
"anchors":["#EEF4EB","#66AEDF","#236A5E"],
"knots":null,
"positions":[0,20,40],
"interpolation":"none at consumption; exact approved 41-sample sRGB lookup table",
"lut":["#EEF4EB","#E7F1EB","#E1EDEA","#DAEAEA","#D4E6EA","#CDE3E9","#C6DFE9","#C0DCE8","#B9D8E8","#B2D5E7","#ACD1E6","#A5CEE6","#9ECAE5","#97C7E4","#91C3E4","#8AC0E3","#83BCE2","#7CB9E1","#75B5E1","#6DB2E0","#66AEDF","#63ABD8","#5FA7D1","#5CA4CB","#58A0C4","#559DBD","#5299B7","#4E96B0","#4B93AA","#488FA3","#448C9D","#418896","#3E8590","#3A828A","#377E83","#347B7D","#307777","#2D7470","#2A716A","#266D64","#236A5E"],
"classes":{"3":["#EEF4EB","#66AEDF","#236A5E"],"5":["#EEF4EB","#ACD1E6","#66AEDF","#448C9D","#236A5E"],"7":["#EEF4EB","#C0DCE8","#97C7E4","#66AEDF","#4E96B0","#3A828A","#236A5E"],"9":["#EEF4EB","#CDE3E9","#ACD1E6","#8AC0E3","#66AEDF","#559DBD","#448C9D","#347B7D","#236A5E"]},
"canvas":"#11191D",
"noData":"#3B4849",
"zeroOutline":"#BAC6C0",
"classificationMethod":"consumer supplied with exact thresholds and unit",
"outlierPolicy":"explicit; never silently clamp",
"scaleVersion":"9cba2ee7c73f4370ec3efa23bce9ababe31ea46a5767b0cef3b05dbdf2bd2756",
"themePolicy":"identical-light-values-on-both-themes"
},
{
"scaleId":"count",
"kind":"sequential",
"theme":"light",
"label":"จำนวนรวม",
"meaning":"จำนวนรวม ไม่ใช่อัตราหรือความหนาแน่น",
"unitExample":"แห่ง",
"use":"population, number of firms, vehicles (totals)",
"directionLabel":"dusty cyan / editorial navy",
"designNote":"A dusty cyan middle and deep editorial navy end give totals weight without heat or danger meaning. Count is not an area/population/household rate. Blue-family collisions remain a specific review item. Same approved light colors and value direction on both themes; use readable labels, boundaries or a neutral backplate without recoloring the data.",
"anchors":["#F4F0E7","#7DBAC0","#213E70"],
"knots":null,
"positions":[0,20,40],
"interpolation":"none at consumption; exact approved 41-sample sRGB lookup table",
"lut":["#F4F0E7","#EEEDE5","#E8EBE3","#E3E8E1","#DDE5DF","#D7E3DD","#D1E0DB","#CBDDD9","#C5DAD7","#C0D8D6","#BAD5D4","#B4D2D2","#AED0D0","#A8CDCE","#A2CACC","#9CC8CA","#96C5C8","#90C2C6","#8ABFC4","#83BDC2","#7DBAC0","#78B3BC","#73ADB8","#6EA7B4","#69A0B0","#649AAC","#5F93A8","#5A8DA4","#5587A0","#50809C","#4C7A98","#477494","#436E90","#3E688C","#3A6288","#355C84","#315680","#2D507C","#294A78","#254474","#213E70"],
"classes":{"3":["#F4F0E7","#7DBAC0","#213E70"],"5":["#F4F0E7","#BAD5D4","#7DBAC0","#4C7A98","#213E70"],"7":["#F4F0E7","#CBDDD9","#A8CDCE","#7DBAC0","#5A8DA4","#3E688C","#213E70"],"9":["#F4F0E7","#D7E3DD","#BAD5D4","#9CC8CA","#7DBAC0","#649AAC","#4C7A98","#355C84","#213E70"]},
"canvas":"#F6F7F3",
"noData":"#D5DAD6",
"zeroOutline":"#7D877F",
"classificationMethod":"consumer supplied with exact thresholds and unit",
"outlierPolicy":"explicit; never silently clamp",
"scaleVersion":"4ff5c1fb4be71ecd13c48685b38371b528bcd4ce369ce964a75354c2eb4d0980",
"themePolicy":"identical-light-values-on-both-themes"
},
{
"scaleId":"count",
"kind":"sequential",
"theme":"dark",
"label":"จำนวนรวม",
"meaning":"จำนวนรวม ไม่ใช่อัตราหรือความหนาแน่น",
"unitExample":"แห่ง",
"use":"population, number of firms, vehicles (totals)",
"directionLabel":"dusty cyan / editorial navy",
"designNote":"A dusty cyan middle and deep editorial navy end give totals weight without heat or danger meaning. Count is not an area/population/household rate. Blue-family collisions remain a specific review item. Same approved light colors and value direction on both themes; use readable labels, boundaries or a neutral backplate without recoloring the data.",
"anchors":["#F4F0E7","#7DBAC0","#213E70"],
"knots":null,
"positions":[0,20,40],
"interpolation":"none at consumption; exact approved 41-sample sRGB lookup table",
"lut":["#F4F0E7","#EEEDE5","#E8EBE3","#E3E8E1","#DDE5DF","#D7E3DD","#D1E0DB","#CBDDD9","#C5DAD7","#C0D8D6","#BAD5D4","#B4D2D2","#AED0D0","#A8CDCE","#A2CACC","#9CC8CA","#96C5C8","#90C2C6","#8ABFC4","#83BDC2","#7DBAC0","#78B3BC","#73ADB8","#6EA7B4","#69A0B0","#649AAC","#5F93A8","#5A8DA4","#5587A0","#50809C","#4C7A98","#477494","#436E90","#3E688C","#3A6288","#355C84","#315680","#2D507C","#294A78","#254474","#213E70"],
"classes":{"3":["#F4F0E7","#7DBAC0","#213E70"],"5":["#F4F0E7","#BAD5D4","#7DBAC0","#4C7A98","#213E70"],"7":["#F4F0E7","#CBDDD9","#A8CDCE","#7DBAC0","#5A8DA4","#3E688C","#213E70"],"9":["#F4F0E7","#D7E3DD","#BAD5D4","#9CC8CA","#7DBAC0","#649AAC","#4C7A98","#355C84","#213E70"]},
"canvas":"#11191D",
"noData":"#3B4849",
"zeroOutline":"#BAC6C0",
"classificationMethod":"consumer supplied with exact thresholds and unit",
"outlierPolicy":"explicit; never silently clamp",
"scaleVersion":"4ff5c1fb4be71ecd13c48685b38371b528bcd4ce369ce964a75354c2eb4d0980",
"themePolicy":"identical-light-values-on-both-themes"
},
{
"scaleId":"water",
"kind":"sequential",
"theme":"light",
"label":"น้ำ",
"meaning":"ปริมาณหรือระดับน้ำตามหน่วยที่ระบุ",
"unitExample":"ระดับน้ำตัวอย่าง",
"use":"water level, depth, flood frequency",
"directionLabel":"ice / cyan / deep blue",
"designNote":"Every phase stays in an aquatic cyan/blue vocabulary; no lime or foliage middle. This maps amount/depth/frequency of water, not flood-danger categories; consequence-based risk uses the risk family. Same approved light colors and value direction on both themes; use readable labels, boundaries or a neutral backplate without recoloring the data.",
"anchors":["#EEF7FC","#3DBBCD","#073E78"],
"knots":null,
"positions":[0,20,40],
"interpolation":"none at consumption; exact approved 41-sample sRGB lookup table",
"lut":["#EEF7FC","#E6F4FA","#DFF1F7","#D7EEF5","#D0EBF3","#C8E8F0","#C0E5EE","#B8E2EC","#B0DFE9","#A8DCE7","#A0D9E5","#98D6E2","#90D3E0","#87D0DE","#7ECDDB","#75CAD9","#6BC7D6","#61C4D4","#56C1D2","#4BBECF","#3DBBCD","#3AB4C9","#36AEC4","#33A7C0","#30A1BC","#2D9BB8","#2A94B4","#278EAF","#2387AB","#2181A7","#1E7BA3","#1B759E","#186F9A","#156896","#136292","#105C8D","#0E5689","#0C5085","#0A4A81","#08447C","#073E78"],
"classes":{"3":["#EEF7FC","#3DBBCD","#073E78"],"5":["#EEF7FC","#A0D9E5","#3DBBCD","#1E7BA3","#073E78"],"7":["#EEF7FC","#B8E2EC","#87D0DE","#3DBBCD","#278EAF","#156896","#073E78"],"9":["#EEF7FC","#C8E8F0","#A0D9E5","#75CAD9","#3DBBCD","#2D9BB8","#1E7BA3","#105C8D","#073E78"]},
"canvas":"#F6F7F3",
"noData":"#D5DAD6",
"zeroOutline":"#7D877F",
"classificationMethod":"consumer supplied with exact thresholds and unit",
"outlierPolicy":"explicit; never silently clamp",
"scaleVersion":"99754dd9298f92e96bbc071cc14e7d2f209ba7ea6f52817e0e13ee2227c518e2",
"themePolicy":"identical-light-values-on-both-themes"
},
{
"scaleId":"water",
"kind":"sequential",
"theme":"dark",
"label":"น้ำ",
"meaning":"ปริมาณหรือระดับน้ำตามหน่วยที่ระบุ",
"unitExample":"ระดับน้ำตัวอย่าง",
"use":"water level, depth, flood frequency",
"directionLabel":"ice / cyan / deep blue",
"designNote":"Every phase stays in an aquatic cyan/blue vocabulary; no lime or foliage middle. This maps amount/depth/frequency of water, not flood-danger categories; consequence-based risk uses the risk family. Same approved light colors and value direction on both themes; use readable labels, boundaries or a neutral backplate without recoloring the data.",
"anchors":["#EEF7FC","#3DBBCD","#073E78"],
"knots":null,
"positions":[0,20,40],
"interpolation":"none at consumption; exact approved 41-sample sRGB lookup table",
"lut":["#EEF7FC","#E6F4FA","#DFF1F7","#D7EEF5","#D0EBF3","#C8E8F0","#C0E5EE","#B8E2EC","#B0DFE9","#A8DCE7","#A0D9E5","#98D6E2","#90D3E0","#87D0DE","#7ECDDB","#75CAD9","#6BC7D6","#61C4D4","#56C1D2","#4BBECF","#3DBBCD","#3AB4C9","#36AEC4","#33A7C0","#30A1BC","#2D9BB8","#2A94B4","#278EAF","#2387AB","#2181A7","#1E7BA3","#1B759E","#186F9A","#156896","#136292","#105C8D","#0E5689","#0C5085","#0A4A81","#08447C","#073E78"],
"classes":{"3":["#EEF7FC","#3DBBCD","#073E78"],"5":["#EEF7FC","#A0D9E5","#3DBBCD","#1E7BA3","#073E78"],"7":["#EEF7FC","#B8E2EC","#87D0DE","#3DBBCD","#278EAF","#156896","#073E78"],"9":["#EEF7FC","#C8E8F0","#A0D9E5","#75CAD9","#3DBBCD","#2D9BB8","#1E7BA3","#105C8D","#073E78"]},
"canvas":"#11191D",
"noData":"#3B4849",
"zeroOutline":"#BAC6C0",
"classificationMethod":"consumer supplied with exact thresholds and unit",
"outlierPolicy":"explicit; never silently clamp",
"scaleVersion":"99754dd9298f92e96bbc071cc14e7d2f209ba7ea6f52817e0e13ee2227c518e2",
"themePolicy":"identical-light-values-on-both-themes"
},
{
"scaleId":"density.capita",
"kind":"sequential",
"theme":"light",
"label":"ต่อประชากร",
"meaning":"ระบุตัวหารและฐานประชากร",
"unitExample":"หน่วย / คน",
"use":"per 1,000 people (denominator = people)",
"directionLabel":"salmon / rose",
"designNote":"Per-person density stays warm with a salmon middle and rose high. It must remain distinct from household scarlet and never be read as demographic behaviour, eligibility or risk. Same approved light colors and value direction on both themes; use readable labels, boundaries or a neutral backplate without recoloring the data.",
"anchors":["#FFF0ED","#F3A076","#B72B63"],
"knots":null,
"positions":[0,20,40],
"interpolation":"none at consumption; exact approved 41-sample sRGB lookup table",
"lut":["#FFF0ED","#FFECE7","#FEE8E1","#FEE4DB","#FEE0D5","#FDDCCF","#FDD8CA","#FCD4C4","#FCD0BE","#FBCCB8","#FBC8B2","#FAC4AC","#F9C0A6","#F9BCA0","#F8B89A","#F7B494","#F6B08E","#F6AC88","#F5A882","#F4A47C","#F3A076","#F09B75","#ED9575","#EB9074","#E88B73","#E58572","#E28072","#DF7A71","#DC7570","#D96F6F","#D66A6E","#D3646D","#D05F6C","#CD596B","#CA536A","#C74D69","#C44768","#C14167","#BD3A65","#BA3364","#B72B63"],
"classes":{"3":["#FFF0ED","#F3A076","#B72B63"],"5":["#FFF0ED","#FBC8B2","#F3A076","#D66A6E","#B72B63"],"7":["#FFF0ED","#FCD4C4","#F9BCA0","#F3A076","#DF7A71","#CD596B","#B72B63"],"9":["#FFF0ED","#FDDCCF","#FBC8B2","#F7B494","#F3A076","#E58572","#D66A6E","#C74D69","#B72B63"]},
"canvas":"#F6F7F3",
"noData":"#D5DAD6",
"zeroOutline":"#7D877F",
"classificationMethod":"consumer supplied with exact thresholds and unit",
"outlierPolicy":"explicit; never silently clamp",
"scaleVersion":"0b49c15c6f91e48db79f5c6bd9c729656c95cd6f3162941490c5c125111b4ab1",
"themePolicy":"identical-light-values-on-both-themes"
},
{
"scaleId":"density.capita",
"kind":"sequential",
"theme":"dark",
"label":"ต่อประชากร",
"meaning":"ระบุตัวหารและฐานประชากร",
"unitExample":"หน่วย / คน",
"use":"per 1,000 people (denominator = people)",
"directionLabel":"salmon / rose",
"designNote":"Per-person density stays warm with a salmon middle and rose high. It must remain distinct from household scarlet and never be read as demographic behaviour, eligibility or risk. Same approved light colors and value direction on both themes; use readable labels, boundaries or a neutral backplate without recoloring the data.",
"anchors":["#FFF0ED","#F3A076","#B72B63"],
"knots":null,
"positions":[0,20,40],
"interpolation":"none at consumption; exact approved 41-sample sRGB lookup table",
"lut":["#FFF0ED","#FFECE7","#FEE8E1","#FEE4DB","#FEE0D5","#FDDCCF","#FDD8CA","#FCD4C4","#FCD0BE","#FBCCB8","#FBC8B2","#FAC4AC","#F9C0A6","#F9BCA0","#F8B89A","#F7B494","#F6B08E","#F6AC88","#F5A882","#F4A47C","#F3A076","#F09B75","#ED9575","#EB9074","#E88B73","#E58572","#E28072","#DF7A71","#DC7570","#D96F6F","#D66A6E","#D3646D","#D05F6C","#CD596B","#CA536A","#C74D69","#C44768","#C14167","#BD3A65","#BA3364","#B72B63"],
"classes":{"3":["#FFF0ED","#F3A076","#B72B63"],"5":["#FFF0ED","#FBC8B2","#F3A076","#D66A6E","#B72B63"],"7":["#FFF0ED","#FCD4C4","#F9BCA0","#F3A076","#DF7A71","#CD596B","#B72B63"],"9":["#FFF0ED","#FDDCCF","#FBC8B2","#F7B494","#F3A076","#E58572","#D66A6E","#C74D69","#B72B63"]},
"canvas":"#11191D",
"noData":"#3B4849",
"zeroOutline":"#BAC6C0",
"classificationMethod":"consumer supplied with exact thresholds and unit",
"outlierPolicy":"explicit; never silently clamp",
"scaleVersion":"0b49c15c6f91e48db79f5c6bd9c729656c95cd6f3162941490c5c125111b4ab1",
"themePolicy":"identical-light-values-on-both-themes"
},
{
"scaleId":"built",
"kind":"sequential",
"theme":"light",
"label":"พื้นที่ก่อสร้าง",
"meaning":"ความเข้มข้นของสิ่งปลูกสร้างตามนิยามชุดข้อมูล",
"unitExample":"ดัชนีตัวอย่าง",
"use":"building footprint, height, coverage",
"directionLabel":"peach / gold",
"designNote":"The built-area family stays gold with a peach middle. Gold has a shorter useful lightness range before becoming prohibited brown; class-count limitations are reported rather than hidden. State footprint, height or coverage definition. Same approved light colors and value direction on both themes; use readable labels, boundaries or a neutral backplate without recoloring the data.",
"anchors":["#FFF5D8","#F3BC93","#BFA000"],
"knots":null,
"positions":[0,20,40],
"interpolation":"none at consumption; exact approved 41-sample sRGB lookup table",
"lut":["#FFF5D8","#FFF2D5","#FEEFD1","#FEECCE","#FDEACA","#FDE7C7","#FCE4C3","#FBE1C0","#FBDEBC","#FADBB9","#FAD8B5","#F9D6B2","#F9D3AF","#F8D0AB","#F7CDA8","#F7CAA4","#F6C7A1","#F5C59D","#F4C29A","#F4BF96","#F3BC93","#F0BB8E","#EEB989","#EBB884","#E8B77F","#E6B57A","#E3B475","#E0B370","#DEB16A","#DBB065","#D9AE5F","#D6AD59","#D3AC53","#D1AA4D","#CEA946","#CCA73F","#C9A638","#C7A42F","#C4A325","#C2A118","#BFA000"],
"classes":{"3":["#FFF5D8","#F3BC93","#BFA000"],"5":["#FFF5D8","#FAD8B5","#F3BC93","#D9AE5F","#BFA000"],"7":["#FFF5D8","#FBE1C0","#F8D0AB","#F3BC93","#E0B370","#D1AA4D","#BFA000"],"9":["#FFF5D8","#FDE7C7","#FAD8B5","#F7CAA4","#F3BC93","#E6B57A","#D9AE5F","#CCA73F","#BFA000"]},
"canvas":"#F6F7F3",
"noData":"#D5DAD6",
"zeroOutline":"#7D877F",
"classificationMethod":"consumer supplied with exact thresholds and unit",
"outlierPolicy":"explicit; never silently clamp",
"scaleVersion":"f161dbd3448675c99137879735e1bda2cde4c33644e889ca3b9166cbfc9df3fb",
"themePolicy":"identical-light-values-on-both-themes"
},
{
"scaleId":"built",
"kind":"sequential",
"theme":"dark",
"label":"พื้นที่ก่อสร้าง",
"meaning":"ความเข้มข้นของสิ่งปลูกสร้างตามนิยามชุดข้อมูล",
"unitExample":"ดัชนีตัวอย่าง",
"use":"building footprint, height, coverage",
"directionLabel":"peach / gold",
"designNote":"The built-area family stays gold with a peach middle. Gold has a shorter useful lightness range before becoming prohibited brown; class-count limitations are reported rather than hidden. State footprint, height or coverage definition. Same approved light colors and value direction on both themes; use readable labels, boundaries or a neutral backplate without recoloring the data.",
"anchors":["#FFF5D8","#F3BC93","#BFA000"],
"knots":null,
"positions":[0,20,40],
"interpolation":"none at consumption; exact approved 41-sample sRGB lookup table",
"lut":["#FFF5D8","#FFF2D5","#FEEFD1","#FEECCE","#FDEACA","#FDE7C7","#FCE4C3","#FBE1C0","#FBDEBC","#FADBB9","#FAD8B5","#F9D6B2","#F9D3AF","#F8D0AB","#F7CDA8","#F7CAA4","#F6C7A1","#F5C59D","#F4C29A","#F4BF96","#F3BC93","#F0BB8E","#EEB989","#EBB884","#E8B77F","#E6B57A","#E3B475","#E0B370","#DEB16A","#DBB065","#D9AE5F","#D6AD59","#D3AC53","#D1AA4D","#CEA946","#CCA73F","#C9A638","#C7A42F","#C4A325","#C2A118","#BFA000"],
"classes":{"3":["#FFF5D8","#F3BC93","#BFA000"],"5":["#FFF5D8","#FAD8B5","#F3BC93","#D9AE5F","#BFA000"],"7":["#FFF5D8","#FBE1C0","#F8D0AB","#F3BC93","#E0B370","#D1AA4D","#BFA000"],"9":["#FFF5D8","#FDE7C7","#FAD8B5","#F7CAA4","#F3BC93","#E6B57A","#D9AE5F","#CCA73F","#BFA000"]},
"canvas":"#11191D",
"noData":"#3B4849",
"zeroOutline":"#BAC6C0",
"classificationMethod":"consumer supplied with exact thresholds and unit",
"outlierPolicy":"explicit; never silently clamp",
"scaleVersion":"f161dbd3448675c99137879735e1bda2cde4c33644e889ca3b9166cbfc9df3fb",
"themePolicy":"identical-light-values-on-both-themes"
},
{
"scaleId":"duration",
"kind":"sequential",
"theme":"light",
"label":"ระยะเวลา",
"meaning":"ระยะเวลาตามหน่วยเดียวกัน",
"unitExample":"นาที",
"use":"travel time, waiting time, inundation duration",
"directionLabel":"sage / neutral charcoal",
"designNote":"A sage middle resolves into neutral charcoal for elapsed time, separating it from the count family’s navy. The end is deliberately near-neutral, so midpoint-to-end hue angle is not a meaningful identity test. It remains calm and utilitarian; longer time is not automatically worse unless the product explicitly states that interpretation. Same approved light colors and value direction on both themes; use readable labels, boundaries or a neutral backplate without recoloring the data.",
"anchors":["#EEF2F5","#98B1A4","#33433E"],
"knots":null,
"positions":[0,20,40],
"interpolation":"none at consumption; exact approved 41-sample sRGB lookup table",
"lut":["#EEF2F5","#EAEFF1","#E5EBED","#E1E8E8","#DCE5E4","#D8E1E0","#D4DEDC","#CFDBD8","#CBD8D4","#C7D4D0","#C2D1CC","#BECEC8","#BACBC4","#B6C7C0","#B1C4BC","#ADC1B8","#A9BEB4","#A5BBB0","#A0B7AC","#9CB4A8","#98B1A4","#93AB9F","#8DA599","#889F94","#829A8E","#7D9489","#788E84","#73887E","#6D8379","#687D74","#63786F","#5E726A","#596D65","#546760","#4F625B","#4A5D56","#465751","#41524C","#3C4D47","#384843","#33433E"],
"classes":{"3":["#EEF2F5","#98B1A4","#33433E"],"5":["#EEF2F5","#C2D1CC","#98B1A4","#63786F","#33433E"],"7":["#EEF2F5","#CFDBD8","#B6C7C0","#98B1A4","#73887E","#546760","#33433E"],"9":["#EEF2F5","#D8E1E0","#C2D1CC","#ADC1B8","#98B1A4","#7D9489","#63786F","#4A5D56","#33433E"]},
"canvas":"#F6F7F3",
"noData":"#D5DAD6",
"zeroOutline":"#7D877F",
"classificationMethod":"consumer supplied with exact thresholds and unit",
"outlierPolicy":"explicit; never silently clamp",
"scaleVersion":"e40f5d7a6b35498988ece1e16db4bb9d497ae063f20096a81cd4b193dc2dafab",
"themePolicy":"identical-light-values-on-both-themes"
},
{
"scaleId":"duration",
"kind":"sequential",
"theme":"dark",
"label":"ระยะเวลา",
"meaning":"ระยะเวลาตามหน่วยเดียวกัน",
"unitExample":"นาที",
"use":"travel time, waiting time, inundation duration",
"directionLabel":"sage / neutral charcoal",
"designNote":"A sage middle resolves into neutral charcoal for elapsed time, separating it from the count family’s navy. The end is deliberately near-neutral, so midpoint-to-end hue angle is not a meaningful identity test. It remains calm and utilitarian; longer time is not automatically worse unless the product explicitly states that interpretation. Same approved light colors and value direction on both themes; use readable labels, boundaries or a neutral backplate without recoloring the data.",
"anchors":["#EEF2F5","#98B1A4","#33433E"],
"knots":null,
"positions":[0,20,40],
"interpolation":"none at consumption; exact approved 41-sample sRGB lookup table",
"lut":["#EEF2F5","#EAEFF1","#E5EBED","#E1E8E8","#DCE5E4","#D8E1E0","#D4DEDC","#CFDBD8","#CBD8D4","#C7D4D0","#C2D1CC","#BECEC8","#BACBC4","#B6C7C0","#B1C4BC","#ADC1B8","#A9BEB4","#A5BBB0","#A0B7AC","#9CB4A8","#98B1A4","#93AB9F","#8DA599","#889F94","#829A8E","#7D9489","#788E84","#73887E","#6D8379","#687D74","#63786F","#5E726A","#596D65","#546760","#4F625B","#4A5D56","#465751","#41524C","#3C4D47","#384843","#33433E"],
"classes":{"3":["#EEF2F5","#98B1A4","#33433E"],"5":["#EEF2F5","#C2D1CC","#98B1A4","#63786F","#33433E"],"7":["#EEF2F5","#CFDBD8","#B6C7C0","#98B1A4","#73887E","#546760","#33433E"],"9":["#EEF2F5","#D8E1E0","#C2D1CC","#ADC1B8","#98B1A4","#7D9489","#63786F","#4A5D56","#33433E"]},
"canvas":"#11191D",
"noData":"#3B4849",
"zeroOutline":"#BAC6C0",
"classificationMethod":"consumer supplied with exact thresholds and unit",
"outlierPolicy":"explicit; never silently clamp",
"scaleVersion":"e40f5d7a6b35498988ece1e16db4bb9d497ae063f20096a81cd4b193dc2dafab",
"themePolicy":"identical-light-values-on-both-themes"
},
{
"scaleId":"balance",
"kind":"diverging",
"theme":"light",
"label":"สมดุล",
"meaning":"ค่าลบและบวกรอบจุดสมดุลที่มีความหมาย",
"unitExample":"ค่าต่างจากจุดสมดุล 0",
"use":"deficit ↔ surplus",
"directionLabel":"red / neutral / blue",
"designNote":"Red deficit and blue surplus are deliberately separated around the stated balance. The neutral centre is a numerical reference, not a categorical unknown. Same approved light colors and value direction on both themes; use readable labels, boundaries or a neutral backplate without recoloring the data.",
"anchors":["#CF5148","#F1F3EC","#3B87BF"],
"knots":null,
"positions":[0,20,40],
"interpolation":"none at consumption; exact approved 41-sample sRGB lookup table",
"lut":["#CF5148","#D25A50","#D56358","#D76C60","#DA7468","#DC7C70","#DF8578","#E18D80","#E39588","#E59D90","#E7A599","#E8ACA1","#EAB4A9","#EBBCB1","#ECC4B9","#EECCC2","#EFD4CA","#EFDBD3","#F0E3DB","#F1EBE3","#F1F3EC","#E8EEEA","#DFE8E8","#D6E3E6","#CDDDE4","#C5D8E2","#BCD3E0","#B3CDDE","#AAC8DC","#A1C2D9","#99BDD7","#90B8D5","#87B2D3","#7EADD0","#75A8CE","#6CA2CC","#639DC9","#5997C7","#5092C4","#468CC2","#3B87BF"],
"classes":{"3":["#CF5148","#F1F3EC","#3B87BF"],"5":["#CF5148","#E7A599","#F1F3EC","#99BDD7","#3B87BF"],"7":["#CF5148","#E18D80","#EBBCB1","#F1F3EC","#B3CDDE","#7EADD0","#3B87BF"],"9":["#CF5148","#DC7C70","#E7A599","#EECCC2","#F1F3EC","#C5D8E2","#99BDD7","#6CA2CC","#3B87BF"]},
"canvas":"#F6F7F3",
"noData":"#D5DAD6",
"zeroOutline":"#7D877F",
"classificationMethod":"consumer supplied with exact thresholds and unit",
"outlierPolicy":"explicit; never silently clamp",
"scaleVersion":"386088ab3a05a972458d8839e5b656dc34c335b6e6b5e30820cec46ab90eae60",
"pivotMeaning":"Declared balance point, commonly zero net balance; never the distribution median by default.",
"themePolicy":"identical-light-values-on-both-themes"
},
{
"scaleId":"balance",
"kind":"diverging",
"theme":"dark",
"label":"สมดุล",
"meaning":"ค่าลบและบวกรอบจุดสมดุลที่มีความหมาย",
"unitExample":"ค่าต่างจากจุดสมดุล 0",
"use":"deficit ↔ surplus",
"directionLabel":"red / neutral / blue",
"designNote":"Red deficit and blue surplus are deliberately separated around the stated balance. The neutral centre is a numerical reference, not a categorical unknown. Same approved light colors and value direction on both themes; use readable labels, boundaries or a neutral backplate without recoloring the data.",
"anchors":["#CF5148","#F1F3EC","#3B87BF"],
"knots":null,
"positions":[0,20,40],
"interpolation":"none at consumption; exact approved 41-sample sRGB lookup table",
"lut":["#CF5148","#D25A50","#D56358","#D76C60","#DA7468","#DC7C70","#DF8578","#E18D80","#E39588","#E59D90","#E7A599","#E8ACA1","#EAB4A9","#EBBCB1","#ECC4B9","#EECCC2","#EFD4CA","#EFDBD3","#F0E3DB","#F1EBE3","#F1F3EC","#E8EEEA","#DFE8E8","#D6E3E6","#CDDDE4","#C5D8E2","#BCD3E0","#B3CDDE","#AAC8DC","#A1C2D9","#99BDD7","#90B8D5","#87B2D3","#7EADD0","#75A8CE","#6CA2CC","#639DC9","#5997C7","#5092C4","#468CC2","#3B87BF"],
"classes":{"3":["#CF5148","#F1F3EC","#3B87BF"],"5":["#CF5148","#E7A599","#F1F3EC","#99BDD7","#3B87BF"],"7":["#CF5148","#E18D80","#EBBCB1","#F1F3EC","#B3CDDE","#7EADD0","#3B87BF"],"9":["#CF5148","#DC7C70","#E7A599","#EECCC2","#F1F3EC","#C5D8E2","#99BDD7","#6CA2CC","#3B87BF"]},
"canvas":"#11191D",
"noData":"#3B4849",
"zeroOutline":"#BAC6C0",
"classificationMethod":"consumer supplied with exact thresholds and unit",
"outlierPolicy":"explicit; never silently clamp",
"scaleVersion":"386088ab3a05a972458d8839e5b656dc34c335b6e6b5e30820cec46ab90eae60",
"pivotMeaning":"Declared balance point, commonly zero net balance; never the distribution median by default.",
"themePolicy":"identical-light-values-on-both-themes"
},
{
"scaleId":"delta",
"kind":"diverging",
"theme":"light",
"label":"การเปลี่ยนแปลง",
"meaning":"ค่าลดลงและเพิ่มขึ้นจากฐานเดียวกัน",
"unitExample":"การเปลี่ยนแปลงจากฐาน 0",
"use":"decrease ↔ increase vs previous period",
"directionLabel":"orange / neutral / green",
"designNote":"Warm decrease and cool green increase express signed change around zero. Decrease/increase is not automatically bad/good. This pairing may require non-colour support under red-green deficiencies. Same approved light colors and value direction on both themes; use readable labels, boundaries or a neutral backplate without recoloring the data.",
"anchors":["#CF5420","#F1F3EC","#3C9278"],
"knots":null,
"positions":[0,20,40],
"interpolation":"none at consumption; exact approved 41-sample sRGB lookup table",
"lut":["#CF5420","#D25D2E","#D5663A","#D76E46","#DA7750","#DC7F5A","#DE8764","#E18F6E","#E39778","#E49E82","#E6A68B","#E8AE95","#E9B69E","#EBBDA8","#ECC5B2","#EDCDBB","#EED4C5","#EFDCCF","#F0E4D8","#F1EBE2","#F1F3EC","#E8EEE6","#E0E9E0","#D7E4DA","#CEDFD4","#C6DACE","#BDD6C8","#B4D1C2","#ACCCBC","#A3C7B6","#9AC2B0","#92BDAA","#89B8A5","#80B49F","#77AF99","#6EAA94","#65A58E","#5BA088","#519C83","#47977D","#3C9278"],
"classes":{"3":["#CF5420","#F1F3EC","#3C9278"],"5":["#CF5420","#E6A68B","#F1F3EC","#9AC2B0","#3C9278"],"7":["#CF5420","#E18F6E","#EBBDA8","#F1F3EC","#B4D1C2","#80B49F","#3C9278"],"9":["#CF5420","#DC7F5A","#E6A68B","#EDCDBB","#F1F3EC","#C6DACE","#9AC2B0","#6EAA94","#3C9278"]},
"canvas":"#F6F7F3",
"noData":"#D5DAD6",
"zeroOutline":"#7D877F",
"classificationMethod":"consumer supplied with exact thresholds and unit",
"outlierPolicy":"explicit; never silently clamp",
"scaleVersion":"07258fd1462e261aa1c2828f8ac084d4f19bc28c5c99acd3dcadc9dfbe7021fb",
"pivotMeaning":"Zero change from the named reference period or baseline.",
"themePolicy":"identical-light-values-on-both-themes"
},
{
"scaleId":"delta",
"kind":"diverging",
"theme":"dark",
"label":"การเปลี่ยนแปลง",
"meaning":"ค่าลดลงและเพิ่มขึ้นจากฐานเดียวกัน",
"unitExample":"การเปลี่ยนแปลงจากฐาน 0",
"use":"decrease ↔ increase vs previous period",
"directionLabel":"orange / neutral / green",
"designNote":"Warm decrease and cool green increase express signed change around zero. Decrease/increase is not automatically bad/good. This pairing may require non-colour support under red-green deficiencies. Same approved light colors and value direction on both themes; use readable labels, boundaries or a neutral backplate without recoloring the data.",
"anchors":["#CF5420","#F1F3EC","#3C9278"],
"knots":null,
"positions":[0,20,40],
"interpolation":"none at consumption; exact approved 41-sample sRGB lookup table",
"lut":["#CF5420","#D25D2E","#D5663A","#D76E46","#DA7750","#DC7F5A","#DE8764","#E18F6E","#E39778","#E49E82","#E6A68B","#E8AE95","#E9B69E","#EBBDA8","#ECC5B2","#EDCDBB","#EED4C5","#EFDCCF","#F0E4D8","#F1EBE2","#F1F3EC","#E8EEE6","#E0E9E0","#D7E4DA","#CEDFD4","#C6DACE","#BDD6C8","#B4D1C2","#ACCCBC","#A3C7B6","#9AC2B0","#92BDAA","#89B8A5","#80B49F","#77AF99","#6EAA94","#65A58E","#5BA088","#519C83","#47977D","#3C9278"],
"classes":{"3":["#CF5420","#F1F3EC","#3C9278"],"5":["#CF5420","#E6A68B","#F1F3EC","#9AC2B0","#3C9278"],"7":["#CF5420","#E18F6E","#EBBDA8","#F1F3EC","#B4D1C2","#80B49F","#3C9278"],"9":["#CF5420","#DC7F5A","#E6A68B","#EDCDBB","#F1F3EC","#C6DACE","#9AC2B0","#6EAA94","#3C9278"]},
"canvas":"#11191D",
"noData":"#3B4849",
"zeroOutline":"#BAC6C0",
"classificationMethod":"consumer supplied with exact thresholds and unit",
"outlierPolicy":"explicit; never silently clamp",
"scaleVersion":"07258fd1462e261aa1c2828f8ac084d4f19bc28c5c99acd3dcadc9dfbe7021fb",
"pivotMeaning":"Zero change from the named reference period or baseline.",
"themePolicy":"identical-light-values-on-both-themes"
},
{
"scaleId":"tradeoff",
"kind":"diverging",
"theme":"light",
"label":"การแลกเปลี่ยน",
"meaning":"สองทิศทางรอบค่ากลางที่ประกาศ",
"unitExample":"ค่ากลาง 0",
"use":"cost ↔ benefit",
"directionLabel":"gold / neutral / blue",
"designNote":"Gold versus blue distinguishes the two directions of a declared tradeoff. Pole lightness is balanced in the approved light-source design; neither end inherits an automatic moral judgement. Same approved light colors and value direction on both themes; use readable labels, boundaries or a neutral backplate without recoloring the data.",
"anchors":["#B79900","#F1F3EC","#739CDE"],
"knots":null,
"positions":[0,20,40],
"interpolation":"none at consumption; exact approved 41-sample sRGB lookup table",
"lut":["#B79900","#BA9E23","#BDA235","#C0A743","#C2AB4F","#C5B05B","#C8B466","#CBB970","#CEBD7A","#D1C284","#D4C68E","#D7CB98","#D9CFA1","#DCD4AB","#DFD8B4","#E2DDBD","#E5E1C7","#E8E6D0","#EBEAD9","#EEEFE3","#F1F3EC","#EAEFEC","#E4EAEB","#DEE6EB","#D7E2EA","#D1DDEA","#CAD9E9","#C4D5E9","#BED0E8","#B7CCE8","#B1C8E7","#ABC3E6","#A4BFE5","#9EBBE5","#98B6E4","#92B2E3","#8CAEE2","#85A9E1","#7FA5E0","#79A0DF","#739CDE"],
"classes":{"3":["#B79900","#F1F3EC","#739CDE"],"5":["#B79900","#D4C68E","#F1F3EC","#B1C8E7","#739CDE"],"7":["#B79900","#CBB970","#DCD4AB","#F1F3EC","#C4D5E9","#9EBBE5","#739CDE"],"9":["#B79900","#C5B05B","#D4C68E","#E2DDBD","#F1F3EC","#D1DDEA","#B1C8E7","#92B2E3","#739CDE"]},
"canvas":"#F6F7F3",
"noData":"#D5DAD6",
"zeroOutline":"#7D877F",
"classificationMethod":"consumer supplied with exact thresholds and unit",
"outlierPolicy":"explicit; never silently clamp",
"scaleVersion":"ba145b598c37bc07f269d8dc91089f15cd6074e5d4283ce76d82dc0b1e7a5d63",
"pivotMeaning":"Explicit reference or equivalence point in one commensurate signed metric; not unrelated quantities placed on opposite arms.",
"themePolicy":"identical-light-values-on-both-themes"
},
{
"scaleId":"tradeoff",
"kind":"diverging",
"theme":"dark",
"label":"การแลกเปลี่ยน",
"meaning":"สองทิศทางรอบค่ากลางที่ประกาศ",
"unitExample":"ค่ากลาง 0",
"use":"cost ↔ benefit",
"directionLabel":"gold / neutral / blue",
"designNote":"Gold versus blue distinguishes the two directions of a declared tradeoff. Pole lightness is balanced in the approved light-source design; neither end inherits an automatic moral judgement. Same approved light colors and value direction on both themes; use readable labels, boundaries or a neutral backplate without recoloring the data.",
"anchors":["#B79900","#F1F3EC","#739CDE"],
"knots":null,
"positions":[0,20,40],
"interpolation":"none at consumption; exact approved 41-sample sRGB lookup table",
"lut":["#B79900","#BA9E23","#BDA235","#C0A743","#C2AB4F","#C5B05B","#C8B466","#CBB970","#CEBD7A","#D1C284","#D4C68E","#D7CB98","#D9CFA1","#DCD4AB","#DFD8B4","#E2DDBD","#E5E1C7","#E8E6D0","#EBEAD9","#EEEFE3","#F1F3EC","#EAEFEC","#E4EAEB","#DEE6EB","#D7E2EA","#D1DDEA","#CAD9E9","#C4D5E9","#BED0E8","#B7CCE8","#B1C8E7","#ABC3E6","#A4BFE5","#9EBBE5","#98B6E4","#92B2E3","#8CAEE2","#85A9E1","#7FA5E0","#79A0DF","#739CDE"],
"classes":{"3":["#B79900","#F1F3EC","#739CDE"],"5":["#B79900","#D4C68E","#F1F3EC","#B1C8E7","#739CDE"],"7":["#B79900","#CBB970","#DCD4AB","#F1F3EC","#C4D5E9","#9EBBE5","#739CDE"],"9":["#B79900","#C5B05B","#D4C68E","#E2DDBD","#F1F3EC","#D1DDEA","#B1C8E7","#92B2E3","#739CDE"]},
"canvas":"#11191D",
"noData":"#3B4849",
"zeroOutline":"#BAC6C0",
"classificationMethod":"consumer supplied with exact thresholds and unit",
"outlierPolicy":"explicit; never silently clamp",
"scaleVersion":"ba145b598c37bc07f269d8dc91089f15cd6074e5d4283ce76d82dc0b1e7a5d63",
"pivotMeaning":"Explicit reference or equivalence point in one commensurate signed metric; not unrelated quantities placed on opposite arms.",
"themePolicy":"identical-light-values-on-both-themes"
},
{
"scaleId":"flow",
"kind":"diverging",
"theme":"light",
"label":"การไหลสุทธิ",
"meaning":"ขาออกและขาเข้ารอบค่าสุทธิศูนย์",
"unitExample":"การไหลสุทธิตัวอย่าง",
"use":"out-migration ↔ in-migration · closures ↔ openings",
"directionLabel":"coral / neutral / teal",
"designNote":"Coral outflow and teal inflow keep directional movement distinct from accumulated activity. Use arrows, signed labels and explicit boundary/time units. Same approved light colors and value direction on both themes; use readable labels, boundaries or a neutral backplate without recoloring the data.",
"anchors":["#C95368","#F1F3EC","#2E9095"],
"knots":null,
"positions":[0,20,40],
"interpolation":"none at consumption; exact approved 41-sample sRGB lookup table",
"lut":["#C95368","#CC5C6E","#CF6474","#D26D7B","#D57581","#D77D87","#DA858E","#DC8D94","#DF959B","#E19DA1","#E3A5A8","#E5ACAE","#E7B4B5","#E8BCBC","#EAC4C3","#ECCCC9","#EDD4D0","#EEDBD7","#EFE3DE","#F0EBE5","#F1F3EC","#E8EEE8","#DFE9E3","#D6E4DF","#CDDFDA","#C4DAD6","#BBD5D1","#B2D0CD","#A9CBC9","#A0C6C4","#97C1C0","#8DBCBC","#84B7B7","#7BB2B3","#71ADAF","#67A8AA","#5DA4A6","#539FA2","#489A9D","#3C9599","#2E9095"],
"classes":{"3":["#C95368","#F1F3EC","#2E9095"],"5":["#C95368","#E3A5A8","#F1F3EC","#97C1C0","#2E9095"],"7":["#C95368","#DC8D94","#E8BCBC","#F1F3EC","#B2D0CD","#7BB2B3","#2E9095"],"9":["#C95368","#D77D87","#E3A5A8","#ECCCC9","#F1F3EC","#C4DAD6","#97C1C0","#67A8AA","#2E9095"]},
"canvas":"#F6F7F3",
"noData":"#D5DAD6",
"zeroOutline":"#7D877F",
"classificationMethod":"consumer supplied with exact thresholds and unit",
"outlierPolicy":"explicit; never silently clamp",
"scaleVersion":"74619cfd484c3894314a693d103dda5987a8ef0e46f445663b4703b72caff223",
"pivotMeaning":"Zero net flow over the same time interval and boundary.",
"themePolicy":"identical-light-values-on-both-themes"
},
{
"scaleId":"flow",
"kind":"diverging",
"theme":"dark",
"label":"การไหลสุทธิ",
"meaning":"ขาออกและขาเข้ารอบค่าสุทธิศูนย์",
"unitExample":"การไหลสุทธิตัวอย่าง",
"use":"out-migration ↔ in-migration · closures ↔ openings",
"directionLabel":"coral / neutral / teal",
"designNote":"Coral outflow and teal inflow keep directional movement distinct from accumulated activity. Use arrows, signed labels and explicit boundary/time units. Same approved light colors and value direction on both themes; use readable labels, boundaries or a neutral backplate without recoloring the data.",
"anchors":["#C95368","#F1F3EC","#2E9095"],
"knots":null,
"positions":[0,20,40],
"interpolation":"none at consumption; exact approved 41-sample sRGB lookup table",
"lut":["#C95368","#CC5C6E","#CF6474","#D26D7B","#D57581","#D77D87","#DA858E","#DC8D94","#DF959B","#E19DA1","#E3A5A8","#E5ACAE","#E7B4B5","#E8BCBC","#EAC4C3","#ECCCC9","#EDD4D0","#EEDBD7","#EFE3DE","#F0EBE5","#F1F3EC","#E8EEE8","#DFE9E3","#D6E4DF","#CDDFDA","#C4DAD6","#BBD5D1","#B2D0CD","#A9CBC9","#A0C6C4","#97C1C0","#8DBCBC","#84B7B7","#7BB2B3","#71ADAF","#67A8AA","#5DA4A6","#539FA2","#489A9D","#3C9599","#2E9095"],
"classes":{"3":["#C95368","#F1F3EC","#2E9095"],"5":["#C95368","#E3A5A8","#F1F3EC","#97C1C0","#2E9095"],"7":["#C95368","#DC8D94","#E8BCBC","#F1F3EC","#B2D0CD","#7BB2B3","#2E9095"],"9":["#C95368","#D77D87","#E3A5A8","#ECCCC9","#F1F3EC","#C4DAD6","#97C1C0","#67A8AA","#2E9095"]},
"canvas":"#11191D",
"noData":"#3B4849",
"zeroOutline":"#BAC6C0",
"classificationMethod":"consumer supplied with exact thresholds and unit",
"outlierPolicy":"explicit; never silently clamp",
"scaleVersion":"74619cfd484c3894314a693d103dda5987a8ef0e46f445663b4703b72caff223",
"pivotMeaning":"Zero net flow over the same time interval and boundary.",
"themePolicy":"identical-light-values-on-both-themes"
},
{
"scaleId":"sentiment",
"kind":"diverging",
"theme":"light",
"label":"ความคิดเห็น",
"meaning":"สองทิศทางรอบค่ากลางของวิธีวัด",
"unitExample":"คะแนนตัวอย่าง",
"use":"negative ↔ positive",
"directionLabel":"rose / neutral / leaf",
"designNote":"Rose versus leaf expresses an explicitly measured negative/positive scale. Sentiment never substitutes for lived behaviour or population-wide conclusions; non-colour sign cues are required. Same approved light colors and value direction on both themes; use readable labels, boundaries or a neutral backplate without recoloring the data.",
"anchors":["#C95170","#F1F3EC","#49944D"],
"knots":null,
"positions":[0,20,40],
"interpolation":"none at consumption; exact approved 41-sample sRGB lookup table",
"lut":["#C95170","#CC5A76","#CF637C","#D26B82","#D57387","#D77C8D","#DA8493","#DC8C9A","#DF94A0","#E19CA6","#E3A4AC","#E5ACB2","#E7B4B8","#E9BBBF","#EAC3C5","#ECCBCC","#EDD3D2","#EEDBD8","#EFE3DF","#F0EBE5","#F1F3EC","#E9EEE4","#E0E9DC","#D8E5D3","#D0E0CB","#C7DBC3","#BFD6BB","#B7D2B3","#AFCDAB","#A6C8A3","#9EC39C","#96BF94","#8EBA8C","#86B584","#7DB07C","#75AC74","#6CA76D","#64A265","#5B9D5D","#529955","#49944D"],
"classes":{"3":["#C95170","#F1F3EC","#49944D"],"5":["#C95170","#E3A4AC","#F1F3EC","#9EC39C","#49944D"],"7":["#C95170","#DC8C9A","#E9BBBF","#F1F3EC","#B7D2B3","#86B584","#49944D"],"9":["#C95170","#D77C8D","#E3A4AC","#ECCBCC","#F1F3EC","#C7DBC3","#9EC39C","#75AC74","#49944D"]},
"canvas":"#F6F7F3",
"noData":"#D5DAD6",
"zeroOutline":"#7D877F",
"classificationMethod":"consumer supplied with exact thresholds and unit",
"outlierPolicy":"explicit; never silently clamp",
"scaleVersion":"bcbe65abab40b63e76055d9173d1b24ad4f34890a144c10cb1ec0520a9c9b1a1",
"pivotMeaning":"The method-defined neutral sentiment score; not missing opinion or no response.",
"themePolicy":"identical-light-values-on-both-themes"
},
{
"scaleId":"sentiment",
"kind":"diverging",
"theme":"dark",
"label":"ความคิดเห็น",
"meaning":"สองทิศทางรอบค่ากลางของวิธีวัด",
"unitExample":"คะแนนตัวอย่าง",
"use":"negative ↔ positive",
"directionLabel":"rose / neutral / leaf",
"designNote":"Rose versus leaf expresses an explicitly measured negative/positive scale. Sentiment never substitutes for lived behaviour or population-wide conclusions; non-colour sign cues are required. Same approved light colors and value direction on both themes; use readable labels, boundaries or a neutral backplate without recoloring the data.",
"anchors":["#C95170","#F1F3EC","#49944D"],
"knots":null,
"positions":[0,20,40],
"interpolation":"none at consumption; exact approved 41-sample sRGB lookup table",
"lut":["#C95170","#CC5A76","#CF637C","#D26B82","#D57387","#D77C8D","#DA8493","#DC8C9A","#DF94A0","#E19CA6","#E3A4AC","#E5ACB2","#E7B4B8","#E9BBBF","#EAC3C5","#ECCBCC","#EDD3D2","#EEDBD8","#EFE3DF","#F0EBE5","#F1F3EC","#E9EEE4","#E0E9DC","#D8E5D3","#D0E0CB","#C7DBC3","#BFD6BB","#B7D2B3","#AFCDAB","#A6C8A3","#9EC39C","#96BF94","#8EBA8C","#86B584","#7DB07C","#75AC74","#6CA76D","#64A265","#5B9D5D","#529955","#49944D"],
"classes":{"3":["#C95170","#F1F3EC","#49944D"],"5":["#C95170","#E3A4AC","#F1F3EC","#9EC39C","#49944D"],"7":["#C95170","#DC8C9A","#E9BBBF","#F1F3EC","#B7D2B3","#86B584","#49944D"],"9":["#C95170","#D77C8D","#E3A4AC","#ECCBCC","#F1F3EC","#C7DBC3","#9EC39C","#75AC74","#49944D"]},
"canvas":"#11191D",
"noData":"#3B4849",
"zeroOutline":"#BAC6C0",
"classificationMethod":"consumer supplied with exact thresholds and unit",
"outlierPolicy":"explicit; never silently clamp",
"scaleVersion":"bcbe65abab40b63e76055d9173d1b24ad4f34890a144c10cb1ec0520a9c9b1a1",
"pivotMeaning":"The method-defined neutral sentiment score; not missing opinion or no response.",
"themePolicy":"identical-light-values-on-both-themes"
},
{
"scaleId":"anomaly",
"kind":"diverging",
"theme":"light",
"label":"ความผิดปกติ",
"meaning":"ต่ำกว่าหรือสูงกว่าค่าอ้างอิง",
"unitExample":"ส่วนต่างจากฐาน 0",
"use":"below normal (cool/dry) ↔ above normal (hot/wet)",
"directionLabel":"blue / neutral / red",
"designNote":"Blue below-reference and red above-reference remain familiar directional cues. The sign is not itself evidence of danger; show the reference and anomaly unit. Same approved light colors and value direction on both themes; use readable labels, boundaries or a neutral backplate without recoloring the data.",
"anchors":["#4084C7","#F1F3EC","#D44C3A"],
"knots":null,
"positions":[0,20,40],
"interpolation":"none at consumption; exact approved 41-sample sRGB lookup table",
"lut":["#4084C7","#4A8AC9","#538FCB","#5C95CE","#659BD0","#6EA0D2","#77A6D4","#80ABD6","#88B1D8","#91B6DA","#9ABCDC","#A2C1DE","#ABC7DF","#B4CCE1","#BCD2E3","#C5D7E4","#CEDDE6","#D7E2E8","#DFE8E9","#E8EDEB","#F1F3EC","#F1EBE3","#F1E3DA","#F1DBD1","#F0D3C8","#EFCBBF","#EFC3B6","#EEBBAD","#ECB3A4","#EBAB9C","#EAA393","#E89B8A","#E69382","#E58B79","#E38270","#E17A67","#DE715F","#DC6956","#D95F4D","#D75644","#D44C3A"],
"classes":{"3":["#4084C7","#F1F3EC","#D44C3A"],"5":["#4084C7","#9ABCDC","#F1F3EC","#EAA393","#D44C3A"],"7":["#4084C7","#80ABD6","#B4CCE1","#F1F3EC","#EEBBAD","#E58B79","#D44C3A"],"9":["#4084C7","#6EA0D2","#9ABCDC","#C5D7E4","#F1F3EC","#EFCBBF","#EAA393","#E17A67","#D44C3A"]},
"canvas":"#F6F7F3",
"noData":"#D5DAD6",
"zeroOutline":"#7D877F",
"classificationMethod":"consumer supplied with exact thresholds and unit",
"outlierPolicy":"explicit; never silently clamp",
"scaleVersion":"ce049a1cab0b28bfb299b9961ca80d1652974e6ec0b316abee070d3a2567d46e",
"pivotMeaning":"Zero deviation from a named reference, expected value or standardized norm.",
"themePolicy":"identical-light-values-on-both-themes"
},
{
"scaleId":"anomaly",
"kind":"diverging",
"theme":"dark",
"label":"ความผิดปกติ",
"meaning":"ต่ำกว่าหรือสูงกว่าค่าอ้างอิง",
"unitExample":"ส่วนต่างจากฐาน 0",
"use":"below normal (cool/dry) ↔ above normal (hot/wet)",
"directionLabel":"blue / neutral / red",
"designNote":"Blue below-reference and red above-reference remain familiar directional cues. The sign is not itself evidence of danger; show the reference and anomaly unit. Same approved light colors and value direction on both themes; use readable labels, boundaries or a neutral backplate without recoloring the data.",
"anchors":["#4084C7","#F1F3EC","#D44C3A"],
"knots":null,
"positions":[0,20,40],
"interpolation":"none at consumption; exact approved 41-sample sRGB lookup table",
"lut":["#4084C7","#4A8AC9","#538FCB","#5C95CE","#659BD0","#6EA0D2","#77A6D4","#80ABD6","#88B1D8","#91B6DA","#9ABCDC","#A2C1DE","#ABC7DF","#B4CCE1","#BCD2E3","#C5D7E4","#CEDDE6","#D7E2E8","#DFE8E9","#E8EDEB","#F1F3EC","#F1EBE3","#F1E3DA","#F1DBD1","#F0D3C8","#EFCBBF","#EFC3B6","#EEBBAD","#ECB3A4","#EBAB9C","#EAA393","#E89B8A","#E69382","#E58B79","#E38270","#E17A67","#DE715F","#DC6956","#D95F4D","#D75644","#D44C3A"],
"classes":{"3":["#4084C7","#F1F3EC","#D44C3A"],"5":["#4084C7","#9ABCDC","#F1F3EC","#EAA393","#D44C3A"],"7":["#4084C7","#80ABD6","#B4CCE1","#F1F3EC","#EEBBAD","#E58B79","#D44C3A"],"9":["#4084C7","#6EA0D2","#9ABCDC","#C5D7E4","#F1F3EC","#EFCBBF","#EAA393","#E17A67","#D44C3A"]},
"canvas":"#11191D",
"noData":"#3B4849",
"zeroOutline":"#BAC6C0",
"classificationMethod":"consumer supplied with exact thresholds and unit",
"outlierPolicy":"explicit; never silently clamp",
"scaleVersion":"ce049a1cab0b28bfb299b9961ca80d1652974e6ec0b316abee070d3a2567d46e",
"pivotMeaning":"Zero deviation from a named reference, expected value or standardized norm.",
"themePolicy":"identical-light-values-on-both-themes"
}
]
},
"contracts":{
"componentContracts":{
"schemaVersion":"1.2",
"releaseRef":"v0.9.7-owner.1",
"status":"active",
"shape":"format-implementation.schema.json#/$defs/componentContract",
"note":"Current standalone 0.9.7 component contracts. Stable component IDs preserve exact format/runtime behavior; six evidence states and exact color-srgb-10 classes replace superseded state and color clauses.",
"contracts":[
{
"formatProfile":"web_public",
"runtime":"browser",
"contract":{
"componentId":"component.evidence-card.01",
"componentClass":"evidence_card",
"governingRuleIds":["EVID-05","EVIDENCE-01","CLAIM-MACHINE-01","COLOR-01","A11Y-01"],
"purpose":"Present one governed value with its state, dataset, source, date, boundary, limitation, permanent URL and receipt id so that a third-party AI answer or a link preview carries provenance the reader can verify.",
"nonPurpose":"It is not a decision card, not a chart, not identity, and never a control; it makes no claim beyond the bound claim record.",
"semanticRoles":["figure","definition_list","link"],
"contentContract":"Props value, unit, state (one of six EVID-05 states: measured, measured_zero, no_data, out_of_scope, suppressed, not_yet), dataset, source, asOf, boundary, limitation, url, receipt; Thai and English label sets; the 3px four-colour rule and the 3 × 3px measure line are decorative and aria-hidden; the one-line text fallback repeats every field in order.",
"localeStressFixtureIds":["format.web.public.01.08","target.web.responsive.360-1600.01.fixture.thai-latin-stress"],
"states":{
"default":{"status":"required","behavior":"Value, unit, state glyph and label, dataset, source, as-of date, boundary, limitation, permanent link and receipt id are visible on one card without truncation at 320px width."},
"hover":{"status":"not_applicable","behavior":"Hover adds no information."},
"focus":{"status":"required","behavior":"The permanent link is the only focusable element and shows the governed focus ring."},
"activePressed":{"status":"not_applicable","behavior":"The card is not pressable."},
"selectedCurrent":{"status":"not_applicable","behavior":"The card carries no selection state."},
"disabled":{"status":"not_applicable","behavior":"An unavailable claim blocks emission instead of rendering a disabled card."},
"loading":{"status":"not_applicable","behavior":"The card renders only from a resolved claim record."},
"empty":{"status":"required","behavior":"A value in state no_data, out_of_scope, suppressed or not_yet renders its glyph, reason and latest available value or expected date; the card never renders an empty value slot."},
"error":{"status":"not_applicable","behavior":"A record that fails to resolve blocks the card."},
"success":{"status":"not_applicable","behavior":"Following the link is not a success state."}
},
"formatBehavior":{"formatProfile":"web_public","behavior":"Inline HTML with a one-line text fallback in the same DOM order; no logo, panel, gradient, motif or motion; the card survives copy-paste as plain text."},
"accessibility":{"name":"The card's accessible name is the value with unit and state in the reader's locale.","role":"figure with a definition list; the link is a native anchor.","value":"State is exposed as text, not colour or glyph alone.","order":"value → state → dataset → source → date → boundary → limitation → link → receipt.","status":"No live region; the card is static content."},
"tokenRefs":["tokens.v0.9.7.json#/dataState/valueStates","tokens.v0.9.7.json#/evidenceCard","tokens.v0.9.7.json#/foundation/text.metadata","tokens.v0.9.7.json#/foundation/border.hairline"],
"evidencePermissionBoundary":"Every field comes from the bound claim record and its evidence capture; the card never widens scope, certainty or permission.",
"acceptanceFixtureIds":["EVID-05-A","EVID-05-B","EVID-05-C","EVIDENCE-01-A","accessibility.web.contrast"],
"antiPatterns":["Logo or gradient on the card","N/A or bare dash","Value without state","Rounded estimate presented as measured","Link that is not permanent","Motion or motif on the card","Decorative bracket highlight or colored left-rail accent"]
}
},
{
"formatProfile":"web_public",
"runtime":"browser",
"contract":{
"componentId":"component.motif-frame.01",
"componentClass":"motif_frame",
"governingRuleIds":["MOTION-04","MOTIF-01","MOTIF-02","MOTIF-03","MOTIF-04","MOTIF-05","MOTIF-06","MOTION-01","MEDIA-01","A11Y-01"],
"purpose":"Mount one registered motif (dial, rings, layers, slice, cultivate or the logo assembly) from the exact motif.v3 runtime bytes with a declared job and beat, replay it while visible under OWNER-MOTION-01 through the page's MotionController, and hold the governed final-state SVG everywhere else.",
"nonPurpose":"It is not identity of record, not navigation, not a favicon, not evidence, never a control, and never a product overlay (overlays use their own registered runtime).",
"semanticRoles":["presentation"],
"contentContract":"Attributes data-kind (dial|rings|layers|slice|cultivate|logo), data-job (one of the kind's allowedJobs in motif-register.v0.9.7.json; any other value throws and preflight fails), data-beat (opening|transition|closing, matching the kind), data-variant (full|quiet; the light-theme variant), data-variant-dark (optional, quiet only: MOTIF-06 theme swap), data-host-surface (required: a carrier id from motif-register.v0.9.7.json#/carrierPolicy/carriers, themed ids checked per rendered theme, <id>@light|@dark for a fixed ground; the pair must be in carrierPolicy.allowed or the frame is refused and not rendered), data-cycle-ms (≥ 2000; logo 6000); wraps <lm-motif kind=… autoplay=\"false\" [quiet] [ink=\"blue\" for full]> with the kind's final-state SVG in <noscript> (both SVGs in .lds-motif-noscript wrappers, data-theme-variant=\"light|dark\", when data-variant-dark is set); the frame paints invariant and theme-fixed carriers itself and compares the rendered ground behind it with the declared carrier; the frame owns one IntersectionObserver (threshold 0.14, rootMargin 0px 0px -8% 0px), calls play() on enter and every cycle while visible, clears the timer on exit, and subscribes to the page-level MotionController.",
"localeStressFixtureIds":[],
"states":{
"default":{"status":"required","behavior":"The final state is visible before JavaScript runs and after every cycle."},
"hover":{"status":"not_applicable","behavior":"Hover does not start or stop the cycle."},
"focus":{"status":"not_applicable","behavior":"The element is aria-hidden and not focusable."},
"activePressed":{"status":"not_applicable","behavior":"Not pressable."},
"selectedCurrent":{"status":"not_applicable","behavior":"No selection state."},
"disabled":{"status":"not_applicable","behavior":"Pause is a page-level control, not a component state."},
"loading":{"status":"not_applicable","behavior":"If the runtime never loads the static SVG stays in place (fail-open)."},
"empty":{"status":"not_applicable","behavior":"No content."},
"error":{"status":"required","behavior":"A MOTIF-06 refusal (carrier not allowed, ink without a governed record, rendered ground ≠ declared carrier, invalid swap) removes the frame from rendering (ladder rung L5) and logs the code; a runtime or SVG hash mismatch, an unregistered job or a forbidden region blocks delivery."},
"success":{"status":"not_applicable","behavior":"Not applicable."}
},
"formatBehavior":{"formatProfile":"web_public","behavior":"Browser only; document, PDF and deck rendered in a browser may mount it; exported static files, email and social creatives use the final-state SVG of the same kind and variant."},
"accessibility":{"name":"None; aria-hidden decorative motion.","role":"presentation","value":"None.","order":"Not in the reading order.","status":"prefers-reduced-motion holds the final state; pause shows the complete final state."},
"tokenRefs":["tokens.v0.9.7.json#/motion/identity","tokens.v0.9.7.json#/motion/motifs","tokens.v0.9.7.json#/motion/motifs/carrierPolicy","tokens.v0.9.7.json#/motion/repetition","tokens.v0.9.7.json#/brand/blue","tokens.v0.9.7.json#/brand/beige","tokens.v0.9.7.json#/foundation"],
"evidencePermissionBoundary":"Motion carries no meaning; identity of record remains the approved PNG files; product overlays remain separate.",
"acceptanceFixtureIds":["MOTION-04-A","MOTION-04-B","MOTION-04-C","MOTIF-01-A","MOTIF-02-A","MOTIF-03-A","MOTIF-03-B","MOTIF-04-A","MOTIF-06-A","MOTIF-06-B","MOTION-01-B","accessibility.web.reduced-motion"],
"antiPatterns":["Editing runtime bytes","loop attribute without a viewport check","animation-iteration-count: infinite","Sampled wedge hex","Motif as favicon or OG image","Motif over the first answer, primary proof or primary action","A job outside the kind's allowedJobs","More than three moments on a route","Mixing a product overlay with a shared motif in one lockup","A full variant on Brand Blue, a dark surface or an atmosphere","A quiet variant on a light surface","A frame without data-host-surface","A declared carrier that differs from the painted ground","ink=\"beige\" or another ink without a governed file","Recolouring, plating or scrimming a motif to make it legible","Decorative bracket highlight or colored left-rail accent"]
}
},
{
"formatProfile":"web_public",
"runtime":"browser",
"contract":{
"componentId":"component.motion-controller.01",
"componentClass":"motion_controller",
"governingRuleIds":["MOTION-04","MOTIF-03","MOTION-01","A11Y-01","CTRL-01"],
"purpose":"Provide the single page-level pause/resume control that every MotifFrame (and any other OWNER-MOTION-01 replay) subscribes to; pause holds every motif at its complete final state, resume restarts cycles only for frames still at least 14% visible.",
"nonPurpose":"It is not a per-component toggle, not a preference store beyond the page, and never hides content.",
"semanticRoles":["button"],
"contentContract":"One <button class=\"lds-motion-pause\" type=\"button\" aria-pressed=\"false\"> per page with data-label-pause / data-label-resume in the page locale; exposes window.LandometerMotion { pause(), resume(), paused, subscribe(fn) }; MotifFrames register on connect and unregister on disconnect.",
"localeStressFixtureIds":["format.web.public.01.08"],
"states":{"default":{"status":"required","behavior":"Visible, reachable control with the pause label."},"hover":{"status":"required","behavior":"Governed hover treatment; no motion."},"focus":{"status":"required","behavior":"Governed focus ring; keyboard operable."},"activePressed":{"status":"required","behavior":"aria-pressed true while paused; label switches to resume."},"selectedCurrent":{"status":"not_applicable","behavior":"Not applicable."},"disabled":{"status":"not_applicable","behavior":"Never disabled; with no motion on the page the control is omitted, not disabled."},"loading":{"status":"not_applicable","behavior":"Not applicable."},"empty":{"status":"not_applicable","behavior":"Not applicable."},"error":{"status":"not_applicable","behavior":"Not applicable."},"success":{"status":"not_applicable","behavior":"Not applicable."}},
"formatBehavior":{"formatProfile":"web_public","behavior":"Browser only; static formats have no control because nothing moves."},
"accessibility":{"name":"Pause motion / Resume motion in the page locale.","role":"button with aria-pressed","value":"Pressed state reflects paused.","order":"Before the first MotifFrame in reading order or in the page utility bar.","status":"State change is announced through aria-pressed."},
"tokenRefs":["tokens.v0.9.7.json#/motion/repetition","tokens.v0.9.7.json#/control"],
"evidencePermissionBoundary":"None; the control carries no product meaning.",
"acceptanceFixtureIds":["MOTION-04-B","MOTIF-03-A","MOTIF-03-B","A11Y-01-A"],
"antiPatterns":["More than one controller per page","A controller that hides motifs instead of holding final state","Pause state persisted across pages without user intent","Decorative bracket highlight or colored left-rail accent"]
}
},
{
"formatProfile":"web_public",
"runtime":"browser",
"contract":{
"componentId":"component.data-table.01",
"componentClass":"data_table",
"governingRuleIds":["EVID-05","EVIDENCE-01","A11Y-01","FORMAT-PARITY-01"],
"purpose":"Present governed rows with a caption, headers, numeric alignment, a mobile strategy, and a cellStates prop that renders each value's EVID-05 state.",
"nonPurpose":"It is not a chart and does not compute or normalise values.",
"semanticRoles":["table","caption"],
"contentContract":"Props caption, columns, rows, cellStates: one of measured, measured_zero, no_data, out_of_scope, suppressed, not_yet for every governed value. measured is a finite nonzero number; measured_zero is exactly 0; exceptional states carry null. noDataLabel remains a deprecated alias of no_data; show glyph plus reason in text.metadata, sort no_data last, show suppression threshold or expected date as applicable. Metadata/provenance requirements remain governed by the claim contract.",
"localeStressFixtureIds":["format.web.public.01.08"],
"states":{
"default":{"status":"required","behavior":"Caption, headers and aligned numeric cells with units."},
"hover":{"status":"not_applicable","behavior":"Hover adds no information."},
"focus":{"status":"required","behavior":"Sortable headers, when present, are native buttons with visible focus."},
"activePressed":{"status":"not_applicable","behavior":"Not applicable beyond native button behaviour."},
"selectedCurrent":{"status":"required","behavior":"Sorted column is announced and marked without colour alone."},
"disabled":{"status":"not_applicable","behavior":"Unavailable sort is omitted, not disabled."},
"loading":{"status":"required","behavior":"A loading table keeps its caption and headers and states that rows are loading."},
"empty":{"status":"required","behavior":"An empty result states what is unavailable, why, and the next action; it never renders 0 or N/A."},
"error":{"status":"required","behavior":"A failed load keeps the last good rows if any and states what failed."},
"success":{"status":"not_applicable","behavior":"Not applicable."}
},
"formatBehavior":{"formatProfile":"web_public","behavior":"Native table; on narrow viewports rows stack with header labels repeated; states keep glyph and reason in every layout."},
"accessibility":{"name":"Caption is the accessible name.","role":"table","value":"State cells expose the state label as text.","order":"Source order.","status":"Sort changes are announced politely."},
"tokenRefs":["tokens.v0.9.7.json#/dataState/valueStates","tokens.v0.9.7.json#/foundation/text.metadata","tokens.v0.9.7.json#/typography"],
"evidencePermissionBoundary":"Rows come from bound claim/evidence IDs; the table never widens scope.",
"acceptanceFixtureIds":["EVID-05-A","EVID-05-B","A11Y-01-A"],
"antiPatterns":["N/A","Bare dash","Missing rendered as 0","State by colour alone","text.muted for state labels","Decorative bracket highlight or colored left-rail accent"]
}
},
{
"formatProfile":"web_public",
"runtime":"browser",
"contract":{
"componentId":"component.map-legend.01",
"componentClass":"map_legend",
"governingRuleIds":["MAP-01","DATAVIZ-02","DATAVIZ-03","EVID-05","A11Y-01"],
"purpose":"Explain a map overlay: layer, method, classes with units and denominator, and one row per present value state (noData, zero, outOfScope, suppressed, notYet), plus source, date and limitation.",
"nonPurpose":"It is not a control panel and does not restate claims beyond the bound record.",
"semanticRoles":["figure","list"],
"contentContract":"Props layer, method, classes from the exact color-srgb-10 family and theme LUT (3, 5, 7 or 9 samples at round(i*40/(n-1))), unit with denominator, present states drawn from all six EVID-05 states, source, asOf and limitation. No runtime interpolation or light-to-dark formula. State rows show the applicable swatch/pattern, glyph and label in text.metadata; measured values retain units and analytical classes.",
"localeStressFixtureIds":["format.web.public.01.08"],
"states":{"default":{"status":"required","behavior":"Classes, unit with denominator, present state rows, source, date and limitation are visible."},"hover":{"status":"not_applicable","behavior":"Hover adds no information."},"focus":{"status":"not_applicable","behavior":"The legend is static content."},"activePressed":{"status":"not_applicable","behavior":"Not applicable."},"selectedCurrent":{"status":"not_applicable","behavior":"Not applicable."},"disabled":{"status":"not_applicable","behavior":"Not applicable."},"loading":{"status":"required","behavior":"A loading legend keeps its layer name and states that classes are loading."},"empty":{"status":"required","behavior":"A layer with no rendered data shows the out_of_scope statement instead of an empty ramp."},"error":{"status":"required","behavior":"A failed layer states what failed and keeps the last good legend if any."},"success":{"status":"not_applicable","behavior":"Not applicable."}},
"formatBehavior":{"formatProfile":"web_public","behavior":"Inline figure adjacent to the map; static formats render the same rows beside the exported map."},
"accessibility":{"name":"Layer name is the accessible name.","role":"figure with a list","value":"Class ranges and state labels as text.","order":"classes → states → source → date → limitation.","status":"None."},
"tokenRefs":["tokens.v0.9.7.json#/analyticalScales","tokens.v0.9.7.json#/dataState/valueStates","tokens.v0.9.7.json#/map"],
"evidencePermissionBoundary":"Legend text comes from the bound map overlay config; coverage is never implied beyond evidence.",
"acceptanceFixtureIds":["MAP-01-A","DATAVIZ-02-A","DATAVIZ-03-A","EVID-05-A","EVID-05-B"],
"antiPatterns":["Two families of one zone on one map","Missing rendered as lowest class","State rows omitted when the state occurs","Denominator omitted from the unit","Hand-typed dark class colours","A class anchor inside a retired hue window","Decorative bracket highlight or colored left-rail accent"]
}
}
]
},
"formatPacks":{
"schemaVersion":"1.7",
"releaseRef":"v0.9.7-owner.1",
"status":"active",
"resolution":{"rule":"Resolve exactly one base format pack from output.formatProfile, one primary experience rule set, every declared secondary experience rule set, and only declared capability requirements from the Build Card.","visualSamenessRequired":false,"semanticParityRequired":true,"unknownProfileBehavior":"block"},
"testIdPolicy":{
"scheme":"scope_id_plus_one_based_matrix_index",
"commonPrefix":"common",
"experiencePrefix":"experience",
"formatPrefix":"format",
"capabilityPrefix":"capability",
"targetPrefix":"target",
"kitPrefix":"kit",
"accessibilityPrefix":"accessibility",
"derivation":{"common":"common.{two-digit one-based commonTestMatrix index}","experience":"experience.{profile}.{two-digit one-based experienceProfileTestMatrix index}","format":"format.{pack id}.{two-digit one-based pack testMatrix index}; runtime-specific additions use format.{pack id}.runtime.{runtime}.{two-digit one-based testMatrixByRuntime index}","capability":"capability.{overlay id}.{two-digit one-based overlay testMatrix index}; runtime-class additions use capability.{overlay id}.runtime.{runtime class}.{two-digit one-based testMatrixByRuntimeClass index}","target":"{target profile id}.fixture.{exact requiredFixtures value}","kit":"{format kit id}.control.{two-digit one-based requiredImplementationControls index}","accessibility":"use the exact ID from accessibilityFixtureIdsByConformanceVariant[formatProfile.runtime]","portability":"use the exact ordered IDs derived from the selected authoring platform's native font mappings, identity typography binding, and non-web icon policy"},
"resolutionOrder":["common","primary_experience","secondary_experience_in_declared_order","format","capability_in_declared_order","target","kit","accessibility","platform_portability"]
},
"accessibilityFixtureIdsByConformanceVariant":{
"web_public.browser":["accessibility.web.keyboard","accessibility.web.screen-reader","accessibility.web.zoom-200","accessibility.web.reflow-400","accessibility.web.reduced-motion"],
"app_interactive.browser":["accessibility.app.browser.keyboard","accessibility.app.browser.screen-reader","accessibility.app.browser.touch","accessibility.app.browser.state-recovery","accessibility.app.browser.zoom-200","accessibility.app.browser.reflow-400","accessibility.app.browser.reduced-motion"],
"app_interactive.native":["accessibility.app.native.keyboard","accessibility.app.native.accessibility-api","accessibility.app.native.touch","accessibility.app.native.state-recovery","accessibility.app.native.dynamic-type-200","accessibility.app.native.safe-area-interruption","accessibility.app.native.reduced-motion"],
"document_flow.static":["accessibility.document.native-structure","accessibility.document.reading-order","accessibility.document.links","accessibility.document.thai-latin","accessibility.document.pdf-export"],
"pdf_fixed.static":["accessibility.pdf.tags-order","accessibility.pdf.alternatives","accessibility.pdf.text-extraction","accessibility.pdf.links-bookmarks","accessibility.pdf.print"],
"deck_presentation.static":["accessibility.deck.alt-reading-order","accessibility.deck.distance-legibility","accessibility.deck.thai-latin","accessibility.deck.links-qr","accessibility.deck.pdf-export"],
"social_static.static":["accessibility.social.contrast-legibility","accessibility.social.safe-area","accessibility.social.thai-latin","accessibility.social.crop","accessibility.social.destination-cue"]
},
"accessibilityFixtureCriteria":{
"accessibility.web.keyboard":"Every interactive control, disclosure, navigation target, and CTA is operable in a logical keyboard sequence without a keyboard trap.",
"accessibility.web.screen-reader":"Initial HTML exposes the same headings, landmarks, names, states, relationships, claims, limitations, and actions to a screen reader as the visible page.",
"accessibility.web.zoom-200":"At 200 percent zoom, content and controls remain readable, operable, complete, and free from obstructive overlap.",
"accessibility.web.reflow-400":"At 400 percent reflow, primary meaning and actions remain available without two-dimensional scrolling except for intrinsically two-dimensional content.",
"accessibility.web.reduced-motion":"Reduced-motion and failed-observer states expose the stable final content and preserve every task and deep-link target.",
"accessibility.app.browser.keyboard":"In the browser runtime, every task control and state transition is keyboard operable with logical focus order and no keyboard trap.",
"accessibility.app.browser.screen-reader":"In the browser runtime, headings, landmarks, control names, permissions, progress, results, errors, and recovery are programmatically exposed and announced.",
"accessibility.app.browser.touch":"In the browser runtime, every direct touch control meets the governed target size and remains operable without precision gestures.",
"accessibility.app.browser.state-recovery":"In the browser runtime, interrupted, failed, denied, expired, revoked, and cancelled states preserve recoverable input and expose an understandable next step.",
"accessibility.app.browser.zoom-200":"At 200 percent browser zoom, task content and controls remain readable, operable, complete, and free from obstructive overlap.",
"accessibility.app.browser.reflow-400":"At 400 percent browser reflow, the complete task and recovery path remain available without two-dimensional scrolling except for intrinsically two-dimensional content.",
"accessibility.app.browser.reduced-motion":"In the browser runtime, reduced-motion and failed-observer states preserve task state, causality, progress, and the same reachable final result.",
"accessibility.app.native.keyboard":"In the declared native runtime, every keyboard-supported task control and state transition follows platform focus order without a trap.",
"accessibility.app.native.accessibility-api":"In the declared native runtime, task structure, control names, permissions, progress, results, errors, and recovery are exposed through the platform accessibility API and announced.",
"accessibility.app.native.touch":"In the declared native runtime, every direct touch control meets the governed platform target size and remains operable without precision gestures.",
"accessibility.app.native.state-recovery":"In the declared native runtime, interrupted, failed, denied, expired, revoked, cancelled, backgrounded, restored, and view-disposed states preserve recoverable input, semantic native-view order, platform accessibility traversal order, and an understandable next step.",
"accessibility.app.native.dynamic-type-200":"At the governed 200 percent platform text-scaling fixture, task content and controls remain readable, operable, complete, and free from clipping or obstruction.",
"accessibility.app.native.safe-area-interruption":"Across the governed native safe-area and interruption fixture, essential content, focus, progress, and recovery remain visible and operable.",
"accessibility.app.native.reduced-motion":"In the declared native runtime, reduced-motion and interrupted-transition states preserve task state, causality, progress, and the same reachable final result.",
"accessibility.document.native-structure":"The native document uses real title, heading, paragraph, list, table, caption, note, and link structures where those roles occur.",
"accessibility.document.reading-order":"Native reading order exactly preserves the intended section, figure, table, note, and action sequence.",
"accessibility.document.links":"Every document link and cross-reference has a descriptive label and resolves to its declared destination.",
"accessibility.document.thai-latin":"Thai and Latin text remains readable, selectable, correctly ordered, and free of missing or substituted glyphs.",
"accessibility.document.pdf-export":"The governed PDF export preserves document meaning, reading order, alternatives, links, evidence, and material limitations.",
"accessibility.pdf.tags-order":"PDF tags, heading hierarchy, and reading order preserve the intended content sequence without duplicate or orphaned meaningful content.",
"accessibility.pdf.alternatives":"Meaningful images, figures, tables, and data in the PDF have accurate alternatives or proximate equivalents.",
"accessibility.pdf.text-extraction":"Thai and Latin text extracts in the intended order without missing glyphs, unintended outlines, or semantic loss.",
"accessibility.pdf.links-bookmarks":"PDF links and bookmarks are descriptive, complete, ordered, and resolve to their declared destinations.",
"accessibility.pdf.print":"The PDF remains legible with sufficient text and non-text contrast in the declared screen and print conditions.",
"accessibility.deck.alt-reading-order":"Every slide preserves meaningful alternative text and a logical object reading order consistent with the spoken or visual sequence.",
"accessibility.deck.distance-legibility":"Primary ideas, labels, evidence cues, and actions remain legible at the declared room-distance fixture.",
"accessibility.deck.thai-latin":"Thai and Latin text remains readable and free of missing glyphs, overflow, or unintended substitution in editable and exported deck states.",
"accessibility.deck.links-qr":"Every link and QR action has a descriptive visible label and resolves to the same verified destination.",
"accessibility.deck.pdf-export":"Static PDF export preserves slide meaning, source cues, reading order, alternatives, links, and material limitations.",
"accessibility.social.contrast-legibility":"The social creative preserves readable message, identity, evidence cue, and destination cue at feed size with sufficient contrast.",
"accessibility.social.safe-area":"No essential message, identity, evidence cue, or destination cue enters the governed platform-safe exclusion area.",
"accessibility.social.thai-latin":"Thai and Latin text remains readable and free of missing glyphs, overflow, or unintended substitution in final channel bytes.",
"accessibility.social.crop":"The governed target — 1080 × 1080 square or 1200 × 630 link preview — preserves the complete approved message, identity, evidence cue, and destination cue under its crop fixtures; any other ratio is unknown and blocks in this release.",
"accessibility.social.destination-cue":"The static creative presents one truthful, readable destination cue without simulating an unavailable interactive control."
},
"accessibilityProjectionContract":{
"statusAtArtifactQa":"verified",
"readingOrder":"composition_sections_exact",
"contrast":{"normalTextMin":4.5,"largeTextMin":3,"nonTextMin":3},
"contentAlternativeTriggers":{"images":{"assetRoles":["editorial","evidence","map","social_preview","ui_capture","provider_content","generated_vector"],"whenPresent":"verified","whenAbsent":"not_applicable"},"data":{"capabilities":["data_table","data_visualization","map"],"whenPresent":"verified","whenAbsent":"not_applicable"}},
"motionWithoutCapability":{"alternative":"not_applicable","reducedMotion":"not_applicable","observerFailure":"not_applicable"},
"variants":{
"web_public.browser":{"semanticStructure":{"headings":"verified","landmarks":"verified","controls":"verified"},"interaction":{"keyboard":"verified","focus":"verified","touch":"verified"},"textLayout":{"zoom200":"verified","reflow400":"verified"},"motionWithCapability":{"alternative":"verified","reducedMotion":"verified","observerFailure":"final_state"}},
"app_interactive.browser":{"semanticStructure":{"headings":"verified","landmarks":"verified","controls":"verified"},"interaction":{"keyboard":"verified","focus":"verified","touch":"verified"},"textLayout":{"zoom200":"verified","reflow400":"verified"},"motionWithCapability":{"alternative":"verified","reducedMotion":"verified","observerFailure":"final_state"}},
"app_interactive.native":{"semanticStructure":{"headings":"verified","landmarks":"not_applicable","controls":"verified"},"interaction":{"keyboard":"verified","focus":"verified","touch":"verified"},"textLayout":{"zoom200":"not_applicable","reflow400":"not_applicable"},"motionWithCapability":{"alternative":"verified","reducedMotion":"verified","observerFailure":"not_applicable"}},
"document_flow.static":{"semanticStructure":{"headings":"verified","landmarks":"not_applicable","controls":"verified"},"interaction":{"keyboard":"not_applicable","focus":"not_applicable","touch":"not_applicable"},"textLayout":{"zoom200":"not_applicable","reflow400":"not_applicable"},"motionWithCapability":null},
"pdf_fixed.static":{"semanticStructure":{"headings":"verified","landmarks":"not_applicable","controls":"verified"},"interaction":{"keyboard":"not_applicable","focus":"not_applicable","touch":"not_applicable"},"textLayout":{"zoom200":"not_applicable","reflow400":"not_applicable"},"motionWithCapability":null},
"deck_presentation.static":{"semanticStructure":{"headings":"not_applicable","landmarks":"not_applicable","controls":"not_applicable"},"interaction":{"keyboard":"not_applicable","focus":"not_applicable","touch":"not_applicable"},"textLayout":{"zoom200":"not_applicable","reflow400":"not_applicable"},"motionWithCapability":{"alternative":"verified","reducedMotion":"not_applicable","observerFailure":"not_applicable"}},
"social_static.static":{"semanticStructure":{"headings":"not_applicable","landmarks":"not_applicable","controls":"not_applicable"},"interaction":{"keyboard":"not_applicable","focus":"not_applicable","touch":"not_applicable"},"textLayout":{"zoom200":"not_applicable","reflow400":"not_applicable"},"motionWithCapability":null}
}
},
"acceptanceOverridesByConformanceVariant":{
"web_public.browser":{"AHA-01-B":{"method":"interaction","criterion":"Browser first-run, denied-permission, unauthenticated, and no-sharing fixtures expose the earliest feasible useful value and a safe next route without a prerequisite that is not essential."},"CTA-01-B":{"method":"interaction","criterion":"Each browser CTA activates its declared destination once, preserves input and state on failure, and exposes a perceivable result or recovery route."},"A11Y-01-B":{"method":"accessibility","criterion":"The exact web_public.browser accessibility fixture set passes with hash-bound evidence for keyboard, screen reader, 200 percent zoom, 400 percent reflow, and reduced motion."},"THEME-01-B":{"method":"visual","criterion":"Browser light, dark, auto, and forced-color fixtures preserve identical meaning and actions while passing identity, text, control, focus, graphics, and data contrast gates."}},
"app_interactive.browser":{"AHA-01-B":{"method":"interaction","criterion":"Browser-app first-run, denied-permission, unauthenticated, and no-sharing fixtures expose the earliest feasible useful task value and a safe next route."},"CTA-01-B":{"method":"interaction","criterion":"Each browser-app CTA activates its declared destination once, preserves task input and state on failure, and exposes a perceivable result or recovery route."},"A11Y-01-B":{"method":"accessibility","criterion":"The exact app_interactive.browser accessibility fixture set passes with hash-bound evidence for keyboard, screen reader, touch, state recovery, 200 percent zoom, 400 percent reflow, and reduced motion."},"THEME-01-B":{"method":"visual","criterion":"Browser-app light, dark, auto, and forced-color fixtures preserve identical task meaning and actions while passing identity, text, control, focus, graphics, and data contrast gates."}},
"app_interactive.native":{"AHA-01-B":{"method":"interaction","criterion":"Native-app first-run, denied-permission, unauthenticated, and no-sharing fixtures expose the earliest feasible useful task value and a safe platform-native next route."},"CTA-01-B":{"method":"interaction","criterion":"Each native-app CTA invokes its declared route or command once, preserves task input and state on interruption or failure, and exposes a perceivable result or recovery route."},"A11Y-01-B":{"method":"accessibility","criterion":"The exact app_interactive.native accessibility fixture set passes with hash-bound evidence for platform keyboard support, accessibility API, touch, state recovery, 200 percent text scaling, safe-area interruption, and reduced motion."},"THEME-01-B":{"method":"visual","criterion":"Native light, dark, and platform high-contrast fixtures preserve identical task meaning and actions while passing identity, text, control, focus, graphics, and data contrast gates."}},
"document_flow.static":{"AHA-01-B":{"method":"manual","criterion":"The native flowing document exposes its earliest useful answer before nonessential supporting material, and no unavailable interactive gate is presented as required."},"CTA-01-B":{"method":"manual","criterion":"Every flowing-document action is a working descriptive link, cross-reference, contact instruction, or destination cue whose declared outcome is present in the final document and PDF export."},"A11Y-01-B":{"method":"accessibility","criterion":"The exact document_flow.static accessibility fixture set passes with hash-bound evidence for native structure, reading order, links, Thai–Latin text, and governed PDF export."},"THEME-01-B":{"method":"visual","criterion":"The fixed screen and print styles declared for the flowing document preserve identical meaning and pass identity, text, link, graphics, and data contrast gates in native and PDF-export bytes."}},
"pdf_fixed.static":{"AHA-01-B":{"method":"manual","criterion":"The fixed PDF exposes its earliest useful answer before nonessential supporting pages, and no unavailable interactive gate is presented as required."},"CTA-01-B":{"method":"manual","criterion":"Every fixed-PDF action is a working descriptive link, bookmark, contact instruction, or destination cue whose declared outcome remains present in final PDF bytes."},"A11Y-01-B":{"method":"accessibility","criterion":"The exact pdf_fixed.static accessibility fixture set passes with hash-bound evidence for tags and order, alternatives, text extraction, links and bookmarks, and print legibility."},"THEME-01-B":{"method":"visual","criterion":"The fixed PDF screen and print renderings preserve identical meaning and pass identity, text, link, graphics, and data contrast gates without requiring runtime theme switching."}},
"deck_presentation.static":{"AHA-01-B":{"method":"manual","criterion":"The deck exposes its earliest useful idea before nonessential supporting slides in both presenter-led and static-export sequences, with no unavailable interactive gate."},"CTA-01-B":{"method":"manual","criterion":"Every deck action is a working descriptive link, verified QR destination, or explicit instruction whose declared outcome remains present in editable and static-export bytes."},"A11Y-01-B":{"method":"accessibility","criterion":"The exact deck_presentation.static accessibility fixture set passes with hash-bound evidence for alternatives and reading order, room-distance legibility, Thai–Latin text, links and QR, and PDF export."},"THEME-01-B":{"method":"visual","criterion":"The selected deck theme and its static PDF export preserve identical meaning and pass distance-legible identity, text, link, graphics, and data contrast gates without runtime theme switching."}},
"social_static.static":{"AHA-01-B":{"method":"visual","criterion":"The final social image makes its single useful message legible at the governed feed-size fixture before supporting detail, with no unavailable interactive gate."},"CTA-01-B":{"method":"visual","criterion":"The final social image contains one truthful readable destination cue and does not render a control, state change, or completion that the static format cannot provide."},"A11Y-01-B":{"method":"accessibility","criterion":"The exact social_static.static accessibility fixture set passes with hash-bound evidence for feed-size contrast and legibility, safe area, Thai–Latin text, crop, and destination cue."},"THEME-01-B":{"method":"visual","criterion":"The selected static social theme preserves the approved message and passes identity, text, graphics, and data contrast gates in final channel bytes without implying runtime theme switching."}}
},
"productionTestIds":["format.web.public.01.09"],
"experienceProfileRuleIds":{"portfolio_orientation":["AHA-01","BRAND-01","NAV-01"],"methodology_learning":["AHA-01","COMPARE-01","EVIDENCE-01","CLAIM-MACHINE-01"],"product_orientation":["AHA-01","EVIDENCE-01","NAV-01","CTA-01"],"evidence_report":["COMPARE-01","EVIDENCE-01","CLAIM-MACHINE-01","FORMAT-PARITY-01"],"interactive_task":["CTA-01","CTA-02","A11Y-01","MOTION-02","SECURITY-01"],"editorial_place_story":["AHA-01","EVIDENCE-01","TYPE-01","MEDIA-01"],"adoption_change":["AHA-01","EVIDENCE-01","FORMAT-PARITY-01"],"campaign":["BRAND-01","CTA-01","MEDIA-01","DISCOVERY-01"]},
"experienceProfileTestMatrix":{
"portfolio_orientation":["portfolio identity is distinct from product claims","one portfolio-level job and next action remain dominant"],
"methodology_learning":["method, grain, evidence, and limitation are learnable before comparison","schema incompatibility remains explicit"],
"product_orientation":["named product truth stays inside its evidence boundary","primary product route and CTA are direct"],
"evidence_report":["claims resolve to approved records","comparison, source, uncertainty, and limitation survive export"],
"interactive_task":["permission, consequence, progress, result, and recovery are complete","keyboard, touch, reduced-motion, and interruption states preserve the task"],
"editorial_place_story":["place narrative and evidence remain distinguishable","media rights, alternatives, and source context remain bound"],
"adoption_change":["before and after keep the same facts","the design move, AHA, boundary, and next action are observable"],
"campaign":["one approved message and destination dominate","identity, claim, declared governed square or OG target, and discovery metadata remain aligned"]
},
"navigationContract":{
"destinationLevels":["ecosystem","property","page"],
"destinationKinds":["route","anchor","external"],
"destinationGroups":["primary","ecosystem","page_local","utility"],
"currentValues":["none","page","location"],
"currentMeaning":{"none":"The destination is not the current route/page or current in-page location.","page":"The route destination identifies the current page; exactly one is required for a non-empty interactive navigation model.","location":"The anchor destination identifies the current in-page location; at most one exists and an interactive side bookmark requires exactly one."},
"currentCardinality":{"interactiveFormatProfiles":["web_public","app_interactive"],"interactiveNonEmptyMode":{"page":"exactly_one","location":"zero_or_one"},"interactiveSideBookmark":{"location":"exactly_one"},"staticFormatProfiles":["document_flow","pdf_fixed","deck_presentation","social_static"],"static":{"page":"zero","location":"zero"},"noneMode":{"destinations":"zero","page":"zero","location":"zero"}},
"breakpointExposure":{"desktop":["header","disclosure","side_bookmark","not_exposed","not_applicable"],"mobile":["header","disclosure","not_exposed","not_applicable"]},
"staticExposureValues":["toc","pdf_bookmark","deck_section_marker","destination_cue","not_exposed"],
"staticProjectionContract":{
"applicableConformanceVariants":["document_flow.static","pdf_fixed.static","deck_presentation.static"],
"outputGroupOrder":["global_related_destinations","page_index"],
"groups":{"global_related_destinations":{"selectors":[{"kind":"route","levels":["ecosystem","property"]},{"kind":"external","levels":["ecosystem","property","page"]}],"requiredStaticExposure":"destination_cue","representationByFormatProfile":{"document_flow":"related_destination_group","pdf_fixed":"related_destination_group","deck_presentation":"opening_or_closing_related_destination_group"}},"page_index":{"selectors":[{"kind":"anchor","levels":["page"],"groups":["page_local"]}],"requiredStaticExposureByFormatProfile":{"document_flow":"toc","pdf_fixed":"pdf_bookmark","deck_presentation":"deck_section_marker"},"representationByFormatProfile":{"document_flow":"heading_derived_toc","pdf_fixed":"heading_derived_pdf_bookmarks","deck_presentation":"heading_derived_section_markers"}}},
"invariants":{"eachDestinationExactlyOneGroup":true,"preserveFields":["id","kind","level","group","target","label","labelByLocale"],"preserveRelativeOrderWithinGroup":true,"duplicateDestinationIdsForbidden":true,"duplicateTargetsForbidden":true,"kindOrLevelConversionForbidden":true,"headingAnchorResolutionRequired":true},
"unsupportedDestinationBehavior":"block"
},
"variants":{
"web_public.browser":{"allowedModes":["none","site","product"],"exposureField":"breakpointExposure","sideBookmarkExposure":{"desktop":"side_bookmark","mobile":"disclosure"}},
"app_interactive.browser":{"allowedModes":["none","site","product"],"exposureField":"breakpointExposure","sideBookmarkExposure":{"desktop":"side_bookmark","mobile":"disclosure"}},
"app_interactive.native":{"allowedModes":["none","site","product"],"exposureField":"breakpointExposure","sideBookmarkExposure":{"desktop":"side_bookmark","mobile":"disclosure"}},
"document_flow.static":{"allowedModes":["none","document"],"exposureField":"staticExposure","sideBookmarkExposure":"toc"},
"pdf_fixed.static":{"allowedModes":["none","document"],"exposureField":"staticExposure","sideBookmarkExposure":"pdf_bookmark"},
"deck_presentation.static":{"allowedModes":["none","deck"],"exposureField":"staticExposure","sideBookmarkExposure":"deck_section_marker"},
"social_static.static":{"allowedModes":["none"],"exposureField":"staticExposure","sideBookmarkExposure":null}
},
"controlBudgetConformanceVariants":["web_public.browser","app_interactive.browser","app_interactive.native"],
"controlBudgetsByConformanceVariant":{"web_public.browser":{"desktop":{"brandRequired":true,"maxControls":4},"mobile":{"brandRequired":true,"maxControls":2},"minimumDirectTarget":{"value":44,"unit":"css_px"}},"app_interactive.browser":{"desktop":{"brandRequired":true,"maxControls":4},"mobile":{"brandRequired":true,"maxControls":2},"minimumDirectTarget":{"value":44,"unit":"css_px"}},"app_interactive.native":{"desktop":{"brandRequired":true,"maxControls":4},"mobile":{"brandRequired":true,"maxControls":2},"minimumDirectTarget":{"value":44,"unit":"platform_dp"}}},
"sideBookmarkCompatibleFormatProfiles":["web_public","app_interactive","document_flow","pdf_fixed","deck_presentation"]
},
"componentContractTemplates":{
"resolution":"An artifact-resolved implementation record may copy a component contract only from its exact format/runtime reference record or from one exact-format template below. Unknown component IDs, cross-format templates, and caller-authored substitutes block promotion.",
"unknownComponentBehavior":"block",
"templates":[
{
"formatProfile":"document_flow",
"runtime":"static",
"contract":{
"componentId":"component.bookmark.side.01",
"componentClass":"side_bookmark",
"governingRuleIds":["BOOKMARK-01"],
"purpose":"Project stable page headings into one heading-derived table of contents while keeping ecosystem, property, and external destinations in a separate related-destination group.",
"nonPurpose":"It is not global navigation, a browser side rail, a disclosure widget, or a current-location indicator.",
"semanticRoles":["heading_index","link"],
"contentContract":"Use at least two real locale-labelled page-local heading anchors in source heading order with exact IDs and targets; never mix global or related destinations into the table of contents.",
"localeStressFixtureIds":["format.document.flow.01.08","target.document.a4-portrait.01.fixture.thai-latin-stress"],
"states":{
"default":{"status":"required","behavior":"The heading-derived table of contents is readable, complete, and ordered like the document headings."},
"hover":{"status":"not_applicable","behavior":"The static document contract does not depend on pointer hover."},
"focus":{"status":"not_applicable","behavior":"The source document preserves descriptive links and native reading order without manufacturing browser focus behavior."},
"activePressed":{"status":"not_applicable","behavior":"The static document contract does not manufacture a pressed state."},
"selectedCurrent":{"status":"not_applicable","behavior":"A static document table of contents does not invent a live current-location state."},
"disabled":{"status":"not_applicable","behavior":"Broken or unavailable heading anchors block validation instead of becoming disabled entries."},
"loading":{"status":"not_applicable","behavior":"All indexed headings exist before the document is emitted."},
"empty":{"status":"required","behavior":"The table of contents is omitted when fewer than two useful heading anchors remain."},
"error":{"status":"not_applicable","behavior":"Broken heading anchors fail validation rather than becoming a visible component state."},
"success":{"status":"not_applicable","behavior":"Following a document cross-reference is not a success state."}
},
"formatBehavior":{"formatProfile":"document_flow","behavior":"Use a native heading-derived table of contents with descriptive cross-references; emit global and related destinations separately."},
"accessibility":{"name":"The table of contents has an exact locale-specific heading or accessible name.","role":"Use native document headings, lists, and descriptive cross-references.","value":"No current-location or expanded browser state is exposed.","order":"Entry order exactly matches source heading order and native reading order.","status":"Every table-of-contents entry resolves to its declared heading target."},
"tokenRefs":["tokens.v0.9.7.json#/control/inlineTextLink"],
"evidencePermissionBoundary":"The page index provides orientation only and never changes claim scope, evidence authority, or permission.",
"acceptanceFixtureIds":["BOOKMARK-01-A","BOOKMARK-01-B","format.document.flow.01.08","accessibility.document.links"],
"antiPatterns":["Browser side rail in a document","Global routes mixed into the table of contents","One-anchor table of contents","Invented current-location state"]
}
},
{
"formatProfile":"pdf_fixed",
"runtime":"static",
"contract":{
"componentId":"component.bookmark.side.01",
"componentClass":"side_bookmark",
"governingRuleIds":["BOOKMARK-01"],
"purpose":"Project stable page headings into heading-derived PDF bookmarks while keeping ecosystem, property, and external destinations in a separate related-destination group.",
"nonPurpose":"It is not global navigation, a browser side rail, a disclosure widget, or a current-location indicator.",
"semanticRoles":["heading_index","link"],
"contentContract":"Use at least two real locale-labelled page-local heading anchors in source heading order with exact IDs and targets; never mix global or related destinations into PDF bookmarks.",
"localeStressFixtureIds":["format.pdf.fixed.01.09","target.pdf.a4-portrait.01.fixture.thai-latin-stress"],
"states":{
"default":{"status":"required","behavior":"PDF bookmarks are readable, complete, and ordered like the tagged source headings."},
"hover":{"status":"not_applicable","behavior":"The fixed PDF contract does not depend on browser pointer hover."},
"focus":{"status":"not_applicable","behavior":"The PDF preserves descriptive link annotations and tag order without manufacturing browser focus behavior."},
"activePressed":{"status":"not_applicable","behavior":"The fixed PDF contract does not manufacture a pressed state."},
"selectedCurrent":{"status":"not_applicable","behavior":"Static PDF bookmarks do not invent a live current-location state."},
"disabled":{"status":"not_applicable","behavior":"Broken or unavailable bookmark targets block validation instead of becoming disabled entries."},
"loading":{"status":"not_applicable","behavior":"All bookmark targets exist before the PDF is emitted."},
"empty":{"status":"required","behavior":"PDF bookmarks are omitted when fewer than two useful heading anchors remain."},
"error":{"status":"not_applicable","behavior":"Broken PDF bookmark targets fail validation rather than becoming a visible component state."},
"success":{"status":"not_applicable","behavior":"Following a PDF bookmark is not a success state."}
},
"formatBehavior":{"formatProfile":"pdf_fixed","behavior":"Use heading-derived PDF bookmarks and tagged link annotations; emit global and related destinations separately."},
"accessibility":{"name":"The PDF bookmark index has exact locale-specific labels.","role":"Use heading-derived bookmarks and descriptive tagged links.","value":"No current-location or expanded browser state is exposed.","order":"Bookmark order exactly matches source heading and tag order.","status":"Every PDF bookmark resolves to its declared heading target."},
"tokenRefs":["tokens.v0.9.7.json#/control/inlineTextLink"],
"evidencePermissionBoundary":"The page index provides orientation only and never changes claim scope, evidence authority, or permission.",
"acceptanceFixtureIds":["BOOKMARK-01-A","BOOKMARK-01-B","format.pdf.fixed.01.09","accessibility.pdf.links-bookmarks"],
"antiPatterns":["Browser side rail in a PDF","Global routes mixed into PDF bookmarks","One-anchor PDF bookmark set","Invented current-location state"]
}
},
{
"formatProfile":"deck_presentation",
"runtime":"static",
"contract":{
"componentId":"component.bookmark.side.01",
"componentClass":"side_bookmark",
"governingRuleIds":["BOOKMARK-01"],
"purpose":"Project stable page headings into heading-derived deck section markers while keeping ecosystem, property, and external destinations in a separate opening or closing related-destination group.",
"nonPurpose":"It is not global navigation, a browser side rail, a disclosure widget, or a current-location indicator.",
"semanticRoles":["section_index","destination_cue"],
"contentContract":"Use at least two real locale-labelled page-local heading anchors in source section order with exact IDs and targets; never mix global or related destinations into section markers.",
"localeStressFixtureIds":["format.deck.presentation.01.08","target.deck.16x9.01.fixture.thai-latin-stress"],
"states":{
"default":{"status":"required","behavior":"Section markers are readable, complete, and ordered like the governed slide sections."},
"hover":{"status":"not_applicable","behavior":"The presentation contract does not depend on pointer hover."},
"focus":{"status":"not_applicable","behavior":"The deck preserves slide-object and accessibility order without manufacturing browser focus behavior."},
"activePressed":{"status":"not_applicable","behavior":"The presentation contract does not manufacture a pressed state."},
"selectedCurrent":{"status":"not_applicable","behavior":"Static section markers do not invent a live current-location state."},
"disabled":{"status":"not_applicable","behavior":"Broken or unavailable section targets block validation instead of becoming disabled entries."},
"loading":{"status":"not_applicable","behavior":"All section targets exist before the deck is emitted."},
"empty":{"status":"required","behavior":"Section markers are omitted when fewer than two useful heading anchors remain."},
"error":{"status":"not_applicable","behavior":"Broken section targets fail validation rather than becoming a visible component state."},
"success":{"status":"not_applicable","behavior":"Following a deck section marker is not a success state."}
},
"formatBehavior":{"formatProfile":"deck_presentation","behavior":"Use heading-derived section markers; emit global and related destinations in a separate opening or closing group."},
"accessibility":{"name":"Section markers use exact locale-specific labels.","role":"Use readable section labels or descriptive presentation links without imitating a browser control.","value":"No current-location or expanded browser state is exposed.","order":"Marker order exactly matches governed slide-section and accessibility order.","status":"Every section marker resolves to its declared section target."},
"tokenRefs":["tokens.v0.9.7.json#/control/inlineTextLink"],
"evidencePermissionBoundary":"The page index provides orientation only and never changes claim scope, evidence authority, or permission.",
"acceptanceFixtureIds":["BOOKMARK-01-A","BOOKMARK-01-B","format.deck.presentation.01.08","accessibility.deck.alt-reading-order"],
"antiPatterns":["Browser side rail in a deck","Global routes mixed into section markers","One-anchor section index","Invented current-location state"]
}
}
]
},
"ctaDestinationContract":{
"kinds":["anchor","route","external","download","form","contact","command"],
"profiles":{"web_public":{"mode":"direct","techniques":["direct_control"],"kinds":["anchor","route","external","download","form","contact","command"]},"app_interactive":{"mode":"direct","techniques":["direct_control"],"kinds":["anchor","route","external","download","form","contact","command"]},"document_flow":{"mode":"static_equivalent","techniques":["working_link","instruction"],"kinds":["anchor","route","external","download","form","contact","command"]},"pdf_fixed":{"mode":"static_equivalent","techniques":["working_link_with_visible_destination","instruction"],"kinds":["anchor","route","external","download","form","contact","command"]},"deck_presentation":{"mode":"static_equivalent","techniques":["working_link_with_visible_destination","verified_qr_with_text","instruction"],"kinds":["anchor","route","external","download","form","contact","command"]},"social_static":{"mode":"static_equivalent","techniques":["destination_cue"],"kinds":["route","external","download","form","contact"]}},
"commandStaticTechnique":"instruction",
"unknownKindOrProfileBehavior":"block"
},
"motionAssignmentContract":{"decisionValues":["assigned","no_motion"],"commonAssignmentRequiredFields":["subject","role","benefit","protectedRole","initialVisibility","layoutGeometry","staticFallback"],"assignmentRequiredFieldsByRuntimeClass":{"browser_observer":["reducedMotion","observerFailure"],"native_state":["reducedMotion","nativeInterruption"],"presenter_sequence":["presenterSkip"]},"roles":["section_opener","peer_group","paired_inline","proof_preview","contact_group"],"benefits":["state","sequence","progress","spatial_relationship","cause_and_effect"],"finalStateRequirements":{"initialVisibility":"visible","layoutGeometry":"stable","staticFallback":"final_state","reducedMotion":"final_state","observerFailure":"final_state","nativeInterruption":"final_state","presenterSkip":"final_state"},"noMotionDecision":{"decision":"no_motion","assignments":[],"reasonRequired":true}},
"commonRuleIds":["GOV-01","AUTHORITY-01","LAYER-01","COMPARE-01","EVIDENCE-01","OUTPUT-CLARITY-01","AHA-01","BRAND-01","LOGO-01","COLOR-01","SURFACE-01","TYPE-01","ICON-01","LAYOUT-01","THEME-01","ASSET-DELIVERY-01","PROFILE-01","CAPABILITY-01","PARITY-01","CTA-01","CTA-02","A11Y-01","CLAIM-MACHINE-01","SECURITY-01","FORMAT-PARITY-01","MEDIA-01","COMPONENT-01","QA-01","RELEASE-01"],
"commonTestMatrix":["final visible bytes and metadata contain no internal governance state, placeholder, local path, fixture ID, or unresolved-dependency wording","every visible material limitation is specific, proximal, plain-language, and linked to its affected claim or action","Do not use decorative bracket-shaped highlights or colored left-rail accents for selected navigation, tabs, cards or callouts. Use restrained background, text weight and spacing; retain visible keyboard focus outlines and meaningful chart/table borders. Inspect actual Thai/English content at narrow and desktop widths for squeezed headings or overlaps."],
"capabilityRuleIds":{"claims":["EVIDENCE-01","CLAIM-MACHINE-01"],"evidence":["EVIDENCE-01"],"data_table":["EVIDENCE-01","A11Y-01","FORMAT-PARITY-01","EVID-05"],"data_visualization":["DATAVIZ-01","DATAVIZ-02","DATAVIZ-03","DATAVIZ-04","DATAVIZ-05","GATE-01","EVID-05"],"map":["MAP-01","DATAVIZ-02","DATAVIZ-03","DATAVIZ-04","GATE-01","EVID-05"],"form":["CTA-01","CTA-02","A11Y-01","SECURITY-01"],"authentication":["A11Y-01","SECURITY-01"],"permissions":["A11Y-01","SECURITY-01"],"sharing":["CTA-01","SECURITY-01","FORMAT-PARITY-01"],"download":["CTA-01","SECURITY-01","FORMAT-PARITY-01"],"external_effect":["CTA-01","SECURITY-01","QA-01"],"carousel":["CAROUSEL-01"],"social_feed":["SOCIAL-FEED-01"],"motion":["MOTION-01","MOTION-02","MOTION-03","MOTION-04","MOTIF-01","MOTIF-02","MOTIF-03","MOTIF-04","MOTIF-05","MOTIF-06"],"agent_action":["AGENT-01","SECURITY-01"],"telemetry":["SECURITY-01","QA-01"]},
"packs":[
{
"id":"web.public.01",
"formatProfile":"web_public",
"title":"Public web",
"kitRef":"kit.web.base.01",
"targetProfileRefs":["target.web.responsive.360-1600.01"],
"requiredRuleIds":["WEBFMT-01","NAV-01","NAV-02","CTRL-01","DISCOVERY-01","DISCOVERY-02","DISCOVERY-03","FAVICON-01"],
"requiredRuleIdsByRuntime":{"browser":[]},
"conditionalRuleIds":{"side_bookmark":["BOOKMARK-01"],"motion":["MOTION-01","MOTION-02","MOTION-03"],"carousel":["CAROUSEL-01"],"social_feed":["SOCIAL-FEED-01"],"agent_action":["AGENT-01"]},
"requiredOutputs":["semantic initial HTML","responsive and print styles","canonical and locale graph","page-kind structured data","social preview metadata for the square feed creative and the 1200 × 630 link preview","six-size icon set with web manifest and theme-color (FAVICON-01)","title in the pattern [page] · [product]","optional llms.txt navigation aid","no-script primary meaning","production verification receipt"],
"testMatrix":["minimum nominal and maximum supported viewport","Thai and English","light and dark when offered","keyboard touch and assistive technology","no JavaScript","reduced motion","slow blocked and failed third party","initial versus hydrated versus restored history","deployed canonical URL","icon set sizes, manifest, theme-color and title pattern resolve","OG 1200 × 630 recognisers, safe areas and metadata templates","motif job, beat, joy budget, placement, measured carrier in both themes and hash parity (MOTIF-01…06) when identity motion or motifs are present"]
},
{
"id":"app.interactive.01",
"formatProfile":"app_interactive",
"title":"Interactive product",
"kitRef":"kit.app.base.01",
"targetProfileRefs":["target.app.browser-responsive.360-1600.01","target.app.native-responsive.360-1280.01"],
"requiredRuleIds":["APPFMT-01","NAV-01","NAV-02","CTRL-01"],
"requiredRuleIdsByRuntime":{"browser":["DISCOVERY-01","DISCOVERY-02","DISCOVERY-03"],"native":[]},
"conditionalRuleIds":{"side_bookmark":["BOOKMARK-01"],"motion":["MOTION-01","MOTION-02","MOTION-03"],"carousel":["CAROUSEL-01"],"social_feed":["SOCIAL-FEED-01"],"agent_action":["AGENT-01"]},
"requiredOutputs":["state model","direct semantic controls","permission and action contract","recovery and receipt behavior","accessible final state for reduced motion"],
"testMatrix":["idle loading success empty partial stale permission and error","keyboard touch and assistive technology","minimum nominal and maximum supported viewport","Thai and English","reduced motion","network interruption and restoration","history and session restoration"],
"testMatrixByRuntime":{"browser":["initial HTML, hydrated state, restored history, canonical URL, and browser discovery projection preserve the same task meaning","200 percent zoom, 400 percent reflow, failed observer, and browser safe-area fixtures preserve the complete task and recovery path"],"native":["platform accessibility API, 200 percent dynamic type, native safe area, and hardware-keyboard fixtures preserve the complete task","backgrounding, interruption, process restoration, denied permission, and interrupted transition preserve state and a truthful recovery path"]}
},
{"id":"document.flow.01","formatProfile":"document_flow","title":"Flowing document","kitRef":"kit.document.flow.01","targetProfileRefs":["target.document.a4-portrait.01"],"requiredRuleIds":["DOCFMT-01"],"conditionalRuleIds":{"side_bookmark":["BOOKMARK-01"]},"requiredOutputs":["semantic heading hierarchy","table of contents when length warrants","working links and cross-references","labelled tables and figures","source notes and version identity","accessible document properties"],"testMatrix":["native structure inspection","Thai and English stress text","page break and orphan control","links and cross-references","tables and figures","screen and print rendering","export to PDF parity","ecosystem property route and external destinations remain in one related-destination group while page anchors remain only in the heading-derived table of contents with exact IDs kinds levels targets labels relative order and no duplicates"]},
{"id":"pdf.fixed.01","formatProfile":"pdf_fixed","title":"Fixed PDF","kitRef":"kit.pdf.fixed.01","targetProfileRefs":["target.pdf.a4-portrait.01"],"requiredRuleIds":["PDFFMT-01"],"conditionalRuleIds":{"side_bookmark":["BOOKMARK-01"]},"requiredOutputs":["print-safe fixed pages","tags and reading order when required","bookmarks when length warrants","working links","embedded or approved fallback fonts","extractable text where possible","document metadata and evidence references"],"testMatrix":["all-pages visual render","Thai and English stress text","text extraction","font and glyph inventory","tags reading order and alternatives","bookmarks and links","screen and print contrast","file integrity","ecosystem property route and external destinations remain in one related-destination group while page anchors remain only in heading-derived PDF bookmarks with exact IDs kinds levels targets labels relative order and no duplicates"]},
{"id":"deck.presentation.01","formatProfile":"deck_presentation","title":"Presentation deck","kitRef":"kit.deck.presentation.01","targetProfileRefs":["target.deck.16x9.01"],"requiredRuleIds":["DECKFMT-01"],"conditionalRuleIds":{"side_bookmark":["BOOKMARK-01"],"motion":["MOTION-01","MOTION-03"]},"requiredOutputs":["one primary idea per slide","section progress or agenda","distance-legible hierarchy","source cues and appendix references","working links or QR destinations for actions","editable structure when required"],"testMatrix":["slide montage","distance legibility","Thai and English stress text","overflow and safe area","links QR and source references","alt text and reading order","static PDF export parity","ecosystem property route and external destinations remain in one opening or closing related-destination group while page anchors remain only in heading-derived section markers with exact IDs kinds levels targets labels relative order and no duplicates"]},
{
"id":"social.static.01",
"formatProfile":"social_static",
"title":"Static social media",
"kitRef":"kit.social.static.01",
"targetProfileRefs":["target.social.square.1080.01","target.social.og.1200x630.01"],
"requiredRuleIds":["SOCIALFMT-01"],
"conditionalRuleIds":{},
"requiredOutputs":["one approved message","exactly one governed target per creative: 1080 × 1080 square for feed posts or 1200 × 630 for link previews; every other ratio blocks because no governed extension registry ships","safe-area-compliant composition","approved identity implementation","source or destination cue","three recognisers on the 1200 × 630 creative","static final state (no motif, no overlay)"],
"testMatrix":["1080 × 1080 feed-size legibility","square target and center-crop fixture; no undeclared ratio","Thai and English stress text","safe areas and overlays","identity and contrast","file type size and color profile","claim and destination parity","1200 × 630 recognisers, text-safe 1000 × 560, central 630 square and 2:1 crop fixtures","og:title ≤ 60 and og:description ≤ 155 template parity"]
}
],
"overlays":[
{
"id":"claims.bound.01",
"capability":"claims",
"title":"Governed claims overlay",
"compatibleFormatProfiles":["web_public","app_interactive","document_flow","pdf_fixed","deck_presentation","social_static"],
"requiredRuleIds":["EVIDENCE-01","CLAIM-MACHINE-01","OUTPUT-CLARITY-01"],
"requiredFields":["schemaVersion","releaseRef","manifestId","contentRelease","owner","records"],
"configSchemaRef":"https://montri-th.github.io/Landometer/v0.9.7/standalone-0.9.7-r1/schemas/claim-manifest.schema.json",
"configSchemaSha256":"3f53a2f9e8ca88b398f5fb871e0b0de01e488db552ce9fedc3942f8d9d79f11a",
"configRefContract":"Build Card capabilityConfigRefs.claims resolves a hash-bound claim manifest containing every requiredFields entry.",
"testMatrix":["every projected claim resolves through the manifest to immutable record bytes","status, locale, temporal validity, rights, and public eligibility match the delivery audience","material limitations remain specific and proximal in every supported format"],
"fallback":"omit the claim-dependent module or keep the artifact as an internal preview"
},
{
"id":"evidence.bound.01",
"capability":"evidence",
"title":"Evidence binding overlay",
"compatibleFormatProfiles":["web_public","app_interactive","document_flow","pdf_fixed","deck_presentation","social_static"],
"requiredRuleIds":["EVIDENCE-01","CLAIM-MACHINE-01"],
"requiredFields":["schemaVersion","releaseRef","manifestId","contentRelease","owner","records"],
"configSchemaRef":"https://montri-th.github.io/Landometer/v0.9.7/standalone-0.9.7-r1/schemas/claim-manifest.schema.json",
"configSchemaSha256":"3f53a2f9e8ca88b398f5fb871e0b0de01e488db552ce9fedc3942f8d9d79f11a",
"configRefContract":"Build Card capabilityConfigRefs.evidence resolves a hash-bound claim manifest containing every requiredFields entry.",
"testMatrix":["each evidence-bearing statement resolves to an approved claim record","source, grain, release, rights, confidence, and limitation boundaries remain inspectable","cross-product or cross-city comparisons declare schema and release compatibility"],
"fallback":"present only approved non-evidentiary orientation copy and remove unsupported comparisons"
},
{
"id":"data.table.01",
"capability":"data_table",
"title":"Data table overlay",
"compatibleFormatProfiles":["web_public","app_interactive","document_flow","pdf_fixed","deck_presentation","social_static"],
"requiredRuleIds":["EVIDENCE-01","A11Y-01","FORMAT-PARITY-01","EVID-05"],
"requiredFields":["capability","question","columns","rows","dataGrain","claimIds","evidenceIds","accessibleSummary","cellStates"],
"configSchemaRef":"https://montri-th.github.io/Landometer/v0.9.7/standalone-0.9.7-r1/schemas/capability-config.schema.json",
"configSchemaSha256":"58c9c7bdbbb355002fb3cd62e7bc07c96f64640759ffcc388dbeddfa1c1d4a38",
"configRefContract":"Build Card capabilityConfigRefs.data_table resolves an object containing every requiredFields entry.",
"testMatrix":["headers, units, grain, missing values, and sorting preserve the governed proposition","the accessible summary, claims, evidence, and visible table preserve the same analytical meaning","cells render their state with glyph, reason, and metadata ink"],
"testMatrixByFormatClass":{"interactive":["keyboard and assistive-technology reading order matches the visual table and every interactive sort or selection state","loading, empty, partial, error, and reset states preserve headers, units, grain, sources, and material limitations"],"static":["the final static table preserves headers, units, grain, missing values, sources, and material limitations without implying sorting or selection controls","native structure, tagged export, slide reading order, or social-size summary is verified according to the selected static format"]},
"fallback":"labelled static table or concise structured summary with the same proposition"
},
{
"id":"form.transaction.01",
"capability":"form",
"title":"Form transaction overlay",
"compatibleFormatProfiles":["web_public","app_interactive"],
"requiredRuleIds":["CTA-01","CTA-02","A11Y-01","SECURITY-01"],
"requiredFields":["capability","purpose","fields","validation","submission","successState","errorState","privacyNoticeRef"],
"configSchemaRef":"https://montri-th.github.io/Landometer/v0.9.7/standalone-0.9.7-r1/schemas/capability-config.schema.json",
"configSchemaSha256":"58c9c7bdbbb355002fb3cd62e7bc07c96f64640759ffcc388dbeddfa1c1d4a38",
"configRefContract":"Build Card capabilityConfigRefs.form resolves an object containing every requiredFields entry.",
"testMatrix":["labels, requirements, validation, and errors are direct and programmatically associated","submission consequence and data use are clear before commitment","success, duplicate, interruption, and recovery states preserve user input safely"],
"fallback":"a direct contact or task route that preserves purpose, privacy notice, and next step"
},
{
"id":"authentication.session.01",
"capability":"authentication",
"title":"Authentication overlay",
"compatibleFormatProfiles":["web_public","app_interactive"],
"requiredRuleIds":["A11Y-01","SECURITY-01","CTA-02"],
"requiredFields":["capability","identityProvider","entryState","successState","failureState","recoveryPath","sessionPolicy"],
"configSchemaRef":"https://montri-th.github.io/Landometer/v0.9.7/standalone-0.9.7-r1/schemas/capability-config.schema.json",
"configSchemaSha256":"58c9c7bdbbb355002fb3cd62e7bc07c96f64640759ffcc388dbeddfa1c1d4a38",
"configRefContract":"Build Card capabilityConfigRefs.authentication resolves an object containing every requiredFields entry.",
"testMatrix":["entry, success, failure, expiry, and recovery states are keyboard and screen-reader operable","identity-provider and session boundaries are explicit before data leaves the artifact","failed authentication never exposes restricted content or internal diagnostics"],
"fallback":"retain public read-only content and provide a safe sign-in recovery route"
},
{"id":"permissions.decision.01","capability":"permissions","title":"Permission decision overlay","compatibleFormatProfiles":["web_public","app_interactive"],"requiredRuleIds":["A11Y-01","SECURITY-01","AUTHORITY-01"],"requiredFields":["capability","resource","actor","allowedOperations","decisionStates","denialRecovery"],"configSchemaRef":"https://montri-th.github.io/Landometer/v0.9.7/standalone-0.9.7-r1/schemas/capability-config.schema.json","configSchemaSha256":"58c9c7bdbbb355002fb3cd62e7bc07c96f64640759ffcc388dbeddfa1c1d4a38","configRefContract":"Build Card capabilityConfigRefs.permissions resolves an object containing every requiredFields entry.","testMatrix":["allowed, denied, expired, revoked, and unknown decisions remain distinguishable","controls do not imply authority before a hash-bound permission decision exists","denial explains the safe recovery path without leaking protected details"],"fallback":"read-only state with a bounded request-access or return route"},
{
"id":"sharing.boundary.01",
"capability":"sharing",
"title":"Sharing overlay",
"compatibleFormatProfiles":["web_public","app_interactive","document_flow","pdf_fixed","deck_presentation","social_static"],
"requiredRuleIds":["CTA-01","SECURITY-01","FORMAT-PARITY-01"],
"requiredFields":["capability","objectRef","audiences","destinations","permissionPolicy","receiptPresentation","revocationPolicy"],
"configSchemaRef":"https://montri-th.github.io/Landometer/v0.9.7/standalone-0.9.7-r1/schemas/capability-config.schema.json",
"configSchemaSha256":"58c9c7bdbbb355002fb3cd62e7bc07c96f64640759ffcc388dbeddfa1c1d4a38",
"configRefContract":"Build Card capabilityConfigRefs.sharing resolves an object containing every requiredFields entry.",
"testMatrix":["audience, destination, consequence, and revocation boundary are clear before sharing","private or restricted content cannot be projected to a broader audience","static formats preserve a verified destination cue without simulating completion"],
"fallback":"copy a governed canonical reference without transmitting restricted content"
},
{
"id":"download.integrity.01",
"capability":"download",
"title":"Download integrity overlay",
"compatibleFormatProfiles":["web_public","app_interactive","document_flow","pdf_fixed","deck_presentation","social_static"],
"requiredRuleIds":["CTA-01","SECURITY-01","FORMAT-PARITY-01"],
"requiredFields":["capability","resourceRef","fileName","mediaType","byteSize","integritySha256","rights","fallback"],
"configSchemaRef":"https://montri-th.github.io/Landometer/v0.9.7/standalone-0.9.7-r1/schemas/capability-config.schema.json",
"configSchemaSha256":"58c9c7bdbbb355002fb3cd62e7bc07c96f64640759ffcc388dbeddfa1c1d4a38",
"configRefContract":"Build Card capabilityConfigRefs.download resolves an object containing every requiredFields entry.",
"testMatrix":["file name, type, size, rights, and consequence are visible before download","delivered bytes match the declared integrity hash","unavailable or failed downloads provide a truthful recovery route"],
"fallback":"open a governed canonical source page with equivalent meaning"
},
{
"id":"external.effect.01",
"capability":"external_effect",
"title":"External effect overlay",
"compatibleFormatProfiles":["web_public","app_interactive"],
"requiredRuleIds":["CTA-01","CTA-02","SECURITY-01","QA-01"],
"requiredFields":["capability","effectClass","external","cost","reversible","confirmationPolicy","permissionContract","progressPresentationContract","resultPresentationContract","recoveryContract","receiptSchemaBinding"],
"configSchemaRef":"https://montri-th.github.io/Landometer/v0.9.7/standalone-0.9.7-r1/schemas/capability-config.schema.json",
"configSchemaSha256":"58c9c7bdbbb355002fb3cd62e7bc07c96f64640759ffcc388dbeddfa1c1d4a38",
"configRefContract":"Build Card capabilityConfigRefs.external_effect resolves an object containing every requiredFields entry.",
"testMatrix":["externality, cost, reversibility, and confirmation match the immutable action definition","progress never implies completion and terminal state produces a bound receipt","failure, cancellation, retry, and recovery preserve authority and user control"],
"fallback":"provide an inspectable draft or handoff without committing the external effect"
},
{"id":"carousel.sequence.01","capability":"carousel","title":"Carousel overlay","compatibleFormatProfiles":["web_public","app_interactive"],"requiredRuleIds":["CAROUSEL-01","A11Y-01","MOTION-02"],"requiredFields":["capability","items","currentItem","controls","keyboardBehavior","reducedMotionBehavior","staticFallback"],"configSchemaRef":"https://montri-th.github.io/Landometer/v0.9.7/standalone-0.9.7-r1/schemas/capability-config.schema.json","configSchemaSha256":"58c9c7bdbbb355002fb3cd62e7bc07c96f64640759ffcc388dbeddfa1c1d4a38","configRefContract":"Build Card capabilityConfigRefs.carousel resolves an object containing every requiredFields entry.","testMatrix":["current item, total count, previous, and next controls are perceivable and operable","focus, swipe, keyboard, autoplay, and reduced-motion behavior preserve order and control","no-script and static representations expose the same essential sequence"],"fallback":"ordered static list exposing every essential item"},
{"id":"social.feed.01","capability":"social_feed","title":"Social feed overlay","compatibleFormatProfiles":["web_public","app_interactive"],"requiredRuleIds":["SOCIAL-FEED-01","MEDIA-01","SECURITY-01"],"requiredFields":["capability","source","items","ordering","refreshPolicy","emptyState","errorState","accessibleSummary"],"configSchemaRef":"https://montri-th.github.io/Landometer/v0.9.7/standalone-0.9.7-r1/schemas/capability-config.schema.json","configSchemaSha256":"58c9c7bdbbb355002fb3cd62e7bc07c96f64640759ffcc388dbeddfa1c1d4a38","configRefContract":"Build Card capabilityConfigRefs.social_feed resolves an object containing every requiredFields entry.","testMatrix":["source, ordering, age, and refresh state remain visible and truthful","loading, empty, partial, stale, blocked, and failed provider states preserve the primary page meaning","provider content rights, alternatives, and outbound destinations are bound"],"fallback":"static approved highlights plus a direct source link"},
{
"id":"motion.approach.02",
"capability":"motion",
"title":"Beneficial motion overlay",
"compatibleFormatProfiles":["web_public","app_interactive","deck_presentation"],
"compatibleConformanceVariants":["web_public.browser","app_interactive.browser","app_interactive.native","deck_presentation.static"],
"requiredRuleIds":["MOTION-01","MOTION-03","A11Y-01","MOTION-02","MOTION-04","MOTIF-01","MOTIF-02","MOTIF-03","MOTIF-04","MOTIF-05","MOTIF-06"],
"requiredRuleIdsByRuntimeClass":{"browser_observer":["MOTION-02","MOTION-03"],"native_state":["MOTION-02","MOTION-03"],"presenter_sequence":["MOTION-03"]},
"requiredFieldsByRuntimeClass":{"browser_observer":["mode","opacityDurationMs","transformDurationMs","mediaDurationMs","blockDistancePx","inlineDistancePx","scaleFrom","staggerStepMs","staggerCapMs","staggerBeatCount","staggerDelayFormula","opacityEasing","transformEasing","pressEasing","observerThreshold","observerRootMargin","initializationWatchdogMs","reachedContentFailsafeFrames","finalHiddenFinalFlashForbidden","observersPerDocumentRoot","onceOnlyUnobserve","prePaintArmingRequiresNormalMotionAndObserver"],"native_state":["mode","feedbackDurationMs","stateDurationMs","maximumTransitionMs","reducedMotionFinalState","layoutGeometry","interruptionFinalState"],"presenter_sequence":["mode","sequencePurpose","trigger","stepDurationMs","maximumSteps","staticEquivalent","finalFrameRequired"]},
"configSchemaRef":"https://montri-th.github.io/Landometer/v0.9.7/standalone-0.9.7-r1/schemas/capability-config.schema.json#/$defs/motion",
"configSchemaSha256":"58c9c7bdbbb355002fb3cd62e7bc07c96f64640759ffcc388dbeddfa1c1d4a38",
"configRefContract":"Build Card capabilityConfigRefs.motion resolves a hash-bound configuration whose schema variant and complete required field set exactly match the selected runtime class.",
"testMatrix":["motion is assigned only when it clarifies state, sequence, progress, causality, or spatial continuity and the static final state preserves the same meaning","identity motion and motifs replay while at least 14% visible, stop off-screen, hold final state under reduced motion, no-JavaScript, and print, use no infinite iteration, carry registered jobs, stay within three moments per route, and sit on a measured carrier in every rendered theme"],
"testMatrixByRuntimeClass":{
"browser_observer":["reduced motion exposes the complete final state without dependence on observers or animation events","late initialization, restored history, blocked script, failed observer, and final-hidden-state probes cannot hide content","browser approach entry uses only opacity and transform with the exact motion-riddim-approach-03 timing distance direction and four-beat stagger formula while layout focus reading order and scroll position remain stable"],
"native_state":["platform reduced-motion mode preserves the complete final state and task causality without decorative movement","backgrounding, interruption, cancellation, restoration, and view disposal cannot hide content, lose progress, or leave an ambiguous transition state","native view order and platform accessibility traversal order preserve the same semantic reading sequence before, during, and after the state transition","native motion uses only the selected native_state configuration and stable native layout lifecycle without browser opacity-transform recipes observer fields Riddim distance tokens or stagger formulas"],
"presenter_sequence":["manual advance and presenter skip both reach the complete governed final frame without changing the approved slide meaning","static export contains the complete final frame and does not depend on browser observers, runtime reduced-motion APIs, or animation events","presenter motion uses only the selected presenter_sequence configuration and preserves slide object order and the complete final frame without browser observer fields opacity-transform recipes or Riddim stagger tokens"]
},
"fallback":"immediate complete final state with no transform or staged reveal",
"requiredFields":["mode"]
},
{
"id":"agent.action.01",
"capability":"agent_action",
"title":"Agent action overlay",
"compatibleFormatProfiles":["web_public","app_interactive"],
"requiredRuleIds":["AGENT-01","SECURITY-01","AUTHORITY-01","CTA-02"],
"requiredFields":["schemaVersion","releaseRef","definitionId","artifactId","actionId","allowedActorClasses","productScope","operation","input","permissionPolicy","sideEffect","confirmationPolicy","resultSchemaRef","resultSchemaSha256","receiptSchemaRef","receiptSchemaSha256","errorBehavior","recoveryPolicy"],
"configSchemaRef":"https://montri-th.github.io/Landometer/v0.9.7/standalone-0.9.7-r1/schemas/agent-action-definition.schema.json",
"configSchemaSha256":"e5b8f0b3f23b54d068943440c8d7b8dc7a4be3abc4b889f0d4f12e0c4e35c5d0",
"configRefContract":"Build Card capabilityConfigRefs.agent_action resolves a hash-bound immutable agent action definition containing every requiredFields entry.",
"testMatrix":["definition, actor, product scope, input schema, authority, operation, and side-effect axes remain hash-bound","external or costly actions require their distinct authority classes and consequential actions require confirmation","succeeded, failed, and cancelled terminal states bind result, recovery, and audience-safe receipt projections"],
"fallback":"read-only inspection or a human-reviewable draft with no committed side effect"
},
{
"id":"telemetry.privacy.01",
"capability":"telemetry",
"title":"Telemetry overlay",
"compatibleFormatProfiles":["web_public","app_interactive"],
"requiredRuleIds":["SECURITY-01","QA-01","OUTPUT-CLARITY-01"],
"requiredFields":["capability","events","consentPolicy","dataClassification","retention","destinations","redaction","failureBehavior"],
"configSchemaRef":"https://montri-th.github.io/Landometer/v0.9.7/standalone-0.9.7-r1/schemas/capability-config.schema.json",
"configSchemaSha256":"58c9c7bdbbb355002fb3cd62e7bc07c96f64640759ffcc388dbeddfa1c1d4a38",
"configRefContract":"Build Card capabilityConfigRefs.telemetry resolves an object containing every requiredFields entry.",
"testMatrix":["events collect only declared fields under the effective consent and classification policy","destinations, retention, redaction, opt-out, and deletion behavior are enforceable","blocked or failed telemetry never blocks the primary user outcome or leaks diagnostics"],
"fallback":"disable telemetry while preserving the complete user experience"
},
{
"id":"data.visualization.01",
"capability":"data_visualization",
"title":"Data visualization overlay",
"compatibleFormatProfiles":["web_public","app_interactive","document_flow","pdf_fixed","deck_presentation","social_static"],
"requiredRuleIds":["DATAVIZ-01","COMPARE-01","EVIDENCE-01","COLOR-01","A11Y-01","CLAIM-MACHINE-01","FORMAT-PARITY-01","DATAVIZ-02","DATAVIZ-03","DATAVIZ-04","DATAVIZ-05","GATE-01","EVID-05"],
"requiredFields":["capability","question","measure","unit","denominator","time","geography","dataGrain","transform","uncertainty","schemaRelease","claimIds","evidenceIds","accessibleAlternative","scaleFamilies","valueStates"],
"configSchemaRef":"https://montri-th.github.io/Landometer/v0.9.7/standalone-0.9.7-r1/schemas/capability-config.schema.json",
"configSchemaSha256":"58c9c7bdbbb355002fb3cd62e7bc07c96f64640759ffcc388dbeddfa1c1d4a38",
"configRefContract":"Build Card capabilityConfigRefs.data_visualization resolves an object containing every requiredFields entry.",
"testMatrix":["question measure unit denominator time geography and grain are visible or directly available","scale transform uncertainty missing states claims evidence schema and content release preserve the approved analytical meaning","Every family/theme uses its exact approved 41-sample color-srgb-10 LUT; classes 3/5/7/9 use round(i*40/(n-1)); no runtime interpolation, dark-anchor formula, clipping or silent normalization; all six value states and categorical variant/cue rules resolve and render."],
"testMatrixByFormatClass":{"interactive":["keyboard, screen reader, touch, focus, selection, filtering, and reset states expose the same proposition as the visual encoding","loading, empty, partial, error, and restored states preserve scale, annotation, uncertainty, source, and material limitation"],"static":["the final static visual and its proximate table or structured alternative expose the same proposition without implying unavailable interaction","native document structure, PDF tags, slide reading order, or social feed-size fixture preserves labels, sources, uncertainty, and material limitations"]},
"fallback":"labelled static final state plus an accessible table or equivalent"
},
{
"id":"map.spatial.01",
"capability":"map",
"title":"Spatial map overlay",
"compatibleFormatProfiles":["web_public","app_interactive","document_flow","pdf_fixed","deck_presentation","social_static"],
"requiredRuleIds":["MAP-01","COMPARE-01","EVIDENCE-01","COLOR-01","A11Y-01","CLAIM-MACHINE-01","FORMAT-PARITY-01","MEDIA-01","DATAVIZ-02","DATAVIZ-03","DATAVIZ-04","GATE-01","EVID-05"],
"requiredFields":["capability","geographyId","boundarySource","purpose","coveredArea","dataGrain","time","unit","schemaRelease","rightsAndAttribution","dataStates","nonSpatialAlternative","exportReceipt","scaleFamilies"],
"configSchemaRef":"https://montri-th.github.io/Landometer/v0.9.7/standalone-0.9.7-r1/schemas/capability-config.schema.json",
"configSchemaSha256":"58c9c7bdbbb355002fb3cd62e7bc07c96f64640759ffcc388dbeddfa1c1d4a38",
"configRefContract":"Build Card capabilityConfigRefs.map resolves an object containing every requiredFields entry.",
"testMatrix":["geography boundary coverage grain time unit projection claim evidence rights attribution schema and export receipt are declared","no-data out-of-scope and low-confidence states remain distinct without color alone and preserve the bounded spatial meaning","Map units carry one of six value states and the legend shows every present state; classes use exact theme-invariant light-source LUT samples; every delivered analytical value avoids applicable retired hue windows."],
"testMatrixByFormatClass":{"interactive":["keyboard, screen reader, touch, focus, selected, pan, zoom, and reset states expose the same bounded meaning as the visual map","loading, empty, partial, error, restored, and unavailable-layer states preserve boundary, coverage, source, and material limitations"],"static":["the final static map and its proximate non-spatial alternative expose the same bounded meaning without selected, focus, pan, or zoom affordances","native document structure, PDF tags, slide reading order, or social feed-size fixture preserves geography, legend, source, uncertainty, and material limitations"]},
"fallback":"labelled static map plus a non-spatial summary or table"
}
],
"equivalenceMap":{
"identity":{"web_public":"role-approved identity asset in the header, or governed live-text identity when no approved logo role exists","app_interactive":"role-approved identity asset in the app header, or governed live-text identity when no approved logo role exists","document_flow":"role-approved identity asset, or governed text identity in native document text","pdf_fixed":"role-approved identity asset, or governed text identity preserved as tagged or extractable text","deck_presentation":"role-approved identity asset, or governed text identity on the title and closing slides","social_static":"role-approved channel-safe identity asset, or governed text identity; never reconstruct a logo"},
"navigation":{"web_public":"semantic site and page navigation","app_interactive":"semantic product and task navigation","document_flow":"ecosystem and property routes plus external destinations in a related-destination group separate from the page index","pdf_fixed":"ecosystem and property routes plus external destinations in a related-destination group separate from PDF bookmarks","deck_presentation":"ecosystem and property routes plus external destinations in an opening or closing related-destination group separate from section markers","social_static":"not applicable; preserve a single destination cue"},
"sideBookmark":{"web_public":"anchored page index that moves into the mobile disclosure","app_interactive":"task or section index only when stable useful sections exist","document_flow":"heading-derived page index represented only as the table of contents","pdf_fixed":"heading-derived page index represented only as PDF bookmarks and visible contents","deck_presentation":"heading-derived page index represented only as the agenda or section-progress markers","social_static":"omit"},
"primaryCTA":{"web_public":"typed destination binding rendered as a direct control","app_interactive":"typed destination binding rendered as a direct control with result recovery and receipt when consequential","document_flow":"typed destination binding rendered as a working link or explicit instruction","pdf_fixed":"typed destination binding rendered as a working link with visible destination or explicit instruction","deck_presentation":"typed destination binding rendered as a working link with visible destination, verified QR with text, or explicit instruction","social_static":"typed route, external, download, form, or contact destination rendered as one specific destination cue"},
"motion":{"web_public":"role-gated enhancement with visible source and reduced-motion final state","app_interactive":"state and causality feedback with reduced-motion final state","document_flow":"static final state and structural sequence","pdf_fixed":"static final state and structural sequence","deck_presentation":"static final state by default; presenter animation only when sequence meaning requires it","social_static":"static final state; no motif, overlay or animated identity on OG or feed creatives"},
"evidence":{"web_public":"visible disclosure linked to stable claim and source records","app_interactive":"in-context disclosure linked to stable claim and source records","document_flow":"source note footnote or endnote plus evidence appendix when needed","pdf_fixed":"source note footnote or endnote plus evidence appendix when needed","deck_presentation":"compact slide cue plus source appendix","social_static":"compact evidence cue plus durable destination"},
"receipt":{"web_public":"runtime success error and reference state","app_interactive":"runtime result recovery and durable receipt proportional to consequence","document_flow":"audience-relevant document version or source record; internal production receipt remains in the artifact manifest","pdf_fixed":"final-byte validation recorded in the internal artifact manifest; expose only audience-relevant version or source metadata","deck_presentation":"audience-relevant version or source slide; internal production receipt remains in the artifact manifest","social_static":"publication sidecar kept outside the audience creative"},
"interfaceIcon":{"web_public":"approved outline rounded icon rendered with FILL 0 and accessible name through its control","app_interactive":"approved outline rounded icon rendered with FILL 0 and accessible name through its control","document_flow":"approved vector or embedded glyph with text equivalent and font-safe export","pdf_fixed":"outlined or embedded vector with text equivalent","deck_presentation":"editable approved vector or font-safe embedded glyph with text equivalent","social_static":"outlined approved vector; never substitute an interface icon for a logo"}
}
},
"formatKits":{
"schemaVersion":"1.4",
"releaseRef":"v0.9.7-owner.1",
"status":"active",
"note":"Current standalone 0.9.7 semantic production controls. Each artifact binds its selected kit, target, preset, exact delivery bytes, required test evidence and actual editable/native sources. These controls do not claim to supply native templates.",
"kits":[
{
"id":"kit.web.base.01",
"formatProfile":"web_public",
"targetProfileRefs":["target.web.responsive.360-1600.01"],
"roleMap":{"identity":"role-approved identity asset, or governed live-text identity when no approved logo role exists","heading":"native h1-h6 plus typography roles","body":"native paragraphs and lists","navigation":"nav links plus disclosure button","bookmark":"anchor index conditional on BOOKMARK-01","cta":"capsule link or button; circle only when icon-only","evidence":"proximate disclosure plus stable record link","motion":"static source plus optional motion-riddim-approach-03 adapter; identity motion and motifs only through the MotifFrame component with the shared MotionController (MOTION-04, MOTIF-01…06)","icon":"one approved six-size icon set per property (FAVICON-01)","linkPreview":"1200 × 630 OG creative with three recognisers (SOCIALFMT-01)"},
"requiredImplementationControls":["base tokens CSS","base component CSS","font manifest","icon subset manifest","no-script styles","print styles","icon set in six sizes with web manifest and theme-color","title pattern [page] · [product]","OG 1200 × 630 link-preview template","MotifFrame wrapper with exact runtime bytes, twelve final-state SVGs, manifest job validation and one page-level MotionController","Exact color-srgb-10 CSS or theme-invariant LUT classes; no runtime interpolation or light-to-dark anchor formula","no --scale-* or --series-* override inside the DATAVIZ-04 hue windows"],
"artifactProductionRequirement":"bind exact final web bytes, every editable or source file actually used, browser-fixture evidence, and a deployed-origin receipt"
},
{"id":"kit.app.base.01","formatProfile":"app_interactive","targetProfileRefs":["target.app.browser-responsive.360-1600.01","target.app.native-responsive.360-1280.01"],"roleMap":{"identity":"role-approved identity asset, or governed live-text identity when no approved logo role exists","heading":"semantic task and panel headings","navigation":"product and task navigation","cta":"direct stateful control with recovery and receipt","evidence":"in-context evidence and data receipt","motion":"runtime-specific browser observer or native state feedback plus a stable final state"},"requiredImplementationControls":["base tokens","state recipes","permission recipes","action receipt recipes","font manifest","icon subset manifest"],"artifactProductionRequirement":"bind exact final application bytes, the selected browser or native runtime target, every editable or source file actually used, runtime-specific state and accessibility evidence, and a production receipt"},
{"id":"kit.document.flow.01","formatProfile":"document_flow","targetProfileRefs":["target.document.a4-portrait.01"],"roleMap":{"identity":"role-approved identity asset, or governed text identity in native document text","title":"native document title style","heading":"native heading levels and updateable TOC","body":"native paragraph/list/table/caption/note styles","bookmark":"heading hierarchy and TOC","cta":"working labelled link block","evidence":"footnote, endnote, source block, or appendix","motion":"final state or numbered sequence"},"requiredImplementationControls":["style map","document properties map","table and figure styles","source-note styles","export preset"],"artifactProductionRequirement":"bind the exact editable source document or template actually used, the final delivery bytes, and representative document and PDF-export receipts"},
{"id":"kit.pdf.fixed.01","formatProfile":"pdf_fixed","targetProfileRefs":["target.pdf.a4-portrait.01"],"roleMap":{"identity":"role-approved identity asset, or governed text identity preserved as tagged or extractable text","heading":"tagged heading and bookmark","body":"tagged text with reading order","cta":"working annotation plus readable destination","evidence":"tagged note and durable source trail","motion":"final state or sequence frames"},"requiredImplementationControls":["export preset","tag map","metadata map","font embedding policy","link and bookmark verifier"],"artifactProductionRequirement":"bind the exact export preset actually used, final PDF bytes, and all-pages render, tags, text, font, link, and print receipts"},
{"id":"kit.deck.presentation.01","formatProfile":"deck_presentation","targetProfileRefs":["target.deck.16x9.01"],"roleMap":{"identity":"role-approved identity asset, or governed text identity preserved on the title and closing slides","title":"title master","section":"section master with progress","content":"one-idea content layouts","bookmark":"agenda and section marker","cta":"action slide with working link or verified QR","evidence":"visible source cue plus appendix","motion":"static equivalent; presenter sequence only when meaningful"},"requiredImplementationControls":["slide master","layout set","source-note style","chart and map layouts","PDF export preset"],"artifactProductionRequirement":"bind the exact editable deck or template actually used, final delivery bytes, and montage, distance, source, link, and PDF-export receipts"},
{"id":"kit.social.static.01","formatProfile":"social_static","targetProfileRefs":["target.social.square.1080.01","target.social.og.1200x630.01"],"roleMap":{"headline":"one approved message","identity":"role-approved channel-safe identity asset, or governed text identity; never reconstruct a logo","cta":"one destination cue, not a fake control","evidence":"compact source cue plus sidecar","motion":"not applicable"},"requiredImplementationControls":["1080 × 1080 safe-area template","square center-crop fixture","sidecar schema","feed-size fixture","1200 × 630 OG template with the 8px four-colour rule, panel and measure line","text-safe 1000 × 560 and central-630 fixtures"],"artifactProductionRequirement":"bind the exact editable source or template actually used, final channel bytes, and crop, feed-size, identity, and destination receipts"}
]
},
"targetProfiles":{
"schemaVersion":"1.3",
"releaseRef":"v0.9.7-owner.1",
"status":"active",
"unknownTargetBehavior":"block",
"extensionRegistry":null,
"socialStaticScope":"square_1080_and_og_1200x630",
"profiles":[
{
"id":"target.web.responsive.360-1600.01",
"formatProfile":"web_public",
"runtime":"browser",
"unit":"css_px",
"canvas":{"minimumInline":360,"nominalInline":1440,"maximumTestedInline":1600,"block":"content_driven"},
"safeArea":"browser viewport plus env safe-area insets",
"grid":{"gutterByRange":[16,24,32],"readingMax":760,"defaultMax":1120,"wideMax":1280},
"typeAdapter":"css-rem-clamp-v0.9.7",
"minimumDiscreteTarget":44,
"requiredFixtures":["360","600","900","1200","1440","1600","intermediate-stress"],
"fixtureCriteria":{
"360":"Render at exactly 360 × 800 CSS pixels at 100% zoom; no horizontal page overflow, clipped meaning, hidden primary action, or target below 44 × 44 CSS pixels is permitted.",
"600":"Render at exactly 600 × 900 CSS pixels at 100% zoom; navigation disclosure, reading order, Thai and Latin copy, and the primary action remain complete and operable.",
"900":"Render at exactly 900 × 900 CSS pixels at 100% zoom; the intermediate layout preserves hierarchy without an ungoverned breakpoint jump or overlap.",
"1200":"Render at exactly 1200 × 900 CSS pixels at 100% zoom; the desktop grid, navigation budget, evidence relationship, and action hierarchy remain intact.",
"1440":"Render at exactly 1440 × 900 CSS pixels at 100% zoom; content respects the 760/1120/1280 CSS-pixel container limits and does not create accidental empty bands.",
"1600":"Render at exactly 1600 × 1000 CSS pixels at 100% zoom; wide composition preserves the same reading path and does not stretch text beyond the governed reading measure.",
"intermediate-stress":"Render at exactly 713 × 823 CSS pixels with the governed longest Thai and English navigation, heading, and CTA strings; no wrap, truncation, overlap, orphan, or hidden destination changes meaning."
}
},
{
"id":"target.app.browser-responsive.360-1600.01",
"formatProfile":"app_interactive",
"runtime":"browser",
"unit":"css_px",
"canvas":{"minimumInline":360,"nominalInline":1440,"maximumTestedInline":1600,"block":"viewport_and_content"},
"safeArea":"browser viewport plus env safe-area insets",
"grid":{"gutterByRange":[16,24,32],"readingMax":760,"defaultMax":1120,"wideMax":1280},
"typeAdapter":"css-rem-clamp-v0.9.7",
"minimumDiscreteTarget":44,
"requiredFixtures":["360","600","900","1200","1440","1600","intermediate-stress"],
"fixtureCriteria":{
"360":"Render the browser application at exactly 360 × 800 CSS pixels; navigation, task state, permission state, and the primary action remain operable with targets at least 44 × 44 CSS pixels.",
"600":"Render the browser application at exactly 600 × 900 CSS pixels; panels and disclosures preserve focus order, labels, results, and recovery without clipping.",
"900":"Render the browser application at exactly 900 × 900 CSS pixels; the intermediate state layout preserves task causality without overlap or an ungoverned breakpoint jump.",
"1200":"Render the browser application at exactly 1200 × 900 CSS pixels; product navigation, task workspace, evidence, and result regions remain distinct and operable.",
"1440":"Render the browser application at exactly 1440 × 900 CSS pixels; the governed grid and reading measures hold through loading, success, empty, partial, stale, permission, and error states.",
"1600":"Render the browser application at exactly 1600 × 1000 CSS pixels; wide layout preserves task focus and does not separate controls from their status or result.",
"intermediate-stress":"Render at exactly 713 × 823 CSS pixels with the governed longest Thai and English task, navigation, error, and recovery strings; no control label or state meaning truncates."
}
},
{
"id":"target.app.native-responsive.360-1280.01",
"formatProfile":"app_interactive",
"runtime":"native",
"unit":"platform_dp",
"canvas":{"minimumInline":360,"nominalInline":768,"maximumTestedInline":1280,"block":"platform_window_and_content"},
"safeArea":"platform window plus declared system-bar, cutout, and gesture safe-area insets",
"grid":{"gutterByRange":[16,24,32],"readingMax":760,"defaultMax":1120,"wideMax":1280},
"typeAdapter":"platform-scaled-type-v0.9.7",
"minimumDiscreteTarget":44,
"requiredFixtures":["compact-360","regular-768","expanded-1280","dynamic-type-200","safe-area-interruption"],
"fixtureCriteria":{"compact-360":"Render in a native window exactly 360 × 800 platform dp with declared system insets; task navigation, state, and primary action remain visible and directly operable.","regular-768":"Render in a native window exactly 768 × 1024 platform dp; reading order, pane relationship, focus traversal, and state recovery remain coherent.","expanded-1280":"Render in a native window exactly 1280 × 900 platform dp; expanded panes do not detach controls from evidence, status, result, or recovery.","dynamic-type-200":"Render with platform text scaling set to exactly 200%; all content and controls recompose without clipped Thai or Latin text, overlap, or loss of the primary task.","safe-area-interruption":"Render with maximum declared system-bar/cutout insets, then background and restore the task once; focus, input, permission, progress, and recovery state remain truthful."}
},
{
"id":"target.document.a4-portrait.01",
"formatProfile":"document_flow",
"runtime":"static",
"unit":"mm_pt",
"canvas":{"widthMm":210,"heightMm":297},
"safeArea":{"topMm":20,"rightMm":18,"bottomMm":20,"leftMm":18},
"grid":{"columns":1,"baselinePt":6},
"typeAdapter":{"captionPt":8.5,"labelPt":9,"bodyPt":10.5,"bodyLeadingPt":15,"h3Pt":15,"h2Pt":21,"h1LatinPt":32,"h1ThaiPt":28},
"requiredFixtures":["native-structure","thai-latin-stress","short","long","pdf-export"],
"fixtureCriteria":{
"native-structure":"Inspect the editable document and confirm every used title, heading, paragraph, list, table, caption, note, language, and link role is native rather than simulated by spacing or appearance.",
"thai-latin-stress":"Lay out the governed longest Thai and English title, three heading levels, body paragraph, table cell, caption, note, and link strings at every used style; no collision, clipping, tofu, or unintended substitution is permitted.",
"short":"Produce an exact two-page A4 portrait document containing title, two heading levels, one table, one figure/caption, one note, and one CTA link; no stranded heading, accidental blank page, or broken reference is permitted.",
"long":"Produce an exact twenty-four-page A4 portrait document containing at least six top-level sections, a generated TOC, two tables, two figures, notes, cross-references, and a source appendix; pagination and every generated reference remain correct.",
"pdf-export":"Export the exact long fixture to PDF with identical section order, wording, links, alternatives, evidence cues, page identity, and material limitations."
}
},
{
"id":"target.pdf.a4-portrait.01",
"formatProfile":"pdf_fixed",
"runtime":"static",
"unit":"mm_pt",
"canvas":{"widthMm":210,"heightMm":297},
"safeArea":{"topMm":20,"rightMm":18,"bottomMm":20,"leftMm":18},
"grid":{"columns":1,"baselinePt":6},
"typeAdapter":"target.document.a4-portrait.01",
"export":{"colorIntent":"screen_and_print_srgb","fonts":"embed_or_approved_fallback","links":"preserve"},
"requiredFixtures":["all-pages-render","tags-order","thai-latin-stress","links-bookmarks","print"],
"fixtureCriteria":{"all-pages-render":"Render every delivered PDF page at 100% and 200% scale and inspect the complete montage; no page may be blank, clipped, substituted, duplicated, or missing.","tags-order":"Inspect the final PDF tag tree and reading order for every page; title, headings, paragraphs, lists, tables, figures, notes, and links follow the visible sequence without orphaned or duplicate meaningful content.","thai-latin-stress":"Extract and render the governed Thai and English stress corpus from final PDF bytes; glyphs remain selectable, correctly ordered, and free of tofu or unintended font substitution.","links-bookmarks":"Resolve every link and bookmark in the final PDF; labels are descriptive, bookmark order equals the heading hierarchy, and no destination is missing or redirected unexpectedly.","print":"Print-render every page on A4 at 100% scale in color and grayscale simulation; margins, text, graphics, evidence cues, and destinations remain legible and unclipped."}
},
{
"id":"target.deck.16x9.01",
"formatProfile":"deck_presentation",
"runtime":"static",
"unit":"px_pt",
"canvas":{"widthPx":1920,"heightPx":1080,"aspectRatio":"16:9"},
"safeArea":{"topPx":60,"rightPx":80,"bottomPx":60,"leftPx":80},
"grid":{"columns":12,"gutterPx":24},
"typeAdapter":{"sourceMinimumPt":12,"bodyMinimumPt":20,"sectionMinimumPt":28,"titleMinimumPt":32},
"requiredFixtures":["montage","room-distance","thai-latin-stress","overflow","pdf-export"],
"fixtureCriteria":{
"montage":"Render every slide in order as a complete 5-column montage with each thumbnail exactly 320 × 180 pixels; section transitions, repetition, density, and one-primary-idea sequencing remain legible.",
"room-distance":"Review the 1920 × 1080 deck on a 65-inch 16:9 display from exactly 5 metres; every primary idea, label, evidence cue, and action remains readable without presenter explanation.",
"thai-latin-stress":"Apply the governed longest Thai and English title, section, body, source, and action strings to every used layout; no overflow, collision, tofu, or unintended substitution is permitted.",
"overflow":"Populate every used layout to its declared maximum text, media, chart, map, source, and action capacity; all content remains inside the 60/80-pixel safe area with no auto-shrink below the governed minima.",
"pdf-export":"Export the complete deck to static PDF and verify identical slide order, primary meaning, source cues, alternatives, working links, and material limitations without relying on animation or speaker notes."
}
},
{
"id":"target.social.square.1080.01",
"formatProfile":"social_static",
"runtime":"static",
"unit":"px",
"canvas":{"widthPx":1080,"heightPx":1080,"aspectRatio":"1:1"},
"safeArea":{"topPx":80,"rightPx":80,"bottomPx":80,"leftPx":80},
"grid":{"columns":6,"gutterPx":24},
"typeAdapter":{"sourceMinimumPx":24,"bodyMinimumPx":32,"headlineMinimumPx":56},
"requiredFixtures":["feed-size","center-crop","safe-area","thai-latin-stress","destination-cue"],
"fixtureCriteria":{"feed-size":"Downsample the exact 1080 × 1080 final creative to 270 × 270 CSS pixels and review at 100% display scale; message, identity, evidence cue, and destination cue remain readable.","center-crop":"Crop the exact final creative to the centered 864 × 864 pixel region; the complete approved message, identity, evidence cue, and destination cue remain present and unambiguous.","safe-area":"Overlay an 80-pixel exclusion band on all four edges of the 1080 × 1080 final creative; no essential message, identity, evidence cue, or destination cue intersects the band.","thai-latin-stress":"Render the governed longest Thai and English headline, source, limitation, and destination strings within the final square; no clipping, collision, tofu, or unintended substitution is permitted.","destination-cue":"At both 1080 × 1080 and 270 × 270, exactly one truthful destination cue is readable and visually non-interactive; it matches the bound primary CTA destination and does not imitate a button."}
},
{
"id":"target.social.og.1200x630.01",
"formatProfile":"social_static",
"runtime":"static",
"unit":"px",
"canvas":{"widthPx":1200,"heightPx":630,"aspectRatio":"40:21"},
"safeArea":{"topPx":35,"rightPx":100,"bottomPx":35,"leftPx":100,"note":"text within 1000 × 560; symbol and first title line within the central 630 × 630 square; 2:1 crop tolerant"},
"grid":{"columns":12,"gutterPx":24},
"typeAdapter":{"sourceMinimumPx":22,"derivationNote":"The destination cue floor is 22px. Headline and body sizes must pass actual Thai/English feed-size and crop fixtures; historical 28px/48px proposals were never separately approved as fixed minima."},
"recognisers":{"fourColourRuleTopEdgePx":8,"panel":"brand.blue or one declared atmosphere recipe","measureLinePx":[3,5],"identityMaxHeightPx":56},
"requiredFixtures":["feed-size","text-safe-area","central-square-crop","two-to-one-crop","thai-latin-stress","destination-cue","recognisers"],
"fixtureCriteria":{
"feed-size":"Downsample the exact 1200 × 630 final creative to 600 × 315 CSS pixels and review at 100% display scale; the statement of what the reader will see, identity, evidence cue, and destination cue remain readable.",
"text-safe-area":"Overlay the 1000 × 560 text-safe region centered on the creative; every text element lies inside it.",
"central-square-crop":"Crop the exact final creative to the centered 630 × 630 square; the symbol or lockup and the first title line remain complete and unambiguous.",
"two-to-one-crop":"Crop the exact final creative to a centered 1200 × 600 region; message, identity, evidence cue, and destination cue remain present.",
"thai-latin-stress":"Render the governed longest Thai and English title, description, source, limitation, and destination strings within the final creative; no clipping, collision, tofu, or unintended substitution is permitted.",
"destination-cue":"At both 1200 × 630 and 600 × 315, exactly one truthful destination cue of at least 22px is readable and visually non-interactive; it matches the bound primary CTA destination and does not imitate a button.",
"recognisers":"The 8px four-colour rule spans the top edge, a Brand Blue panel or one declared atmosphere recipe is present, the 3 × 5px measure line is present, and the identity is at most 56px tall; no motif or animated variant is used."
}
}
]
},
"assetRegistry":{
"schemaVersion":"1.9",
"releaseRef":"v0.9.7-owner.1",
"status":"active",
"productionEligibility":"per_asset_role",
"packageBytesIncluded":true,
"sourceProvenance":{"identity":"project-source:Landometer-Logo-TransparentBG.png","textIdentity":"owner-approved canonical portfolio name: Landometer","fontsAndIcons":"approved-source-assets:font-and-icon-subsets","media":"artifact-owned role-scoped media registries; this shared release contains no editorial, evidence, data-visualization, map, or social-preview media"},
"resolutionPolicy":"Every artifact resolves the exact asset, role, surface, approval, rights, and byte hash. An unresolved role blocks public delivery or remains an internal preview under OUTPUT-CLARITY-01; it is never rendered as an audience caveat.",
"identity":[
{
"id":"identity.landometer.horizontal.source-candidate.01",
"role":"horizontal_lockup",
"defaultUse":"normal header, first encounter, and corporate signature after approval",
"provenanceRef":"project-source:Landometer-Logo-TransparentBG.png",
"packageFile":"Landometer-Logo-TransparentBG.png",
"mediaType":"image/png",
"bytes":903326,
"sha256":"8d706f8021bc4b4fdc0e89117244b54868687b74045be54002321de7aaa7ef92",
"pixelDimensions":{"width":23324,"height":6402},
"approvalStatus":"candidate",
"approvalDetail":"pending_owner_role_approval",
"allowedSurfaces":[],
"rights":{"status":"unknown","publicationPermission":false,"allowedAudiences":["internal_preview"],"conditions":"A separately approved role and surface record is required before delivery."},
"fallback":"Landometer",
"altOrTextEquivalent":"Landometer",
"minimumSize":null,
"clearSpace":null,
"reconstructionAllowed":false,
"cropAllowed":false,
"note":"Evidence source only. Public use resolves a separate role-scoped approval with surface, clear-space, minimum-size, and delivery records."
}
],
"textIdentityImplementations":[
{
"id":"identity.text.landometer.portfolio-name.01",
"kind":"governed_text_identity",
"role":"portfolio_name",
"canonicalText":"Landometer",
"localePolicy":"same_canonical_text_in_every_locale",
"approvalStatus":"approved",
"approvedBy":"Landometer owner",
"approvedAt":"2026-09-01T00:33:36+07:00",
"authorityEvidenceRef":"owner-message:2026-09-01:approve-v0.9.1",
"allowedFormatProfiles":["web_public","app_interactive","document_flow","pdf_fixed","deck_presentation","social_static"],
"allowedSurfaces":["web_header","app_header","document_identity","pdf_identity","deck_identity","social_identity"],
"allowedAudiences":["internal_preview","internal_operational","client","public"],
"publicationPermission":true,
"fontPolicy":"Select exactly one typographyBindings record for the delivered surface and runtime. The selected binding fixes font source, family, weight, size, minimum size, tracking, line height, clear space, substitution, final-output behavior, and verification fixtures.",
"typographyBindings":[
{"id":"identity-typography.web-header.browser.01","surface":"web_header","formatProfile":"web_public","renderingContext":"browser","platform":"browser","fontSourceKind":"packaged_web_font","fontAssetIds":["font.arvo.latin.700"],"nativeMappingId":null,"family":"Arvo","postScriptName":null,"weight":700,"style":"normal","size":20,"minimumSize":18,"sizeUnit":"css_px","trackingEm":0,"lineHeight":1.2,"clearSpaceEm":0.75,"substitutionAllowed":false,"finalOutputPolicy":"live_text_exact_packaged_font","requiredFixtureIds":["identity.web-header.font-load","identity.web-header.minimum-size","identity.web-header.clear-space"]},
{"id":"identity-typography.app-header.browser.01","surface":"app_header","formatProfile":"app_interactive","renderingContext":"browser","platform":"browser","fontSourceKind":"packaged_web_font","fontAssetIds":["font.arvo.latin.700"],"nativeMappingId":null,"family":"Arvo","postScriptName":null,"weight":700,"style":"normal","size":18,"minimumSize":16,"sizeUnit":"css_px","trackingEm":0,"lineHeight":1.2,"clearSpaceEm":0.75,"substitutionAllowed":false,"finalOutputPolicy":"live_text_exact_packaged_font","requiredFixtureIds":["identity.app-header.browser.font-load","identity.app-header.browser.minimum-size","identity.app-header.browser.clear-space"]},
{"id":"identity-typography.app-header.macos.01","surface":"app_header","formatProfile":"app_interactive","renderingContext":"native_editable","platform":"macos","fontSourceKind":"governed_native_mapping","fontAssetIds":[],"nativeMappingId":"fontmap.macos.identity-latin.georgia-bold.01","family":"Georgia","postScriptName":"Georgia-Bold","weight":700,"style":"normal","size":15,"minimumSize":13,"sizeUnit":"pt","trackingEm":0,"lineHeight":1.2,"clearSpaceEm":0.75,"substitutionAllowed":false,"finalOutputPolicy":"exact_native_font_live_text_and_embed_or_authorized_projection","requiredFixtureIds":["portability.macos.identity-latin.availability","portability.macos.identity-latin.no-substitution","identity.app-header.native.minimum-size"]},
{"id":"identity-typography.app-header.windows.01","surface":"app_header","formatProfile":"app_interactive","renderingContext":"native_editable","platform":"windows","fontSourceKind":"governed_native_mapping","fontAssetIds":[],"nativeMappingId":"fontmap.windows.identity-latin.georgia-bold.01","family":"Georgia","postScriptName":"Georgia-Bold","weight":700,"style":"normal","size":15,"minimumSize":13,"sizeUnit":"pt","trackingEm":0,"lineHeight":1.2,"clearSpaceEm":0.75,"substitutionAllowed":false,"finalOutputPolicy":"exact_native_font_live_text_and_embed_or_authorized_projection","requiredFixtureIds":["portability.windows.identity-latin.availability","portability.windows.identity-latin.no-substitution","identity.app-header.native.minimum-size"]},
{"id":"identity-typography.document.macos.01","surface":"document_identity","formatProfile":"document_flow","renderingContext":"native_editable","platform":"macos","fontSourceKind":"governed_native_mapping","fontAssetIds":[],"nativeMappingId":"fontmap.macos.identity-latin.georgia-bold.01","family":"Georgia","postScriptName":"Georgia-Bold","weight":700,"style":"normal","size":20,"minimumSize":14,"sizeUnit":"pt","trackingEm":0,"lineHeight":1.2,"clearSpaceEm":0.75,"substitutionAllowed":false,"finalOutputPolicy":"exact_native_font_live_text_and_embed_or_authorized_projection","requiredFixtureIds":["portability.macos.identity-latin.availability","portability.macos.identity-latin.no-substitution","portability.macos.identity-latin.fixed-export"]},
{"id":"identity-typography.document.windows.01","surface":"document_identity","formatProfile":"document_flow","renderingContext":"native_editable","platform":"windows","fontSourceKind":"governed_native_mapping","fontAssetIds":[],"nativeMappingId":"fontmap.windows.identity-latin.georgia-bold.01","family":"Georgia","postScriptName":"Georgia-Bold","weight":700,"style":"normal","size":20,"minimumSize":14,"sizeUnit":"pt","trackingEm":0,"lineHeight":1.2,"clearSpaceEm":0.75,"substitutionAllowed":false,"finalOutputPolicy":"exact_native_font_live_text_and_embed_or_authorized_projection","requiredFixtureIds":["portability.windows.identity-latin.availability","portability.windows.identity-latin.no-substitution","portability.windows.identity-latin.fixed-export"]},
{"id":"identity-typography.pdf.macos.01","surface":"pdf_identity","formatProfile":"pdf_fixed","renderingContext":"fixed_export","platform":"macos","fontSourceKind":"governed_native_mapping","fontAssetIds":[],"nativeMappingId":"fontmap.macos.identity-latin.georgia-bold.01","family":"Georgia","postScriptName":"Georgia-Bold","weight":700,"style":"normal","size":20,"minimumSize":14,"sizeUnit":"pt","trackingEm":0,"lineHeight":1.2,"clearSpaceEm":0.75,"substitutionAllowed":false,"finalOutputPolicy":"exact_native_font_live_text_and_embed_or_authorized_projection","requiredFixtureIds":["portability.macos.identity-latin.availability","portability.macos.identity-latin.fixed-export","identity.pdf.extractable-text-or-authorized-outline"]},
{"id":"identity-typography.pdf.windows.01","surface":"pdf_identity","formatProfile":"pdf_fixed","renderingContext":"fixed_export","platform":"windows","fontSourceKind":"governed_native_mapping","fontAssetIds":[],"nativeMappingId":"fontmap.windows.identity-latin.georgia-bold.01","family":"Georgia","postScriptName":"Georgia-Bold","weight":700,"style":"normal","size":20,"minimumSize":14,"sizeUnit":"pt","trackingEm":0,"lineHeight":1.2,"clearSpaceEm":0.75,"substitutionAllowed":false,"finalOutputPolicy":"exact_native_font_live_text_and_embed_or_authorized_projection","requiredFixtureIds":["portability.windows.identity-latin.availability","portability.windows.identity-latin.fixed-export","identity.pdf.extractable-text-or-authorized-outline"]},
{"id":"identity-typography.deck.macos.01","surface":"deck_identity","formatProfile":"deck_presentation","renderingContext":"native_editable","platform":"macos","fontSourceKind":"governed_native_mapping","fontAssetIds":[],"nativeMappingId":"fontmap.macos.identity-latin.georgia-bold.01","family":"Georgia","postScriptName":"Georgia-Bold","weight":700,"style":"normal","size":28,"minimumSize":22,"sizeUnit":"pt","trackingEm":0,"lineHeight":1.15,"clearSpaceEm":0.75,"substitutionAllowed":false,"finalOutputPolicy":"exact_native_font_live_text_and_embed_or_authorized_projection","requiredFixtureIds":["portability.macos.identity-latin.availability","portability.macos.identity-latin.fixed-export","identity.deck.minimum-size"]},
{"id":"identity-typography.deck.windows.01","surface":"deck_identity","formatProfile":"deck_presentation","renderingContext":"native_editable","platform":"windows","fontSourceKind":"governed_native_mapping","fontAssetIds":[],"nativeMappingId":"fontmap.windows.identity-latin.georgia-bold.01","family":"Georgia","postScriptName":"Georgia-Bold","weight":700,"style":"normal","size":28,"minimumSize":22,"sizeUnit":"pt","trackingEm":0,"lineHeight":1.15,"clearSpaceEm":0.75,"substitutionAllowed":false,"finalOutputPolicy":"exact_native_font_live_text_and_embed_or_authorized_projection","requiredFixtureIds":["portability.windows.identity-latin.availability","portability.windows.identity-latin.fixed-export","identity.deck.minimum-size"]},
{"id":"identity-typography.social.macos.01","surface":"social_identity","formatProfile":"social_static","renderingContext":"raster_export","platform":"macos","fontSourceKind":"governed_native_mapping","fontAssetIds":[],"nativeMappingId":"fontmap.macos.identity-latin.georgia-bold.01","family":"Georgia","postScriptName":"Georgia-Bold","weight":700,"style":"normal","size":30,"minimumSize":24,"sizeUnit":"pt","trackingEm":0,"lineHeight":1.15,"clearSpaceEm":0.75,"substitutionAllowed":false,"finalOutputPolicy":"exact_native_font_live_text_and_embed_or_authorized_projection","requiredFixtureIds":["portability.macos.identity-latin.availability","portability.macos.identity-latin.no-substitution","identity.social.final-pixel-review"]},
{"id":"identity-typography.social.windows.01","surface":"social_identity","formatProfile":"social_static","renderingContext":"raster_export","platform":"windows","fontSourceKind":"governed_native_mapping","fontAssetIds":[],"nativeMappingId":"fontmap.windows.identity-latin.georgia-bold.01","family":"Georgia","postScriptName":"Georgia-Bold","weight":700,"style":"normal","size":30,"minimumSize":24,"sizeUnit":"pt","trackingEm":0,"lineHeight":1.15,"clearSpaceEm":0.75,"substitutionAllowed":false,"finalOutputPolicy":"exact_native_font_live_text_and_embed_or_authorized_projection","requiredFixtureIds":["portability.windows.identity-latin.availability","portability.windows.identity-latin.no-substitution","identity.social.final-pixel-review"]}
],
"logoAssetId":null,
"logoReconstructionAllowed":false,
"fallback":"Landometer",
"note":"This is the approved canonical portfolio name rendered as text. It satisfies identity presence when no role-approved logo asset exists; it is not a logo, wordmark reconstruction, or substitute asset."
}
],
"fonts":[
{"id":"font.arvo.latin.700","family":"Arvo","role":"display_latin","subset":"latin","weight":700,"file":"arvo-latin-700-normal.woff2","packageFile":"arvo-latin-700-normal.woff2","mediaType":"font/woff2","bytes":17348,"sha256":"3d908a2c04ec4c59d26d1454008b2d6744480654663a5f88e439f6483976bd37","license":"OFL-1.1","licenseFileRef":"arvo-OFL.txt","approvalStatus":"approved","approvedBy":"Landometer owner","approvedAt":"2026-09-01T00:33:36+07:00","approvalReceiptRef":"asset-approval-receipt.json","approvalReceiptSha256":"fe4400d2d2e2a25a0232c9e64870bd814d41cca83acf6f17f5c6000535262e75"},
{"id":"font.ibm-plex-thai-looped.latin.700","family":"IBM Plex Sans Thai Looped","role":"display_thai","subset":"latin","weight":700,"file":"ibm-plex-sans-thai-looped-latin-700-normal.woff2","packageFile":"ibm-plex-sans-thai-looped-latin-700-normal.woff2","mediaType":"font/woff2","bytes":18012,"sha256":"47eb0fe82a8b96cc5f1ac057e2edad4d2550d6b73d4aa030697bf1678047c526","license":"OFL-1.1","licenseFileRef":"ibm-plex-sans-thai-looped-OFL.txt","approvalStatus":"approved","approvedBy":"Landometer owner","approvedAt":"2026-09-01T00:33:36+07:00","approvalReceiptRef":"asset-approval-receipt.json","approvalReceiptSha256":"fe4400d2d2e2a25a0232c9e64870bd814d41cca83acf6f17f5c6000535262e75"},
{"id":"font.ibm-plex-thai-looped.thai.700","family":"IBM Plex Sans Thai Looped","role":"display_thai","subset":"thai","weight":700,"file":"ibm-plex-sans-thai-looped-thai-700-normal.woff2","packageFile":"ibm-plex-sans-thai-looped-thai-700-normal.woff2","mediaType":"font/woff2","bytes":14176,"sha256":"fa03fc4dda6a69763997e79d50e0437795d06c02e1798bdacf3a2f5e685cea2c","license":"OFL-1.1","licenseFileRef":"ibm-plex-sans-thai-looped-OFL.txt","approvalStatus":"approved","approvedBy":"Landometer owner","approvedAt":"2026-09-01T00:33:36+07:00","approvalReceiptRef":"asset-approval-receipt.json","approvalReceiptSha256":"fe4400d2d2e2a25a0232c9e64870bd814d41cca83acf6f17f5c6000535262e75"},
{"id":"font.bai-jamjuree.latin.400","family":"Bai Jamjuree","role":"body_ui","subset":"latin","weight":400,"file":"bai-jamjuree-latin-400-normal.woff2","packageFile":"bai-jamjuree-latin-400-normal.woff2","mediaType":"font/woff2","bytes":11596,"sha256":"5200faf54f32adc1dc47b8522adbd1399e739f4ce5c9236866806c04d6397b19","license":"OFL-1.1","licenseFileRef":"bai-jamjuree-OFL.txt","approvalStatus":"approved","approvedBy":"Landometer owner","approvedAt":"2026-09-01T00:33:36+07:00","approvalReceiptRef":"asset-approval-receipt.json","approvalReceiptSha256":"fe4400d2d2e2a25a0232c9e64870bd814d41cca83acf6f17f5c6000535262e75"},
{"id":"font.bai-jamjuree.thai.400","family":"Bai Jamjuree","role":"body_ui","subset":"thai","weight":400,"file":"bai-jamjuree-thai-400-normal.woff2","packageFile":"bai-jamjuree-thai-400-normal.woff2","mediaType":"font/woff2","bytes":9168,"sha256":"357f8fe9fd08973568a061a2fc266a07819cdc33e8c9bb2b39985cc4ec49bfa9","license":"OFL-1.1","licenseFileRef":"bai-jamjuree-OFL.txt","approvalStatus":"approved","approvedBy":"Landometer owner","approvedAt":"2026-09-01T00:33:36+07:00","approvalReceiptRef":"asset-approval-receipt.json","approvalReceiptSha256":"fe4400d2d2e2a25a0232c9e64870bd814d41cca83acf6f17f5c6000535262e75"},
{"id":"font.bai-jamjuree.latin.600","family":"Bai Jamjuree","role":"body_ui_emphasis","subset":"latin","weight":600,"file":"bai-jamjuree-latin-600-normal.woff2","packageFile":"bai-jamjuree-latin-600-normal.woff2","mediaType":"font/woff2","bytes":11844,"sha256":"5ae338ac0db4222226ad96bf1b4b460030c3af1affabb475c67bf218b2eaa83f","license":"OFL-1.1","licenseFileRef":"bai-jamjuree-OFL.txt","approvalStatus":"approved","approvedBy":"Landometer owner","approvedAt":"2026-09-01T00:33:36+07:00","approvalReceiptRef":"asset-approval-receipt.json","approvalReceiptSha256":"fe4400d2d2e2a25a0232c9e64870bd814d41cca83acf6f17f5c6000535262e75"},
{"id":"font.bai-jamjuree.thai.600","family":"Bai Jamjuree","role":"body_ui_emphasis","subset":"thai","weight":600,"file":"bai-jamjuree-thai-600-normal.woff2","packageFile":"bai-jamjuree-thai-600-normal.woff2","mediaType":"font/woff2","bytes":9808,"sha256":"547483c6fbedcc13f4c04489c4ec3f6be4c69877ae7cd4cfbf4a0d289889ba32","license":"OFL-1.1","licenseFileRef":"bai-jamjuree-OFL.txt","approvalStatus":"approved","approvedBy":"Landometer owner","approvedAt":"2026-09-01T00:33:36+07:00","approvalReceiptRef":"asset-approval-receipt.json","approvalReceiptSha256":"fe4400d2d2e2a25a0232c9e64870bd814d41cca83acf6f17f5c6000535262e75"},
{"id":"font.jetbrains-mono.latin.400","family":"JetBrains Mono","role":"technical_latin","subset":"latin","weight":400,"file":"jetbrains-mono-latin-400-normal.woff2","packageFile":"jetbrains-mono-latin-400-normal.woff2","mediaType":"font/woff2","bytes":21168,"sha256":"14425ba9c695763c1547f48a206b7aa60350a33ae23de09f0407877f3fcd89eb","license":"OFL-1.1","licenseFileRef":"jetbrains-mono-OFL.txt","approvalStatus":"approved","approvedBy":"Landometer owner","approvedAt":"2026-09-01T00:33:36+07:00","approvalReceiptRef":"asset-approval-receipt.json","approvalReceiptSha256":"fe4400d2d2e2a25a0232c9e64870bd814d41cca83acf6f17f5c6000535262e75"},
{"id":"font.ibm-plex-thai.thai.400","family":"IBM Plex Sans Thai","role":"technical_thai","subset":"thai","weight":400,"file":"ibm-plex-sans-thai-thai-400-normal.woff2","packageFile":"ibm-plex-sans-thai-thai-400-normal.woff2","mediaType":"font/woff2","bytes":11804,"sha256":"2d66381c26d32bf2a95bfe559d1a5ed5475fcdac3fa128e45a33301010d42056","license":"OFL-1.1","licenseFileRef":"ibm-plex-sans-thai-OFL.txt","approvalStatus":"approved","approvedBy":"Landometer owner","approvedAt":"2026-09-01T00:33:36+07:00","approvalReceiptRef":"asset-approval-receipt.json","approvalReceiptSha256":"fe4400d2d2e2a25a0232c9e64870bd814d41cca83acf6f17f5c6000535262e75"}
],
"iconSubsets":[
{"id":"icon.material-symbols-rounded.open-in-new.300.01","family":"Material Symbols Rounded","role":"interface_icon","file":"material-symbols-rounded-open-in-new-300.woff2","packageFile":"material-symbols-rounded-open-in-new-300.woff2","mediaType":"font/woff2","bytes":1124,"sha256":"778b29f8befe5ba7a8f0f8188d4c12e3c53d00810dac10337609b04d8506d46e","axes":{"FILL":0,"wght":300,"GRAD":0,"opsz":20},"glyphs":["open_in_new"],"license":"Apache-2.0","licenseFileRef":"material-symbols-Apache-2.0.txt","approvalStatus":"approved","approvedBy":"Landometer owner","approvedAt":"2026-09-01T00:33:36+07:00","approvalReceiptRef":"asset-approval-receipt.json","approvalReceiptSha256":"fe4400d2d2e2a25a0232c9e64870bd814d41cca83acf6f17f5c6000535262e75"},
{"id":"icon.material-symbols-rounded.nav-7.300.01","family":"Material Symbols Rounded","role":"interface_icon","file":"material-symbols-rounded-nav-300.woff2","packageFile":"material-symbols-rounded-nav-300.woff2","mediaType":"font/woff2","bytes":2500,"sha256":"d7e283106ed2898726b24504c4e0f5ad524292984a90a4d29553c7dcf53b9657","axes":{"FILL":0,"wght":300,"GRAD":0,"opsz":24},"glyphs":["open_in_new","menu","close","light_mode","dark_mode","contrast","groups"],"license":"Apache-2.0","licenseFileRef":"material-symbols-Apache-2.0.txt","approvalStatus":"approved","approvedBy":"Landometer owner","approvedAt":"2026-09-01T00:33:36+07:00","approvalReceiptRef":"asset-approval-receipt.json","approvalReceiptSha256":"fe4400d2d2e2a25a0232c9e64870bd814d41cca83acf6f17f5c6000535262e75","note":"FILL 1 variants are excluded; selected state does not change icon fill."}
],
"nonWebPortability":{
"approvalStatus":"approved",
"approvedBy":"Landometer owner",
"approvedAt":"2026-09-01T00:33:36+07:00",
"authorityEvidenceRef":"owner-message:2026-09-01:approve-v0.9.1",
"selectionPolicy":"select_one_exact_platform_mapping_and_record_it; unavailable_mapping_blocks_delivery",
"supportedPlatforms":["macos","windows"],
"nativeFontMappings":[
{"id":"fontmap.macos.identity-latin.georgia-bold.01","platform":"macos","allowedFormatProfiles":["app_interactive","document_flow","pdf_fixed","deck_presentation","social_static"],"role":"identity_latin","family":"Georgia","postScriptName":"Georgia-Bold","weight":700,"style":"normal","substitutionAllowed":false,"editableSourcePolicy":"exact_named_font_available_and_live_text_or_delivery_blocks","fixedExportPolicy":"embed_exact_font_or_use_approved_vector_projection_or_verified_raster_pixels","vectorProjectionPolicy":"approved_generated_vector_asset_with_exact_hash_only","requiredFixtureIds":["portability.macos.identity-latin.availability","portability.macos.identity-latin.no-substitution","portability.macos.identity-latin.fixed-export"]},
{"id":"fontmap.windows.identity-latin.georgia-bold.01","platform":"windows","allowedFormatProfiles":["app_interactive","document_flow","pdf_fixed","deck_presentation","social_static"],"role":"identity_latin","family":"Georgia","postScriptName":"Georgia-Bold","weight":700,"style":"normal","substitutionAllowed":false,"editableSourcePolicy":"exact_named_font_available_and_live_text_or_delivery_blocks","fixedExportPolicy":"embed_exact_font_or_use_approved_vector_projection_or_verified_raster_pixels","vectorProjectionPolicy":"approved_generated_vector_asset_with_exact_hash_only","requiredFixtureIds":["portability.windows.identity-latin.availability","portability.windows.identity-latin.no-substitution","portability.windows.identity-latin.fixed-export"]},
{"id":"fontmap.macos.display-latin.georgia-bold.01","platform":"macos","allowedFormatProfiles":["app_interactive","document_flow","pdf_fixed","deck_presentation","social_static"],"role":"display_latin","family":"Georgia","postScriptName":"Georgia-Bold","weight":700,"style":"normal","substitutionAllowed":false,"editableSourcePolicy":"exact_named_font_available_and_live_text_or_delivery_blocks","fixedExportPolicy":"embed_exact_font_or_use_approved_vector_projection_or_verified_raster_pixels","vectorProjectionPolicy":"approved_generated_vector_asset_with_exact_hash_only","requiredFixtureIds":["portability.macos.display-latin.availability","portability.macos.display-latin.no-substitution","portability.macos.display-latin.fixed-export"]},
{"id":"fontmap.windows.display-latin.georgia-bold.01","platform":"windows","allowedFormatProfiles":["app_interactive","document_flow","pdf_fixed","deck_presentation","social_static"],"role":"display_latin","family":"Georgia","postScriptName":"Georgia-Bold","weight":700,"style":"normal","substitutionAllowed":false,"editableSourcePolicy":"exact_named_font_available_and_live_text_or_delivery_blocks","fixedExportPolicy":"embed_exact_font_or_use_approved_vector_projection_or_verified_raster_pixels","vectorProjectionPolicy":"approved_generated_vector_asset_with_exact_hash_only","requiredFixtureIds":["portability.windows.display-latin.availability","portability.windows.display-latin.no-substitution","portability.windows.display-latin.fixed-export"]},
{"id":"fontmap.macos.display-thai.thonburi-bold.01","platform":"macos","allowedFormatProfiles":["app_interactive","document_flow","pdf_fixed","deck_presentation","social_static"],"role":"display_thai","family":"Thonburi","postScriptName":"Thonburi-Bold","weight":700,"style":"normal","substitutionAllowed":false,"editableSourcePolicy":"exact_named_font_available_and_live_text_or_delivery_blocks","fixedExportPolicy":"embed_exact_font_or_use_approved_vector_projection_or_verified_raster_pixels","vectorProjectionPolicy":"approved_generated_vector_asset_with_exact_hash_only","requiredFixtureIds":["portability.macos.display-thai.availability","portability.macos.display-thai.no-substitution","portability.macos.display-thai.fixed-export"]},
{"id":"fontmap.windows.display-thai.leelawadee-ui-bold.01","platform":"windows","allowedFormatProfiles":["app_interactive","document_flow","pdf_fixed","deck_presentation","social_static"],"role":"display_thai","family":"Leelawadee UI","postScriptName":"LeelawadeeUI-Bold","weight":700,"style":"normal","substitutionAllowed":false,"editableSourcePolicy":"exact_named_font_available_and_live_text_or_delivery_blocks","fixedExportPolicy":"embed_exact_font_or_use_approved_vector_projection_or_verified_raster_pixels","vectorProjectionPolicy":"approved_generated_vector_asset_with_exact_hash_only","requiredFixtureIds":["portability.windows.display-thai.availability","portability.windows.display-thai.no-substitution","portability.windows.display-thai.fixed-export"]},
{"id":"fontmap.macos.body-ui.thonburi.01","platform":"macos","allowedFormatProfiles":["app_interactive","document_flow","pdf_fixed","deck_presentation","social_static"],"role":"body_ui","family":"Thonburi","postScriptName":"Thonburi","weight":400,"style":"normal","substitutionAllowed":false,"editableSourcePolicy":"exact_named_font_available_and_live_text_or_delivery_blocks","fixedExportPolicy":"embed_exact_font_or_use_approved_vector_projection_or_verified_raster_pixels","vectorProjectionPolicy":"approved_generated_vector_asset_with_exact_hash_only","requiredFixtureIds":["portability.macos.body-ui.availability","portability.macos.body-ui.no-substitution","portability.macos.body-ui.fixed-export"]},
{"id":"fontmap.windows.body-ui.leelawadee-ui.01","platform":"windows","allowedFormatProfiles":["app_interactive","document_flow","pdf_fixed","deck_presentation","social_static"],"role":"body_ui","family":"Leelawadee UI","postScriptName":"LeelawadeeUI","weight":400,"style":"normal","substitutionAllowed":false,"editableSourcePolicy":"exact_named_font_available_and_live_text_or_delivery_blocks","fixedExportPolicy":"embed_exact_font_or_use_approved_vector_projection_or_verified_raster_pixels","vectorProjectionPolicy":"approved_generated_vector_asset_with_exact_hash_only","requiredFixtureIds":["portability.windows.body-ui.availability","portability.windows.body-ui.no-substitution","portability.windows.body-ui.fixed-export"]},
{"id":"fontmap.macos.body-ui-emphasis.thonburi-bold.01","platform":"macos","allowedFormatProfiles":["app_interactive","document_flow","pdf_fixed","deck_presentation","social_static"],"role":"body_ui_emphasis","family":"Thonburi","postScriptName":"Thonburi-Bold","weight":700,"style":"normal","substitutionAllowed":false,"editableSourcePolicy":"exact_named_font_available_and_live_text_or_delivery_blocks","fixedExportPolicy":"embed_exact_font_or_use_approved_vector_projection_or_verified_raster_pixels","vectorProjectionPolicy":"approved_generated_vector_asset_with_exact_hash_only","requiredFixtureIds":["portability.macos.body-ui-emphasis.availability","portability.macos.body-ui-emphasis.no-substitution","portability.macos.body-ui-emphasis.fixed-export"]},
{"id":"fontmap.windows.body-ui-emphasis.leelawadee-ui-bold.01","platform":"windows","allowedFormatProfiles":["app_interactive","document_flow","pdf_fixed","deck_presentation","social_static"],"role":"body_ui_emphasis","family":"Leelawadee UI","postScriptName":"LeelawadeeUI-Bold","weight":700,"style":"normal","substitutionAllowed":false,"editableSourcePolicy":"exact_named_font_available_and_live_text_or_delivery_blocks","fixedExportPolicy":"embed_exact_font_or_use_approved_vector_projection_or_verified_raster_pixels","vectorProjectionPolicy":"approved_generated_vector_asset_with_exact_hash_only","requiredFixtureIds":["portability.windows.body-ui-emphasis.availability","portability.windows.body-ui-emphasis.no-substitution","portability.windows.body-ui-emphasis.fixed-export"]},
{"id":"fontmap.macos.technical-latin.menlo.01","platform":"macos","allowedFormatProfiles":["app_interactive","document_flow","pdf_fixed","deck_presentation","social_static"],"role":"technical_latin","family":"Menlo","postScriptName":"Menlo-Regular","weight":400,"style":"normal","substitutionAllowed":false,"editableSourcePolicy":"exact_named_font_available_and_live_text_or_delivery_blocks","fixedExportPolicy":"embed_exact_font_or_use_approved_vector_projection_or_verified_raster_pixels","vectorProjectionPolicy":"approved_generated_vector_asset_with_exact_hash_only","requiredFixtureIds":["portability.macos.technical-latin.availability","portability.macos.technical-latin.no-substitution","portability.macos.technical-latin.fixed-export"]},
{"id":"fontmap.windows.technical-latin.consolas.01","platform":"windows","allowedFormatProfiles":["app_interactive","document_flow","pdf_fixed","deck_presentation","social_static"],"role":"technical_latin","family":"Consolas","postScriptName":"Consolas","weight":400,"style":"normal","substitutionAllowed":false,"editableSourcePolicy":"exact_named_font_available_and_live_text_or_delivery_blocks","fixedExportPolicy":"embed_exact_font_or_use_approved_vector_projection_or_verified_raster_pixels","vectorProjectionPolicy":"approved_generated_vector_asset_with_exact_hash_only","requiredFixtureIds":["portability.windows.technical-latin.availability","portability.windows.technical-latin.no-substitution","portability.windows.technical-latin.fixed-export"]},
{"id":"fontmap.macos.technical-thai.thonburi.01","platform":"macos","allowedFormatProfiles":["app_interactive","document_flow","pdf_fixed","deck_presentation","social_static"],"role":"technical_thai","family":"Thonburi","postScriptName":"Thonburi","weight":400,"style":"normal","substitutionAllowed":false,"editableSourcePolicy":"exact_named_font_available_and_live_text_or_delivery_blocks","fixedExportPolicy":"embed_exact_font_or_use_approved_vector_projection_or_verified_raster_pixels","vectorProjectionPolicy":"approved_generated_vector_asset_with_exact_hash_only","requiredFixtureIds":["portability.macos.technical-thai.availability","portability.macos.technical-thai.no-substitution","portability.macos.technical-thai.fixed-export"]},
{"id":"fontmap.windows.technical-thai.leelawadee-ui.01","platform":"windows","allowedFormatProfiles":["app_interactive","document_flow","pdf_fixed","deck_presentation","social_static"],"role":"technical_thai","family":"Leelawadee UI","postScriptName":"LeelawadeeUI","weight":400,"style":"normal","substitutionAllowed":false,"editableSourcePolicy":"exact_named_font_available_and_live_text_or_delivery_blocks","fixedExportPolicy":"embed_exact_font_or_use_approved_vector_projection_or_verified_raster_pixels","vectorProjectionPolicy":"approved_generated_vector_asset_with_exact_hash_only","requiredFixtureIds":["portability.windows.technical-thai.availability","portability.windows.technical-thai.no-substitution","portability.windows.technical-thai.fixed-export"]}
],
"interfaceIconPolicy":{"policyId":"icon-policy.non-web.visible-label.01","defaultRepresentation":"visible_text_label","fontGlyphSubstitutionAllowed":false,"vectorProjectionPolicy":"approved_generated_vector_asset_with_exact_hash_only","editableSourcePolicy":"retain_complete_visible_label; optional_icon_must_be_registered_vector","fixedExportPolicy":"retain_complete_visible_label; vector_icon_requires_exact_registered_hash_and_text_equivalent","requiredFixtureIds":["portability.non-web.icon.visible-label","portability.non-web.icon.no-glyph-substitution","portability.non-web.icon.vector-hash-and-text-equivalent"]}
},
"media":[],
"licenseFiles":[
{"id":"license.arvo.ofl-1.1","license":"OFL-1.1","packageFile":"arvo-OFL.txt","mediaType":"text/plain","bytes":4508,"sha256":"f4f2cb57f7050c4e615863a39bf04811eada567d76d99b10b0f33d1e10e6cccd"},
{"id":"license.ibm-plex-sans-thai-looped.ofl-1.1","license":"OFL-1.1","packageFile":"ibm-plex-sans-thai-looped-OFL.txt","mediaType":"text/plain","bytes":4832,"sha256":"e3ac4237aef600394644cdab2375d7011b0f80d2229ff05f47df2e61a109ab57"},
{"id":"license.bai-jamjuree.ofl-1.1","license":"OFL-1.1","packageFile":"bai-jamjuree-OFL.txt","mediaType":"text/plain","bytes":5487,"sha256":"74b7deafa632a5ed301dc322fcc2867ac200402e06b6d0b0b01faf09b8514e3e"},
{"id":"license.jetbrains-mono.ofl-1.1","license":"OFL-1.1","packageFile":"jetbrains-mono-OFL.txt","mediaType":"text/plain","bytes":4524,"sha256":"403581b69dac5cff4079205e01c6b467e56af449ecbd7247693ddb1baafa005b"},
{"id":"license.ibm-plex-sans-thai.ofl-1.1","license":"OFL-1.1","packageFile":"ibm-plex-sans-thai-OFL.txt","mediaType":"text/plain","bytes":4796,"sha256":"1b4f4d1f1463b63f1356e7b6034ad5a94311b35ffb53cc4bf83f2fbda24450e4"},
{"id":"license.material-symbols.apache-2.0","license":"Apache-2.0","packageFile":"material-symbols-Apache-2.0.txt","mediaType":"text/plain","bytes":11357,"sha256":"58d1e17ffe5109a7ae296caafcadfdbe6a7d176f0bc4ab01e12a689b0499d8bd"}
],
"fallbacks":{"displayLatin":"Georgia, Cambria, Times New Roman, serif","displayThai":"Noto Sans Thai Looped, Leelawadee UI, Tahoma, sans-serif","body":"Noto Sans Thai, Leelawadee UI, Tahoma, sans-serif","technical":"SFMono-Regular, Consolas, Liberation Mono, monospace; use the body fallback for Thai glyph coverage","interfaceIcon":"approved inline vector or visible text label; never a missing-glyph box"},
"approvalAttestationRef":null,
"approvalAttestationSha256":null,
"portabilityFixtureCriteria":{
"identity.app-header.browser.clear-space":"The exact governed portability fixture identity.app-header.browser.clear-space passes without substitution, clipping, semantic loss, or an unresolved dependency.",
"identity.app-header.browser.font-load":"The exact governed portability fixture identity.app-header.browser.font-load passes without substitution, clipping, semantic loss, or an unresolved dependency.",
"identity.app-header.browser.minimum-size":"The final identity rendering passes the exact minimum-size rule named identity.app-header.browser.minimum-size in the selected target profile.",
"identity.app-header.native.minimum-size":"The final identity rendering passes the exact minimum-size rule named identity.app-header.native.minimum-size in the selected target profile.",
"identity.deck.minimum-size":"The final identity rendering passes the exact minimum-size rule named identity.deck.minimum-size in the selected target profile.",
"identity.pdf.extractable-text-or-authorized-outline":"The final identity remains tagged or extractable text unless an explicitly authorized, hash-bound outline projection is used.",
"identity.social.final-pixel-review":"The complete final social pixels pass identity shape, spacing, legibility, and crop review at delivery size.",
"identity.web-header.clear-space":"The exact governed portability fixture identity.web-header.clear-space passes without substitution, clipping, semantic loss, or an unresolved dependency.",
"identity.web-header.font-load":"The exact governed portability fixture identity.web-header.font-load passes without substitution, clipping, semantic loss, or an unresolved dependency.",
"identity.web-header.minimum-size":"The final identity rendering passes the exact minimum-size rule named identity.web-header.minimum-size in the selected target profile.",
"portability.macos.body-ui-emphasis.availability":"The exact named body-ui-emphasis resource is available in the declared platform runtime before layout or export begins.",
"portability.macos.body-ui-emphasis.fixed-export":"The final fixed export preserves the declared body-ui-emphasis appearance through exact embedding, an approved hash-bound vector projection, or verified final pixels.",
"portability.macos.body-ui-emphasis.no-substitution":"The final editable and rendered output uses the exact declared body-ui-emphasis resource with no silent substitution.",
"portability.macos.body-ui.availability":"The exact named body-ui resource is available in the declared platform runtime before layout or export begins.",
"portability.macos.body-ui.fixed-export":"The final fixed export preserves the declared body-ui appearance through exact embedding, an approved hash-bound vector projection, or verified final pixels.",
"portability.macos.body-ui.no-substitution":"The final editable and rendered output uses the exact declared body-ui resource with no silent substitution.",
"portability.macos.display-latin.availability":"The exact named display-latin resource is available in the declared platform runtime before layout or export begins.",
"portability.macos.display-latin.fixed-export":"The final fixed export preserves the declared display-latin appearance through exact embedding, an approved hash-bound vector projection, or verified final pixels.",
"portability.macos.display-latin.no-substitution":"The final editable and rendered output uses the exact declared display-latin resource with no silent substitution.",
"portability.macos.display-thai.availability":"The exact named display-thai resource is available in the declared platform runtime before layout or export begins.",
"portability.macos.display-thai.fixed-export":"The final fixed export preserves the declared display-thai appearance through exact embedding, an approved hash-bound vector projection, or verified final pixels.",
"portability.macos.display-thai.no-substitution":"The final editable and rendered output uses the exact declared display-thai resource with no silent substitution.",
"portability.macos.identity-latin.availability":"The exact named identity-latin resource is available in the declared platform runtime before layout or export begins.",
"portability.macos.identity-latin.fixed-export":"The final fixed export preserves the declared identity-latin appearance through exact embedding, an approved hash-bound vector projection, or verified final pixels.",
"portability.macos.identity-latin.no-substitution":"The final editable and rendered output uses the exact declared identity-latin resource with no silent substitution.",
"portability.macos.technical-latin.availability":"The exact named technical-latin resource is available in the declared platform runtime before layout or export begins.",
"portability.macos.technical-latin.fixed-export":"The final fixed export preserves the declared technical-latin appearance through exact embedding, an approved hash-bound vector projection, or verified final pixels.",
"portability.macos.technical-latin.no-substitution":"The final editable and rendered output uses the exact declared technical-latin resource with no silent substitution.",
"portability.macos.technical-thai.availability":"The exact named technical-thai resource is available in the declared platform runtime before layout or export begins.",
"portability.macos.technical-thai.fixed-export":"The final fixed export preserves the declared technical-thai appearance through exact embedding, an approved hash-bound vector projection, or verified final pixels.",
"portability.macos.technical-thai.no-substitution":"The final editable and rendered output uses the exact declared technical-thai resource with no silent substitution.",
"portability.non-web.icon.no-glyph-substitution":"No non-web output relies on a platform glyph whose appearance can change through substitution.",
"portability.non-web.icon.vector-hash-and-text-equivalent":"Every non-web vector icon is approved, hash-bound, and paired with its exact text equivalent.",
"portability.non-web.icon.visible-label":"Every non-web interface symbol has a proximate visible text label that preserves its exact action or destination.",
"portability.windows.body-ui-emphasis.availability":"The exact named body-ui-emphasis resource is available in the declared platform runtime before layout or export begins.",
"portability.windows.body-ui-emphasis.fixed-export":"The final fixed export preserves the declared body-ui-emphasis appearance through exact embedding, an approved hash-bound vector projection, or verified final pixels.",
"portability.windows.body-ui-emphasis.no-substitution":"The final editable and rendered output uses the exact declared body-ui-emphasis resource with no silent substitution.",
"portability.windows.body-ui.availability":"The exact named body-ui resource is available in the declared platform runtime before layout or export begins.",
"portability.windows.body-ui.fixed-export":"The final fixed export preserves the declared body-ui appearance through exact embedding, an approved hash-bound vector projection, or verified final pixels.",
"portability.windows.body-ui.no-substitution":"The final editable and rendered output uses the exact declared body-ui resource with no silent substitution.",
"portability.windows.display-latin.availability":"The exact named display-latin resource is available in the declared platform runtime before layout or export begins.",
"portability.windows.display-latin.fixed-export":"The final fixed export preserves the declared display-latin appearance through exact embedding, an approved hash-bound vector projection, or verified final pixels.",
"portability.windows.display-latin.no-substitution":"The final editable and rendered output uses the exact declared display-latin resource with no silent substitution.",
"portability.windows.display-thai.availability":"The exact named display-thai resource is available in the declared platform runtime before layout or export begins.",
"portability.windows.display-thai.fixed-export":"The final fixed export preserves the declared display-thai appearance through exact embedding, an approved hash-bound vector projection, or verified final pixels.",
"portability.windows.display-thai.no-substitution":"The final editable and rendered output uses the exact declared display-thai resource with no silent substitution.",
"portability.windows.identity-latin.availability":"The exact named identity-latin resource is available in the declared platform runtime before layout or export begins.",
"portability.windows.identity-latin.fixed-export":"The final fixed export preserves the declared identity-latin appearance through exact embedding, an approved hash-bound vector projection, or verified final pixels.",
"portability.windows.identity-latin.no-substitution":"The final editable and rendered output uses the exact declared identity-latin resource with no silent substitution.",
"portability.windows.technical-latin.availability":"The exact named technical-latin resource is available in the declared platform runtime before layout or export begins.",
"portability.windows.technical-latin.fixed-export":"The final fixed export preserves the declared technical-latin appearance through exact embedding, an approved hash-bound vector projection, or verified final pixels.",
"portability.windows.technical-latin.no-substitution":"The final editable and rendered output uses the exact declared technical-latin resource with no silent substitution.",
"portability.windows.technical-thai.availability":"The exact named technical-thai resource is available in the declared platform runtime before layout or export begins.",
"portability.windows.technical-thai.fixed-export":"The final fixed export preserves the declared technical-thai appearance through exact embedding, an approved hash-bound vector projection, or verified final pixels.",
"portability.windows.technical-thai.no-substitution":"The final editable and rendered output uses the exact declared technical-thai resource with no silent substitution."
},
"iconSets":[
{
"id":"iconset.landometer.portfolio.symbol.01",
"role":"icon_set",
"property":"portfolio",
"composition":"symbol on transparent (16/32/48/192); brand.beige tile (180/512)",
"sourceIdentity":{"ref":"montri-th/motif assets/identity/logo/landometer-symbol-color.png","sha256":"b818eeb6a6f4abeb7a8fac2b858de0e7a03a662dff371842a29ebfe4c21d12f6"},
"sizesPx":[16,32,48,180,192,512],
"files":[
{"sizePx":16,"role":"favicon","file":"icon-portfolio-16.png","background":"transparent","sha256":"c100627d5e8fc9d21d168dbf15f9fdab7f5d6931b04df5164e58137df77feca8","bytes":768},
{"sizePx":32,"role":"favicon","file":"icon-portfolio-32.png","background":"transparent","sha256":"5cd19dee724f1a72b2bdcd41467a26e03f76a4bc2d7bd1fe12de6b8b5de665c9","bytes":1773},
{"sizePx":48,"role":"favicon","file":"icon-portfolio-48.png","background":"transparent","sha256":"443857069292f6910b9e5cc0383cab6da4273acf1e18a47745864729fc46e08e","bytes":2897},
{"sizePx":180,"role":"apple-touch","file":"icon-portfolio-180.png","background":"brand.beige #F2F1DF","sha256":"41ac1e302345d29d791fcc26a5e7111aeb3a4e222dff63685743b43d0fdd6ef0","bytes":8893},
{"sizePx":192,"role":"manifest","file":"icon-portfolio-192.png","background":"transparent","sha256":"1d8bbd3d8656a83f33c51364d333bba7ca328faf3ae713238fa9450f7810bf8e","bytes":11929},
{"sizePx":512,"role":"manifest-maskable","file":"icon-portfolio-512.png","background":"brand.beige #F2F1DF","sha256":"d8939f6cc7891c47bbb3dce1ddb04d4c30ce4c7e78e29f6fb0061858dafc881f","bytes":28124}
],
"packageBytesIncluded":false,
"location":"build-kit/icons/",
"approvalStatus":"approved",
"approvalDetail":{"status":"owner_approved","decidedOn":"2026-09-15","evidenceRef":"owner-message:2026-09-15:0.9.3-answers","note":"Owner approval of the unchanged source portfolio icon_set is retained. Historical asset evidence applies only to those source bytes; the current standalone registry is unsigned."},
"rights":{"status":"owner_stated_not_independently_verified","publicationPermission":true,"allowedAudiences":["internal_preview","internal_operational","client","public"],"conditions":"Portfolio property only; product tiles require the product's approved identity gradient."},
"fallback":"governed text identity in the tab title",
"altOrTextEquivalent":"Landometer",
"generator":"build-kit/icons/generate-icon-set.py (deterministic; hashes recorded in icon-set.json)",
"note":"Product tiles (identity-gradient tile + symbol in the gradient's foreground contract) are produced per product once that product's gradient and symbol variant are approved (open item)."
}
],
"motifRegisterRef":{"ref":"motif-register.v0.9.7.json","sha256":"0c0092c5063ce67e6c8247193bd27a2da723af77070cae638cec5be363a09260","rules":["MOTION-04","MOTIF-01","MOTIF-02","MOTIF-03","MOTIF-04","MOTIF-05","MOTIF-06"]}
},
"motifRegister":{
"schemaVersion":"1.1",
"releaseRef":"v0.9.7-owner.1",
"status":"active",
"ruleIds":["MOTION-04","MOTIF-01","MOTIF-02","MOTIF-03","MOTIF-04","MOTIF-05","MOTIF-06"],
"source":{"repository":"https://github.com/montri-th/motif","commit":"a99f3c1e0250da91c7f13af8fe3ab8ad03b73e82","commitDate":"2026-09-11T01:56:40+07:00","manifest":{"path":"assets/motif-library.json","sha256":"77e8185104751e2c21c2e10fb8c5d771821bcb8123e02f116638fdbf3968d483","artifactRelease":"1.2.1","releaseDate":"2026-09-06","status":"owner_approved_publication"},"studioManifest":{"path":"assets/motif-studio-library.json","sha256":"945d7c9ab1437bf3ddc6acc863620e96f011f83b473c52c4fcb15303c39e3dcd","webExperienceRelease":"1.3.0","status":"current_user_requested_integration"},"hashVerification":"every manifest asset hash recomputed from the repository files at the commit above; 0 mismatches","governanceNote":"governance/SHA256SUMS.txt of the repository is stale for six site files (README.md, index.html, en/index.html, llms.txt, site.js, sitemap.xml) that are not used here"},
"jobRegistry":["orientation","opening","spatial_transition","section_orientation","layering","quiet_divider","action_closure","cultural_closure","handoff","animated_brand_opening"],
"beats":{"INTENT":"opening","AHA":"transition","NEXT_ACTION":"closing","kindsByBeat":{"opening":["logo","dial"],"transition":["rings","layers"],"closing":["slice","cultivate"]}},
"joyBudget":{"perLongRoute":3,"perTaskSurface":1,"forbiddenRegions":["first_answer","primary_proof","primary_action"]},
"sharedFamily":{
"id":"landometer.motif.v3",
"scope":"shared_landometer",
"manifestStatus":"owner_approved_overlay_not_in_canonical_release",
"motionMode":"finite_once",
"release":"1.2.1",
"runtime":[{"assetId":"landometer.motif.runtime.css.v3","role":"web_runtime","identityRole":"not_applicable","motif":null,"variant":null,"surface":null,"motionMode":"finite_once","path":"assets/landometer/landometer-motifs.css","sha256":"7cc2deb475a8d6e4af331407b2b4b741716c458a8ce885e2fb2859374b93912e","bytes":11190,"allowedJobs":["finite_once_motion"],"allowedFormats":["web_public"],"approvalStatus":"owner_approved_artifact_overlay","approvalRef":"governance/owner-approval.json","staticFallback":null},{"assetId":"landometer.motif.runtime.js.v3","role":"web_runtime","identityRole":"not_applicable","motif":null,"variant":null,"surface":null,"motionMode":"finite_once","path":"assets/landometer/landometer-motifs.js","sha256":"3a5caef7918a85885b61dd53e049ea8bf2b0a3cea508f587bb14970bfe6deaf2","bytes":17845,"allowedJobs":["finite_once_motion"],"allowedFormats":["web_public"],"approvalStatus":"owner_approved_artifact_overlay","approvalRef":"governance/owner-approval.json","staticFallback":null}],
"kinds":{
"dial":{
"beat":"opening",
"allowedJobs":["orientation","opening"],
"prohibitedJobs":["data_encoding","evidence","measured_state","loading_state","official_navigation_identity","favicon","co_brand_lockup"],
"allowedFormats":["web_public","deck_16x9","document_pdf","video_owner_extension"],
"cycleMs":3000,
"minimumCycleMs":2000,
"variants":{
"full":{"assetId":"landometer.dial.full","role":"generated_vector","identityRole":"none","motif":"dial","variant":"full","surface":"transparent","motionMode":"static","path":"assets/landometer/svg/dial-full.svg","sha256":"7ecfd1165a3e7ad25a0bb01b9680c35f71ff8a98edfd411dfe1b712cee12654d","bytes":674,"allowedJobs":["orientation","opening"],"allowedFormats":["web_public","deck_16x9","document_pdf","video_owner_extension"],"approvalStatus":"owner_approved_artifact_overlay","approvalRef":"governance/owner-approval.json","staticFallback":"self"},
"quiet":{"assetId":"landometer.dial.quiet","role":"generated_vector","identityRole":"none","motif":"dial","variant":"quiet","surface":"transparent","motionMode":"static","path":"assets/landometer/svg/dial-quiet.svg","sha256":"2e624d80b604891ad2ed3e4d5cc6268d2383f39f740ef1def5012c49aee0da1f","bytes":733,"allowedJobs":["orientation","opening"],"allowedFormats":["web_public","deck_16x9","document_pdf","video_owner_extension"],"approvalStatus":"owner_approved_artifact_overlay","approvalRef":"governance/owner-approval.json","staticFallback":"self"}
},
"allowedCarriers":{"full":["brand.beige","surface.alt@light","surface.beigeTint@light","surface.blueTint@light","surface.canvas@light","surface.card@light","surface.raised@light","surface.soft@light"],"quiet":["atmosphere.ground.current","atmosphere.measure.deep","brand.blue","surface.alt@dark","surface.beigeTint@dark","surface.blueTint@dark","surface.canvas@dark","surface.card@dark","surface.raised@dark","surface.soft@dark"]}
},
"rings":{
"beat":"transition",
"allowedJobs":["spatial_transition","section_orientation"],
"prohibitedJobs":["data_encoding","evidence","measured_state","loading_state","official_navigation_identity","favicon","co_brand_lockup"],
"allowedFormats":["web_public","deck_16x9","document_pdf","video_owner_extension"],
"cycleMs":3000,
"minimumCycleMs":2000,
"variants":{
"full":{"assetId":"landometer.rings.full","role":"generated_vector","identityRole":"none","motif":"rings","variant":"full","surface":"transparent","motionMode":"static","path":"assets/landometer/svg/rings-full.svg","sha256":"b50ec8fa3828ee5b3504ff05e0c47c1ae55f6b644225482454ec319809552286","bytes":552,"allowedJobs":["spatial_transition","section_orientation"],"allowedFormats":["web_public","deck_16x9","document_pdf","video_owner_extension"],"approvalStatus":"owner_approved_artifact_overlay","approvalRef":"governance/owner-approval.json","staticFallback":"self"},
"quiet":{"assetId":"landometer.rings.quiet","role":"generated_vector","identityRole":"none","motif":"rings","variant":"quiet","surface":"transparent","motionMode":"static","path":"assets/landometer/svg/rings-quiet.svg","sha256":"d494be1f72e833704cd3c20d9d41f60599991d6efd5f670a86e40a7296eb566b","bytes":833,"allowedJobs":["spatial_transition","section_orientation"],"allowedFormats":["web_public","deck_16x9","document_pdf","video_owner_extension"],"approvalStatus":"owner_approved_artifact_overlay","approvalRef":"governance/owner-approval.json","staticFallback":"self"}
},
"allowedCarriers":{"full":["brand.beige","surface.alt@light","surface.beigeTint@light","surface.blueTint@light","surface.canvas@light","surface.card@light","surface.raised@light","surface.soft@light"],"quiet":["atmosphere.ground.current","atmosphere.measure.deep","brand.blue","surface.alt@dark","surface.beigeTint@dark","surface.blueTint@dark","surface.canvas@dark","surface.card@dark","surface.raised@dark","surface.soft@dark"]}
},
"layers":{
"beat":"transition",
"allowedJobs":["layering","quiet_divider"],
"prohibitedJobs":["data_encoding","evidence","measured_state","loading_state","official_navigation_identity","favicon","co_brand_lockup"],
"allowedFormats":["web_public","deck_16x9","document_pdf","video_owner_extension"],
"cycleMs":3000,
"minimumCycleMs":2000,
"variants":{
"full":{"assetId":"landometer.layers.full","role":"generated_vector","identityRole":"none","motif":"layers","variant":"full","surface":"transparent","motionMode":"static","path":"assets/landometer/svg/layers-full.svg","sha256":"a94a59a342df39591f490deec960bba2263bc1c453620c557ff84a1c47901843","bytes":741,"allowedJobs":["layering","quiet_divider"],"allowedFormats":["web_public","deck_16x9","document_pdf","video_owner_extension"],"approvalStatus":"owner_approved_artifact_overlay","approvalRef":"governance/owner-approval.json","staticFallback":"self"},
"quiet":{"assetId":"landometer.layers.quiet","role":"generated_vector","identityRole":"none","motif":"layers","variant":"quiet","surface":"transparent","motionMode":"static","path":"assets/landometer/svg/layers-quiet.svg","sha256":"e3e2bf65bcd38d34d0a07910bef44917eab76fdaf097131ec133d163f6a65a03","bytes":1274,"allowedJobs":["layering","quiet_divider"],"allowedFormats":["web_public","deck_16x9","document_pdf","video_owner_extension"],"approvalStatus":"owner_approved_artifact_overlay","approvalRef":"governance/owner-approval.json","staticFallback":"self"}
},
"allowedCarriers":{"full":["surface.canvas@light","surface.card@light","surface.raised@light"],"quiet":["brand.blue","surface.alt@dark","surface.beigeTint@dark","surface.blueTint@dark","surface.canvas@dark","surface.card@dark","surface.raised@dark","surface.soft@dark"]}
},
"slice":{
"beat":"closing",
"allowedJobs":["action_closure"],
"prohibitedJobs":["data_encoding","evidence","measured_state","loading_state","official_navigation_identity","favicon","co_brand_lockup"],
"allowedFormats":["web_public","deck_16x9","document_pdf","video_owner_extension"],
"cycleMs":3000,
"minimumCycleMs":2000,
"variants":{
"full":{"assetId":"landometer.slice.full","role":"generated_vector","identityRole":"none","motif":"slice","variant":"full","surface":"transparent","motionMode":"static","path":"assets/landometer/svg/slice-full.svg","sha256":"8d0dfb62d1ac92738afcd76e8b61b544a5c72bf10b165983235900558447b2df","bytes":280,"allowedJobs":["action_closure"],"allowedFormats":["web_public","deck_16x9","document_pdf","video_owner_extension"],"approvalStatus":"owner_approved_artifact_overlay","approvalRef":"governance/owner-approval.json","staticFallback":"self"},
"quiet":{"assetId":"landometer.slice.quiet","role":"generated_vector","identityRole":"none","motif":"slice","variant":"quiet","surface":"transparent","motionMode":"static","path":"assets/landometer/svg/slice-quiet.svg","sha256":"c72114d43b81584cbb46251a5519f768087259bf135216f6ea7933a83df4de6b","bytes":350,"allowedJobs":["action_closure"],"allowedFormats":["web_public","deck_16x9","document_pdf","video_owner_extension"],"approvalStatus":"owner_approved_artifact_overlay","approvalRef":"governance/owner-approval.json","staticFallback":"self"}
},
"allowedCarriers":{"full":["brand.beige","surface.alt@light","surface.beigeTint@light","surface.blueTint@light","surface.canvas@light","surface.card@light","surface.raised@light","surface.soft@light"],"quiet":["atmosphere.ground.current","atmosphere.measure.deep","brand.blue","surface.alt@dark","surface.beigeTint@dark","surface.blueTint@dark","surface.canvas@dark","surface.card@dark","surface.raised@dark","surface.soft@dark"]}
},
"cultivate":{
"beat":"closing",
"allowedJobs":["cultural_closure","handoff"],
"prohibitedJobs":["data_encoding","evidence","measured_state","loading_state","official_navigation_identity","favicon","co_brand_lockup"],
"allowedFormats":["web_public","deck_16x9","document_pdf","video_owner_extension"],
"cycleMs":3000,
"minimumCycleMs":2000,
"variants":{
"full":{"assetId":"landometer.cultivate.full","role":"generated_vector","identityRole":"none","motif":"cultivate","variant":"full","surface":"transparent","motionMode":"static","path":"assets/landometer/svg/cultivate-full.svg","sha256":"ce494d792c12d73949a3dc8e6d18f6f93faa6aeab33d18b2de0889ab4af5af12","bytes":984,"allowedJobs":["cultural_closure","handoff"],"allowedFormats":["web_public","deck_16x9","document_pdf","video_owner_extension"],"approvalStatus":"owner_approved_artifact_overlay","approvalRef":"governance/owner-approval.json","staticFallback":"self"},
"quiet":{"assetId":"landometer.cultivate.quiet","role":"generated_vector","identityRole":"none","motif":"cultivate","variant":"quiet","surface":"transparent","motionMode":"static","path":"assets/landometer/svg/cultivate-quiet.svg","sha256":"edf8538107d30b078f0d7657bac054722ee88bdc10ddf7db00e63f44d077935f","bytes":1190,"allowedJobs":["cultural_closure","handoff"],"allowedFormats":["web_public","deck_16x9","document_pdf","video_owner_extension"],"approvalStatus":"owner_approved_artifact_overlay","approvalRef":"governance/owner-approval.json","staticFallback":"self"}
},
"allowedCarriers":{"full":["brand.beige","surface.alt@light","surface.beigeTint@light","surface.blueTint@light","surface.canvas@light","surface.card@light","surface.raised@light","surface.soft@light"],"quiet":["atmosphere.ground.current","atmosphere.measure.deep","brand.blue","surface.alt@dark","surface.beigeTint@dark","surface.blueTint@dark","surface.canvas@dark","surface.card@dark","surface.raised@dark","surface.soft@dark"]}
},
"logo":{
"beat":"opening",
"allowedJobs":["animated_brand_opening"],
"prohibitedJobs":["data_encoding","evidence","measured_state","loading_state","official_navigation_identity","favicon","co_brand_lockup"],
"allowedFormats":["web_public","deck_16x9","document_pdf","video_owner_extension"],
"cycleMs":6000,
"minimumCycleMs":2000,
"variants":{
"full":{"assetId":"landometer.logo.full","role":"generated_vector","identityRole":"animated_mark_assembly_reference","motif":"logo","variant":"full","surface":"transparent","motionMode":"static","path":"assets/landometer/svg/logo-full.svg","sha256":"90e9543f2f86a18f891331c13be25038b4334ca7dbe55b194650bc441e3558e1","bytes":1252,"allowedJobs":["animated_brand_opening"],"allowedFormats":["web_public","deck_16x9","document_pdf","video_owner_extension"],"approvalStatus":"owner_approved_artifact_overlay","approvalRef":"governance/owner-approval.json","staticFallback":"self"},
"quiet":{"assetId":"landometer.logo.quiet","role":"generated_vector","identityRole":"animated_mark_assembly_reference","motif":"logo","variant":"quiet","surface":"transparent","motionMode":"static","path":"assets/landometer/svg/logo-quiet.svg","sha256":"5b6798cdb6c3ada246286e6ce3386644f383c4f987a267e5c5db392809403e14","bytes":1979,"allowedJobs":["animated_brand_opening"],"allowedFormats":["web_public","deck_16x9","document_pdf","video_owner_extension"],"approvalStatus":"owner_approved_artifact_overlay","approvalRef":"governance/owner-approval.json","staticFallback":"self"}
},
"allowedCarriers":{"full":["brand.beige","surface.alt@light","surface.beigeTint@light","surface.blueTint@light","surface.canvas@light","surface.card@light","surface.raised@light","surface.soft@light"],"quiet":["atmosphere.ground.current","atmosphere.measure.deep","brand.blue","surface.alt@dark","surface.beigeTint@dark","surface.blueTint@dark","surface.canvas@dark","surface.card@dark","surface.raised@dark","surface.soft@dark"]}
}
},
"replayContract":{"authority":"OWNER-MOTION-01 (2026-09-11)","observerThreshold":0.14,"observerRootMargin":"0px 0px -8% 0px","technique":"repeated finite plays; animation-iteration-count: infinite forbidden","pageControl":"one MotionController per page","reducedMotion":"final state","noJavaScript":"final-state SVG","print":"final-state SVG"}
},
"productOverlays":[
{
"id":"ijji.logo-sting.r3",
"product":"ijji",
"scope":"ijji_product_specific",
"manifestStatus":"owner_approved_artifact_overlay_not_in_canonical_release",
"motionMode":"finite_once_logo_sting",
"lifecycle":"play_once_when_at_least_14_percent_visible_then_hold_complete_final_identity; mark_only_uses_notagline; honor_prefers_reduced_motion",
"durationMs":{"full":9000,"markOnly":6400},
"minSizePx":{"full":320,"markOnly":160},
"sequence":"Hop → Bodies → Tagline → Hello → Hold",
"approval":{"status":"owner_approved","by":"manifest 1.2.1 (governance/owner-approval.json) and Design System owner decision","decidedOn":"2026-09-15","evidenceRef":"owner-message:2026-09-15:0.9.3-answers"},
"assets":[
{"assetId":"ijji.logo-sting.tagline","role":"raster_identity","identityRole":"animated_logo_final_fallback","motif":"logo-sting","variant":"tagline","surface":"brand-blue","motionMode":"static","path":"assets/ijji/logo-sting/layers/ijji-logo-still.png","sha256":"bb1bc80e0c79a10dedb1b48c39efd187e97fe429adec4917975e265f610ccaac","bytes":222927,"allowedJobs":["ijji_animated_identity_with_tagline"],"allowedFormats":["web_public","deck_16x9","document_pdf","video_owner_extension"],"approvalStatus":"owner_approved_artifact_overlay","approvalRef":"governance/owner-approval.json","staticFallback":"self"},
{"assetId":"ijji.logo-sting.mark","role":"raster_identity","identityRole":"animated_mark_final_fallback","motif":"logo-sting","variant":"mark_only","surface":"transparent","motionMode":"static","path":"assets/ijji/logo-sting/layers/ijji-mark-still.png","sha256":"acac2c65b1a17c1956686c3fdbb2a0a6dc3c547c35be1ca128675d28b0ffc630","bytes":110298,"allowedJobs":["ijji_animated_identity_mark_only"],"allowedFormats":["web_public","deck_16x9","document_pdf","video_owner_extension"],"approvalStatus":"owner_approved_artifact_overlay","approvalRef":"governance/owner-approval.json","staticFallback":"self"},
{"assetId":"ijji.logo-sting.runtime.r3","role":"web_runtime","identityRole":"animated_identity_runtime","motif":null,"variant":null,"surface":null,"motionMode":"finite_once_logo_sting","path":"assets/ijji/logo-sting/ijji-logo-sting.js","sha256":"1a1d1bc247b5deb92aa19e4d84524ac1f823454a9401b6ce53acf8716010433e","bytes":12656,"allowedJobs":["finite_once_logo_sting"],"allowedFormats":["web_public"],"approvalStatus":"owner_approved_artifact_overlay","approvalRef":"governance/owner-approval.json","staticFallback":null},
{"assetId":"ijji.logo-sting.layer.i-1","role":"runtime_layer","identityRole":"animated_identity_source_layer","motif":null,"variant":null,"surface":null,"motionMode":"runtime_dependency","path":"assets/ijji/logo-sting/layers/i-1.png","sha256":"df5fb769b2bcf84a5bbb64a5b7be424463b3883632b722cebc5d9c4a29362ac6","bytes":16689,"allowedJobs":["runtime_dependency_only"],"allowedFormats":["web_public"],"approvalStatus":"owner_approved_artifact_overlay","approvalRef":"governance/owner-approval.json","staticFallback":null},
{"assetId":"ijji.logo-sting.layer.i-2","role":"runtime_layer","identityRole":"animated_identity_source_layer","motif":null,"variant":null,"surface":null,"motionMode":"runtime_dependency","path":"assets/ijji/logo-sting/layers/i-2.png","sha256":"857ca5198e350fd02f644d492f1b7b0b14b9cacb9f2dd21f2031788678ce80f5","bytes":16357,"allowedJobs":["runtime_dependency_only"],"allowedFormats":["web_public"],"approvalStatus":"owner_approved_artifact_overlay","approvalRef":"governance/owner-approval.json","staticFallback":null},
{"assetId":"ijji.logo-sting.layer.jj","role":"runtime_layer","identityRole":"animated_identity_source_layer","motif":null,"variant":null,"surface":null,"motionMode":"runtime_dependency","path":"assets/ijji/logo-sting/layers/jj.png","sha256":"cb2743b05ee7d3270bef5e5f5a5bec2916e6fe6b1e99d85793ebbd1ec398dd93","bytes":46738,"allowedJobs":["runtime_dependency_only"],"allowedFormats":["web_public"],"approvalStatus":"owner_approved_artifact_overlay","approvalRef":"governance/owner-approval.json","staticFallback":null},
{"assetId":"ijji.logo-sting.layer.tag-1-1","role":"runtime_layer","identityRole":"animated_identity_source_layer","motif":null,"variant":null,"surface":null,"motionMode":"runtime_dependency","path":"assets/ijji/logo-sting/layers/tag-1-1.png","sha256":"6b51513e93df40e2a00b928d606373e688a3b6dd9e6869a6e803a7bef5ab7784","bytes":17822,"allowedJobs":["runtime_dependency_only"],"allowedFormats":["web_public"],"approvalStatus":"owner_approved_artifact_overlay","approvalRef":"governance/owner-approval.json","staticFallback":null},
{"assetId":"ijji.logo-sting.layer.tag-1-2","role":"runtime_layer","identityRole":"animated_identity_source_layer","motif":null,"variant":null,"surface":null,"motionMode":"runtime_dependency","path":"assets/ijji/logo-sting/layers/tag-1-2.png","sha256":"fb72390fe3125ed5c5ab9c2bafd03fb71cb74e751ebd7f14737ac7c0367117fa","bytes":32636,"allowedJobs":["runtime_dependency_only"],"allowedFormats":["web_public"],"approvalStatus":"owner_approved_artifact_overlay","approvalRef":"governance/owner-approval.json","staticFallback":null},
{"assetId":"ijji.logo-sting.layer.tag-1-3","role":"runtime_layer","identityRole":"animated_identity_source_layer","motif":null,"variant":null,"surface":null,"motionMode":"runtime_dependency","path":"assets/ijji/logo-sting/layers/tag-1-3.png","sha256":"5e01f5a2303ba67e18e69153003ba1f363e6eb1c80b67aa68115b8e434072ff0","bytes":24199,"allowedJobs":["runtime_dependency_only"],"allowedFormats":["web_public"],"approvalStatus":"owner_approved_artifact_overlay","approvalRef":"governance/owner-approval.json","staticFallback":null},
{"assetId":"ijji.logo-sting.layer.tag-2-1","role":"runtime_layer","identityRole":"animated_identity_source_layer","motif":null,"variant":null,"surface":null,"motionMode":"runtime_dependency","path":"assets/ijji/logo-sting/layers/tag-2-1.png","sha256":"2e4529e6961ffa9508ae12e4346cba6870f009cc4851e2a9c613e69ef7999cf8","bytes":24136,"allowedJobs":["runtime_dependency_only"],"allowedFormats":["web_public"],"approvalStatus":"owner_approved_artifact_overlay","approvalRef":"governance/owner-approval.json","staticFallback":null},
{"assetId":"ijji.logo-sting.layer.tag-2-2","role":"runtime_layer","identityRole":"animated_identity_source_layer","motif":null,"variant":null,"surface":null,"motionMode":"runtime_dependency","path":"assets/ijji/logo-sting/layers/tag-2-2.png","sha256":"ea066302ab3f407d258260f85ba19cd184b5ddbfa313f1f480726639b9ef3713","bytes":16080,"allowedJobs":["runtime_dependency_only"],"allowedFormats":["web_public"],"approvalStatus":"owner_approved_artifact_overlay","approvalRef":"governance/owner-approval.json","staticFallback":null},
{"assetId":"ijji.logo-sting.layer.tag-2-3","role":"runtime_layer","identityRole":"animated_identity_source_layer","motif":null,"variant":null,"surface":null,"motionMode":"runtime_dependency","path":"assets/ijji/logo-sting/layers/tag-2-3.png","sha256":"3821e99ab1ff83edc12b95e06c2d2fc2cd1019905900a8f15fc57481b7d367c4","bytes":23984,"allowedJobs":["runtime_dependency_only"],"allowedFormats":["web_public"],"approvalStatus":"owner_approved_artifact_overlay","approvalRef":"governance/owner-approval.json","staticFallback":null}
]
},
{
"id":"ijji.four-beat.selected-3.r3",
"product":"ijji",
"scope":"ijji_product_specific",
"manifestStatus":"selected_owner_approved_overlay_not_in_canonical_release",
"motionMode":"state_bound_only",
"lifecycle":"run_only_while_a_real_pending_operation_exists; stop_on_success_failure_cancel_or_timeout; visible_status_and_working_cancel_required",
"stateBound":true,
"requires":["visible status text","working cancel control","stop on success, failure, cancel or timeout"],
"approval":{"status":"owner_approved","by":"manifest 1.2.1 (governance/owner-approval.json) and Design System owner decision","decidedOn":"2026-09-15","evidenceRef":"owner-message:2026-09-15:0.9.3-answers"},
"assets":[
{"assetId":"ijji.graph-b-canvas","role":"generated_vector","identityRole":"none","motif":"graph-b","variant":"not_applicable","surface":"canvas","motionMode":"static","path":"assets/ijji/svg/ijji-graph-b-canvas.svg","sha256":"d8424a94bb8023e0a6d0f63b442e8d6255b9e65c2c6452631a6e11993cec2e9a","bytes":8317,"allowedJobs":["real_calculation_pending_state","secondary_orientation"],"allowedFormats":["web_public","deck_16x9","document_pdf","video_owner_extension"],"approvalStatus":"owner_approved_artifact_overlay","approvalRef":"governance/owner-approval.json","staticFallback":"self"},
{"assetId":"ijji.graph-b-brand-blue","role":"generated_vector","identityRole":"none","motif":"graph-b","variant":"not_applicable","surface":"brand-blue","motionMode":"static","path":"assets/ijji/svg/ijji-graph-b-brand-blue.svg","sha256":"f99e49088f14a97e6ba5c787708a1d1252734638d0f363f0c2f113258f57ee48","bytes":8287,"allowedJobs":["real_calculation_pending_state","secondary_orientation"],"allowedFormats":["web_public","deck_16x9","document_pdf","video_owner_extension"],"approvalStatus":"owner_approved_artifact_overlay","approvalRef":"governance/owner-approval.json","staticFallback":"self"},
{"assetId":"ijji.graph-b-ground-mist","role":"generated_vector","identityRole":"none","motif":"graph-b","variant":"not_applicable","surface":"ground-mist","motionMode":"static","path":"assets/ijji/svg/ijji-graph-b-ground-mist.svg","sha256":"591d69e5286fed28e4022b6d02aa3cb6d6a8d8a461df91ba24de8907e3f5807a","bytes":8671,"allowedJobs":["real_calculation_pending_state","secondary_orientation"],"allowedFormats":["web_public","deck_16x9","document_pdf","video_owner_extension"],"approvalStatus":"owner_approved_artifact_overlay","approvalRef":"governance/owner-approval.json","staticFallback":"self"},
{"assetId":"ijji.graph-b-dark","role":"generated_vector","identityRole":"none","motif":"graph-b","variant":"not_applicable","surface":"dark","motionMode":"static","path":"assets/ijji/svg/ijji-graph-b-dark.svg","sha256":"92ed292262b34111d21cbd26ae2fbd8231bda37c2160d0f8ada8d19750d81c19","bytes":8315,"allowedJobs":["real_calculation_pending_state","secondary_orientation"],"allowedFormats":["web_public","deck_16x9","document_pdf","video_owner_extension"],"approvalStatus":"owner_approved_artifact_overlay","approvalRef":"governance/owner-approval.json","staticFallback":"self"},
{"assetId":"ijji.graph-b-transparent-mint","role":"generated_vector","identityRole":"none","motif":"graph-b","variant":"not_applicable","surface":"transparent-mint","motionMode":"static","path":"assets/ijji/svg/ijji-graph-b-transparent-mint.svg","sha256":"5df64c77388dc1e0f6ddf83080578db9f945966eb2c4f0c09187db2a4b54f7f7","bytes":8217,"allowedJobs":["real_calculation_pending_state","secondary_orientation"],"allowedFormats":["web_public","deck_16x9","document_pdf","video_owner_extension"],"approvalStatus":"owner_approved_artifact_overlay","approvalRef":"governance/owner-approval.json","staticFallback":"self"},
{"assetId":"ijji.graph-b-transparent-ink","role":"generated_vector","identityRole":"none","motif":"graph-b","variant":"not_applicable","surface":"transparent-ink","motionMode":"static","path":"assets/ijji/svg/ijji-graph-b-transparent-ink.svg","sha256":"92c6952e506564e4a85ac8f059890329e50662fa50963292c909c1052bac372a","bytes":8344,"allowedJobs":["real_calculation_pending_state","secondary_orientation"],"allowedFormats":["web_public","deck_16x9","document_pdf","video_owner_extension"],"approvalStatus":"owner_approved_artifact_overlay","approvalRef":"governance/owner-approval.json","staticFallback":"self"},
{"assetId":"ijji.rings-c-canvas","role":"generated_vector","identityRole":"none","motif":"rings-c","variant":"not_applicable","surface":"canvas","motionMode":"static","path":"assets/ijji/svg/ijji-rings-c-canvas.svg","sha256":"e631ec90f2a9ea4cc948b47dd1de3803b63f667dfa41ce271c2523161e0be454","bytes":8560,"allowedJobs":["real_area_gathering_pending_state","secondary_orientation"],"allowedFormats":["web_public","deck_16x9","document_pdf","video_owner_extension"],"approvalStatus":"owner_approved_artifact_overlay","approvalRef":"governance/owner-approval.json","staticFallback":"self"},
{"assetId":"ijji.rings-c-brand-blue","role":"generated_vector","identityRole":"none","motif":"rings-c","variant":"not_applicable","surface":"brand-blue","motionMode":"static","path":"assets/ijji/svg/ijji-rings-c-brand-blue.svg","sha256":"82e0a26220f54fda854b3e4665c3c6bca64c43d19b048e23bea8a5123be7c276","bytes":8530,"allowedJobs":["real_area_gathering_pending_state","secondary_orientation"],"allowedFormats":["web_public","deck_16x9","document_pdf","video_owner_extension"],"approvalStatus":"owner_approved_artifact_overlay","approvalRef":"governance/owner-approval.json","staticFallback":"self"},
{"assetId":"ijji.rings-c-ground-mist","role":"generated_vector","identityRole":"none","motif":"rings-c","variant":"not_applicable","surface":"ground-mist","motionMode":"static","path":"assets/ijji/svg/ijji-rings-c-ground-mist.svg","sha256":"ac6642e269c2580e400ef035fc78f790276837ffddefaaa86a8315e156cb7eb0","bytes":8820,"allowedJobs":["real_area_gathering_pending_state","secondary_orientation"],"allowedFormats":["web_public","deck_16x9","document_pdf","video_owner_extension"],"approvalStatus":"owner_approved_artifact_overlay","approvalRef":"governance/owner-approval.json","staticFallback":"self"},
{"assetId":"ijji.rings-c-dark","role":"generated_vector","identityRole":"none","motif":"rings-c","variant":"not_applicable","surface":"dark","motionMode":"static","path":"assets/ijji/svg/ijji-rings-c-dark.svg","sha256":"935eca1e5c3506a65698c471f8b808ea830e6d33273897563a1ecbd8ac6f3e70","bytes":8558,"allowedJobs":["real_area_gathering_pending_state","secondary_orientation"],"allowedFormats":["web_public","deck_16x9","document_pdf","video_owner_extension"],"approvalStatus":"owner_approved_artifact_overlay","approvalRef":"governance/owner-approval.json","staticFallback":"self"},
{"assetId":"ijji.rings-c-transparent-mint","role":"generated_vector","identityRole":"none","motif":"rings-c","variant":"not_applicable","surface":"transparent-mint","motionMode":"static","path":"assets/ijji/svg/ijji-rings-c-transparent-mint.svg","sha256":"10afbfc96f1a7b4a24ff9220560883efe82bba1e17efbc0dc550dc202e89b028","bytes":8460,"allowedJobs":["real_area_gathering_pending_state","secondary_orientation"],"allowedFormats":["web_public","deck_16x9","document_pdf","video_owner_extension"],"approvalStatus":"owner_approved_artifact_overlay","approvalRef":"governance/owner-approval.json","staticFallback":"self"},
{"assetId":"ijji.rings-c-transparent-ink","role":"generated_vector","identityRole":"none","motif":"rings-c","variant":"not_applicable","surface":"transparent-ink","motionMode":"static","path":"assets/ijji/svg/ijji-rings-c-transparent-ink.svg","sha256":"e138780914ab1afee9a7cfda3f1eb730fa41917b9acdd678a4545009b7597b10","bytes":8493,"allowedJobs":["real_area_gathering_pending_state","secondary_orientation"],"allowedFormats":["web_public","deck_16x9","document_pdf","video_owner_extension"],"approvalStatus":"owner_approved_artifact_overlay","approvalRef":"governance/owner-approval.json","staticFallback":"self"},
{"assetId":"ijji.rotate-b-canvas","role":"generated_vector","identityRole":"none","motif":"rotate-b","variant":"not_applicable","surface":"canvas","motionMode":"static","path":"assets/ijji/svg/ijji-rotate-b-canvas.svg","sha256":"2864e6858eb6e499d4b0b52e2675fb491b470b857cd055400ae99d5fabd79732","bytes":8294,"allowedJobs":["real_iterative_pending_state","secondary_orientation"],"allowedFormats":["web_public","deck_16x9","document_pdf","video_owner_extension"],"approvalStatus":"owner_approved_artifact_overlay","approvalRef":"governance/owner-approval.json","staticFallback":"self"},
{"assetId":"ijji.rotate-b-brand-blue","role":"generated_vector","identityRole":"none","motif":"rotate-b","variant":"not_applicable","surface":"brand-blue","motionMode":"static","path":"assets/ijji/svg/ijji-rotate-b-brand-blue.svg","sha256":"dfe1661930f000090c71c66d348654998dc3c255ed35ac913638b5e570ffb7e2","bytes":8264,"allowedJobs":["real_iterative_pending_state","secondary_orientation"],"allowedFormats":["web_public","deck_16x9","document_pdf","video_owner_extension"],"approvalStatus":"owner_approved_artifact_overlay","approvalRef":"governance/owner-approval.json","staticFallback":"self"},
{"assetId":"ijji.rotate-b-ground-mist","role":"generated_vector","identityRole":"none","motif":"rotate-b","variant":"not_applicable","surface":"ground-mist","motionMode":"static","path":"assets/ijji/svg/ijji-rotate-b-ground-mist.svg","sha256":"f2add7418e19cbd92f522588d4dd3441334f3728d3f99a4b48e2a1aa3463aa94","bytes":8650,"allowedJobs":["real_iterative_pending_state","secondary_orientation"],"allowedFormats":["web_public","deck_16x9","document_pdf","video_owner_extension"],"approvalStatus":"owner_approved_artifact_overlay","approvalRef":"governance/owner-approval.json","staticFallback":"self"},
{"assetId":"ijji.rotate-b-dark","role":"generated_vector","identityRole":"none","motif":"rotate-b","variant":"not_applicable","surface":"dark","motionMode":"static","path":"assets/ijji/svg/ijji-rotate-b-dark.svg","sha256":"d38add31343cba9a0f4d5b3362bc7b3aff64b10d9f2771c190ce6a8e5124d795","bytes":8292,"allowedJobs":["real_iterative_pending_state","secondary_orientation"],"allowedFormats":["web_public","deck_16x9","document_pdf","video_owner_extension"],"approvalStatus":"owner_approved_artifact_overlay","approvalRef":"governance/owner-approval.json","staticFallback":"self"},
{"assetId":"ijji.rotate-b-transparent-mint","role":"generated_vector","identityRole":"none","motif":"rotate-b","variant":"not_applicable","surface":"transparent-mint","motionMode":"static","path":"assets/ijji/svg/ijji-rotate-b-transparent-mint.svg","sha256":"54fb8ee9c2065e54f1e6de8674b1bf488ef96daf93d81b76cdea38f1466a24c9","bytes":8194,"allowedJobs":["real_iterative_pending_state","secondary_orientation"],"allowedFormats":["web_public","deck_16x9","document_pdf","video_owner_extension"],"approvalStatus":"owner_approved_artifact_overlay","approvalRef":"governance/owner-approval.json","staticFallback":"self"},
{"assetId":"ijji.rotate-b-transparent-ink","role":"generated_vector","identityRole":"none","motif":"rotate-b","variant":"not_applicable","surface":"transparent-ink","motionMode":"static","path":"assets/ijji/svg/ijji-rotate-b-transparent-ink.svg","sha256":"c5fd50bf5238daeaac753bb7999d5038ca927b8a1ad96ccfd2b337076234fa38","bytes":8321,"allowedJobs":["real_iterative_pending_state","secondary_orientation"],"allowedFormats":["web_public","deck_16x9","document_pdf","video_owner_extension"],"approvalStatus":"owner_approved_artifact_overlay","approvalRef":"governance/owner-approval.json","staticFallback":"self"},
{"assetId":"ijji.four-beat.runtime.css","role":"web_runtime","identityRole":"not_applicable","motif":null,"variant":null,"surface":null,"motionMode":"state_bound_only","path":"assets/ijji/ijji-motion.css","sha256":"195a53a793d0fd693e0d9e6ec941a687ca3fbb55a7af262d85d0905c6ddf2bf4","bytes":3636,"allowedJobs":["real_pending_state"],"allowedFormats":["web_public"],"approvalStatus":"owner_approved_artifact_overlay","approvalRef":"governance/owner-approval.json","staticFallback":null},
{"assetId":"ijji.four-beat.runtime.js","role":"web_runtime","identityRole":"not_applicable","motif":null,"variant":null,"surface":null,"motionMode":"state_bound_only","path":"assets/ijji/ijji-motifs.js","sha256":"4f341f6bc0c7acd3d6ce44aad6d798e3f03b26c712a29610ae4985cbe11271a4","bytes":15288,"allowedJobs":["real_pending_state"],"allowedFormats":["web_public"],"approvalStatus":"owner_approved_artifact_overlay","approvalRef":"governance/owner-approval.json","staticFallback":null}
]
},
{
"id":"citychat.conversation-set.1.0.1",
"product":"CityChat",
"scope":"citychat_product_specific",
"manifestStatus":"candidate in montri-th/motif (assets/citychat/asset-register.json, version 1.0.1-proposal, status \"candidate — owner sign-off pending\")",
"motionMode":"finite_once",
"approval":{"status":"owner_approved","by":"Design System owner decision registering the current repository bytes; the repository register still carries the candidate label and must be updated separately","decidedOn":"2026-09-15","evidenceRef":"owner-message:2026-09-15:0.9.3-answers"},
"repositoryRegister":{"path":"assets/citychat/asset-register.json","sha256":"6de6f350207f8d072a17563fe720abd04cda58fff7f93cfc7b6c1fac434245ac"},
"assets":[
{"path":"assets/citychat/assets/3a-voice-home-dark.svg","sha256":"9717b6f70a9442e437e2ee069c335db44c8820aba6653d0aac385d1338f315d8","bytes":11143,"role":"static_svg"},
{"path":"assets/citychat/assets/3a-voice-home-light.svg","sha256":"c175caf8dd9fb0b045af720693aa45aef588b026e4eeaa5b88754cfffa8a06eb","bytes":11143,"role":"static_svg"},
{"path":"assets/citychat/assets/3b-live-visit-trade-dark.svg","sha256":"6f3a43b046b8c4a24b6f1c52b7d6a0e091ec08eb959f3cfecbe4e4140fc271a5","bytes":10504,"role":"static_svg"},
{"path":"assets/citychat/assets/3b-live-visit-trade-light.svg","sha256":"3727a85d22e666c26ee6b0e150c6faa9200de2eca049947ee95a94f400c9d157","bytes":10504,"role":"static_svg"},
{"path":"assets/citychat/assets/3c-our-voice-here-dark.svg","sha256":"350fadd34a5472ebac6effe2118e9fc4f3922b7dfd6e0d0faa9c6793bdaeba3d","bytes":12662,"role":"static_svg"},
{"path":"assets/citychat/assets/3c-our-voice-here-light.svg","sha256":"4d13de02f25e82f0d919f5a51f18b72e5424798cfd83cdb2ff67e65e5458f1cd","bytes":12662,"role":"static_svg"},
{"path":"assets/citychat/assets/conversation-motif-original.svg","sha256":"fa67237428dc510cb4e7bc15e86e3764e9911db8a5e26787cb7d40291a284ca4","bytes":11610,"role":"static_svg"},
{"path":"assets/citychat/motion/citychat-motif-motion.css","sha256":"67c4f2638ef76b7ecf355edd53a7c4f2c55cc51cafe7291f28dbf9cd4e00e91d","bytes":6779,"role":"web_runtime_css"},
{"path":"assets/citychat/motion/citychat-motif-motion.js","sha256":"cbcf4b541dfe784cdd8894770fbbd6a6495d7e8de82fc5cae4beb8257871b012","bytes":43005,"role":"web_runtime"}
],
"boundaries":"palette, meanings and product facts of CityChat belong to the CityChat DS Add-on, not to this register"
},
{"id":"citymeter.sting","product":"CityMETER","scope":"citymeter_product_specific","manifestStatus":"not produced","approval":{"status":"pre_approved_pending_production","by":"Design System owner decision; bytes enter this register with SHA-256 when Studio 1.4 produces them","decidedOn":"2026-09-15","evidenceRef":"owner-message:2026-09-15:0.9.3-answers"},"assets":[]},
{"id":"citywiki.sting","product":"CityWiki","scope":"citywiki_product_specific","manifestStatus":"not produced","approval":{"status":"pre_approved_pending_production","by":"Design System owner decision; bytes enter this register with SHA-256 when Studio 1.4 produces them","decidedOn":"2026-09-15","evidenceRef":"owner-message:2026-09-15:0.9.3-answers"},"assets":[]}
],
"carrierPolicy":{
"ruleId":"MOTIF-06",
"status":"candidate",
"authority":{
"decision":{"decidedOn":"2026-09-16","evidenceRef":"owner-message:2026-09-16:motif-carrier-answers","decisions":["the ladder approved on 2026-09-11 enters the Design System as MOTIF-06","full variants on plain light carriers","quiet variants on deep carriers including Brand Blue","colours and motif files unchanged","new rule id MOTIF-06 rather than an in-place MOTIF-04 amendment"]},
"ladder":{"repository":"https://github.com/montri-th/motif","commit":"a99f3c1e0250da91c7f13af8fe3ab8ad03b73e82","path":"motif-quiet-fallback.json","sha256":"eeaf5888d7e651d4d07db44d63a510bbc3ed3cce3d2e47aeae0d07614ee281e8","schemaVersion":"landometer-quiet-fallback/1.0","governanceStatus":"owner_approved_normative_for_motif_library_1_2_1","approvedOn":"2026-09-11","approval":{"path":"governance/attachment/owner-approval.json","sha256":"74b9309dcd2db2ae27dd700034754e5a83cea3075922cf000a6adfbe5803f7dc","pointer":"#/approvedSourceUpdates/quietFallbackLadder","text":"approved on 2026-09-11 — motif-quiet-fallback.json is normative for artifacts built on Motif Library 1.2.1"}},
"evidence":{"path":"governance/attachment/quiet-contrast-evidence.json","sha256":"6735f2c88b32afa3130bfa3d23fa9de669f7ebcaf9d58e52b1467d0867786dc4","citedByLadderAs":"governance/quiet-contrast-evidence.json","pathNote":"the ladder cites a path that does not exist in the repository; the file is in governance/attachment/"},
"repositoryChecksums":"neither the ladder, its evidence nor governance/attachment/owner-approval.json is listed in governance/SHA256SUMS.txt; the hashes above are computed from the files at the commit above",
"supersedes":"the patch r2 sentence of MOTIF-04 'full variants live on beige, Brand Blue or a declared atmosphere; quiet variants live inside content columns' (rule-drafts-0.9.2.md r2), which the governed bytes contradict"
},
"method":{"contrast":"WCAG 2.x relative luminance ratio","compositing":"each visible authored paint (fill and stroke at the alpha the file authors; element opacity multiplied down the tree; opacity 0 elements excluded) over the carrier in sRGB, rounded to the 8-bit pixel a screen shows","gradient":"every stop; the verdict uses the worst stop","rounding":"two decimals, half up","shapeIntact":"every visible paint ≥ 1.30:1","tool":"measure-motif-carriers-0.9.4.mjs","reproducesApprovedEvidence":"ladder table 18/18 · evidence 88/88"},
"bands":{"meaningCapableMin":3,"decorativeOnlyMin":1.3,"invisibleMax":1.29,"labels":{"meaningCapable":"รับงานที่สื่อความหมายได้","decorativeOnly":"ตกแต่งได้ ห้ามแบกความหมาย","invisible":"มองไม่เห็น — เปลี่ยน carrier หรือถอดออก"}},
"placement":{"full":{"carrierClasses":["light_plain"],"ink":"blue","inkNote":"runtime renditions keep the governed light-reference ink: <lm-motif ink=\"blue\">"},"quiet":{"carrierClasses":["deep_plain","deep_atmosphere"],"ink":"sky","inkNote":"runtime default quiet ink (energy.sky); no other ink value has a governed file"}},
"neverFull":["brand.blue","every atmosphere gradient","every dark surface","photographs","semantic state fills"],
"neverQuiet":["every light surface","atmosphere.ground.mist","atmosphere.measure.luminous","cultivate, diversity and product gradients","photographs"],
"themeRule":{
"declaration":"data-host-surface on every MotifFrame and on every static motif placement (data-motif-static=\"<kind>-<variant>\")",
"themedIds":"a themed carrier id (surface.*, surfaceAtmosphere.*) resolves per theme and is checked in every theme the output renders",
"fixedForm":"<id>@light or <id>@dark paints that theme's value in both themes",
"invariantIds":["brand.beige","brand.blue","atmosphere.ground.mist","atmosphere.measure.luminous","atmosphere.ground.current","atmosphere.measure.deep"],
"themesFrom":"<meta name=\"color-scheme\">: light, dark, or both when absent",
"swap":{"attribute":"data-variant-dark","admitted":"full in the light theme → quiet in the dark theme","runtime":"MotifFrame toggles the quiet attribute of <lm-motif>","noscript":"both final-state SVGs in .lds-motif-noscript wrappers (data-theme-variant light|dark) that resolve the theme like the page: data-theme on <html> first, then prefers-color-scheme; <picture>/<source media> follows only the OS preference and is not admitted"},
"groundCheck":"MotifFrame compares the rendered ground behind the frame with the declared carrier and refuses on a difference"
},
"inkRule":{"full":"ink=\"blue\" (the governed light-reference ink; without it the runtime paints Brand Beige under [data-theme=\"dark\"])","quiet":"no ink attribute or ink=\"sky\"","other":"ink=\"beige|mint|yellow\" has no governed final-state record and is refused"},
"refusal":{"codes":["MOTIF-06-CARRIER","MOTIF-06-INK","MOTIF-06-GROUND","MOTIF-06-SWAP"],"effect":"the frame is not rendered (ladder rung L5) and preflight fails"},
"carriers":{
"surface.canvas":{"type":"solid","themed":true,"light":"#F6F7F3","dark":"#11191D","tokenRef":"tokens.v0.9.7.json#/foundation/surface.canvas"},
"surface.alt":{"type":"solid","themed":true,"light":"#EEF1EE","dark":"#172126","tokenRef":"tokens.v0.9.7.json#/foundation/surface.alt"},
"surface.card":{"type":"solid","themed":true,"light":"#FCFCFA","dark":"#20292D","tokenRef":"tokens.v0.9.7.json#/foundation/surface.card"},
"surface.raised":{"type":"solid","themed":true,"light":"#FFFFFF","dark":"#293337","tokenRef":"tokens.v0.9.7.json#/foundation/surface.raised"},
"surface.soft":{"type":"solid","themed":true,"light":"#E5E9E6","dark":"#2B3534","tokenRef":"tokens.v0.9.7.json#/foundation/surface.soft"},
"surface.blueTint":{"type":"solid","themed":true,"light":"#E2E9ED","dark":"#18333E","tokenRef":"tokens.v0.9.7.json#/foundation/surface.blueTint"},
"surface.beigeTint":{"type":"solid","themed":true,"light":"#F2F1DF","dark":"#2C2A22","tokenRef":"tokens.v0.9.7.json#/foundation/surface.beigeTint"},
"brand.beige":{"type":"solid","themed":false,"value":"#F2F1DF","tokenRef":"tokens.v0.9.7.json#/brand/beige"},
"brand.blue":{"type":"solid","themed":false,"value":"#1D4497","tokenRef":"tokens.v0.9.7.json#/brand/blue"},
"atmosphere.ground.mist":{"type":"gradient","themed":false,"stops":["#C4E0EE","#B2E2E2","#CCE6D0"],"tokenRef":"tokens.v0.9.7.json#/atmosphere/recipes/atmosphere.gradient.ground.mist"},
"atmosphere.measure.luminous":{"type":"gradient","themed":false,"stops":["#89CEF6","#5ECAD6","#6CD5B3"],"tokenRef":"tokens.v0.9.7.json#/atmosphere/recipes/atmosphere.gradient.measure.luminous"},
"atmosphere.ground.current":{"type":"gradient","themed":false,"stops":["#0F5773","#006A6A","#1F744F"],"tokenRef":"tokens.v0.9.7.json#/atmosphere/recipes/atmosphere.gradient.ground.current"},
"atmosphere.measure.deep":{"type":"gradient","themed":false,"stops":["#1D4497","#176B82","#08756F"],"tokenRef":"tokens.v0.9.7.json#/atmosphere/recipes/atmosphere.gradient.measure.deep"},
"surfaceAtmosphere.ground":{"type":"gradient","themed":true,"light":"atmosphere.ground.mist","dark":"atmosphere.ground.current","tokenRef":"tokens.v0.9.7.json#/atmosphere/surfaceAliases (ground)"},
"surfaceAtmosphere.measure":{"type":"gradient","themed":true,"light":"atmosphere.measure.deep","dark":"atmosphere.measure.luminous","tokenRef":"tokens.v0.9.7.json#/atmosphere/surfaceAliases (measure)"}
},
"classes":{"light_plain":["brand.beige","surface.alt@light","surface.beigeTint@light","surface.blueTint@light","surface.canvas@light","surface.card@light","surface.raised@light","surface.soft@light"],"deep_plain":["brand.blue","surface.alt@dark","surface.beigeTint@dark","surface.blueTint@dark","surface.canvas@dark","surface.card@dark","surface.raised@dark","surface.soft@dark"],"light_atmosphere":["atmosphere.ground.mist","atmosphere.measure.luminous"],"deep_atmosphere":["atmosphere.ground.current","atmosphere.measure.deep"]},
"notCarriers":["cultivate.glow and cultivate.mist — warm grounds put the sky ink at its weakest and compete with the motif's own energy inks","diversity.spectrum — rationed to one use per long route; never spend it as a motif backing","product.* gradients — only inside the owning product, never as shared atmosphere","any photograph — a photo ground has no single measurable value; use the record's boxed surface variant instead","semantic state fills — a motif never sits on a state surface","overlay and scrim grounds — the ground under them is not controlled"],
"invariant":{"prohibitedTransformations":["redraw","recolor","crop_geometry","distort","trace_from_screenshot_or_memory"],"consequence":"A contrast failure is never solved on the asset. It is solved by choosing a different governed carrier, a different governed record, a different size, or no motif at all.","alsoProhibited":["a white or tinted plate placed under the mark","a scrim laid over a governed gradient so page-global ink can be inherited","a new hue invented to make the mark readable","opacity used as the carrier of meaning","any of the prohibited hue families (violet/purple/lavender/plum/orchid/fuchsia/magenta/terracotta/brick/clay/rust/sienna/burnt orange/earth red/brown-orange)"]},
"ladder":[
{"rung":"L1","name":"Re-test, do not re-tint","action":"Measure the asset's strongest authored element against the actual carrier hex, at the actual delivered size. A gradient is measured at its worst stop.","output":"one of meaningCapable / decorativeOnly / invisible","stopIf":"the motif is decorative (aria-hidden, alt=\"\") and lands in decorativeOnly — that is the intended reading, ship it"},
{"rung":"L2","name":"Change the carrier, not the mark","action":"Move the mark onto another governed quiet carrier. Light ground too faint → the deep set. Deep ground too faint → the light set.","allowed":"any entry in quietCarriers, with its role respected","prohibited":"a plate, a scrim, a new tint, a gradient invented for the purpose"},
{
"rung":"L3",
"name":"Change the record, not the color",
"action":"Select a different governed record. This is selection, which is permitted; recolor is not.",
"routes":{
"ijji.four-beat.selected-3.r3":"six surface records exist per motif — canvas, brand-blue, ground-mist, dark, transparent-ink, transparent-mint. Light ground → transparent-ink (#182327, 11.4–15.6:1). Deep ground → transparent-mint (#0AD69C, 3.0–9.4:1). Ground you do not control → the boxed variant that names it.",
"landometer.motif.v3":"swap variant. quiet on a busy, photographic or atmosphere ground; full on a plain light ground. Never a full variant on a Brand Blue panel.",
"citychat-motif-set":"each of 3a / 3b / 3c ships a light and a dark rendition. Choose by the measured lightness of the real ground, not by the theme name: light on #F6F7F3, white, brand.beige or the dark-theme CityChat gradient; dark on #11191D, #172126 or the light-theme CityChat gradient #007A58 → #007E79. The renditions carry their own ground and grid lines, so they are never placed on a photograph or on another Landometer gradient. Status: candidate — owner sign-off pending on AMENDMENT.md.",
"identity":"swap rendition — see identityRenditions."
}
},
{"rung":"L4","name":"Change the presence, not the palette","action":"Raise the delivered size toward 1.5× the record's minimum, give the motif its own grid track instead of sharing the text column, or add two spacing steps of clear space.","note":"Size and separation buy perceptibility without touching a single hex. They do not buy meaning — a motif at any size is still framing."},
{"rung":"L5","name":"Remove it","action":"Delete the motif. Let text, a TrustBadge, a DecisionCard or a real component carry the meaning.","test":"Delete-the-motif test — if the truth on the page changes when the motif is removed, the motif was doing a job it is not allowed to do."}
],
"ladderWordingConflict":{"rung":"L3","route":"swap variant. quiet on a busy, photographic or atmosphere ground; full on a plain light ground. Never a full variant on a Brand Blue panel.","conflict":"the route names atmosphere and photographic grounds for quiet variants, while the ladder's own table measures quiet ink at 1.23:1 on ground.mist and lists photographs under notCarriers","resolution":"the measured table governs; owner confirmed on 2026-09-17 that the ladder's numeric table decides (owner-message:2026-09-17:0.9.4-approval); the wording fix belongs to the motif repository"},
"agentFields":{"note":"Add these to the standard motif brief. Every value is copied or measured, never estimated.","hostSurfaceToken":"the LDS token of the ground the asset actually sits on","hostSurfaceHex":"its resolved hex, or the worst stop of its gradient","measuredContrast":"computed ratio of the asset's strongest authored element over hostSurfaceHex","contrastVerdict":"meaningCapable | decorativeOnly | invisible","quietFallbackRung":"none | L2 | L3 | L4 | L5","fallbackAssetId":"the record actually shipped after the ladder resolved, if it changed"},
"ladderParity":{
"ink":"#59D2FE",
"compared":18,
"equal":18,
"checks":[
{"id":"surface.card","hex":"#FCFCFA","ladder":[1.69,1.36],"measured":[1.69,1.36],"equal":true},
{"id":"surface.canvas","hex":"#F6F7F3","ladder":[1.62,1.33],"measured":[1.62,1.33],"equal":true},
{"id":"brand.beige","hex":"#F2F1DF","ladder":[1.53,1.29],"measured":[1.53,1.29],"equal":true},
{"id":"surface.alt","hex":"#EEF1EE","ladder":[1.53,1.28],"measured":[1.53,1.28],"equal":true},
{"id":"semantic.info.fill","hex":"#E8EEF0","ladder":[1.48,1.27],"measured":[1.48,1.27],"equal":true},
{"id":"surface.soft","hex":"#E5E9E6","ladder":[1.42,1.24],"measured":[1.42,1.24],"equal":true},
{"id":"surface.blueTint","hex":"#E2E9ED","ladder":[1.42,1.23],"measured":[1.42,1.23],"equal":true},
{"id":"dark.canvas","hex":"#11191D","ladder":[10.23,4.05],"measured":[10.23,4.05],"equal":true},
{"id":"dark.alt","hex":"#172126","ladder":[9.42,3.9],"measured":[9.42,3.9],"equal":true},
{"id":"dark.card","hex":"#20292D","ladder":[8.52,3.71],"measured":[8.52,3.71],"equal":true},
{"id":"dark.blueTint","hex":"#18333E","ladder":[7.63,3.49],"measured":[7.63,3.49],"equal":true},
{"id":"dark.raised","hex":"#293337","ladder":[7.44,3.42],"measured":[7.44,3.42],"equal":true},
{"id":"brand.blue","hex":"#1D4497","ladder":[5.19,2.74],"measured":[5.19,2.74],"equal":true},
{"id":"ground.current.start","hex":"#0F5773","ladder":[4.59,2.54],"measured":[4.59,2.54],"equal":true},
{"id":"ground.current.mid","hex":"#006A6A","ladder":[3.69,2.2],"measured":[3.69,2.2],"equal":true},
{"id":"measure.deep.mid","hex":"#176B82","ladder":[3.49,2.14],"measured":[3.49,2.14],"equal":true},
{"id":"ground.current.end","hex":"#1F744F","ladder":[3.29,2.05],"measured":[3.29,2.05],"equal":true},
{"id":"measure.deep.end","hex":"#08756F","ladder":[3.19,2],"measured":[3.19,2],"equal":true}
],
"evidence":{"path":"governance/attachment/quiet-contrast-evidence.json","compared":88,"equal":88}
},
"allowed":{
"dial":{"full":["brand.beige","surface.alt@light","surface.beigeTint@light","surface.blueTint@light","surface.canvas@light","surface.card@light","surface.raised@light","surface.soft@light"],"quiet":["atmosphere.ground.current","atmosphere.measure.deep","brand.blue","surface.alt@dark","surface.beigeTint@dark","surface.blueTint@dark","surface.canvas@dark","surface.card@dark","surface.raised@dark","surface.soft@dark"]},
"rings":{"full":["brand.beige","surface.alt@light","surface.beigeTint@light","surface.blueTint@light","surface.canvas@light","surface.card@light","surface.raised@light","surface.soft@light"],"quiet":["atmosphere.ground.current","atmosphere.measure.deep","brand.blue","surface.alt@dark","surface.beigeTint@dark","surface.blueTint@dark","surface.canvas@dark","surface.card@dark","surface.raised@dark","surface.soft@dark"]},
"layers":{"full":["surface.canvas@light","surface.card@light","surface.raised@light"],"quiet":["brand.blue","surface.alt@dark","surface.beigeTint@dark","surface.blueTint@dark","surface.canvas@dark","surface.card@dark","surface.raised@dark","surface.soft@dark"]},
"slice":{"full":["brand.beige","surface.alt@light","surface.beigeTint@light","surface.blueTint@light","surface.canvas@light","surface.card@light","surface.raised@light","surface.soft@light"],"quiet":["atmosphere.ground.current","atmosphere.measure.deep","brand.blue","surface.alt@dark","surface.beigeTint@dark","surface.blueTint@dark","surface.canvas@dark","surface.card@dark","surface.raised@dark","surface.soft@dark"]},
"cultivate":{"full":["brand.beige","surface.alt@light","surface.beigeTint@light","surface.blueTint@light","surface.canvas@light","surface.card@light","surface.raised@light","surface.soft@light"],"quiet":["atmosphere.ground.current","atmosphere.measure.deep","brand.blue","surface.alt@dark","surface.beigeTint@dark","surface.blueTint@dark","surface.canvas@dark","surface.card@dark","surface.raised@dark","surface.soft@dark"]},
"logo":{"full":["brand.beige","surface.alt@light","surface.beigeTint@light","surface.blueTint@light","surface.canvas@light","surface.card@light","surface.raised@light","surface.soft@light"],"quiet":["atmosphere.ground.current","atmosphere.measure.deep","brand.blue","surface.alt@dark","surface.beigeTint@dark","surface.blueTint@dark","surface.canvas@dark","surface.card@dark","surface.raised@dark","surface.soft@dark"]}
},
"measured":[
{"kind":"dial","variant":"full","carrier":"surface.canvas@light","carrierClass":"light_plain","paints":5,"hiddenElements":0,"weakest":1.57,"strongest":8.39,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":true,"reason":null},
{"kind":"dial","variant":"full","carrier":"surface.canvas@dark","carrierClass":"deep_plain","paints":5,"hiddenElements":0,"weakest":1.97,"strongest":10.56,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":false,"reason":"full never sits on a deep plain carrier"},
{"kind":"dial","variant":"full","carrier":"surface.alt@light","carrierClass":"light_plain","paints":5,"hiddenElements":0,"weakest":1.48,"strongest":7.93,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":true,"reason":null},
{"kind":"dial","variant":"full","carrier":"surface.alt@dark","carrierClass":"deep_plain","paints":5,"hiddenElements":0,"weakest":1.81,"strongest":9.72,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":false,"reason":"full never sits on a deep plain carrier"},
{"kind":"dial","variant":"full","carrier":"surface.card@light","carrierClass":"light_plain","paints":5,"hiddenElements":0,"weakest":1.64,"strongest":8.79,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":true,"reason":null},
{"kind":"dial","variant":"full","carrier":"surface.card@dark","carrierClass":"deep_plain","paints":5,"hiddenElements":0,"weakest":1.64,"strongest":8.8,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":false,"reason":"full never sits on a deep plain carrier"},
{"kind":"dial","variant":"full","carrier":"surface.raised@light","carrierClass":"light_plain","paints":5,"hiddenElements":0,"weakest":1.68,"strongest":9.03,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":true,"reason":null},
{"kind":"dial","variant":"full","carrier":"surface.raised@dark","carrierClass":"deep_plain","paints":5,"hiddenElements":0,"weakest":1.43,"strongest":7.68,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":false,"reason":"full never sits on a deep plain carrier"},
{"kind":"dial","variant":"full","carrier":"surface.soft@light","carrierClass":"light_plain","paints":5,"hiddenElements":0,"weakest":1.37,"strongest":7.36,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":true,"reason":null},
{"kind":"dial","variant":"full","carrier":"surface.soft@dark","carrierClass":"deep_plain","paints":5,"hiddenElements":0,"weakest":1.4,"strongest":7.5,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":false,"reason":"full never sits on a deep plain carrier"},
{"kind":"dial","variant":"full","carrier":"surface.blueTint@light","carrierClass":"light_plain","paints":5,"hiddenElements":0,"weakest":1.37,"strongest":7.36,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":true,"reason":null},
{"kind":"dial","variant":"full","carrier":"surface.blueTint@dark","carrierClass":"deep_plain","paints":5,"hiddenElements":0,"weakest":1.47,"strongest":7.88,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":false,"reason":"full never sits on a deep plain carrier"},
{"kind":"dial","variant":"full","carrier":"surface.beigeTint@light","carrierClass":"light_plain","paints":5,"hiddenElements":0,"weakest":1.48,"strongest":7.92,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":true,"reason":null},
{"kind":"dial","variant":"full","carrier":"surface.beigeTint@dark","carrierClass":"deep_plain","paints":5,"hiddenElements":0,"weakest":1.59,"strongest":8.53,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":false,"reason":"full never sits on a deep plain carrier"},
{"kind":"dial","variant":"full","carrier":"brand.beige","carrierClass":"light_plain","paints":5,"hiddenElements":0,"weakest":1.48,"strongest":7.92,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":true,"reason":null},
{"kind":"dial","variant":"full","carrier":"brand.blue","carrierClass":"deep_plain","paints":5,"hiddenElements":0,"weakest":1,"strongest":5.36,"worstStop":null,"verdict":"meaningCapable","shapeIntact":false,"invisible":[{"ink":"#1D4497","alpha":1,"ratio":1,"stop":"#1D4497"}],"allowed":false,"reason":"full never sits on a deep plain carrier"},
{"kind":"dial","variant":"full","carrier":"atmosphere.ground.mist","carrierClass":"light_atmosphere","paints":5,"hiddenElements":0,"weakest":1.19,"strongest":6.39,"worstStop":"#B2E2E2","verdict":"meaningCapable","shapeIntact":false,"invisible":[{"ink":"#59D2FE","alpha":1,"ratio":1.23,"stop":"#B2E2E2"},{"ink":"#FFBC1F","alpha":1,"ratio":1.27,"stop":"#CCE6D0"}],"allowed":false,"reason":"full never sits on a light atmosphere carrier"},
{"kind":"dial","variant":"full","carrier":"atmosphere.measure.luminous","carrierClass":"light_atmosphere","paints":5,"hiddenElements":0,"weakest":1.01,"strongest":4.68,"worstStop":"#5ECAD6","verdict":"meaningCapable","shapeIntact":false,"invisible":[{"ink":"#59D2FE","alpha":1,"ratio":1.02,"stop":"#6CD5B3"},{"ink":"#0AD69C","alpha":1,"ratio":1.06,"stop":"#6CD5B3"},{"ink":"#FFBC1F","alpha":1,"ratio":1.06,"stop":"#6CD5B3"}],"allowed":false,"reason":"full never sits on a light atmosphere carrier"},
{"kind":"dial","variant":"full","carrier":"atmosphere.ground.current","carrierClass":"deep_atmosphere","paints":5,"hiddenElements":0,"weakest":1.13,"strongest":3.4,"worstStop":"#1F744F","verdict":"meaningCapable","shapeIntact":false,"invisible":[{"ink":"#1D4497","alpha":1,"ratio":1.13,"stop":"#0F5773"}],"allowed":false,"reason":"full never sits on a deep atmosphere carrier"},
{"kind":"dial","variant":"full","carrier":"atmosphere.measure.deep","carrierClass":"deep_atmosphere","paints":5,"hiddenElements":0,"weakest":1,"strongest":3.29,"worstStop":"#08756F","verdict":"meaningCapable","shapeIntact":false,"invisible":[{"ink":"#1D4497","alpha":1,"ratio":1,"stop":"#1D4497"}],"allowed":false,"reason":"full never sits on a deep atmosphere carrier"},
{"kind":"dial","variant":"quiet","carrier":"surface.canvas@light","carrierClass":"light_plain","paints":5,"hiddenElements":0,"weakest":1.23,"strongest":1.62,"worstStop":null,"verdict":"decorativeOnly","shapeIntact":false,"invisible":[{"ink":"#59D2FE","alpha":0.4,"ratio":1.23,"stop":"#F6F7F3"}],"allowed":false,"reason":"quiet never sits on a light plain carrier"},
{"kind":"dial","variant":"quiet","carrier":"surface.canvas@dark","carrierClass":"deep_plain","paints":5,"hiddenElements":0,"weakest":2.68,"strongest":10.23,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":true,"reason":null},
{"kind":"dial","variant":"quiet","carrier":"surface.alt@light","carrierClass":"light_plain","paints":5,"hiddenElements":0,"weakest":1.2,"strongest":1.53,"worstStop":null,"verdict":"decorativeOnly","shapeIntact":false,"invisible":[{"ink":"#59D2FE","alpha":0.4,"ratio":1.2,"stop":"#EEF1EE"}],"allowed":false,"reason":"quiet never sits on a light plain carrier"},
{"kind":"dial","variant":"quiet","carrier":"surface.alt@dark","carrierClass":"deep_plain","paints":5,"hiddenElements":0,"weakest":2.65,"strongest":9.42,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":true,"reason":null},
{"kind":"dial","variant":"quiet","carrier":"surface.card@light","carrierClass":"light_plain","paints":5,"hiddenElements":0,"weakest":1.25,"strongest":1.69,"worstStop":null,"verdict":"decorativeOnly","shapeIntact":false,"invisible":[{"ink":"#59D2FE","alpha":0.4,"ratio":1.25,"stop":"#FCFCFA"}],"allowed":false,"reason":"quiet never sits on a light plain carrier"},
{"kind":"dial","variant":"quiet","carrier":"surface.card@dark","carrierClass":"deep_plain","paints":5,"hiddenElements":0,"weakest":2.59,"strongest":8.52,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":true,"reason":null},
{"kind":"dial","variant":"quiet","carrier":"surface.raised@light","carrierClass":"light_plain","paints":5,"hiddenElements":0,"weakest":1.26,"strongest":1.74,"worstStop":null,"verdict":"decorativeOnly","shapeIntact":false,"invisible":[{"ink":"#59D2FE","alpha":0.4,"ratio":1.26,"stop":"#FFFFFF"}],"allowed":false,"reason":"quiet never sits on a light plain carrier"},
{"kind":"dial","variant":"quiet","carrier":"surface.raised@dark","carrierClass":"deep_plain","paints":5,"hiddenElements":0,"weakest":2.46,"strongest":7.44,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":true,"reason":null},
{"kind":"dial","variant":"quiet","carrier":"surface.soft@light","carrierClass":"light_plain","paints":5,"hiddenElements":0,"weakest":1.17,"strongest":1.42,"worstStop":null,"verdict":"decorativeOnly","shapeIntact":false,"invisible":[{"ink":"#59D2FE","alpha":0.4,"ratio":1.17,"stop":"#E5E9E6"}],"allowed":false,"reason":"quiet never sits on a light plain carrier"},
{"kind":"dial","variant":"quiet","carrier":"surface.soft@dark","carrierClass":"deep_plain","paints":5,"hiddenElements":0,"weakest":2.43,"strongest":7.27,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":true,"reason":null},
{"kind":"dial","variant":"quiet","carrier":"surface.blueTint@light","carrierClass":"light_plain","paints":5,"hiddenElements":0,"weakest":1.16,"strongest":1.42,"worstStop":null,"verdict":"decorativeOnly","shapeIntact":false,"invisible":[{"ink":"#59D2FE","alpha":0.4,"ratio":1.16,"stop":"#E2E9ED"}],"allowed":false,"reason":"quiet never sits on a light plain carrier"},
{"kind":"dial","variant":"quiet","carrier":"surface.blueTint@dark","carrierClass":"deep_plain","paints":5,"hiddenElements":0,"weakest":2.5,"strongest":7.63,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":true,"reason":null},
{"kind":"dial","variant":"quiet","carrier":"surface.beigeTint@light","carrierClass":"light_plain","paints":5,"hiddenElements":0,"weakest":1.2,"strongest":1.53,"worstStop":null,"verdict":"decorativeOnly","shapeIntact":false,"invisible":[{"ink":"#59D2FE","alpha":0.4,"ratio":1.2,"stop":"#F2F1DF"}],"allowed":false,"reason":"quiet never sits on a light plain carrier"},
{"kind":"dial","variant":"quiet","carrier":"surface.beigeTint@dark","carrierClass":"deep_plain","paints":5,"hiddenElements":0,"weakest":2.51,"strongest":8.26,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":true,"reason":null},
{"kind":"dial","variant":"quiet","carrier":"brand.beige","carrierClass":"light_plain","paints":5,"hiddenElements":0,"weakest":1.2,"strongest":1.53,"worstStop":null,"verdict":"decorativeOnly","shapeIntact":false,"invisible":[{"ink":"#59D2FE","alpha":0.4,"ratio":1.2,"stop":"#F2F1DF"}],"allowed":false,"reason":"quiet never sits on a light plain carrier"},
{"kind":"dial","variant":"quiet","carrier":"brand.blue","carrierClass":"deep_plain","paints":5,"hiddenElements":0,"weakest":2.08,"strongest":5.19,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":true,"reason":null},
{"kind":"dial","variant":"quiet","carrier":"atmosphere.ground.mist","carrierClass":"light_atmosphere","paints":5,"hiddenElements":0,"weakest":1.09,"strongest":1.23,"worstStop":"#B2E2E2","verdict":"invisible","shapeIntact":false,"invisible":[{"ink":"#59D2FE","alpha":0.4,"ratio":1.13,"stop":"#CCE6D0"},{"ink":"#59D2FE","alpha":1,"ratio":1.23,"stop":"#B2E2E2"}],"allowed":false,"reason":"quiet never sits on a light atmosphere carrier"},
{"kind":"dial","variant":"quiet","carrier":"atmosphere.measure.luminous","carrierClass":"light_atmosphere","paints":5,"hiddenElements":0,"weakest":1.01,"strongest":1.01,"worstStop":"#89CEF6","verdict":"invisible","shapeIntact":false,"invisible":[{"ink":"#59D2FE","alpha":0.4,"ratio":1.01,"stop":"#6CD5B3"},{"ink":"#59D2FE","alpha":1,"ratio":1.02,"stop":"#6CD5B3"}],"allowed":false,"reason":"quiet never sits on a light atmosphere carrier"},
{"kind":"dial","variant":"quiet","carrier":"atmosphere.ground.current","carrierClass":"deep_atmosphere","paints":5,"hiddenElements":0,"weakest":1.69,"strongest":3.29,"worstStop":"#1F744F","verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":true,"reason":null},
{"kind":"dial","variant":"quiet","carrier":"atmosphere.measure.deep","carrierClass":"deep_atmosphere","paints":5,"hiddenElements":0,"weakest":1.66,"strongest":3.19,"worstStop":"#08756F","verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":true,"reason":null},
{"kind":"rings","variant":"full","carrier":"surface.canvas@light","carrierClass":"light_plain","paints":5,"hiddenElements":0,"weakest":1.57,"strongest":8.39,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":true,"reason":null},
{"kind":"rings","variant":"full","carrier":"surface.canvas@dark","carrierClass":"deep_plain","paints":5,"hiddenElements":0,"weakest":1.97,"strongest":10.56,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":false,"reason":"full never sits on a deep plain carrier"},
{"kind":"rings","variant":"full","carrier":"surface.alt@light","carrierClass":"light_plain","paints":5,"hiddenElements":0,"weakest":1.48,"strongest":7.93,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":true,"reason":null},
{"kind":"rings","variant":"full","carrier":"surface.alt@dark","carrierClass":"deep_plain","paints":5,"hiddenElements":0,"weakest":1.81,"strongest":9.72,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":false,"reason":"full never sits on a deep plain carrier"},
{"kind":"rings","variant":"full","carrier":"surface.card@light","carrierClass":"light_plain","paints":5,"hiddenElements":0,"weakest":1.64,"strongest":8.79,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":true,"reason":null},
{"kind":"rings","variant":"full","carrier":"surface.card@dark","carrierClass":"deep_plain","paints":5,"hiddenElements":0,"weakest":1.64,"strongest":8.8,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":false,"reason":"full never sits on a deep plain carrier"},
{"kind":"rings","variant":"full","carrier":"surface.raised@light","carrierClass":"light_plain","paints":5,"hiddenElements":0,"weakest":1.68,"strongest":9.03,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":true,"reason":null},
{"kind":"rings","variant":"full","carrier":"surface.raised@dark","carrierClass":"deep_plain","paints":5,"hiddenElements":0,"weakest":1.43,"strongest":7.68,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":false,"reason":"full never sits on a deep plain carrier"},
{"kind":"rings","variant":"full","carrier":"surface.soft@light","carrierClass":"light_plain","paints":5,"hiddenElements":0,"weakest":1.37,"strongest":7.36,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":true,"reason":null},
{"kind":"rings","variant":"full","carrier":"surface.soft@dark","carrierClass":"deep_plain","paints":5,"hiddenElements":0,"weakest":1.4,"strongest":7.5,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":false,"reason":"full never sits on a deep plain carrier"},
{"kind":"rings","variant":"full","carrier":"surface.blueTint@light","carrierClass":"light_plain","paints":5,"hiddenElements":0,"weakest":1.37,"strongest":7.36,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":true,"reason":null},
{"kind":"rings","variant":"full","carrier":"surface.blueTint@dark","carrierClass":"deep_plain","paints":5,"hiddenElements":0,"weakest":1.47,"strongest":7.88,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":false,"reason":"full never sits on a deep plain carrier"},
{"kind":"rings","variant":"full","carrier":"surface.beigeTint@light","carrierClass":"light_plain","paints":5,"hiddenElements":0,"weakest":1.48,"strongest":7.92,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":true,"reason":null},
{"kind":"rings","variant":"full","carrier":"surface.beigeTint@dark","carrierClass":"deep_plain","paints":5,"hiddenElements":0,"weakest":1.59,"strongest":8.53,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":false,"reason":"full never sits on a deep plain carrier"},
{"kind":"rings","variant":"full","carrier":"brand.beige","carrierClass":"light_plain","paints":5,"hiddenElements":0,"weakest":1.48,"strongest":7.92,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":true,"reason":null},
{"kind":"rings","variant":"full","carrier":"brand.blue","carrierClass":"deep_plain","paints":5,"hiddenElements":0,"weakest":1,"strongest":5.36,"worstStop":null,"verdict":"meaningCapable","shapeIntact":false,"invisible":[{"ink":"#1D4497","alpha":1,"ratio":1,"stop":"#1D4497"}],"allowed":false,"reason":"full never sits on a deep plain carrier"},
{"kind":"rings","variant":"full","carrier":"atmosphere.ground.mist","carrierClass":"light_atmosphere","paints":5,"hiddenElements":0,"weakest":1.19,"strongest":6.39,"worstStop":"#B2E2E2","verdict":"meaningCapable","shapeIntact":false,"invisible":[{"ink":"#59D2FE","alpha":1,"ratio":1.23,"stop":"#B2E2E2"},{"ink":"#FFBC1F","alpha":1,"ratio":1.27,"stop":"#CCE6D0"}],"allowed":false,"reason":"full never sits on a light atmosphere carrier"},
{"kind":"rings","variant":"full","carrier":"atmosphere.measure.luminous","carrierClass":"light_atmosphere","paints":5,"hiddenElements":0,"weakest":1.01,"strongest":4.68,"worstStop":"#5ECAD6","verdict":"meaningCapable","shapeIntact":false,"invisible":[{"ink":"#59D2FE","alpha":1,"ratio":1.02,"stop":"#6CD5B3"},{"ink":"#0AD69C","alpha":1,"ratio":1.06,"stop":"#6CD5B3"},{"ink":"#FFBC1F","alpha":1,"ratio":1.06,"stop":"#6CD5B3"}],"allowed":false,"reason":"full never sits on a light atmosphere carrier"},
{"kind":"rings","variant":"full","carrier":"atmosphere.ground.current","carrierClass":"deep_atmosphere","paints":5,"hiddenElements":0,"weakest":1.13,"strongest":3.4,"worstStop":"#1F744F","verdict":"meaningCapable","shapeIntact":false,"invisible":[{"ink":"#1D4497","alpha":1,"ratio":1.13,"stop":"#0F5773"}],"allowed":false,"reason":"full never sits on a deep atmosphere carrier"},
{"kind":"rings","variant":"full","carrier":"atmosphere.measure.deep","carrierClass":"deep_atmosphere","paints":5,"hiddenElements":0,"weakest":1,"strongest":3.29,"worstStop":"#08756F","verdict":"meaningCapable","shapeIntact":false,"invisible":[{"ink":"#1D4497","alpha":1,"ratio":1,"stop":"#1D4497"}],"allowed":false,"reason":"full never sits on a deep atmosphere carrier"},
{"kind":"rings","variant":"quiet","carrier":"surface.canvas@light","carrierClass":"light_plain","paints":8,"hiddenElements":0,"weakest":1.13,"strongest":1.62,"worstStop":null,"verdict":"decorativeOnly","shapeIntact":false,"invisible":[{"ink":"#59D2FE","alpha":0.24,"ratio":1.13,"stop":"#F6F7F3"},{"ink":"#59D2FE","alpha":0.4,"ratio":1.23,"stop":"#F6F7F3"},{"ink":"#59D2FE","alpha":0.48,"ratio":1.28,"stop":"#F6F7F3"}],"allowed":false,"reason":"quiet never sits on a light plain carrier"},
{"kind":"rings","variant":"quiet","carrier":"surface.canvas@dark","carrierClass":"deep_plain","paints":8,"hiddenElements":0,"weakest":1.73,"strongest":10.23,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":true,"reason":null},
{"kind":"rings","variant":"quiet","carrier":"surface.alt@light","carrierClass":"light_plain","paints":8,"hiddenElements":0,"weakest":1.11,"strongest":1.53,"worstStop":null,"verdict":"decorativeOnly","shapeIntact":false,"invisible":[{"ink":"#59D2FE","alpha":0.24,"ratio":1.11,"stop":"#EEF1EE"},{"ink":"#59D2FE","alpha":0.4,"ratio":1.2,"stop":"#EEF1EE"},{"ink":"#59D2FE","alpha":0.48,"ratio":1.24,"stop":"#EEF1EE"}],"allowed":false,"reason":"quiet never sits on a light plain carrier"},
{"kind":"rings","variant":"quiet","carrier":"surface.alt@dark","carrierClass":"deep_plain","paints":8,"hiddenElements":0,"weakest":1.75,"strongest":9.42,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":true,"reason":null},
{"kind":"rings","variant":"quiet","carrier":"surface.card@light","carrierClass":"light_plain","paints":8,"hiddenElements":0,"weakest":1.14,"strongest":1.69,"worstStop":null,"verdict":"decorativeOnly","shapeIntact":false,"invisible":[{"ink":"#59D2FE","alpha":0.24,"ratio":1.14,"stop":"#FCFCFA"},{"ink":"#59D2FE","alpha":0.4,"ratio":1.25,"stop":"#FCFCFA"}],"allowed":false,"reason":"quiet never sits on a light plain carrier"},
{"kind":"rings","variant":"quiet","carrier":"surface.card@dark","carrierClass":"deep_plain","paints":8,"hiddenElements":0,"weakest":1.76,"strongest":8.52,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":true,"reason":null},
{"kind":"rings","variant":"quiet","carrier":"surface.raised@light","carrierClass":"light_plain","paints":8,"hiddenElements":0,"weakest":1.15,"strongest":1.74,"worstStop":null,"verdict":"decorativeOnly","shapeIntact":false,"invisible":[{"ink":"#59D2FE","alpha":0.24,"ratio":1.15,"stop":"#FFFFFF"},{"ink":"#59D2FE","alpha":0.4,"ratio":1.26,"stop":"#FFFFFF"}],"allowed":false,"reason":"quiet never sits on a light plain carrier"},
{"kind":"rings","variant":"quiet","carrier":"surface.raised@dark","carrierClass":"deep_plain","paints":8,"hiddenElements":0,"weakest":1.71,"strongest":7.44,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":true,"reason":null},
{"kind":"rings","variant":"quiet","carrier":"surface.soft@light","carrierClass":"light_plain","paints":8,"hiddenElements":0,"weakest":1.1,"strongest":1.42,"worstStop":null,"verdict":"decorativeOnly","shapeIntact":false,"invisible":[{"ink":"#59D2FE","alpha":0.24,"ratio":1.1,"stop":"#E5E9E6"},{"ink":"#59D2FE","alpha":0.4,"ratio":1.17,"stop":"#E5E9E6"},{"ink":"#59D2FE","alpha":0.48,"ratio":1.2,"stop":"#E5E9E6"}],"allowed":false,"reason":"quiet never sits on a light plain carrier"},
{"kind":"rings","variant":"quiet","carrier":"surface.soft@dark","carrierClass":"deep_plain","paints":8,"hiddenElements":0,"weakest":1.71,"strongest":7.27,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":true,"reason":null},
{"kind":"rings","variant":"quiet","carrier":"surface.blueTint@light","carrierClass":"light_plain","paints":8,"hiddenElements":0,"weakest":1.1,"strongest":1.42,"worstStop":null,"verdict":"decorativeOnly","shapeIntact":false,"invisible":[{"ink":"#59D2FE","alpha":0.24,"ratio":1.1,"stop":"#E2E9ED"},{"ink":"#59D2FE","alpha":0.4,"ratio":1.16,"stop":"#E2E9ED"},{"ink":"#59D2FE","alpha":0.48,"ratio":1.2,"stop":"#E2E9ED"}],"allowed":false,"reason":"quiet never sits on a light plain carrier"},
{"kind":"rings","variant":"quiet","carrier":"surface.blueTint@dark","carrierClass":"deep_plain","paints":8,"hiddenElements":0,"weakest":1.73,"strongest":7.63,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":true,"reason":null},
{"kind":"rings","variant":"quiet","carrier":"surface.beigeTint@light","carrierClass":"light_plain","paints":8,"hiddenElements":0,"weakest":1.12,"strongest":1.53,"worstStop":null,"verdict":"decorativeOnly","shapeIntact":false,"invisible":[{"ink":"#59D2FE","alpha":0.24,"ratio":1.12,"stop":"#F2F1DF"},{"ink":"#59D2FE","alpha":0.4,"ratio":1.2,"stop":"#F2F1DF"},{"ink":"#59D2FE","alpha":0.48,"ratio":1.24,"stop":"#F2F1DF"}],"allowed":false,"reason":"quiet never sits on a light plain carrier"},
{"kind":"rings","variant":"quiet","carrier":"surface.beigeTint@dark","carrierClass":"deep_plain","paints":8,"hiddenElements":0,"weakest":1.72,"strongest":8.26,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":true,"reason":null},
{"kind":"rings","variant":"quiet","carrier":"brand.beige","carrierClass":"light_plain","paints":8,"hiddenElements":0,"weakest":1.12,"strongest":1.53,"worstStop":null,"verdict":"decorativeOnly","shapeIntact":false,"invisible":[{"ink":"#59D2FE","alpha":0.24,"ratio":1.12,"stop":"#F2F1DF"},{"ink":"#59D2FE","alpha":0.4,"ratio":1.2,"stop":"#F2F1DF"},{"ink":"#59D2FE","alpha":0.48,"ratio":1.24,"stop":"#F2F1DF"}],"allowed":false,"reason":"quiet never sits on a light plain carrier"},
{"kind":"rings","variant":"quiet","carrier":"brand.blue","carrierClass":"deep_plain","paints":8,"hiddenElements":0,"weakest":1.56,"strongest":5.19,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":true,"reason":null},
{"kind":"rings","variant":"quiet","carrier":"atmosphere.ground.mist","carrierClass":"light_atmosphere","paints":8,"hiddenElements":0,"weakest":1.06,"strongest":1.23,"worstStop":"#B2E2E2","verdict":"invisible","shapeIntact":false,"invisible":[{"ink":"#59D2FE","alpha":0.24,"ratio":1.08,"stop":"#CCE6D0"},{"ink":"#59D2FE","alpha":0.4,"ratio":1.13,"stop":"#CCE6D0"},{"ink":"#59D2FE","alpha":0.48,"ratio":1.16,"stop":"#CCE6D0"},{"ink":"#59D2FE","alpha":0.72,"ratio":1.22,"stop":"#CCE6D0"},{"ink":"#59D2FE","alpha":1,"ratio":1.23,"stop":"#B2E2E2"}],"allowed":false,"reason":"quiet never sits on a light atmosphere carrier"},
{"kind":"rings","variant":"quiet","carrier":"atmosphere.measure.luminous","carrierClass":"light_atmosphere","paints":8,"hiddenElements":0,"weakest":1,"strongest":1.01,"worstStop":"#89CEF6","verdict":"invisible","shapeIntact":false,"invisible":[{"ink":"#59D2FE","alpha":0.24,"ratio":1,"stop":"#6CD5B3"},{"ink":"#59D2FE","alpha":0.4,"ratio":1.01,"stop":"#6CD5B3"},{"ink":"#59D2FE","alpha":0.48,"ratio":1.01,"stop":"#6CD5B3"},{"ink":"#59D2FE","alpha":0.72,"ratio":1.01,"stop":"#6CD5B3"},{"ink":"#59D2FE","alpha":1,"ratio":1.02,"stop":"#6CD5B3"}],"allowed":false,"reason":"quiet never sits on a light atmosphere carrier"},
{"kind":"rings","variant":"quiet","carrier":"atmosphere.ground.current","carrierClass":"deep_atmosphere","paints":8,"hiddenElements":0,"weakest":1.38,"strongest":3.29,"worstStop":"#1F744F","verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":true,"reason":null},
{"kind":"rings","variant":"quiet","carrier":"atmosphere.measure.deep","carrierClass":"deep_atmosphere","paints":8,"hiddenElements":0,"weakest":1.36,"strongest":3.19,"worstStop":"#08756F","verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":true,"reason":null},
{"kind":"layers","variant":"full","carrier":"surface.canvas@light","carrierClass":"light_plain","paints":9,"hiddenElements":0,"weakest":1.3,"strongest":8.39,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":true,"reason":null},
{"kind":"layers","variant":"full","carrier":"surface.canvas@dark","carrierClass":"deep_plain","paints":9,"hiddenElements":0,"weakest":1.97,"strongest":10.56,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":false,"reason":"full never sits on a deep plain carrier"},
{"kind":"layers","variant":"full","carrier":"surface.alt@light","carrierClass":"light_plain","paints":9,"hiddenElements":0,"weakest":1.26,"strongest":7.93,"worstStop":null,"verdict":"meaningCapable","shapeIntact":false,"invisible":[{"ink":"#FFBC1F","alpha":0.56,"ratio":1.26,"stop":"#EEF1EE"},{"ink":"#59D2FE","alpha":0.56,"ratio":1.28,"stop":"#EEF1EE"}],"allowed":false,"reason":"paint #FFBC1F at alpha 0.56 measures 1.26:1"},
{"kind":"layers","variant":"full","carrier":"surface.alt@dark","carrierClass":"deep_plain","paints":9,"hiddenElements":0,"weakest":1.81,"strongest":9.72,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":false,"reason":"full never sits on a deep plain carrier"},
{"kind":"layers","variant":"full","carrier":"surface.card@light","carrierClass":"light_plain","paints":9,"hiddenElements":0,"weakest":1.33,"strongest":8.79,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":true,"reason":null},
{"kind":"layers","variant":"full","carrier":"surface.card@dark","carrierClass":"deep_plain","paints":9,"hiddenElements":0,"weakest":1.64,"strongest":8.8,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":false,"reason":"full never sits on a deep plain carrier"},
{"kind":"layers","variant":"full","carrier":"surface.raised@light","carrierClass":"light_plain","paints":9,"hiddenElements":0,"weakest":1.35,"strongest":9.03,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":true,"reason":null},
{"kind":"layers","variant":"full","carrier":"surface.raised@dark","carrierClass":"deep_plain","paints":9,"hiddenElements":0,"weakest":1.43,"strongest":7.68,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":false,"reason":"full never sits on a deep plain carrier"},
{"kind":"layers","variant":"full","carrier":"surface.soft@light","carrierClass":"light_plain","paints":9,"hiddenElements":0,"weakest":1.21,"strongest":7.36,"worstStop":null,"verdict":"meaningCapable","shapeIntact":false,"invisible":[{"ink":"#FFBC1F","alpha":0.56,"ratio":1.21,"stop":"#E5E9E6"},{"ink":"#59D2FE","alpha":0.56,"ratio":1.24,"stop":"#E5E9E6"}],"allowed":false,"reason":"paint #FFBC1F at alpha 0.56 measures 1.21:1"},
{"kind":"layers","variant":"full","carrier":"surface.soft@dark","carrierClass":"deep_plain","paints":9,"hiddenElements":0,"weakest":1.4,"strongest":7.5,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":false,"reason":"full never sits on a deep plain carrier"},
{"kind":"layers","variant":"full","carrier":"surface.blueTint@light","carrierClass":"light_plain","paints":9,"hiddenElements":0,"weakest":1.22,"strongest":7.36,"worstStop":null,"verdict":"meaningCapable","shapeIntact":false,"invisible":[{"ink":"#FFBC1F","alpha":0.56,"ratio":1.22,"stop":"#E2E9ED"},{"ink":"#59D2FE","alpha":0.56,"ratio":1.23,"stop":"#E2E9ED"}],"allowed":false,"reason":"paint #FFBC1F at alpha 0.56 measures 1.22:1"},
{"kind":"layers","variant":"full","carrier":"surface.blueTint@dark","carrierClass":"deep_plain","paints":9,"hiddenElements":0,"weakest":1.47,"strongest":7.88,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":false,"reason":"full never sits on a deep plain carrier"},
{"kind":"layers","variant":"full","carrier":"surface.beigeTint@light","carrierClass":"light_plain","paints":9,"hiddenElements":0,"weakest":1.26,"strongest":7.92,"worstStop":null,"verdict":"meaningCapable","shapeIntact":false,"invisible":[{"ink":"#FFBC1F","alpha":0.56,"ratio":1.26,"stop":"#F2F1DF"},{"ink":"#59D2FE","alpha":0.56,"ratio":1.29,"stop":"#F2F1DF"}],"allowed":false,"reason":"paint #FFBC1F at alpha 0.56 measures 1.26:1"},
{"kind":"layers","variant":"full","carrier":"surface.beigeTint@dark","carrierClass":"deep_plain","paints":9,"hiddenElements":0,"weakest":1.59,"strongest":8.53,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":false,"reason":"full never sits on a deep plain carrier"},
{"kind":"layers","variant":"full","carrier":"brand.beige","carrierClass":"light_plain","paints":9,"hiddenElements":0,"weakest":1.26,"strongest":7.92,"worstStop":null,"verdict":"meaningCapable","shapeIntact":false,"invisible":[{"ink":"#FFBC1F","alpha":0.56,"ratio":1.26,"stop":"#F2F1DF"},{"ink":"#59D2FE","alpha":0.56,"ratio":1.29,"stop":"#F2F1DF"}],"allowed":false,"reason":"paint #FFBC1F at alpha 0.56 measures 1.26:1"},
{"kind":"layers","variant":"full","carrier":"brand.blue","carrierClass":"deep_plain","paints":9,"hiddenElements":0,"weakest":1,"strongest":5.36,"worstStop":null,"verdict":"meaningCapable","shapeIntact":false,"invisible":[{"ink":"#1D4497","alpha":1,"ratio":1,"stop":"#1D4497"}],"allowed":false,"reason":"full never sits on a deep plain carrier"},
{"kind":"layers","variant":"full","carrier":"atmosphere.ground.mist","carrierClass":"light_atmosphere","paints":9,"hiddenElements":0,"weakest":1.13,"strongest":6.39,"worstStop":"#B2E2E2","verdict":"meaningCapable","shapeIntact":false,"invisible":[{"ink":"#FFBC1F","alpha":0.56,"ratio":1.17,"stop":"#CCE6D0"},{"ink":"#59D2FE","alpha":0.56,"ratio":1.18,"stop":"#CCE6D0"},{"ink":"#59D2FE","alpha":1,"ratio":1.23,"stop":"#B2E2E2"},{"ink":"#0AD69C","alpha":0.56,"ratio":1.27,"stop":"#CCE6D0"},{"ink":"#FFBC1F","alpha":1,"ratio":1.27,"stop":"#CCE6D0"}],"allowed":false,"reason":"full never sits on a light atmosphere carrier"},
{"kind":"layers","variant":"full","carrier":"atmosphere.measure.luminous","carrierClass":"light_atmosphere","paints":9,"hiddenElements":0,"weakest":1,"strongest":4.68,"worstStop":"#5ECAD6","verdict":"meaningCapable","shapeIntact":false,"invisible":[{"ink":"#59D2FE","alpha":0.56,"ratio":1.01,"stop":"#6CD5B3"},{"ink":"#59D2FE","alpha":1,"ratio":1.02,"stop":"#6CD5B3"},{"ink":"#FFBC1F","alpha":0.56,"ratio":1.02,"stop":"#6CD5B3"},{"ink":"#0AD69C","alpha":0.56,"ratio":1.04,"stop":"#6CD5B3"},{"ink":"#0AD69C","alpha":1,"ratio":1.06,"stop":"#6CD5B3"},{"ink":"#FFBC1F","alpha":1,"ratio":1.06,"stop":"#6CD5B3"}],"allowed":false,"reason":"full never sits on a light atmosphere carrier"},
{"kind":"layers","variant":"full","carrier":"atmosphere.ground.current","carrierClass":"deep_atmosphere","paints":9,"hiddenElements":0,"weakest":1.13,"strongest":3.4,"worstStop":"#1F744F","verdict":"meaningCapable","shapeIntact":false,"invisible":[{"ink":"#1D4497","alpha":1,"ratio":1.13,"stop":"#0F5773"},{"ink":"#FF5A5F","alpha":0.56,"ratio":1.2,"stop":"#1F744F"}],"allowed":false,"reason":"full never sits on a deep atmosphere carrier"},
{"kind":"layers","variant":"full","carrier":"atmosphere.measure.deep","carrierClass":"deep_atmosphere","paints":9,"hiddenElements":0,"weakest":1,"strongest":3.29,"worstStop":"#08756F","verdict":"meaningCapable","shapeIntact":false,"invisible":[{"ink":"#1D4497","alpha":1,"ratio":1,"stop":"#1D4497"},{"ink":"#FF5A5F","alpha":0.56,"ratio":1.14,"stop":"#08756F"}],"allowed":false,"reason":"full never sits on a deep atmosphere carrier"},
{"kind":"layers","variant":"quiet","carrier":"surface.canvas@light","carrierClass":"light_plain","paints":16,"hiddenElements":0,"weakest":1.1,"strongest":1.43,"worstStop":null,"verdict":"decorativeOnly","shapeIntact":false,"invisible":[{"ink":"#59D2FE","alpha":0.18,"ratio":1.1,"stop":"#F6F7F3"},{"ink":"#59D2FE","alpha":0.36,"ratio":1.2,"stop":"#F6F7F3"}],"allowed":false,"reason":"quiet never sits on a light plain carrier"},
{"kind":"layers","variant":"quiet","carrier":"surface.canvas@dark","carrierClass":"deep_plain","paints":16,"hiddenElements":0,"weakest":1.48,"strongest":5.84,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":true,"reason":null},
{"kind":"layers","variant":"quiet","carrier":"surface.alt@light","carrierClass":"light_plain","paints":16,"hiddenElements":0,"weakest":1.09,"strongest":1.37,"worstStop":null,"verdict":"decorativeOnly","shapeIntact":false,"invisible":[{"ink":"#59D2FE","alpha":0.18,"ratio":1.09,"stop":"#EEF1EE"},{"ink":"#59D2FE","alpha":0.36,"ratio":1.18,"stop":"#EEF1EE"},{"ink":"#59D2FE","alpha":0.56,"ratio":1.28,"stop":"#EEF1EE"},{"ink":"#59D2FE","alpha":0.54,"ratio":1.28,"stop":"#EEF1EE"}],"allowed":false,"reason":"quiet never sits on a light plain carrier"},
{"kind":"layers","variant":"quiet","carrier":"surface.alt@dark","carrierClass":"deep_plain","paints":16,"hiddenElements":0,"weakest":1.51,"strongest":5.52,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":true,"reason":null},
{"kind":"layers","variant":"quiet","carrier":"surface.card@light","carrierClass":"light_plain","paints":16,"hiddenElements":0,"weakest":1.11,"strongest":1.47,"worstStop":null,"verdict":"decorativeOnly","shapeIntact":false,"invisible":[{"ink":"#59D2FE","alpha":0.18,"ratio":1.11,"stop":"#FCFCFA"},{"ink":"#59D2FE","alpha":0.36,"ratio":1.22,"stop":"#FCFCFA"}],"allowed":false,"reason":"quiet never sits on a light plain carrier"},
{"kind":"layers","variant":"quiet","carrier":"surface.card@dark","carrierClass":"deep_plain","paints":16,"hiddenElements":0,"weakest":1.5,"strongest":5.16,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":true,"reason":null},
{"kind":"layers","variant":"quiet","carrier":"surface.raised@light","carrierClass":"light_plain","paints":16,"hiddenElements":0,"weakest":1.11,"strongest":1.5,"worstStop":null,"verdict":"decorativeOnly","shapeIntact":false,"invisible":[{"ink":"#59D2FE","alpha":0.18,"ratio":1.11,"stop":"#FFFFFF"},{"ink":"#59D2FE","alpha":0.36,"ratio":1.23,"stop":"#FFFFFF"}],"allowed":false,"reason":"quiet never sits on a light plain carrier"},
{"kind":"layers","variant":"quiet","carrier":"surface.raised@dark","carrierClass":"deep_plain","paints":16,"hiddenElements":0,"weakest":1.5,"strongest":4.62,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":true,"reason":null},
{"kind":"layers","variant":"quiet","carrier":"surface.soft@light","carrierClass":"light_plain","paints":16,"hiddenElements":0,"weakest":1.07,"strongest":1.31,"worstStop":null,"verdict":"decorativeOnly","shapeIntact":false,"invisible":[{"ink":"#59D2FE","alpha":0.18,"ratio":1.07,"stop":"#E5E9E6"},{"ink":"#59D2FE","alpha":0.36,"ratio":1.15,"stop":"#E5E9E6"},{"ink":"#59D2FE","alpha":0.54,"ratio":1.22,"stop":"#E5E9E6"},{"ink":"#59D2FE","alpha":0.56,"ratio":1.24,"stop":"#E5E9E6"}],"allowed":false,"reason":"quiet never sits on a light plain carrier"},
{"kind":"layers","variant":"quiet","carrier":"surface.soft@dark","carrierClass":"deep_plain","paints":16,"hiddenElements":0,"weakest":1.48,"strongest":4.55,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":true,"reason":null},
{"kind":"layers","variant":"quiet","carrier":"surface.blueTint@light","carrierClass":"light_plain","paints":16,"hiddenElements":0,"weakest":1.07,"strongest":1.31,"worstStop":null,"verdict":"decorativeOnly","shapeIntact":false,"invisible":[{"ink":"#59D2FE","alpha":0.18,"ratio":1.07,"stop":"#E2E9ED"},{"ink":"#59D2FE","alpha":0.36,"ratio":1.15,"stop":"#E2E9ED"},{"ink":"#59D2FE","alpha":0.54,"ratio":1.22,"stop":"#E2E9ED"},{"ink":"#59D2FE","alpha":0.56,"ratio":1.23,"stop":"#E2E9ED"}],"allowed":false,"reason":"quiet never sits on a light plain carrier"},
{"kind":"layers","variant":"quiet","carrier":"surface.blueTint@dark","carrierClass":"deep_plain","paints":16,"hiddenElements":0,"weakest":1.51,"strongest":4.73,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":true,"reason":null},
{"kind":"layers","variant":"quiet","carrier":"surface.beigeTint@light","carrierClass":"light_plain","paints":16,"hiddenElements":0,"weakest":1.09,"strongest":1.37,"worstStop":null,"verdict":"decorativeOnly","shapeIntact":false,"invisible":[{"ink":"#59D2FE","alpha":0.18,"ratio":1.09,"stop":"#F2F1DF"},{"ink":"#59D2FE","alpha":0.36,"ratio":1.18,"stop":"#F2F1DF"},{"ink":"#59D2FE","alpha":0.54,"ratio":1.28,"stop":"#F2F1DF"},{"ink":"#59D2FE","alpha":0.56,"ratio":1.29,"stop":"#F2F1DF"}],"allowed":false,"reason":"quiet never sits on a light plain carrier"},
{"kind":"layers","variant":"quiet","carrier":"surface.beigeTint@dark","carrierClass":"deep_plain","paints":16,"hiddenElements":0,"weakest":1.49,"strongest":5,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":true,"reason":null},
{"kind":"layers","variant":"quiet","carrier":"brand.beige","carrierClass":"light_plain","paints":16,"hiddenElements":0,"weakest":1.09,"strongest":1.37,"worstStop":null,"verdict":"decorativeOnly","shapeIntact":false,"invisible":[{"ink":"#59D2FE","alpha":0.18,"ratio":1.09,"stop":"#F2F1DF"},{"ink":"#59D2FE","alpha":0.36,"ratio":1.18,"stop":"#F2F1DF"},{"ink":"#59D2FE","alpha":0.54,"ratio":1.28,"stop":"#F2F1DF"},{"ink":"#59D2FE","alpha":0.56,"ratio":1.29,"stop":"#F2F1DF"}],"allowed":false,"reason":"quiet never sits on a light plain carrier"},
{"kind":"layers","variant":"quiet","carrier":"brand.blue","carrierClass":"deep_plain","paints":16,"hiddenElements":0,"weakest":1.41,"strongest":3.49,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":true,"reason":null},
{"kind":"layers","variant":"quiet","carrier":"atmosphere.ground.mist","carrierClass":"light_atmosphere","paints":16,"hiddenElements":0,"weakest":1.04,"strongest":1.17,"worstStop":"#B2E2E2","verdict":"invisible","shapeIntact":false,"invisible":[{"ink":"#59D2FE","alpha":0.18,"ratio":1.06,"stop":"#CCE6D0"},{"ink":"#59D2FE","alpha":0.36,"ratio":1.11,"stop":"#CCE6D0"},{"ink":"#59D2FE","alpha":0.54,"ratio":1.17,"stop":"#CCE6D0"},{"ink":"#59D2FE","alpha":0.56,"ratio":1.18,"stop":"#CCE6D0"},{"ink":"#59D2FE","alpha":0.72,"ratio":1.22,"stop":"#CCE6D0"}],"allowed":false,"reason":"quiet never sits on a light atmosphere carrier"},
{"kind":"layers","variant":"quiet","carrier":"atmosphere.measure.luminous","carrierClass":"light_atmosphere","paints":16,"hiddenElements":0,"weakest":1,"strongest":1.01,"worstStop":"#89CEF6","verdict":"invisible","shapeIntact":false,"invisible":[{"ink":"#59D2FE","alpha":0.36,"ratio":1,"stop":"#6CD5B3"},{"ink":"#59D2FE","alpha":0.18,"ratio":1,"stop":"#6CD5B3"},{"ink":"#59D2FE","alpha":0.72,"ratio":1.01,"stop":"#6CD5B3"},{"ink":"#59D2FE","alpha":0.56,"ratio":1.01,"stop":"#6CD5B3"},{"ink":"#59D2FE","alpha":0.54,"ratio":1.01,"stop":"#6CD5B3"}],"allowed":false,"reason":"quiet never sits on a light atmosphere carrier"},
{"kind":"layers","variant":"quiet","carrier":"atmosphere.ground.current","carrierClass":"deep_atmosphere","paints":16,"hiddenElements":0,"weakest":1.28,"strongest":2.46,"worstStop":"#1F744F","verdict":"decorativeOnly","shapeIntact":false,"invisible":[{"ink":"#59D2FE","alpha":0.18,"ratio":1.28,"stop":"#1F744F"}],"allowed":false,"reason":"paint #59D2FE at alpha 0.18 measures 1.28:1 on stop #1F744F"},
{"kind":"layers","variant":"quiet","carrier":"atmosphere.measure.deep","carrierClass":"deep_atmosphere","paints":16,"hiddenElements":0,"weakest":1.27,"strongest":2.39,"worstStop":"#08756F","verdict":"decorativeOnly","shapeIntact":false,"invisible":[{"ink":"#59D2FE","alpha":0.18,"ratio":1.27,"stop":"#08756F"}],"allowed":false,"reason":"paint #59D2FE at alpha 0.18 measures 1.27:1 on stop #08756F"},
{"kind":"slice","variant":"full","carrier":"surface.canvas@light","carrierClass":"light_plain","paints":2,"hiddenElements":0,"weakest":1.62,"strongest":8.39,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":true,"reason":null},
{"kind":"slice","variant":"full","carrier":"surface.canvas@dark","carrierClass":"deep_plain","paints":2,"hiddenElements":0,"weakest":1.97,"strongest":10.23,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":false,"reason":"full never sits on a deep plain carrier"},
{"kind":"slice","variant":"full","carrier":"surface.alt@light","carrierClass":"light_plain","paints":2,"hiddenElements":0,"weakest":1.53,"strongest":7.93,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":true,"reason":null},
{"kind":"slice","variant":"full","carrier":"surface.alt@dark","carrierClass":"deep_plain","paints":2,"hiddenElements":0,"weakest":1.81,"strongest":9.42,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":false,"reason":"full never sits on a deep plain carrier"},
{"kind":"slice","variant":"full","carrier":"surface.card@light","carrierClass":"light_plain","paints":2,"hiddenElements":0,"weakest":1.69,"strongest":8.79,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":true,"reason":null},
{"kind":"slice","variant":"full","carrier":"surface.card@dark","carrierClass":"deep_plain","paints":2,"hiddenElements":0,"weakest":1.64,"strongest":8.52,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":false,"reason":"full never sits on a deep plain carrier"},
{"kind":"slice","variant":"full","carrier":"surface.raised@light","carrierClass":"light_plain","paints":2,"hiddenElements":0,"weakest":1.74,"strongest":9.03,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":true,"reason":null},
{"kind":"slice","variant":"full","carrier":"surface.raised@dark","carrierClass":"deep_plain","paints":2,"hiddenElements":0,"weakest":1.43,"strongest":7.44,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":false,"reason":"full never sits on a deep plain carrier"},
{"kind":"slice","variant":"full","carrier":"surface.soft@light","carrierClass":"light_plain","paints":2,"hiddenElements":0,"weakest":1.42,"strongest":7.36,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":true,"reason":null},
{"kind":"slice","variant":"full","carrier":"surface.soft@dark","carrierClass":"deep_plain","paints":2,"hiddenElements":0,"weakest":1.4,"strongest":7.27,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":false,"reason":"full never sits on a deep plain carrier"},
{"kind":"slice","variant":"full","carrier":"surface.blueTint@light","carrierClass":"light_plain","paints":2,"hiddenElements":0,"weakest":1.42,"strongest":7.36,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":true,"reason":null},
{"kind":"slice","variant":"full","carrier":"surface.blueTint@dark","carrierClass":"deep_plain","paints":2,"hiddenElements":0,"weakest":1.47,"strongest":7.63,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":false,"reason":"full never sits on a deep plain carrier"},
{"kind":"slice","variant":"full","carrier":"surface.beigeTint@light","carrierClass":"light_plain","paints":2,"hiddenElements":0,"weakest":1.53,"strongest":7.92,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":true,"reason":null},
{"kind":"slice","variant":"full","carrier":"surface.beigeTint@dark","carrierClass":"deep_plain","paints":2,"hiddenElements":0,"weakest":1.59,"strongest":8.26,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":false,"reason":"full never sits on a deep plain carrier"},
{"kind":"slice","variant":"full","carrier":"brand.beige","carrierClass":"light_plain","paints":2,"hiddenElements":0,"weakest":1.53,"strongest":7.92,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":true,"reason":null},
{"kind":"slice","variant":"full","carrier":"brand.blue","carrierClass":"deep_plain","paints":2,"hiddenElements":0,"weakest":1,"strongest":5.19,"worstStop":null,"verdict":"meaningCapable","shapeIntact":false,"invisible":[{"ink":"#1D4497","alpha":1,"ratio":1,"stop":"#1D4497"}],"allowed":false,"reason":"full never sits on a deep plain carrier"},
{"kind":"slice","variant":"full","carrier":"atmosphere.ground.mist","carrierClass":"light_atmosphere","paints":2,"hiddenElements":0,"weakest":1.23,"strongest":6.39,"worstStop":"#B2E2E2","verdict":"meaningCapable","shapeIntact":false,"invisible":[{"ink":"#59D2FE","alpha":1,"ratio":1.23,"stop":"#B2E2E2"}],"allowed":false,"reason":"full never sits on a light atmosphere carrier"},
{"kind":"slice","variant":"full","carrier":"atmosphere.measure.luminous","carrierClass":"light_atmosphere","paints":2,"hiddenElements":0,"weakest":1.01,"strongest":4.68,"worstStop":"#5ECAD6","verdict":"meaningCapable","shapeIntact":false,"invisible":[{"ink":"#59D2FE","alpha":1,"ratio":1.02,"stop":"#6CD5B3"}],"allowed":false,"reason":"full never sits on a light atmosphere carrier"},
{"kind":"slice","variant":"full","carrier":"atmosphere.ground.current","carrierClass":"deep_atmosphere","paints":2,"hiddenElements":0,"weakest":1.13,"strongest":3.29,"worstStop":"#1F744F","verdict":"meaningCapable","shapeIntact":false,"invisible":[{"ink":"#1D4497","alpha":1,"ratio":1.13,"stop":"#0F5773"}],"allowed":false,"reason":"full never sits on a deep atmosphere carrier"},
{"kind":"slice","variant":"full","carrier":"atmosphere.measure.deep","carrierClass":"deep_atmosphere","paints":2,"hiddenElements":0,"weakest":1,"strongest":3.19,"worstStop":"#08756F","verdict":"meaningCapable","shapeIntact":false,"invisible":[{"ink":"#1D4497","alpha":1,"ratio":1,"stop":"#1D4497"}],"allowed":false,"reason":"full never sits on a deep atmosphere carrier"},
{"kind":"slice","variant":"quiet","carrier":"surface.canvas@light","carrierClass":"light_plain","paints":2,"hiddenElements":0,"weakest":1.23,"strongest":1.33,"worstStop":null,"verdict":"decorativeOnly","shapeIntact":false,"invisible":[{"ink":"#59D2FE","alpha":0.4,"ratio":1.23,"stop":"#F6F7F3"}],"allowed":false,"reason":"quiet never sits on a light plain carrier"},
{"kind":"slice","variant":"quiet","carrier":"surface.canvas@dark","carrierClass":"deep_plain","paints":2,"hiddenElements":0,"weakest":2.68,"strongest":4.05,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":true,"reason":null},
{"kind":"slice","variant":"quiet","carrier":"surface.alt@light","carrierClass":"light_plain","paints":2,"hiddenElements":0,"weakest":1.2,"strongest":1.28,"worstStop":null,"verdict":"invisible","shapeIntact":false,"invisible":[{"ink":"#59D2FE","alpha":0.4,"ratio":1.2,"stop":"#EEF1EE"},{"ink":"#59D2FE","alpha":0.56,"ratio":1.28,"stop":"#EEF1EE"}],"allowed":false,"reason":"quiet never sits on a light plain carrier"},
{"kind":"slice","variant":"quiet","carrier":"surface.alt@dark","carrierClass":"deep_plain","paints":2,"hiddenElements":0,"weakest":2.65,"strongest":3.9,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":true,"reason":null},
{"kind":"slice","variant":"quiet","carrier":"surface.card@light","carrierClass":"light_plain","paints":2,"hiddenElements":0,"weakest":1.25,"strongest":1.36,"worstStop":null,"verdict":"decorativeOnly","shapeIntact":false,"invisible":[{"ink":"#59D2FE","alpha":0.4,"ratio":1.25,"stop":"#FCFCFA"}],"allowed":false,"reason":"quiet never sits on a light plain carrier"},
{"kind":"slice","variant":"quiet","carrier":"surface.card@dark","carrierClass":"deep_plain","paints":2,"hiddenElements":0,"weakest":2.59,"strongest":3.71,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":true,"reason":null},
{"kind":"slice","variant":"quiet","carrier":"surface.raised@light","carrierClass":"light_plain","paints":2,"hiddenElements":0,"weakest":1.26,"strongest":1.37,"worstStop":null,"verdict":"decorativeOnly","shapeIntact":false,"invisible":[{"ink":"#59D2FE","alpha":0.4,"ratio":1.26,"stop":"#FFFFFF"}],"allowed":false,"reason":"quiet never sits on a light plain carrier"},
{"kind":"slice","variant":"quiet","carrier":"surface.raised@dark","carrierClass":"deep_plain","paints":2,"hiddenElements":0,"weakest":2.46,"strongest":3.42,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":true,"reason":null},
{"kind":"slice","variant":"quiet","carrier":"surface.soft@light","carrierClass":"light_plain","paints":2,"hiddenElements":0,"weakest":1.17,"strongest":1.24,"worstStop":null,"verdict":"invisible","shapeIntact":false,"invisible":[{"ink":"#59D2FE","alpha":0.4,"ratio":1.17,"stop":"#E5E9E6"},{"ink":"#59D2FE","alpha":0.56,"ratio":1.24,"stop":"#E5E9E6"}],"allowed":false,"reason":"quiet never sits on a light plain carrier"},
{"kind":"slice","variant":"quiet","carrier":"surface.soft@dark","carrierClass":"deep_plain","paints":2,"hiddenElements":0,"weakest":2.43,"strongest":3.37,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":true,"reason":null},
{"kind":"slice","variant":"quiet","carrier":"surface.blueTint@light","carrierClass":"light_plain","paints":2,"hiddenElements":0,"weakest":1.16,"strongest":1.23,"worstStop":null,"verdict":"invisible","shapeIntact":false,"invisible":[{"ink":"#59D2FE","alpha":0.4,"ratio":1.16,"stop":"#E2E9ED"},{"ink":"#59D2FE","alpha":0.56,"ratio":1.23,"stop":"#E2E9ED"}],"allowed":false,"reason":"quiet never sits on a light plain carrier"},
{"kind":"slice","variant":"quiet","carrier":"surface.blueTint@dark","carrierClass":"deep_plain","paints":2,"hiddenElements":0,"weakest":2.5,"strongest":3.49,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":true,"reason":null},
{"kind":"slice","variant":"quiet","carrier":"surface.beigeTint@light","carrierClass":"light_plain","paints":2,"hiddenElements":0,"weakest":1.2,"strongest":1.29,"worstStop":null,"verdict":"invisible","shapeIntact":false,"invisible":[{"ink":"#59D2FE","alpha":0.4,"ratio":1.2,"stop":"#F2F1DF"},{"ink":"#59D2FE","alpha":0.56,"ratio":1.29,"stop":"#F2F1DF"}],"allowed":false,"reason":"quiet never sits on a light plain carrier"},
{"kind":"slice","variant":"quiet","carrier":"surface.beigeTint@dark","carrierClass":"deep_plain","paints":2,"hiddenElements":0,"weakest":2.51,"strongest":3.6,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":true,"reason":null},
{"kind":"slice","variant":"quiet","carrier":"brand.beige","carrierClass":"light_plain","paints":2,"hiddenElements":0,"weakest":1.2,"strongest":1.29,"worstStop":null,"verdict":"invisible","shapeIntact":false,"invisible":[{"ink":"#59D2FE","alpha":0.4,"ratio":1.2,"stop":"#F2F1DF"},{"ink":"#59D2FE","alpha":0.56,"ratio":1.29,"stop":"#F2F1DF"}],"allowed":false,"reason":"quiet never sits on a light plain carrier"},
{"kind":"slice","variant":"quiet","carrier":"brand.blue","carrierClass":"deep_plain","paints":2,"hiddenElements":0,"weakest":2.08,"strongest":2.74,"worstStop":null,"verdict":"decorativeOnly","shapeIntact":true,"invisible":[],"allowed":true,"reason":null},
{"kind":"slice","variant":"quiet","carrier":"atmosphere.ground.mist","carrierClass":"light_atmosphere","paints":2,"hiddenElements":0,"weakest":1.09,"strongest":1.13,"worstStop":"#B2E2E2","verdict":"invisible","shapeIntact":false,"invisible":[{"ink":"#59D2FE","alpha":0.4,"ratio":1.13,"stop":"#CCE6D0"},{"ink":"#59D2FE","alpha":0.56,"ratio":1.18,"stop":"#CCE6D0"}],"allowed":false,"reason":"quiet never sits on a light atmosphere carrier"},
{"kind":"slice","variant":"quiet","carrier":"atmosphere.measure.luminous","carrierClass":"light_atmosphere","paints":2,"hiddenElements":0,"weakest":1.01,"strongest":1.01,"worstStop":"#89CEF6","verdict":"invisible","shapeIntact":false,"invisible":[{"ink":"#59D2FE","alpha":0.4,"ratio":1.01,"stop":"#6CD5B3"},{"ink":"#59D2FE","alpha":0.56,"ratio":1.01,"stop":"#6CD5B3"}],"allowed":false,"reason":"quiet never sits on a light atmosphere carrier"},
{"kind":"slice","variant":"quiet","carrier":"atmosphere.ground.current","carrierClass":"deep_atmosphere","paints":2,"hiddenElements":0,"weakest":1.69,"strongest":2.05,"worstStop":"#1F744F","verdict":"decorativeOnly","shapeIntact":true,"invisible":[],"allowed":true,"reason":null},
{"kind":"slice","variant":"quiet","carrier":"atmosphere.measure.deep","carrierClass":"deep_atmosphere","paints":2,"hiddenElements":0,"weakest":1.66,"strongest":2,"worstStop":"#08756F","verdict":"decorativeOnly","shapeIntact":true,"invisible":[],"allowed":true,"reason":null},
{"kind":"cultivate","variant":"full","carrier":"surface.canvas@light","carrierClass":"light_plain","paints":8,"hiddenElements":0,"weakest":1.57,"strongest":8.39,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":true,"reason":null},
{"kind":"cultivate","variant":"full","carrier":"surface.canvas@dark","carrierClass":"deep_plain","paints":8,"hiddenElements":0,"weakest":1.97,"strongest":10.56,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":false,"reason":"full never sits on a deep plain carrier"},
{"kind":"cultivate","variant":"full","carrier":"surface.alt@light","carrierClass":"light_plain","paints":8,"hiddenElements":0,"weakest":1.48,"strongest":7.93,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":true,"reason":null},
{"kind":"cultivate","variant":"full","carrier":"surface.alt@dark","carrierClass":"deep_plain","paints":8,"hiddenElements":0,"weakest":1.81,"strongest":9.72,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":false,"reason":"full never sits on a deep plain carrier"},
{"kind":"cultivate","variant":"full","carrier":"surface.card@light","carrierClass":"light_plain","paints":8,"hiddenElements":0,"weakest":1.64,"strongest":8.79,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":true,"reason":null},
{"kind":"cultivate","variant":"full","carrier":"surface.card@dark","carrierClass":"deep_plain","paints":8,"hiddenElements":0,"weakest":1.64,"strongest":8.8,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":false,"reason":"full never sits on a deep plain carrier"},
{"kind":"cultivate","variant":"full","carrier":"surface.raised@light","carrierClass":"light_plain","paints":8,"hiddenElements":0,"weakest":1.68,"strongest":9.03,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":true,"reason":null},
{"kind":"cultivate","variant":"full","carrier":"surface.raised@dark","carrierClass":"deep_plain","paints":8,"hiddenElements":0,"weakest":1.43,"strongest":7.68,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":false,"reason":"full never sits on a deep plain carrier"},
{"kind":"cultivate","variant":"full","carrier":"surface.soft@light","carrierClass":"light_plain","paints":8,"hiddenElements":0,"weakest":1.37,"strongest":7.36,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":true,"reason":null},
{"kind":"cultivate","variant":"full","carrier":"surface.soft@dark","carrierClass":"deep_plain","paints":8,"hiddenElements":0,"weakest":1.4,"strongest":7.5,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":false,"reason":"full never sits on a deep plain carrier"},
{"kind":"cultivate","variant":"full","carrier":"surface.blueTint@light","carrierClass":"light_plain","paints":8,"hiddenElements":0,"weakest":1.37,"strongest":7.36,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":true,"reason":null},
{"kind":"cultivate","variant":"full","carrier":"surface.blueTint@dark","carrierClass":"deep_plain","paints":8,"hiddenElements":0,"weakest":1.47,"strongest":7.88,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":false,"reason":"full never sits on a deep plain carrier"},
{"kind":"cultivate","variant":"full","carrier":"surface.beigeTint@light","carrierClass":"light_plain","paints":8,"hiddenElements":0,"weakest":1.48,"strongest":7.92,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":true,"reason":null},
{"kind":"cultivate","variant":"full","carrier":"surface.beigeTint@dark","carrierClass":"deep_plain","paints":8,"hiddenElements":0,"weakest":1.59,"strongest":8.53,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":false,"reason":"full never sits on a deep plain carrier"},
{"kind":"cultivate","variant":"full","carrier":"brand.beige","carrierClass":"light_plain","paints":8,"hiddenElements":0,"weakest":1.48,"strongest":7.92,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":true,"reason":null},
{"kind":"cultivate","variant":"full","carrier":"brand.blue","carrierClass":"deep_plain","paints":8,"hiddenElements":0,"weakest":1,"strongest":5.36,"worstStop":null,"verdict":"meaningCapable","shapeIntact":false,"invisible":[{"ink":"#1D4497","alpha":1,"ratio":1,"stop":"#1D4497"}],"allowed":false,"reason":"full never sits on a deep plain carrier"},
{"kind":"cultivate","variant":"full","carrier":"atmosphere.ground.mist","carrierClass":"light_atmosphere","paints":8,"hiddenElements":0,"weakest":1.19,"strongest":6.39,"worstStop":"#B2E2E2","verdict":"meaningCapable","shapeIntact":false,"invisible":[{"ink":"#59D2FE","alpha":1,"ratio":1.23,"stop":"#B2E2E2"},{"ink":"#FFBC1F","alpha":1,"ratio":1.27,"stop":"#CCE6D0"}],"allowed":false,"reason":"full never sits on a light atmosphere carrier"},
{"kind":"cultivate","variant":"full","carrier":"atmosphere.measure.luminous","carrierClass":"light_atmosphere","paints":8,"hiddenElements":0,"weakest":1.01,"strongest":4.68,"worstStop":"#5ECAD6","verdict":"meaningCapable","shapeIntact":false,"invisible":[{"ink":"#59D2FE","alpha":1,"ratio":1.02,"stop":"#6CD5B3"},{"ink":"#0AD69C","alpha":1,"ratio":1.06,"stop":"#6CD5B3"},{"ink":"#FFBC1F","alpha":1,"ratio":1.06,"stop":"#6CD5B3"}],"allowed":false,"reason":"full never sits on a light atmosphere carrier"},
{"kind":"cultivate","variant":"full","carrier":"atmosphere.ground.current","carrierClass":"deep_atmosphere","paints":8,"hiddenElements":0,"weakest":1.13,"strongest":3.4,"worstStop":"#1F744F","verdict":"meaningCapable","shapeIntact":false,"invisible":[{"ink":"#1D4497","alpha":1,"ratio":1.13,"stop":"#0F5773"}],"allowed":false,"reason":"full never sits on a deep atmosphere carrier"},
{"kind":"cultivate","variant":"full","carrier":"atmosphere.measure.deep","carrierClass":"deep_atmosphere","paints":8,"hiddenElements":0,"weakest":1,"strongest":3.29,"worstStop":"#08756F","verdict":"meaningCapable","shapeIntact":false,"invisible":[{"ink":"#1D4497","alpha":1,"ratio":1,"stop":"#1D4497"}],"allowed":false,"reason":"full never sits on a deep atmosphere carrier"},
{"kind":"cultivate","variant":"quiet","carrier":"surface.canvas@light","carrierClass":"light_plain","paints":11,"hiddenElements":0,"weakest":1.33,"strongest":1.62,"worstStop":null,"verdict":"decorativeOnly","shapeIntact":true,"invisible":[],"allowed":false,"reason":"quiet never sits on a light plain carrier"},
{"kind":"cultivate","variant":"quiet","carrier":"surface.canvas@dark","carrierClass":"deep_plain","paints":11,"hiddenElements":0,"weakest":4.05,"strongest":10.23,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":true,"reason":null},
{"kind":"cultivate","variant":"quiet","carrier":"surface.alt@light","carrierClass":"light_plain","paints":11,"hiddenElements":0,"weakest":1.28,"strongest":1.53,"worstStop":null,"verdict":"decorativeOnly","shapeIntact":false,"invisible":[{"ink":"#59D2FE","alpha":0.56,"ratio":1.28,"stop":"#EEF1EE"}],"allowed":false,"reason":"quiet never sits on a light plain carrier"},
{"kind":"cultivate","variant":"quiet","carrier":"surface.alt@dark","carrierClass":"deep_plain","paints":11,"hiddenElements":0,"weakest":3.9,"strongest":9.42,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":true,"reason":null},
{"kind":"cultivate","variant":"quiet","carrier":"surface.card@light","carrierClass":"light_plain","paints":11,"hiddenElements":0,"weakest":1.36,"strongest":1.69,"worstStop":null,"verdict":"decorativeOnly","shapeIntact":true,"invisible":[],"allowed":false,"reason":"quiet never sits on a light plain carrier"},
{"kind":"cultivate","variant":"quiet","carrier":"surface.card@dark","carrierClass":"deep_plain","paints":11,"hiddenElements":0,"weakest":3.71,"strongest":8.52,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":true,"reason":null},
{"kind":"cultivate","variant":"quiet","carrier":"surface.raised@light","carrierClass":"light_plain","paints":11,"hiddenElements":0,"weakest":1.37,"strongest":1.74,"worstStop":null,"verdict":"decorativeOnly","shapeIntact":true,"invisible":[],"allowed":false,"reason":"quiet never sits on a light plain carrier"},
{"kind":"cultivate","variant":"quiet","carrier":"surface.raised@dark","carrierClass":"deep_plain","paints":11,"hiddenElements":0,"weakest":3.42,"strongest":7.44,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":true,"reason":null},
{"kind":"cultivate","variant":"quiet","carrier":"surface.soft@light","carrierClass":"light_plain","paints":11,"hiddenElements":0,"weakest":1.24,"strongest":1.42,"worstStop":null,"verdict":"decorativeOnly","shapeIntact":false,"invisible":[{"ink":"#59D2FE","alpha":0.56,"ratio":1.24,"stop":"#E5E9E6"}],"allowed":false,"reason":"quiet never sits on a light plain carrier"},
{"kind":"cultivate","variant":"quiet","carrier":"surface.soft@dark","carrierClass":"deep_plain","paints":11,"hiddenElements":0,"weakest":3.37,"strongest":7.27,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":true,"reason":null},
{"kind":"cultivate","variant":"quiet","carrier":"surface.blueTint@light","carrierClass":"light_plain","paints":11,"hiddenElements":0,"weakest":1.23,"strongest":1.42,"worstStop":null,"verdict":"decorativeOnly","shapeIntact":false,"invisible":[{"ink":"#59D2FE","alpha":0.56,"ratio":1.23,"stop":"#E2E9ED"}],"allowed":false,"reason":"quiet never sits on a light plain carrier"},
{"kind":"cultivate","variant":"quiet","carrier":"surface.blueTint@dark","carrierClass":"deep_plain","paints":11,"hiddenElements":0,"weakest":3.49,"strongest":7.63,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":true,"reason":null},
{"kind":"cultivate","variant":"quiet","carrier":"surface.beigeTint@light","carrierClass":"light_plain","paints":11,"hiddenElements":0,"weakest":1.29,"strongest":1.53,"worstStop":null,"verdict":"decorativeOnly","shapeIntact":false,"invisible":[{"ink":"#59D2FE","alpha":0.56,"ratio":1.29,"stop":"#F2F1DF"}],"allowed":false,"reason":"quiet never sits on a light plain carrier"},
{"kind":"cultivate","variant":"quiet","carrier":"surface.beigeTint@dark","carrierClass":"deep_plain","paints":11,"hiddenElements":0,"weakest":3.6,"strongest":8.26,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":true,"reason":null},
{"kind":"cultivate","variant":"quiet","carrier":"brand.beige","carrierClass":"light_plain","paints":11,"hiddenElements":0,"weakest":1.29,"strongest":1.53,"worstStop":null,"verdict":"decorativeOnly","shapeIntact":false,"invisible":[{"ink":"#59D2FE","alpha":0.56,"ratio":1.29,"stop":"#F2F1DF"}],"allowed":false,"reason":"quiet never sits on a light plain carrier"},
{"kind":"cultivate","variant":"quiet","carrier":"brand.blue","carrierClass":"deep_plain","paints":11,"hiddenElements":0,"weakest":2.74,"strongest":5.19,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":true,"reason":null},
{"kind":"cultivate","variant":"quiet","carrier":"atmosphere.ground.mist","carrierClass":"light_atmosphere","paints":11,"hiddenElements":0,"weakest":1.13,"strongest":1.23,"worstStop":"#B2E2E2","verdict":"invisible","shapeIntact":false,"invisible":[{"ink":"#59D2FE","alpha":0.56,"ratio":1.18,"stop":"#CCE6D0"},{"ink":"#59D2FE","alpha":1,"ratio":1.23,"stop":"#B2E2E2"}],"allowed":false,"reason":"quiet never sits on a light atmosphere carrier"},
{"kind":"cultivate","variant":"quiet","carrier":"atmosphere.measure.luminous","carrierClass":"light_atmosphere","paints":11,"hiddenElements":0,"weakest":1.01,"strongest":1.01,"worstStop":"#89CEF6","verdict":"invisible","shapeIntact":false,"invisible":[{"ink":"#59D2FE","alpha":0.56,"ratio":1.01,"stop":"#6CD5B3"},{"ink":"#59D2FE","alpha":1,"ratio":1.02,"stop":"#6CD5B3"}],"allowed":false,"reason":"quiet never sits on a light atmosphere carrier"},
{"kind":"cultivate","variant":"quiet","carrier":"atmosphere.ground.current","carrierClass":"deep_atmosphere","paints":11,"hiddenElements":0,"weakest":2.05,"strongest":3.29,"worstStop":"#1F744F","verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":true,"reason":null},
{"kind":"cultivate","variant":"quiet","carrier":"atmosphere.measure.deep","carrierClass":"deep_atmosphere","paints":11,"hiddenElements":0,"weakest":2,"strongest":3.19,"worstStop":"#08756F","verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":true,"reason":null},
{"kind":"logo","variant":"full","carrier":"surface.canvas@light","carrierClass":"light_plain","paints":10,"hiddenElements":0,"weakest":1.57,"strongest":8.39,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":true,"reason":null},
{"kind":"logo","variant":"full","carrier":"surface.canvas@dark","carrierClass":"deep_plain","paints":10,"hiddenElements":0,"weakest":1.97,"strongest":10.56,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":false,"reason":"full never sits on a deep plain carrier"},
{"kind":"logo","variant":"full","carrier":"surface.alt@light","carrierClass":"light_plain","paints":10,"hiddenElements":0,"weakest":1.48,"strongest":7.93,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":true,"reason":null},
{"kind":"logo","variant":"full","carrier":"surface.alt@dark","carrierClass":"deep_plain","paints":10,"hiddenElements":0,"weakest":1.81,"strongest":9.72,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":false,"reason":"full never sits on a deep plain carrier"},
{"kind":"logo","variant":"full","carrier":"surface.card@light","carrierClass":"light_plain","paints":10,"hiddenElements":0,"weakest":1.64,"strongest":8.79,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":true,"reason":null},
{"kind":"logo","variant":"full","carrier":"surface.card@dark","carrierClass":"deep_plain","paints":10,"hiddenElements":0,"weakest":1.64,"strongest":8.8,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":false,"reason":"full never sits on a deep plain carrier"},
{"kind":"logo","variant":"full","carrier":"surface.raised@light","carrierClass":"light_plain","paints":10,"hiddenElements":0,"weakest":1.68,"strongest":9.03,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":true,"reason":null},
{"kind":"logo","variant":"full","carrier":"surface.raised@dark","carrierClass":"deep_plain","paints":10,"hiddenElements":0,"weakest":1.43,"strongest":7.68,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":false,"reason":"full never sits on a deep plain carrier"},
{"kind":"logo","variant":"full","carrier":"surface.soft@light","carrierClass":"light_plain","paints":10,"hiddenElements":0,"weakest":1.37,"strongest":7.36,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":true,"reason":null},
{"kind":"logo","variant":"full","carrier":"surface.soft@dark","carrierClass":"deep_plain","paints":10,"hiddenElements":0,"weakest":1.4,"strongest":7.5,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":false,"reason":"full never sits on a deep plain carrier"},
{"kind":"logo","variant":"full","carrier":"surface.blueTint@light","carrierClass":"light_plain","paints":10,"hiddenElements":0,"weakest":1.37,"strongest":7.36,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":true,"reason":null},
{"kind":"logo","variant":"full","carrier":"surface.blueTint@dark","carrierClass":"deep_plain","paints":10,"hiddenElements":0,"weakest":1.47,"strongest":7.88,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":false,"reason":"full never sits on a deep plain carrier"},
{"kind":"logo","variant":"full","carrier":"surface.beigeTint@light","carrierClass":"light_plain","paints":10,"hiddenElements":0,"weakest":1.48,"strongest":7.92,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":true,"reason":null},
{"kind":"logo","variant":"full","carrier":"surface.beigeTint@dark","carrierClass":"deep_plain","paints":10,"hiddenElements":0,"weakest":1.59,"strongest":8.53,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":false,"reason":"full never sits on a deep plain carrier"},
{"kind":"logo","variant":"full","carrier":"brand.beige","carrierClass":"light_plain","paints":10,"hiddenElements":0,"weakest":1.48,"strongest":7.92,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":true,"reason":null},
{"kind":"logo","variant":"full","carrier":"brand.blue","carrierClass":"deep_plain","paints":10,"hiddenElements":0,"weakest":1,"strongest":5.36,"worstStop":null,"verdict":"meaningCapable","shapeIntact":false,"invisible":[{"ink":"#1D4497","alpha":1,"ratio":1,"stop":"#1D4497"}],"allowed":false,"reason":"full never sits on a deep plain carrier"},
{"kind":"logo","variant":"full","carrier":"atmosphere.ground.mist","carrierClass":"light_atmosphere","paints":10,"hiddenElements":0,"weakest":1.19,"strongest":6.39,"worstStop":"#B2E2E2","verdict":"meaningCapable","shapeIntact":false,"invisible":[{"ink":"#59D2FE","alpha":1,"ratio":1.23,"stop":"#B2E2E2"},{"ink":"#FFBC1F","alpha":1,"ratio":1.27,"stop":"#CCE6D0"}],"allowed":false,"reason":"full never sits on a light atmosphere carrier"},
{"kind":"logo","variant":"full","carrier":"atmosphere.measure.luminous","carrierClass":"light_atmosphere","paints":10,"hiddenElements":0,"weakest":1.01,"strongest":4.68,"worstStop":"#5ECAD6","verdict":"meaningCapable","shapeIntact":false,"invisible":[{"ink":"#59D2FE","alpha":1,"ratio":1.02,"stop":"#6CD5B3"},{"ink":"#0AD69C","alpha":1,"ratio":1.06,"stop":"#6CD5B3"},{"ink":"#FFBC1F","alpha":1,"ratio":1.06,"stop":"#6CD5B3"},{"ink":"#D2A437","alpha":1,"ratio":1.2,"stop":"#5ECAD6"},{"ink":"#0EB99B","alpha":1,"ratio":1.29,"stop":"#5ECAD6"},{"ink":"#4DB6E9","alpha":1,"ratio":1.29,"stop":"#6CD5B3"}],"allowed":false,"reason":"full never sits on a light atmosphere carrier"},
{"kind":"logo","variant":"full","carrier":"atmosphere.ground.current","carrierClass":"deep_atmosphere","paints":10,"hiddenElements":0,"weakest":1.13,"strongest":3.4,"worstStop":"#1F744F","verdict":"meaningCapable","shapeIntact":false,"invisible":[{"ink":"#1D4497","alpha":1,"ratio":1.13,"stop":"#0F5773"}],"allowed":false,"reason":"full never sits on a deep atmosphere carrier"},
{"kind":"logo","variant":"full","carrier":"atmosphere.measure.deep","carrierClass":"deep_atmosphere","paints":10,"hiddenElements":0,"weakest":1,"strongest":3.29,"worstStop":"#08756F","verdict":"meaningCapable","shapeIntact":false,"invisible":[{"ink":"#1D4497","alpha":1,"ratio":1,"stop":"#1D4497"}],"allowed":false,"reason":"full never sits on a deep atmosphere carrier"},
{"kind":"logo","variant":"quiet","carrier":"surface.canvas@light","carrierClass":"light_plain","paints":13,"hiddenElements":2,"weakest":1.13,"strongest":1.62,"worstStop":null,"verdict":"decorativeOnly","shapeIntact":false,"invisible":[{"ink":"#59D2FE","alpha":0.24,"ratio":1.13,"stop":"#F6F7F3"}],"allowed":false,"reason":"quiet never sits on a light plain carrier"},
{"kind":"logo","variant":"quiet","carrier":"surface.canvas@dark","carrierClass":"deep_plain","paints":13,"hiddenElements":2,"weakest":1.73,"strongest":10.23,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":true,"reason":null},
{"kind":"logo","variant":"quiet","carrier":"surface.alt@light","carrierClass":"light_plain","paints":13,"hiddenElements":2,"weakest":1.11,"strongest":1.53,"worstStop":null,"verdict":"decorativeOnly","shapeIntact":false,"invisible":[{"ink":"#59D2FE","alpha":0.24,"ratio":1.11,"stop":"#EEF1EE"},{"ink":"#59D2FE","alpha":0.56,"ratio":1.28,"stop":"#EEF1EE"}],"allowed":false,"reason":"quiet never sits on a light plain carrier"},
{"kind":"logo","variant":"quiet","carrier":"surface.alt@dark","carrierClass":"deep_plain","paints":13,"hiddenElements":2,"weakest":1.75,"strongest":9.42,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":true,"reason":null},
{"kind":"logo","variant":"quiet","carrier":"surface.card@light","carrierClass":"light_plain","paints":13,"hiddenElements":2,"weakest":1.14,"strongest":1.69,"worstStop":null,"verdict":"decorativeOnly","shapeIntact":false,"invisible":[{"ink":"#59D2FE","alpha":0.24,"ratio":1.14,"stop":"#FCFCFA"}],"allowed":false,"reason":"quiet never sits on a light plain carrier"},
{"kind":"logo","variant":"quiet","carrier":"surface.card@dark","carrierClass":"deep_plain","paints":13,"hiddenElements":2,"weakest":1.76,"strongest":8.52,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":true,"reason":null},
{"kind":"logo","variant":"quiet","carrier":"surface.raised@light","carrierClass":"light_plain","paints":13,"hiddenElements":2,"weakest":1.15,"strongest":1.74,"worstStop":null,"verdict":"decorativeOnly","shapeIntact":false,"invisible":[{"ink":"#59D2FE","alpha":0.24,"ratio":1.15,"stop":"#FFFFFF"}],"allowed":false,"reason":"quiet never sits on a light plain carrier"},
{"kind":"logo","variant":"quiet","carrier":"surface.raised@dark","carrierClass":"deep_plain","paints":13,"hiddenElements":2,"weakest":1.71,"strongest":7.44,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":true,"reason":null},
{"kind":"logo","variant":"quiet","carrier":"surface.soft@light","carrierClass":"light_plain","paints":13,"hiddenElements":2,"weakest":1.1,"strongest":1.42,"worstStop":null,"verdict":"decorativeOnly","shapeIntact":false,"invisible":[{"ink":"#59D2FE","alpha":0.24,"ratio":1.1,"stop":"#E5E9E6"},{"ink":"#59D2FE","alpha":0.56,"ratio":1.24,"stop":"#E5E9E6"}],"allowed":false,"reason":"quiet never sits on a light plain carrier"},
{"kind":"logo","variant":"quiet","carrier":"surface.soft@dark","carrierClass":"deep_plain","paints":13,"hiddenElements":2,"weakest":1.71,"strongest":7.27,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":true,"reason":null},
{"kind":"logo","variant":"quiet","carrier":"surface.blueTint@light","carrierClass":"light_plain","paints":13,"hiddenElements":2,"weakest":1.1,"strongest":1.42,"worstStop":null,"verdict":"decorativeOnly","shapeIntact":false,"invisible":[{"ink":"#59D2FE","alpha":0.24,"ratio":1.1,"stop":"#E2E9ED"},{"ink":"#59D2FE","alpha":0.56,"ratio":1.23,"stop":"#E2E9ED"}],"allowed":false,"reason":"quiet never sits on a light plain carrier"},
{"kind":"logo","variant":"quiet","carrier":"surface.blueTint@dark","carrierClass":"deep_plain","paints":13,"hiddenElements":2,"weakest":1.73,"strongest":7.63,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":true,"reason":null},
{"kind":"logo","variant":"quiet","carrier":"surface.beigeTint@light","carrierClass":"light_plain","paints":13,"hiddenElements":2,"weakest":1.12,"strongest":1.53,"worstStop":null,"verdict":"decorativeOnly","shapeIntact":false,"invisible":[{"ink":"#59D2FE","alpha":0.24,"ratio":1.12,"stop":"#F2F1DF"},{"ink":"#59D2FE","alpha":0.56,"ratio":1.29,"stop":"#F2F1DF"}],"allowed":false,"reason":"quiet never sits on a light plain carrier"},
{"kind":"logo","variant":"quiet","carrier":"surface.beigeTint@dark","carrierClass":"deep_plain","paints":13,"hiddenElements":2,"weakest":1.72,"strongest":8.26,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":true,"reason":null},
{"kind":"logo","variant":"quiet","carrier":"brand.beige","carrierClass":"light_plain","paints":13,"hiddenElements":2,"weakest":1.12,"strongest":1.53,"worstStop":null,"verdict":"decorativeOnly","shapeIntact":false,"invisible":[{"ink":"#59D2FE","alpha":0.24,"ratio":1.12,"stop":"#F2F1DF"},{"ink":"#59D2FE","alpha":0.56,"ratio":1.29,"stop":"#F2F1DF"}],"allowed":false,"reason":"quiet never sits on a light plain carrier"},
{"kind":"logo","variant":"quiet","carrier":"brand.blue","carrierClass":"deep_plain","paints":13,"hiddenElements":2,"weakest":1.56,"strongest":5.19,"worstStop":null,"verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":true,"reason":null},
{"kind":"logo","variant":"quiet","carrier":"atmosphere.ground.mist","carrierClass":"light_atmosphere","paints":13,"hiddenElements":2,"weakest":1.06,"strongest":1.23,"worstStop":"#B2E2E2","verdict":"invisible","shapeIntact":false,"invisible":[{"ink":"#59D2FE","alpha":0.24,"ratio":1.08,"stop":"#CCE6D0"},{"ink":"#59D2FE","alpha":0.56,"ratio":1.18,"stop":"#CCE6D0"},{"ink":"#59D2FE","alpha":1,"ratio":1.23,"stop":"#B2E2E2"},{"ink":"#59D2FE","alpha":0.88,"ratio":1.28,"stop":"#CCE6D0"}],"allowed":false,"reason":"quiet never sits on a light atmosphere carrier"},
{"kind":"logo","variant":"quiet","carrier":"atmosphere.measure.luminous","carrierClass":"light_atmosphere","paints":13,"hiddenElements":2,"weakest":1,"strongest":1.01,"worstStop":"#89CEF6","verdict":"invisible","shapeIntact":false,"invisible":[{"ink":"#59D2FE","alpha":0.24,"ratio":1,"stop":"#6CD5B3"},{"ink":"#59D2FE","alpha":0.56,"ratio":1.01,"stop":"#6CD5B3"},{"ink":"#59D2FE","alpha":0.88,"ratio":1.01,"stop":"#6CD5B3"},{"ink":"#59D2FE","alpha":1,"ratio":1.02,"stop":"#6CD5B3"}],"allowed":false,"reason":"quiet never sits on a light atmosphere carrier"},
{"kind":"logo","variant":"quiet","carrier":"atmosphere.ground.current","carrierClass":"deep_atmosphere","paints":13,"hiddenElements":2,"weakest":1.38,"strongest":3.29,"worstStop":"#1F744F","verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":true,"reason":null},
{"kind":"logo","variant":"quiet","carrier":"atmosphere.measure.deep","carrierClass":"deep_atmosphere","paints":13,"hiddenElements":2,"weakest":1.36,"strongest":3.19,"worstStop":"#08756F","verdict":"meaningCapable","shapeIntact":true,"invisible":[],"allowed":true,"reason":null}
]
},
"candidateBriefsStudio14":[{"id":"receipt","job":"handoff","note":"closure when a number receipt or decision log is issued"},{"id":"compare","job":"spatial_transition","note":"transition for two places side by side"},{"id":"citymeter.pending","job":"real_pending_state","note":"state-bound family; visible status text and a working cancel are required"},{"id":"product stings","job":"animated_brand_opening","note":"CityMETER / CityWiki / CityChat"}],
"boundaries":{"sharedLayer":"Landometer portfolio, methodology, and product architecture remain product-neutral across Land, Location, and Living.","productLayer":"ijji assets, animated identity, meanings, examples, and pending-state uses remain product-specific.","identity":"Motifs do not substitute for official identity. The ijji.logo-sting.r3 family is the explicit animated-identity exception for ijji only.","evidence":"Motifs and animated identity are not data, evidence, scores, confidence, completion, product capability, or business outcomes.","comparison":"Cross-product or cross-city comparison requires one compatible schema and release, or an explicit incompatibility note.","releaseMembership":"Artifact overlay 1.2.1 does not retroactively modify LDS 0.9.1, ijji DS 0.5.0, or ijji Add-on 0.5.3."}
}
},
"schemas":{
"action-contracts.schema.json":{
"$schema":"https://json-schema.org/draft/2020-12/schema",
"$id":"https://montri-th.github.io/Landometer/v0.9.7/standalone-0.9.7-r1/schemas/action-contracts.schema.json",
"title":"Landometer typed action contracts v1.1",
"oneOf":[{"$ref":"#/$defs/permission"},{"$ref":"#/$defs/progress"},{"$ref":"#/$defs/result"},{"$ref":"#/$defs/recovery"},{"$ref":"#/$defs/bundle"}],
"$defs":{
"nonEmpty":{"type":"string","minLength":1,"pattern":"\\S"},
"safeRef":{"type":"string","minLength":1,"pattern":"^(?!/)(?!.*(?:^|/)\\.\\.(?:/|$))[^\\u0000]+$"},
"uniqueStrings":{"type":"array","minItems":1,"uniqueItems":true,"items":{"$ref":"#/$defs/nonEmpty"}},
"localeMap":{"type":"object","minProperties":1,"additionalProperties":{"$ref":"#/$defs/nonEmpty"}},
"permission":{"type":"object","additionalProperties":false,"required":["schemaVersion","kind","contractId","artifactId","actionId","resource","actorClasses","allowedOperations","allowedClassifications","decisionStates","denialRecoveryByLocale"],"properties":{"schemaVersion":{"const":"1.1"},"kind":{"const":"permission"},"contractId":{"$ref":"#/$defs/nonEmpty"},"artifactId":{"$ref":"#/$defs/nonEmpty"},"actionId":{"$ref":"#/$defs/nonEmpty"},"resource":{"$ref":"#/$defs/nonEmpty"},"actorClasses":{"$ref":"#/$defs/uniqueStrings"},"allowedOperations":{"$ref":"#/$defs/uniqueStrings"},"allowedClassifications":{"type":"array","minItems":1,"uniqueItems":true,"items":{"enum":["public","internal","confidential","restricted"]}},"decisionStates":{"type":"array","minItems":5,"uniqueItems":true,"items":{"enum":["allowed","denied","expired","revoked","unknown"]},"contains":{"const":"denied"}},"denialRecoveryByLocale":{"$ref":"#/$defs/localeMap"},"authorityRef":{"$ref":"#/$defs/safeRef"}}},
"progress":{"type":"object","additionalProperties":false,"required":["schemaVersion","kind","contractId","states","accessibleStatusByLocale","completionNotImpliedBeforeTerminal","cancellationPolicy"],"properties":{"schemaVersion":{"const":"1.1"},"kind":{"const":"progress"},"contractId":{"$ref":"#/$defs/nonEmpty"},"states":{"type":"array","minItems":2,"uniqueItems":true,"items":{"enum":["idle","queued","running","succeeded","failed","cancelled"]},"contains":{"const":"running"}},"accessibleStatusByLocale":{"$ref":"#/$defs/localeMap"},"completionNotImpliedBeforeTerminal":{"const":true},"cancellationPolicy":{"$ref":"#/$defs/nonEmpty"}}},
"result":{"type":"object","additionalProperties":false,"required":["schemaVersion","kind","contractId","states","messageByLocale","accessibleAnnouncement","receiptLinkPolicy"],"properties":{"schemaVersion":{"const":"1.1"},"kind":{"const":"result"},"contractId":{"$ref":"#/$defs/nonEmpty"},"states":{"type":"array","minItems":3,"uniqueItems":true,"items":{"enum":["succeeded","partial","empty","failed","cancelled"]},"allOf":[{"contains":{"const":"succeeded"},"minContains":1},{"contains":{"const":"failed"},"minContains":1},{"contains":{"const":"cancelled"},"minContains":1}]},"messageByLocale":{"$ref":"#/$defs/localeMap"},"accessibleAnnouncement":{"$ref":"#/$defs/nonEmpty"},"receiptLinkPolicy":{"$ref":"#/$defs/nonEmpty"}}},
"recovery":{"type":"object","additionalProperties":false,"required":["schemaVersion","kind","contractId","failureStates","preservesInput","retryPolicy","fallbackByLocale","escalationPolicy"],"properties":{"schemaVersion":{"const":"1.1"},"kind":{"const":"recovery"},"contractId":{"$ref":"#/$defs/nonEmpty"},"failureStates":{"type":"array","minItems":2,"uniqueItems":true,"items":{"enum":["failed","cancelled"]},"allOf":[{"contains":{"const":"failed"},"minContains":1},{"contains":{"const":"cancelled"},"minContains":1}]},"preservesInput":{"type":"boolean"},"retryPolicy":{"$ref":"#/$defs/nonEmpty"},"fallbackByLocale":{"$ref":"#/$defs/localeMap"},"escalationPolicy":{"$ref":"#/$defs/nonEmpty"}}},
"bundle":{"type":"object","additionalProperties":false,"required":["schemaVersion","permission","progress","result","recovery"],"properties":{"schemaVersion":{"const":"1.1"},"permission":{"$ref":"#/$defs/permission"},"progress":{"$ref":"#/$defs/progress"},"result":{"$ref":"#/$defs/result"},"recovery":{"$ref":"#/$defs/recovery"}}}
},
"$comment":"Resolved standalone LDS 0.9.7 contract, revision standalone-0.9.7-r1. The distribution is owner-approved and unsigned; this schema is not a release attestation. Historical source identities and hashes are recorded separately."
},
"agent-action-authority.schema.json":{
"$schema":"https://json-schema.org/draft/2020-12/schema",
"$id":"https://montri-th.github.io/Landometer/v0.9.7/standalone-0.9.7-r1/schemas/agent-action-authority.schema.json",
"title":"Landometer agent action authority v1.3",
"type":"object",
"additionalProperties":false,
"required":["schemaVersion","releaseRef","authorityId","artifactId","actionId","authorizedActorId","authorizedActorClass","inputSchemaRef","inputSchemaSha256","inputSchemaId","allowedInputClassifications","status","policy","authorizedOperations","authorizedSideEffectClasses","validity","authorizedBy","authorizedAt","authorityEvidenceRef"],
"properties":{
"schemaVersion":{"const":"1.3"},
"releaseRef":{"const":"v0.9.7-owner.1"},
"authorityId":{"$ref":"#/$defs/nonEmpty"},
"artifactId":{"$ref":"#/$defs/nonEmpty"},
"actionId":{"type":"string","pattern":"^[a-z][a-z0-9-]*$"},
"authorizedActorId":{"$ref":"#/$defs/nonEmpty"},
"authorizedActorClass":{"enum":["human_user","authorized_agent"]},
"inputSchemaRef":{"$ref":"#/$defs/safeRef"},
"inputSchemaSha256":{"$ref":"#/$defs/sha256"},
"inputSchemaId":{"$ref":"#/$defs/nonEmpty"},
"allowedInputClassifications":{"type":"array","minItems":1,"uniqueItems":true,"items":{"enum":["public","internal","confidential","restricted"]}},
"status":{"const":"active"},
"policy":{"enum":["read_only","confirm_before_commit","owner_authorized"]},
"authorizedOperations":{"type":"array","minItems":1,"uniqueItems":true,"items":{"enum":["read","inspect","draft","submit","create","save","share","download","external_handoff","confirm","destructive"]}},
"authorizedSideEffectClasses":{"type":"array","minItems":1,"uniqueItems":true,"items":{"enum":["none","reversible","external","costly","irreversible","destructive"]}},
"validity":{"type":"object","additionalProperties":false,"required":["notBefore","expiresAt","revocationRef","revocationSha256","revocationSchemaRef","revocationAttestationRef","revocationAttestationSha256"],"properties":{"notBefore":{"type":"string","format":"date-time"},"expiresAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}]},"revocationRef":{"$ref":"#/$defs/safeRef"},"revocationSha256":{"$ref":"#/$defs/sha256"},"revocationSchemaRef":{"const":"https://montri-th.github.io/Landometer/v0.9.7/standalone-0.9.7-r1/schemas/agent-action-revocation.schema.json"},"revocationAttestationRef":{"$ref":"#/$defs/safeRef"},"revocationAttestationSha256":{"$ref":"#/$defs/sha256"}}},
"authorizedBy":{"$ref":"#/$defs/nonEmpty"},
"authorizedAt":{"type":"string","format":"date-time"},
"authorityEvidenceRef":{"$ref":"#/$defs/nonEmpty"}
},
"allOf":[{"if":{"properties":{"policy":{"const":"read_only"}},"required":["policy"]},"then":{"properties":{"authorizedOperations":{"items":{"enum":["read","inspect"]}},"authorizedSideEffectClasses":{"items":{"const":"none"}}}}}],
"$defs":{"nonEmpty":{"type":"string","minLength":1,"pattern":"\\S"},"safeRef":{"type":"string","minLength":1,"pattern":"^(?!/)(?!.*(?:^|/)\\.\\.(?:/|$))[^\\u0000]+$"},"sha256":{"type":"string","pattern":"^[a-f0-9]{64}$"}},
"$comment":"Resolved standalone LDS 0.9.7 contract, revision standalone-0.9.7-r1. The distribution is owner-approved and unsigned; this schema is not a release attestation. Historical source identities and hashes are recorded separately."
},
"agent-action-definition.schema.json":{
"$schema":"https://json-schema.org/draft/2020-12/schema",
"$id":"https://montri-th.github.io/Landometer/v0.9.7/standalone-0.9.7-r1/schemas/agent-action-definition.schema.json",
"title":"Landometer immutable agent action definition v1.3",
"type":"object",
"additionalProperties":false,
"required":["schemaVersion","releaseRef","definitionId","artifactId","actionId","allowedActorClasses","productScope","operation","input","permissionPolicy","sideEffect","confirmationPolicy","resultSchemaRef","resultSchemaSha256","receiptSchemaRef","receiptSchemaSha256","errorBehavior","recoveryPolicy"],
"properties":{
"schemaVersion":{"const":"1.3"},
"releaseRef":{"const":"v0.9.7-owner.1"},
"definitionId":{"$ref":"#/$defs/nonEmpty"},
"artifactId":{"$ref":"#/$defs/nonEmpty"},
"actionId":{"type":"string","pattern":"^[a-z][a-z0-9-]*$"},
"allowedActorClasses":{"type":"array","minItems":1,"uniqueItems":true,"items":{"enum":["human_user","authorized_agent"]}},
"productScope":{"enum":["shared_landometer","named_product"]},
"namedProduct":{"$ref":"#/$defs/nonEmpty"},
"operation":{"enum":["read","inspect","draft","submit","create","save","share","download","external_handoff","confirm","destructive"]},
"input":{"type":"object","additionalProperties":false,"required":["schemaRef","schemaSha256","schemaId","allowedClassifications"],"properties":{"schemaRef":{"$ref":"#/$defs/safeRef"},"schemaSha256":{"$ref":"#/$defs/sha256"},"schemaId":{"$ref":"#/$defs/nonEmpty"},"allowedClassifications":{"type":"array","minItems":1,"uniqueItems":true,"items":{"enum":["public","internal","confidential","restricted"]}}}},
"permissionPolicy":{"enum":["read_only","confirm_before_commit","owner_authorized"]},
"sideEffect":{"$ref":"#/$defs/sideEffect"},
"confirmationPolicy":{"type":"object","additionalProperties":false,"required":["required","mode"],"properties":{"required":{"type":"boolean"},"mode":{"enum":["none","explicit","step_up"]}}},
"resultSchemaRef":{"$ref":"#/$defs/nonEmpty"},
"resultSchemaSha256":{"$ref":"#/$defs/sha256"},
"receiptSchemaRef":{"const":"https://montri-th.github.io/Landometer/v0.9.7/standalone-0.9.7-r1/schemas/agent-action-receipt.schema.json"},
"receiptSchemaSha256":{"$ref":"#/$defs/sha256"},
"errorBehavior":{"$ref":"#/$defs/nonEmpty"},
"recoveryPolicy":{"$ref":"#/$defs/nonEmpty"}
},
"allOf":[
{"if":{"properties":{"productScope":{"const":"shared_landometer"}},"required":["productScope"]},"then":{"not":{"required":["namedProduct"]}}},
{"if":{"properties":{"productScope":{"const":"named_product"}},"required":["productScope"]},"then":{"required":["namedProduct"]}},
{"if":{"properties":{"permissionPolicy":{"const":"read_only"}},"required":["permissionPolicy"]},"then":{"properties":{"sideEffect":{"properties":{"class":{"const":"none"},"external":{"const":false},"cost":{"const":"none"},"reversible":{"const":true}}},"confirmationPolicy":{"properties":{"required":{"const":false},"mode":{"const":"none"}}}}}},
{"if":{"properties":{"sideEffect":{"properties":{"class":{"const":"none"}},"required":["class"]}},"required":["sideEffect"]},"then":{"properties":{"sideEffect":{"properties":{"reversible":{"const":true}}}}}},
{"if":{"properties":{"sideEffect":{"properties":{"class":{"const":"reversible"}},"required":["class"]}},"required":["sideEffect"]},"then":{"properties":{"sideEffect":{"properties":{"reversible":{"const":true}}}}}},
{"if":{"properties":{"sideEffect":{"properties":{"class":{"enum":["irreversible","destructive"]}},"required":["class"]}},"required":["sideEffect"]},"then":{"properties":{"sideEffect":{"properties":{"reversible":{"const":false}}}}}},
{"if":{"properties":{"sideEffect":{"anyOf":[{"properties":{"class":{"not":{"const":"none"}}},"required":["class"]},{"properties":{"external":{"const":true}},"required":["external"]},{"properties":{"cost":{"enum":["possible","known"]}},"required":["cost"]}]}},"required":["sideEffect"]},"then":{"properties":{"permissionPolicy":{"enum":["confirm_before_commit","owner_authorized"]},"confirmationPolicy":{"properties":{"required":{"const":true},"mode":{"enum":["explicit","step_up"]}}}}}},
{"if":{"properties":{"sideEffect":{"properties":{"class":{"const":"destructive"}},"required":["class"]}},"required":["sideEffect"]},"then":{"properties":{"permissionPolicy":{"const":"owner_authorized"},"confirmationPolicy":{"properties":{"mode":{"const":"step_up"}}}}}}
],
"$defs":{"nonEmpty":{"type":"string","minLength":1,"pattern":"\\S"},"safeRef":{"type":"string","minLength":1,"pattern":"^(?!/)(?!.*(?:^|/)\\.\\.(?:/|$))[^\\u0000]+$"},"sha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"sideEffect":{"type":"object","additionalProperties":false,"required":["class","external","cost","summary","reversible"],"properties":{"class":{"enum":["none","reversible","irreversible","destructive"]},"external":{"type":"boolean"},"cost":{"enum":["none","possible","known"]},"summary":{"$ref":"#/$defs/nonEmpty"},"reversible":{"type":"boolean"}}}},
"$comment":"Resolved standalone LDS 0.9.7 contract, revision standalone-0.9.7-r1. The distribution is owner-approved and unsigned; this schema is not a release attestation. Historical source identities and hashes are recorded separately."
},
"agent-action-receipt.schema.json":{
"$schema":"https://json-schema.org/draft/2020-12/schema",
"$id":"https://montri-th.github.io/Landometer/v0.9.7/standalone-0.9.7-r1/schemas/agent-action-receipt.schema.json",
"title":"Landometer signed internal agent action execution receipt v1.3",
"type":"object",
"additionalProperties":false,
"required":["schemaVersion","releaseRef","executionId","executionNonce","buildCardRef","buildCardSha256","terminalRevocationRef","terminalRevocationSha256","terminalRevocationSchemaRef","terminalRevocationAttestationRef","terminalRevocationAttestationSha256","artifactId","actionId","actor","operation","status","startedAt","effectAt","completedAt","classification","allowedAudience","redactionState","authorityRef","authoritySha256","inputRef","inputSha256","resultRef","resultSha256","sideEffect","recoveryRef","recoverySha256","errorCode","audienceMessage","diagnosticsRef","diagnosticsSha256"],
"properties":{
"schemaVersion":{"const":"1.3"},
"releaseRef":{"const":"v0.9.7-owner.1"},
"executionId":{"$ref":"#/$defs/nonEmpty"},
"executionNonce":{"$ref":"#/$defs/nonce"},
"buildCardRef":{"$ref":"#/$defs/safeRef"},
"buildCardSha256":{"$ref":"#/$defs/sha256"},
"terminalRevocationRef":{"$ref":"#/$defs/safeRef"},
"terminalRevocationSha256":{"$ref":"#/$defs/sha256"},
"terminalRevocationSchemaRef":{"const":"https://montri-th.github.io/Landometer/v0.9.7/standalone-0.9.7-r1/schemas/agent-action-revocation.schema.json"},
"terminalRevocationAttestationRef":{"$ref":"#/$defs/safeRef"},
"terminalRevocationAttestationSha256":{"$ref":"#/$defs/sha256"},
"artifactId":{"$ref":"#/$defs/nonEmpty"},
"actionId":{"type":"string","pattern":"^[a-z][a-z0-9-]*$"},
"actor":{"$ref":"#/$defs/nonEmpty"},
"operation":{"enum":["read","inspect","draft","submit","create","save","share","download","external_handoff","confirm","destructive"]},
"status":{"enum":["succeeded","failed","cancelled"]},
"startedAt":{"type":"string","format":"date-time"},
"effectAt":{"$ref":"#/$defs/dateTimeOrNull"},
"completedAt":{"type":"string","format":"date-time"},
"classification":{"enum":["public","internal","confidential","restricted"]},
"allowedAudience":{"enum":["internal_preview","internal_operational"]},
"redactionState":{"enum":["not_required","redacted"]},
"authorityRef":{"$ref":"#/$defs/safeRef"},
"authoritySha256":{"$ref":"#/$defs/sha256"},
"inputRef":{"$ref":"#/$defs/safeRef"},
"inputSha256":{"$ref":"#/$defs/sha256"},
"resultRef":{"$ref":"#/$defs/nullableString"},
"resultSha256":{"$ref":"#/$defs/nullableSha256"},
"sideEffect":{"type":"object","additionalProperties":false,"required":["class","external","cost","summary","reversible"],"properties":{"class":{"enum":["none","reversible","irreversible","destructive"]},"external":{"type":"boolean"},"cost":{"enum":["none","possible","known"]},"summary":{"$ref":"#/$defs/nonEmpty"},"reversible":{"type":"boolean"}}},
"recoveryRef":{"$ref":"#/$defs/nullableString"},
"recoverySha256":{"$ref":"#/$defs/nullableSha256"},
"errorCode":{"$ref":"#/$defs/nullableString"},
"audienceMessage":{"$ref":"#/$defs/nullableString"},
"diagnosticsRef":{"$ref":"#/$defs/nullableString"},
"diagnosticsSha256":{"$ref":"#/$defs/nullableSha256"}
},
"allOf":[
{"if":{"properties":{"status":{"const":"succeeded"}},"required":["status"]},"then":{"properties":{"resultRef":{"$ref":"#/$defs/nonEmpty"},"resultSha256":{"$ref":"#/$defs/sha256"},"errorCode":{"type":"null"}}}},
{"if":{"properties":{"status":{"enum":["failed","cancelled"]}},"required":["status"]},"then":{"properties":{"audienceMessage":{"$ref":"#/$defs/nonEmpty"}}}},
{"if":{"properties":{"status":{"const":"failed"}},"required":["status"]},"then":{"properties":{"errorCode":{"$ref":"#/$defs/nonEmpty"}}}},
{"if":{"properties":{"sideEffect":{"properties":{"class":{"const":"none"},"external":{"const":false},"cost":{"const":"none"}},"required":["class","external","cost"]}},"required":["sideEffect"]},"then":{"properties":{"effectAt":{"type":"null"}}}},
{"if":{"properties":{"sideEffect":{"anyOf":[{"properties":{"class":{"not":{"const":"none"}}},"required":["class"]},{"properties":{"external":{"const":true}},"required":["external"]},{"properties":{"cost":{"enum":["possible","known"]}},"required":["cost"]}]},"status":{"const":"succeeded"}},"required":["sideEffect","status"]},"then":{"properties":{"effectAt":{"type":"string","format":"date-time"}}}},
{"if":{"properties":{"status":{"enum":["failed","cancelled"]},"effectAt":{"type":"string","format":"date-time"}},"required":["status","effectAt"]},"then":{"properties":{"recoveryRef":{"$ref":"#/$defs/nonEmpty"},"recoverySha256":{"$ref":"#/$defs/sha256"}}}},
{"if":{"properties":{"diagnosticsRef":{"$ref":"#/$defs/nonEmpty"}},"required":["diagnosticsRef"]},"then":{"properties":{"allowedAudience":{"enum":["internal_preview","internal_operational"]},"diagnosticsSha256":{"$ref":"#/$defs/sha256"}}}}
],
"$defs":{"nonEmpty":{"type":"string","minLength":1,"pattern":"\\S"},"nonce":{"type":"string","minLength":16,"maxLength":160,"pattern":"^[A-Za-z0-9._:-]+$"},"safeRef":{"type":"string","minLength":1,"pattern":"^(?!/)(?!.*(?:^|/)\\.\\.(?:/|$))[^\\u0000]+$"},"sha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"nullableString":{"anyOf":[{"$ref":"#/$defs/nonEmpty"},{"type":"null"}]},"nullableSha256":{"anyOf":[{"$ref":"#/$defs/sha256"},{"type":"null"}]},"dateTimeOrNull":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}]}},
"$comment":"Resolved standalone LDS 0.9.7 contract, revision standalone-0.9.7-r1. The distribution is owner-approved and unsigned; this schema is not a release attestation. Historical source identities and hashes are recorded separately."
},
"agent-action-revocation.schema.json":{
"$schema":"https://json-schema.org/draft/2020-12/schema",
"$id":"https://montri-th.github.io/Landometer/v0.9.7/standalone-0.9.7-r1/schemas/agent-action-revocation.schema.json",
"title":"Landometer phase-bound agent action revocation decision v1.2",
"type":"object",
"additionalProperties":false,
"required":["schemaVersion","releaseRef","revocationId","authorityId","decisionPhase","executionNonce","buildCardRef","buildCardSha256","artifactId","actionId","actorId","status","checkedAt","revokedAt","reason","decisionBy","evidenceRef"],
"properties":{"schemaVersion":{"const":"1.2"},"releaseRef":{"const":"v0.9.7-owner.1"},"revocationId":{"$ref":"#/$defs/nonEmpty"},"authorityId":{"$ref":"#/$defs/nonEmpty"},"decisionPhase":{"enum":["pre_start","terminal_boundary"]},"executionNonce":{"$ref":"#/$defs/nonce"},"buildCardRef":{"$ref":"#/$defs/safeRef"},"buildCardSha256":{"$ref":"#/$defs/sha256"},"artifactId":{"$ref":"#/$defs/nonEmpty"},"actionId":{"type":"string","pattern":"^[a-z][a-z0-9-]*$"},"actorId":{"$ref":"#/$defs/nonEmpty"},"status":{"enum":["not_revoked","revoked"]},"checkedAt":{"type":"string","format":"date-time"},"revokedAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}]},"reason":{"anyOf":[{"$ref":"#/$defs/nonEmpty"},{"type":"null"}]},"decisionBy":{"$ref":"#/$defs/nonEmpty"},"evidenceRef":{"$ref":"#/$defs/nonEmpty"}},
"allOf":[{"if":{"properties":{"status":{"const":"not_revoked"}},"required":["status"]},"then":{"properties":{"revokedAt":{"type":"null"},"reason":{"type":"null"}}}},{"if":{"properties":{"status":{"const":"revoked"}},"required":["status"]},"then":{"properties":{"revokedAt":{"type":"string","format":"date-time"},"reason":{"$ref":"#/$defs/nonEmpty"}}}}],
"$defs":{"nonEmpty":{"type":"string","minLength":1,"pattern":"\\S"},"safeRef":{"type":"string","minLength":1,"pattern":"^(?!/)(?!.*(?:^|/)\\.\\.(?:/|$))[^\\u0000]+$"},"sha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"nonce":{"type":"string","minLength":16,"maxLength":160,"pattern":"^[A-Za-z0-9._:-]+$"}},
"$comment":"Resolved standalone LDS 0.9.7 contract, revision standalone-0.9.7-r1. The distribution is owner-approved and unsigned; this schema is not a release attestation. Historical source identities and hashes are recorded separately."
},
"agent-action.schema.json":{
"$schema":"https://json-schema.org/draft/2020-12/schema",
"$id":"https://montri-th.github.io/Landometer/v0.9.7/standalone-0.9.7-r1/schemas/agent-action.schema.json",
"title":"Landometer agent action contract v1.5",
"type":"object",
"additionalProperties":false,
"required":["schemaVersion","releaseRef","definitionRef","definitionSha256","definitionSchemaRef","actionId","scope","inputs","permission","sideEffect","confirmation","execution"],
"properties":{
"schemaVersion":{"const":"1.5"},
"releaseRef":{"const":"v0.9.7-owner.1"},
"definitionRef":{"$ref":"#/$defs/safeRef"},
"definitionSha256":{"$ref":"#/$defs/sha256"},
"definitionSchemaRef":{"const":"https://montri-th.github.io/Landometer/v0.9.7/standalone-0.9.7-r1/schemas/agent-action-definition.schema.json"},
"actionId":{"type":"string","pattern":"^[a-z][a-z0-9-]*$"},
"scope":{"type":"object","additionalProperties":false,"required":["artifactId","actor","actorClass","productScope","allowedOperation"],"properties":{"artifactId":{"$ref":"#/$defs/nonEmpty"},"actor":{"$ref":"#/$defs/nonEmpty"},"actorClass":{"enum":["human_user","authorized_agent"]},"productScope":{"enum":["shared_landometer","named_product"]},"namedProduct":{"$ref":"#/$defs/nonEmpty"},"allowedOperation":{"enum":["read","inspect","draft","submit","create","save","share","download","external_handoff","confirm","destructive"]}},"allOf":[{"if":{"type":"object","properties":{"productScope":{"const":"named_product"}},"required":["productScope"]},"then":{"required":["namedProduct"]}}]},
"inputs":{"type":"object","additionalProperties":false,"required":["schemaRef","schemaSha256","schemaId","valueRef","valueSha256","classification"],"properties":{"schemaRef":{"$ref":"#/$defs/safeRef"},"schemaSha256":{"$ref":"#/$defs/sha256"},"schemaId":{"$ref":"#/$defs/nonEmpty"},"valueRef":{"$ref":"#/$defs/safeRef"},"valueSha256":{"$ref":"#/$defs/sha256"},"classification":{"enum":["public","internal","confidential","restricted"]}}},
"permission":{"type":"object","additionalProperties":false,"required":["policy","status","authorityRef","authoritySha256","authoritySchemaRef","authorityAttestationRef","authorityAttestationSha256"],"properties":{"policy":{"enum":["read_only","confirm_before_commit","owner_authorized"]},"status":{"enum":["not_required","pending","granted","denied","expired"]},"authorityRef":{"$ref":"#/$defs/safeRef"},"authoritySha256":{"$ref":"#/$defs/sha256"},"authoritySchemaRef":{"const":"https://montri-th.github.io/Landometer/v0.9.7/standalone-0.9.7-r1/schemas/agent-action-authority.schema.json"},"authorityAttestationRef":{"$ref":"#/$defs/safeRef"},"authorityAttestationSha256":{"$ref":"#/$defs/sha256"}}},
"sideEffect":{"type":"object","additionalProperties":false,"required":["class","external","cost","summary","reversible"],"properties":{"class":{"enum":["none","reversible","irreversible","destructive"]},"external":{"type":"boolean"},"cost":{"enum":["none","possible","known"]},"summary":{"$ref":"#/$defs/nonEmpty"},"reversible":{"type":"boolean"}}},
"confirmation":{"type":"object","additionalProperties":false,"required":["required","state","confirmedBy","confirmedAt","receiptRef","receiptSha256","attestationRef","attestationSha256"],"properties":{"required":{"type":"boolean"},"state":{"enum":["not_required","pending","confirmed","declined","expired"]},"confirmedBy":{"$ref":"#/$defs/nullableString"},"confirmedAt":{"$ref":"#/$defs/dateTimeOrNull"},"receiptRef":{"$ref":"#/$defs/nullableString"},"receiptSha256":{"$ref":"#/$defs/nullableSha256"},"attestationRef":{"$ref":"#/$defs/nullableString"},"attestationSha256":{"$ref":"#/$defs/nullableSha256"}}},
"execution":{
"type":"object",
"additionalProperties":false,
"required":["executionId","executionNonce","buildCardRef","buildCardSha256","terminalRevocationRef","terminalRevocationSha256","terminalRevocationSchemaRef","terminalRevocationAttestationRef","terminalRevocationAttestationSha256","status","startedAt","effectAt","completedAt","resultSchemaRef","resultSchemaSha256","receiptSchemaRef","receiptSchemaSha256","resultRef","errorBehavior","recoveryRef","receiptRef","receiptAttestationRef","receiptAttestationSha256"],
"properties":{
"executionId":{"$ref":"#/$defs/nullableString"},
"executionNonce":{"$ref":"#/$defs/nullableNonce"},
"buildCardRef":{"$ref":"#/$defs/safeRef"},
"buildCardSha256":{"$ref":"#/$defs/sha256"},
"terminalRevocationRef":{"$ref":"#/$defs/nullableSafeRef"},
"terminalRevocationSha256":{"$ref":"#/$defs/nullableSha256"},
"terminalRevocationSchemaRef":{"anyOf":[{"const":"https://montri-th.github.io/Landometer/v0.9.7/standalone-0.9.7-r1/schemas/agent-action-revocation.schema.json"},{"type":"null"}]},
"terminalRevocationAttestationRef":{"$ref":"#/$defs/nullableSafeRef"},
"terminalRevocationAttestationSha256":{"$ref":"#/$defs/nullableSha256"},
"status":{"enum":["not_started","blocked","running","succeeded","failed","cancelled"]},
"startedAt":{"$ref":"#/$defs/dateTimeOrNull"},
"effectAt":{"$ref":"#/$defs/dateTimeOrNull"},
"completedAt":{"$ref":"#/$defs/dateTimeOrNull"},
"resultSchemaRef":{"$ref":"#/$defs/nonEmpty"},
"resultSchemaSha256":{"$ref":"#/$defs/sha256"},
"receiptSchemaRef":{"const":"https://montri-th.github.io/Landometer/v0.9.7/standalone-0.9.7-r1/schemas/agent-action-receipt.schema.json"},
"receiptSchemaSha256":{"$ref":"#/$defs/sha256"},
"resultRef":{"$ref":"#/$defs/nullableString"},
"errorBehavior":{"$ref":"#/$defs/nonEmpty"},
"recoveryRef":{"$ref":"#/$defs/nullableString"},
"receiptRef":{"$ref":"#/$defs/nullableString"},
"receiptAttestationRef":{"$ref":"#/$defs/nullableString"},
"receiptAttestationSha256":{"$ref":"#/$defs/nullableSha256"},
"resultSha256":{"$ref":"#/$defs/sha256"},
"recoverySha256":{"$ref":"#/$defs/sha256"},
"receiptSha256":{"$ref":"#/$defs/sha256"}
}
}
},
"allOf":[
{"if":{"properties":{"scope":{"properties":{"productScope":{"const":"shared_landometer"}},"required":["productScope"]}},"required":["scope"]},"then":{"properties":{"scope":{"not":{"required":["namedProduct"]}}}}},
{"if":{"properties":{"permission":{"properties":{"policy":{"const":"read_only"}},"required":["policy"]}},"required":["permission"]},"then":{"properties":{"sideEffect":{"properties":{"class":{"const":"none"},"external":{"const":false},"cost":{"const":"none"},"reversible":{"const":true}},"required":["class","external","cost","reversible"]}}}},
{"if":{"properties":{"sideEffect":{"properties":{"class":{"enum":["none","reversible"]}},"required":["class"]}},"required":["sideEffect"]},"then":{"properties":{"sideEffect":{"properties":{"reversible":{"const":true}}}}}},
{"if":{"properties":{"sideEffect":{"properties":{"class":{"enum":["irreversible","destructive"]}},"required":["class"]}},"required":["sideEffect"]},"then":{"properties":{"sideEffect":{"properties":{"reversible":{"const":false}}}}}},
{"if":{"properties":{"sideEffect":{"anyOf":[{"properties":{"class":{"not":{"const":"none"}}},"required":["class"]},{"properties":{"external":{"const":true}},"required":["external"]},{"properties":{"cost":{"enum":["possible","known"]}},"required":["cost"]}]},"execution":{"properties":{"status":{"enum":["running","succeeded","failed"]}},"required":["status"]}},"required":["sideEffect","execution"]},"then":{"properties":{"confirmation":{"properties":{"required":{"const":true},"state":{"const":"confirmed"},"confirmedBy":{"$ref":"#/$defs/nonEmpty"},"confirmedAt":{"type":"string","format":"date-time"}}},"permission":{"properties":{"status":{"const":"granted"}}}}}},
{"if":{"properties":{"execution":{"properties":{"status":{"enum":["running","succeeded","failed","cancelled"]}},"required":["status"]}},"required":["execution"]},"then":{"properties":{"permission":{"properties":{"status":{"enum":["not_required","granted"]}}},"execution":{"properties":{"executionId":{"$ref":"#/$defs/nonEmpty"},"executionNonce":{"$ref":"#/$defs/nonce"}}}}}},
{"if":{"properties":{"permission":{"properties":{"status":{"const":"not_required"}},"required":["status"]}},"required":["permission"]},"then":{"properties":{"permission":{"properties":{"policy":{"const":"read_only"}}}}}},
{"if":{"properties":{"confirmation":{"properties":{"required":{"const":false}},"required":["required"]}},"required":["confirmation"]},"then":{"properties":{"confirmation":{"properties":{"state":{"const":"not_required"},"confirmedBy":{"type":"null"},"confirmedAt":{"type":"null"},"receiptRef":{"type":"null"},"receiptSha256":{"type":"null"},"attestationRef":{"type":"null"},"attestationSha256":{"type":"null"}}}}}},
{"if":{"properties":{"confirmation":{"properties":{"required":{"const":true}},"required":["required"]}},"required":["confirmation"]},"then":{"properties":{"confirmation":{"properties":{"state":{"enum":["pending","confirmed","declined","expired"]}}}}}},
{"if":{"properties":{"confirmation":{"properties":{"state":{"const":"confirmed"}},"required":["state"]}},"required":["confirmation"]},"then":{"properties":{"confirmation":{"properties":{"required":{"const":true},"confirmedBy":{"$ref":"#/$defs/nonEmpty"},"confirmedAt":{"type":"string","format":"date-time"},"receiptRef":{"$ref":"#/$defs/safeRef"},"receiptSha256":{"$ref":"#/$defs/sha256"},"attestationRef":{"$ref":"#/$defs/safeRef"},"attestationSha256":{"$ref":"#/$defs/sha256"}}}}}},
{"if":{"properties":{"confirmation":{"properties":{"state":{"enum":["not_required","pending","declined","expired"]}},"required":["state"]}},"required":["confirmation"]},"then":{"properties":{"confirmation":{"properties":{"confirmedBy":{"type":"null"},"confirmedAt":{"type":"null"},"receiptRef":{"type":"null"},"receiptSha256":{"type":"null"},"attestationRef":{"type":"null"},"attestationSha256":{"type":"null"}}}}}},
{"if":{"properties":{"execution":{"properties":{"status":{"const":"running"}},"required":["status"]}},"required":["execution"]},"then":{"properties":{"execution":{"properties":{"startedAt":{"type":"string","format":"date-time"},"completedAt":{"type":"null"}}}}}},
{"if":{"properties":{"execution":{"properties":{"status":{"enum":["not_started","blocked"]}},"required":["status"]}},"required":["execution"]},"then":{"properties":{"execution":{"properties":{"effectAt":{"type":"null"}}}}}},
{"if":{"properties":{"execution":{"properties":{"status":{"enum":["not_started","blocked","running"]}},"required":["status"]}},"required":["execution"]},"then":{"properties":{"execution":{"properties":{"terminalRevocationRef":{"type":"null"},"terminalRevocationSha256":{"type":"null"},"terminalRevocationSchemaRef":{"type":"null"},"terminalRevocationAttestationRef":{"type":"null"},"terminalRevocationAttestationSha256":{"type":"null"}}}}}},
{"if":{"properties":{"execution":{"properties":{"status":{"enum":["succeeded","failed","cancelled"]}},"required":["status"]}},"required":["execution"]},"then":{"properties":{"execution":{"properties":{"startedAt":{"type":"string","format":"date-time"},"completedAt":{"type":"string","format":"date-time"},"terminalRevocationRef":{"$ref":"#/$defs/safeRef"},"terminalRevocationSha256":{"$ref":"#/$defs/sha256"},"terminalRevocationSchemaRef":{"const":"https://montri-th.github.io/Landometer/v0.9.7/standalone-0.9.7-r1/schemas/agent-action-revocation.schema.json"},"terminalRevocationAttestationRef":{"$ref":"#/$defs/safeRef"},"terminalRevocationAttestationSha256":{"$ref":"#/$defs/sha256"},"receiptRef":{"$ref":"#/$defs/safeRef"},"receiptAttestationRef":{"$ref":"#/$defs/safeRef"},"receiptAttestationSha256":{"$ref":"#/$defs/sha256"}},"required":["receiptSha256"]}}}},
{"if":{"properties":{"execution":{"properties":{"status":{"const":"succeeded"}},"required":["status"]}},"required":["execution"]},"then":{"properties":{"execution":{"properties":{"resultRef":{"$ref":"#/$defs/nonEmpty"},"receiptRef":{"$ref":"#/$defs/nonEmpty"}},"required":["resultSha256","receiptSha256"]}}}},
{"if":{"properties":{"sideEffect":{"anyOf":[{"properties":{"class":{"not":{"const":"none"}}},"required":["class"]},{"properties":{"external":{"const":true}},"required":["external"]},{"properties":{"cost":{"enum":["possible","known"]}},"required":["cost"]}]},"execution":{"properties":{"status":{"const":"succeeded"}},"required":["status"]}},"required":["sideEffect","execution"]},"then":{"properties":{"execution":{"properties":{"effectAt":{"type":"string","format":"date-time"},"recoveryRef":{"$ref":"#/$defs/nonEmpty"}},"required":["recoverySha256"]}}}},
{"if":{"properties":{"sideEffect":{"properties":{"class":{"const":"none"},"external":{"const":false},"cost":{"const":"none"}},"required":["class","external","cost"]}},"required":["sideEffect"]},"then":{"properties":{"execution":{"properties":{"effectAt":{"type":"null"}}}}}}
],
"$defs":{"nonEmpty":{"type":"string","minLength":1,"pattern":"\\S"},"safeRef":{"type":"string","minLength":1,"pattern":"^(?!/)(?!.*(?:^|/)\\.\\.(?:/|$))[^\\u0000]+$"},"sha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"nonce":{"type":"string","minLength":16,"maxLength":160,"pattern":"^[A-Za-z0-9._:-]+$"},"nullableNonce":{"anyOf":[{"$ref":"#/$defs/nonce"},{"type":"null"}]},"nullableSafeRef":{"anyOf":[{"$ref":"#/$defs/safeRef"},{"type":"null"}]},"nullableString":{"anyOf":[{"$ref":"#/$defs/nonEmpty"},{"type":"null"}]},"nullableSha256":{"anyOf":[{"$ref":"#/$defs/sha256"},{"type":"null"}]},"dateTimeOrNull":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}]}},
"$comment":"Resolved standalone LDS 0.9.7 contract, revision standalone-0.9.7-r1. The distribution is owner-approved and unsigned; this schema is not a release attestation. Historical source identities and hashes are recorded separately."
},
"agent-confirmation-receipt.schema.json":{
"$schema":"https://json-schema.org/draft/2020-12/schema",
"$id":"https://montri-th.github.io/Landometer/v0.9.7/standalone-0.9.7-r1/schemas/agent-confirmation-receipt.schema.json",
"title":"Landometer agent action confirmation receipt v1.0",
"type":"object",
"additionalProperties":false,
"required":["schemaVersion","releaseRef","confirmationId","artifactId","actionId","actorId","confirmedBy","inputRef","inputSha256","consequence","confirmedAt"],
"properties":{"schemaVersion":{"const":"1.0"},"releaseRef":{"const":"v0.9.7-owner.1"},"confirmationId":{"type":"string","pattern":"^[a-z0-9][a-z0-9._-]{2,159}$"},"artifactId":{"$ref":"#/$defs/nonEmpty"},"actionId":{"type":"string","pattern":"^[a-z][a-z0-9-]*$"},"actorId":{"$ref":"#/$defs/nonEmpty"},"confirmedBy":{"$ref":"#/$defs/nonEmpty"},"inputRef":{"$ref":"#/$defs/safeRef"},"inputSha256":{"$ref":"#/$defs/sha256"},"consequence":{"type":"object","additionalProperties":false,"required":["class","external","cost","reversible","summary"],"properties":{"class":{"enum":["none","reversible","irreversible","destructive"]},"external":{"type":"boolean"},"cost":{"enum":["none","possible","known"]},"reversible":{"type":"boolean"},"summary":{"$ref":"#/$defs/nonEmpty"}}},"confirmedAt":{"type":"string","format":"date-time"}},
"$defs":{"nonEmpty":{"type":"string","minLength":1,"pattern":"\\S"},"sha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"safeRef":{"type":"string","minLength":1,"pattern":"^(?!/)(?!.*(?:^|/)\\.\\.(?:/|$))(?!.*[\\u0000-\\u001F]).+$"}},
"$comment":"Resolved standalone LDS 0.9.7 contract, revision standalone-0.9.7-r1. The distribution is owner-approved and unsigned; this schema is not a release attestation. Historical source identities and hashes are recorded separately."
},
"artifact-manifest.schema.json":{
"$schema":"https://json-schema.org/draft/2020-12/schema",
"$id":"https://montri-th.github.io/Landometer/v0.9.7/standalone-0.9.7-r1/schemas/artifact-manifest.schema.json",
"title":"Landometer artifact manifest v3.2",
"type":"object",
"additionalProperties":false,
"required":["schemaVersion","release","artifact","resolution","representation","delivery","validation"],
"properties":{
"schemaVersion":{"const":"3.2"},
"release":{"type":"object","additionalProperties":false,"required":["releaseRef","releaseTupleSha256"],"properties":{"releaseRef":{"const":"v0.9.7-owner.1"},"releaseTupleSha256":{"$ref":"#/$defs/sha256"}}},
"artifact":{"type":"object","additionalProperties":false,"required":["id","buildCardRef","buildCardSha256","artifactBuildId","builtAt"],"properties":{"id":{"$ref":"#/$defs/nonEmpty"},"buildCardRef":{"$ref":"#/$defs/safeRef"},"buildCardSha256":{"$ref":"#/$defs/sha256"},"artifactBuildId":{"$ref":"#/$defs/nonEmpty"},"builtAt":{"type":"string","format":"date-time"}}},
"resolution":{"type":"object","additionalProperties":false,"required":["experienceProfile","secondaryExperienceProfiles","formatPack","targetProfileRef","capabilityPacks","resolvedRuleIds","resolvedTestIds","nonApplicableRuleIds","exceptionRefs"],"properties":{"experienceProfile":{"$ref":"#/$defs/nonEmpty"},"secondaryExperienceProfiles":{"type":"array","maxItems":2,"uniqueItems":true,"items":{"$ref":"#/$defs/nonEmpty"}},"formatPack":{"$ref":"#/$defs/nonEmpty"},"targetProfileRef":{"$ref":"#/$defs/nonEmpty"},"capabilityPacks":{"$ref":"#/$defs/uniqueStrings"},"resolvedRuleIds":{"$ref":"#/$defs/uniqueStrings"},"resolvedTestIds":{"$ref":"#/$defs/uniqueStrings"},"nonApplicableRuleIds":{"$ref":"#/$defs/uniqueStrings"},"exceptionRefs":{"type":"array","maxItems":0,"items":false}}},
"representation":{
"type":"object",
"additionalProperties":false,
"required":["navigation","actionIds","claimIds","materialLimitations","localeStates","outputClarity"],
"properties":{
"navigation":{
"type":"object",
"additionalProperties":false,
"required":["mode","brandDestinationRef","sideBookmark","sideBookmarkUserBenefit","destinations"],
"properties":{
"mode":{"enum":["none","site","product","document","deck"]},
"brandDestinationRef":{"anyOf":[{"$ref":"#/$defs/nonEmpty"},{"type":"null"}]},
"sideBookmark":{"enum":["selected","omitted"]},
"sideBookmarkUserBenefit":{"anyOf":[{"$ref":"#/$defs/nonEmpty"},{"type":"null"}]},
"destinations":{
"type":"array",
"items":{
"type":"object",
"additionalProperties":false,
"required":["id","role","target","label","labelByLocale","level","kind","group","current"],
"properties":{
"id":{"type":"string","pattern":"^destination\\.[a-z0-9.-]+$"},
"role":{"enum":["brand","primary","page_local","utility"]},
"target":{"$ref":"#/$defs/nonEmpty"},
"label":{"$ref":"#/$defs/nonEmpty"},
"labelByLocale":{"type":"object","additionalProperties":{"$ref":"#/$defs/nonEmpty"},"minProperties":1},
"compactLabel":{"$ref":"#/$defs/nonEmpty"},
"compactLabelByLocale":{"type":"object","additionalProperties":{"$ref":"#/$defs/nonEmpty"},"minProperties":1},
"level":{"enum":["ecosystem","property","page"]},
"kind":{"enum":["route","anchor","external"]},
"group":{"enum":["primary","ecosystem","page_local","utility"]},
"current":{"enum":["none","page","location"]},
"breakpointExposure":{"type":"object","additionalProperties":false,"required":["desktop","mobile"],"properties":{"desktop":{"enum":["header","disclosure","side_bookmark","not_exposed","not_applicable"]},"mobile":{"enum":["header","disclosure","not_exposed","not_applicable"]}}},
"staticExposure":{"enum":["toc","pdf_bookmark","deck_section_marker","destination_cue","not_exposed"]}
},
"allOf":[{"if":{"properties":{"kind":{"const":"anchor"}},"required":["kind"]},"then":{"properties":{"target":{"type":"string","pattern":"^#[a-z][a-z0-9-]*$"},"level":{"const":"page"},"group":{"const":"page_local"},"current":{"enum":["none","location"]}}}},{"if":{"properties":{"kind":{"const":"route"}},"required":["kind"]},"then":{"properties":{"current":{"enum":["none","page"]}}}},{"if":{"properties":{"kind":{"const":"external"}},"required":["kind"]},"then":{"properties":{"target":{"$ref":"#/$defs/httpsUrl"},"current":{"const":"none"}}}}]
}
},
"controlBudgets":{"type":"object","additionalProperties":false,"required":["desktop","mobile","minimumDirectTarget"],"properties":{"desktop":{"type":"object","additionalProperties":false,"required":["brandRequired","maxControls"],"properties":{"brandRequired":{"const":true},"maxControls":{"const":4}}},"mobile":{"type":"object","additionalProperties":false,"required":["brandRequired","maxControls"],"properties":{"brandRequired":{"const":true},"maxControls":{"const":2}}},"minimumDirectTarget":{"type":"object","additionalProperties":false,"required":["value","unit"],"properties":{"value":{"const":44},"unit":{"enum":["css_px","platform_dp"]}}}}}
},
"allOf":[
{"if":{"properties":{"mode":{"not":{"const":"none"}}},"required":["mode"]},"then":{"properties":{"destinations":{"minItems":1}}}},
{"if":{"properties":{"mode":{"enum":["site","product"]}},"required":["mode"]},"then":{"required":["controlBudgets"],"properties":{"destinations":{"allOf":[{"contains":{"type":"object","properties":{"breakpointExposure":{"type":"object","properties":{"desktop":{"const":"header"}},"required":["desktop"]}},"required":["breakpointExposure"]},"minContains":0,"maxContains":4},{"contains":{"type":"object","properties":{"breakpointExposure":{"type":"object","properties":{"mobile":{"const":"header"}},"required":["mobile"]}},"required":["breakpointExposure"]},"minContains":0,"maxContains":2}]}}}},
{"if":{"properties":{"sideBookmark":{"const":"selected"}},"required":["sideBookmark"]},"then":{"properties":{"destinations":{"minItems":2},"sideBookmarkUserBenefit":{"$ref":"#/$defs/nonEmpty"}}}},
{"if":{"properties":{"sideBookmark":{"const":"omitted"}},"required":["sideBookmark"]},"then":{"properties":{"sideBookmarkUserBenefit":{"type":"null"}}}},
{"if":{"properties":{"mode":{"enum":["site","product"]}},"required":["mode"]},"then":{"properties":{"brandDestinationRef":{"$ref":"#/$defs/nonEmpty"},"destinations":{"contains":{"type":"object","properties":{"role":{"const":"brand"}},"required":["role"]},"minContains":1,"maxContains":1}}}},
{"if":{"properties":{"mode":{"const":"none"}},"required":["mode"]},"then":{"properties":{"destinations":{"maxItems":0},"sideBookmark":{"const":"omitted"},"brandDestinationRef":{"type":"null"},"sideBookmarkUserBenefit":{"type":"null"}},"not":{"required":["controlBudgets"]}}}
]
},
"actionIds":{"$ref":"#/$defs/uniqueStrings"},
"claimIds":{"$ref":"#/$defs/uniqueStrings"},
"claimManifestRef":{"$ref":"#/$defs/safeRef"},
"claimManifestSha256":{"$ref":"#/$defs/sha256"},
"claimAsOf":{"type":"string","format":"date-time"},
"materialLimitations":{"type":"array","uniqueItems":true,"items":{"type":"object","additionalProperties":false,"required":["claimId","items"],"properties":{"claimId":{"$ref":"#/$defs/nonEmpty"},"items":{"type":"array","minItems":1,"uniqueItems":true,"items":{"type":"object","additionalProperties":false,"required":["id","text","textByLocale"],"properties":{"id":{"$ref":"#/$defs/nonEmpty"},"text":{"$ref":"#/$defs/nonEmpty"},"textByLocale":{"type":"object","minProperties":1,"additionalProperties":{"$ref":"#/$defs/nonEmpty"}}}}}}}},
"localeStates":{"type":"array","minItems":1,"items":{"type":"object","additionalProperties":false,"required":["locale","status"],"properties":{"locale":{"type":"string","pattern":"^[a-z]{2}(-[A-Z]{2})?$"},"status":{"enum":["source","reviewed_translation","draft_translation","single_locale"]}}}},
"outputClarity":{
"type":"object",
"additionalProperties":false,
"required":["mode","deliveryAudience","disclosurePurpose","internalGovernanceVisible","blockingDependencyRefs","placeholderCount","materialLimitationRefs"],
"properties":{"mode":{"const":"resolved_only"},"deliveryAudience":{"enum":["internal_preview","internal_operational","client","public"]},"disclosurePurpose":{"enum":["ordinary_experience","design_system_reference","provenance_record"]},"disclosureAuthorityRef":{"$ref":"#/$defs/safeRef"},"disclosureAuthoritySha256":{"$ref":"#/$defs/sha256"},"disclosureAttestationRef":{"$ref":"#/$defs/safeRef"},"disclosureAttestationSha256":{"$ref":"#/$defs/sha256"},"internalGovernanceVisible":{"const":false},"blockingDependencyRefs":{"$ref":"#/$defs/uniqueStrings"},"placeholderCount":{"const":0},"materialLimitationRefs":{"$ref":"#/$defs/uniqueStrings"},"residueScanReceiptRef":{"$ref":"#/$defs/nonEmpty"}},
"allOf":[{"if":{"properties":{"disclosurePurpose":{"enum":["design_system_reference","provenance_record"]}},"required":["disclosurePurpose"]},"then":{"required":["disclosureAuthorityRef","disclosureAuthoritySha256","disclosureAttestationRef","disclosureAttestationSha256"]}}]
}
},
"allOf":[{"if":{"properties":{"claimIds":{"minItems":1}},"required":["claimIds"]},"then":{"required":["claimManifestRef","claimManifestSha256","claimAsOf"]}}]
},
"delivery":{
"type":"object",
"additionalProperties":false,
"required":["files","contentInspections","assetBindings","implementationBindings","implementationSourceBindings","metadataProjection","accessibilityProjection"],
"properties":{
"files":{"type":"array","uniqueItems":true,"items":{"type":"object","additionalProperties":false,"required":["path","sha256","mediaType"],"properties":{"path":{"$ref":"#/$defs/safeRef"},"sha256":{"$ref":"#/$defs/sha256"},"mediaType":{"$ref":"#/$defs/nonEmpty"}}}},
"contentInspections":{
"type":"array",
"uniqueItems":true,
"items":{
"type":"object",
"additionalProperties":false,
"required":["subjectPath","subjectSha256","subjectMediaType","method","result","evidenceRef","evidenceSha256","inspectedAt"],
"properties":{"subjectPath":{"$ref":"#/$defs/safeRef"},"subjectSha256":{"$ref":"#/$defs/sha256"},"subjectMediaType":{"$ref":"#/$defs/nonEmpty"},"method":{"enum":["direct_text_scan","office_text_extraction","pdf_text_extraction","ocr_visual_review","media_transcript_review","binary_content_review"]},"result":{"const":"pass"},"evidenceRef":{"$ref":"#/$defs/safeRef"},"evidenceSha256":{"$ref":"#/$defs/sha256"},"inspectedAt":{"type":"string","format":"date-time"},"renderedUnitKind":{"enum":["page","slide"]},"renderedUnitCount":{"type":"integer","minimum":1},"renderedUnitCoverage":{"const":"every_page_or_slide"},"combinedReviewMethod":{"const":"text_extraction_plus_ocr_plus_visual_review"},"imageOnlyOrOutlinedTextReviewed":{"const":true},"combinedVisibleTextSha256":{"$ref":"#/$defs/sha256"}},
"allOf":[{"if":{"properties":{"method":{"enum":["office_text_extraction","pdf_text_extraction"]}},"required":["method"]},"then":{"required":["renderedUnitKind","renderedUnitCount","renderedUnitCoverage","combinedReviewMethod","imageOnlyOrOutlinedTextReviewed","combinedVisibleTextSha256"]}},{"if":{"properties":{"method":{"const":"pdf_text_extraction"}},"required":["method"]},"then":{"properties":{"renderedUnitKind":{"const":"page"}}}}]
}
},
"primaryHtmlBinding":{"type":"object","additionalProperties":false,"required":["path","sha256","mediaType"],"properties":{"path":{"$ref":"#/$defs/safeRef"},"sha256":{"$ref":"#/$defs/sha256"},"mediaType":{"const":"text/html"}}},
"webDiscoveryEvidence":{
"type":"object",
"additionalProperties":false,
"required":["artifactBuildId","primaryHtmlPath","primaryHtmlSha256","observedAt","noScript","hydratedDom","accessibilityTree","internalLocaleLinks","sitemap"],
"properties":{
"artifactBuildId":{"$ref":"#/$defs/nonEmpty"},
"primaryHtmlPath":{"$ref":"#/$defs/safeRef"},
"primaryHtmlSha256":{"$ref":"#/$defs/sha256"},
"observedAt":{"type":"string","format":"date-time"},
"noScript":{"type":"object","additionalProperties":false,"required":["ref","sha256","mediaType"],"properties":{"ref":{"$ref":"#/$defs/safeRef"},"sha256":{"$ref":"#/$defs/sha256"},"mediaType":{"const":"text/html"}}},
"hydratedDom":{"type":"object","additionalProperties":false,"required":["ref","sha256","mediaType"],"properties":{"ref":{"$ref":"#/$defs/safeRef"},"sha256":{"$ref":"#/$defs/sha256"},"mediaType":{"const":"text/html"}}},
"accessibilityTree":{"type":"object","additionalProperties":false,"required":["ref","sha256","mediaType"],"properties":{"ref":{"$ref":"#/$defs/safeRef"},"sha256":{"$ref":"#/$defs/sha256"},"mediaType":{"const":"application/json"}}},
"internalLocaleLinks":{"type":"object","additionalProperties":false,"required":["ref","sha256","mediaType"],"properties":{"ref":{"$ref":"#/$defs/safeRef"},"sha256":{"$ref":"#/$defs/sha256"},"mediaType":{"const":"application/json"}}},
"sitemap":{"anyOf":[{"type":"null"},{"type":"object","additionalProperties":false,"required":["ref","sha256","mediaType"],"properties":{"ref":{"$ref":"#/$defs/safeRef"},"sha256":{"$ref":"#/$defs/sha256"},"mediaType":{"enum":["application/xml","text/xml"]}}}]}
}
},
"socialSidecarBinding":{"type":"object","additionalProperties":false,"required":["ref","sha256","mediaType","schemaRef","schemaSha256","sidecarId","artifactBuildId","creativePath","creativeSha256"],"properties":{"ref":{"$ref":"#/$defs/safeRef"},"sha256":{"$ref":"#/$defs/sha256"},"mediaType":{"const":"application/json"},"schemaRef":{"const":"https://montri-th.github.io/Landometer/v0.9.7/standalone-0.9.7-r1/schemas/social-sidecar.schema.json"},"schemaSha256":{"$ref":"#/$defs/sha256"},"sidecarId":{"$ref":"#/$defs/nonEmpty"},"artifactBuildId":{"$ref":"#/$defs/nonEmpty"},"creativePath":{"$ref":"#/$defs/safeRef"},"creativeSha256":{"$ref":"#/$defs/sha256"}}},
"assetBindings":{"type":"array","uniqueItems":true,"items":{"$ref":"#/$defs/assetBinding"}},
"metadataProjection":{"$ref":"#/$defs/metadataProjection"},
"implementationBindings":{"type":"object","additionalProperties":false,"required":["formatKit","targetProfile","preset"],"properties":{"formatKit":{"type":"object","additionalProperties":false,"required":["ref","sha256","schemaRef","id"],"properties":{"ref":{"$ref":"#/$defs/safeRef"},"sha256":{"$ref":"#/$defs/sha256"},"schemaRef":{"$ref":"#/$defs/nonEmpty"},"id":{"$ref":"#/$defs/nonEmpty"}}},"targetProfile":{"type":"object","additionalProperties":false,"required":["ref","sha256","schemaRef","id"],"properties":{"ref":{"$ref":"#/$defs/safeRef"},"sha256":{"$ref":"#/$defs/sha256"},"schemaRef":{"$ref":"#/$defs/nonEmpty"},"id":{"$ref":"#/$defs/nonEmpty"}}},"preset":{"type":"object","additionalProperties":false,"required":["ref","sha256","schemaRef","id"],"properties":{"ref":{"$ref":"#/$defs/safeRef"},"sha256":{"$ref":"#/$defs/sha256"},"schemaRef":{"$ref":"#/$defs/nonEmpty"},"id":{"$ref":"#/$defs/nonEmpty"}}}}},
"implementationSourceBindings":{"type":"array","uniqueItems":true,"items":{"type":"object","additionalProperties":false,"required":["role","ref","sha256","mediaType","audienceDelivered","lineageReceiptRef","lineageReceiptSha256","lineageAttestationRef","lineageAttestationSha256"],"properties":{"role":{"enum":["editable_source","template","export_preset","style_map","component_source","other_governed_source"]},"ref":{"$ref":"#/$defs/safeRef"},"sha256":{"$ref":"#/$defs/sha256"},"mediaType":{"$ref":"#/$defs/nonEmpty"},"audienceDelivered":{"type":"boolean"},"lineageReceiptRef":{"$ref":"#/$defs/safeRef"},"lineageReceiptSha256":{"$ref":"#/$defs/sha256"},"lineageAttestationRef":{"$ref":"#/$defs/safeRef"},"lineageAttestationSha256":{"$ref":"#/$defs/sha256"}}}},
"accessibilityProjection":{
"type":"object",
"additionalProperties":false,
"required":["status"],
"properties":{
"status":{"enum":["not_tested","verified"]},
"reason":{"$ref":"#/$defs/nonEmpty"},
"formatProfile":{"enum":["web_public","app_interactive","document_flow","pdf_fixed","deck_presentation","social_static"]},
"primaryLocale":{"$ref":"#/$defs/nonEmpty"},
"readingOrder":{"type":"array","minItems":1,"uniqueItems":true,"items":{"$ref":"#/$defs/nonEmpty"}},
"semanticStructure":{"type":"object","additionalProperties":false,"required":["headings","landmarks","controls"],"properties":{"headings":{"enum":["verified","not_applicable"]},"landmarks":{"enum":["verified","not_applicable"]},"controls":{"enum":["verified","not_applicable"]}}},
"alternatives":{"type":"object","additionalProperties":false,"required":["images","data","motion"],"properties":{"images":{"enum":["verified","not_applicable"]},"data":{"enum":["verified","not_applicable"]},"motion":{"enum":["verified","not_applicable"]}}},
"interaction":{"type":"object","additionalProperties":false,"required":["keyboard","focus","touch"],"properties":{"keyboard":{"enum":["verified","not_applicable"]},"focus":{"enum":["verified","not_applicable"]},"touch":{"enum":["verified","not_applicable"]}}},
"contrast":{"type":"object","additionalProperties":false,"required":["normalTextMin","largeTextMin","nonTextMin"],"properties":{"normalTextMin":{"type":"number","minimum":4.5},"largeTextMin":{"type":"number","minimum":3},"nonTextMin":{"type":"number","minimum":3}}},
"textLayout":{"type":"object","additionalProperties":false,"required":["zoom200","reflow400"],"properties":{"zoom200":{"enum":["verified","not_applicable"]},"reflow400":{"enum":["verified","not_applicable"]}}},
"motion":{"type":"object","additionalProperties":false,"required":["reducedMotion","observerFailure"],"properties":{"reducedMotion":{"enum":["verified","not_applicable"]},"observerFailure":{"enum":["final_state","not_applicable"]}}},
"blockingFailureCount":{"const":0},
"fixtureReportRef":{"$ref":"#/$defs/safeRef"},
"fixtureReportSha256":{"$ref":"#/$defs/sha256"}
},
"allOf":[
{"if":{"properties":{"status":{"const":"not_tested"}},"required":["status"]},"then":{"required":["reason"]}},
{"if":{"properties":{"status":{"const":"verified"}},"required":["status"]},"then":{"required":["formatProfile","primaryLocale","readingOrder","semanticStructure","alternatives","interaction","contrast","textLayout","motion","blockingFailureCount","fixtureReportRef","fixtureReportSha256"]}},
{"if":{"properties":{"status":{"const":"verified"},"formatProfile":{"const":"web_public"}},"required":["status","formatProfile"]},"then":{"properties":{"semanticStructure":{"const":{"headings":"verified","landmarks":"verified","controls":"verified"}},"interaction":{"const":{"keyboard":"verified","focus":"verified","touch":"verified"}},"contrast":{"const":{"normalTextMin":4.5,"largeTextMin":3,"nonTextMin":3}},"textLayout":{"const":{"zoom200":"verified","reflow400":"verified"}}}}},
{"if":{"properties":{"status":{"const":"verified"},"formatProfile":{"const":"app_interactive"}},"required":["status","formatProfile"]},"then":{"properties":{"semanticStructure":{"const":{"headings":"verified","landmarks":"verified","controls":"verified"}},"interaction":{"const":{"keyboard":"verified","focus":"verified","touch":"verified"}},"contrast":{"const":{"normalTextMin":4.5,"largeTextMin":3,"nonTextMin":3}},"textLayout":{"const":{"zoom200":"not_applicable","reflow400":"not_applicable"}}}}},
{"if":{"properties":{"status":{"const":"verified"},"formatProfile":{"const":"document_flow"}},"required":["status","formatProfile"]},"then":{"properties":{"semanticStructure":{"const":{"headings":"verified","landmarks":"not_applicable","controls":"verified"}},"interaction":{"const":{"keyboard":"not_applicable","focus":"not_applicable","touch":"not_applicable"}},"contrast":{"const":{"normalTextMin":4.5,"largeTextMin":3,"nonTextMin":3}},"textLayout":{"const":{"zoom200":"not_applicable","reflow400":"not_applicable"}}}}},
{"if":{"properties":{"status":{"const":"verified"},"formatProfile":{"const":"pdf_fixed"}},"required":["status","formatProfile"]},"then":{"properties":{"semanticStructure":{"const":{"headings":"verified","landmarks":"not_applicable","controls":"verified"}},"interaction":{"const":{"keyboard":"not_applicable","focus":"not_applicable","touch":"not_applicable"}},"contrast":{"const":{"normalTextMin":4.5,"largeTextMin":3,"nonTextMin":3}},"textLayout":{"const":{"zoom200":"not_applicable","reflow400":"not_applicable"}}}}},
{"if":{"properties":{"status":{"const":"verified"},"formatProfile":{"const":"deck_presentation"}},"required":["status","formatProfile"]},"then":{"properties":{"semanticStructure":{"const":{"headings":"not_applicable","landmarks":"not_applicable","controls":"not_applicable"}},"interaction":{"const":{"keyboard":"not_applicable","focus":"not_applicable","touch":"not_applicable"}},"contrast":{"const":{"normalTextMin":4.5,"largeTextMin":3,"nonTextMin":3}},"textLayout":{"const":{"zoom200":"not_applicable","reflow400":"not_applicable"}}}}},
{"if":{"properties":{"status":{"const":"verified"},"formatProfile":{"const":"social_static"}},"required":["status","formatProfile"]},"then":{"properties":{"semanticStructure":{"const":{"headings":"not_applicable","landmarks":"not_applicable","controls":"not_applicable"}},"interaction":{"const":{"keyboard":"not_applicable","focus":"not_applicable","touch":"not_applicable"}},"contrast":{"const":{"normalTextMin":4.5,"largeTextMin":3,"nonTextMin":3}},"textLayout":{"const":{"zoom200":"not_applicable","reflow400":"not_applicable"}}}}}
]
}
}
},
"validation":{
"type":"object",
"additionalProperties":false,
"required":["packageValidation","artifactAutomated","artifactManual","productionVerification","conformanceLevel","layerResults","resolvedTestResults","gateResults","promotionSnapshot"],
"properties":{
"packageValidation":{"enum":["passed","failed"]},
"artifactAutomated":{"$ref":"#/$defs/checkState"},
"artifactManual":{"$ref":"#/$defs/checkState"},
"productionVerification":{"$ref":"#/$defs/checkState"},
"conformanceLevel":{"enum":["authoring_aligned","package_validated","artifact_qa_passed","production_verified"]},
"layerResults":{"type":"object","additionalProperties":false,"required":["discovery","readability","action"],"properties":{"discovery":{"$ref":"#/$defs/layerResult"},"readability":{"$ref":"#/$defs/layerResult"},"action":{"$ref":"#/$defs/layerResult"}}},
"resolvedTestResults":{"type":"array","uniqueItems":true,"items":{"$ref":"#/$defs/resolvedTestResult"}},
"gateResults":{"type":"array","uniqueItems":true,"items":{"$ref":"#/$defs/gateResult"}},
"promotionSnapshot":{"anyOf":[{"type":"object","additionalProperties":false,"required":["ref","sha256","schemaRef","attestationRef","attestationSha256"],"properties":{"ref":{"$ref":"#/$defs/safeRef"},"sha256":{"$ref":"#/$defs/sha256"},"schemaRef":{"const":"https://montri-th.github.io/Landometer/v0.9.7/standalone-0.9.7-r1/schemas/promotion-snapshot.schema.json"},"attestationRef":{"$ref":"#/$defs/safeRef"},"attestationSha256":{"$ref":"#/$defs/sha256"}}},{"type":"null"}]}
}
}
},
"allOf":[
{"if":{"properties":{"resolution":{"properties":{"formatPack":{"enum":["web.public.01","app.interactive.01"]}},"required":["formatPack"]}},"required":["resolution"]},"then":{"properties":{"representation":{"properties":{"navigation":{"properties":{"mode":{"enum":["none","site","product"]},"destinations":{"items":{"required":["breakpointExposure"],"not":{"required":["staticExposure"]}}}}}}}}}},
{"if":{"properties":{"resolution":{"properties":{"formatPack":{"enum":["document.flow.01","pdf.fixed.01","deck.presentation.01","social.static.01"]}},"required":["formatPack"]}},"required":["resolution"]},"then":{"properties":{"representation":{"properties":{"navigation":{"not":{"required":["controlBudgets"]},"properties":{"destinations":{"items":{"required":["staticExposure"],"not":{"required":["breakpointExposure"]}}}}}}}}}},
{"if":{"properties":{"resolution":{"properties":{"formatPack":{"const":"document.flow.01"}},"required":["formatPack"]}},"required":["resolution"]},"then":{"properties":{"representation":{"properties":{"navigation":{"properties":{"mode":{"enum":["none","document"]},"destinations":{"items":{"properties":{"staticExposure":{"enum":["toc","destination_cue","not_exposed"]}}}}}}}}}}},
{"if":{"properties":{"resolution":{"properties":{"formatPack":{"const":"pdf.fixed.01"}},"required":["formatPack"]}},"required":["resolution"]},"then":{"properties":{"representation":{"properties":{"navigation":{"properties":{"mode":{"enum":["none","document"]},"destinations":{"items":{"properties":{"staticExposure":{"enum":["pdf_bookmark","destination_cue","not_exposed"]}}}}}}}}}}},
{"if":{"properties":{"resolution":{"properties":{"formatPack":{"const":"deck.presentation.01"}},"required":["formatPack"]}},"required":["resolution"]},"then":{"properties":{"representation":{"properties":{"navigation":{"properties":{"mode":{"enum":["none","deck"]},"destinations":{"items":{"properties":{"staticExposure":{"enum":["deck_section_marker","destination_cue","not_exposed"]}}}}}}}}}}},
{"if":{"properties":{"resolution":{"properties":{"formatPack":{"const":"social.static.01"}},"required":["formatPack"]}},"required":["resolution"]},"then":{"properties":{"representation":{"properties":{"navigation":{"properties":{"mode":{"const":"none"}}}}}}}},
{"if":{"properties":{"resolution":{"properties":{"targetProfileRef":{"enum":["target.web.responsive.360-1600.01","target.app.browser-responsive.360-1600.01"]}},"required":["targetProfileRef"]}},"required":["resolution"]},"then":{"properties":{"representation":{"properties":{"navigation":{"properties":{"controlBudgets":{"properties":{"minimumDirectTarget":{"const":{"value":44,"unit":"css_px"}}}}}}}}}}},
{"if":{"properties":{"resolution":{"properties":{"targetProfileRef":{"const":"target.app.native-responsive.360-1280.01"}},"required":["targetProfileRef"]}},"required":["resolution"]},"then":{"properties":{"representation":{"properties":{"navigation":{"properties":{"controlBudgets":{"properties":{"minimumDirectTarget":{"const":{"value":44,"unit":"platform_dp"}}}}}}}}}}},
{"if":{"properties":{"validation":{"type":"object","properties":{"conformanceLevel":{"enum":["artifact_qa_passed","production_verified"]}},"required":["conformanceLevel"]}},"required":["validation"]},"then":{"properties":{"validation":{"type":"object","properties":{"promotionSnapshot":{"type":"object"}},"required":["promotionSnapshot"]},"delivery":{"type":"object","properties":{"implementationSourceBindings":{"minItems":1}},"required":["implementationSourceBindings"]}}}},
{"if":{"properties":{"validation":{"type":"object","properties":{"conformanceLevel":{"enum":["authoring_aligned","package_validated"]}},"required":["conformanceLevel"]}},"required":["validation"]},"then":{"properties":{"validation":{"properties":{"promotionSnapshot":{"type":"null"}}}}}},
{"if":{"properties":{"resolution":{"properties":{"formatPack":{"enum":["web.public.01","app.interactive.01"]}},"required":["formatPack"]},"representation":{"properties":{"navigation":{"properties":{"mode":{"not":{"const":"none"}}},"required":["mode"]}},"required":["navigation"]}},"required":["resolution","representation"]},"then":{"properties":{"representation":{"properties":{"navigation":{"properties":{"destinations":{"allOf":[{"contains":{"type":"object","properties":{"current":{"const":"page"}},"required":["current"]},"minContains":1,"maxContains":1},{"contains":{"type":"object","properties":{"current":{"const":"location"}},"required":["current"]},"minContains":0,"maxContains":1}]}}}}}}}},
{"if":{"properties":{"resolution":{"properties":{"formatPack":{"enum":["web.public.01","app.interactive.01"]}},"required":["formatPack"]},"representation":{"properties":{"navigation":{"properties":{"sideBookmark":{"const":"selected"}},"required":["sideBookmark"]}},"required":["navigation"]}},"required":["resolution","representation"]},"then":{"properties":{"representation":{"properties":{"navigation":{"properties":{"destinations":{"contains":{"type":"object","properties":{"kind":{"const":"anchor"},"group":{"const":"page_local"},"current":{"const":"location"}},"required":["kind","group","current"]},"minContains":1,"maxContains":1}}}}}}}},
{"if":{"properties":{"resolution":{"properties":{"formatPack":{"const":"document.flow.01"}},"required":["formatPack"]},"representation":{"properties":{"navigation":{"properties":{"sideBookmark":{"const":"selected"}},"required":["sideBookmark"]}},"required":["navigation"]}},"required":["resolution","representation"]},"then":{"properties":{"representation":{"properties":{"navigation":{"properties":{"destinations":{"contains":{"type":"object","properties":{"kind":{"const":"anchor"},"level":{"const":"page"},"group":{"const":"page_local"},"staticExposure":{"const":"toc"}},"required":["kind","level","group","staticExposure"]},"minContains":2}}}}}}}},
{"if":{"properties":{"resolution":{"properties":{"formatPack":{"const":"pdf.fixed.01"}},"required":["formatPack"]},"representation":{"properties":{"navigation":{"properties":{"sideBookmark":{"const":"selected"}},"required":["sideBookmark"]}},"required":["navigation"]}},"required":["resolution","representation"]},"then":{"properties":{"representation":{"properties":{"navigation":{"properties":{"destinations":{"contains":{"type":"object","properties":{"kind":{"const":"anchor"},"level":{"const":"page"},"group":{"const":"page_local"},"staticExposure":{"const":"pdf_bookmark"}},"required":["kind","level","group","staticExposure"]},"minContains":2}}}}}}}},
{"if":{"properties":{"resolution":{"properties":{"formatPack":{"const":"deck.presentation.01"}},"required":["formatPack"]},"representation":{"properties":{"navigation":{"properties":{"sideBookmark":{"const":"selected"}},"required":["sideBookmark"]}},"required":["navigation"]}},"required":["resolution","representation"]},"then":{"properties":{"representation":{"properties":{"navigation":{"properties":{"destinations":{"contains":{"type":"object","properties":{"kind":{"const":"anchor"},"level":{"const":"page"},"group":{"const":"page_local"},"staticExposure":{"const":"deck_section_marker"}},"required":["kind","level","group","staticExposure"]},"minContains":2}}}}}}}},
{"if":{"properties":{"resolution":{"properties":{"formatPack":{"enum":["document.flow.01","pdf.fixed.01","deck.presentation.01","social.static.01"]}},"required":["formatPack"]}},"required":["resolution"]},"then":{"properties":{"representation":{"properties":{"navigation":{"properties":{"destinations":{"items":{"properties":{"current":{"const":"none"}},"required":["current"]}}}}}}}}},
{"if":{"properties":{"validation":{"type":"object","properties":{"conformanceLevel":{"enum":["artifact_qa_passed","production_verified"]}},"required":["conformanceLevel"]}},"required":["validation"]},"then":{"properties":{"delivery":{"type":"object","properties":{"contentInspections":{"minItems":1}},"required":["contentInspections"]}}}},
{"if":{"properties":{"validation":{"type":"object","properties":{"conformanceLevel":{"enum":["artifact_qa_passed","production_verified"]}},"required":["conformanceLevel"]},"delivery":{"type":"object","properties":{"metadataProjection":{"type":"object","properties":{"kind":{"const":"web_discovery"}},"required":["kind"]}},"required":["metadataProjection"]}},"required":["validation","delivery"]},"then":{"properties":{"delivery":{"type":"object","required":["primaryHtmlBinding","webDiscoveryEvidence"]}}}},
{"if":{"properties":{"validation":{"type":"object","properties":{"conformanceLevel":{"enum":["artifact_qa_passed","production_verified"]}},"required":["conformanceLevel"]},"delivery":{"type":"object","properties":{"metadataProjection":{"type":"object","properties":{"kind":{"const":"format_metadata"},"formatProfile":{"const":"social_static"}},"required":["kind","formatProfile"]}},"required":["metadataProjection"]}},"required":["validation","delivery"]},"then":{"properties":{"delivery":{"type":"object","required":["socialSidecarBinding"]}}}}
],
"$defs":{
"nonEmpty":{"type":"string","minLength":1,"pattern":"\\S"},
"httpsUrl":{"type":"string","pattern":"^https://[^\\s]+$"},
"sha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},
"protectedLineRoleOrNull":{"enum":["north_star","promise","cultural_activation",null]},
"safeRef":{"type":"string","minLength":1,"pattern":"^(?!/)(?!.*(?:^|/)\\.\\.(?:/|$))[^\\u0000]+$"},
"uniqueStrings":{"type":"array","items":{"$ref":"#/$defs/nonEmpty"},"uniqueItems":true},
"checkState":{"enum":["pending","passed","failed","not_applicable"]},
"layerResult":{"type":"object","additionalProperties":false,"required":["result","reason","owner","receiptRef","checkedAt"],"properties":{"result":{"enum":["pass","fail","not_tested"]},"reason":{"$ref":"#/$defs/nonEmpty"},"owner":{"$ref":"#/$defs/nonEmpty"},"receiptRef":{"$ref":"#/$defs/nonEmpty"},"receiptSha256":{"$ref":"#/$defs/sha256"},"attestationRef":{"$ref":"#/$defs/safeRef"},"attestationSha256":{"$ref":"#/$defs/sha256"},"checkedAt":{"type":"string","format":"date-time"}},"allOf":[{"if":{"properties":{"result":{"const":"pass"}},"required":["result"]},"then":{"required":["receiptSha256","attestationRef","attestationSha256"]}}]},
"gateResult":{"type":"object","additionalProperties":false,"required":["checkId","method","result","reason","owner","receiptRef","checkedAt"],"properties":{"checkId":{"$ref":"#/$defs/nonEmpty"},"method":{"enum":["automated","visual","interaction","accessibility","manual","production"]},"result":{"enum":["pass","fail","not_tested"]},"reason":{"$ref":"#/$defs/nonEmpty"},"owner":{"$ref":"#/$defs/nonEmpty"},"receiptRef":{"$ref":"#/$defs/safeRef"},"receiptSha256":{"$ref":"#/$defs/sha256"},"attestationRef":{"$ref":"#/$defs/safeRef"},"attestationSha256":{"$ref":"#/$defs/sha256"},"checkedAt":{"type":"string","format":"date-time"}},"allOf":[{"if":{"properties":{"result":{"const":"pass"}},"required":["result"]},"then":{"required":["receiptSha256","attestationRef","attestationSha256"]}}]},
"resolvedTestResult":{"type":"object","additionalProperties":false,"required":["testId","method","result","criterion","criterionSha256","evidenceRef","evidenceSha256","checkedAt"],"properties":{"testId":{"$ref":"#/$defs/nonEmpty"},"method":{"enum":["automated","visual","interaction","accessibility","manual","production"]},"result":{"enum":["pass","fail","not_tested"]},"criterion":{"$ref":"#/$defs/nonEmpty"},"criterionSha256":{"$ref":"#/$defs/sha256"},"evidenceRef":{"$ref":"#/$defs/safeRef"},"evidenceSha256":{"$ref":"#/$defs/sha256"},"checkedAt":{"type":"string","format":"date-time"}}},
"assetBinding":{
"type":"object",
"additionalProperties":false,
"required":["assetId","role","surface","registryRef","registrySha256","sha256","approvalStatus"],
"properties":{
"assetId":{"$ref":"#/$defs/nonEmpty"},
"role":{"enum":["identity","text_font","editorial","evidence","interface_icon","data_visualization","map","social_preview","atmosphere","ui_capture","provider_content","generated_vector"]},
"surface":{"$ref":"#/$defs/nonEmpty"},
"registryRef":{"$ref":"#/$defs/safeRef"},
"registrySha256":{"$ref":"#/$defs/sha256"},
"sha256":{"$ref":"#/$defs/sha256"},
"approvalStatus":{"enum":["approved","candidate","unverified","rejected"]},
"approvalReceiptRef":{"$ref":"#/$defs/safeRef"},
"approvalReceiptSha256":{"$ref":"#/$defs/sha256"},
"fontRole":{"$ref":"#/$defs/nonEmpty"},
"fontFamily":{"$ref":"#/$defs/nonEmpty"},
"fontSubset":{"$ref":"#/$defs/nonEmpty"},
"fontWeight":{"type":"integer","minimum":1,"maximum":1000},
"fontFallback":{"$ref":"#/$defs/nonEmpty"},
"licenseOrPermission":{"$ref":"#/$defs/nonEmpty"},
"fallback":{"$ref":"#/$defs/nonEmpty"},
"altOrTextEquivalent":{"$ref":"#/$defs/nonEmpty"},
"glyphs":{"type":"array","minItems":1,"items":{"$ref":"#/$defs/nonEmpty"},"uniqueItems":true}
},
"allOf":[{"if":{"properties":{"approvalStatus":{"const":"approved"}},"required":["approvalStatus"]},"then":{"required":["approvalReceiptRef","approvalReceiptSha256"]}},{"if":{"properties":{"role":{"const":"text_font"}},"required":["role"]},"then":{"required":["fontRole","fontFamily","fontSubset","fontWeight","fontFallback","licenseOrPermission"]}},{"if":{"properties":{"role":{"const":"identity"}},"required":["role"]},"then":{"required":["licenseOrPermission","fallback","altOrTextEquivalent"]}},{"if":{"properties":{"role":{"const":"interface_icon"}},"required":["role"]},"then":{"required":["licenseOrPermission","fallback","glyphs"]}},{"if":{"properties":{"role":{"enum":["editorial","evidence","data_visualization","map","social_preview","atmosphere","ui_capture","provider_content","generated_vector"]}},"required":["role"]},"then":{"required":["licenseOrPermission","fallback","altOrTextEquivalent"]}}]
},
"metadataProjection":{"oneOf":[{"$ref":"#/$defs/discoveryProjection"},{"$ref":"#/$defs/formatMetadataProjection"}]},
"formatMetadataProjection":{"type":"object","additionalProperties":false,"required":["kind","formatProfile","title","locale"],"properties":{"kind":{"const":"format_metadata"},"formatProfile":{"enum":["app_interactive","document_flow","pdf_fixed","deck_presentation","social_static"]},"title":{"$ref":"#/$defs/nonEmpty"},"locale":{"type":"string","pattern":"^[a-z]{2}(-[A-Z]{2})?$"},"publicRevisionLabel":{"$ref":"#/$defs/nonEmpty"},"pageOrFrameLabel":{"$ref":"#/$defs/nonEmpty"}}},
"discoveryProjection":{
"type":"object",
"additionalProperties":false,
"required":["kind","pageKind","canonicalUrl","htmlLang","titleByLocale","descriptionByLocale","primaryHeadingByLocale","primaryAnswerByLocale","protectedLineRoles","robots","sitemap","localeRoutes","socialPreview","structuredDataBindings","crawlerPurposePolicy","visibleTruthOnly","initialHtmlRequired"],
"properties":{
"kind":{"const":"web_discovery"},
"pageKind":{"enum":["portfolio_home","product_landing","detail","article","index","tool","dataset","search_results","utility"]},
"canonicalUrl":{"$ref":"#/$defs/httpsUrl"},
"htmlLang":{"type":"string","pattern":"^[a-z]{2}(-[A-Z]{2})?$"},
"titleByLocale":{"type":"object","minProperties":1,"additionalProperties":{"$ref":"#/$defs/nonEmpty"}},
"descriptionByLocale":{"type":"object","minProperties":1,"additionalProperties":{"$ref":"#/$defs/nonEmpty"}},
"primaryHeadingByLocale":{"type":"object","minProperties":1,"additionalProperties":{"$ref":"#/$defs/nonEmpty"}},
"primaryAnswerByLocale":{"type":"object","minProperties":1,"additionalProperties":{"$ref":"#/$defs/nonEmpty"}},
"protectedLineRoles":{"type":"object","additionalProperties":false,"required":["visibleScene","metadataScene","socialPreviewScene"],"properties":{"visibleScene":{"$ref":"#/$defs/protectedLineRoleOrNull"},"metadataScene":{"$ref":"#/$defs/protectedLineRoleOrNull"},"socialPreviewScene":{"$ref":"#/$defs/protectedLineRoleOrNull"}}},
"robots":{"type":"object","additionalProperties":false,"required":["index","follow"],"properties":{"index":{"type":"boolean"},"follow":{"type":"boolean"}}},
"sitemap":{"type":"object","additionalProperties":false,"required":["included","loc"],"properties":{"included":{"type":"boolean"},"loc":{"type":["string","null"]}},"allOf":[{"if":{"properties":{"included":{"const":true}},"required":["included"]},"then":{"properties":{"loc":{"$ref":"#/$defs/httpsUrl"}}},"else":{"properties":{"loc":{"type":"null"}}}}]},
"localeRoutes":{"type":"array","minItems":1,"items":{"type":"object","additionalProperties":false,"required":["locale","url","canonicalUrl","alternates"],"properties":{"locale":{"type":"string","pattern":"^[a-z]{2}(-[A-Z]{2})?$"},"url":{"$ref":"#/$defs/httpsUrl"},"canonicalUrl":{"$ref":"#/$defs/httpsUrl"},"alternates":{"type":"array","minItems":1,"items":{"type":"object","additionalProperties":false,"required":["locale","url"],"properties":{"locale":{"anyOf":[{"type":"string","pattern":"^[a-z]{2}(-[A-Z]{2})?$"},{"const":"x-default"}]},"url":{"$ref":"#/$defs/httpsUrl"}}}}}}},
"socialPreview":{"type":"object","additionalProperties":false,"required":["titleByLocale","descriptionByLocale","url","imageAssetId"],"properties":{"titleByLocale":{"type":"object","minProperties":1,"additionalProperties":{"$ref":"#/$defs/nonEmpty"}},"descriptionByLocale":{"type":"object","minProperties":1,"additionalProperties":{"$ref":"#/$defs/nonEmpty"}},"url":{"$ref":"#/$defs/httpsUrl"},"imageAssetId":{"anyOf":[{"$ref":"#/$defs/nonEmpty"},{"type":"null"}]},"imageAltByLocale":{"type":"object","minProperties":1,"additionalProperties":{"$ref":"#/$defs/nonEmpty"}}}},
"structuredDataBindings":{"type":"array","minItems":1,"items":{"type":"object","additionalProperties":false,"required":["ref","sha256","schemaRef"],"properties":{"ref":{"$ref":"#/$defs/safeRef"},"sha256":{"$ref":"#/$defs/sha256"},"schemaRef":{"const":"https://montri-th.github.io/Landometer/v0.9.7/standalone-0.9.7-r1/schemas/structured-data-projection.schema.json"}}}},
"crawlerPurposePolicy":{"type":"object","additionalProperties":false,"required":["ref","sha256","schemaRef"],"properties":{"ref":{"$ref":"#/$defs/safeRef"},"sha256":{"$ref":"#/$defs/sha256"},"schemaRef":{"const":"https://montri-th.github.io/Landometer/v0.9.7/standalone-0.9.7-r1/schemas/crawler-purpose-policy.schema.json"}}},
"visibleTruthOnly":{"const":true},
"initialHtmlRequired":{"type":"boolean"},
"iconSetId":{"anyOf":[{"$ref":"#/$defs/nonEmpty"},{"type":"null"}]},
"titlePattern":{"const":"[page] · [product]"}
}
}
},
"$comment":"Resolved standalone LDS 0.9.7 contract, revision standalone-0.9.7-r1. The distribution is owner-approved and unsigned; this schema is not a release attestation. Historical source identities and hashes are recorded separately."
},
"asset-approval-receipt.schema.json":{
"$schema":"https://json-schema.org/draft/2020-12/schema",
"$id":"https://montri-th.github.io/Landometer/v0.9.7/standalone-0.9.7-r1/schemas/asset-approval-receipt.schema.json",
"title":"Landometer role-scoped asset approval receipt v1.0",
"type":"object",
"additionalProperties":false,
"required":["schemaVersion","releaseRef","receiptId","status","approvedBy","approvedAt","authorityEvidenceRef","assets"],
"properties":{"schemaVersion":{"const":"1.0"},"releaseRef":{"const":"v0.9.7-owner.1"},"receiptId":{"$ref":"#/$defs/nonEmpty"},"status":{"const":"approved"},"approvedBy":{"$ref":"#/$defs/nonEmpty"},"approvedAt":{"type":"string","format":"date-time"},"authorityEvidenceRef":{"$ref":"#/$defs/nonEmpty"},"assets":{"type":"array","minItems":1,"items":{"$ref":"#/$defs/assetApproval"}}},
"$defs":{
"nonEmpty":{"type":"string","minLength":1,"pattern":"\\S"},
"sha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},
"uniqueStrings":{"type":"array","minItems":1,"items":{"$ref":"#/$defs/nonEmpty"},"uniqueItems":true},
"assetApproval":{
"type":"object",
"additionalProperties":false,
"required":["assetId","role","sha256","allowedFormatProfiles","allowedSurfaceRoles","allowedAudiences","publicationPermission","licenseOrPermission","fallback"],
"properties":{"assetId":{"$ref":"#/$defs/nonEmpty"},"role":{"enum":["identity","text_font","interface_icon","editorial","evidence","data_visualization","map","social_preview","atmosphere","ui_capture","provider_content","generated_vector"]},"sha256":{"$ref":"#/$defs/sha256"},"allowedFormatProfiles":{"type":"array","minItems":1,"uniqueItems":true,"items":{"enum":["web_public","app_interactive","document_flow","pdf_fixed","deck_presentation","social_static"]}},"allowedSurfaceRoles":{"$ref":"#/$defs/uniqueStrings"},"allowedAudiences":{"type":"array","minItems":1,"uniqueItems":true,"items":{"enum":["internal_preview","internal_operational","client","public"]}},"publicationPermission":{"type":"boolean"},"licenseOrPermission":{"$ref":"#/$defs/nonEmpty"},"fallback":{"$ref":"#/$defs/nonEmpty"},"altOrTextEquivalent":{"$ref":"#/$defs/nonEmpty"},"glyphs":{"$ref":"#/$defs/uniqueStrings"}},
"allOf":[{"if":{"properties":{"role":{"const":"identity"}},"required":["role"]},"then":{"required":["altOrTextEquivalent"]}},{"if":{"properties":{"role":{"const":"interface_icon"}},"required":["role"]},"then":{"required":["glyphs"]}},{"if":{"properties":{"role":{"enum":["editorial","evidence","data_visualization","map","social_preview","atmosphere","ui_capture","provider_content","generated_vector"]}},"required":["role"]},"then":{"required":["altOrTextEquivalent"]}}]
}
},
"$comment":"Resolved standalone LDS 0.9.7 contract, revision standalone-0.9.7-r1. The distribution is owner-approved and unsigned; this schema is not a release attestation. Historical source identities and hashes are recorded separately."
},
"asset-registry.schema.json":{
"$schema":"https://json-schema.org/draft/2020-12/schema",
"$id":"https://montri-th.github.io/Landometer/v0.9.7/standalone-0.9.7-r1/schemas/asset-registry.schema.json",
"title":"Landometer role-scoped asset, identity typography, and portability registry 1.9",
"type":"object",
"additionalProperties":false,
"required":["schemaVersion","releaseRef","status","productionEligibility","packageBytesIncluded","approvalAttestationRef","approvalAttestationSha256","sourceProvenance","resolutionPolicy","identity","textIdentityImplementations","fonts","iconSubsets","nonWebPortability","portabilityFixtureCriteria","media","iconSets","motifRegisterRef"],
"properties":{
"schemaVersion":{"const":"1.9"},
"releaseRef":{"const":"v0.9.7-owner.1"},
"status":{"enum":["candidate","active"]},
"productionEligibility":{"const":"per_asset_role"},
"packageBytesIncluded":{"const":true},
"approvalAttestationRef":{"type":["string","null"]},
"approvalAttestationSha256":{"type":["string","null"]},
"sourceProvenance":{"type":"object","additionalProperties":false,"minProperties":1,"properties":{"identity":{"$ref":"#/$defs/nonEmpty"},"textIdentity":{"$ref":"#/$defs/nonEmpty"},"fontsAndIcons":{"$ref":"#/$defs/nonEmpty"},"media":{"$ref":"#/$defs/nonEmpty"}}},
"resolutionPolicy":{"$ref":"#/$defs/nonEmpty"},
"identity":{
"type":"array",
"items":{
"type":"object",
"additionalProperties":false,
"required":["id","role","defaultUse","provenanceRef","packageFile","mediaType","bytes","sha256","pixelDimensions","approvalStatus","allowedSurfaces","rights","fallback","altOrTextEquivalent","minimumSize","clearSpace","reconstructionAllowed","cropAllowed","note"],
"properties":{
"id":{"$ref":"#/$defs/nonEmpty"},
"role":{"$ref":"#/$defs/nonEmpty"},
"defaultUse":{"$ref":"#/$defs/nonEmpty"},
"provenanceRef":{"$ref":"#/$defs/nonEmpty"},
"packageFile":{"$ref":"#/$defs/safeRef"},
"mediaType":{"const":"image/png"},
"bytes":{"type":"integer","minimum":1},
"sha256":{"$ref":"#/$defs/sha256"},
"pixelDimensions":{"type":"object","additionalProperties":false,"required":["width","height"],"properties":{"width":{"type":"integer","minimum":1},"height":{"type":"integer","minimum":1}}},
"approvalStatus":{"$ref":"#/$defs/approval"},
"approvalDetail":{"$ref":"#/$defs/nonEmpty"},
"approvedBy":{"$ref":"#/$defs/nonEmpty"},
"approvedAt":{"type":"string","format":"date-time"},
"approvalReceiptRef":{"$ref":"#/$defs/safeRef"},
"approvalReceiptSha256":{"$ref":"#/$defs/sha256"},
"allowedSurfaces":{"type":"array","items":{"$ref":"#/$defs/nonEmpty"},"uniqueItems":true},
"rights":{"$ref":"#/$defs/rights"},
"fallback":{"$ref":"#/$defs/nonEmpty"},
"altOrTextEquivalent":{"$ref":"#/$defs/nonEmpty"},
"minimumSize":{"anyOf":[{"type":"null"},{"type":"array","minItems":1,"items":{"$ref":"#/$defs/minimumSizeRecord"}}]},
"clearSpace":{"anyOf":[{"type":"null"},{"$ref":"#/$defs/clearSpaceRecord"}]},
"reconstructionAllowed":{"const":false},
"cropAllowed":{"const":false},
"note":{"$ref":"#/$defs/nonEmpty"}
},
"allOf":[{"if":{"properties":{"approvalStatus":{"const":"approved"}},"required":["approvalStatus"]},"then":{"required":["approvedBy","approvedAt","approvalReceiptRef","approvalReceiptSha256"],"properties":{"allowedSurfaces":{"minItems":1},"minimumSize":{"type":"array","minItems":1,"items":{"$ref":"#/$defs/minimumSizeRecord"}},"clearSpace":{"$ref":"#/$defs/clearSpaceRecord"}}}}]
}
},
"textIdentityImplementations":{
"type":"array",
"minItems":1,
"items":{
"type":"object",
"additionalProperties":false,
"required":["id","kind","role","canonicalText","localePolicy","approvalStatus","approvedBy","approvedAt","authorityEvidenceRef","allowedFormatProfiles","allowedSurfaces","allowedAudiences","publicationPermission","fontPolicy","typographyBindings","logoAssetId","logoReconstructionAllowed","fallback","note"],
"properties":{"id":{"type":"string","pattern":"^identity\\.text\\."},"kind":{"const":"governed_text_identity"},"role":{"const":"portfolio_name"},"canonicalText":{"$ref":"#/$defs/nonEmpty"},"localePolicy":{"const":"same_canonical_text_in_every_locale"},"approvalStatus":{"const":"approved"},"approvedBy":{"$ref":"#/$defs/nonEmpty"},"approvedAt":{"type":"string","format":"date-time"},"authorityEvidenceRef":{"$ref":"#/$defs/nonEmpty"},"allowedFormatProfiles":{"$ref":"#/$defs/formatProfiles"},"allowedSurfaces":{"$ref":"#/$defs/uniqueStrings"},"allowedAudiences":{"$ref":"#/$defs/audiences"},"publicationPermission":{"const":true},"fontPolicy":{"$ref":"#/$defs/nonEmpty"},"typographyBindings":{"type":"array","minItems":1,"uniqueItems":true,"items":{"$ref":"#/$defs/identityTypographyBinding"}},"logoAssetId":{"type":"null"},"logoReconstructionAllowed":{"const":false},"fallback":{"$ref":"#/$defs/nonEmpty"},"note":{"$ref":"#/$defs/nonEmpty"}}
}
},
"fonts":{"type":"array","items":{"type":"object","additionalProperties":false,"required":["id","family","role","subset","weight","file","packageFile","mediaType","bytes","sha256","license","licenseFileRef","approvalStatus","approvedBy","approvedAt","approvalReceiptRef","approvalReceiptSha256"],"properties":{"id":{"$ref":"#/$defs/nonEmpty"},"family":{"$ref":"#/$defs/nonEmpty"},"role":{"$ref":"#/$defs/nonEmpty"},"subset":{"$ref":"#/$defs/nonEmpty"},"weight":{"type":"integer","minimum":1,"maximum":1000},"file":{"$ref":"#/$defs/safeRef"},"packageFile":{"$ref":"#/$defs/safeRef"},"mediaType":{"const":"font/woff2"},"bytes":{"type":"integer","minimum":1},"sha256":{"$ref":"#/$defs/sha256"},"license":{"$ref":"#/$defs/nonEmpty"},"licenseFileRef":{"$ref":"#/$defs/safeRef"},"approvalStatus":{"const":"approved"},"approvedBy":{"$ref":"#/$defs/nonEmpty"},"approvedAt":{"type":"string","format":"date-time"},"approvalReceiptRef":{"$ref":"#/$defs/safeRef"},"approvalReceiptSha256":{"$ref":"#/$defs/sha256"}}}},
"iconSubsets":{
"type":"array",
"items":{
"type":"object",
"additionalProperties":false,
"required":["id","family","role","file","packageFile","mediaType","bytes","sha256","axes","glyphs","license","licenseFileRef","approvalStatus","approvedBy","approvedAt","approvalReceiptRef","approvalReceiptSha256"],
"properties":{"id":{"$ref":"#/$defs/nonEmpty"},"family":{"const":"Material Symbols Rounded"},"role":{"const":"interface_icon"},"file":{"$ref":"#/$defs/safeRef"},"packageFile":{"$ref":"#/$defs/safeRef"},"mediaType":{"const":"font/woff2"},"bytes":{"type":"integer","minimum":1},"sha256":{"$ref":"#/$defs/sha256"},"axes":{"type":"object","additionalProperties":false,"required":["FILL","wght","GRAD","opsz"],"properties":{"FILL":{"const":0},"wght":{"const":300},"GRAD":{"const":0},"opsz":{"type":"number"}}},"glyphs":{"type":"array","minItems":1,"items":{"$ref":"#/$defs/nonEmpty"},"uniqueItems":true},"license":{"$ref":"#/$defs/nonEmpty"},"licenseFileRef":{"$ref":"#/$defs/safeRef"},"approvalStatus":{"const":"approved"},"approvedBy":{"$ref":"#/$defs/nonEmpty"},"approvedAt":{"type":"string","format":"date-time"},"approvalReceiptRef":{"$ref":"#/$defs/safeRef"},"approvalReceiptSha256":{"$ref":"#/$defs/sha256"},"note":{"$ref":"#/$defs/nonEmpty"}}
}
},
"nonWebPortability":{"type":"object","additionalProperties":false,"required":["approvalStatus","approvedBy","approvedAt","authorityEvidenceRef","selectionPolicy","supportedPlatforms","nativeFontMappings","interfaceIconPolicy"],"properties":{"approvalStatus":{"const":"approved"},"approvedBy":{"$ref":"#/$defs/nonEmpty"},"approvedAt":{"type":"string","format":"date-time"},"authorityEvidenceRef":{"$ref":"#/$defs/nonEmpty"},"selectionPolicy":{"const":"select_one_exact_platform_mapping_and_record_it; unavailable_mapping_blocks_delivery"},"supportedPlatforms":{"type":"array","minItems":2,"uniqueItems":true,"items":{"enum":["macos","windows"]},"allOf":[{"contains":{"const":"macos"}},{"contains":{"const":"windows"}}]},"nativeFontMappings":{"type":"array","minItems":1,"items":{"$ref":"#/$defs/nativeFontMapping"}},"interfaceIconPolicy":{"$ref":"#/$defs/nonWebIconPolicy"}}},
"portabilityFixtureCriteria":{"type":"object","minProperties":1,"additionalProperties":{"$ref":"#/$defs/nonEmpty"}},
"media":{
"type":"array",
"items":{
"type":"object",
"additionalProperties":false,
"required":["id","role","provenanceRef","packageFile","mediaType","bytes","sha256","approvalStatus","allowedSurfaces","rights","fallback","altOrTextEquivalent","note"],
"properties":{"id":{"$ref":"#/$defs/nonEmpty"},"role":{"enum":["editorial","evidence","data_visualization","map","social_preview","atmosphere","ui_capture","provider_content","generated_vector"]},"provenanceRef":{"$ref":"#/$defs/nonEmpty"},"packageFile":{"$ref":"#/$defs/safeRef"},"mediaType":{"$ref":"#/$defs/nonEmpty"},"bytes":{"type":"integer","minimum":1},"sha256":{"$ref":"#/$defs/sha256"},"approvalStatus":{"$ref":"#/$defs/approval"},"approvalDetail":{"$ref":"#/$defs/nonEmpty"},"approvedBy":{"$ref":"#/$defs/nonEmpty"},"approvedAt":{"type":"string","format":"date-time"},"approvalReceiptRef":{"$ref":"#/$defs/safeRef"},"approvalReceiptSha256":{"$ref":"#/$defs/sha256"},"allowedSurfaces":{"type":"array","items":{"$ref":"#/$defs/nonEmpty"},"uniqueItems":true},"rights":{"$ref":"#/$defs/rights"},"fallback":{"$ref":"#/$defs/nonEmpty"},"altOrTextEquivalent":{"$ref":"#/$defs/nonEmpty"},"note":{"$ref":"#/$defs/nonEmpty"}},
"allOf":[{"if":{"properties":{"approvalStatus":{"const":"approved"}},"required":["approvalStatus"]},"then":{"required":["approvedBy","approvedAt","approvalReceiptRef","approvalReceiptSha256"],"properties":{"allowedSurfaces":{"minItems":1}}}}]
}
},
"licenseFiles":{"type":"array","minItems":1,"items":{"type":"object","additionalProperties":false,"required":["id","license","packageFile","mediaType","bytes","sha256"],"properties":{"id":{"$ref":"#/$defs/nonEmpty"},"license":{"$ref":"#/$defs/nonEmpty"},"packageFile":{"$ref":"#/$defs/safeRef"},"mediaType":{"const":"text/plain"},"bytes":{"type":"integer","minimum":1},"sha256":{"$ref":"#/$defs/sha256"}}}},
"fallbacks":{"type":"object","required":["displayLatin","displayThai","body","technical","interfaceIcon"],"additionalProperties":false,"properties":{"displayLatin":{"$ref":"#/$defs/nonEmpty"},"displayThai":{"$ref":"#/$defs/nonEmpty"},"body":{"$ref":"#/$defs/nonEmpty"},"technical":{"$ref":"#/$defs/nonEmpty"},"interfaceIcon":{"$ref":"#/$defs/nonEmpty"}}},
"iconSets":{"type":"array","items":{"type":"object","required":["id","role","property","composition","sizesPx","files","approvalStatus","rights","fallback","altOrTextEquivalent"],"properties":{"id":{"type":"string","pattern":"^iconset\\."},"role":{"const":"icon_set"},"property":{"enum":["portfolio","product"]},"composition":{"type":"string"},"sizesPx":{"type":"array","minItems":6,"maxItems":6,"items":{"enum":[16,32,48,180,192,512]}},"files":{"type":"array","items":{"type":"object","required":["sizePx","role","file","sha256","bytes"],"properties":{"sizePx":{"type":"integer"},"role":{"enum":["favicon","apple-touch","manifest","manifest-maskable"]},"file":{"type":"string"},"sha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"bytes":{"type":"integer"}}}},"approvalStatus":{"enum":["candidate","approved"]}},"additionalProperties":true}},
"motifRegisterRef":{"type":"object","required":["ref","sha256"],"properties":{"ref":{"const":"motif-register.v0.9.7.json"},"sha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"rules":{"type":"array","items":{"type":"string"}}}}
},
"allOf":[{"if":{"properties":{"textIdentityImplementations":{"minItems":1}},"required":["textIdentityImplementations"]},"then":{"properties":{"sourceProvenance":{"required":["textIdentity"]}}}},{"if":{"properties":{"identity":{"minItems":1}},"required":["identity"]},"then":{"properties":{"sourceProvenance":{"required":["identity"]}}}},{"if":{"properties":{"fonts":{"minItems":1}},"required":["fonts"]},"then":{"required":["licenseFiles","fallbacks"],"properties":{"sourceProvenance":{"required":["fontsAndIcons"]}}}},{"if":{"properties":{"iconSubsets":{"minItems":1}},"required":["iconSubsets"]},"then":{"required":["licenseFiles","fallbacks"],"properties":{"sourceProvenance":{"required":["fontsAndIcons"]}}}},{"if":{"properties":{"media":{"minItems":1}},"required":["media"]},"then":{"properties":{"sourceProvenance":{"required":["media"]}}}}],
"$defs":{
"nonEmpty":{"type":"string","minLength":1,"pattern":"\\S"},
"safeRef":{"type":"string","minLength":1,"pattern":"^(?!/)(?!.*(?:^|/)\\.\\.(?:/|$))[^\\u0000]+$"},
"sha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},
"approval":{"enum":["approved","candidate","unverified","rejected"]},
"uniqueStrings":{"type":"array","minItems":1,"uniqueItems":true,"items":{"$ref":"#/$defs/nonEmpty"}},
"formatProfiles":{"type":"array","minItems":1,"uniqueItems":true,"items":{"enum":["web_public","app_interactive","document_flow","pdf_fixed","deck_presentation","social_static"]}},
"audiences":{"type":"array","minItems":1,"uniqueItems":true,"items":{"enum":["internal_preview","internal_operational","client","public"]}},
"rights":{"type":"object","additionalProperties":false,"required":["status","publicationPermission","allowedAudiences","conditions"],"properties":{"status":{"enum":["public","licensed","internal","restricted","unknown"]},"publicationPermission":{"type":"boolean"},"allowedAudiences":{"type":"array","minItems":1,"uniqueItems":true,"items":{"enum":["internal_preview","internal_operational","client","public"]}},"conditions":{"type":["string","null"]}}},
"minimumSizeRecord":{"type":"object","additionalProperties":false,"required":["surface","axis","value","unit","evidenceRef"],"properties":{"surface":{"$ref":"#/$defs/nonEmpty"},"axis":{"enum":["width","height"]},"value":{"type":"number","minimum":0.01},"unit":{"enum":["css_px","px","mm","pt","in"]},"evidenceRef":{"$ref":"#/$defs/nonEmpty"}}},
"clearSpaceRecord":{"type":"object","additionalProperties":false,"required":["basis","minimumFactor","evidenceRef"],"properties":{"basis":{"$ref":"#/$defs/nonEmpty"},"minimumFactor":{"type":"number","minimum":0},"evidenceRef":{"$ref":"#/$defs/nonEmpty"}}},
"identityTypographyBinding":{
"type":"object",
"additionalProperties":false,
"required":["id","surface","formatProfile","renderingContext","platform","fontSourceKind","fontAssetIds","nativeMappingId","family","postScriptName","weight","style","size","minimumSize","sizeUnit","trackingEm","lineHeight","clearSpaceEm","substitutionAllowed","finalOutputPolicy","requiredFixtureIds"],
"properties":{
"id":{"type":"string","pattern":"^identity-typography\\."},
"surface":{"enum":["web_header","app_header","document_identity","pdf_identity","deck_identity","social_identity"]},
"formatProfile":{"enum":["web_public","app_interactive","document_flow","pdf_fixed","deck_presentation","social_static"]},
"renderingContext":{"enum":["browser","native_editable","fixed_export","raster_export"]},
"platform":{"anyOf":[{"enum":["browser","macos","windows"]},{"type":"null"}]},
"fontSourceKind":{"enum":["packaged_web_font","governed_native_mapping"]},
"fontAssetIds":{"type":"array","uniqueItems":true,"items":{"$ref":"#/$defs/nonEmpty"}},
"nativeMappingId":{"$ref":"#/$defs/nullableNonEmpty"},
"family":{"$ref":"#/$defs/nonEmpty"},
"postScriptName":{"$ref":"#/$defs/nullableNonEmpty"},
"weight":{"type":"integer","minimum":1,"maximum":1000},
"style":{"const":"normal"},
"size":{"type":"number","exclusiveMinimum":0},
"minimumSize":{"type":"number","exclusiveMinimum":0},
"sizeUnit":{"enum":["css_px","pt"]},
"trackingEm":{"type":"number","minimum":-0.05,"maximum":0.2},
"lineHeight":{"type":"number","minimum":1,"maximum":2},
"clearSpaceEm":{"type":"number","minimum":0.5},
"substitutionAllowed":{"const":false},
"finalOutputPolicy":{"enum":["live_text_exact_packaged_font","exact_native_font_live_text_and_embed_or_authorized_projection"]},
"requiredFixtureIds":{"$ref":"#/$defs/uniqueStrings"}
},
"allOf":[{"if":{"properties":{"fontSourceKind":{"const":"packaged_web_font"}},"required":["fontSourceKind"]},"then":{"properties":{"fontAssetIds":{"minItems":1},"nativeMappingId":{"type":"null"},"platform":{"const":"browser"},"sizeUnit":{"const":"css_px"},"postScriptName":{"type":"null"},"finalOutputPolicy":{"const":"live_text_exact_packaged_font"}}}},{"if":{"properties":{"fontSourceKind":{"const":"governed_native_mapping"}},"required":["fontSourceKind"]},"then":{"properties":{"fontAssetIds":{"maxItems":0},"nativeMappingId":{"$ref":"#/$defs/nonEmpty"},"platform":{"enum":["macos","windows"]},"sizeUnit":{"const":"pt"},"postScriptName":{"$ref":"#/$defs/nonEmpty"},"finalOutputPolicy":{"const":"exact_native_font_live_text_and_embed_or_authorized_projection"}}}}]
},
"nativeFontMapping":{
"type":"object",
"additionalProperties":false,
"required":["id","platform","allowedFormatProfiles","role","family","postScriptName","weight","style","substitutionAllowed","editableSourcePolicy","fixedExportPolicy","vectorProjectionPolicy","requiredFixtureIds"],
"properties":{"id":{"type":"string","pattern":"^fontmap\\.(?:macos|windows)\\."},"platform":{"enum":["macos","windows"]},"allowedFormatProfiles":{"$ref":"#/$defs/nonWebFormatProfiles"},"role":{"enum":["identity_latin","display_latin","display_thai","body_ui","body_ui_emphasis","technical_latin","technical_thai"]},"family":{"$ref":"#/$defs/nonEmpty"},"postScriptName":{"$ref":"#/$defs/nonEmpty"},"weight":{"type":"integer","minimum":1,"maximum":1000},"style":{"const":"normal"},"substitutionAllowed":{"const":false},"editableSourcePolicy":{"const":"exact_named_font_available_and_live_text_or_delivery_blocks"},"fixedExportPolicy":{"const":"embed_exact_font_or_use_approved_vector_projection_or_verified_raster_pixels"},"vectorProjectionPolicy":{"const":"approved_generated_vector_asset_with_exact_hash_only"},"requiredFixtureIds":{"$ref":"#/$defs/uniqueStrings"}}
},
"nonWebIconPolicy":{"type":"object","additionalProperties":false,"required":["policyId","defaultRepresentation","fontGlyphSubstitutionAllowed","vectorProjectionPolicy","editableSourcePolicy","fixedExportPolicy","requiredFixtureIds"],"properties":{"policyId":{"const":"icon-policy.non-web.visible-label.01"},"defaultRepresentation":{"const":"visible_text_label"},"fontGlyphSubstitutionAllowed":{"const":false},"vectorProjectionPolicy":{"const":"approved_generated_vector_asset_with_exact_hash_only"},"editableSourcePolicy":{"const":"retain_complete_visible_label; optional_icon_must_be_registered_vector"},"fixedExportPolicy":{"const":"retain_complete_visible_label; vector_icon_requires_exact_registered_hash_and_text_equivalent"},"requiredFixtureIds":{"$ref":"#/$defs/uniqueStrings"}}},
"nullableNonEmpty":{"anyOf":[{"$ref":"#/$defs/nonEmpty"},{"type":"null"}]},
"nonWebFormatProfiles":{"type":"array","minItems":1,"uniqueItems":true,"items":{"enum":["app_interactive","document_flow","pdf_fixed","deck_presentation","social_static"]}}
},
"$comment":"Resolved standalone LDS 0.9.7 contract, revision standalone-0.9.7-r1. The distribution is owner-approved and unsigned; this schema is not a release attestation. Historical source identities and hashes are recorded separately."
},
"build-card.schema.json":{
"$schema":"https://json-schema.org/draft/2020-12/schema",
"$id":"https://montri-th.github.io/Landometer/v0.9.7/standalone-0.9.7-r1/schemas/build-card.schema.json",
"title":"Landometer Design System 0.9.7 Build Card — standalone-0.9.7-r1",
"description":"Author-supplied intent and resolver-supplied configuration for one design output under the current standalone 0.9.7 resolved-only audience contract. Owner-approved distribution does not establish signed artifact conformance.",
"type":"object",
"additionalProperties":false,
"required":["schemaVersion","releaseRef","artifact","authority","experience","locale","output","composition","navigation","identityImplementation","actions","capabilities","capabilityConfigRefs","publication","privacySecurity","audienceOutput","assumptions","assetRegistries","assets","qa"],
"properties":{
"schemaVersion":{"const":"0.9.3.2"},
"releaseRef":{"const":"v0.9.7-owner.1"},
"artifact":{"$ref":"#/$defs/artifact"},
"authority":{"$ref":"#/$defs/authority"},
"experience":{"$ref":"#/$defs/experience"},
"locale":{"$ref":"#/$defs/locale"},
"output":{"$ref":"#/$defs/output"},
"composition":{"$ref":"#/$defs/composition"},
"navigation":{"$ref":"#/$defs/navigation"},
"identityImplementation":{"$ref":"#/$defs/identityImplementation"},
"actions":{"type":"array","items":{"$ref":"#/$defs/action"},"minItems":1,"maxItems":12,"contains":{"type":"object","properties":{"priority":{"const":"primary"}},"required":["priority"]},"minContains":1,"maxContains":1},
"capabilities":{"type":"array","items":{"$ref":"#/$defs/capability"},"uniqueItems":true},
"capabilityConfigRefs":{"$ref":"#/$defs/capabilityConfigRefs"},
"publication":{"$ref":"#/$defs/publication"},
"privacySecurity":{"$ref":"#/$defs/privacySecurity"},
"audienceOutput":{"$ref":"#/$defs/audienceOutput"},
"assumptions":{"type":"array","items":{"$ref":"#/$defs/assumption"},"uniqueItems":true},
"assetRegistries":{"type":"array","items":{"$ref":"#/$defs/assetRegistryBinding"},"uniqueItems":true},
"assets":{"type":"array","items":{"$ref":"#/$defs/asset"}},
"qa":{"$ref":"#/$defs/qa"},
"resolved":{"$ref":"#/$defs/resolved","readOnly":true}
},
"allOf":[
{"if":{"properties":{"artifact":{"properties":{"productScope":{"const":"shared_landometer"}},"required":["productScope"]}},"required":["artifact"]},"then":{"properties":{"artifact":{"not":{"required":["namedProduct"]}}}}},
{"if":{"properties":{"output":{"properties":{"targetProfileRef":{"enum":["target.web.responsive.360-1600.01","target.app.browser-responsive.360-1600.01"]},"runtime":{"const":"browser"}},"required":["targetProfileRef","runtime"]}},"required":["output"]},"then":{"properties":{"navigation":{"properties":{"controlBudgets":{"properties":{"minimumDirectTarget":{"const":{"value":44,"unit":"css_px"}}}}}}}}},
{"if":{"properties":{"output":{"properties":{"targetProfileRef":{"const":"target.app.native-responsive.360-1280.01"},"runtime":{"const":"native"}},"required":["targetProfileRef","runtime"]}},"required":["output"]},"then":{"properties":{"navigation":{"properties":{"controlBudgets":{"properties":{"minimumDirectTarget":{"const":{"value":44,"unit":"platform_dp"}}}}}}}}},
{"if":{"properties":{"experience":{"properties":{"ctaDiscoveryCueAssignments":{"minItems":1}},"required":["ctaDiscoveryCueAssignments"]}},"required":["experience"]},"then":{"properties":{"output":{"properties":{"formatProfile":{"enum":["web_public","app_interactive"]},"runtime":{"const":"browser"},"interactive":{"const":true}},"required":["formatProfile","runtime","interactive"]}}}},
{"if":{"properties":{"capabilities":{"contains":{"const":"motion"}}},"required":["capabilities"]},"then":{"properties":{"experience":{"required":["motionDecision","motionBenefit","motionAssignments"],"properties":{"motionDecision":{"const":"assigned"},"motionBenefit":{"minItems":1},"motionAssignments":{"minItems":1}}}}},"else":{"properties":{"experience":{"required":["motionDecision","motionAssignments","noMotionReason"],"properties":{"motionDecision":{"const":"no_motion"},"motionBenefit":{"maxItems":0},"motionAssignments":{"maxItems":0}}}}}},
{"if":{"properties":{"capabilities":{"contains":{"const":"motion"}},"output":{"properties":{"formatProfile":{"enum":["web_public","app_interactive"]},"runtime":{"const":"browser"}},"required":["formatProfile","runtime"]}},"required":["capabilities","output"]},"then":{"properties":{"experience":{"properties":{"motionAssignments":{"items":{"required":["reducedMotion","observerFailure"],"allOf":[{"not":{"required":["nativeInterruption"]}},{"not":{"required":["presenterSkip"]}}]}}}}}}},
{"if":{"properties":{"capabilities":{"contains":{"const":"motion"}},"output":{"properties":{"formatProfile":{"const":"app_interactive"},"runtime":{"const":"native"}},"required":["formatProfile","runtime"]}},"required":["capabilities","output"]},"then":{"properties":{"experience":{"properties":{"motionAssignments":{"items":{"required":["reducedMotion","nativeInterruption"],"allOf":[{"not":{"required":["observerFailure"]}},{"not":{"required":["presenterSkip"]}}]}}}}}}},
{"if":{"properties":{"capabilities":{"contains":{"const":"motion"}},"output":{"properties":{"formatProfile":{"const":"deck_presentation"},"runtime":{"const":"static"}},"required":["formatProfile","runtime"]}},"required":["capabilities","output"]},"then":{"properties":{"experience":{"properties":{"motionAssignments":{"items":{"required":["presenterSkip"],"allOf":[{"not":{"required":["reducedMotion"]}},{"not":{"required":["observerFailure"]}},{"not":{"required":["nativeInterruption"]}}]}}}}}}},
{"if":{"properties":{"capabilities":{"contains":{"const":"claims"}}},"required":["capabilities"]},"then":{"properties":{"publication":{"required":["claimManifestRef","claimManifestSha256","claimAsOf"]}}}},
{"if":{"anyOf":[{"properties":{"output":{"properties":{"formatProfile":{"const":"web_public"},"runtime":{"const":"browser"}},"required":["formatProfile","runtime"]}},"required":["output"]},{"properties":{"output":{"properties":{"formatProfile":{"const":"app_interactive"},"runtime":{"const":"browser"}},"required":["formatProfile","runtime"]}},"required":["output"]}]},"then":{"properties":{"publication":{"required":["discovery"]}}},"else":{"properties":{"publication":{"not":{"required":["discovery"]}}}}},
{"if":{"properties":{"output":{"properties":{"formatProfile":{"const":"web_public"}},"required":["formatProfile"]}},"required":["output"]},"then":{"properties":{"output":{"properties":{"runtime":{"const":"browser"},"interactive":{"const":true},"targetProfileRef":{"const":"target.web.responsive.360-1600.01"}},"required":["interactive"],"not":{"required":["formatContext"]}},"navigation":{"properties":{"mode":{"enum":["none","site","product"]}}}}}},
{"if":{"properties":{"output":{"properties":{"formatProfile":{"const":"app_interactive"}},"required":["formatProfile"]}},"required":["output"]},"then":{"properties":{"output":{"properties":{"runtime":{"enum":["browser","native"]}}}}}},
{"if":{"properties":{"output":{"properties":{"formatProfile":{"const":"app_interactive"},"runtime":{"const":"browser"}},"required":["formatProfile","runtime"]}},"required":["output"]},"then":{"properties":{"output":{"properties":{"interactive":{"const":true},"targetProfileRef":{"const":"target.app.browser-responsive.360-1600.01"}},"required":["interactive"],"not":{"required":["formatContext"]}},"navigation":{"properties":{"mode":{"enum":["none","site","product"]}}}}}},
{"if":{"properties":{"output":{"properties":{"formatProfile":{"const":"app_interactive"},"runtime":{"const":"native"}},"required":["formatProfile","runtime"]}},"required":["output"]},"then":{"properties":{"output":{"properties":{"interactive":{"const":true},"targetProfileRef":{"const":"target.app.native-responsive.360-1280.01"}},"required":["interactive"],"not":{"required":["formatContext"]}},"navigation":{"properties":{"mode":{"enum":["none","site","product"]}}}}}},
{"if":{"properties":{"output":{"properties":{"formatProfile":{"enum":["document_flow","pdf_fixed","deck_presentation","social_static"]}},"required":["formatProfile"]}},"required":["output"]},"then":{"properties":{"output":{"properties":{"runtime":{"const":"static"},"interactive":{"const":false}},"required":["interactive"]}}}},
{"if":{"properties":{"output":{"properties":{"formatProfile":{"const":"document_flow"}},"required":["formatProfile"]}},"required":["output"]},"then":{"properties":{"output":{"properties":{"targetProfileRef":{"const":"target.document.a4-portrait.01"}},"not":{"required":["formatContext"]}},"navigation":{"properties":{"mode":{"enum":["none","document"]}}}}}},
{"if":{"properties":{"output":{"properties":{"formatProfile":{"const":"pdf_fixed"}},"required":["formatProfile"]}},"required":["output"]},"then":{"properties":{"output":{"properties":{"targetProfileRef":{"const":"target.pdf.a4-portrait.01"}},"not":{"required":["formatContext"]}},"navigation":{"properties":{"mode":{"enum":["none","document"]}}}}}},
{"if":{"properties":{"output":{"properties":{"formatProfile":{"const":"deck_presentation"}},"required":["formatProfile"]}},"required":["output"]},"then":{"properties":{"output":{"properties":{"targetProfileRef":{"const":"target.deck.16x9.01"},"formatContext":{"$ref":"#/$defs/deckFormatContext"}},"required":["formatContext"]},"navigation":{"properties":{"mode":{"enum":["none","deck"]}}}}}},
{"if":{"properties":{"output":{"properties":{"formatProfile":{"const":"social_static"}},"required":["formatProfile"]}},"required":["output"]},"then":{"properties":{"output":{"properties":{"targetProfileRef":{"enum":["target.social.square.1080.01","target.social.og.1200x630.01"]},"formatContext":{"$ref":"#/$defs/socialFormatContext"}},"required":["formatContext"]},"navigation":{"properties":{"mode":{"const":"none"}}}}}},
{"if":{"properties":{"output":{"properties":{"formatProfile":{"enum":["web_public","app_interactive"]}},"required":["formatProfile"]}},"required":["output"]},"then":{"properties":{"navigation":{"properties":{"destinations":{"items":{"required":["breakpointExposure"],"not":{"required":["staticExposure"]}}}}}}}},
{"if":{"properties":{"output":{"properties":{"formatProfile":{"enum":["document_flow","pdf_fixed","deck_presentation","social_static"]}},"required":["formatProfile"]}},"required":["output"]},"then":{"properties":{"navigation":{"not":{"required":["controlBudgets"]},"properties":{"destinations":{"items":{"required":["staticExposure"],"not":{"required":["breakpointExposure"]}}}}}}}},
{"if":{"properties":{"output":{"properties":{"formatProfile":{"const":"document_flow"}},"required":["formatProfile"]}},"required":["output"]},"then":{"properties":{"navigation":{"properties":{"destinations":{"items":{"properties":{"staticExposure":{"enum":["toc","destination_cue","not_exposed"]}}}}}}}}},
{"if":{"properties":{"output":{"properties":{"formatProfile":{"const":"pdf_fixed"}},"required":["formatProfile"]}},"required":["output"]},"then":{"properties":{"navigation":{"properties":{"destinations":{"items":{"properties":{"staticExposure":{"enum":["pdf_bookmark","destination_cue","not_exposed"]}}}}}}}}},
{"if":{"properties":{"output":{"properties":{"formatProfile":{"const":"deck_presentation"}},"required":["formatProfile"]}},"required":["output"]},"then":{"properties":{"navigation":{"properties":{"destinations":{"items":{"properties":{"staticExposure":{"enum":["deck_section_marker","destination_cue","not_exposed"]}}}}}}}}},
{"if":{"properties":{"output":{"properties":{"formatProfile":{"const":"document_flow"}},"required":["formatProfile"]},"navigation":{"properties":{"sideBookmark":{"const":"selected"}},"required":["sideBookmark"]}},"required":["output","navigation"]},"then":{"properties":{"navigation":{"properties":{"destinations":{"contains":{"properties":{"kind":{"const":"anchor"},"staticExposure":{"const":"toc"}},"required":["kind","staticExposure"]},"minContains":2}}}}}},
{"if":{"properties":{"output":{"properties":{"formatProfile":{"const":"pdf_fixed"}},"required":["formatProfile"]},"navigation":{"properties":{"sideBookmark":{"const":"selected"}},"required":["sideBookmark"]}},"required":["output","navigation"]},"then":{"properties":{"navigation":{"properties":{"destinations":{"contains":{"properties":{"kind":{"const":"anchor"},"staticExposure":{"const":"pdf_bookmark"}},"required":["kind","staticExposure"]},"minContains":2}}}}}},
{"if":{"properties":{"output":{"properties":{"formatProfile":{"const":"deck_presentation"}},"required":["formatProfile"]},"navigation":{"properties":{"sideBookmark":{"const":"selected"}},"required":["sideBookmark"]}},"required":["output","navigation"]},"then":{"properties":{"navigation":{"properties":{"destinations":{"contains":{"properties":{"kind":{"const":"anchor"},"staticExposure":{"const":"deck_section_marker"}},"required":["kind","staticExposure"]},"minContains":2}}}}}},
{"if":{"properties":{"navigation":{"properties":{"sideBookmark":{"const":"selected"}},"required":["sideBookmark"]}},"required":["navigation"]},"then":{"properties":{"output":{"properties":{"formatProfile":{"enum":["web_public","app_interactive","document_flow","pdf_fixed","deck_presentation"]}}},"composition":{"required":["sideBookmarkEligible"],"properties":{"sideBookmarkEligible":{"const":true},"sections":{"minItems":2},"componentIds":{"contains":{"const":"component.bookmark.side.01"},"minContains":1,"maxContains":1}}},"navigation":{"properties":{"destinations":{"contains":{"type":"object","properties":{"level":{"const":"page"},"kind":{"const":"anchor"},"group":{"const":"page_local"}},"required":["level","kind","group"]},"minContains":2}}}}},"else":{"properties":{"composition":{"properties":{"componentIds":{"not":{"contains":{"const":"component.bookmark.side.01"}}}}}}}},
{"if":{"properties":{"output":{"properties":{"formatProfile":{"const":"social_static"}},"required":["formatProfile"]}},"required":["output"]},"then":{"properties":{"navigation":{"properties":{"sideBookmark":{"const":"omitted"}}}}}},
{"if":{"properties":{"output":{"properties":{"formatProfile":{"enum":["web_public","app_interactive"]}},"required":["formatProfile"]},"navigation":{"properties":{"sideBookmark":{"const":"selected"}},"required":["sideBookmark"]}},"required":["output","navigation"]},"then":{"properties":{"navigation":{"properties":{"destinations":{"contains":{"type":"object","properties":{"level":{"const":"page"},"kind":{"const":"anchor"},"group":{"const":"page_local"},"breakpointExposure":{"type":"object","properties":{"desktop":{"const":"side_bookmark"},"mobile":{"const":"disclosure"}},"required":["desktop","mobile"]}},"required":["level","kind","group","breakpointExposure"]},"minContains":2}}}}}},
{"if":{"properties":{"output":{"properties":{"formatProfile":{"enum":["web_public","app_interactive"]}},"required":["formatProfile"]},"navigation":{"properties":{"mode":{"not":{"const":"none"}}},"required":["mode"]}},"required":["output","navigation"]},"then":{"properties":{"navigation":{"properties":{"destinations":{"allOf":[{"contains":{"type":"object","properties":{"current":{"const":"page"}},"required":["current"]},"minContains":1,"maxContains":1},{"contains":{"type":"object","properties":{"current":{"const":"location"}},"required":["current"]},"minContains":0,"maxContains":1}]}}}}}},
{"if":{"properties":{"output":{"properties":{"formatProfile":{"enum":["web_public","app_interactive"]}},"required":["formatProfile"]},"navigation":{"properties":{"sideBookmark":{"const":"selected"}},"required":["sideBookmark"]}},"required":["output","navigation"]},"then":{"properties":{"navigation":{"properties":{"destinations":{"contains":{"type":"object","properties":{"kind":{"const":"anchor"},"group":{"const":"page_local"},"current":{"const":"location"}},"required":["kind","group","current"]},"minContains":1,"maxContains":1}}}}}},
{"if":{"properties":{"output":{"properties":{"formatProfile":{"enum":["document_flow","pdf_fixed","deck_presentation","social_static"]}},"required":["formatProfile"]}},"required":["output"]},"then":{"properties":{"navigation":{"properties":{"destinations":{"items":{"properties":{"current":{"const":"none"}},"required":["current"]}}}}}}}
],
"$defs":{
"nonEmpty":{"type":"string","minLength":1,"pattern":"\\S"},
"httpsUrl":{"type":"string","pattern":"^https://[^\\s]+$"},
"sha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},
"protectedLineRoleOrNull":{"enum":["north_star","promise","cultural_activation",null]},
"safeRef":{"type":"string","minLength":1,"pattern":"^(?!/)(?!.*(?:^|/)\\.\\.(?:/|$))[^\\u0000]+$"},
"assetRegistryBinding":{"type":"object","additionalProperties":false,"required":["registryRef","sha256","schemaRef"],"properties":{"registryRef":{"$ref":"#/$defs/safeRef"},"sha256":{"$ref":"#/$defs/sha256"},"schemaRef":{"const":"https://montri-th.github.io/Landometer/v0.9.7/standalone-0.9.7-r1/schemas/asset-registry.schema.json"}}},
"capabilityConfigBinding":{"type":"object","additionalProperties":false,"required":["ref","sha256","schemaRef"],"properties":{"ref":{"$ref":"#/$defs/safeRef"},"sha256":{"$ref":"#/$defs/sha256"},"schemaRef":{"$ref":"#/$defs/nonEmpty"}}},
"typedActionContractBinding":{"type":"object","additionalProperties":false,"required":["ref","sha256","schemaRef","schemaSha256"],"properties":{"ref":{"$ref":"#/$defs/safeRef"},"sha256":{"$ref":"#/$defs/sha256"},"schemaRef":{"$ref":"#/$defs/nonEmpty"},"schemaSha256":{"$ref":"#/$defs/sha256"}}},
"typedSchemaBinding":{"type":"object","additionalProperties":false,"required":["ref","sha256","schemaId"],"properties":{"ref":{"$ref":"#/$defs/safeRef"},"sha256":{"$ref":"#/$defs/sha256"},"schemaId":{"$ref":"#/$defs/nonEmpty"}}},
"artifact":{"type":"object","additionalProperties":false,"required":["id","title","owner","portfolioDomain","productScope","primaryJob"],"properties":{"id":{"type":"string","pattern":"^[a-z0-9][a-z0-9._-]{2,79}$"},"title":{"$ref":"#/$defs/nonEmpty"},"owner":{"$ref":"#/$defs/nonEmpty"},"portfolioDomain":{"enum":["shared","land","location","living"]},"productScope":{"enum":["shared_landometer","named_product"]},"namedProduct":{"$ref":"#/$defs/nonEmpty"},"primaryJob":{"$ref":"#/$defs/nonEmpty"},"contentRelease":{"$ref":"#/$defs/nonEmpty"},"artifactBuild":{"$ref":"#/$defs/nonEmpty"}},"allOf":[{"if":{"properties":{"mode":{"not":{"const":"none"}}},"required":["mode"]},"then":{"properties":{"destinations":{"minItems":1}}}},{"if":{"type":"object","properties":{"productScope":{"const":"named_product"}},"required":["productScope"]},"then":{"required":["namedProduct"]}}]},
"authority":{"type":"object","additionalProperties":false,"required":["contentSource","evidenceBoundary","claimOwner","evidenceRefs","productBoundary"],"properties":{"contentSource":{"type":"array","minItems":1,"items":{"$ref":"#/$defs/nonEmpty"}},"evidenceBoundary":{"$ref":"#/$defs/nonEmpty"},"claimOwner":{"$ref":"#/$defs/nonEmpty"},"evidenceRefs":{"type":"array","items":{"$ref":"#/$defs/nonEmpty"},"uniqueItems":true},"productBoundary":{"type":"object","additionalProperties":false,"required":["sharedCapabilities","productSpecificCapabilities"],"properties":{"sharedCapabilities":{"type":"array","items":{"$ref":"#/$defs/nonEmpty"},"uniqueItems":true},"productSpecificCapabilities":{"type":"array","items":{"$ref":"#/$defs/nonEmpty"},"uniqueItems":true}}},"schemaRelease":{"$ref":"#/$defs/nonEmpty"},"comparisonPolicy":{"enum":["not_applicable","same_schema_release","incompatibility_disclosed"]}}},
"experience":{
"type":"object",
"additionalProperties":false,
"required":["profile","audience","entryQuestion","desiredOutcome","readingOrder","dominantObjectRef","firstAha","firstAhaEvidenceRef","prerequisitesBeforeAha","cleanCompletion","primaryActionRef","nextUsefulActionRef","motionDecision","motionAssignments","ctaDiscoveryCueAssignments"],
"properties":{
"profile":{"enum":["portfolio_orientation","methodology_learning","product_orientation","evidence_report","interactive_task","editorial_place_story","adoption_change","campaign"]},
"secondaryProfiles":{"type":"array","maxItems":2,"items":{"enum":["portfolio_orientation","methodology_learning","product_orientation","evidence_report","interactive_task","editorial_place_story","adoption_change","campaign"]},"uniqueItems":true},
"audience":{"type":"array","minItems":1,"items":{"$ref":"#/$defs/nonEmpty"}},
"entryQuestion":{"$ref":"#/$defs/nonEmpty"},
"desiredOutcome":{"$ref":"#/$defs/nonEmpty"},
"dominantObjectRef":{"$ref":"#/$defs/nonEmpty"},
"firstAha":{"$ref":"#/$defs/nonEmpty"},
"firstAhaEvidenceRef":{"$ref":"#/$defs/nonEmpty"},
"prerequisitesBeforeAha":{"type":"array","items":{"$ref":"#/$defs/nonEmpty"},"uniqueItems":true},
"cleanCompletion":{"$ref":"#/$defs/nonEmpty"},
"primaryActionRef":{"$ref":"#/$defs/nonEmpty"},
"nextUsefulActionRef":{"$ref":"#/$defs/nonEmpty"},
"readingOrder":{"type":"array","minItems":1,"items":{"type":"object","additionalProperties":false,"required":["kind","ref"],"properties":{"kind":{"enum":["section","action","component"]},"ref":{"$ref":"#/$defs/nonEmpty"}}},"uniqueItems":true},
"urgency":{"enum":["calm","standard","urgent"]},
"motionBenefit":{"type":"array","items":{"enum":["state","sequence","progress","spatial_relationship","cause_and_effect"]},"uniqueItems":true},
"motionDecision":{"enum":["assigned","no_motion"]},
"motionAssignments":{"type":"array","items":{"$ref":"#/$defs/motionAssignment"},"uniqueItems":true,"maxItems":24},
"ctaDiscoveryCueAssignments":{"type":"array","items":{"$ref":"#/$defs/ctaDiscoveryCueAssignment"},"uniqueItems":true,"maxItems":1},
"noMotionReason":{"$ref":"#/$defs/nonEmpty"},
"motionMoments":{"type":"array","maxItems":3,"uniqueItems":true,"items":{"$ref":"#/$defs/motionMoment"},"description":"MOTIF-04 joy budget: at most three motion moments per route, one per task surface; each moment names kind, job (allowedJobs of the kind), beat, variant and its MOTIF-06 host surface"},
"staticMotifPlacements":{"type":"array","uniqueItems":true,"items":{"$ref":"#/$defs/staticMotifPlacement"},"description":"MOTIF-06: static final-state motif placements (web, deck, PDF, social) with their carriers"},
"productOverlayRefs":{"type":"array","uniqueItems":true,"items":{"type":"string"},"description":"ids from motif-register.v0.9.7.json#/productOverlays used by this artifact (MOTIF-05)"}
},
"allOf":[{"if":{"properties":{"motionDecision":{"const":"assigned"}},"required":["motionDecision"]},"then":{"required":["motionBenefit"],"properties":{"motionBenefit":{"minItems":1},"motionAssignments":{"minItems":1}},"not":{"required":["noMotionReason"]}},"else":{"required":["noMotionReason"],"properties":{"motionBenefit":{"maxItems":0},"motionAssignments":{"maxItems":0},"ctaDiscoveryCueAssignments":{"maxItems":0}}}}]
},
"motionAssignment":{"type":"object","additionalProperties":false,"required":["subject","role","benefit","protectedRole","initialVisibility","layoutGeometry","staticFallback"],"properties":{"subject":{"type":"string","pattern":"^[a-z][a-z0-9-]*$"},"role":{"enum":["section_opener","peer_group","paired_inline","proof_preview","contact_group"]},"benefit":{"enum":["state","sequence","progress","spatial_relationship","cause_and_effect"]},"protectedRole":{"enum":["none","hero","lcp_media","page_title","first_answer","primary_proof","primary_action","task_critical","status","focus_target","deep_link_target"]},"initialVisibility":{"const":"visible"},"layoutGeometry":{"const":"stable"},"staticFallback":{"const":"final_state"},"reducedMotion":{"const":"final_state"},"observerFailure":{"const":"final_state"},"nativeInterruption":{"const":"final_state"},"presenterSkip":{"const":"final_state"}}},
"ctaDiscoveryCueAssignment":{"type":"object","additionalProperties":false,"required":["actionRef","recipeRef","requiredUserBenefit","rationale","trigger","repeatCountPerPageLoad","reducedMotion","observerFailure","staticEquivalent"],"properties":{"actionRef":{"type":"string","pattern":"^[a-z][a-z0-9-]*$"},"recipeRef":{"const":"tokens.v0.9.7.json#/motion/ctaDiscoveryCue"},"requiredUserBenefit":{"const":"discoverability"},"rationale":{"$ref":"#/$defs/nonEmpty"},"trigger":{"const":"first_visible_entry"},"repeatCountPerPageLoad":{"const":1},"reducedMotion":{"const":"no_cue_final_state"},"observerFailure":{"const":"no_cue_final_state"},"staticEquivalent":{"const":"emphasis_without_motion"}}},
"locale":{"type":"object","additionalProperties":false,"required":["primary","available","states"],"properties":{"primary":{"type":"string","pattern":"^[a-z]{2}(-[A-Z]{2})?$"},"available":{"type":"array","minItems":1,"items":{"type":"string","pattern":"^[a-z]{2}(-[A-Z]{2})?$"},"uniqueItems":true},"states":{"type":"array","minItems":1,"items":{"type":"object","additionalProperties":false,"required":["locale","status"],"properties":{"locale":{"type":"string","pattern":"^[a-z]{2}(-[A-Z]{2})?$"},"status":{"enum":["source","reviewed_translation","draft_translation","single_locale"]}}}},"languageLinks":{"type":"boolean"}}},
"output":{"type":"object","additionalProperties":false,"required":["formatProfile","runtime","delivery","targetProfileRef"],"properties":{"formatProfile":{"enum":["web_public","app_interactive","document_flow","pdf_fixed","deck_presentation","social_static"]},"runtime":{"enum":["browser","native","static"]},"delivery":{"enum":["screen","print","hybrid"]},"targetProfileRef":{"$ref":"#/$defs/nonEmpty"},"viewportOrPage":{"type":"string","description":"Human-readable summary only; machine geometry resolves from targetProfileRef."},"channel":{"type":"string"},"interactive":{"type":"boolean"},"offlineRequired":{"type":"boolean"},"formatContext":{"oneOf":[{"$ref":"#/$defs/deckFormatContext"},{"$ref":"#/$defs/socialFormatContext"}]}}},
"deckFormatContext":{"type":"object","additionalProperties":false,"required":["kind","audienceSituation","roomType","screenDiagonalInches","viewingDistanceMeters","durationMinutes","presentationMode"],"properties":{"kind":{"const":"deck_context"},"audienceSituation":{"enum":["in_room","remote","self_guided","hybrid"]},"roomType":{"enum":["meeting_room","conference_room","auditorium","remote_screen","self_guided_screen"]},"screenDiagonalInches":{"type":"number","exclusiveMinimum":0},"viewingDistanceMeters":{"type":"number","exclusiveMinimum":0},"durationMinutes":{"type":"number","exclusiveMinimum":0},"presentationMode":{"enum":["presenter_led","self_guided","hybrid"]}}},
"socialFormatContext":{"type":"object","additionalProperties":false,"required":["kind","channel","campaignId","expiresAt"],"properties":{"kind":{"const":"social_context"},"channel":{"$ref":"#/$defs/nonEmpty"},"campaignId":{"type":"string","pattern":"^[a-z][a-z0-9.-]*$"},"expiresAt":{"oneOf":[{"type":"string","format":"date-time"},{"type":"null"}]}}},
"composition":{"type":"object","additionalProperties":false,"required":["headlineRole","density","sections","componentIds"],"properties":{"headlineRole":{"enum":["north_star","promise","cultural_activation","ecosystem","product_loop","product_specific","editorial"]},"density":{"enum":["spacious","standard","dense"]},"sections":{"type":"array","minItems":1,"items":{"type":"object","additionalProperties":false,"required":["id","purpose"],"properties":{"id":{"type":"string","pattern":"^[a-z][a-z0-9-]*$"},"purpose":{"$ref":"#/$defs/nonEmpty"},"claimIds":{"type":"array","items":{"type":"string"},"uniqueItems":true}}}},"componentIds":{"type":"array","minItems":1,"uniqueItems":true,"items":{"type":"string","pattern":"^component\\.[a-z0-9.-]+$"}},"sideBookmarkEligible":{"type":"boolean"}}},
"navigation":{
"type":"object",
"additionalProperties":false,
"required":["mode","destinations","brandDestinationRef","sideBookmark","sideBookmarkUserBenefit"],
"properties":{"mode":{"enum":["none","site","product","document","deck"]},"destinations":{"type":"array","items":{"$ref":"#/$defs/navigationDestination"},"uniqueItems":true},"controlBudgets":{"$ref":"#/$defs/navigationControlBudgets"},"brandDestinationRef":{"anyOf":[{"$ref":"#/$defs/nonEmpty"},{"type":"null"}]},"sideBookmark":{"enum":["selected","omitted"]},"sideBookmarkUserBenefit":{"anyOf":[{"$ref":"#/$defs/nonEmpty"},{"type":"null"}]}},
"allOf":[
{"if":{"properties":{"mode":{"enum":["site","product"]}},"required":["mode"]},"then":{"required":["controlBudgets"],"properties":{"destinations":{"minItems":1,"items":{"properties":{"breakpointExposure":{"properties":{"desktop":{"not":{"const":"not_applicable"}},"mobile":{"not":{"const":"not_applicable"}}}}}},"allOf":[{"contains":{"type":"object","properties":{"breakpointExposure":{"type":"object","properties":{"desktop":{"const":"header"}},"required":["desktop"]}},"required":["breakpointExposure"]},"minContains":0,"maxContains":4},{"contains":{"type":"object","properties":{"breakpointExposure":{"type":"object","properties":{"mobile":{"const":"header"}},"required":["mobile"]}},"required":["breakpointExposure"]},"minContains":0,"maxContains":2}]}}}},
{"if":{"properties":{"sideBookmark":{"const":"selected"}},"required":["sideBookmark"]},"then":{"properties":{"destinations":{"minItems":2},"sideBookmarkUserBenefit":{"$ref":"#/$defs/nonEmpty"}}}},
{"if":{"properties":{"sideBookmark":{"const":"omitted"}},"required":["sideBookmark"]},"then":{"properties":{"sideBookmarkUserBenefit":{"type":"null"}}}},
{"if":{"properties":{"mode":{"enum":["site","product"]}},"required":["mode"]},"then":{"properties":{"brandDestinationRef":{"$ref":"#/$defs/nonEmpty"},"destinations":{"contains":{"type":"object","properties":{"role":{"const":"brand"}},"required":["role"]},"minContains":1,"maxContains":1}}}},
{"if":{"properties":{"mode":{"const":"none"}},"required":["mode"]},"then":{"properties":{"destinations":{"maxItems":0},"sideBookmark":{"const":"omitted"},"brandDestinationRef":{"type":"null"},"sideBookmarkUserBenefit":{"type":"null"}},"not":{"required":["controlBudgets"]}}}
]
},
"navigationDestination":{
"type":"object",
"additionalProperties":false,
"required":["id","role","label","labelByLocale","target","level","kind","group","current"],
"properties":{
"id":{"type":"string","pattern":"^destination\\.[a-z0-9.-]+$"},
"role":{"enum":["brand","primary","page_local","utility"]},
"label":{"$ref":"#/$defs/nonEmpty"},
"labelByLocale":{"type":"object","additionalProperties":{"$ref":"#/$defs/nonEmpty"},"minProperties":1},
"compactLabel":{"$ref":"#/$defs/nonEmpty"},
"compactLabelByLocale":{"type":"object","additionalProperties":{"$ref":"#/$defs/nonEmpty"},"minProperties":1},
"target":{"$ref":"#/$defs/nonEmpty"},
"level":{"enum":["ecosystem","property","page"]},
"kind":{"enum":["route","anchor","external"]},
"group":{"enum":["primary","ecosystem","page_local","utility"]},
"breakpointExposure":{"type":"object","additionalProperties":false,"required":["desktop","mobile"],"properties":{"desktop":{"enum":["header","disclosure","side_bookmark","not_exposed","not_applicable"]},"mobile":{"enum":["header","disclosure","not_exposed","not_applicable"]}}},
"staticExposure":{"enum":["toc","pdf_bookmark","deck_section_marker","destination_cue","not_exposed"]},
"current":{"enum":["none","page","location"]}
},
"allOf":[{"if":{"properties":{"kind":{"const":"anchor"}},"required":["kind"]},"then":{"properties":{"target":{"pattern":"^#[a-z][a-z0-9-]*$"},"level":{"const":"page"},"group":{"const":"page_local"},"current":{"enum":["none","location"]}}}},{"if":{"properties":{"kind":{"const":"route"}},"required":["kind"]},"then":{"properties":{"current":{"enum":["none","page"]}}}},{"if":{"properties":{"kind":{"const":"external"}},"required":["kind"]},"then":{"properties":{"target":{"$ref":"#/$defs/httpsUrl"},"current":{"const":"none"}}}}]
},
"navigationControlBudgets":{"type":"object","additionalProperties":false,"required":["desktop","mobile","minimumDirectTarget"],"properties":{"desktop":{"type":"object","additionalProperties":false,"required":["brandRequired","maxControls"],"properties":{"brandRequired":{"const":true},"maxControls":{"const":4}}},"mobile":{"type":"object","additionalProperties":false,"required":["brandRequired","maxControls"],"properties":{"brandRequired":{"const":true},"maxControls":{"const":2}}},"minimumDirectTarget":{"type":"object","additionalProperties":false,"required":["value","unit"],"properties":{"value":{"const":44},"unit":{"enum":["css_px","platform_dp"]}}}}},
"action":{
"type":"object",
"additionalProperties":false,
"required":["id","intent","priority","label","outcome","destinationBinding","availability","consequence","confirmation"],
"properties":{
"id":{"type":"string","pattern":"^[a-z][a-z0-9-]*$"},
"intent":{"enum":["navigate","inspect","submit","create","save","share","download","external_handoff","draft","confirm","destructive"]},
"priority":{"enum":["primary","secondary","quiet","utility"]},
"label":{"$ref":"#/$defs/nonEmpty"},
"compactLabel":{"$ref":"#/$defs/nonEmpty"},
"labelByLocale":{"type":"object","additionalProperties":{"$ref":"#/$defs/nonEmpty"},"minProperties":1},
"compactLabelByLocale":{"type":"object","additionalProperties":{"$ref":"#/$defs/nonEmpty"},"minProperties":1},
"outcome":{"$ref":"#/$defs/nonEmpty"},
"outcomeByLocale":{"type":"object","additionalProperties":{"$ref":"#/$defs/nonEmpty"},"minProperties":1},
"destinationBinding":{"$ref":"#/$defs/actionDestinationBinding"},
"availability":{"enum":["available","requires_permission","planned","unavailable"]},
"availabilityReason":{"$ref":"#/$defs/nonEmpty"},
"availabilityReasonByLocale":{"type":"object","additionalProperties":{"$ref":"#/$defs/nonEmpty"},"minProperties":1},
"consequence":{"type":"object","additionalProperties":false,"required":["class","external","cost","reversible"],"properties":{"class":{"enum":["none","reversible","irreversible","destructive"]},"external":{"type":"boolean"},"cost":{"enum":["none","possible","known"]},"reversible":{"type":"boolean"}}},
"confirmation":{"enum":["none","explicit","step_up"]},
"permissionContract":{"$ref":"#/$defs/typedActionContractBinding"},
"progressPresentationContract":{"$ref":"#/$defs/typedActionContractBinding"},
"resultPresentationContract":{"$ref":"#/$defs/typedActionContractBinding"},
"recoveryContract":{"$ref":"#/$defs/typedActionContractBinding"},
"receiptSchemaBinding":{"$ref":"#/$defs/typedSchemaBinding"}
},
"allOf":[
{"if":{"type":"object","properties":{"availability":{"const":"requires_permission"}},"required":["availability"]},"then":{"required":["permissionContract"]}},
{"if":{"type":"object","properties":{"availability":{"enum":["planned","unavailable"]}},"required":["availability"]},"then":{"properties":{"priority":{"not":{"const":"primary"}}},"required":["availabilityReason","availabilityReasonByLocale"]}},
{"if":{"type":"object","properties":{"consequence":{"anyOf":[{"properties":{"class":{"not":{"const":"none"}}},"required":["class"]},{"properties":{"external":{"const":true}},"required":["external"]},{"properties":{"cost":{"enum":["possible","known"]}},"required":["cost"]}]}},"required":["consequence"]},"then":{"properties":{"confirmation":{"enum":["explicit","step_up"]}},"required":["progressPresentationContract","resultPresentationContract","recoveryContract","receiptSchemaBinding"]}},
{"if":{"properties":{"consequence":{"properties":{"class":{"const":"none"}},"required":["class"]}},"required":["consequence"]},"then":{"properties":{"consequence":{"properties":{"reversible":{"const":true}}}}}},
{"if":{"properties":{"consequence":{"properties":{"class":{"const":"reversible"}},"required":["class"]}},"required":["consequence"]},"then":{"properties":{"consequence":{"properties":{"reversible":{"const":true}}}}}},
{"if":{"properties":{"consequence":{"properties":{"class":{"enum":["irreversible","destructive"]}},"required":["class"]}},"required":["consequence"]},"then":{"properties":{"consequence":{"properties":{"reversible":{"const":false}}}}}}
]
},
"actionDestinationBinding":{
"type":"object",
"additionalProperties":false,
"required":["kind","target","targetByLocale","presentation"],
"properties":{"kind":{"enum":["anchor","route","external","download","form","contact","command"]},"target":{"$ref":"#/$defs/nonEmpty"},"targetByLocale":{"type":"object","additionalProperties":{"$ref":"#/$defs/nonEmpty"},"minProperties":1},"presentation":{"type":"object","additionalProperties":false,"required":["mode","technique"],"properties":{"mode":{"enum":["direct","static_equivalent"]},"technique":{"enum":["direct_control","working_link","working_link_with_visible_destination","verified_qr_with_text","destination_cue","instruction"]}}}},
"allOf":[
{"if":{"properties":{"kind":{"const":"anchor"}},"required":["kind"]},"then":{"properties":{"target":{"pattern":"^#[a-z][a-z0-9-]*$"}}}},
{"if":{"properties":{"kind":{"const":"route"}},"required":["kind"]},"then":{"properties":{"target":{"pattern":"^(?:/|\\./)(?!.*(?:^|/)\\.\\.(?:/|$))\\S+$"}}}},
{"if":{"properties":{"kind":{"const":"external"}},"required":["kind"]},"then":{"properties":{"target":{"$ref":"#/$defs/httpsUrl"}}}},
{"if":{"properties":{"kind":{"const":"download"}},"required":["kind"]},"then":{"properties":{"target":{"anyOf":[{"$ref":"#/$defs/httpsUrl"},{"pattern":"^(?:/|\\./)(?!.*(?:^|/)\\.\\.(?:/|$))\\S+$"}]}}}},
{"if":{"properties":{"kind":{"const":"form"}},"required":["kind"]},"then":{"properties":{"target":{"anyOf":[{"$ref":"#/$defs/httpsUrl"},{"pattern":"^#[a-z][a-z0-9-]*$"},{"pattern":"^(?:/|\\./)(?!.*(?:^|/)\\.\\.(?:/|$))\\S+$"}]}}}},
{"if":{"properties":{"kind":{"const":"contact"}},"required":["kind"]},"then":{"properties":{"target":{"pattern":"^(?:mailto:[^\\s@]+@[^\\s@]+|tel:\\+?[0-9(). -]{6,})$"}}}},
{"if":{"properties":{"kind":{"const":"command"}},"required":["kind"]},"then":{"properties":{"target":{"pattern":"^[a-z][a-z0-9.-]*$"}}}}
]
},
"identityImplementation":{
"type":"object",
"additionalProperties":false,
"required":["id","kind","surface"],
"properties":{"id":{"$ref":"#/$defs/nonEmpty"},"kind":{"enum":["asset_identity","governed_text_identity"]},"surface":{"$ref":"#/$defs/nonEmpty"},"assetId":{"$ref":"#/$defs/nonEmpty"},"registryRef":{"$ref":"#/$defs/safeRef"},"text":{"$ref":"#/$defs/nonEmpty"},"textByLocale":{"type":"object","additionalProperties":{"$ref":"#/$defs/nonEmpty"},"minProperties":1},"fontAssetIds":{"type":"array","uniqueItems":true,"items":{"$ref":"#/$defs/nonEmpty"}},"typographyBindingId":{"type":"string","pattern":"^identity-typography\\."},"nativeMappingId":{"anyOf":[{"type":"string","pattern":"^fontmap\\.(?:macos|windows)\\."},{"type":"null"}]},"logoAssetId":{"type":"null"},"logoReconstructionAllowed":{"const":false}},
"allOf":[{"if":{"properties":{"kind":{"const":"asset_identity"}},"required":["kind"]},"then":{"required":["assetId"],"not":{"anyOf":[{"required":["registryRef"]},{"required":["text"]},{"required":["textByLocale"]},{"required":["fontAssetIds"]},{"required":["typographyBindingId"]},{"required":["nativeMappingId"]},{"required":["logoAssetId"]}]}}},{"if":{"properties":{"kind":{"const":"governed_text_identity"}},"required":["kind"]},"then":{"required":["registryRef","text","textByLocale","fontAssetIds","typographyBindingId","nativeMappingId","logoAssetId","logoReconstructionAllowed"],"not":{"required":["assetId"]}}}]
},
"capability":{"enum":["claims","evidence","data_table","data_visualization","map","form","authentication","permissions","sharing","download","external_effect","carousel","social_feed","motion","agent_action","telemetry"]},
"capabilityConfigRefs":{
"type":"object",
"description":"One durable configuration or manifest reference for every declared capability. Cross-field validation requires these keys to equal capabilities exactly.",
"additionalProperties":false,
"properties":{"claims":{"$ref":"#/$defs/capabilityConfigBinding"},"evidence":{"$ref":"#/$defs/capabilityConfigBinding"},"data_table":{"$ref":"#/$defs/capabilityConfigBinding"},"data_visualization":{"$ref":"#/$defs/capabilityConfigBinding"},"map":{"$ref":"#/$defs/capabilityConfigBinding"},"form":{"$ref":"#/$defs/capabilityConfigBinding"},"authentication":{"$ref":"#/$defs/capabilityConfigBinding"},"permissions":{"$ref":"#/$defs/capabilityConfigBinding"},"sharing":{"$ref":"#/$defs/capabilityConfigBinding"},"download":{"$ref":"#/$defs/capabilityConfigBinding"},"external_effect":{"$ref":"#/$defs/capabilityConfigBinding"},"carousel":{"$ref":"#/$defs/capabilityConfigBinding"},"social_feed":{"$ref":"#/$defs/capabilityConfigBinding"},"motion":{"$ref":"#/$defs/capabilityConfigBinding"},"agent_action":{"$ref":"#/$defs/capabilityConfigBinding"},"telemetry":{"$ref":"#/$defs/capabilityConfigBinding"}}
},
"publication":{"type":"object","additionalProperties":false,"required":["public","indexing","canonicalPolicy","machineReadable","layerRequirements"],"properties":{"public":{"type":"boolean"},"indexing":{"enum":["index","noindex","not_applicable"]},"canonicalPolicy":{"enum":["self","declared_alternate","not_applicable"]},"machineReadable":{"type":"boolean"},"discovery":{"$ref":"#/$defs/discovery"},"layerRequirements":{"type":"object","additionalProperties":false,"required":["discovery","readability","action"],"properties":{"discovery":{"const":"required"},"readability":{"const":"required"},"action":{"const":"required"}}},"claimManifestRef":{"$ref":"#/$defs/safeRef"},"claimManifestSha256":{"$ref":"#/$defs/sha256"},"claimAsOf":{"type":"string","format":"date-time"},"structuredDataTypes":{"type":"array","items":{"type":"string"},"uniqueItems":true},"sitemapEligible":{"type":"boolean"},"llmsNavigation":{"enum":["not_applicable","optional","provided"]}}},
"discovery":{
"type":"object",
"additionalProperties":false,
"required":["kind","pageKind","canonicalUrl","htmlLang","titleByLocale","descriptionByLocale","primaryHeadingByLocale","primaryAnswerByLocale","protectedLineRoles","robots","sitemap","localeRoutes","socialPreview","structuredDataBindings","crawlerPurposePolicy","visibleTruthOnly","initialHtmlRequired","iconSetId","titlePattern"],
"properties":{
"kind":{"const":"web_discovery"},
"pageKind":{"enum":["portfolio_home","product_landing","detail","article","index","tool","dataset","search_results","utility"]},
"canonicalUrl":{"$ref":"#/$defs/httpsUrl"},
"htmlLang":{"type":"string","pattern":"^[a-z]{2}(-[A-Z]{2})?$"},
"titleByLocale":{"type":"object","minProperties":1,"additionalProperties":{"$ref":"#/$defs/nonEmpty"}},
"descriptionByLocale":{"type":"object","minProperties":1,"additionalProperties":{"$ref":"#/$defs/nonEmpty"}},
"primaryHeadingByLocale":{"type":"object","minProperties":1,"additionalProperties":{"$ref":"#/$defs/nonEmpty"}},
"primaryAnswerByLocale":{"type":"object","minProperties":1,"additionalProperties":{"$ref":"#/$defs/nonEmpty"}},
"protectedLineRoles":{"type":"object","additionalProperties":false,"required":["visibleScene","metadataScene","socialPreviewScene"],"properties":{"visibleScene":{"$ref":"#/$defs/protectedLineRoleOrNull"},"metadataScene":{"$ref":"#/$defs/protectedLineRoleOrNull"},"socialPreviewScene":{"$ref":"#/$defs/protectedLineRoleOrNull"}}},
"robots":{"type":"object","additionalProperties":false,"required":["index","follow"],"properties":{"index":{"type":"boolean"},"follow":{"type":"boolean"}}},
"sitemap":{"type":"object","additionalProperties":false,"required":["included","loc"],"properties":{"included":{"type":"boolean"},"loc":{"type":["string","null"]}},"allOf":[{"if":{"properties":{"included":{"const":true}},"required":["included"]},"then":{"properties":{"loc":{"$ref":"#/$defs/httpsUrl"}}},"else":{"properties":{"loc":{"type":"null"}}}}]},
"localeRoutes":{"type":"array","minItems":1,"items":{"type":"object","additionalProperties":false,"required":["locale","url","canonicalUrl","alternates"],"properties":{"locale":{"type":"string","pattern":"^[a-z]{2}(-[A-Z]{2})?$"},"url":{"$ref":"#/$defs/httpsUrl"},"canonicalUrl":{"$ref":"#/$defs/httpsUrl"},"alternates":{"type":"array","minItems":1,"items":{"type":"object","additionalProperties":false,"required":["locale","url"],"properties":{"locale":{"anyOf":[{"type":"string","pattern":"^[a-z]{2}(-[A-Z]{2})?$"},{"const":"x-default"}]},"url":{"$ref":"#/$defs/httpsUrl"}}}}}}},
"socialPreview":{"type":"object","additionalProperties":false,"required":["titleByLocale","descriptionByLocale","url","imageAssetId"],"properties":{"titleByLocale":{"type":"object","minProperties":1,"additionalProperties":{"$ref":"#/$defs/nonEmpty"}},"descriptionByLocale":{"type":"object","minProperties":1,"additionalProperties":{"$ref":"#/$defs/nonEmpty"}},"url":{"$ref":"#/$defs/httpsUrl"},"imageAssetId":{"anyOf":[{"$ref":"#/$defs/nonEmpty"},{"type":"null"}]},"imageAltByLocale":{"type":"object","minProperties":1,"additionalProperties":{"$ref":"#/$defs/nonEmpty"}},"linkPreviewTargetRef":{"const":"target.social.og.1200x630.01"}},"allOf":[{"if":{"properties":{"imageAssetId":{"$ref":"#/$defs/nonEmpty"}},"required":["imageAssetId"]},"then":{"required":["imageAltByLocale"]}}]},
"structuredDataBindings":{"type":"array","minItems":1,"items":{"type":"object","additionalProperties":false,"required":["ref","sha256","schemaRef"],"properties":{"ref":{"$ref":"#/$defs/safeRef"},"sha256":{"$ref":"#/$defs/sha256"},"schemaRef":{"const":"https://montri-th.github.io/Landometer/v0.9.7/standalone-0.9.7-r1/schemas/structured-data-projection.schema.json"}}}},
"crawlerPurposePolicy":{"type":"object","additionalProperties":false,"required":["ref","sha256","schemaRef"],"properties":{"ref":{"$ref":"#/$defs/safeRef"},"sha256":{"$ref":"#/$defs/sha256"},"schemaRef":{"const":"https://montri-th.github.io/Landometer/v0.9.7/standalone-0.9.7-r1/schemas/crawler-purpose-policy.schema.json"}}},
"visibleTruthOnly":{"const":true},
"initialHtmlRequired":{"type":"boolean"},
"iconSetId":{"anyOf":[{"$ref":"#/$defs/nonEmpty"},{"type":"null"}],"description":"asset-registry.json#/iconSets id; null blocks web delivery (FAVICON-01)"},
"titlePattern":{"const":"[page] · [product]"}
}
},
"privacySecurity":{"type":"object","additionalProperties":false,"required":["dataClassification","personalData","redactionPolicy","agentActionPolicy"],"properties":{"dataClassification":{"enum":["public","internal","confidential","restricted"]},"personalData":{"type":"boolean"},"permissionsRequired":{"type":"array","items":{"type":"string"},"uniqueItems":true},"redactionPolicy":{"enum":["not_required","required_before_delivery"]},"agentActionPolicy":{"enum":["none","read_only","confirm_before_commit","owner_authorized"]}}},
"assumption":{
"type":"object",
"additionalProperties":false,
"required":["id","statement","impactDomain","status","rationale"],
"properties":{"id":{"type":"string","pattern":"^[a-z0-9][a-z0-9._-]{2,79}$"},"statement":{"$ref":"#/$defs/nonEmpty"},"impactDomain":{"enum":["composition_only","truth","identity","rights","accessibility","locale_completeness","primary_action","evidence_interpretation"]},"status":{"enum":["validated","bounded_non_blocking","unresolved_blocking"]},"rationale":{"$ref":"#/$defs/nonEmpty"},"resolutionRef":{"$ref":"#/$defs/nonEmpty"}},
"allOf":[{"if":{"properties":{"status":{"const":"validated"}},"required":["status"]},"then":{"required":["resolutionRef"]}},{"if":{"properties":{"status":{"const":"bounded_non_blocking"}},"required":["status"]},"then":{"properties":{"impactDomain":{"const":"composition_only"}}}},{"if":{"properties":{"impactDomain":{"enum":["truth","identity","rights","accessibility","locale_completeness","primary_action","evidence_interpretation"]}},"required":["impactDomain"]},"then":{"properties":{"status":{"enum":["validated","unresolved_blocking"]}}}}]
},
"audienceOutput":{
"type":"object",
"additionalProperties":false,
"required":["mode","deliveryAudience","disclosurePurpose","internalGovernanceVisibility","unresolvedDependencyBehavior","placeholderPolicy","materialLimitationPresentation","blockingDependencyRefs"],
"properties":{"mode":{"const":"resolved_only"},"deliveryAudience":{"enum":["internal_preview","internal_operational","client","public"]},"disclosurePurpose":{"enum":["ordinary_experience","design_system_reference","provenance_record"]},"disclosureAuthorityRef":{"$ref":"#/$defs/safeRef"},"disclosureAuthoritySha256":{"$ref":"#/$defs/sha256"},"disclosureAttestationRef":{"$ref":"#/$defs/safeRef"},"disclosureAttestationSha256":{"$ref":"#/$defs/sha256"},"internalGovernanceVisibility":{"const":"hidden"},"unresolvedDependencyBehavior":{"const":"block_or_internal_preview"},"placeholderPolicy":{"const":"forbidden_in_resolved_delivery"},"materialLimitationPresentation":{"const":"proximate_plain_language"},"blockingDependencyRefs":{"type":"array","items":{"$ref":"#/$defs/nonEmpty"},"uniqueItems":true}},
"allOf":[{"if":{"properties":{"disclosurePurpose":{"enum":["design_system_reference","provenance_record"]}},"required":["disclosurePurpose"]},"then":{"required":["disclosureAuthorityRef","disclosureAuthoritySha256","disclosureAttestationRef","disclosureAttestationSha256"]}}]
},
"asset":{
"type":"object",
"additionalProperties":false,
"required":["id","role","surface","source","approvalStatus","sha256"],
"properties":{
"id":{"type":"string"},
"role":{"enum":["identity","text_font","editorial","evidence","interface_icon","data_visualization","map","social_preview","atmosphere","ui_capture","provider_content","generated_vector"]},
"surface":{"$ref":"#/$defs/nonEmpty"},
"source":{"$ref":"#/$defs/safeRef"},
"approvalStatus":{"enum":["approved","candidate","unverified","rejected"]},
"sha256":{"$ref":"#/$defs/sha256"},
"approvedBy":{"$ref":"#/$defs/nonEmpty"},
"approvedAt":{"type":"string","format":"date-time"},
"approvalReceiptRef":{"$ref":"#/$defs/safeRef"},
"approvalReceiptSha256":{"$ref":"#/$defs/sha256"},
"fontRole":{"$ref":"#/$defs/nonEmpty"},
"fontFamily":{"$ref":"#/$defs/nonEmpty"},
"fontSubset":{"$ref":"#/$defs/nonEmpty"},
"fontWeight":{"type":"integer","minimum":1,"maximum":1000},
"fontFallback":{"$ref":"#/$defs/nonEmpty"},
"fallback":{"$ref":"#/$defs/nonEmpty"},
"glyphs":{"type":"array","minItems":1,"items":{"$ref":"#/$defs/nonEmpty"},"uniqueItems":true},
"licenseOrPermission":{"type":"string"},
"altOrTextEquivalent":{"type":"string"}
},
"allOf":[{"if":{"properties":{"approvalStatus":{"const":"approved"}},"required":["approvalStatus"]},"then":{"required":["sha256","approvedBy","approvedAt","approvalReceiptRef","approvalReceiptSha256"]}},{"if":{"properties":{"role":{"const":"text_font"}},"required":["role"]},"then":{"required":["fontRole","fontFamily","fontSubset","fontWeight","fontFallback","licenseOrPermission"]}},{"if":{"properties":{"role":{"const":"identity"}},"required":["role"]},"then":{"required":["licenseOrPermission","fallback","altOrTextEquivalent"]}},{"if":{"properties":{"role":{"const":"interface_icon"}},"required":["role"]},"then":{"required":["licenseOrPermission","fallback","glyphs"]}},{"if":{"properties":{"role":{"enum":["editorial","evidence","data_visualization","map","social_preview","atmosphere","ui_capture","provider_content","generated_vector"]}},"required":["role"]},"then":{"required":["licenseOrPermission","fallback","altOrTextEquivalent"]}}]
},
"qa":{"type":"object","additionalProperties":false,"required":["automated","manual","production"],"properties":{"automated":{"type":"array","items":{"$ref":"#/$defs/nonEmpty"}},"manual":{"type":"array","items":{"$ref":"#/$defs/nonEmpty"}},"production":{"type":"array","items":{"$ref":"#/$defs/nonEmpty"}},"exceptionIds":{"type":"array","maxItems":0,"items":false}}},
"resolved":{"type":"object","additionalProperties":false,"required":["experienceProfile","formatPack","targetProfileRef","capabilityPacks","requiredRules","setIds"],"properties":{"experienceProfile":{"type":"string"},"formatPack":{"type":"string"},"targetProfileRef":{"type":"string"},"capabilityPacks":{"type":"array","items":{"type":"string"},"uniqueItems":true},"requiredRules":{"type":"array","items":{"type":"string"},"uniqueItems":true},"setIds":{"type":"object","additionalProperties":{"type":"string"}},"resolvedAt":{"type":"string","format":"date-time"},"resolverVersion":{"type":"string"}}},
"motionMoment":{
"type":"object",
"additionalProperties":false,
"required":["kind","job","beat","variant","hostSurface"],
"properties":{
"kind":{"enum":["dial","rings","layers","slice","cultivate","logo"]},
"job":{"enum":["orientation","opening","spatial_transition","section_orientation","layering","quiet_divider","action_closure","cultural_closure","handoff","animated_brand_opening"]},
"beat":{"enum":["opening","transition","closing"]},
"variant":{"enum":["full","quiet"]},
"surfaceId":{"type":"string"},
"overlayRef":{"type":"string"},
"hostSurface":{"type":"string","pattern":"^(surface\\.canvas|surface\\.alt|surface\\.card|surface\\.raised|surface\\.soft|surface\\.blueTint|surface\\.beigeTint|brand\\.beige|brand\\.blue|atmosphere\\.ground\\.mist|atmosphere\\.measure\\.luminous|atmosphere\\.ground\\.current|atmosphere\\.measure\\.deep|surfaceAtmosphere\\.ground|surfaceAtmosphere\\.measure)(@(light|dark))?$","description":"MOTIF-06 carrier id from motif-register.v0.9.7.json#/carrierPolicy/carriers; themed ids are checked per rendered theme; <id>@light|@dark paints that theme's value in both themes"},
"variantDark":{"enum":["quiet"],"description":"MOTIF-06 theme swap: full in the light theme, quiet in the dark theme"},
"hostSurfaceHex":{"type":"object","additionalProperties":false,"properties":{"light":{"type":"string"},"dark":{"type":"string"}}},
"measuredContrast":{"type":"object","additionalProperties":false,"properties":{"light":{"type":"string","pattern":"^[0-9]+\\.[0-9]{2}–[0-9]+\\.[0-9]{2}$"},"dark":{"type":"string","pattern":"^[0-9]+\\.[0-9]{2}–[0-9]+\\.[0-9]{2}$"}},"description":"weakest–strongest paint ratio from carrierPolicy.measured"},
"contrastVerdict":{"enum":["meaningCapable","decorativeOnly","invisible"]},
"quietFallbackRung":{"enum":["none","L2","L3","L4","L5"]},
"fallbackAssetId":{"type":"string"}
},
"allOf":[{"if":{"properties":{"kind":{"const":"dial"}}},"then":{"properties":{"job":{"enum":["orientation","opening"]},"beat":{"const":"opening"}}}},{"if":{"properties":{"kind":{"const":"rings"}}},"then":{"properties":{"job":{"enum":["spatial_transition","section_orientation"]},"beat":{"const":"transition"}}}},{"if":{"properties":{"kind":{"const":"layers"}}},"then":{"properties":{"job":{"enum":["layering","quiet_divider"]},"beat":{"const":"transition"}}}},{"if":{"properties":{"kind":{"const":"slice"}}},"then":{"properties":{"job":{"enum":["action_closure"]},"beat":{"const":"closing"}}}},{"if":{"properties":{"kind":{"const":"cultivate"}}},"then":{"properties":{"job":{"enum":["cultural_closure","handoff"]},"beat":{"const":"closing"}}}},{"if":{"properties":{"kind":{"const":"logo"}}},"then":{"properties":{"job":{"enum":["animated_brand_opening"]},"beat":{"const":"opening"}}}}]
},
"staticMotifPlacement":{
"type":"object",
"additionalProperties":false,
"required":["kind","variant","hostSurface","format"],
"properties":{
"kind":{"enum":["dial","rings","layers","slice","cultivate","logo"]},
"variant":{"enum":["full","quiet"]},
"format":{"enum":["web_public","deck_16x9","document_pdf","video_owner_extension"]},
"purpose":{"type":"string"},
"hostSurface":{"type":"string","pattern":"^(surface\\.canvas|surface\\.alt|surface\\.card|surface\\.raised|surface\\.soft|surface\\.blueTint|surface\\.beigeTint|brand\\.beige|brand\\.blue|atmosphere\\.ground\\.mist|atmosphere\\.measure\\.luminous|atmosphere\\.ground\\.current|atmosphere\\.measure\\.deep|surfaceAtmosphere\\.ground|surfaceAtmosphere\\.measure)(@(light|dark))?$","description":"MOTIF-06 carrier id from motif-register.v0.9.7.json#/carrierPolicy/carriers; themed ids are checked per rendered theme; <id>@light|@dark paints that theme's value in both themes"},
"variantDark":{"enum":["quiet"],"description":"MOTIF-06 theme swap: full in the light theme, quiet in the dark theme"},
"hostSurfaceHex":{"type":"object","additionalProperties":false,"properties":{"light":{"type":"string"},"dark":{"type":"string"}}},
"measuredContrast":{"type":"object","additionalProperties":false,"properties":{"light":{"type":"string","pattern":"^[0-9]+\\.[0-9]{2}–[0-9]+\\.[0-9]{2}$"},"dark":{"type":"string","pattern":"^[0-9]+\\.[0-9]{2}–[0-9]+\\.[0-9]{2}$"}},"description":"weakest–strongest paint ratio from carrierPolicy.measured"},
"contrastVerdict":{"enum":["meaningCapable","decorativeOnly","invisible"]},
"quietFallbackRung":{"enum":["none","L2","L3","L4","L5"]},
"fallbackAssetId":{"type":"string"}
},
"description":"MOTIF-06: every static final-state motif placement names its carrier"
}
},
"$comment":"Resolved standalone LDS 0.9.7 contract, revision standalone-0.9.7-r1. The distribution is owner-approved and unsigned; this schema is not a release attestation. Historical source identities and hashes are recorded separately."
},
"capability-config.schema.json":{
"$schema":"https://json-schema.org/draft/2020-12/schema",
"$id":"https://montri-th.github.io/Landometer/v0.9.7/standalone-0.9.7-r1/schemas/capability-config.schema.json",
"title":"Landometer typed capability configuration v1.5",
"oneOf":[{"$ref":"#/$defs/dataTable"},{"$ref":"#/$defs/dataVisualization"},{"$ref":"#/$defs/map"},{"$ref":"#/$defs/form"},{"$ref":"#/$defs/authentication"},{"$ref":"#/$defs/permissions"},{"$ref":"#/$defs/sharing"},{"$ref":"#/$defs/download"},{"$ref":"#/$defs/externalEffect"},{"$ref":"#/$defs/carousel"},{"$ref":"#/$defs/socialFeed"},{"$ref":"#/$defs/telemetry"}],
"$defs":{
"nonEmpty":{"type":"string","minLength":1,"pattern":"\\S"},
"safeRef":{"type":"string","minLength":1,"pattern":"^(?!/)(?!.*(?:^|/)\\.\\.(?:/|$))[^\\u0000]+$"},
"sha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},
"localeMap":{"type":"object","minProperties":1,"additionalProperties":{"$ref":"#/$defs/nonEmpty"}},
"typedActionContractBinding":{"type":"object","additionalProperties":false,"required":["ref","sha256","schemaRef","schemaSha256"],"properties":{"ref":{"$ref":"#/$defs/safeRef"},"sha256":{"$ref":"#/$defs/sha256"},"schemaRef":{"$ref":"#/$defs/nonEmpty"},"schemaSha256":{"$ref":"#/$defs/sha256"}}},
"typedSchemaBinding":{"type":"object","additionalProperties":false,"required":["ref","sha256","schemaId"],"properties":{"ref":{"$ref":"#/$defs/safeRef"},"sha256":{"$ref":"#/$defs/sha256"},"schemaId":{"$ref":"#/$defs/nonEmpty"}}},
"uniqueStrings":{"type":"array","minItems":1,"uniqueItems":true,"items":{"$ref":"#/$defs/nonEmpty"}},
"nonEmptyObject":{"type":"object","minProperties":1},
"nonEmptyArray":{"type":"array","minItems":1},
"stringOrObject":{"anyOf":[{"$ref":"#/$defs/nonEmpty"},{"$ref":"#/$defs/nonEmptyObject"}]},
"formSubmission":{"type":"object","additionalProperties":false,"required":["destinationRef","method"],"properties":{"destinationRef":{"$ref":"#/$defs/safeRef"},"method":{"enum":["GET","POST"]}}},
"motion":{"oneOf":[{"$ref":"#/$defs/motionBrowserObserver"},{"$ref":"#/$defs/motionNativeState"},{"$ref":"#/$defs/motionDeckSequence"}]},
"motionBrowserObserver":{
"type":"object",
"additionalProperties":false,
"required":["mode","opacityDurationMs","transformDurationMs","mediaDurationMs","blockDistancePx","inlineDistancePx","scaleFrom","staggerStepMs","staggerCapMs","staggerBeatCount","staggerDelayFormula","opacityEasing","transformEasing","pressEasing","observerThreshold","observerRootMargin","initializationWatchdogMs","reachedContentFailsafeFrames","finalHiddenFinalFlashForbidden","observersPerDocumentRoot","onceOnlyUnobserve","prePaintArmingRequiresNormalMotionAndObserver"],
"properties":{
"mode":{"const":"browser_observer"},
"opacityDurationMs":{"type":"number","minimum":0},
"transformDurationMs":{"type":"number","minimum":0},
"mediaDurationMs":{"type":"number","minimum":0},
"blockDistancePx":{"type":"number","minimum":0},
"inlineDistancePx":{"type":"number","minimum":0},
"scaleFrom":{"type":"number","exclusiveMinimum":0,"maximum":1},
"staggerStepMs":{"type":"number","minimum":0},
"staggerCapMs":{"type":"number","minimum":0},
"staggerBeatCount":{"const":4},
"staggerDelayFormula":{"const":"min(zeroBasedSiblingIndex,3)*150ms"},
"opacityEasing":{"$ref":"#/$defs/nonEmpty"},
"transformEasing":{"$ref":"#/$defs/nonEmpty"},
"pressEasing":{"$ref":"#/$defs/nonEmpty"},
"observerThreshold":{"type":"number","minimum":0,"maximum":1},
"observerRootMargin":{"$ref":"#/$defs/nonEmpty"},
"initializationWatchdogMs":{"type":"number","minimum":0},
"reachedContentFailsafeFrames":{"type":"integer","minimum":1},
"finalHiddenFinalFlashForbidden":{"const":true},
"observersPerDocumentRoot":{"const":1},
"onceOnlyUnobserve":{"const":false},
"prePaintArmingRequiresNormalMotionAndObserver":{"const":true},
"reentryBehavior":{"const":"replay_on_reentry_while_visible"},
"cycleWhileStill":{"const":false},
"repetitionAuthority":{"type":"string","minLength":1},
"motionMoments":{"$ref":"#/$defs/motionMoments"},
"staticMotifPlacements":{"$ref":"#/$defs/staticMotifPlacements"}
}
},
"motionNativeState":{"type":"object","additionalProperties":false,"required":["mode","feedbackDurationMs","stateDurationMs","maximumTransitionMs","reducedMotionFinalState","layoutGeometry","interruptionFinalState"],"properties":{"mode":{"const":"native_state"},"feedbackDurationMs":{"type":"number","minimum":0},"stateDurationMs":{"type":"number","minimum":0},"maximumTransitionMs":{"type":"number","minimum":0},"reducedMotionFinalState":{"const":"final_state"},"layoutGeometry":{"const":"stable"},"interruptionFinalState":{"const":"final_state"}}},
"motionDeckSequence":{"type":"object","additionalProperties":false,"required":["mode","sequencePurpose","trigger","stepDurationMs","maximumSteps","staticEquivalent","finalFrameRequired"],"properties":{"mode":{"const":"presenter_sequence"},"sequencePurpose":{"enum":["state","sequence","progress","spatial_relationship","cause_and_effect"]},"trigger":{"enum":["manual_advance","on_slide_entry"]},"stepDurationMs":{"type":"number","minimum":0},"maximumSteps":{"type":"integer","minimum":1,"maximum":12},"staticEquivalent":{"const":"final_state"},"finalFrameRequired":{"const":true}}},
"ctaDiscoveryCue":{
"type":"object",
"additionalProperties":false,
"required":["recipeId","eligibleRole","requiredUserBenefit","trigger","repeatCountPerPageLoad","reentryBehavior","durationMs","durationCeilingMs","delayMs","easing","geometry","contentOpacityMinimum","layoutGeometryStable","pointerEvents","reducedMotion","observerFailure","staticEquivalent"],
"properties":{"recipeId":{"const":"motion.cta.discovery-cue.01"},"eligibleRole":{"const":"primary_navigational_cta"},"requiredUserBenefit":{"const":"discoverability"},"trigger":{"const":"first_visible_entry"},"repeatCountPerPageLoad":{"const":1},"reentryBehavior":{"const":"do_not_repeat"},"durationMs":{"const":540},"durationCeilingMs":{"const":600},"delayMs":{"const":0},"easing":{"const":"cubic-bezier(.16,1,.3,1)"},"geometry":{"type":"object","additionalProperties":false,"required":["kind","startPercent","endPercent","bandWidthPercent"],"properties":{"kind":{"const":"inline_highlight_sweep"},"startPercent":{"const":-120},"endPercent":{"const":120},"bandWidthPercent":{"const":28}}},"contentOpacityMinimum":{"const":1},"layoutGeometryStable":{"const":true},"pointerEvents":{"const":"none"},"reducedMotion":{"const":"no_cue_final_state"},"observerFailure":{"const":"no_cue_final_state"},"staticEquivalent":{"const":"emphasis_without_motion"}}
},
"dataTable":{"type":"object","additionalProperties":false,"required":["capability","question","columns","rows","dataGrain","claimIds","evidenceIds","accessibleSummary","cellStates"],"properties":{"capability":{"const":"data_table"},"question":{"$ref":"#/$defs/nonEmpty"},"columns":{"$ref":"#/$defs/nonEmptyArray"},"rows":{"$ref":"#/$defs/nonEmptyArray"},"dataGrain":{"$ref":"#/$defs/nonEmptyObject"},"claimIds":{"$ref":"#/$defs/uniqueStrings"},"evidenceIds":{"$ref":"#/$defs/uniqueStrings"},"accessibleSummary":{"$ref":"#/$defs/nonEmpty"},"cellStates":{"type":"array","uniqueItems":true,"items":{"enum":["measured","measured_zero","no_data","out_of_scope","suppressed","not_yet"]}}}},
"dataVisualization":{
"type":"object",
"additionalProperties":false,
"required":["capability","question","measure","unit","denominator","time","geography","dataGrain","transform","uncertainty","schemaRelease","claimIds","evidenceIds","accessibleAlternative","scaleFamilies","valueStates"],
"properties":{
"capability":{"const":"data_visualization"},
"question":{"$ref":"#/$defs/nonEmpty"},
"measure":{"$ref":"#/$defs/nonEmpty"},
"unit":{"$ref":"#/$defs/nonEmpty"},
"denominator":{"anyOf":[{"$ref":"#/$defs/nonEmpty"},{"type":"number"}]},
"time":{"$ref":"#/$defs/nonEmpty"},
"geography":{"$ref":"#/$defs/nonEmpty"},
"dataGrain":{"$ref":"#/$defs/nonEmptyObject"},
"transform":{"$ref":"#/$defs/stringOrObject"},
"uncertainty":{"$ref":"#/$defs/stringOrObject"},
"schemaRelease":{"$ref":"#/$defs/nonEmpty"},
"claimIds":{"$ref":"#/$defs/uniqueStrings"},
"evidenceIds":{"$ref":"#/$defs/uniqueStrings"},
"accessibleAlternative":{"$ref":"#/$defs/nonEmpty"},
"scaleFamilies":{"type":"array","uniqueItems":true,"items":{"enum":["activity","density.area","heat","risk","price","age","density.household","growth","confidence","count","water","density.capita","built","duration","balance","delta","tradeoff","flow","sentiment","anomaly"]}},
"seriesVariant":{"enum":["soft","vivid","none"]},
"valueStates":{"type":"array","uniqueItems":true,"items":{"enum":["measured","measured_zero","no_data","out_of_scope","suppressed","not_yet"]}}
}
},
"map":{
"type":"object",
"additionalProperties":false,
"required":["capability","geographyId","boundarySource","purpose","coveredArea","dataGrain","time","unit","schemaRelease","rightsAndAttribution","dataStates","nonSpatialAlternative","exportReceipt","scaleFamilies"],
"properties":{"capability":{"const":"map"},"geographyId":{"$ref":"#/$defs/nonEmpty"},"boundarySource":{"$ref":"#/$defs/nonEmpty"},"purpose":{"$ref":"#/$defs/nonEmpty"},"coveredArea":{"$ref":"#/$defs/nonEmpty"},"dataGrain":{"$ref":"#/$defs/nonEmptyObject"},"time":{"$ref":"#/$defs/nonEmpty"},"unit":{"$ref":"#/$defs/nonEmpty"},"schemaRelease":{"$ref":"#/$defs/nonEmpty"},"rightsAndAttribution":{"$ref":"#/$defs/nonEmpty"},"dataStates":{"type":"array","uniqueItems":true,"items":{"enum":["measured","measured_zero","no_data","out_of_scope","suppressed","not_yet"]}},"nonSpatialAlternative":{"$ref":"#/$defs/nonEmpty"},"exportReceipt":{"$ref":"#/$defs/safeRef"},"scaleFamilies":{"type":"array","uniqueItems":true,"items":{"enum":["activity","density.area","heat","risk","price","age","density.household","growth","confidence","count","water","density.capita","built","duration","balance","delta","tradeoff","flow","sentiment","anomaly"]}}}
},
"form":{"type":"object","additionalProperties":false,"required":["capability","purpose","fields","validation","submission","successState","errorState","privacyNoticeRef"],"properties":{"capability":{"const":"form"},"purpose":{"$ref":"#/$defs/nonEmpty"},"fields":{"$ref":"#/$defs/nonEmptyArray"},"validation":{"$ref":"#/$defs/nonEmptyObject"},"submission":{"$ref":"#/$defs/formSubmission"},"successState":{"$ref":"#/$defs/stringOrObject"},"errorState":{"$ref":"#/$defs/stringOrObject"},"privacyNoticeRef":{"$ref":"#/$defs/safeRef"}}},
"authentication":{"type":"object","additionalProperties":false,"required":["capability","identityProvider","entryState","successState","failureState","recoveryPath","sessionPolicy"],"properties":{"capability":{"const":"authentication"},"identityProvider":{"$ref":"#/$defs/nonEmpty"},"entryState":{"$ref":"#/$defs/stringOrObject"},"successState":{"$ref":"#/$defs/stringOrObject"},"failureState":{"$ref":"#/$defs/stringOrObject"},"recoveryPath":{"$ref":"#/$defs/safeRef"},"sessionPolicy":{"$ref":"#/$defs/nonEmptyObject"}}},
"permissions":{"type":"object","additionalProperties":false,"required":["capability","resource","actor","allowedOperations","decisionStates","denialRecovery"],"properties":{"capability":{"const":"permissions"},"resource":{"$ref":"#/$defs/nonEmpty"},"actor":{"$ref":"#/$defs/nonEmpty"},"allowedOperations":{"$ref":"#/$defs/uniqueStrings"},"decisionStates":{"$ref":"#/$defs/nonEmptyObject"},"denialRecovery":{"$ref":"#/$defs/nonEmpty"}}},
"sharing":{"type":"object","additionalProperties":false,"required":["capability","objectRef","audiences","destinations","permissionPolicy","receiptPresentation","revocationPolicy"],"properties":{"capability":{"const":"sharing"},"objectRef":{"$ref":"#/$defs/safeRef"},"audiences":{"$ref":"#/$defs/uniqueStrings"},"destinations":{"$ref":"#/$defs/uniqueStrings"},"permissionPolicy":{"$ref":"#/$defs/stringOrObject"},"receiptPresentation":{"$ref":"#/$defs/nonEmpty"},"revocationPolicy":{"$ref":"#/$defs/nonEmpty"}}},
"download":{"type":"object","additionalProperties":false,"required":["capability","resourceRef","fileName","mediaType","byteSize","integritySha256","rights","fallback"],"properties":{"capability":{"const":"download"},"resourceRef":{"$ref":"#/$defs/safeRef"},"fileName":{"$ref":"#/$defs/nonEmpty"},"mediaType":{"$ref":"#/$defs/nonEmpty"},"byteSize":{"type":"number","minimum":0},"integritySha256":{"$ref":"#/$defs/sha256"},"rights":{"$ref":"#/$defs/nonEmptyObject"},"fallback":{"$ref":"#/$defs/nonEmpty"}}},
"externalEffect":{
"type":"object",
"additionalProperties":false,
"required":["capability","effectClass","external","cost","reversible","confirmationPolicy","permissionContract","progressPresentationContract","resultPresentationContract","recoveryContract","receiptSchemaBinding"],
"properties":{"capability":{"const":"external_effect"},"effectClass":{"enum":["reversible","irreversible","destructive"]},"external":{"const":true},"cost":{"enum":["none","possible","known"]},"reversible":{"type":"boolean"},"confirmationPolicy":{"type":"object","additionalProperties":false,"required":["mode","beforeEffect","consequenceDisclosureByLocale","confirmLabelByLocale"],"properties":{"mode":{"enum":["explicit","step_up"]},"beforeEffect":{"const":true},"consequenceDisclosureByLocale":{"$ref":"#/$defs/localeMap"},"confirmLabelByLocale":{"$ref":"#/$defs/localeMap"}}},"permissionContract":{"$ref":"#/$defs/typedActionContractBinding"},"progressPresentationContract":{"$ref":"#/$defs/typedActionContractBinding"},"resultPresentationContract":{"$ref":"#/$defs/typedActionContractBinding"},"recoveryContract":{"$ref":"#/$defs/typedActionContractBinding"},"receiptSchemaBinding":{"$ref":"#/$defs/typedSchemaBinding"}},
"allOf":[{"if":{"properties":{"effectClass":{"const":"reversible"}},"required":["effectClass"]},"then":{"properties":{"reversible":{"const":true}}}},{"if":{"properties":{"effectClass":{"enum":["irreversible","destructive"]}},"required":["effectClass"]},"then":{"properties":{"reversible":{"const":false}}}},{"if":{"properties":{"effectClass":{"const":"destructive"}},"required":["effectClass"]},"then":{"properties":{"confirmationPolicy":{"properties":{"mode":{"const":"step_up"}}}}}}]
},
"carousel":{"type":"object","additionalProperties":false,"required":["capability","items","currentItem","controls","keyboardBehavior","reducedMotionBehavior","staticFallback"],"properties":{"capability":{"const":"carousel"},"items":{"$ref":"#/$defs/nonEmptyArray"},"currentItem":{"anyOf":[{"$ref":"#/$defs/nonEmpty"},{"type":"number","minimum":0}]},"controls":{"$ref":"#/$defs/nonEmptyObject"},"keyboardBehavior":{"$ref":"#/$defs/nonEmpty"},"reducedMotionBehavior":{"$ref":"#/$defs/nonEmpty"},"staticFallback":{"$ref":"#/$defs/nonEmpty"}}},
"socialFeed":{"type":"object","additionalProperties":false,"required":["capability","source","items","ordering","refreshPolicy","emptyState","errorState","accessibleSummary"],"properties":{"capability":{"const":"social_feed"},"source":{"$ref":"#/$defs/safeRef"},"items":{"$ref":"#/$defs/nonEmptyArray"},"ordering":{"$ref":"#/$defs/nonEmpty"},"refreshPolicy":{"$ref":"#/$defs/nonEmpty"},"emptyState":{"$ref":"#/$defs/nonEmpty"},"errorState":{"$ref":"#/$defs/nonEmpty"},"accessibleSummary":{"$ref":"#/$defs/nonEmpty"}}},
"telemetry":{"type":"object","additionalProperties":false,"required":["capability","events","consentPolicy","dataClassification","retention","destinations","redaction","failureBehavior"],"properties":{"capability":{"const":"telemetry"},"events":{"$ref":"#/$defs/nonEmptyArray"},"consentPolicy":{"$ref":"#/$defs/stringOrObject"},"dataClassification":{"enum":["public","internal","confidential","restricted"]},"retention":{"$ref":"#/$defs/stringOrObject"},"destinations":{"$ref":"#/$defs/uniqueStrings"},"redaction":{"$ref":"#/$defs/stringOrObject"},"failureBehavior":{"$ref":"#/$defs/nonEmpty"}}},
"motionMoment":{
"type":"object",
"additionalProperties":false,
"required":["kind","job","beat","variant","hostSurface"],
"properties":{
"kind":{"enum":["dial","rings","layers","slice","cultivate","logo"]},
"job":{"enum":["orientation","opening","spatial_transition","section_orientation","layering","quiet_divider","action_closure","cultural_closure","handoff","animated_brand_opening"]},
"beat":{"enum":["opening","transition","closing"]},
"variant":{"enum":["full","quiet"]},
"surfaceId":{"type":"string"},
"overlayRef":{"type":"string"},
"hostSurface":{"type":"string","pattern":"^(surface\\.canvas|surface\\.alt|surface\\.card|surface\\.raised|surface\\.soft|surface\\.blueTint|surface\\.beigeTint|brand\\.beige|brand\\.blue|atmosphere\\.ground\\.mist|atmosphere\\.measure\\.luminous|atmosphere\\.ground\\.current|atmosphere\\.measure\\.deep|surfaceAtmosphere\\.ground|surfaceAtmosphere\\.measure)(@(light|dark))?$","description":"MOTIF-06 carrier id from motif-register.v0.9.7.json#/carrierPolicy/carriers; themed ids are checked per rendered theme; <id>@light|@dark paints that theme's value in both themes"},
"variantDark":{"enum":["quiet"],"description":"MOTIF-06 theme swap: full in the light theme, quiet in the dark theme"},
"hostSurfaceHex":{"type":"object","additionalProperties":false,"properties":{"light":{"type":"string"},"dark":{"type":"string"}}},
"measuredContrast":{"type":"object","additionalProperties":false,"properties":{"light":{"type":"string","pattern":"^[0-9]+\\.[0-9]{2}–[0-9]+\\.[0-9]{2}$"},"dark":{"type":"string","pattern":"^[0-9]+\\.[0-9]{2}–[0-9]+\\.[0-9]{2}$"}},"description":"weakest–strongest paint ratio from carrierPolicy.measured"},
"contrastVerdict":{"enum":["meaningCapable","decorativeOnly","invisible"]},
"quietFallbackRung":{"enum":["none","L2","L3","L4","L5"]},
"fallbackAssetId":{"type":"string"}
},
"allOf":[{"if":{"properties":{"kind":{"const":"dial"}}},"then":{"properties":{"job":{"enum":["orientation","opening"]},"beat":{"const":"opening"}}}},{"if":{"properties":{"kind":{"const":"rings"}}},"then":{"properties":{"job":{"enum":["spatial_transition","section_orientation"]},"beat":{"const":"transition"}}}},{"if":{"properties":{"kind":{"const":"layers"}}},"then":{"properties":{"job":{"enum":["layering","quiet_divider"]},"beat":{"const":"transition"}}}},{"if":{"properties":{"kind":{"const":"slice"}}},"then":{"properties":{"job":{"enum":["action_closure"]},"beat":{"const":"closing"}}}},{"if":{"properties":{"kind":{"const":"cultivate"}}},"then":{"properties":{"job":{"enum":["cultural_closure","handoff"]},"beat":{"const":"closing"}}}},{"if":{"properties":{"kind":{"const":"logo"}}},"then":{"properties":{"job":{"enum":["animated_brand_opening"]},"beat":{"const":"opening"}}}}]
},
"motionMoments":{"type":"array","maxItems":3,"items":{"$ref":"#/$defs/motionMoment"}},
"staticMotifPlacement":{
"type":"object",
"additionalProperties":false,
"required":["kind","variant","hostSurface","format"],
"properties":{
"kind":{"enum":["dial","rings","layers","slice","cultivate","logo"]},
"variant":{"enum":["full","quiet"]},
"format":{"enum":["web_public","deck_16x9","document_pdf","video_owner_extension"]},
"purpose":{"type":"string"},
"hostSurface":{"type":"string","pattern":"^(surface\\.canvas|surface\\.alt|surface\\.card|surface\\.raised|surface\\.soft|surface\\.blueTint|surface\\.beigeTint|brand\\.beige|brand\\.blue|atmosphere\\.ground\\.mist|atmosphere\\.measure\\.luminous|atmosphere\\.ground\\.current|atmosphere\\.measure\\.deep|surfaceAtmosphere\\.ground|surfaceAtmosphere\\.measure)(@(light|dark))?$","description":"MOTIF-06 carrier id from motif-register.v0.9.7.json#/carrierPolicy/carriers; themed ids are checked per rendered theme; <id>@light|@dark paints that theme's value in both themes"},
"variantDark":{"enum":["quiet"],"description":"MOTIF-06 theme swap: full in the light theme, quiet in the dark theme"},
"hostSurfaceHex":{"type":"object","additionalProperties":false,"properties":{"light":{"type":"string"},"dark":{"type":"string"}}},
"measuredContrast":{"type":"object","additionalProperties":false,"properties":{"light":{"type":"string","pattern":"^[0-9]+\\.[0-9]{2}–[0-9]+\\.[0-9]{2}$"},"dark":{"type":"string","pattern":"^[0-9]+\\.[0-9]{2}–[0-9]+\\.[0-9]{2}$"}},"description":"weakest–strongest paint ratio from carrierPolicy.measured"},
"contrastVerdict":{"enum":["meaningCapable","decorativeOnly","invisible"]},
"quietFallbackRung":{"enum":["none","L2","L3","L4","L5"]},
"fallbackAssetId":{"type":"string"}
},
"description":"MOTIF-06: every static final-state motif placement names its carrier"
},
"staticMotifPlacements":{"type":"array","items":{"$ref":"#/$defs/staticMotifPlacement"}}
},
"$comment":"Resolved standalone LDS 0.9.7 contract, revision standalone-0.9.7-r1. The distribution is owner-approved and unsigned; this schema is not a release attestation. Historical source identities and hashes are recorded separately."
},
"claim-evidence-capture.schema.json":{
"$schema":"https://json-schema.org/draft/2020-12/schema",
"$id":"https://montri-th.github.io/Landometer/v0.9.7/standalone-0.9.7-r1/schemas/claim-evidence-capture.schema.json",
"title":"Landometer claim evidence capture v1.0",
"type":"object",
"additionalProperties":false,
"required":["schemaVersion","releaseRef","captureId","claimId","sourceRef","finalRef","capturedAt","mediaType","contentRef","contentSha256","contentByteCount","captureMethod"],
"properties":{"schemaVersion":{"const":"1.0"},"releaseRef":{"const":"v0.9.7-owner.1"},"captureId":{"type":"string","pattern":"^[a-z0-9][a-z0-9._-]{2,159}$"},"claimId":{"type":"string","pattern":"^[a-z0-9][a-z0-9._-]{2,119}$"},"sourceRef":{"$ref":"#/$defs/nonEmpty"},"finalRef":{"$ref":"#/$defs/nonEmpty"},"capturedAt":{"type":"string","format":"date-time"},"httpStatus":{"type":["integer","null"],"minimum":100,"maximum":599},"mediaType":{"$ref":"#/$defs/nonEmpty"},"contentRef":{"$ref":"#/$defs/safeRef"},"contentSha256":{"$ref":"#/$defs/sha256"},"contentByteCount":{"type":"integer","minimum":1},"captureMethod":{"enum":["bundle_exact_bytes","https_fetch","authorized_export"]}},
"$defs":{"nonEmpty":{"type":"string","minLength":1,"pattern":"\\S"},"sha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"safeRef":{"type":"string","minLength":1,"pattern":"^(?!/)(?!.*(?:^|/)\\.\\.(?:/|$))(?!.*[\\u0000-\\u001F]).+$"}},
"$comment":"Resolved standalone LDS 0.9.7 contract, revision standalone-0.9.7-r1. The distribution is owner-approved and unsigned; this schema is not a release attestation. Historical source identities and hashes are recorded separately."
},
"claim-manifest.schema.json":{
"$schema":"https://json-schema.org/draft/2020-12/schema",
"$id":"https://montri-th.github.io/Landometer/v0.9.7/standalone-0.9.7-r1/schemas/claim-manifest.schema.json",
"title":"Landometer claim manifest v1.1",
"type":"object",
"additionalProperties":false,
"required":["schemaVersion","releaseRef","manifestId","contentRelease","owner","records"],
"properties":{
"schemaVersion":{"const":"1.1"},
"releaseRef":{"const":"v0.9.7-owner.1"},
"manifestId":{"type":"string","pattern":"^[a-z0-9][a-z0-9._-]{2,119}$"},
"contentRelease":{"$ref":"#/$defs/nonEmpty"},
"owner":{"$ref":"#/$defs/nonEmpty"},
"records":{"type":"array","minItems":1,"items":{"type":"object","additionalProperties":false,"required":["claimId","recordRef","sha256","status","publicProjectionEligible","approvalAttestationRef","approvalAttestationSha256","evidenceCaptureRef","evidenceCaptureSha256","evidenceAttestationRef","evidenceAttestationSha256"],"properties":{"claimId":{"type":"string","pattern":"^[a-z0-9][a-z0-9._-]{2,119}$"},"recordRef":{"type":"string","pattern":"^[A-Za-z0-9._/-]+\\.json$"},"sha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"status":{"enum":["draft","reviewed","approved","superseded","withdrawn","expired"]},"publicProjectionEligible":{"type":"boolean"},"approvalAttestationRef":{"$ref":"#/$defs/safeRef"},"approvalAttestationSha256":{"$ref":"#/$defs/sha256"},"evidenceCaptureRef":{"$ref":"#/$defs/safeRef"},"evidenceCaptureSha256":{"$ref":"#/$defs/sha256"},"evidenceAttestationRef":{"$ref":"#/$defs/safeRef"},"evidenceAttestationSha256":{"$ref":"#/$defs/sha256"}}}}
},
"$defs":{"nonEmpty":{"type":"string","minLength":1,"pattern":"\\S"},"safeRef":{"type":"string","minLength":1,"pattern":"^(?!/)(?!.*(?:^|/)\\.\\.(?:/|$))[^\\u0000]+$"},"sha256":{"type":"string","pattern":"^[a-f0-9]{64}$"}},
"$comment":"Resolved standalone LDS 0.9.7 contract, revision standalone-0.9.7-r1. The distribution is owner-approved and unsigned; this schema is not a release attestation. Historical source identities and hashes are recorded separately."
},
"claim-record.schema.json":{
"$schema":"https://json-schema.org/draft/2020-12/schema",
"$id":"https://montri-th.github.io/Landometer/v0.9.7/standalone-0.9.7-r1/schemas/claim-record.schema.json",
"title":"Landometer stable claim record with explicit authority boundary v1.4",
"type":"object",
"additionalProperties":false,
"required":["schemaVersion","claimId","textByLocale","claimType","entity","proposition","scope","authority","status","evidenceRefs","methodologyRef","dataGrain","schemaRelease","contentRelease","provenance","rights","confidence","limitations","lastReviewed","validityBasis","validFrom","validUntil","publicProjectionEligible"],
"properties":{
"schemaVersion":{"const":"1.4"},
"claimId":{"type":"string","pattern":"^[a-z0-9][a-z0-9._-]{2,119}$"},
"textByLocale":{"type":"object","minProperties":1,"patternProperties":{"^[a-z]{2}(-[A-Z]{2})?$":{"$ref":"#/$defs/nonEmpty"}},"additionalProperties":false},
"claimType":{"enum":["fact","measurement","estimate","comparison","interpretation","commitment","capability","status"]},
"entity":{"type":"object","additionalProperties":false,"required":["entityId","entityType","name"],"properties":{"entityId":{"$ref":"#/$defs/nonEmpty"},"entityType":{"$ref":"#/$defs/nonEmpty"},"name":{"$ref":"#/$defs/nonEmpty"}}},
"proposition":{"type":"object","additionalProperties":false,"required":["assertion","valueState","value","unit"],"properties":{"assertion":{"$ref":"#/$defs/nonEmpty"},"valueState":{"enum":["not_applicable","stated","measured","estimated"]},"value":{"anyOf":[{"type":"number"},{"$ref":"#/$defs/nonEmpty"},{"type":"boolean"},{"type":"null"}]},"unit":{"$ref":"#/$defs/nullableString"}},"allOf":[{"if":{"type":"object","properties":{"valueState":{"const":"not_applicable"}},"required":["valueState"]},"then":{"properties":{"value":{"type":"null"},"unit":{"type":"null"}}}},{"if":{"type":"object","properties":{"valueState":{"enum":["measured","estimated"]}},"required":["valueState"]},"then":{"properties":{"value":{"type":"number"},"unit":{"$ref":"#/$defs/nonEmpty"}}}}]},
"scope":{"type":"object","additionalProperties":false,"required":["productScope","portfolioDomain","product","geography","audience","timeWindow"],"properties":{"productScope":{"enum":["shared_landometer","named_product"]},"portfolioDomain":{"enum":["shared","land","location","living"]},"product":{"$ref":"#/$defs/nullableString"},"geography":{"$ref":"#/$defs/nullableString"},"audience":{"$ref":"#/$defs/nullableString"},"timeWindow":{"$ref":"#/$defs/nullableString"}},"allOf":[{"if":{"type":"object","properties":{"productScope":{"const":"named_product"}},"required":["productScope"]},"then":{"properties":{"product":{"$ref":"#/$defs/nonEmpty"}}}},{"if":{"type":"object","properties":{"productScope":{"const":"shared_landometer"}},"required":["productScope"]},"then":{"properties":{"product":{"type":"null"}}}}]},
"authority":{
"type":"object",
"additionalProperties":false,
"required":["class","authorityRef","authorizes","observedSubjectId"],
"properties":{"class":{"enum":["portfolio_owner_approval","product_owner_approval","implementation_observation"]},"authorityRef":{"$ref":"#/$defs/publicRef"},"authorizes":{"enum":["portfolio_truth","named_product_truth","observed_usage_only"]},"observedSubjectId":{"$ref":"#/$defs/nullableString"}},
"allOf":[{"if":{"properties":{"class":{"const":"portfolio_owner_approval"}},"required":["class"]},"then":{"properties":{"authorizes":{"const":"portfolio_truth"},"observedSubjectId":{"type":"null"}}}},{"if":{"properties":{"class":{"const":"product_owner_approval"}},"required":["class"]},"then":{"properties":{"authorizes":{"const":"named_product_truth"},"observedSubjectId":{"type":"null"}}}},{"if":{"properties":{"class":{"const":"implementation_observation"}},"required":["class"]},"then":{"properties":{"authorizes":{"const":"observed_usage_only"},"observedSubjectId":{"$ref":"#/$defs/nonEmpty"}}}}]
},
"status":{"enum":["draft","reviewed","approved","superseded","withdrawn","expired"]},
"evidenceRefs":{"type":"array","items":{"$ref":"#/$defs/nonEmpty"},"uniqueItems":true},
"noPublicEvidenceReason":{"$ref":"#/$defs/nonEmpty"},
"methodologyRef":{"$ref":"#/$defs/nullableString"},
"dataGrain":{"type":"object","additionalProperties":false,"required":["entity","geography","time","unitOfObservation","denominator","aggregation"],"properties":{"entity":{"$ref":"#/$defs/nullableString"},"geography":{"$ref":"#/$defs/nullableString"},"time":{"$ref":"#/$defs/nullableString"},"unitOfObservation":{"$ref":"#/$defs/nullableString"},"denominator":{"$ref":"#/$defs/nullableString"},"aggregation":{"$ref":"#/$defs/nullableString"}}},
"schemaRelease":{"$ref":"#/$defs/nullableString"},
"contentRelease":{"$ref":"#/$defs/nonEmpty"},
"provenance":{"type":"object","additionalProperties":false,"required":["source","transformation","owner","reviewedAt","integrityRef"],"properties":{"source":{"$ref":"#/$defs/nonEmpty"},"transformation":{"$ref":"#/$defs/nonEmpty"},"owner":{"$ref":"#/$defs/nonEmpty"},"reviewedAt":{"type":"string","format":"date-time"},"integrityRef":{"$ref":"#/$defs/sha256Ref"}}},
"rights":{"type":"object","additionalProperties":false,"required":["status","publicationPermission","conditions"],"properties":{"status":{"enum":["public","internal","restricted","licensed","unknown"]},"publicationPermission":{"type":"boolean"},"conditions":{"$ref":"#/$defs/nullableString"}},"allOf":[{"if":{"type":"object","properties":{"status":{"const":"licensed"}},"required":["status"]},"then":{"properties":{"conditions":{"$ref":"#/$defs/nonEmpty"}}}}]},
"confidence":{"type":"object","additionalProperties":false,"required":["kind","value","explanation"],"properties":{"kind":{"enum":["not_applicable","qualitative","quantitative"]},"value":{"anyOf":[{"type":"number"},{"$ref":"#/$defs/nonEmpty"},{"type":"null"}]},"explanation":{"$ref":"#/$defs/nullableString"}},"allOf":[{"if":{"type":"object","properties":{"kind":{"const":"not_applicable"}},"required":["kind"]},"then":{"properties":{"value":{"type":"null"},"explanation":{"type":"null"}}}},{"if":{"type":"object","properties":{"kind":{"const":"qualitative"}},"required":["kind"]},"then":{"properties":{"value":{"$ref":"#/$defs/nonEmpty"},"explanation":{"$ref":"#/$defs/nonEmpty"}}}},{"if":{"type":"object","properties":{"kind":{"const":"quantitative"}},"required":["kind"]},"then":{"properties":{"value":{"type":"number","minimum":0,"maximum":1},"explanation":{"$ref":"#/$defs/nonEmpty"}}}}]},
"limitations":{"type":"array","uniqueItems":true,"items":{"type":"object","additionalProperties":false,"required":["id","textByLocale"],"properties":{"id":{"type":"string","pattern":"^[a-z0-9][a-z0-9._-]{2,119}$"},"textByLocale":{"type":"object","minProperties":1,"patternProperties":{"^[a-z]{2}(-[A-Z]{2})?$":{"$ref":"#/$defs/nonEmpty"}},"additionalProperties":false}}}},
"lastReviewed":{"type":"string","format":"date-time"},
"validityBasis":{"enum":["timeless","bounded_interval","until_superseded"]},
"validFrom":{"$ref":"#/$defs/dateTimeOrNull"},
"validUntil":{"$ref":"#/$defs/dateTimeOrNull"},
"supersedes":{"type":"array","items":{"type":"string","pattern":"^[a-z0-9][a-z0-9._-]{2,119}$"},"uniqueItems":true},
"publicProjectionEligible":{"type":"boolean"}
},
"allOf":[
{"if":{"properties":{"validityBasis":{"const":"timeless"}},"required":["validityBasis"]},"then":{"properties":{"validFrom":{"type":"null"},"validUntil":{"type":"null"}}}},
{"if":{"properties":{"validityBasis":{"const":"bounded_interval"}},"required":["validityBasis"]},"then":{"properties":{"validFrom":{"type":"string","format":"date-time"},"validUntil":{"type":"string","format":"date-time"}}}},
{"if":{"properties":{"validityBasis":{"const":"until_superseded"}},"required":["validityBasis"]},"then":{"properties":{"validUntil":{"type":"null"}}}},
{"if":{"type":"object","properties":{"evidenceRefs":{"type":"array","maxItems":0}},"required":["evidenceRefs"]},"then":{"required":["noPublicEvidenceReason"]}},
{"if":{"type":"object","properties":{"publicProjectionEligible":{"const":true}},"required":["publicProjectionEligible"]},"then":{"properties":{"status":{"const":"approved"},"evidenceRefs":{"type":"array","minItems":1,"items":{"$ref":"#/$defs/publicRef"}},"rights":{"type":"object","properties":{"status":{"enum":["public","licensed"]},"publicationPermission":{"const":true}},"required":["status","publicationPermission"]},"provenance":{"type":"object","properties":{"source":{"$ref":"#/$defs/publicRef"},"integrityRef":{"$ref":"#/$defs/sha256Ref"}},"required":["source","integrityRef"]}}}},
{"if":{"type":"object","properties":{"claimType":{"const":"measurement"}},"required":["claimType"]},"then":{"properties":{"proposition":{"type":"object","properties":{"valueState":{"const":"measured"}},"required":["valueState","value","unit"]},"evidenceRefs":{"type":"array","minItems":1},"methodologyRef":{"$ref":"#/$defs/nonEmpty"},"schemaRelease":{"$ref":"#/$defs/nonEmpty"}}}},
{"if":{"type":"object","properties":{"claimType":{"const":"estimate"}},"required":["claimType"]},"then":{"properties":{"proposition":{"type":"object","properties":{"valueState":{"const":"estimated"}},"required":["valueState","value","unit"]},"confidence":{"type":"object","properties":{"kind":{"enum":["qualitative","quantitative"]}},"required":["kind","value","explanation"]},"evidenceRefs":{"type":"array","minItems":1},"methodologyRef":{"$ref":"#/$defs/nonEmpty"},"schemaRelease":{"$ref":"#/$defs/nonEmpty"}}}},
{"if":{"type":"object","properties":{"claimType":{"const":"comparison"}},"required":["claimType"]},"then":{"properties":{"evidenceRefs":{"type":"array","minItems":1},"methodologyRef":{"$ref":"#/$defs/nonEmpty"},"schemaRelease":{"$ref":"#/$defs/nonEmpty"}}}},
{"if":{"type":"object","properties":{"entity":{"type":"object","properties":{"entityType":{"const":"protected_brand_line"}},"required":["entityType"]}},"required":["entity"]},"then":{"properties":{"authority":{"type":"object","properties":{"class":{"const":"portfolio_owner_approval"},"authorizes":{"const":"portfolio_truth"}},"required":["class","authorizes"]},"scope":{"type":"object","properties":{"productScope":{"const":"shared_landometer"},"portfolioDomain":{"const":"shared"},"product":{"type":"null"}},"required":["productScope","portfolioDomain","product"]}}}},
{"if":{"type":"object","properties":{"authority":{"type":"object","properties":{"class":{"const":"implementation_observation"}},"required":["class"]}},"required":["authority"]},"then":{"properties":{"entity":{"type":"object","properties":{"entityType":{"const":"implementation_observation"}},"required":["entityType"]},"scope":{"type":"object","properties":{"productScope":{"const":"named_product"},"product":{"$ref":"#/$defs/nonEmpty"},"timeWindow":{"$ref":"#/$defs/nonEmpty"}},"required":["productScope","product","timeWindow"]},"validityBasis":{"enum":["bounded_interval","until_superseded"]}}}}
],
"$defs":{"nonEmpty":{"type":"string","minLength":1,"pattern":"\\S"},"nullableString":{"anyOf":[{"$ref":"#/$defs/nonEmpty"},{"type":"null"}]},"dateTimeOrNull":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}]},"sha256Ref":{"type":"string","pattern":"^sha256:[a-f0-9]{64}$"},"publicRef":{"type":"string","pattern":"^(?:https://|urn:[a-z0-9][a-z0-9-]*:)\\S+$"}},
"$comment":"Resolved standalone LDS 0.9.7 contract, revision standalone-0.9.7-r1. The distribution is owner-approved and unsigned; this schema is not a release attestation. Historical source identities and hashes are recorded separately."
},
"conformance-receipt.schema.json":{
"$schema":"https://json-schema.org/draft/2020-12/schema",
"$id":"https://montri-th.github.io/Landometer/v0.9.7/standalone-0.9.7-r1/schemas/conformance-receipt.schema.json",
"title":"Landometer criterion-bound conformance receipt v1.2",
"type":"object",
"additionalProperties":false,
"required":["schemaVersion","releaseRef","receiptId","artifactId","artifactBuildId","checkId","method","result","assertion","criterionSha256","protocolId","owner","checkedAt","subjectFiles","evidenceFiles","evidenceRefs","testCases","verification","attestationRef"],
"properties":{
"schemaVersion":{"const":"1.2"},
"releaseRef":{"const":"v0.9.7-owner.1"},
"receiptId":{"type":"string","pattern":"^[a-z0-9][a-z0-9._-]{2,159}$"},
"artifactId":{"type":"string","pattern":"^[a-z0-9][a-z0-9._-]{2,119}$"},
"artifactBuildId":{"$ref":"#/$defs/nonEmpty"},
"checkId":{"type":"string","pattern":"^[A-Z0-9][A-Z0-9-]{2,79}$"},
"method":{"enum":["automated","visual","interaction","accessibility","manual","production"]},
"result":{"enum":["pass","fail"]},
"assertion":{"$ref":"#/$defs/nonEmpty"},
"criterionSha256":{"$ref":"#/$defs/sha256"},
"protocolId":{"type":"string","pattern":"^lds-v0\\.9\\.6/[A-Z0-9][A-Z0-9-]{2,79}$"},
"owner":{"$ref":"#/$defs/nonEmpty"},
"checkedAt":{"type":"string","format":"date-time"},
"subjectFiles":{"type":"array","minItems":1,"uniqueItems":true,"items":{"type":"object","additionalProperties":false,"required":["path","sha256"],"properties":{"path":{"$ref":"#/$defs/safeRef"},"sha256":{"$ref":"#/$defs/sha256"},"mediaType":{"$ref":"#/$defs/nonEmpty"}}}},
"evidenceFiles":{"type":"array","minItems":1,"uniqueItems":true,"items":{"type":"object","additionalProperties":false,"required":["path","sha256","mediaType","kind"],"properties":{"path":{"$ref":"#/$defs/safeRef"},"sha256":{"$ref":"#/$defs/sha256"},"mediaType":{"$ref":"#/$defs/nonEmpty"},"kind":{"enum":["runner_report","screenshot","interaction_log","accessibility_report","review_record","production_observation","extracted_text","network_trace","other"]}}}},
"evidenceRefs":{"type":"array","minItems":1,"uniqueItems":true,"items":{"$ref":"#/$defs/safeRef"}},
"testCases":{"type":"array","minItems":1,"uniqueItems":true,"items":{"type":"object","additionalProperties":false,"required":["id","fixture","expected","actual","result","evidenceRefs"],"properties":{"id":{"$ref":"#/$defs/nonEmpty"},"fixture":{"$ref":"#/$defs/nonEmpty"},"expected":{"$ref":"#/$defs/nonEmpty"},"actual":{"$ref":"#/$defs/nonEmpty"},"result":{"enum":["pass","fail"]},"evidenceRefs":{"type":"array","minItems":1,"uniqueItems":true,"items":{"$ref":"#/$defs/safeRef"}}}}},
"attestationRef":{"$ref":"#/$defs/safeRef"},
"verification":{"oneOf":[{"$ref":"#/$defs/automatedVerification"},{"$ref":"#/$defs/humanVerification"},{"$ref":"#/$defs/productionVerification"}]}
},
"allOf":[{"if":{"properties":{"method":{"const":"automated"}},"required":["method"]},"then":{"properties":{"verification":{"$ref":"#/$defs/automatedVerification"}}}},{"if":{"properties":{"method":{"enum":["visual","interaction","accessibility","manual"]}},"required":["method"]},"then":{"properties":{"verification":{"$ref":"#/$defs/humanVerification"}}}},{"if":{"properties":{"method":{"const":"production"}},"required":["method"]},"then":{"properties":{"verification":{"$ref":"#/$defs/productionVerification"}}}}],
"$defs":{
"nonEmpty":{"type":"string","minLength":1,"pattern":"\\S"},
"sha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},
"safeRef":{"type":"string","minLength":1,"pattern":"^(?!/)(?!.*(?:^|/)\\.\\.(?:/|$))[^\\u0000]+$"},
"httpsUrl":{"type":"string","pattern":"^https://[^\\s]+$"},
"automatedVerification":{"type":"object","additionalProperties":false,"required":["kind","tool","toolVersion","invocationId","startedAt","completedAt","exitCode"],"properties":{"kind":{"const":"automated_runner"},"tool":{"$ref":"#/$defs/nonEmpty"},"toolVersion":{"$ref":"#/$defs/nonEmpty"},"invocationId":{"$ref":"#/$defs/nonEmpty"},"startedAt":{"type":"string","format":"date-time"},"completedAt":{"type":"string","format":"date-time"},"exitCode":{"type":"integer"}}},
"humanVerification":{"type":"object","additionalProperties":false,"required":["kind","reviewer","reviewProtocolId","fixtureIds","blockingFindingCount","reviewedAt"],"properties":{"kind":{"const":"human_review"},"reviewer":{"$ref":"#/$defs/nonEmpty"},"reviewProtocolId":{"$ref":"#/$defs/nonEmpty"},"fixtureIds":{"type":"array","minItems":1,"uniqueItems":true,"items":{"$ref":"#/$defs/nonEmpty"}},"blockingFindingCount":{"type":"integer","minimum":0},"reviewedAt":{"type":"string","format":"date-time"}}},
"productionVerification":{"oneOf":[{"$ref":"#/$defs/webProductionVerification"},{"$ref":"#/$defs/fileProductionVerification"}]},
"webProductionVerification":{"type":"object","additionalProperties":false,"required":["kind","probeId","environment","observedUrl","expectedCanonicalUrl","httpStatus","redirectChain","observedAt","returnedContentSha256","expectedContentSha256","contentEquivalent"],"properties":{"kind":{"const":"production_probe"},"probeId":{"$ref":"#/$defs/nonEmpty"},"environment":{"const":"production"},"observedUrl":{"$ref":"#/$defs/httpsUrl"},"expectedCanonicalUrl":{"$ref":"#/$defs/httpsUrl"},"httpStatus":{"type":"integer","minimum":200,"maximum":299},"redirectChain":{"type":"array","uniqueItems":true,"items":{"$ref":"#/$defs/httpsUrl"}},"observedAt":{"type":"string","format":"date-time"},"returnedContentSha256":{"$ref":"#/$defs/sha256"},"expectedContentSha256":{"$ref":"#/$defs/sha256"},"contentEquivalent":{"type":"boolean"}}},
"fileProductionVerification":{"type":"object","additionalProperties":false,"required":["kind","probeId","environment","channel","observedAt","observedFiles","contentEquivalent"],"properties":{"kind":{"const":"delivery_probe"},"probeId":{"$ref":"#/$defs/nonEmpty"},"environment":{"enum":["final_export","distribution"]},"channel":{"$ref":"#/$defs/nonEmpty"},"observedAt":{"type":"string","format":"date-time"},"observedFiles":{"type":"array","minItems":1,"uniqueItems":true,"items":{"type":"object","additionalProperties":false,"required":["path","sha256","mediaType"],"properties":{"path":{"$ref":"#/$defs/safeRef"},"sha256":{"$ref":"#/$defs/sha256"},"mediaType":{"$ref":"#/$defs/nonEmpty"}}}},"contentEquivalent":{"type":"boolean"}}}
},
"$comment":"Resolved standalone LDS 0.9.7 contract, revision standalone-0.9.7-r1. The distribution is owner-approved and unsigned; this schema is not a release attestation. Historical source identities and hashes are recorded separately.",
"description":"Artifact criterion receipts retain operator attestation requirements. Unsigned standalone document checks use scoped-check-receipt.schema.json and cannot be promoted into this schema by inventing an attestation."
},
"crawler-purpose-policy.schema.json":{
"$schema":"https://json-schema.org/draft/2020-12/schema",
"$id":"https://montri-th.github.io/Landometer/v0.9.7/standalone-0.9.7-r1/schemas/crawler-purpose-policy.schema.json",
"title":"Landometer crawler-purpose policy v1.0",
"type":"object",
"additionalProperties":false,
"required":["schemaVersion","releaseRef","policyId","routeClass","decisions","approvedBy","approvedAt","authorityEvidenceRef"],
"properties":{"schemaVersion":{"const":"1.0"},"releaseRef":{"const":"v0.9.7-owner.1"},"policyId":{"$ref":"#/$defs/nonEmpty"},"routeClass":{"enum":["public","authenticated","internal","sensitive"]},"decisions":{"type":"array","minItems":6,"maxItems":6,"items":{"type":"object","additionalProperties":false,"required":["purpose","decision","rationale"],"properties":{"purpose":{"enum":["search_indexing","ai_search_retrieval","model_training","archival","monitoring","agent_action"]},"decision":{"enum":["allow","disallow","conditional"]},"rationale":{"$ref":"#/$defs/nonEmpty"},"conditionRef":{"$ref":"#/$defs/nonEmpty"}},"allOf":[{"if":{"properties":{"decision":{"const":"conditional"}},"required":["decision"]},"then":{"required":["conditionRef"]}}]}},"approvedBy":{"$ref":"#/$defs/nonEmpty"},"approvedAt":{"type":"string","format":"date-time"},"authorityEvidenceRef":{"$ref":"#/$defs/nonEmpty"}},
"allOf":[{"properties":{"decisions":{"contains":{"properties":{"purpose":{"const":"search_indexing"}},"required":["purpose"]},"minContains":1,"maxContains":1}}},{"properties":{"decisions":{"contains":{"properties":{"purpose":{"const":"ai_search_retrieval"}},"required":["purpose"]},"minContains":1,"maxContains":1}}},{"properties":{"decisions":{"contains":{"properties":{"purpose":{"const":"model_training"}},"required":["purpose"]},"minContains":1,"maxContains":1}}},{"properties":{"decisions":{"contains":{"properties":{"purpose":{"const":"archival"}},"required":["purpose"]},"minContains":1,"maxContains":1}}},{"properties":{"decisions":{"contains":{"properties":{"purpose":{"const":"monitoring"}},"required":["purpose"]},"minContains":1,"maxContains":1}}},{"properties":{"decisions":{"contains":{"properties":{"purpose":{"const":"agent_action"},"decision":{"enum":["disallow","conditional"]}},"required":["purpose","decision"]},"minContains":1,"maxContains":1}}}],
"$defs":{"nonEmpty":{"type":"string","minLength":1,"pattern":"\\S"}},
"$comment":"Resolved standalone LDS 0.9.7 contract, revision standalone-0.9.7-r1. The distribution is owner-approved and unsigned; this schema is not a release attestation. Historical source identities and hashes are recorded separately."
},
"disclosure-authority.schema.json":{
"$schema":"https://json-schema.org/draft/2020-12/schema",
"$id":"https://montri-th.github.io/Landometer/v0.9.7/standalone-0.9.7-r1/schemas/disclosure-authority.schema.json",
"title":"Landometer non-ordinary disclosure authority v1.0",
"type":"object",
"additionalProperties":false,
"required":["schemaVersion","releaseRef","authorityId","artifactId","purpose","status","authorizedBy","authorizedAt","authorityEvidenceRef","allowedFieldClasses"],
"properties":{"schemaVersion":{"const":"1.0"},"releaseRef":{"const":"v0.9.7-owner.1"},"authorityId":{"$ref":"#/$defs/nonEmpty"},"artifactId":{"$ref":"#/$defs/nonEmpty"},"purpose":{"enum":["design_system_reference","provenance_record"]},"status":{"const":"approved"},"authorizedBy":{"$ref":"#/$defs/nonEmpty"},"authorizedAt":{"type":"string","format":"date-time"},"authorityEvidenceRef":{"$ref":"#/$defs/nonEmpty"},"allowedFieldClasses":{"type":"array","minItems":1,"uniqueItems":true,"items":{"enum":["release_identifiers","schema_examples","provenance_facts","approval_facts"]}}},
"allOf":[{"if":{"properties":{"purpose":{"const":"design_system_reference"}},"required":["purpose"]},"then":{"properties":{"allowedFieldClasses":{"items":{"enum":["release_identifiers","schema_examples"]},"contains":{"const":"release_identifiers"}}}}},{"if":{"properties":{"purpose":{"const":"provenance_record"}},"required":["purpose"]},"then":{"properties":{"allowedFieldClasses":{"items":{"enum":["provenance_facts","approval_facts"]},"contains":{"const":"provenance_facts"}}}}}],
"$defs":{"nonEmpty":{"type":"string","minLength":1,"pattern":"\\S"}},
"$comment":"Resolved standalone LDS 0.9.7 contract, revision standalone-0.9.7-r1. The distribution is owner-approved and unsigned; this schema is not a release attestation. Historical source identities and hashes are recorded separately."
},
"format-implementation.schema.json":{
"$schema":"https://json-schema.org/draft/2020-12/schema",
"$id":"https://montri-th.github.io/Landometer/v0.9.7/standalone-0.9.7-r1/schemas/format-implementation.schema.json",
"title":"Landometer format implementation record v1.6",
"type":"object",
"additionalProperties":false,
"required":["schemaVersion","releaseRef","recordKind","recordId","authoringPlatform","formatProfile","runtime","targetProfileRef","formatKitId","tokenRef","tokenSha256","resolutionContext","requirements"],
"properties":{
"schemaVersion":{"const":"1.6"},
"releaseRef":{"const":"v0.9.7-owner.1"},
"recordKind":{"description":"reference_example is package learning material and is never sufficient for artifact QA; artifact_resolved is derived for and bound to one exact Build Card and artifact build.","enum":["reference_example","artifact_resolved"]},
"recordId":{"description":"Stable reference ID, or for artifact_resolved exactly implementation.<artifactId>.<artifactBuildId>.","$ref":"#/$defs/nonEmpty"},
"authoringPlatform":{"description":"The platform whose exact typography mappings and portability fixtures are resolved by this record.","enum":["browser","macos","windows"]},
"formatProfile":{"enum":["web_public","app_interactive","document_flow","pdf_fixed","deck_presentation","social_static"]},
"runtime":{"enum":["browser","native","static"]},
"targetProfileRef":{"$ref":"#/$defs/nonEmpty"},
"formatKitId":{"$ref":"#/$defs/nonEmpty"},
"tokenRef":{"$ref":"#/$defs/safeRef"},
"tokenSha256":{"$ref":"#/$defs/sha256"},
"artifactBinding":{"description":"Exact downstream artifact and Build Card byte binding. Forbidden on a shipped reference_example and mandatory on artifact_resolved.","type":"object","additionalProperties":false,"required":["artifactId","artifactBuildId","buildCardRef","buildCardSha256"],"properties":{"artifactId":{"$ref":"#/$defs/nonEmpty"},"artifactBuildId":{"$ref":"#/$defs/nonEmpty"},"buildCardRef":{"$ref":"#/$defs/safeRef"},"buildCardSha256":{"$ref":"#/$defs/sha256"}}},
"resolutionContext":{"description":"The exact experience, capabilities, side-bookmark choice, and component inventory used to derive the record's rules and tests.","type":"object","additionalProperties":false,"required":["experienceProfile","secondaryExperienceProfiles","capabilities","sideBookmarkSelected","componentIds"],"properties":{"experienceProfile":{"$ref":"#/$defs/nonEmpty"},"secondaryExperienceProfiles":{"$ref":"#/$defs/uniqueStringSet"},"capabilities":{"$ref":"#/$defs/uniqueStringSet"},"sideBookmarkSelected":{"type":"boolean"},"componentIds":{"$ref":"#/$defs/uniqueStrings"}}},
"requirements":{
"type":"object",
"additionalProperties":false,
"required":["resolvedAssetIds","identityAssetIds","identityImplementationIds","identityTypographyBindingIds","fontAssetIds","iconAssetIds","nativeFontMappingIds","nonWebIconPolicyId","portabilityFixtureIds","layoutSetId","componentRuleIds","componentIds","componentContracts","resolvedRuleIds","resolvedTestIds","accessibilityFixtureIds"],
"properties":{"resolvedAssetIds":{"$ref":"#/$defs/assetIds"},"identityAssetIds":{"$ref":"#/$defs/assetIds"},"identityImplementationIds":{"$ref":"#/$defs/uniqueStrings"},"identityTypographyBindingIds":{"$ref":"#/$defs/uniqueStrings"},"fontAssetIds":{"$ref":"#/$defs/assetIds"},"iconAssetIds":{"$ref":"#/$defs/assetIds"},"nativeFontMappingIds":{"$ref":"#/$defs/assetIds"},"nonWebIconPolicyId":{"anyOf":[{"const":"icon-policy.non-web.visible-label.01"},{"type":"null"}]},"portabilityFixtureIds":{"$ref":"#/$defs/assetIds"},"layoutSetId":{"$ref":"#/$defs/nonEmpty"},"componentRuleIds":{"$ref":"#/$defs/uniqueStrings"},"componentIds":{"$ref":"#/$defs/uniqueStrings"},"componentContracts":{"type":"array","minItems":1,"items":{"$ref":"#/$defs/componentContract"}},"resolvedRuleIds":{"$ref":"#/$defs/uniqueStrings"},"resolvedTestIds":{"$ref":"#/$defs/uniqueStrings"},"accessibilityFixtureIds":{"$ref":"#/$defs/uniqueStrings"}}
}
},
"allOf":[
{"if":{"properties":{"recordKind":{"const":"artifact_resolved"}},"required":["recordKind"]},"then":{"required":["artifactBinding"]},"else":{"not":{"required":["artifactBinding"]}}},
{"if":{"properties":{"runtime":{"const":"browser"}},"required":["runtime"]},"then":{"properties":{"authoringPlatform":{"const":"browser"}}}},
{"if":{"properties":{"runtime":{"enum":["native","static"]}},"required":["runtime"]},"then":{"properties":{"authoringPlatform":{"enum":["macos","windows"]}}}},
{"if":{"properties":{"runtime":{"const":"browser"}},"required":["runtime"]},"then":{"properties":{"requirements":{"properties":{"nativeFontMappingIds":{"maxItems":0},"nonWebIconPolicyId":{"type":"null"},"portabilityFixtureIds":{"maxItems":0}}}}}},
{"if":{"properties":{"runtime":{"enum":["native","static"]}},"required":["runtime"]},"then":{"properties":{"requirements":{"properties":{"fontAssetIds":{"maxItems":0},"iconAssetIds":{"maxItems":0},"nativeFontMappingIds":{"minItems":1},"nonWebIconPolicyId":{"const":"icon-policy.non-web.visible-label.01"},"portabilityFixtureIds":{"minItems":1}}}}}},
{"if":{"properties":{"formatProfile":{"const":"web_public"}},"required":["formatProfile"]},"then":{"properties":{"runtime":{"const":"browser"},"targetProfileRef":{"const":"target.web.responsive.360-1600.01"},"formatKitId":{"const":"kit.web.base.01"}}}},
{"if":{"properties":{"formatProfile":{"const":"app_interactive"},"runtime":{"const":"browser"}},"required":["formatProfile","runtime"]},"then":{"properties":{"targetProfileRef":{"const":"target.app.browser-responsive.360-1600.01"},"formatKitId":{"const":"kit.app.base.01"}}}},
{"if":{"properties":{"formatProfile":{"const":"app_interactive"},"runtime":{"const":"native"}},"required":["formatProfile","runtime"]},"then":{"properties":{"targetProfileRef":{"const":"target.app.native-responsive.360-1280.01"},"formatKitId":{"const":"kit.app.base.01"}}}},
{"if":{"properties":{"formatProfile":{"const":"app_interactive"}},"required":["formatProfile"]},"then":{"properties":{"runtime":{"enum":["browser","native"]}}}},
{"if":{"properties":{"formatProfile":{"const":"document_flow"}},"required":["formatProfile"]},"then":{"properties":{"runtime":{"const":"static"},"targetProfileRef":{"const":"target.document.a4-portrait.01"},"formatKitId":{"const":"kit.document.flow.01"}}}},
{"if":{"properties":{"formatProfile":{"const":"pdf_fixed"}},"required":["formatProfile"]},"then":{"properties":{"runtime":{"const":"static"},"targetProfileRef":{"const":"target.pdf.a4-portrait.01"},"formatKitId":{"const":"kit.pdf.fixed.01"}}}},
{"if":{"properties":{"formatProfile":{"const":"deck_presentation"}},"required":["formatProfile"]},"then":{"properties":{"runtime":{"const":"static"},"targetProfileRef":{"const":"target.deck.16x9.01"},"formatKitId":{"const":"kit.deck.presentation.01"}}}},
{"if":{"properties":{"formatProfile":{"const":"social_static"}},"required":["formatProfile"]},"then":{"properties":{"runtime":{"const":"static"},"targetProfileRef":{"enum":["target.social.square.1080.01","target.social.og.1200x630.01"]},"formatKitId":{"const":"kit.social.static.01"}}}}
],
"$defs":{
"nonEmpty":{"type":"string","minLength":1,"pattern":"\\S"},
"safeRef":{"type":"string","minLength":1,"pattern":"^(?!/)(?!.*(?:^|/)\\.\\.(?:/|$))[^\\u0000]+$"},
"sha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},
"uniqueStrings":{"type":"array","minItems":1,"uniqueItems":true,"items":{"$ref":"#/$defs/nonEmpty"}},
"uniqueStringSet":{"type":"array","uniqueItems":true,"items":{"$ref":"#/$defs/nonEmpty"}},
"assetIds":{"type":"array","uniqueItems":true,"items":{"$ref":"#/$defs/nonEmpty"}},
"componentState":{"type":"object","additionalProperties":false,"required":["status","behavior"],"properties":{"status":{"enum":["required","not_applicable"]},"behavior":{"$ref":"#/$defs/nonEmpty"}}},
"componentContract":{
"type":"object",
"additionalProperties":false,
"required":["componentId","componentClass","governingRuleIds","purpose","nonPurpose","semanticRoles","contentContract","localeStressFixtureIds","states","formatBehavior","accessibility","tokenRefs","evidencePermissionBoundary","acceptanceFixtureIds","antiPatterns"],
"properties":{
"componentId":{"$ref":"#/$defs/nonEmpty"},
"componentClass":{"enum":["navigation","disclosure","side_bookmark","navigational_cta","stateful_cta","other"]},
"governingRuleIds":{"$ref":"#/$defs/uniqueStrings"},
"purpose":{"$ref":"#/$defs/nonEmpty"},
"nonPurpose":{"$ref":"#/$defs/nonEmpty"},
"semanticRoles":{"$ref":"#/$defs/uniqueStrings"},
"contentContract":{"$ref":"#/$defs/nonEmpty"},
"localeStressFixtureIds":{"$ref":"#/$defs/uniqueStrings"},
"states":{"type":"object","additionalProperties":false,"required":["default","hover","focus","activePressed","selectedCurrent","disabled","loading","empty","error","success"],"properties":{"default":{"$ref":"#/$defs/componentState"},"hover":{"$ref":"#/$defs/componentState"},"focus":{"$ref":"#/$defs/componentState"},"activePressed":{"$ref":"#/$defs/componentState"},"selectedCurrent":{"$ref":"#/$defs/componentState"},"disabled":{"$ref":"#/$defs/componentState"},"loading":{"$ref":"#/$defs/componentState"},"empty":{"$ref":"#/$defs/componentState"},"error":{"$ref":"#/$defs/componentState"},"success":{"$ref":"#/$defs/componentState"}}},
"formatBehavior":{"type":"object","additionalProperties":false,"required":["formatProfile","behavior"],"properties":{"formatProfile":{"enum":["web_public","app_interactive","document_flow","pdf_fixed","deck_presentation","social_static"]},"behavior":{"$ref":"#/$defs/nonEmpty"}}},
"accessibility":{"type":"object","additionalProperties":false,"required":["name","role","value","order","status"],"properties":{"name":{"$ref":"#/$defs/nonEmpty"},"role":{"$ref":"#/$defs/nonEmpty"},"value":{"$ref":"#/$defs/nonEmpty"},"order":{"$ref":"#/$defs/nonEmpty"},"status":{"$ref":"#/$defs/nonEmpty"}}},
"tokenRefs":{"$ref":"#/$defs/uniqueStrings"},
"evidencePermissionBoundary":{"$ref":"#/$defs/nonEmpty"},
"acceptanceFixtureIds":{"$ref":"#/$defs/uniqueStrings"},
"antiPatterns":{"$ref":"#/$defs/uniqueStrings"}
},
"allOf":[
{"if":{"properties":{"componentClass":{"const":"navigational_cta"}},"required":["componentClass"]},"then":{"properties":{"semanticRoles":{"items":{"enum":["link","text","destination_cue"]}},"states":{"properties":{"selectedCurrent":{"properties":{"status":{"const":"not_applicable"}}},"disabled":{"properties":{"status":{"const":"not_applicable"}}},"loading":{"properties":{"status":{"const":"not_applicable"}}},"empty":{"properties":{"status":{"const":"not_applicable"}}},"error":{"properties":{"status":{"const":"not_applicable"}}},"success":{"properties":{"status":{"const":"not_applicable"}}}}}}}},
{"if":{"properties":{"componentClass":{"const":"stateful_cta"}},"required":["componentClass"]},"then":{"properties":{"semanticRoles":{"contains":{"const":"button"}},"states":{"properties":{"disabled":{"properties":{"status":{"const":"required"}}},"loading":{"properties":{"status":{"const":"required"}}},"error":{"properties":{"status":{"const":"required"}}},"success":{"properties":{"status":{"const":"required"}}}}}}}}
]
}
},
"$comment":"Resolved standalone LDS 0.9.7 contract, revision standalone-0.9.7-r1. The distribution is owner-approved and unsigned; this schema is not a release attestation. Historical source identities and hashes are recorded separately."
},
"format-kits.schema.json":{
"$schema":"https://json-schema.org/draft/2020-12/schema",
"$id":"https://montri-th.github.io/Landometer/v0.9.7/standalone-0.9.7-r1/schemas/format-kits.schema.json",
"title":"Landometer semantic format-kit registry v1.4",
"type":"object",
"additionalProperties":false,
"required":["schemaVersion","releaseRef","status","note","kits"],
"properties":{
"schemaVersion":{"const":"1.4"},
"releaseRef":{"const":"v0.9.7-owner.1"},
"status":{"enum":["candidate","active"]},
"note":{"type":"string","pattern":"\\S"},
"kits":{"type":"array","minItems":6,"items":{"type":"object","additionalProperties":false,"required":["id","formatProfile","targetProfileRefs","roleMap","requiredImplementationControls","artifactProductionRequirement"],"properties":{"id":{"type":"string","pattern":"^kit\\."},"formatProfile":{"enum":["web_public","app_interactive","document_flow","pdf_fixed","deck_presentation","social_static"]},"targetProfileRefs":{"type":"array","minItems":1,"items":{"type":"string","pattern":"^target\\."},"uniqueItems":true},"roleMap":{"type":"object","minProperties":1,"required":["identity"],"properties":{"identity":{"type":"string","pattern":"\\S"}},"additionalProperties":{"type":"string","pattern":"\\S"}},"requiredImplementationControls":{"type":"array","minItems":1,"items":{"type":"string","pattern":"\\S"},"uniqueItems":true},"artifactProductionRequirement":{"type":"string","pattern":"\\S"}}}}
},
"$comment":"Resolved standalone LDS 0.9.7 contract, revision standalone-0.9.7-r1. The distribution is owner-approved and unsigned; this schema is not a release attestation. Historical source identities and hashes are recorded separately."
},
"migration-ledger.schema.json":{
"$schema":"https://json-schema.org/draft/2020-12/schema",
"$id":"https://montri-th.github.io/Landometer/v0.9.7/standalone-0.9.7-r1/schemas/migration-ledger.schema.json",
"title":"Landometer predecessor-rule migration ledger v1.2",
"type":"object",
"additionalProperties":false,
"required":["schemaVersion","releaseRef","status","predecessor","expectedRuleCount","countingNote","dispositionVocabulary","entries","newRuleIds","sentenceLedger","ruleIdReassignment","supersededCandidates","valueDeltas"],
"properties":{
"schemaVersion":{"const":"1.2"},
"releaseRef":{"type":"object","additionalProperties":false,"required":["dsVersion","authoringRevision","rulesetId","machinePackage"],"properties":{"dsVersion":{"const":"0.9.7"},"authoringRevision":{"const":"0.9.7-owner.1"},"rulesetId":{"const":"lds-rules-0.9.7"},"machinePackage":{"const":"v0.9.7-owner.1"}}},
"status":{"enum":["candidate","active"]},
"predecessor":{"type":"object","additionalProperties":false,"required":["dsVersion","authoringRevision","sourceFile","sha256"],"properties":{"dsVersion":{"const":"0.9.4"},"authoringRevision":{"const":"0.9.4-r2"},"sourceFile":{"type":"string","pattern":"\\S"},"sha256":{"type":"string","pattern":"^[a-f0-9]{64}$"}}},
"expectedRuleCount":{"const":50},
"countingNote":{"type":"string","pattern":"\\S"},
"dispositionVocabulary":{"type":"array","minItems":6,"maxItems":6,"uniqueItems":true,"items":{"enum":["retained","amended_in_place","superseded_by","deprecated_alias","moved_to_product_pack","removed_with_owner_reason"]}},
"entries":{"type":"array","minItems":50,"maxItems":50,"items":{"type":"object","additionalProperties":false,"required":["predecessorRuleId","disposition","targetRuleIds","ownerRationale"],"properties":{"predecessorRuleId":{"type":"string","pattern":"^[A-Z][A-Z0-9-]*-[0-9]{2}$"},"disposition":{"enum":["retained","amended_in_place","superseded_by","deprecated_alias","moved_to_product_pack","removed_with_owner_reason"]},"targetRuleIds":{"type":"array","items":{"type":"string","pattern":"^[A-Z][A-Z0-9-]*-[0-9]{2}$"},"uniqueItems":true},"ownerRationale":{"type":"string","pattern":"\\S"},"targetProductPackRef":{"type":"string","pattern":"\\S"}}}},
"newRuleIds":{"type":"array","uniqueItems":true,"items":{"type":"string","pattern":"^[A-Z][A-Z0-9-]*-[0-9]{2}$"}},
"withdrawnCandidate":{"type":"object"},
"supersededCandidate":{"type":"object","required":["ref","rev","masterSha256","packageZipSha256","supersededOn","amendments"],"properties":{"amendments":{"type":"array","minItems":1,"items":{"type":"object","required":["ruleId","change","decidedOn","evidenceRef"]}}}},
"supersededCandidates":{"type":"array","minItems":2,"items":{"type":"object","required":["ref","rev","masterSha256","packageZipSha256","supersededOn"]}},
"ruleIdReassignment":{"type":"array","minItems":1,"items":{"type":"object","required":["fromRuleId","toRuleId","title","stage","reason","decidedOn","evidenceRef","consumerRule"],"additionalProperties":false,"properties":{"fromRuleId":{"type":"string"},"toRuleId":{"type":"string"},"title":{"type":"string"},"stage":{"type":"string"},"reason":{"type":"string"},"decidedOn":{"type":"string"},"evidenceRef":{"type":"string"},"consumerRule":{"type":"string"}}}},
"valueDeltas":{"type":"object","required":["source","baseline","rows"],"properties":{"source":{"type":"object","required":["name","sha256"]},"baseline":{"type":"string"},"shippedDifferences":{"type":"array"},"rows":{"type":"array","minItems":26,"maxItems":26,"items":{"type":"object","required":["token","theme","from","to","why"],"properties":{"token":{"type":"string","pattern":"^--(scale|series)-"},"theme":{"enum":["light","dark"]},"from":{"type":"string","pattern":"^#[0-9A-F]{6}$"},"to":{"type":"string","pattern":"^#[0-9A-F]{6}$"},"why":{"type":"string"}},"additionalProperties":true}}}},
"ruleIdReuse":{"type":"array","items":{"type":"object","required":["ruleId","lineage","consumerRule","disposition"],"additionalProperties":false,"properties":{"ruleId":{"type":"string"},"lineage":{"type":"string"},"consumerRule":{"type":"string"},"disposition":{"type":"string"}}}},
"sentenceLedger":{"type":"array","items":{"type":"object","required":["stage","editId","kind","newText","reason","affects"],"properties":{"stage":{"type":"string"},"editId":{"type":"string"},"rule":{"type":["string","null"]},"kind":{"type":"string"},"superseded":{"type":["string","null"]},"oldText":{"type":["string","null"]},"newText":{"type":"string"},"reason":{"type":"string"},"affects":{"type":"array","items":{"type":"string"}}},"additionalProperties":true}}
},
"$comment":"Resolved standalone LDS 0.9.7 contract, revision standalone-0.9.7-r1. The distribution is owner-approved and unsigned; this schema is not a release attestation. Historical source identities and hashes are recorded separately."
},
"motif-register.schema.json":{
"$schema":"https://json-schema.org/draft/2020-12/schema",
"$id":"https://montri-th.github.io/Landometer/v0.9.7/standalone-0.9.7-r1/schemas/motif-register.schema.json",
"title":"Landometer motif register v1.1",
"type":"object",
"additionalProperties":false,
"required":["schemaVersion","releaseRef","status","ruleIds","source","jobRegistry","beats","joyBudget","sharedFamily","productOverlays","carrierPolicy","boundaries"],
"properties":{
"schemaVersion":{"const":"1.1"},
"releaseRef":{"const":"v0.9.7-owner.1"},
"status":{"enum":["candidate","active"]},
"ruleIds":{"type":"array","items":{"type":"string"}},
"source":{"type":"object","required":["repository","commit","manifest"],"properties":{"repository":{"type":"string"},"commit":{"type":"string","pattern":"^[a-f0-9]{40}$"},"commitDate":{"type":"string"},"manifest":{"type":"object","required":["path","sha256"],"properties":{"path":{"type":"string"},"sha256":{"type":"string","pattern":"^[a-f0-9]{64}$"}},"additionalProperties":true},"studioManifest":{"type":"object"},"hashVerification":{"type":"string"},"governanceNote":{"type":"string"}},"additionalProperties":false},
"jobRegistry":{"type":"array","minItems":10,"maxItems":10,"uniqueItems":true,"items":{"type":"string"}},
"beats":{"type":"object","required":["INTENT","AHA","NEXT_ACTION","kindsByBeat"],"properties":{"INTENT":{"const":"opening"},"AHA":{"const":"transition"},"NEXT_ACTION":{"const":"closing"},"kindsByBeat":{"type":"object","required":["opening","transition","closing"]}}},
"joyBudget":{"type":"object","required":["perLongRoute","perTaskSurface","forbiddenRegions"],"properties":{"perLongRoute":{"const":3},"perTaskSurface":{"const":1},"forbiddenRegions":{"type":"array","items":{"enum":["first_answer","primary_proof","primary_action"]},"minItems":3}}},
"sharedFamily":{
"type":"object",
"required":["id","runtime","kinds","replayContract"],
"properties":{
"id":{"const":"landometer.motif.v3"},
"runtime":{"type":"array","minItems":2,"maxItems":2,"items":{"type":"object","required":["assetId","path","sha256"],"properties":{"assetId":{"type":"string"},"path":{"type":"string"},"sha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"bytes":{"type":["integer","null"]}},"additionalProperties":true}},
"kinds":{
"type":"object",
"required":["dial","rings","layers","slice","cultivate","logo"],
"additionalProperties":false,
"properties":{
"dial":{"type":"object","required":["beat","allowedJobs","prohibitedJobs","cycleMs","variants","allowedCarriers"],"properties":{"allowedCarriers":{"$ref":"#/$defs/allowedPair"},"beat":{"enum":["opening","transition","closing"]},"allowedJobs":{"type":"array","minItems":1,"items":{"type":"string"}},"prohibitedJobs":{"type":"array","items":{"type":"string"}},"cycleMs":{"type":"integer","minimum":2000},"variants":{"type":"object","required":["full","quiet"],"properties":{"full":{"type":"object","required":["assetId","path","sha256"],"properties":{"assetId":{"type":"string"},"path":{"type":"string"},"sha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"bytes":{"type":["integer","null"]}},"additionalProperties":true},"quiet":{"type":"object","required":["assetId","path","sha256"],"properties":{"assetId":{"type":"string"},"path":{"type":"string"},"sha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"bytes":{"type":["integer","null"]}},"additionalProperties":true}}}},"additionalProperties":true},
"rings":{"type":"object","required":["beat","allowedJobs","prohibitedJobs","cycleMs","variants","allowedCarriers"],"properties":{"allowedCarriers":{"$ref":"#/$defs/allowedPair"},"beat":{"enum":["opening","transition","closing"]},"allowedJobs":{"type":"array","minItems":1,"items":{"type":"string"}},"prohibitedJobs":{"type":"array","items":{"type":"string"}},"cycleMs":{"type":"integer","minimum":2000},"variants":{"type":"object","required":["full","quiet"],"properties":{"full":{"type":"object","required":["assetId","path","sha256"],"properties":{"assetId":{"type":"string"},"path":{"type":"string"},"sha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"bytes":{"type":["integer","null"]}},"additionalProperties":true},"quiet":{"type":"object","required":["assetId","path","sha256"],"properties":{"assetId":{"type":"string"},"path":{"type":"string"},"sha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"bytes":{"type":["integer","null"]}},"additionalProperties":true}}}},"additionalProperties":true},
"layers":{"type":"object","required":["beat","allowedJobs","prohibitedJobs","cycleMs","variants","allowedCarriers"],"properties":{"allowedCarriers":{"$ref":"#/$defs/allowedPair"},"beat":{"enum":["opening","transition","closing"]},"allowedJobs":{"type":"array","minItems":1,"items":{"type":"string"}},"prohibitedJobs":{"type":"array","items":{"type":"string"}},"cycleMs":{"type":"integer","minimum":2000},"variants":{"type":"object","required":["full","quiet"],"properties":{"full":{"type":"object","required":["assetId","path","sha256"],"properties":{"assetId":{"type":"string"},"path":{"type":"string"},"sha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"bytes":{"type":["integer","null"]}},"additionalProperties":true},"quiet":{"type":"object","required":["assetId","path","sha256"],"properties":{"assetId":{"type":"string"},"path":{"type":"string"},"sha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"bytes":{"type":["integer","null"]}},"additionalProperties":true}}}},"additionalProperties":true},
"slice":{"type":"object","required":["beat","allowedJobs","prohibitedJobs","cycleMs","variants","allowedCarriers"],"properties":{"allowedCarriers":{"$ref":"#/$defs/allowedPair"},"beat":{"enum":["opening","transition","closing"]},"allowedJobs":{"type":"array","minItems":1,"items":{"type":"string"}},"prohibitedJobs":{"type":"array","items":{"type":"string"}},"cycleMs":{"type":"integer","minimum":2000},"variants":{"type":"object","required":["full","quiet"],"properties":{"full":{"type":"object","required":["assetId","path","sha256"],"properties":{"assetId":{"type":"string"},"path":{"type":"string"},"sha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"bytes":{"type":["integer","null"]}},"additionalProperties":true},"quiet":{"type":"object","required":["assetId","path","sha256"],"properties":{"assetId":{"type":"string"},"path":{"type":"string"},"sha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"bytes":{"type":["integer","null"]}},"additionalProperties":true}}}},"additionalProperties":true},
"cultivate":{"type":"object","required":["beat","allowedJobs","prohibitedJobs","cycleMs","variants","allowedCarriers"],"properties":{"allowedCarriers":{"$ref":"#/$defs/allowedPair"},"beat":{"enum":["opening","transition","closing"]},"allowedJobs":{"type":"array","minItems":1,"items":{"type":"string"}},"prohibitedJobs":{"type":"array","items":{"type":"string"}},"cycleMs":{"type":"integer","minimum":2000},"variants":{"type":"object","required":["full","quiet"],"properties":{"full":{"type":"object","required":["assetId","path","sha256"],"properties":{"assetId":{"type":"string"},"path":{"type":"string"},"sha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"bytes":{"type":["integer","null"]}},"additionalProperties":true},"quiet":{"type":"object","required":["assetId","path","sha256"],"properties":{"assetId":{"type":"string"},"path":{"type":"string"},"sha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"bytes":{"type":["integer","null"]}},"additionalProperties":true}}}},"additionalProperties":true},
"logo":{"type":"object","required":["beat","allowedJobs","prohibitedJobs","cycleMs","variants","allowedCarriers"],"properties":{"allowedCarriers":{"$ref":"#/$defs/allowedPair"},"beat":{"enum":["opening","transition","closing"]},"allowedJobs":{"type":"array","minItems":1,"items":{"type":"string"}},"prohibitedJobs":{"type":"array","items":{"type":"string"}},"cycleMs":{"type":"integer","minimum":2000},"variants":{"type":"object","required":["full","quiet"],"properties":{"full":{"type":"object","required":["assetId","path","sha256"],"properties":{"assetId":{"type":"string"},"path":{"type":"string"},"sha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"bytes":{"type":["integer","null"]}},"additionalProperties":true},"quiet":{"type":"object","required":["assetId","path","sha256"],"properties":{"assetId":{"type":"string"},"path":{"type":"string"},"sha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"bytes":{"type":["integer","null"]}},"additionalProperties":true}}}},"additionalProperties":true}
}
}
},
"additionalProperties":true
},
"productOverlays":{"type":"array","items":{"type":"object","required":["id","product","approval","assets"],"properties":{"id":{"type":"string"},"product":{"type":"string"},"approval":{"type":"object","required":["status","decidedOn","evidenceRef"],"properties":{"status":{"enum":["owner_approved","pre_approved_pending_production","candidate"]},"decidedOn":{"type":"string"},"evidenceRef":{"type":"string"}},"additionalProperties":true},"assets":{"type":"array","items":{"type":"object","required":["path","sha256"],"properties":{"path":{"type":"string"},"sha256":{"type":"string","pattern":"^[a-f0-9]{64}$"}},"additionalProperties":true}}},"additionalProperties":true}},
"carrierPolicy":{
"type":"object",
"additionalProperties":true,
"required":["ruleId","status","authority","method","bands","placement","themeRule","inkRule","refusal","carriers","classes","ladder","agentFields","ladderParity","allowed","measured"],
"properties":{
"ruleId":{"const":"MOTIF-06"},
"status":{"enum":["candidate","active"]},
"authority":{"type":"object","required":["decision","ladder","evidence"],"properties":{"ladder":{"type":"object","required":["path","sha256","approval"],"properties":{"sha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"approval":{"type":"object","required":["path","sha256","pointer"],"properties":{"sha256":{"type":"string","pattern":"^[a-f0-9]{64}$"}}}}},"evidence":{"type":"object","required":["path","sha256"],"properties":{"sha256":{"type":"string","pattern":"^[a-f0-9]{64}$"}}}}},
"bands":{"type":"object","required":["meaningCapableMin","decorativeOnlyMin","invisibleMax"],"properties":{"meaningCapableMin":{"const":3},"decorativeOnlyMin":{"const":1.3},"invisibleMax":{"const":1.29}}},
"placement":{"type":"object","required":["full","quiet"],"properties":{"full":{"type":"object","required":["carrierClasses","ink"],"properties":{"carrierClasses":{"const":["light_plain"]},"ink":{"const":"blue"}}},"quiet":{"type":"object","required":["carrierClasses","ink"],"properties":{"carrierClasses":{"const":["deep_plain","deep_atmosphere"]},"ink":{"const":"sky"}}}}},
"carriers":{"type":"object","minProperties":1,"additionalProperties":{"type":"object","required":["type","themed","tokenRef"],"properties":{"type":{"enum":["solid","gradient"]},"themed":{"type":"boolean"},"tokenRef":{"type":"string"}}}},
"classes":{"type":"object","required":["light_plain","deep_plain","light_atmosphere","deep_atmosphere"]},
"ladder":{"type":"array","minItems":5,"maxItems":5,"items":{"type":"object","required":["rung","name","action"]}},
"ladderParity":{"type":"object","required":["compared","equal"]},
"allowed":{"type":"object","required":["dial","rings","layers","slice","cultivate","logo"],"additionalProperties":false,"properties":{"dial":{"$ref":"#/$defs/allowedPair"},"rings":{"$ref":"#/$defs/allowedPair"},"layers":{"$ref":"#/$defs/allowedPair"},"slice":{"$ref":"#/$defs/allowedPair"},"cultivate":{"$ref":"#/$defs/allowedPair"},"logo":{"$ref":"#/$defs/allowedPair"}}},
"measured":{"type":"array","minItems":1,"items":{"type":"object","required":["kind","variant","carrier","carrierClass","paints","weakest","strongest","verdict","shapeIntact","allowed"],"properties":{"kind":{"enum":["dial","rings","layers","slice","cultivate","logo"]},"variant":{"enum":["full","quiet"]},"carrier":{"type":"string"},"carrierClass":{"enum":["light_plain","deep_plain","light_atmosphere","deep_atmosphere"]},"weakest":{"type":"number"},"strongest":{"type":"number"},"verdict":{"enum":["meaningCapable","decorativeOnly","invisible"]},"shapeIntact":{"type":"boolean"},"allowed":{"type":"boolean"}}}}
}
},
"candidateBriefsStudio14":{"type":"array"},
"boundaries":{"type":"object"}
},
"$defs":{"allowedPair":{"type":"object","required":["full","quiet"],"additionalProperties":false,"properties":{"full":{"type":"array","uniqueItems":true,"items":{"type":"string"}},"quiet":{"type":"array","uniqueItems":true,"items":{"type":"string"}}}}},
"$comment":"Resolved standalone LDS 0.9.7 contract, revision standalone-0.9.7-r1. The distribution is owner-approved and unsigned; this schema is not a release attestation. Historical source identities and hashes are recorded separately."
},
"promotion-snapshot.schema.json":{
"$schema":"https://json-schema.org/draft/2020-12/schema",
"$id":"https://montri-th.github.io/Landometer/v0.9.7/standalone-0.9.7-r1/schemas/promotion-snapshot.schema.json",
"title":"Landometer non-circular promotion snapshot v1.0",
"type":"object",
"additionalProperties":false,
"required":["schemaVersion","releaseRef","snapshotId","conformanceLevel","artifactId","artifactBuildId","buildCard","artifactManifest","preset","socialSidecar","implementationSources","outputs","receipts","createdAt"],
"properties":{
"schemaVersion":{"const":"1.0"},
"releaseRef":{"const":"v0.9.7-owner.1"},
"snapshotId":{"type":"string","pattern":"^[a-z0-9][a-z0-9._-]{2,159}$"},
"conformanceLevel":{"enum":["artifact_qa_passed","production_verified"]},
"artifactId":{"$ref":"#/$defs/nonEmpty"},
"artifactBuildId":{"$ref":"#/$defs/nonEmpty"},
"buildCard":{"$ref":"#/$defs/fileBinding"},
"artifactManifest":{"type":"object","additionalProperties":false,"required":["ref","canonicalPromotionProjectionSha256"],"properties":{"ref":{"$ref":"#/$defs/safeRef"},"canonicalPromotionProjectionSha256":{"$ref":"#/$defs/sha256"}}},
"preset":{"$ref":"#/$defs/fileBinding"},
"socialSidecar":{"anyOf":[{"$ref":"#/$defs/fileBinding"},{"type":"null"}]},
"implementationSources":{"type":"array","uniqueItems":true,"items":{"type":"object","additionalProperties":false,"required":["ref","sha256","lineageReceiptRef","lineageReceiptSha256","lineageAttestationRef","lineageAttestationSha256"],"properties":{"ref":{"$ref":"#/$defs/safeRef"},"sha256":{"$ref":"#/$defs/sha256"},"lineageReceiptRef":{"$ref":"#/$defs/safeRef"},"lineageReceiptSha256":{"$ref":"#/$defs/sha256"},"lineageAttestationRef":{"$ref":"#/$defs/safeRef"},"lineageAttestationSha256":{"$ref":"#/$defs/sha256"}}}},
"outputs":{"type":"array","minItems":1,"uniqueItems":true,"items":{"type":"object","additionalProperties":false,"required":["path","sha256","mediaType"],"properties":{"path":{"$ref":"#/$defs/safeRef"},"sha256":{"$ref":"#/$defs/sha256"},"mediaType":{"$ref":"#/$defs/nonEmpty"}}}},
"receipts":{"type":"array","minItems":1,"uniqueItems":true,"items":{"type":"object","additionalProperties":false,"required":["checkId","receiptRef","receiptSha256","attestationRef","attestationSha256"],"properties":{"checkId":{"$ref":"#/$defs/nonEmpty"},"receiptRef":{"$ref":"#/$defs/safeRef"},"receiptSha256":{"$ref":"#/$defs/sha256"},"attestationRef":{"$ref":"#/$defs/safeRef"},"attestationSha256":{"$ref":"#/$defs/sha256"}}}},
"createdAt":{"type":"string","format":"date-time"}
},
"$defs":{"nonEmpty":{"type":"string","minLength":1,"pattern":"\\S"},"sha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"safeRef":{"type":"string","minLength":1,"pattern":"^(?!/)(?!.*(?:^|/)\\.\\.(?:/|$))[^\\u0000]+$"},"fileBinding":{"type":"object","additionalProperties":false,"required":["ref","sha256"],"properties":{"ref":{"$ref":"#/$defs/safeRef"},"sha256":{"$ref":"#/$defs/sha256"}}}},
"$comment":"Resolved standalone LDS 0.9.7 contract, revision standalone-0.9.7-r1. The distribution is owner-approved and unsigned; this schema is not a release attestation. Historical source identities and hashes are recorded separately."
},
"social-sidecar.schema.json":{
"$schema":"https://json-schema.org/draft/2020-12/schema",
"$id":"https://montri-th.github.io/Landometer/v0.9.7/standalone-0.9.7-r1/schemas/social-sidecar.schema.json",
"title":"Landometer DS0.9.7 social-sidecar.schema.json",
"type":"object",
"additionalProperties":false,
"required":["schemaVersion","releaseRef","kind","sidecarId","publicationStatus","generatedAt","promotionCheckedAt","productionObservedAt","artifact","locale","campaign","claimBinding","evidenceBindings","actionBinding","rights","visibleCopyInspection","outputClarity"],
"properties":{
"schemaVersion":{"const":"1.2"},
"releaseRef":{"const":"v0.9.7-owner.1"},
"kind":{"const":"social_static_publication_sidecar"},
"sidecarId":{"$ref":"#/$defs/stableId"},
"publicationStatus":{"enum":["example_only","approved_for_publication"],"description":"example_only documents the reusable shape and grants no publication state; an Artifact Manifest at artifact_qa_passed or production_verified must bind approved_for_publication."},
"generatedAt":{"type":"string","format":"date-time"},
"promotionCheckedAt":{"type":"string","format":"date-time","description":"The instant at which this exact sidecar was evaluated for promotion. Destination freshness and all campaign, claim, and rights windows are evaluated at this instant."},
"productionObservedAt":{"oneOf":[{"type":"string","format":"date-time"},{"type":"null"}],"description":"Null before production verification; otherwise the exact post-promotion production observation time bound to the Artifact Manifest's production evidence and used as a destination-freshness boundary."},
"artifact":{
"type":"object",
"additionalProperties":false,
"required":["artifactId","artifactBuildId","builtAt","formatProfile","targetProfileRef","buildCardRef","buildCardSha256","creativePath","creativeSha256","creativeMediaType","creativeWidthPx","creativeHeightPx"],
"properties":{"artifactId":{"$ref":"#/$defs/stableId"},"artifactBuildId":{"$ref":"#/$defs/stableId"},"builtAt":{"type":"string","format":"date-time"},"formatProfile":{"const":"social_static"},"targetProfileRef":{"enum":["target.social.square.1080.01","target.social.og.1200x630.01"]},"buildCardRef":{"$ref":"#/$defs/safeRef"},"buildCardSha256":{"$ref":"#/$defs/sha256"},"creativePath":{"$ref":"#/$defs/safeRef"},"creativeSha256":{"$ref":"#/$defs/sha256"},"creativeMediaType":{"enum":["image/png","image/jpeg","image/webp"]},"creativeWidthPx":{"type":"integer","minimum":1},"creativeHeightPx":{"type":"integer","minimum":1}},
"allOf":[{"if":{"properties":{"targetProfileRef":{"const":"target.social.square.1080.01"}},"required":["targetProfileRef"]},"then":{"properties":{"creativeWidthPx":{"const":1080},"creativeHeightPx":{"const":1080}}}},{"if":{"properties":{"targetProfileRef":{"const":"target.social.og.1200x630.01"}},"required":["targetProfileRef"]},"then":{"properties":{"creativeWidthPx":{"const":1200},"creativeHeightPx":{"const":630}}}}]
},
"locale":{"type":"object","additionalProperties":false,"required":["primary","languageDirection"],"properties":{"primary":{"$ref":"#/$defs/locale"},"languageDirection":{"enum":["ltr","rtl"]}}},
"campaign":{"type":"object","additionalProperties":false,"description":"Campaign identity, channel, and expiresAt must exactly match the Build Card output.formatContext social_context for promoted artifacts.","required":["campaignId","channel","name","startsAt","expiryBasis","expiresAt"],"properties":{"campaignId":{"$ref":"#/$defs/stableId"},"channel":{"$ref":"#/$defs/stableId"},"name":{"$ref":"#/$defs/resolvedAudienceText"},"startsAt":{"type":"string","format":"date-time"},"expiryBasis":{"enum":["fixed_timestamp","no_expiry"]},"expiresAt":{"oneOf":[{"type":"string","format":"date-time"},{"type":"null"}]}},"allOf":[{"if":{"properties":{"expiryBasis":{"const":"fixed_timestamp"}},"required":["expiryBasis"]},"then":{"properties":{"expiresAt":{"type":"string","format":"date-time"}}}},{"if":{"properties":{"expiryBasis":{"const":"no_expiry"}},"required":["expiryBasis"]},"then":{"properties":{"expiresAt":{"type":"null"}}}}]},
"claimBinding":{
"type":"object",
"additionalProperties":false,
"required":["claimId","claimManifestRef","claimManifestSha256","claimRecordRef","claimRecordSha256","claimAsOf","validityBasis","validUntil","visibleText","visibleLimitations"],
"properties":{"claimId":{"$ref":"#/$defs/stableId"},"claimManifestRef":{"$ref":"#/$defs/safeRef"},"claimManifestSha256":{"$ref":"#/$defs/sha256"},"claimRecordRef":{"$ref":"#/$defs/safeRef"},"claimRecordSha256":{"$ref":"#/$defs/sha256"},"claimAsOf":{"type":"string","format":"date-time"},"validityBasis":{"enum":["timeless","bounded_interval","until_superseded"]},"validUntil":{"oneOf":[{"type":"string","format":"date-time"},{"type":"null"}]},"visibleText":{"$ref":"#/$defs/resolvedAudienceText"},"visibleLimitations":{"type":"array","uniqueItems":true,"items":{"type":"object","additionalProperties":false,"required":["limitationId","text"],"properties":{"limitationId":{"$ref":"#/$defs/stableId"},"text":{"$ref":"#/$defs/resolvedAudienceText"}}}}},
"allOf":[{"if":{"properties":{"validityBasis":{"const":"bounded_interval"}},"required":["validityBasis"]},"then":{"properties":{"validUntil":{"type":"string","format":"date-time"}}}},{"if":{"properties":{"validityBasis":{"enum":["timeless","until_superseded"]}},"required":["validityBasis"]},"then":{"properties":{"validUntil":{"type":"null"}}}}]
},
"evidenceBindings":{"type":"array","minItems":1,"uniqueItems":true,"items":{"type":"object","additionalProperties":false,"required":["evidenceRef","claimId","visibleCue","evidenceKind","observedAt"],"properties":{"evidenceRef":{"$ref":"#/$defs/stablePublicRef"},"claimId":{"$ref":"#/$defs/stableId"},"visibleCue":{"$ref":"#/$defs/resolvedAudienceText"},"evidenceKind":{"enum":["owner_approval","source","method","dataset","public_record"]},"observedAt":{"type":"string","format":"date-time"}}}},
"actionBinding":{
"type":"object",
"additionalProperties":false,
"description":"Exact visible projection of the Build Card action identified by experience.primaryActionRef; that action must be available and carry priority primary.",
"required":["actionId","availability","label","outcome","destinationKind","destination","presentation","destinationCue","destinationVerification"],
"properties":{
"actionId":{"$ref":"#/$defs/stableId"},
"availability":{"const":"available"},
"label":{"$ref":"#/$defs/resolvedAudienceText"},
"outcome":{"$ref":"#/$defs/resolvedAudienceText"},
"destinationKind":{"enum":["route","external","download","form","contact"]},
"destination":{"$ref":"#/$defs/nonEmpty"},
"presentation":{"type":"object","additionalProperties":false,"required":["mode","technique"],"properties":{"mode":{"const":"static_equivalent"},"technique":{"const":"destination_cue"}}},
"destinationCue":{"$ref":"#/$defs/resolvedAudienceText","description":"Exact deterministic visible cue for the governed primary destination: route/contact targets remain exact; HTTPS external/download/form targets use the URL parser's canonical lowercase hostname, non-default port when present, path, query, and fragment, omitting only the https:// scheme."},
"destinationVerification":{"type":"object","additionalProperties":false,"required":["status","method","observedDestination","observedAt","freshnessTtlSeconds","evidenceRef","evidenceSha256"],"properties":{"status":{"const":"passed"},"method":{"enum":["http_head_or_get","route_resolution","download_probe","form_probe","contact_path_review"]},"observedDestination":{"$ref":"#/$defs/nonEmpty"},"observedAt":{"type":"string","format":"date-time"},"freshnessTtlSeconds":{"type":"integer","minimum":1,"maximum":86400,"description":"Explicit bounded maximum age at both promotionCheckedAt and productionObservedAt when production verification is claimed; an unbounded destination check is prohibited."},"evidenceRef":{"$ref":"#/$defs/safeRef"},"evidenceSha256":{"$ref":"#/$defs/sha256"}}}
},
"allOf":[
{"if":{"properties":{"destinationKind":{"const":"route"}},"required":["destinationKind"]},"then":{"properties":{"destination":{"pattern":"^(?:/|\\./)(?!.*(?:^|/)\\.\\.(?:/|$))\\S+$"},"destinationVerification":{"properties":{"method":{"const":"route_resolution"}}}}}},
{"if":{"properties":{"destinationKind":{"const":"external"}},"required":["destinationKind"]},"then":{"properties":{"destination":{"$ref":"#/$defs/httpsUrl"},"destinationVerification":{"properties":{"method":{"const":"http_head_or_get"}}}}}},
{"if":{"properties":{"destinationKind":{"enum":["download","form"]}},"required":["destinationKind"]},"then":{"properties":{"destination":{"anyOf":[{"$ref":"#/$defs/httpsUrl"},{"pattern":"^(?:/|\\./)(?!.*(?:^|/)\\.\\.(?:/|$))\\S+$"}]}}}},
{"if":{"properties":{"destinationKind":{"const":"download"}},"required":["destinationKind"]},"then":{"properties":{"destinationVerification":{"properties":{"method":{"const":"download_probe"}}}}}},
{"if":{"properties":{"destinationKind":{"const":"form"}},"required":["destinationKind"]},"then":{"properties":{"destinationVerification":{"properties":{"method":{"const":"form_probe"}}}}}},
{"if":{"properties":{"destinationKind":{"const":"contact"}},"required":["destinationKind"]},"then":{"properties":{"destination":{"pattern":"^(?:mailto:[^\\s@]+@[^\\s@]+|tel:\\+?[0-9(). -]{6,})$"},"destinationVerification":{"properties":{"method":{"const":"contact_path_review"}}}}}}
]
},
"rights":{
"type":"object",
"additionalProperties":false,
"required":["status","publicationPermission","licenseOrPermission","rightsSourceRef","rightsSourceSha256","allowedChannels","allowedLocales","validFrom","expiryBasis","expiresAt"],
"properties":{"status":{"enum":["public","licensed"]},"publicationPermission":{"const":true},"licenseOrPermission":{"$ref":"#/$defs/resolvedAudienceText"},"rightsSourceRef":{"$ref":"#/$defs/safeRef"},"rightsSourceSha256":{"$ref":"#/$defs/sha256"},"allowedChannels":{"type":"array","minItems":1,"uniqueItems":true,"items":{"$ref":"#/$defs/stableId"}},"allowedLocales":{"type":"array","minItems":1,"uniqueItems":true,"items":{"$ref":"#/$defs/locale"}},"validFrom":{"type":"string","format":"date-time"},"expiryBasis":{"enum":["fixed_timestamp","no_expiry"]},"expiresAt":{"oneOf":[{"type":"string","format":"date-time"},{"type":"null"}]}},
"allOf":[{"if":{"properties":{"expiryBasis":{"const":"fixed_timestamp"}},"required":["expiryBasis"]},"then":{"properties":{"expiresAt":{"type":"string","format":"date-time"}}}},{"if":{"properties":{"expiryBasis":{"const":"no_expiry"}},"required":["expiryBasis"]},"then":{"properties":{"expiresAt":{"type":"null"}}}}]
},
"visibleCopyInspection":{"type":"object","additionalProperties":false,"required":["subjectPath","subjectSha256","method","result","inspectedAt","normalizationAlgorithm","normalizedProjectionSha256","evidenceRef","evidenceSha256"],"properties":{"subjectPath":{"$ref":"#/$defs/safeRef"},"subjectSha256":{"$ref":"#/$defs/sha256"},"method":{"const":"ocr_plus_visual_review"},"result":{"const":"pass"},"inspectedAt":{"type":"string","format":"date-time"},"normalizationAlgorithm":{"const":"unicode_nfc_trim_collapse_whitespace_v1"},"normalizedProjectionSha256":{"$ref":"#/$defs/sha256"},"evidenceRef":{"$ref":"#/$defs/safeRef"},"evidenceSha256":{"$ref":"#/$defs/sha256"}}},
"outputClarity":{"type":"object","additionalProperties":false,"required":["mode","workflowState","blockingDependencyRefs","placeholderCount","unresolvedWorkflowLanguagePresent","audienceProjectionId","audienceTextHashAlgorithm","audienceTextSha256","visibleCopyProjectionId","visibleCopyNormalization","visibleCopySha256"],"properties":{"mode":{"const":"resolved_only"},"workflowState":{"const":"resolved"},"blockingDependencyRefs":{"type":"array","maxItems":0},"placeholderCount":{"const":0},"unresolvedWorkflowLanguagePresent":{"const":false},"audienceProjectionId":{"const":"social_sidecar_audience_v2"},"audienceTextHashAlgorithm":{"const":"sha256_canonical_json_v1"},"audienceTextSha256":{"$ref":"#/$defs/sha256"},"visibleCopyProjectionId":{"const":"social_visible_copy_projection_v1"},"visibleCopyNormalization":{"const":"unicode_nfc_trim_collapse_whitespace_v1"},"visibleCopySha256":{"$ref":"#/$defs/sha256"}}}
},
"$defs":{
"nonEmpty":{"allOf":[{"$ref":"#/$defs/workflowFreeString"},{"minLength":1,"pattern":"\\S"}]},
"stableId":{"allOf":[{"$ref":"#/$defs/workflowFreeString"},{"pattern":"^[a-z0-9][a-z0-9._-]{2,159}$"}]},
"locale":{"allOf":[{"$ref":"#/$defs/workflowFreeString"},{"pattern":"^[A-Za-z]{2,3}(?:-[A-Za-z0-9]{2,8})*$"}]},
"sha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},
"httpsUrl":{"type":"string","pattern":"^https://[^\\s]+$"},
"stablePublicRef":{"allOf":[{"$ref":"#/$defs/workflowFreeString"},{"pattern":"^(?:https://[^\\s]+|urn:[A-Za-z0-9][A-Za-z0-9:._-]+)$"}]},
"safeRef":{"allOf":[{"$ref":"#/$defs/workflowFreeString"},{"minLength":1,"pattern":"^(?!/)(?!.*(?:^|/)\\.\\.(?:/|$))[^\\u0000]+$"}]},
"workflowFreeString":{"type":"string","pattern":"^(?![\\s\\S]*(?:(?:^|[^A-Za-z0-9])(?:[Tt][Oo][Dd][Oo]|[Tt][Bb][Dd]|[Ff][Ii][Xx][Mm][Ee]|[Pp][Ll][Aa][Cc][Ee][Hh][Oo][Ll][Dd][Ee][Rr]|[Ll][Oo][Rr][Ee][Mm]\\s+[Ii][Pp][Ss][Uu][Mm]|[Dd][Rr][Aa][Ff][Tt]|[Cc][Aa][Nn][Dd][Ii][Dd][Aa][Tt][Ee]|[Pp][Ee][Nn][Dd][Ii][Nn][Gg](?:\\s+(?:[Aa][Pp][Pp][Rr][Oo][Vv][Aa][Ll]|[Rr][Ee][Vv][Ii][Ee][Ww]))?|[Aa][Ww][Aa][Ii][Tt][Ii][Nn][Gg]\\s+[Aa][Pp][Pp][Rr][Oo][Vv][Aa][Ll]|[Uu][Nn][Vv][Ee][Rr][Ii][Ff][Ii][Ee][Dd]|[Nn][Oo][Tt]\\s+[Tt][Ee][Ss][Tt][Ee][Dd]|[Nn][Ee][Ee][Dd][Ss]\\s+[Rr][Ee][Vv][Ii][Ee][Ww]|[Ii][Nn][Tt][Ee][Rr][Nn][Aa][Ll]\\s+[Oo][Nn][Ll][Yy]|[Rr][Ee][Vv][Ii][Ee][Ww]\\s+[Cc][Oo][Pp][Yy])(?:$|[^A-Za-z0-9])|ฉบับร่าง|รอ(?:อนุมัติ|ตรวจ)|ยังไม่ตรวจ))[\\s\\S]*$"},
"resolvedAudienceText":{"allOf":[{"$ref":"#/$defs/workflowFreeString"},{"minLength":1,"pattern":"\\S"}]}
},
"$comment":"Resolved standalone LDS 0.9.7 contract, revision standalone-0.9.7-r1. The distribution is owner-approved and unsigned; this schema is not a release attestation. Historical source identities and hashes are recorded separately."
},
"source-lineage-receipt.schema.json":{
"$schema":"https://json-schema.org/draft/2020-12/schema",
"$id":"https://montri-th.github.io/Landometer/v0.9.7/standalone-0.9.7-r1/schemas/source-lineage-receipt.schema.json",
"title":"Landometer implementation source lineage receipt v1.0",
"type":"object",
"additionalProperties":false,
"required":["schemaVersion","releaseRef","receiptId","artifactId","artifactBuildId","source","process","outputs","executedAt"],
"properties":{
"schemaVersion":{"const":"1.0"},
"releaseRef":{"const":"v0.9.7-owner.1"},
"receiptId":{"type":"string","pattern":"^[a-z0-9][a-z0-9._-]{2,159}$"},
"artifactId":{"$ref":"#/$defs/nonEmpty"},
"artifactBuildId":{"$ref":"#/$defs/nonEmpty"},
"source":{"type":"object","additionalProperties":false,"required":["role","ref","sha256","mediaType"],"properties":{"role":{"enum":["editable_source","template","export_preset","style_map","component_source","other_governed_source"]},"ref":{"$ref":"#/$defs/safeRef"},"sha256":{"$ref":"#/$defs/sha256"},"mediaType":{"$ref":"#/$defs/nonEmpty"}}},
"process":{"type":"object","additionalProperties":false,"required":["processId","tool","toolVersion","parametersSha256"],"properties":{"processId":{"$ref":"#/$defs/nonEmpty"},"tool":{"$ref":"#/$defs/nonEmpty"},"toolVersion":{"$ref":"#/$defs/nonEmpty"},"parametersSha256":{"$ref":"#/$defs/sha256"}}},
"outputs":{"type":"array","minItems":1,"uniqueItems":true,"items":{"type":"object","additionalProperties":false,"required":["path","sha256","mediaType"],"properties":{"path":{"$ref":"#/$defs/safeRef"},"sha256":{"$ref":"#/$defs/sha256"},"mediaType":{"$ref":"#/$defs/nonEmpty"}}}},
"executedAt":{"type":"string","format":"date-time"}
},
"$defs":{"nonEmpty":{"type":"string","minLength":1,"pattern":"\\S"},"sha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"safeRef":{"type":"string","minLength":1,"pattern":"^(?!/)(?!.*(?:^|/)\\.\\.(?:/|$))(?!.*[\\u0000-\\u001F]).+$"}},
"$comment":"Resolved standalone LDS 0.9.7 contract, revision standalone-0.9.7-r1. The distribution is owner-approved and unsigned; this schema is not a release attestation. Historical source identities and hashes are recorded separately."
},
"structured-data-projection.schema.json":{
"$schema":"https://json-schema.org/draft/2020-12/schema",
"$id":"https://montri-th.github.io/Landometer/v0.9.7/standalone-0.9.7-r1/schemas/structured-data-projection.schema.json",
"title":"Landometer visible-truth structured-data projection v1.1",
"type":"object",
"additionalProperties":false,
"required":["schemaVersion","releaseRef","pageKind","canonicalUrl","visibleTruthOnly","entities"],
"properties":{
"schemaVersion":{"const":"1.1"},
"releaseRef":{"const":"v0.9.7-owner.1"},
"pageKind":{"enum":["portfolio_home","product_landing","detail","article","index","tool","dataset","search_results","utility"]},
"canonicalUrl":{"$ref":"#/$defs/httpsUrl"},
"visibleTruthOnly":{"const":true},
"entities":{
"type":"array",
"minItems":1,
"items":{
"type":"object",
"additionalProperties":false,
"required":["entityId","role","identityBasis","types","nameByLocale","url","claimIds"],
"properties":{"entityId":{"$ref":"#/$defs/publicIri"},"role":{"enum":["page","subject"]},"identityBasis":{"enum":["canonical_page","projected_claim_entity"]},"types":{"type":"array","minItems":1,"uniqueItems":true,"items":{"enum":["Organization","WebSite","WebPage","CollectionPage","ItemList","Article","BlogPosting","Dataset","DataCatalog","WebApplication","SoftwareApplication","SearchResultsPage","ContactPage","CreativeWork","Place","Thing"]}},"nameByLocale":{"type":"object","minProperties":1,"additionalProperties":{"$ref":"#/$defs/nonEmpty"}},"url":{"$ref":"#/$defs/httpsUrl"},"claimIds":{"type":"array","uniqueItems":true,"items":{"$ref":"#/$defs/nonEmpty"}}},
"allOf":[{"if":{"properties":{"role":{"const":"page"}},"required":["role"]},"then":{"properties":{"identityBasis":{"const":"canonical_page"}}}},{"if":{"properties":{"role":{"const":"subject"}},"required":["role"]},"then":{"properties":{"identityBasis":{"const":"projected_claim_entity"},"claimIds":{"minItems":1}}}}]
}
}
},
"$defs":{"nonEmpty":{"type":"string","minLength":1,"pattern":"\\S"},"httpsUrl":{"type":"string","pattern":"^https://[^\\s]+$"},"publicIri":{"type":"string","pattern":"^(?:https://[^\\s]+|urn:[a-z0-9][a-z0-9-]*:[^\\s]+)$"}},
"$comment":"Resolved standalone LDS 0.9.7 contract, revision standalone-0.9.7-r1. The distribution is owner-approved and unsigned; this schema is not a release attestation. Historical source identities and hashes are recorded separately."
},
"target-profiles.schema.json":{
"$schema":"https://json-schema.org/draft/2020-12/schema",
"$id":"https://montri-th.github.io/Landometer/v0.9.7/standalone-0.9.7-r1/schemas/target-profiles.schema.json",
"title":"Landometer target profile registry v1.3",
"type":"object",
"additionalProperties":false,
"required":["schemaVersion","releaseRef","status","unknownTargetBehavior","extensionRegistry","socialStaticScope","profiles"],
"properties":{
"schemaVersion":{"const":"1.3"},
"releaseRef":{"const":"v0.9.7-owner.1"},
"status":{"enum":["candidate","active"]},
"unknownTargetBehavior":{"const":"block"},
"extensionRegistry":{"type":"null"},
"socialStaticScope":{"const":"square_1080_and_og_1200x630"},
"profiles":{"type":"array","minItems":7,"items":{"type":"object","required":["id","formatProfile","runtime","unit","canvas","safeArea","grid","typeAdapter","requiredFixtures","fixtureCriteria"],"properties":{"id":{"type":"string","pattern":"^target\\."},"formatProfile":{"enum":["web_public","app_interactive","document_flow","pdf_fixed","deck_presentation","social_static"]},"runtime":{"enum":["browser","native","static"]},"unit":{"enum":["css_px","platform_dp","mm_pt","px_pt","px"]},"canvas":{"type":"object"},"safeArea":{},"grid":{"type":"object"},"typeAdapter":{},"minimumDiscreteTarget":{"type":"number","minimum":44},"export":{"type":"object"},"requiredFixtures":{"type":"array","minItems":1,"items":{"type":"string","pattern":"\\S"},"uniqueItems":true},"fixtureCriteria":{"type":"object","minProperties":1,"additionalProperties":{"type":"string","minLength":1,"pattern":"\\S"}},"recognisers":{"type":"object"}},"additionalProperties":false}}
},
"$comment":"Resolved standalone LDS 0.9.7 contract, revision standalone-0.9.7-r1. The distribution is owner-approved and unsigned; this schema is not a release attestation. Historical source identities and hashes are recorded separately."
},
"verification-attestation.schema.json":{
"$schema":"https://json-schema.org/draft/2020-12/schema",
"$id":"https://montri-th.github.io/Landometer/v0.9.7/standalone-0.9.7-r1/schemas/verification-attestation.schema.json",
"title":"Landometer detached verification attestation v1.1",
"type":"object",
"additionalProperties":false,
"required":["schemaVersion","releaseRef","attestationId","purpose","subject","issuerId","keyId","issuedAt","expiresAt","signatureAlgorithm","signatureEncoding","signature"],
"properties":{
"schemaVersion":{"const":"1.1"},
"releaseRef":{"const":"v0.9.7-owner.1"},
"attestationId":{"type":"string","pattern":"^[a-z0-9][a-z0-9._-]{2,159}$"},
"purpose":{"enum":["release_approval","asset_approval","disclosure_authority","automated_conformance","human_conformance","production_conformance","claim_approval","claim_evidence_capture","agent_authority","agent_revocation","agent_execution","agent_confirmation","source_lineage","package_root","promotion_snapshot"]},
"subject":{"type":"object","additionalProperties":false,"required":["ref","sha256","mediaType"],"properties":{"ref":{"$ref":"#/$defs/safeRef"},"sha256":{"$ref":"#/$defs/sha256"},"mediaType":{"$ref":"#/$defs/nonEmpty"}}},
"issuerId":{"$ref":"#/$defs/nonEmpty"},
"keyId":{"type":"string","pattern":"^[a-z0-9][a-z0-9._:-]{2,159}$"},
"issuedAt":{"type":"string","format":"date-time"},
"expiresAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}]},
"signatureAlgorithm":{"const":"Ed25519"},
"signatureEncoding":{"const":"base64"},
"signature":{"type":"string","pattern":"^[A-Za-z0-9+/]{80,}={0,2}$"}
},
"$defs":{"nonEmpty":{"type":"string","minLength":1,"pattern":"\\S"},"sha256":{"type":"string","pattern":"^[a-f0-9]{64}$"},"safeRef":{"type":"string","minLength":1,"pattern":"^(?!/)(?!.*(?:^|/)\\.\\.(?:/|$))(?!.*[\\u0000-\\u001F]).+$"}},
"$comment":"Resolved standalone LDS 0.9.7 contract, revision standalone-0.9.7-r1. The distribution is owner-approved and unsigned; this schema is not a release attestation. Historical source identities and hashes are recorded separately."
},
"verification-trust-policy.schema.json":{
"$schema":"https://json-schema.org/draft/2020-12/schema",
"$id":"https://montri-th.github.io/Landometer/v0.9.7/standalone-0.9.7-r1/schemas/verification-trust-policy.schema.json",
"title":"Landometer caller-pinned verification trust policy v1.0",
"type":"object",
"additionalProperties":false,
"required":["schemaVersion","policyId","scope","stores"],
"properties":{"schemaVersion":{"const":"1.0"},"policyId":{"type":"string","pattern":"^[a-z0-9][a-z0-9._-]{2,159}$"},"scope":{"enum":["package_release","operator_external"]},"stores":{"type":"array","minItems":1,"uniqueItems":true,"items":{"type":"object","additionalProperties":false,"required":["trustStoreId","keys"],"properties":{"trustStoreId":{"type":"string","pattern":"^[a-z0-9][a-z0-9._-]{2,159}$"},"keys":{"type":"array","minItems":1,"uniqueItems":true,"items":{"type":"object","additionalProperties":false,"required":["keyId","issuerId","publicKeySpkiSha256"],"properties":{"keyId":{"type":"string","pattern":"^[a-z0-9][a-z0-9._:-]{2,159}$"},"issuerId":{"type":"string","minLength":1,"pattern":"\\S"},"publicKeySpkiSha256":{"type":"string","pattern":"^[a-f0-9]{64}$"}}}}}}}},
"$comment":"Resolved standalone LDS 0.9.7 contract, revision standalone-0.9.7-r1. The distribution is owner-approved and unsigned; this schema is not a release attestation. Historical source identities and hashes are recorded separately."
},
"verification-trust-store.schema.json":{
"$schema":"https://json-schema.org/draft/2020-12/schema",
"$id":"https://montri-th.github.io/Landometer/v0.9.7/standalone-0.9.7-r1/schemas/verification-trust-store.schema.json",
"title":"Landometer operator-controlled verification trust store v1.1",
"type":"object",
"additionalProperties":false,
"required":["schemaVersion","trustStoreId","controlledBy","scope","keys"],
"properties":{
"schemaVersion":{"const":"1.1"},
"trustStoreId":{"type":"string","pattern":"^[a-z0-9][a-z0-9._-]{2,159}$"},
"controlledBy":{"$ref":"#/$defs/nonEmpty"},
"scope":{"enum":["package_release","operator_external"]},
"keys":{
"type":"array",
"minItems":1,
"items":{
"type":"object",
"additionalProperties":false,
"required":["keyId","issuerId","algorithm","publicKeySpkiPem","allowedPurposes","validFrom","validUntil","revokedAt"],
"properties":{"keyId":{"type":"string","pattern":"^[a-z0-9][a-z0-9._:-]{2,159}$"},"issuerId":{"$ref":"#/$defs/nonEmpty"},"algorithm":{"const":"Ed25519"},"publicKeySpkiPem":{"type":"string","pattern":"^-----BEGIN PUBLIC KEY-----\\n[A-Za-z0-9+/=\\n]+-----END PUBLIC KEY-----\\n?$"},"allowedPurposes":{"type":"array","minItems":1,"uniqueItems":true,"items":{"enum":["release_approval","asset_approval","disclosure_authority","automated_conformance","human_conformance","production_conformance","claim_approval","claim_evidence_capture","agent_authority","agent_revocation","agent_execution","agent_confirmation","source_lineage","package_root","promotion_snapshot"]}},"validFrom":{"type":"string","format":"date-time"},"validUntil":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}]},"revokedAt":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}]}}
}
}
},
"$defs":{"nonEmpty":{"type":"string","minLength":1,"pattern":"\\S"}},
"$comment":"Resolved standalone LDS 0.9.7 contract, revision standalone-0.9.7-r1. The distribution is owner-approved and unsigned; this schema is not a release attestation. Historical source identities and hashes are recorded separately."
},
"evidence-value.schema.json":{
"$schema":"https://json-schema.org/draft/2020-12/schema",
"$id":"https://montri-th.github.io/Landometer/v0.9.7/standalone-0.9.7-r1/schemas/evidence-value.schema.json",
"title":"Landometer DS0.9.7 evidence-value.schema.json",
"description":"Numeric value/state pair only. Other record metadata is allowed and remains governed by the original claim/provenance contracts. This schema does not approve a claim.",
"type":"object",
"required":["value","state"],
"properties":{"state":{"enum":["measured","measured_zero","no_data","out_of_scope","suppressed","not_yet"]},"value":{"type":["number","null"]}},
"oneOf":[{"properties":{"state":{"const":"measured"},"value":{"type":"number","not":{"const":0}}}},{"properties":{"state":{"const":"measured_zero"},"value":{"const":0}}},{"properties":{"state":{"enum":["no_data","out_of_scope","suppressed","not_yet"]},"value":{"type":"null"}}}],
"$comment":"Resolved standalone LDS 0.9.7 contract, revision standalone-0.9.7-r1. The distribution is owner-approved and unsigned; this schema is not a release attestation. Historical source identities and hashes are recorded separately."
},
"scoped-check-receipt.schema.json":{"$schema":"https://json-schema.org/draft/2020-12/schema","$id":"https://montri-th.github.io/Landometer/v0.9.7/standalone-0.9.7-r1/schemas/scoped-check-receipt.schema.json","title":"Standalone0.9.7 scoped document/package check","type":"object","additionalProperties":false,"required":["releaseRef","kind","signatureStatus","fullArtifactConformance","checkedAt","checks","limitations"],"properties":{"releaseRef":{"const":"v0.9.7-owner.1"},"kind":{"const":"scoped_document_package_check"},"signatureStatus":{"const":"unsigned"},"fullArtifactConformance":{"const":false},"checkedAt":{"type":"string","format":"date-time"},"checks":{"type":"array","minItems":1,"items":{"type":"object","additionalProperties":false,"required":["id","result","evidence"],"properties":{"id":{"type":"string","minLength":1},"result":{"enum":["pass","fail","not_run"]},"evidence":{"type":"string","minLength":1}}}},"limitations":{"type":"array","minItems":1,"items":{"type":"string","minLength":1}}}}
},
"assetFiles":[
{"path":"assets/lds-0.9.7/build-kit/assets/arvo-latin-700-normal.woff2","bytes":17348,"sha256":"3d908a2c04ec4c59d26d1454008b2d6744480654663a5f88e439f6483976bd37","url":"https://montri-th.github.io/Landometer/v0.9.7/package/assets/lds-0.9.7/build-kit/assets/arvo-latin-700-normal.woff2"},
{"path":"assets/lds-0.9.7/build-kit/assets/arvo-OFL.txt","bytes":4508,"sha256":"f4f2cb57f7050c4e615863a39bf04811eada567d76d99b10b0f33d1e10e6cccd","url":"https://montri-th.github.io/Landometer/v0.9.7/package/assets/lds-0.9.7/build-kit/assets/arvo-OFL.txt"},
{"path":"assets/lds-0.9.7/build-kit/assets/bai-jamjuree-latin-400-normal.woff2","bytes":11596,"sha256":"5200faf54f32adc1dc47b8522adbd1399e739f4ce5c9236866806c04d6397b19","url":"https://montri-th.github.io/Landometer/v0.9.7/package/assets/lds-0.9.7/build-kit/assets/bai-jamjuree-latin-400-normal.woff2"},
{"path":"assets/lds-0.9.7/build-kit/assets/bai-jamjuree-latin-600-normal.woff2","bytes":11844,"sha256":"5ae338ac0db4222226ad96bf1b4b460030c3af1affabb475c67bf218b2eaa83f","url":"https://montri-th.github.io/Landometer/v0.9.7/package/assets/lds-0.9.7/build-kit/assets/bai-jamjuree-latin-600-normal.woff2"},
{"path":"assets/lds-0.9.7/build-kit/assets/bai-jamjuree-OFL.txt","bytes":5487,"sha256":"74b7deafa632a5ed301dc322fcc2867ac200402e06b6d0b0b01faf09b8514e3e","url":"https://montri-th.github.io/Landometer/v0.9.7/package/assets/lds-0.9.7/build-kit/assets/bai-jamjuree-OFL.txt"},
{"path":"assets/lds-0.9.7/build-kit/assets/bai-jamjuree-thai-400-normal.woff2","bytes":9168,"sha256":"357f8fe9fd08973568a061a2fc266a07819cdc33e8c9bb2b39985cc4ec49bfa9","url":"https://montri-th.github.io/Landometer/v0.9.7/package/assets/lds-0.9.7/build-kit/assets/bai-jamjuree-thai-400-normal.woff2"},
{"path":"assets/lds-0.9.7/build-kit/assets/bai-jamjuree-thai-600-normal.woff2","bytes":9808,"sha256":"547483c6fbedcc13f4c04489c4ec3f6be4c69877ae7cd4cfbf4a0d289889ba32","url":"https://montri-th.github.io/Landometer/v0.9.7/package/assets/lds-0.9.7/build-kit/assets/bai-jamjuree-thai-600-normal.woff2"},
{"path":"assets/lds-0.9.7/build-kit/assets/ibm-plex-sans-thai-looped-latin-700-normal.woff2","bytes":18012,"sha256":"47eb0fe82a8b96cc5f1ac057e2edad4d2550d6b73d4aa030697bf1678047c526","url":"https://montri-th.github.io/Landometer/v0.9.7/package/assets/lds-0.9.7/build-kit/assets/ibm-plex-sans-thai-looped-latin-700-normal.woff2"},
{"path":"assets/lds-0.9.7/build-kit/assets/ibm-plex-sans-thai-looped-OFL.txt","bytes":4832,"sha256":"e3ac4237aef600394644cdab2375d7011b0f80d2229ff05f47df2e61a109ab57","url":"https://montri-th.github.io/Landometer/v0.9.7/package/assets/lds-0.9.7/build-kit/assets/ibm-plex-sans-thai-looped-OFL.txt"},
{"path":"assets/lds-0.9.7/build-kit/assets/ibm-plex-sans-thai-looped-thai-700-normal.woff2","bytes":14176,"sha256":"fa03fc4dda6a69763997e79d50e0437795d06c02e1798bdacf3a2f5e685cea2c","url":"https://montri-th.github.io/Landometer/v0.9.7/package/assets/lds-0.9.7/build-kit/assets/ibm-plex-sans-thai-looped-thai-700-normal.woff2"},
{"path":"assets/lds-0.9.7/build-kit/assets/ibm-plex-sans-thai-OFL.txt","bytes":4796,"sha256":"1b4f4d1f1463b63f1356e7b6034ad5a94311b35ffb53cc4bf83f2fbda24450e4","url":"https://montri-th.github.io/Landometer/v0.9.7/package/assets/lds-0.9.7/build-kit/assets/ibm-plex-sans-thai-OFL.txt"},
{"path":"assets/lds-0.9.7/build-kit/assets/ibm-plex-sans-thai-thai-400-normal.woff2","bytes":11804,"sha256":"2d66381c26d32bf2a95bfe559d1a5ed5475fcdac3fa128e45a33301010d42056","url":"https://montri-th.github.io/Landometer/v0.9.7/package/assets/lds-0.9.7/build-kit/assets/ibm-plex-sans-thai-thai-400-normal.woff2"},
{"path":"assets/lds-0.9.7/build-kit/assets/jetbrains-mono-latin-400-normal.woff2","bytes":21168,"sha256":"14425ba9c695763c1547f48a206b7aa60350a33ae23de09f0407877f3fcd89eb","url":"https://montri-th.github.io/Landometer/v0.9.7/package/assets/lds-0.9.7/build-kit/assets/jetbrains-mono-latin-400-normal.woff2"},
{"path":"assets/lds-0.9.7/build-kit/assets/jetbrains-mono-OFL.txt","bytes":4524,"sha256":"403581b69dac5cff4079205e01c6b467e56af449ecbd7247693ddb1baafa005b","url":"https://montri-th.github.io/Landometer/v0.9.7/package/assets/lds-0.9.7/build-kit/assets/jetbrains-mono-OFL.txt"},
{"path":"assets/lds-0.9.7/build-kit/assets/Landometer-Logo-TransparentBG.png","bytes":903326,"sha256":"8d706f8021bc4b4fdc0e89117244b54868687b74045be54002321de7aaa7ef92","url":"https://montri-th.github.io/Landometer/v0.9.7/package/assets/lds-0.9.7/build-kit/assets/Landometer-Logo-TransparentBG.png"},
{"path":"assets/lds-0.9.7/build-kit/assets/material-symbols-Apache-2.0.txt","bytes":11357,"sha256":"58d1e17ffe5109a7ae296caafcadfdbe6a7d176f0bc4ab01e12a689b0499d8bd","url":"https://montri-th.github.io/Landometer/v0.9.7/package/assets/lds-0.9.7/build-kit/assets/material-symbols-Apache-2.0.txt"},
{"path":"assets/lds-0.9.7/build-kit/assets/material-symbols-rounded-nav-300.woff2","bytes":2500,"sha256":"d7e283106ed2898726b24504c4e0f5ad524292984a90a4d29553c7dcf53b9657","url":"https://montri-th.github.io/Landometer/v0.9.7/package/assets/lds-0.9.7/build-kit/assets/material-symbols-rounded-nav-300.woff2"},
{"path":"assets/lds-0.9.7/build-kit/assets/material-symbols-rounded-open-in-new-300.woff2","bytes":1124,"sha256":"778b29f8befe5ba7a8f0f8188d4c12e3c53d00810dac10337609b04d8506d46e","url":"https://montri-th.github.io/Landometer/v0.9.7/package/assets/lds-0.9.7/build-kit/assets/material-symbols-rounded-open-in-new-300.woff2"},
{"path":"assets/lds-0.9.7/build-kit/example.html","bytes":4513,"sha256":"7fc91efa5deda07dedeb7be3015d42c4d873152008e3d3c835a38d688ae7d54b","url":"https://montri-th.github.io/Landometer/v0.9.7/package/assets/lds-0.9.7/build-kit/example.html"},
{"path":"assets/lds-0.9.7/build-kit/fonts.css","bytes":1786,"sha256":"a2564ee20060ac90db6b6ef2b2e18d54671005e4b6736823d2ebb2c0ddb3fbd6","url":"https://montri-th.github.io/Landometer/v0.9.7/package/assets/lds-0.9.7/build-kit/fonts.css"},
{"path":"assets/lds-0.9.7/build-kit/icons/generate-icon-set.py","bytes":4611,"sha256":"32dd794b1e8272fa0ddb6e28949e8e6dce4718b45a11610f06441eb024dbfc99","url":"https://montri-th.github.io/Landometer/v0.9.7/package/assets/lds-0.9.7/build-kit/icons/generate-icon-set.py"},
{"path":"assets/lds-0.9.7/build-kit/icons/icon-portfolio-16.png","bytes":768,"sha256":"c100627d5e8fc9d21d168dbf15f9fdab7f5d6931b04df5164e58137df77feca8","url":"https://montri-th.github.io/Landometer/v0.9.7/package/assets/lds-0.9.7/build-kit/icons/icon-portfolio-16.png"},
{"path":"assets/lds-0.9.7/build-kit/icons/icon-portfolio-180.png","bytes":8893,"sha256":"41ac1e302345d29d791fcc26a5e7111aeb3a4e222dff63685743b43d0fdd6ef0","url":"https://montri-th.github.io/Landometer/v0.9.7/package/assets/lds-0.9.7/build-kit/icons/icon-portfolio-180.png"},
{"path":"assets/lds-0.9.7/build-kit/icons/icon-portfolio-192.png","bytes":11929,"sha256":"1d8bbd3d8656a83f33c51364d333bba7ca328faf3ae713238fa9450f7810bf8e","url":"https://montri-th.github.io/Landometer/v0.9.7/package/assets/lds-0.9.7/build-kit/icons/icon-portfolio-192.png"},
{"path":"assets/lds-0.9.7/build-kit/icons/icon-portfolio-32.png","bytes":1773,"sha256":"5cd19dee724f1a72b2bdcd41467a26e03f76a4bc2d7bd1fe12de6b8b5de665c9","url":"https://montri-th.github.io/Landometer/v0.9.7/package/assets/lds-0.9.7/build-kit/icons/icon-portfolio-32.png"},
{"path":"assets/lds-0.9.7/build-kit/icons/icon-portfolio-48.png","bytes":2897,"sha256":"443857069292f6910b9e5cc0383cab6da4273acf1e18a47745864729fc46e08e","url":"https://montri-th.github.io/Landometer/v0.9.7/package/assets/lds-0.9.7/build-kit/icons/icon-portfolio-48.png"},
{"path":"assets/lds-0.9.7/build-kit/icons/icon-portfolio-512.png","bytes":28124,"sha256":"d8939f6cc7891c47bbb3dce1ddb04d4c30ce4c7e78e29f6fb0061858dafc881f","url":"https://montri-th.github.io/Landometer/v0.9.7/package/assets/lds-0.9.7/build-kit/icons/icon-portfolio-512.png"},
{"path":"assets/lds-0.9.7/build-kit/icons/icon-set.json","bytes":3284,"sha256":"aea8f5a7f9793c14a6b183706627e4c2390388b7d8c49129eceacdd9b0bce7a4","url":"https://montri-th.github.io/Landometer/v0.9.7/package/assets/lds-0.9.7/build-kit/icons/icon-set.json"},
{"path":"assets/lds-0.9.7/build-kit/lds-0.9.7-components.css","bytes":7108,"sha256":"0977837144503394a8dc79b83c42a22f0bc6ee58a59aeba1d7ffaa30ebf1bf38","url":"https://montri-th.github.io/Landometer/v0.9.7/package/assets/lds-0.9.7/build-kit/lds-0.9.7-components.css"},
{"path":"assets/lds-0.9.7/build-kit/lds-0.9.7-ext.css","bytes":26891,"sha256":"11c764df4e3b6d2cd42daecbe8481a2e9ff0913136d987ce3039453ed482221f","url":"https://montri-th.github.io/Landometer/v0.9.7/package/assets/lds-0.9.7/build-kit/lds-0.9.7-ext.css"},
{"path":"assets/lds-0.9.7/build-kit/lds-0.9.7.css","bytes":137,"sha256":"5512425b092f9197412ffb0f1b5b0e7a2060172ebf5d83174c6b0e94ef266fee","url":"https://montri-th.github.io/Landometer/v0.9.7/package/assets/lds-0.9.7/build-kit/lds-0.9.7.css"},
{"path":"assets/lds-0.9.7/build-kit/motif/landometer-motifs.css","bytes":11190,"sha256":"7cc2deb475a8d6e4af331407b2b4b741716c458a8ce885e2fb2859374b93912e","url":"https://montri-th.github.io/Landometer/v0.9.7/package/assets/lds-0.9.7/build-kit/motif/landometer-motifs.css"},
{"path":"assets/lds-0.9.7/build-kit/motif/landometer-motifs.js","bytes":17845,"sha256":"3a5caef7918a85885b61dd53e049ea8bf2b0a3cea508f587bb14970bfe6deaf2","url":"https://montri-th.github.io/Landometer/v0.9.7/package/assets/lds-0.9.7/build-kit/motif/landometer-motifs.js"},
{"path":"assets/lds-0.9.7/build-kit/motif/motif-frame.css","bytes":5783,"sha256":"bce9aa3cab8f4f61a15a97bd8dac0835a052b35e0bf19c58d73c160c194a7fc1","url":"https://montri-th.github.io/Landometer/v0.9.7/package/assets/lds-0.9.7/build-kit/motif/motif-frame.css"},
{"path":"assets/lds-0.9.7/build-kit/motif/motif-frame.js","bytes":27265,"sha256":"ea96e0099526068126ab726634763d60825046dfd285134b3897087436aebb2b","url":"https://montri-th.github.io/Landometer/v0.9.7/package/assets/lds-0.9.7/build-kit/motif/motif-frame.js"},
{"path":"assets/lds-0.9.7/build-kit/motif/motif-library.json","bytes":120161,"sha256":"77e8185104751e2c21c2e10fb8c5d771821bcb8123e02f116638fdbf3968d483","url":"https://montri-th.github.io/Landometer/v0.9.7/package/assets/lds-0.9.7/build-kit/motif/motif-library.json"},
{"path":"assets/lds-0.9.7/build-kit/motif/motion-controller.js","bytes":4175,"sha256":"9199d94ae0f61af69dade73cbb6326898556749d6a1a36038580f59be153b37f","url":"https://montri-th.github.io/Landometer/v0.9.7/package/assets/lds-0.9.7/build-kit/motif/motion-controller.js"},
{"path":"assets/lds-0.9.7/build-kit/motif/svg/cultivate-full.svg","bytes":984,"sha256":"ce494d792c12d73949a3dc8e6d18f6f93faa6aeab33d18b2de0889ab4af5af12","url":"https://montri-th.github.io/Landometer/v0.9.7/package/assets/lds-0.9.7/build-kit/motif/svg/cultivate-full.svg"},
{"path":"assets/lds-0.9.7/build-kit/motif/svg/cultivate-quiet.svg","bytes":1190,"sha256":"edf8538107d30b078f0d7657bac054722ee88bdc10ddf7db00e63f44d077935f","url":"https://montri-th.github.io/Landometer/v0.9.7/package/assets/lds-0.9.7/build-kit/motif/svg/cultivate-quiet.svg"},
{"path":"assets/lds-0.9.7/build-kit/motif/svg/dial-full.svg","bytes":674,"sha256":"7ecfd1165a3e7ad25a0bb01b9680c35f71ff8a98edfd411dfe1b712cee12654d","url":"https://montri-th.github.io/Landometer/v0.9.7/package/assets/lds-0.9.7/build-kit/motif/svg/dial-full.svg"},
{"path":"assets/lds-0.9.7/build-kit/motif/svg/dial-quiet.svg","bytes":733,"sha256":"2e624d80b604891ad2ed3e4d5cc6268d2383f39f740ef1def5012c49aee0da1f","url":"https://montri-th.github.io/Landometer/v0.9.7/package/assets/lds-0.9.7/build-kit/motif/svg/dial-quiet.svg"},
{"path":"assets/lds-0.9.7/build-kit/motif/svg/layers-full.svg","bytes":741,"sha256":"a94a59a342df39591f490deec960bba2263bc1c453620c557ff84a1c47901843","url":"https://montri-th.github.io/Landometer/v0.9.7/package/assets/lds-0.9.7/build-kit/motif/svg/layers-full.svg"},
{"path":"assets/lds-0.9.7/build-kit/motif/svg/layers-quiet.svg","bytes":1274,"sha256":"e3e2bf65bcd38d34d0a07910bef44917eab76fdaf097131ec133d163f6a65a03","url":"https://montri-th.github.io/Landometer/v0.9.7/package/assets/lds-0.9.7/build-kit/motif/svg/layers-quiet.svg"},
{"path":"assets/lds-0.9.7/build-kit/motif/svg/logo-full.svg","bytes":1252,"sha256":"90e9543f2f86a18f891331c13be25038b4334ca7dbe55b194650bc441e3558e1","url":"https://montri-th.github.io/Landometer/v0.9.7/package/assets/lds-0.9.7/build-kit/motif/svg/logo-full.svg"},
{"path":"assets/lds-0.9.7/build-kit/motif/svg/logo-quiet.svg","bytes":1979,"sha256":"5b6798cdb6c3ada246286e6ce3386644f383c4f987a267e5c5db392809403e14","url":"https://montri-th.github.io/Landometer/v0.9.7/package/assets/lds-0.9.7/build-kit/motif/svg/logo-quiet.svg"},
{"path":"assets/lds-0.9.7/build-kit/motif/svg/rings-full.svg","bytes":552,"sha256":"b50ec8fa3828ee5b3504ff05e0c47c1ae55f6b644225482454ec319809552286","url":"https://montri-th.github.io/Landometer/v0.9.7/package/assets/lds-0.9.7/build-kit/motif/svg/rings-full.svg"},
{"path":"assets/lds-0.9.7/build-kit/motif/svg/rings-quiet.svg","bytes":833,"sha256":"d494be1f72e833704cd3c20d9d41f60599991d6efd5f670a86e40a7296eb566b","url":"https://montri-th.github.io/Landometer/v0.9.7/package/assets/lds-0.9.7/build-kit/motif/svg/rings-quiet.svg"},
{"path":"assets/lds-0.9.7/build-kit/motif/svg/slice-full.svg","bytes":280,"sha256":"8d0dfb62d1ac92738afcd76e8b61b544a5c72bf10b165983235900558447b2df","url":"https://montri-th.github.io/Landometer/v0.9.7/package/assets/lds-0.9.7/build-kit/motif/svg/slice-full.svg"},
{"path":"assets/lds-0.9.7/build-kit/motif/svg/slice-quiet.svg","bytes":350,"sha256":"c72114d43b81584cbb46251a5519f768087259bf135216f6ea7933a83df4de6b","url":"https://montri-th.github.io/Landometer/v0.9.7/package/assets/lds-0.9.7/build-kit/motif/svg/slice-quiet.svg"},
{"path":"assets/lds-0.9.7/machine/color-srgb-10.production.css","bytes":133444,"sha256":"3d34924a249804c4573da5b136303141b67c47f24a3f00dd5d7b86b521d9dfc8","url":"https://montri-th.github.io/Landometer/v0.9.7/package/assets/lds-0.9.7/machine/color-srgb-10.production.css"}
],
"provenance":{
"purpose":"Traceability only; these are not additional reading or installation dependencies.",
"sourceFiles":[
{"path":"assets/lds-0.9.7/machine/release.json","bytes":4282,"sha256":"0a936393fc1ab05f8b32110397546b2a87cc26e46f2661a712bdd2debaa58516"},
{"path":"assets/lds-0.9.7/machine/policy.json","bytes":7102,"sha256":"be568a1815f9efa9e0a48484b72eff6da721a4f0943f7ed3f4252e4890f6c14d"},
{"path":"assets/lds-0.9.7/machine/tokens.v0.9.7.json","bytes":57203,"sha256":"329ef6b125439ab7190b7d06826418e95bb879f7e657cfa9c7ba5f685241b2a6"},
{"path":"assets/lds-0.9.7/machine/color-srgb-10.tokens.json","bytes":15063,"sha256":"2e71d065e5facb3abcc2ed7a0412d2dd739a4aaf8a78664cd0d15e8caa03d3db"},
{"path":"assets/lds-0.9.7/machine/color-srgb-10.scales.json","bytes":116861,"sha256":"dc804436c080b5be9125417cacb258b898a679c31f1481973a61f8e8cca4e305"},
{"path":"assets/lds-0.9.7/machine/evidence-value.schema.json","bytes":1513,"sha256":"478cb07c15b0d42ee6e7bb911a34dd15cfc9d43de801053bfedfd6004573b986"},
{"path":"assets/lds-0.9.7/machine/social-sidecar.schema.json","bytes":23816,"sha256":"110c594160c807f38c1bc4984fe20deb65f96329755322b4aa0d0d22f11af82c"}
],
"contractSources":{
"appliesToHistoricalSourcesOnly":true,
"sourceHashesDoNotAttestDerivedBytes":true,
"sourceAssetApproval":{"appliesToHistoricalSourceOnly":true,"appliesToCurrentStandaloneDocument":false,"appliesToNewRegistry":false,"attestationRef":"asset-approval-receipt.attestation.json","attestationSha256":"1a7c27fb3d9ef2decbf5728f2949b7518b17c1fa159cf99992453e34d4567e95","note":"Original attestation binds original approved asset records. It does not sign this derived registry, the standalone document, the distribution or downstream artifacts. No offline cryptographic verification is claimed."},
"unapprovedOgProposal":{"sourceMinimumPx":22,"bodyMinimumPx":28,"headlineMinimumPx":48,"derivationNote":"candidate — the 22px floor is the destination-cue minimum from the SOCIALFMT-01 amendment; body and headline minimums are proposed between the square target values and that floor and await owner confirmation"},
"schemaIdMap":{
"https://landometer.org/design-system/0.9.4/action-contracts.schema.1.1.json":"https://montri-th.github.io/Landometer/v0.9.7/standalone-0.9.7-r1/schemas/action-contracts.schema.json",
"https://landometer.org/design-system/0.9.4/agent-action-authority.schema.1.3.json":"https://montri-th.github.io/Landometer/v0.9.7/standalone-0.9.7-r1/schemas/agent-action-authority.schema.json",
"https://landometer.org/design-system/0.9.4/agent-action-definition.schema.1.3.json":"https://montri-th.github.io/Landometer/v0.9.7/standalone-0.9.7-r1/schemas/agent-action-definition.schema.json",
"https://landometer.org/design-system/0.9.4/agent-action-receipt.schema.1.3.json":"https://montri-th.github.io/Landometer/v0.9.7/standalone-0.9.7-r1/schemas/agent-action-receipt.schema.json",
"https://landometer.org/design-system/0.9.4/agent-action-revocation.schema.1.2.json":"https://montri-th.github.io/Landometer/v0.9.7/standalone-0.9.7-r1/schemas/agent-action-revocation.schema.json",
"https://landometer.org/design-system/0.9.4/agent-action.schema.1.5.json":"https://montri-th.github.io/Landometer/v0.9.7/standalone-0.9.7-r1/schemas/agent-action.schema.json",
"https://landometer.org/design-system/0.9.4/agent-confirmation-receipt.schema.1.0.json":"https://montri-th.github.io/Landometer/v0.9.7/standalone-0.9.7-r1/schemas/agent-confirmation-receipt.schema.json",
"https://landometer.org/design-system/0.9.4/artifact-manifest.schema.3.2.json":"https://montri-th.github.io/Landometer/v0.9.7/standalone-0.9.7-r1/schemas/artifact-manifest.schema.json",
"https://landometer.org/design-system/0.9.4/asset-approval-receipt.schema.1.0.json":"https://montri-th.github.io/Landometer/v0.9.7/standalone-0.9.7-r1/schemas/asset-approval-receipt.schema.json",
"https://landometer.org/design-system/0.9.4/asset-registry.schema.1.9.json":"https://montri-th.github.io/Landometer/v0.9.7/standalone-0.9.7-r1/schemas/asset-registry.schema.json",
"https://landometer.org/design-system/0.9.4/build-card.schema.0.9.3.2.json":"https://montri-th.github.io/Landometer/v0.9.7/standalone-0.9.7-r1/schemas/build-card.schema.json",
"https://landometer.org/design-system/0.9.4/capability-config.schema.1.5.json":"https://montri-th.github.io/Landometer/v0.9.7/standalone-0.9.7-r1/schemas/capability-config.schema.json",
"https://landometer.org/design-system/0.9.4/claim-evidence-capture.schema.1.0.json":"https://montri-th.github.io/Landometer/v0.9.7/standalone-0.9.7-r1/schemas/claim-evidence-capture.schema.json",
"https://landometer.org/design-system/0.9.4/claim-manifest.schema.1.1.json":"https://montri-th.github.io/Landometer/v0.9.7/standalone-0.9.7-r1/schemas/claim-manifest.schema.json",
"https://landometer.org/design-system/0.9.4/claim-record.schema.1.4.json":"https://montri-th.github.io/Landometer/v0.9.7/standalone-0.9.7-r1/schemas/claim-record.schema.json",
"https://landometer.org/design-system/0.9.4/conformance-receipt.schema.1.2.json":"https://montri-th.github.io/Landometer/v0.9.7/standalone-0.9.7-r1/schemas/conformance-receipt.schema.json",
"https://landometer.org/design-system/0.9.4/crawler-purpose-policy.schema.1.0.json":"https://montri-th.github.io/Landometer/v0.9.7/standalone-0.9.7-r1/schemas/crawler-purpose-policy.schema.json",
"https://landometer.org/design-system/0.9.4/disclosure-authority.schema.1.0.json":"https://montri-th.github.io/Landometer/v0.9.7/standalone-0.9.7-r1/schemas/disclosure-authority.schema.json",
"https://landometer.org/design-system/0.9.4/format-implementation.schema.1.6.json":"https://montri-th.github.io/Landometer/v0.9.7/standalone-0.9.7-r1/schemas/format-implementation.schema.json",
"https://landometer.org/design-system/0.9.4/format-kits.schema.1.4.json":"https://montri-th.github.io/Landometer/v0.9.7/standalone-0.9.7-r1/schemas/format-kits.schema.json",
"https://landometer.org/design-system/0.9.4/migration-ledger.schema.1.2.json":"https://montri-th.github.io/Landometer/v0.9.7/standalone-0.9.7-r1/schemas/migration-ledger.schema.json",
"https://landometer.org/design-system/0.9.4/motif-register.schema.1.1.json":"https://montri-th.github.io/Landometer/v0.9.7/standalone-0.9.7-r1/schemas/motif-register.schema.json",
"https://landometer.org/design-system/0.9.4/promotion-snapshot.schema.1.0.json":"https://montri-th.github.io/Landometer/v0.9.7/standalone-0.9.7-r1/schemas/promotion-snapshot.schema.json",
"https://montri-th.github.io/Landometer/v0.9.7/package/assets/lds-0.9.7/machine/social-sidecar.schema.json":"https://montri-th.github.io/Landometer/v0.9.7/standalone-0.9.7-r1/schemas/social-sidecar.schema.json",
"https://landometer.org/design-system/0.9.4/source-lineage-receipt.schema.1.0.json":"https://montri-th.github.io/Landometer/v0.9.7/standalone-0.9.7-r1/schemas/source-lineage-receipt.schema.json",
"https://landometer.org/design-system/0.9.4/structured-data-projection.schema.1.1.json":"https://montri-th.github.io/Landometer/v0.9.7/standalone-0.9.7-r1/schemas/structured-data-projection.schema.json",
"https://landometer.org/design-system/0.9.4/target-profiles.schema.1.3.json":"https://montri-th.github.io/Landometer/v0.9.7/standalone-0.9.7-r1/schemas/target-profiles.schema.json",
"https://landometer.org/design-system/0.9.4/verification-attestation.schema.1.1.json":"https://montri-th.github.io/Landometer/v0.9.7/standalone-0.9.7-r1/schemas/verification-attestation.schema.json",
"https://landometer.org/design-system/0.9.4/verification-trust-policy.schema.1.0.json":"https://montri-th.github.io/Landometer/v0.9.7/standalone-0.9.7-r1/schemas/verification-trust-policy.schema.json",
"https://landometer.org/design-system/0.9.4/verification-trust-store.schema.1.1.json":"https://montri-th.github.io/Landometer/v0.9.7/standalone-0.9.7-r1/schemas/verification-trust-store.schema.json",
"https://montri-th.github.io/Landometer/v0.9.7/package/assets/lds-0.9.7/machine/evidence-value.schema.json":"https://montri-th.github.io/Landometer/v0.9.7/standalone-0.9.7-r1/schemas/evidence-value.schema.json",
"https://landometer.org/design-system/0.9.4/social-sidecar.schema.1.2.json":"https://montri-th.github.io/Landometer/v0.9.7/standalone-0.9.7-r1/schemas/social-sidecar.schema.json"
},
"sources":[
{"path":"references/inherited/lds-0.9.4/machine/action-contracts.schema.json","sha256":"9a1f8df47ed98491c06d28a6e2801b73c059624aac0f0de7aaa0d7d6087251f3","bytes":5324,"role":"historical-input-only","url":"https://montri-th.github.io/Landometer/v0.9.7/package/references/inherited/lds-0.9.4/machine/action-contracts.schema.json"},
{"path":"references/inherited/lds-0.9.4/machine/agent-action-authority.schema.json","sha256":"2b9f5fb574e293c5b5169e6c671fd6b57057612285019530f065fb4434ea03d2","bytes":3565,"role":"historical-input-only","url":"https://montri-th.github.io/Landometer/v0.9.7/package/references/inherited/lds-0.9.4/machine/agent-action-authority.schema.json"},
{"path":"references/inherited/lds-0.9.4/machine/agent-action-definition.schema.json","sha256":"e5b8f0b3f23b54d068943440c8d7b8dc7a4be3abc4b889f0d4f12e0c4e35c5d0","bytes":6083,"role":"historical-input-only","url":"https://montri-th.github.io/Landometer/v0.9.7/package/references/inherited/lds-0.9.4/machine/agent-action-definition.schema.json"},
{"path":"references/inherited/lds-0.9.4/machine/agent-action-receipt.schema.json","sha256":"5ee54451d64aca120ddd50b63a6fe7920f56220782195769470bc31b61e59fa1","bytes":6547,"role":"historical-input-only","url":"https://montri-th.github.io/Landometer/v0.9.7/package/references/inherited/lds-0.9.4/machine/agent-action-receipt.schema.json"},
{"path":"references/inherited/lds-0.9.4/machine/agent-action-revocation.schema.json","sha256":"c050b8156aeb6a1c671afd7fe1bdd25e22ab8ab194c6a023f1057d06101dd9a8","bytes":2377,"role":"historical-input-only","url":"https://montri-th.github.io/Landometer/v0.9.7/package/references/inherited/lds-0.9.4/machine/agent-action-revocation.schema.json"},
{"path":"references/inherited/lds-0.9.4/machine/agent-action.schema.json","sha256":"0d3077c9c313b3595874ab23b723728909c4091a4daf4dfb722e8d85835367db","bytes":16362,"role":"historical-input-only","url":"https://montri-th.github.io/Landometer/v0.9.7/package/references/inherited/lds-0.9.4/machine/agent-action.schema.json"},
{"path":"references/inherited/lds-0.9.4/machine/agent-confirmation-receipt.schema.json","sha256":"f188f4bc876589ebfd59944afa1aaf4afc6b5e45533f6e18746cf69aecdd5043","bytes":1850,"role":"historical-input-only","url":"https://montri-th.github.io/Landometer/v0.9.7/package/references/inherited/lds-0.9.4/machine/agent-confirmation-receipt.schema.json"},
{"path":"references/inherited/lds-0.9.4/machine/artifact-manifest.schema.json","sha256":"6c66d1e72059f5625af2c4c9e3d376e27f0b2c5f8b5655fe66baaea526484c17","bytes":61140,"role":"historical-input-only","url":"https://montri-th.github.io/Landometer/v0.9.7/package/references/inherited/lds-0.9.4/machine/artifact-manifest.schema.json"},
{"path":"references/inherited/lds-0.9.4/machine/asset-approval-receipt.schema.json","sha256":"39c6d46bd68f98a55315d9540ba5d3d88f449b4ca27883727bfb5fffe5d84966","bytes":3259,"role":"historical-input-only","url":"https://montri-th.github.io/Landometer/v0.9.7/package/references/inherited/lds-0.9.4/machine/asset-approval-receipt.schema.json"},
{"path":"references/inherited/lds-0.9.4/machine/asset-registry.schema.json","sha256":"80fe1d9bf734a6d456b7740c1e1e712529f0dae6e9f98f377d1168b5ed6e519d","bytes":35951,"role":"historical-input-only","url":"https://montri-th.github.io/Landometer/v0.9.7/package/references/inherited/lds-0.9.4/machine/asset-registry.schema.json"},
{"path":"references/inherited/lds-0.9.4/machine/build-card.schema.json","sha256":"a25b8b7eea6f3563ae8bf474bd7edc191695bc9b6d30c6c5cff589ed2d493e9d","bytes":125057,"role":"historical-input-only","url":"https://montri-th.github.io/Landometer/v0.9.7/package/references/inherited/lds-0.9.4/machine/build-card.schema.json"},
{"path":"references/inherited/lds-0.9.4/machine/capability-config.schema.json","sha256":"58c9c7bdbbb355002fb3cd62e7bc07c96f64640759ffcc388dbeddfa1c1d4a38","bytes":36867,"role":"historical-input-only","url":"https://montri-th.github.io/Landometer/v0.9.7/package/references/inherited/lds-0.9.4/machine/capability-config.schema.json"},
{"path":"references/inherited/lds-0.9.4/machine/claim-evidence-capture.schema.json","sha256":"c8e868ce423176ba4d51a92552c28e56210616316eac39216c23c073b5bc66bc","bytes":1625,"role":"historical-input-only","url":"https://montri-th.github.io/Landometer/v0.9.7/package/references/inherited/lds-0.9.4/machine/claim-evidence-capture.schema.json"},
{"path":"references/inherited/lds-0.9.4/machine/claim-manifest.schema.json","sha256":"3f53a2f9e8ca88b398f5fb871e0b0de01e488db552ce9fedc3942f8d9d79f11a","bytes":2153,"role":"historical-input-only","url":"https://montri-th.github.io/Landometer/v0.9.7/package/references/inherited/lds-0.9.4/machine/claim-manifest.schema.json"},
{"path":"references/inherited/lds-0.9.4/machine/claim-record.schema.json","sha256":"a60137d4d53c6835beb0cb119da2e057c1e6669e2735865856c248ad6105549c","bytes":14734,"role":"historical-input-only","url":"https://montri-th.github.io/Landometer/v0.9.7/package/references/inherited/lds-0.9.4/machine/claim-record.schema.json"},
{"path":"references/inherited/lds-0.9.4/machine/conformance-receipt.schema.json","sha256":"c0947d20e19363858a73c672bf3f7f3e576935e5049687da22f1e34f67e153f3","bytes":8232,"role":"historical-input-only","url":"https://montri-th.github.io/Landometer/v0.9.7/package/references/inherited/lds-0.9.4/machine/conformance-receipt.schema.json"},
{"path":"references/inherited/lds-0.9.4/machine/crawler-purpose-policy.schema.json","sha256":"a5b20397879de83e5fdb69700691fe2403903904c7bfd081a59a1268ff6a3cc1","bytes":2841,"role":"historical-input-only","url":"https://montri-th.github.io/Landometer/v0.9.7/package/references/inherited/lds-0.9.4/machine/crawler-purpose-policy.schema.json"},
{"path":"references/inherited/lds-0.9.4/machine/disclosure-authority.schema.json","sha256":"b742e4e8d171c300f2fcd864ee44b40e4ec82e294750ba65795ade28546abafe","bytes":1855,"role":"historical-input-only","url":"https://montri-th.github.io/Landometer/v0.9.7/package/references/inherited/lds-0.9.4/machine/disclosure-authority.schema.json"},
{"path":"references/inherited/lds-0.9.4/machine/format-implementation.schema.json","sha256":"0042e38259389370735492a3fb0148239279574c8ddf8fee788f42bb2557e7e5","bytes":13727,"role":"historical-input-only","url":"https://montri-th.github.io/Landometer/v0.9.7/package/references/inherited/lds-0.9.4/machine/format-implementation.schema.json"},
{"path":"references/inherited/lds-0.9.4/machine/format-kits.schema.json","sha256":"95341f3b219222c3cd2c29019845ceb11c69c865739293f7adbd72d81e17a7f5","bytes":2435,"role":"historical-input-only","url":"https://montri-th.github.io/Landometer/v0.9.7/package/references/inherited/lds-0.9.4/machine/format-kits.schema.json"},
{"path":"references/inherited/lds-0.9.4/machine/migration-ledger.schema.json","sha256":"9c5e47814c41e960ec86cd5e9a4b92a45e15520dcecdd3353bfa652bbee24d51","bytes":8581,"role":"historical-input-only","url":"https://montri-th.github.io/Landometer/v0.9.7/package/references/inherited/lds-0.9.4/machine/migration-ledger.schema.json"},
{"path":"references/inherited/lds-0.9.4/machine/motif-register.schema.json","sha256":"8648bb0615bdad478055f8ab36f5c747052965cccddf4b09d6c733a8f9cef859","bytes":33671,"role":"historical-input-only","url":"https://montri-th.github.io/Landometer/v0.9.7/package/references/inherited/lds-0.9.4/machine/motif-register.schema.json"},
{"path":"references/inherited/lds-0.9.4/machine/promotion-snapshot.schema.json","sha256":"4cac7ff6c905be2f0d3f0d755227dbc30069ae840e116bbb27bdcc1a532c77d4","bytes":3646,"role":"historical-input-only","url":"https://montri-th.github.io/Landometer/v0.9.7/package/references/inherited/lds-0.9.4/machine/promotion-snapshot.schema.json"},
{"path":"references/inherited/lds-0.9.4/machine/social-sidecar.schema.json","sha256":"4da2941c04e0a17e67c86e0ad4a8d66ccead3793579cab37bfebf759724c573a","bytes":17216,"role":"historical-input-only","url":"https://montri-th.github.io/Landometer/v0.9.7/package/references/inherited/lds-0.9.4/machine/social-sidecar.schema.json"},
{"path":"references/inherited/lds-0.9.4/machine/source-lineage-receipt.schema.json","sha256":"f7fe607e8af545c5b34f01a7532e6457c8ff64f1b898be3b0e162aba686c0fe2","bytes":2419,"role":"historical-input-only","url":"https://montri-th.github.io/Landometer/v0.9.7/package/references/inherited/lds-0.9.4/machine/source-lineage-receipt.schema.json"},
{"path":"references/inherited/lds-0.9.4/machine/structured-data-projection.schema.json","sha256":"c89309bb231e2f668b02914fd83930a2b3c19fea8b132e0a62f7af2e25dc1cf8","bytes":2651,"role":"historical-input-only","url":"https://montri-th.github.io/Landometer/v0.9.7/package/references/inherited/lds-0.9.4/machine/structured-data-projection.schema.json"},
{"path":"references/inherited/lds-0.9.4/machine/target-profiles.schema.json","sha256":"23473cb5f3e09e8078b62ff9d11539d5d27af2eb06ca057aa77a7e4c61278c62","bytes":2879,"role":"historical-input-only","url":"https://montri-th.github.io/Landometer/v0.9.7/package/references/inherited/lds-0.9.4/machine/target-profiles.schema.json"},
{"path":"references/inherited/lds-0.9.4/machine/verification-attestation.schema.json","sha256":"be0e7c384f130f0034ef6ce285adaee53be1094d9222f45121a1c62330061140","bytes":2302,"role":"historical-input-only","url":"https://montri-th.github.io/Landometer/v0.9.7/package/references/inherited/lds-0.9.4/machine/verification-attestation.schema.json"},
{"path":"references/inherited/lds-0.9.4/machine/verification-trust-policy.schema.json","sha256":"37cd784a38be49c8cdeac281f237da181cf54f0757e3b06e86e3a5fae54cf59c","bytes":1531,"role":"historical-input-only","url":"https://montri-th.github.io/Landometer/v0.9.7/package/references/inherited/lds-0.9.4/machine/verification-trust-policy.schema.json"},
{"path":"references/inherited/lds-0.9.4/machine/verification-trust-store.schema.json","sha256":"1e3651fcd7ad7a9ffd30f7daa467595575b1febe389721e5fef113ad3d3758cc","bytes":2669,"role":"historical-input-only","url":"https://montri-th.github.io/Landometer/v0.9.7/package/references/inherited/lds-0.9.4/machine/verification-trust-store.schema.json"},
{"path":"assets/lds-0.9.7/machine/social-sidecar.schema.json","sha256":"110c594160c807f38c1bc4984fe20deb65f96329755322b4aa0d0d22f11af82c","bytes":23816,"role":"current-0.9.7-input","url":"https://montri-th.github.io/Landometer/v0.9.7/package/assets/lds-0.9.7/machine/social-sidecar.schema.json"},
{"path":"assets/lds-0.9.7/machine/evidence-value.schema.json","sha256":"478cb07c15b0d42ee6e7bb911a34dd15cfc9d43de801053bfedfd6004573b986","bytes":1513,"role":"current-0.9.7-input","url":"https://montri-th.github.io/Landometer/v0.9.7/package/assets/lds-0.9.7/machine/evidence-value.schema.json"},
{"path":"references/inherited/lds-0.9.4/machine/rule-catalog.json","sha256":"3406d9aeceaff5771153b882a701812b85e5b690db17fc1fb2a31155c8e340fa","bytes":102681,"role":"historical-input-only","url":"https://montri-th.github.io/Landometer/v0.9.7/package/references/inherited/lds-0.9.4/machine/rule-catalog.json"},
{"path":"references/inherited/lds-0.9.4/machine/component-contracts.v0.9.4.json","sha256":"7b96abf1558de2ebe7ce17744f043034905900278662c053d396cd135be57296","bytes":23329,"role":"historical-input-only","url":"https://montri-th.github.io/Landometer/v0.9.7/package/references/inherited/lds-0.9.4/machine/component-contracts.v0.9.4.json"},
{"path":"references/inherited/lds-0.9.4/machine/format-packs.json","sha256":"69d21cc220d29cb5d3350244bbd00fbd3d53556e051dad37ba42a4091c465095","bytes":95513,"role":"historical-input-only","url":"https://montri-th.github.io/Landometer/v0.9.7/package/references/inherited/lds-0.9.4/machine/format-packs.json"},
{"path":"references/inherited/lds-0.9.4/machine/format-kits.json","sha256":"4ba82150e9e341787ffb99c889f493f3cdcc599f7cb7515033c993a2ab4d301f","bytes":7695,"role":"historical-input-only","url":"https://montri-th.github.io/Landometer/v0.9.7/package/references/inherited/lds-0.9.4/machine/format-kits.json"},
{"path":"references/inherited/lds-0.9.4/machine/target-profiles.json","sha256":"1e7bd71f7c45d1bdd9f04fc02e456d1ca9ec63af58f83425c70364e86df7133c","bytes":16758,"role":"historical-input-only","url":"https://montri-th.github.io/Landometer/v0.9.7/package/references/inherited/lds-0.9.4/machine/target-profiles.json"},
{"path":"references/inherited/lds-0.9.4/machine/asset-registry.json","sha256":"03cda249cd06028a0289812446bffa588e4208f4a1411f199508ab32d1384eae","bytes":57033,"role":"historical-input-only","url":"https://montri-th.github.io/Landometer/v0.9.7/package/references/inherited/lds-0.9.4/machine/asset-registry.json"},
{"path":"references/inherited/lds-0.9.4/machine/motif-register.v0.9.4.json","sha256":"bc70e4c06d4d54142cf804ac1ae7b8192401675c64e243efde6d1550ccd68035","bytes":217184,"role":"historical-input-only","url":"https://montri-th.github.io/Landometer/v0.9.7/package/references/inherited/lds-0.9.4/machine/motif-register.v0.9.4.json"}
],
"humanMasterSha256":"f3f67736c9d27c05e96c60254dffc9fd51002400f4d9cea46bf860e370934200"
},
"normalizationLog":[
{"area":"identity","change":"Current schema IDs use a unique standalone-0.9.7-r1 namespace; current release bindings and all mapped schema references resolve to 0.9.7. Historical source bytes remain untouched."},
{"area":"rules","change":"All 64 rule requirements and acceptance criteria are projected from the complete current human master; stable rule IDs, scopes, levels and required-core inventory are preserved."},
{"area":"evidence","change":"DataTable, MapLegend, EvidenceCard and capability schema enums include measured; value-state semantics resolve the embedded six-state evidence-value schema."},
{"area":"analytical","change":"Resolved overlays and format controls require the approved 41-sample light/dark LUTs and 3/5/7/9 classes; legacy dark derivation controls are retired."},
{"area":"social","change":"Build Card, implementation and sidecar accept square1080x1080 or OG1200x630; sidecar requires target-consistent exact creative dimensions and hash."},
{"area":"social-type","change":"Retains approved22px destination cue and visual legibility/crop requirements; unapproved fixed28px body/48px headline proposal is provenance only."},
{"area":"visual-preference","change":"Owner no-bracket/no-colored-left-rail preference and rendered Thai/English narrow/desktop review are explicit common controls; accessibility focus and meaningful data borders remain."},
{"area":"motifs","change":"Exact asset bytes and lifecycle contracts retained; active motif allowed-format lists follow the stricter social no-motif rule. Historical broad asset-format permission remains source provenance only."},
{"area":"approval","change":"Original asset attestation moves to historical provenance; current derived registry is unsigned. Separate scoped-check schema cannot claim full artifact conformance. Operational authority and artifact receipt signature controls remain intact."}
]
},
"validationBoundary":{"document":"Complete design rules and exact structured values in this file. Binary assets use the exact URLs and hashes in assetFiles.","package":"Unsigned owner distribution. A source signature does not sign this document.","artifact":"Content truth, rendered usability, accessibility, actual surfaces, native Thai copy and output formats require applicable artifact checks.","installation":"File availability, retrieval and correct use must be verified in each project and platform."}
}
```
<!-- LDS_MACHINE_END -->
