fix(film): capture resilience + scene fixes; finalize 20-clip durations

Orchestrator: bind ctx.spaNavigate to the page (fixes breadth-flash/role-perspective doing nothing) and wrap each clip in try/catch so one bad scene can't abort the run or lose the manifest. Cursor: guard page.evaluate against navigation-mid-move (fixes storm-intel 'execution context destroyed'). territory-map now leads with an existing Hot-Lead parcel (full populated detail); crane-close shows the full crane (mast+cable) then pans to the swinging card. Manifest holds real ffprobe durations for all 20 clips (film = 14m56s).
This commit is contained in:
Satyam Rastogi
2026-05-31 00:07:44 +05:30
parent f76a9da7b4
commit ba52200d08
5 changed files with 380 additions and 210 deletions
+238 -53
View File
@@ -9,9 +9,20 @@
"role": "public",
"route": "/",
"act": "Open",
"durationFrames": 360,
"keyMoments": [{ "frame": 110, "zoom": 1.07 }],
"captions": [{ "fromFrame": 45, "toFrame": 300, "text": "The operating system for modern roofing." }]
"durationFrames": 547,
"keyMoments": [
{
"frame": 110,
"zoom": 1.07
}
],
"captions": [
{
"fromFrame": 45,
"toFrame": 300,
"text": "The operating system for modern roofing."
}
]
},
{
"id": "storm-intel",
@@ -20,9 +31,20 @@
"route": "/owner/storm-intel",
"act": "Win the work",
"pillarTitle": "Storm Intelligence",
"durationFrames": 1650,
"keyMoments": [{ "frame": 495, "zoom": 1.07 }],
"captions": [{ "fromFrame": 60, "toFrame": 540, "text": "Drop a pin and see every hail event in the territory." }]
"durationFrames": 1501,
"keyMoments": [
{
"frame": 495,
"zoom": 1.07
}
],
"captions": [
{
"fromFrame": 60,
"toFrame": 540,
"text": "Drop a pin and see every hail event in the territory."
}
]
},
{
"id": "territory-map",
@@ -31,9 +53,20 @@
"route": "/owner/maps",
"act": "Win the work",
"pillarTitle": "Territory Command",
"durationFrames": 1500,
"keyMoments": [{ "frame": 450, "zoom": 1.06 }],
"captions": [{ "fromFrame": 60, "toFrame": 540, "text": "Map your turf, work the streets that pay." }]
"durationFrames": 1800,
"keyMoments": [
{
"frame": 450,
"zoom": 1.06
}
],
"captions": [
{
"fromFrame": 60,
"toFrame": 540,
"text": "Map your turf, work the streets that pay."
}
]
},
{
"id": "lead-create",
@@ -42,9 +75,20 @@
"route": "/emp/fa/leads/new",
"act": "Win the work",
"pillarTitle": "Lead Creation",
"durationFrames": 1800,
"keyMoments": [{ "frame": 540, "zoom": 1.06 }],
"captions": [{ "fromFrame": 60, "toFrame": 540, "text": "Capture a lead from the doorstep in seconds." }]
"durationFrames": 1512,
"keyMoments": [
{
"frame": 540,
"zoom": 1.06
}
],
"captions": [
{
"fromFrame": 60,
"toFrame": 540,
"text": "Capture a lead from the doorstep in seconds."
}
]
},
{
"id": "lead-verify",
@@ -53,8 +97,14 @@
"route": "/lead-verification",
"act": "Win the work",
"pillarTitle": "Lead Verification",
"durationFrames": 900,
"captions": [{ "fromFrame": 60, "toFrame": 420, "text": "Verify the address before you roll a truck." }]
"durationFrames": 1618,
"captions": [
{
"fromFrame": 60,
"toFrame": 420,
"text": "Verify the address before you roll a truck."
}
]
},
{
"id": "dispatch",
@@ -63,9 +113,20 @@
"route": "/owner/dispatch",
"act": "Run the operation",
"pillarTitle": "LynkDispatch",
"durationFrames": 1650,
"keyMoments": [{ "frame": 495, "zoom": 1.07 }],
"captions": [{ "fromFrame": 60, "toFrame": 540, "text": "Dispatch the right crew to the right roof." }]
"durationFrames": 1769,
"keyMoments": [
{
"frame": 495,
"zoom": 1.07
}
],
"captions": [
{
"fromFrame": 60,
"toFrame": 540,
"text": "Dispatch the right crew to the right roof."
}
]
},
{
"id": "kanban",
@@ -74,9 +135,20 @@
"route": "/owner/kanban",
"act": "Run the operation",
"pillarTitle": "Pipeline in Motion",
"durationFrames": 1500,
"keyMoments": [{ "frame": 450, "zoom": 1.06 }],
"captions": [{ "fromFrame": 60, "toFrame": 540, "text": "Drag every job from lead to paid." }]
"durationFrames": 833,
"keyMoments": [
{
"frame": 450,
"zoom": 1.06
}
],
"captions": [
{
"fromFrame": 60,
"toFrame": 540,
"text": "Drag every job from lead to paid."
}
]
},
{
"id": "sub-tasks",
@@ -85,8 +157,14 @@
"route": "/owner/subcontractor-tasks",
"act": "Run the operation",
"pillarTitle": "Subcontractor Tasks",
"durationFrames": 1050,
"captions": [{ "fromFrame": 60, "toFrame": 480, "text": "Hand off the punch list to your subs." }]
"durationFrames": 700,
"captions": [
{
"fromFrame": 60,
"toFrame": 480,
"text": "Hand off the punch list to your subs."
}
]
},
{
"id": "pro-canvas",
@@ -95,9 +173,20 @@
"route": "/owner/pro-canvas",
"act": "Estimate & sell",
"pillarTitle": "Pro-Canvas",
"durationFrames": 1800,
"keyMoments": [{ "frame": 540, "zoom": 1.07 }],
"captions": [{ "fromFrame": 60, "toFrame": 540, "text": "Build the proposal your homeowner signs on the spot." }]
"durationFrames": 2407,
"keyMoments": [
{
"frame": 540,
"zoom": 1.07
}
],
"captions": [
{
"fromFrame": 60,
"toFrame": 540,
"text": "Build the proposal your homeowner signs on the spot."
}
]
},
{
"id": "estimates",
@@ -106,8 +195,14 @@
"route": "/owner/estimates",
"act": "Estimate & sell",
"pillarTitle": "Estimates",
"durationFrames": 1050,
"captions": [{ "fromFrame": 60, "toFrame": 480, "text": "Price the job with margins that hold." }]
"durationFrames": 932,
"captions": [
{
"fromFrame": 60,
"toFrame": 480,
"text": "Price the job with margins that hold."
}
]
},
{
"id": "owner-snapshot",
@@ -116,9 +211,20 @@
"route": "/owner/snapshot",
"act": "See the business",
"pillarTitle": "Owner Snapshot",
"durationFrames": 1650,
"keyMoments": [{ "frame": 495, "zoom": 1.06 }],
"captions": [{ "fromFrame": 60, "toFrame": 540, "text": "Your whole company on one screen." }]
"durationFrames": 1624,
"keyMoments": [
{
"frame": 495,
"zoom": 1.06
}
],
"captions": [
{
"fromFrame": 60,
"toFrame": 540,
"text": "Your whole company on one screen."
}
]
},
{
"id": "operator-dashboard",
@@ -127,8 +233,14 @@
"route": "/emp/fa/dashboard",
"act": "See the business",
"pillarTitle": "Operator Dashboard",
"durationFrames": 900,
"captions": [{ "fromFrame": 60, "toFrame": 420, "text": "Every rep knows their numbers by 8am." }]
"durationFrames": 1419,
"captions": [
{
"fromFrame": 60,
"toFrame": 420,
"text": "Every rep knows their numbers by 8am."
}
]
},
{
"id": "people-skills",
@@ -137,9 +249,20 @@
"route": "/owner/people",
"act": "Manage the team",
"pillarTitle": "People & Skills",
"durationFrames": 1500,
"keyMoments": [{ "frame": 450, "zoom": 1.06 }],
"captions": [{ "fromFrame": 60, "toFrame": 540, "text": "Track crews, skills and certifications in one place." }]
"durationFrames": 1481,
"keyMoments": [
{
"frame": 450,
"zoom": 1.06
}
],
"captions": [
{
"fromFrame": 60,
"toFrame": 540,
"text": "Track crews, skills and certifications in one place."
}
]
},
{
"id": "project-detail",
@@ -148,9 +271,20 @@
"route": "/owner/projects",
"act": "Manage the team",
"pillarTitle": "Project Details",
"durationFrames": 1650,
"keyMoments": [{ "frame": 495, "zoom": 1.06 }],
"captions": [{ "fromFrame": 60, "toFrame": 540, "text": "Every photo, doc and update on the job." }]
"durationFrames": 1838,
"keyMoments": [
{
"frame": 495,
"zoom": 1.06
}
],
"captions": [
{
"fromFrame": 60,
"toFrame": 540,
"text": "Every photo, doc and update on the job."
}
]
},
{
"id": "documents",
@@ -159,8 +293,14 @@
"route": "/owner/documents",
"act": "Manage the team",
"pillarTitle": "Documents",
"durationFrames": 750,
"captions": [{ "fromFrame": 60, "toFrame": 420, "text": "Contracts and warranties, signed and stored." }]
"durationFrames": 690,
"captions": [
{
"fromFrame": 60,
"toFrame": 420,
"text": "Contracts and warranties, signed and stored."
}
]
},
{
"id": "org-access",
@@ -169,9 +309,20 @@
"route": "/owner/settings",
"act": "Control & trust",
"pillarTitle": "Access Control",
"durationFrames": 1650,
"keyMoments": [{ "frame": 495, "zoom": 1.06 }],
"captions": [{ "fromFrame": 60, "toFrame": 540, "text": "Give every role exactly the access they need." }]
"durationFrames": 1259,
"keyMoments": [
{
"frame": 495,
"zoom": 1.06
}
],
"captions": [
{
"fromFrame": 60,
"toFrame": 540,
"text": "Give every role exactly the access they need."
}
]
},
{
"id": "role-perspective",
@@ -180,8 +331,14 @@
"route": "/owner/snapshot",
"act": "Control & trust",
"pillarTitle": "Role Perspective",
"durationFrames": 1050,
"captions": [{ "fromFrame": 60, "toFrame": 480, "text": "See the app the way your team sees it." }]
"durationFrames": 1789,
"captions": [
{
"fromFrame": 60,
"toFrame": 480,
"text": "See the app the way your team sees it."
}
]
},
{
"id": "ai-assistant",
@@ -190,9 +347,20 @@
"route": "/chat-assistant",
"act": "Intelligence",
"pillarTitle": "AI Assistant",
"durationFrames": 1050,
"keyMoments": [{ "frame": 315, "zoom": 1.07 }],
"captions": [{ "fromFrame": 60, "toFrame": 480, "text": "Ask anything about your business, get an answer." }]
"durationFrames": 585,
"keyMoments": [
{
"frame": 315,
"zoom": 1.07
}
],
"captions": [
{
"fromFrame": 60,
"toFrame": 480,
"text": "Ask anything about your business, get an answer."
}
]
},
{
"id": "breadth-flash",
@@ -200,8 +368,14 @@
"role": "owner",
"route": "/owner/snapshot",
"act": "Close",
"durationFrames": 540,
"captions": [{ "fromFrame": 30, "toFrame": 480, "text": "One platform. Every part of the job." }]
"durationFrames": 1636,
"captions": [
{
"fromFrame": 30,
"toFrame": 480,
"text": "One platform. Every part of the job."
}
]
},
{
"id": "crane-close",
@@ -209,9 +383,20 @@
"role": "public",
"route": "/",
"act": "Close",
"durationFrames": 660,
"keyMoments": [{ "frame": 200, "zoom": 1.08 }],
"captions": [{ "fromFrame": 60, "toFrame": 600, "text": "LynkedUp Pro. Build the roof, run the company." }]
"durationFrames": 714,
"keyMoments": [
{
"frame": 200,
"zoom": 1.08
}
],
"captions": [
{
"fromFrame": 60,
"toFrame": 600,
"text": "LynkedUp Pro. Build the roof, run the company."
}
]
}
]
}