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:
@@ -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."
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user