Skip to content
Merged
4 changes: 2 additions & 2 deletions .trinity/seals/t27f_pbr_sphere.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"built_by": "t27c-bootstrap@0.5.2+1c8355564",
"built_by": "t27c-bootstrap@0.5.2+9448ab4be",
"closure": [],
"config": "gen=c,rust,verilog,zig;tests=zig",
"gen_hash_c": "sha256:2f31d565d2c71e2d4d92894255a9bdef3222ac82ef1c7e49bd7245e1d203abb9",
Expand All @@ -9,7 +9,7 @@
"module": "pbr_sphere",
"ring": 12,
"seal_schema": 2,
"sealed_at": "2026-10-18T13:36:48Z",
"sealed_at": "2026-10-18T13:21:30Z",
"sealed_by": "t27c-bootstrap@0.5.2",
"spec_hash": "sha256:2d13f0e5ae9032c886b4d9e0d64446a2589a67198d60b35e20d2cdd0d7e1280c",
"spec_path": "specs/t27f/pbr_sphere.t27",
Expand Down
28 changes: 28 additions & 0 deletions .trinity/seals/t27f_reel_marketing.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
{
"built_by": "t27c-bootstrap@0.5.2+9448ab4be",
"closure": [],
"config": "gen=c,rust,verilog,zig;tests=zig",
"gen_hash_c": "sha256:170aa9406c474daab02c87af57ac516f335774efd4d3d7bb89d96a84e8dfc457",
"gen_hash_rust": "sha256:92e914c0f4c16e0de23bf37af5600c32ec946e8555fee16dc7300f4162a93cf0",
"gen_hash_verilog": "sha256:010bff17265838d9f4530772874ded57be21acf2fd9fb5be39ee8face6c2c765",
"gen_hash_zig": "sha256:8741fa9583b4006f8510c672b644bdb7d9888ad1ec8d037d81e63751310cb7d5",
"module": "reel_marketing",
"ring": 12,
"seal_schema": 2,
"sealed_at": "2026-10-18T13:21:28Z",
"sealed_by": "t27c-bootstrap@0.5.2",
"spec_hash": "sha256:ab07f6476d900cc0e089ba1d851f0b610a77b778f00fd906d1b98a29281941c7",
"spec_path": "specs/t27f/reel_marketing.t27",
"tests": {
"failed": 0,
"failing": [],
"forced": false,
"passed": 3,
"total": 3,
"vacuous": 0
},
"toolchain": {
"test_runner": "sha256:1982ae948e24d00c5d221ccec12dfce1eb01204b53e37b0f857f93b16d64629d",
"zig": "0.16.0"
}
}
20 changes: 10 additions & 10 deletions .trinity/seals/t27f_token_floor.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"built_by": "t27c-bootstrap@0.5.2+1c8355564",
"built_by": "t27c-bootstrap@0.5.2+9448ab4be",
"closure": [
{
"spec": "specs/physics/physical_limits.t27",
Expand All @@ -23,27 +23,27 @@
},
{
"spec": "specs/t27f/token_floor_scenes.t27",
"spec_hash": "sha256:08649f4f6a892eb622eb22a5edf3222f4ee9ffc3cb678bf84e36cbaf4e47d966"
"spec_hash": "sha256:948cff4bd34341b40b43c8a170e2a37e3bca59f8d6bc8e35d7e5ee43fe89a4ea"
}
],
"config": "gen=c,rust,verilog,zig;tests=zig",
"gen_hash_c": "sha256:fb60769fe560b73407107b9900f288bea87433e63571cd455df65ec6e45faed6",
"gen_hash_rust": "sha256:4510fcfc7646dde1c47fe200db246b3ae36b328d0944b6246e49cc00b6facf10",
"gen_hash_verilog": "sha256:928f4b7b8119c37cd45f804a63f991318bc3f055269df989eb4889bba6b53720",
"gen_hash_zig": "sha256:1c70d762ffe8c28ea85a322d4ff23d0ea5d7c750e7699c8ef64653b385f4bb54",
"gen_hash_c": "sha256:0f358d8ff0757768f04d35ecbecd679b091c43d6d268fa8c28366fa31a3f9167",
"gen_hash_rust": "sha256:d263a762901fc286cc2d2d20c8f6445f93561933d8bdd043ba079dfcd2e686aa",
"gen_hash_verilog": "sha256:b495c59195d25d5eb3addaaf9da41cf69117a4d2c6fcf4e9320d95cbc3df0314",
"gen_hash_zig": "sha256:4c978f26d1d0a358bde62e9ef6221ec01a06d02aca24c36ada41b3c12d4b85f4",
"module": "token_floor",
"ring": 12,
"seal_schema": 2,
"sealed_at": "2026-10-18T13:36:50Z",
"sealed_at": "2026-10-18T13:21:32Z",
"sealed_by": "t27c-bootstrap@0.5.2",
"spec_hash": "sha256:e200c035ecabef82b0a36bbdcbb76130539e3c61bce784df2beea159a15b8a97",
"spec_hash": "sha256:82524e666fafe6098d85d86cfd93932e1e488f318e28ba0eff93c54cb656f8e8",
"spec_path": "specs/t27f/token_floor.t27",
"tests": {
"failed": 0,
"failing": [],
"forced": false,
"passed": 34,
"total": 34,
"passed": 35,
"total": 35,
"vacuous": 0
},
"toolchain": {
Expand Down
24 changes: 14 additions & 10 deletions .trinity/seals/t27f_token_floor_mux.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,37 +9,41 @@
"spec": "specs/t27f/particle_engine.t27",
"spec_hash": "sha256:1b99d151382c41e99a4e928842ee0abcb984d2a0ee43abf5fbd602097d6abadd"
},
{
"spec": "specs/t27f/reel_marketing.t27",
"spec_hash": "sha256:ab07f6476d900cc0e089ba1d851f0b610a77b778f00fd906d1b98a29281941c7"
},
{
"spec": "specs/t27f/reel_particles_mux.t27",
"spec_hash": "sha256:1f5486ae5a6dabe9c059733f1f45d1646ca98b555e07103e00e2dc0be53f0747"
},
{
"spec": "specs/t27f/token_floor.t27",
"spec_hash": "sha256:84c176ce3324b3f924f5be142130ebb15f26a32e63cd93d7c7f1235b0022798b"
"spec_hash": "sha256:82524e666fafe6098d85d86cfd93932e1e488f318e28ba0eff93c54cb656f8e8"
},
{
"spec": "specs/t27f/token_floor_scenes.t27",
"spec_hash": "sha256:0cdfbe9ca10442fe1f29d54a75d433ea60dafb399e45caae678838bc660d552e"
"spec_hash": "sha256:948cff4bd34341b40b43c8a170e2a37e3bca59f8d6bc8e35d7e5ee43fe89a4ea"
}
],
"config": "gen=c,rust,verilog,zig;tests=zig",
"gen_hash_c": "sha256:11a39577b1ce474e322a0a17f1a6658c977fd607958b724025435ae59569f7f8",
"gen_hash_rust": "sha256:04208153e7b89c2bf88f43a5617126236ecb23bbb2e3ba2f8e1e3b5d79b8951c",
"gen_hash_verilog": "sha256:76dbeb916a6d231f5488baaf56bec937f8697aae56907e615bb916380c2797a2",
"gen_hash_zig": "sha256:3d88cdb8db2b955868ecce0e8d3921ce30e4e428b61569b0347d10767ea08d29",
"gen_hash_c": "sha256:18710ba70409c54ce28a6baa8da85579904bf6eeec5e91f4913496216a7fb9cb",
"gen_hash_rust": "sha256:c7240d2db316d11bbff444fed4725b84a77bd566a92e6286dcc4966ae9f2bf06",
"gen_hash_verilog": "sha256:7c6af1b05a4ecfb5560ff39e4728fd96b7ab95c825c428289ab330456bc44dd7",
"gen_hash_zig": "sha256:3c98bd93b0f615e0aba5a42e5891ab8ea4288ba98397bdb3f989e059853a9cd5",
"module": "token_floor_mux",
"ring": 12,
"seal_schema": 2,
"sealed_at": "2026-10-18T12:14:37Z",
"sealed_at": "2026-10-18T13:21:31Z",
"sealed_by": "t27c-bootstrap@0.5.2",
"spec_hash": "sha256:d36ea49889e010b155bec7b823f1103963bf2471bbe4646f3f56ef610474fd05",
"spec_hash": "sha256:6b83ab94e55a46aa538701fa568cb5493e1c6766ae008386916cf83335e5c7b1",
"spec_path": "specs/t27f/token_floor_mux.t27",
"tests": {
"failed": 0,
"failing": [],
"forced": false,
"passed": 14,
"total": 14,
"passed": 16,
"total": 16,
"vacuous": 0
},
"toolchain": {
Expand Down
22 changes: 13 additions & 9 deletions .trinity/seals/t27f_token_floor_scenes.json
Original file line number Diff line number Diff line change
@@ -1,29 +1,33 @@
{
"built_by": "t27c-bootstrap@0.5.2+1c8355564",
"built_by": "t27c-bootstrap@0.5.2+9448ab4be",
"closure": [
{
"spec": "specs/t27f/pbr_sphere.t27",
"spec_hash": "sha256:2d13f0e5ae9032c886b4d9e0d64446a2589a67198d60b35e20d2cdd0d7e1280c"
},
{
"spec": "specs/t27f/reel_marketing.t27",
"spec_hash": "sha256:ab07f6476d900cc0e089ba1d851f0b610a77b778f00fd906d1b98a29281941c7"
}
],
"config": "gen=c,rust,verilog,zig;tests=zig",
"gen_hash_c": "sha256:d9e32346b1bf29ec43e0d29f823d9f8a3ec3adda874317b9f2834f93b1a82c28",
"gen_hash_rust": "sha256:06a2704d9ed92b0c12a3e1f14ede5ab62709da540ef5d565cad664f2240c868e",
"gen_hash_verilog": "sha256:0cb7607a53379caaeca94a755ec5dfcedbeea6184711e0af1b63add66fa65858",
"gen_hash_zig": "sha256:51b716d1220bd73840ae844579c27cdfc5af14b0808fb183379d85ced7f55dc2",
"gen_hash_c": "sha256:03aab73cb0ef39f09d9561c785c39cbb1d189b7e51127f3c43534d173a6d95fd",
"gen_hash_rust": "sha256:41df46ffd2cf0a8cd25e17ab54788caf6b9f3d75530e2772b830d5236a99e0eb",
"gen_hash_verilog": "sha256:9bbd947a5548b2802f0a606a4936a4158c68a1b8f29fbb332c0b0b563a9aeca0",
"gen_hash_zig": "sha256:f032a09380f4e6160c479a54afeddca5462a4e21d0f8bf6cd0f106bdede9d873",
"module": "token_floor_scenes",
"ring": 12,
"seal_schema": 2,
"sealed_at": "2026-10-18T13:36:48Z",
"sealed_at": "2026-10-18T13:21:30Z",
"sealed_by": "t27c-bootstrap@0.5.2",
"spec_hash": "sha256:08649f4f6a892eb622eb22a5edf3222f4ee9ffc3cb678bf84e36cbaf4e47d966",
"spec_hash": "sha256:948cff4bd34341b40b43c8a170e2a37e3bca59f8d6bc8e35d7e5ee43fe89a4ea",
"spec_path": "specs/t27f/token_floor_scenes.t27",
"tests": {
"failed": 0,
"failing": [],
"forced": false,
"passed": 11,
"total": 11,
"passed": 14,
"total": 14,
"vacuous": 0
},
"toolchain": {
Expand Down
7 changes: 4 additions & 3 deletions docs/reports/t27b_expectations.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
"reference-bug": "the reference passes it for the wrong reason; t27b is right not to",
"n/a": "outside what t27b is for (say why in the PR that sets it)"
},
"max_not_pass": 130,
"max_not_pass": 132,
"entries": [
{"path": "specs/a/b_c.t27", "t27b": "pass"},
{"path": "specs/a_b/c.t27", "t27b": "pass"},
Expand Down Expand Up @@ -1444,6 +1444,7 @@
{"path": "specs/t27f/quest.t27", "t27b": "pass"},
{"path": "specs/t27f/reel.t27", "t27b": "pass"},
{"path": "specs/t27f/reel_gf16_nmse.t27", "t27b": "pass"},
{"path": "specs/t27f/reel_marketing.t27", "t27b": "pass"},
{"path": "specs/t27f/reel_particles.t27", "t27b": "blocked", "blocker": "ExprCall(@sin)", "reason": "unimplemented"},
{"path": "specs/t27f/reel_particles_mux.t27", "t27b": "pass"},
{"path": "specs/t27f/reel_t27_basics.t27", "t27b": "pass"},
Expand All @@ -1454,8 +1455,8 @@
{"path": "specs/t27f/spec_graph_outline.t27", "t27b": "pass"},
{"path": "specs/t27f/spec_graph_view.t27", "t27b": "pass"},
{"path": "specs/t27f/token_floor.t27", "t27b": "blocked", "blocker": "type [N]T", "reason": "unimplemented"},
{"path": "specs/t27f/token_floor_mux.t27", "t27b": "pass"},
{"path": "specs/t27f/token_floor_scenes.t27", "t27b": "pass"},
{"path": "specs/t27f/token_floor_mux.t27", "t27b": "blocked", "blocker": "ExprCall(@sin)", "reason": "unimplemented"},
{"path": "specs/t27f/token_floor_scenes.t27", "t27b": "blocked", "blocker": "ExprCall(@sin)", "reason": "unimplemented"},
{"path": "specs/t27f/topic_engine.t27", "t27b": "pass"},
{"path": "specs/t27f/topic_reel.t27", "t27b": "pass"},
{"path": "specs/t27f/ui_plan.t27", "t27b": "pass"},
Expand Down
151 changes: 151 additions & 0 deletions specs/t27f/reel_marketing.t27
Original file line number Diff line number Diff line change
@@ -0,0 +1,151 @@
// SPDX-License-Identifier: Apache-2.0
// specs/t27f/reel_marketing.t27 -- what a short vertical reel must do to work as marketing, as
// numbers a renderer's layout and timing are tested against: where the platforms draw their own
// interface over the picture, how soon the hook must land, how often the picture must change, and
// how long and how big the call to action stays at the end.
//
// WHY: the owner, 2026-10-18, on the token_floor reel: study how marketing reels are made, so that
// ours is marketing too. A reel that is right but sits under the platform's buttons, opens on an
// empty frame or ends without an address does not sell anything.
//
// THE PRACTICE, as the 2026 creator and vendor guides give it (directional: none of it is a
// platform's published law, and the guides disagree on the numbers):
//
// the overlay Instagram Reels, TikTok and YouTube Shorts draw over a 1080x1920 reel: the
// account line at the top, the caption, the audio line and the action button at
// the bottom, the like/comment/share rail on the right. Measured margins, organic
// posts, by source, are in REEL_SOURCE_MARGIN; REEL_SAFE takes the widest margin of
// every edge, so what is inside shows on all three alike. Ads need more (Meta
// asks for the bottom 40% free under a disclaimer): NOT CLAIMED here, and that is
// the zone specs/automation/crm-lead-magnet.t27 holds for its story frame.
// the hook most of the viewers who leave, leave in the first 3 s. The statement is on
// screen, written and readable, inside REEL_HOOK_TEXT_MS, and the voice has
// started inside REEL_FIRST_WORD_MS.
// captions feeds autoplay muted, so the words are burned in, inside the safe zone, and
// the first caption is the hook itself.
// pace a new picture -- a new shot, the camera arriving somewhere -- at least every
// REEL_RESET_MS, or attention resets elsewhere.
// the CTA the address, big, inside the safe zone, held still for the reel's last
// REEL_CTA_MIN_MS at least. The house template holds 3 s
// (owner_voice_reel.CTA_HOLD_MS); a reel whose voice runs longer keeps this floor.
// the length 15 to 30 s keeps retention highest.
//
// Sources (fetched 2026-10-18): postplanify.com/blog/social-media-safe-zones-2026-complete-guide,
// uplads.com/tools/safe-zone-checker (zones verified July 2026), xyla.ai/tools/social-media-sizes,
// reelsafezone.com, adaptlypost.com/blog/social-media-safe-zones-2026-complete-guide,
// opus.pro/blog/ideal-youtube-shorts-length-format-retention, capcut.com/create/short-form-video-hooks.
//
// NOT CLAIMED: that a reel inside these numbers is watched; the numbers are the floor a marketing
// reel stands on, not a forecast of its reach.
// phi^2 + 1/phi^2 = 3 | TRINITY

module reel_marketing;

pub const ID : str = "reel-marketing";
pub const MEASURED_ON : str = "2026-10-18";

// ---- the overlay ----
pub const REEL_W : f64 = 1080.0;
pub const REEL_H : f64 = 1920.0;

// Per source, organic post, px of 1080x1920: top, bottom, left, right. 0 where the source names
// no margin on that edge.
// 0 TikTok, PostPlanify 1 TikTok, Uplads (organic) 2 TikTok, Xyla
// 3 Instagram Reels, PostPlanify 4 Instagram Reels, ReelSafeZone 5 Instagram Reels, Xyla
// 6 all three, AdaptlyPost: a 900x1400 area centred in the frame
pub const REEL_SOURCES : usize = 7;
pub const REEL_SOURCE_MARGIN : [28]f64 = [
108.0, 320.0, 60.0, 120.0,
130.0, 320.0, 44.0, 140.0,
130.0, 484.0, 0.0, 140.0,
210.0, 310.0, 0.0, 84.0,
220.0, 280.0, 0.0, 160.0,
220.0, 430.0, 130.0, 130.0,
260.0, 260.0, 90.0, 90.0
];

// The widest margin of edge e (0 top, 1 bottom, 2 left, 3 right) over every source.
pub fn reel_margin(e: usize) -> f64 {
var m : f64 = 0.0;
var s : usize = 0;
while (s < REEL_SOURCES) {
const v = REEL_SOURCE_MARGIN[s * 4 + e];
if (v > m) { m = v; }
s = s + 1;
}
return m;
}

// The safe rect of the tall frame, k 0..3: x0, y0, x1, y1.
pub fn reel_safe(k: usize) -> f64 {
if (k == 0) { return reel_margin(2); }
if (k == 1) { return reel_margin(0); }
if (k == 2) { return REEL_W - reel_margin(3); }
return REEL_H - reel_margin(1);
}

// True when the box (x0, y0)-(x1, y1), tall-frame px, shows on every platform.
pub fn reel_shows(x0: f64, y0: f64, x1: f64, y1: f64) -> bool {
return x0 >= reel_safe(0) && y0 >= reel_safe(1) && x1 <= reel_safe(2) && y1 <= reel_safe(3);
}

// ---- the clock ----
pub const REEL_FIRST_WORD_MS : i32 = 500; // the voice has started
pub const REEL_HOOK_TEXT_MS : i32 = 1000; // the hook's statement is written on screen
pub const REEL_HOOK_MS : i32 = 3000; // the window the viewer decides in
pub const REEL_RESET_MS : i32 = 3000; // the longest a picture may stay unchanged
pub const REEL_CTA_MIN_MS : i32 = 1500; // the address, still, at the end
pub const REEL_MIN_MS : i32 = 15000;
pub const REEL_MAX_MS : i32 = 30000;

// ---- legibility ----
// A 1080 px wide frame is about 68 mm on a 6.1 inch phone: 40 px of cap height is 2.5 mm, the
// smallest a statement is read at a glance; a CTA line is set at 64 px of type or more.
pub const REEL_TEXT_MIN_PX : f64 = 40.0;
pub const REEL_CTA_MIN_PX : f64 = 64.0;

pub fn reel_length_ok(ms: i32) -> bool {
return ms >= REEL_MIN_MS && ms <= REEL_MAX_MS;
}

// ---- tests ----

test "the safe rect takes the widest margin of every edge, and leaves a picture" {
assert(reel_margin(0) == 260.0);
assert(reel_margin(1) == 484.0);
assert(reel_margin(2) == 130.0);
assert(reel_margin(3) == 160.0);
// every source's own zone holds the union: no edge of it is closer than any source allows
var s : usize = 0;
while (s < REEL_SOURCES) {
assert(reel_safe(1) >= REEL_SOURCE_MARGIN[s * 4]);
assert(REEL_H - reel_safe(3) >= REEL_SOURCE_MARGIN[s * 4 + 1]);
assert(reel_safe(0) >= REEL_SOURCE_MARGIN[s * 4 + 2]);
assert(REEL_W - reel_safe(2) >= REEL_SOURCE_MARGIN[s * 4 + 3]);
s = s + 1;
}
// what is left is 790 x 1176, three fifths of the frame's height
assert(reel_safe(2) - reel_safe(0) == 790.0);
assert(reel_safe(3) - reel_safe(1) == 1176.0);
}

test "the overlay check bites: the old caption line and the old tag line are under the platform" {
// a caption centred at y 1700, as token_floor's tall cut had it, is under the caption and audio
assert(reel_shows(60.0, 1629.0, 1020.0, 1777.0) == false);
// a tag at y 96 is under the account line; one at the right edge under the rail
assert(reel_shows(60.0, 96.0, 400.0, 132.0) == false);
assert(reel_shows(600.0, 600.0, 1000.0, 640.0) == false);
assert(reel_shows(130.0, 260.0, 920.0, 1436.0));
}

test "the clock: the hook inside the decision window, the CTA after it, the length in range" {
assert(REEL_FIRST_WORD_MS < REEL_HOOK_TEXT_MS);
assert(REEL_HOOK_TEXT_MS < REEL_HOOK_MS);
assert(REEL_HOOK_MS + REEL_CTA_MIN_MS < REEL_MIN_MS);
assert(REEL_RESET_MS * 5 <= REEL_MIN_MS);
assert(reel_length_ok(15000));
assert(reel_length_ok(30000));
assert(reel_length_ok(14999) == false);
assert(reel_length_ok(45000) == false);
assert(REEL_TEXT_MIN_PX < REEL_CTA_MIN_PX);
}
Loading
Loading