Meeting Time Allocator
productivity.allocate_meeting_time
Overview
You send the length of the meeting and its already selected topics, some with fixed minutes and some to be given a share, and we return the allocation with every entry's minutes, offset and optional local start. The arithmetic is largest-remainder apportionment over whole minutes, published step by step so you can reproduce it by hand. Nothing is silently dropped or shrunk: a request whose numbers cannot work comes back as a typed refusal that reports what was required and what was available.
Splitting a meeting evenly has several defensible answers, and two agents that each invent one will disagree about the same meeting.
Reliability
Same request, same bytes back, remainder minutes included. The rule is: order the topics, subtract fixed and break minutes, give each flexible topic the floor of its weighted share, then hand the leftover out one unit at a time to the largest remainders, ties by allocation position. Under a rounding unit the minutes that cannot form a unit are appended to the last flexible topic, which keeps every earlier offset on a round boundary. Failures, none worth retrying unchanged: MEETING_TIME_TOPICS_INVALID means the topic list or one of its entries was malformed, most often a missing title, so correct the entry named; MEETING_TIME_TOPIC_TITLE_TOO_LONG means a title ran past 200 characters, so shorten it to a heading rather than a description; MEETING_TIME_DURATION_INVALID means totalMinutes, a topic's minutes or minTopicMinutes sat outside its range, so bring it back in range; MEETING_TIME_WEIGHT_INVALID means a weight or priority sat outside 1 to 100 or 1 to 5, so correct that topic; MEETING_TIME_FIXED_EXCEEDS_TOTAL means fixed topics and breaks already exceed the meeting, and the response reports all three numbers; MEETING_TIME_DOES_NOT_FIT means what is left cannot give every flexible topic its minimum, reported as required against available minutes, so raise the total or drop a topic; MEETING_TIME_BREAK_INVALID means a break was malformed or sat after more topics than exist, so correct its position or length; MEETING_TIME_ROUNDING_UNSUPPORTED means roundingUnit was outside the three published units, so pick one of them; MEETING_TIME_ORDERING_UNSUPPORTED means ordering was outside the three published orders, so pick one of those; MEETING_TIME_START_TIME_INVALID means startTime was not a local HH:MM value, so send one with no date and no zone; MEETING_TIME_START_TIME_OVERFLOW means the allocation would run past midnight, which is refused rather than wrapped, so start earlier or shorten the meeting; MEETING_TIME_LIMIT_EXCEEDED means more than 100 topics or 10 breaks arrived, so split the meeting.
Context footprint
Returns one small record per topic and per break plus a counts block. Titles are echoed only to identify the caller's supplied topics. A successful call costs 1 execution credit.
When to use it
When you know the meeting length and the topics and want minutes assigned by a rule you can check by hand.
When topics must be selected, written, ordered by semantic importance or turned into a real agenda, or when anything must be written to a calendar.
Scope
Non-goals
- Does not create, send or store a calendar invitation of any kind
- Does not select, infer, rewrite or assess the importance of meeting topics
- Does not create an agenda, goals, outcomes, facilitators or pre-reading
- Treats every caller-supplied title as an opaque Unicode label
- Does not use a clock; startTime is a local label you supply
- Does not shrink or drop a topic to make the numbers work
Properties
Capabilities
Cost & billing
Flat rate per invocation
File handling
How we handle your data
What this means
This skill may receive sensitive content and may return submitted, transformed, extracted, or reformatted content.
Squillify guarantees
- Runs inside Squillify
- This skill runs inside Squillify.
- Payloads are not sent to an external service by this skill.
- Squillify does not permanently store submitted payloads.
- Telemetry records metadata only, not submitted content.
- Submitted payloads are not used for training.
- Submitted payloads are not reviewed by humans.
- This skill does not target sensitive data.
- The response may contain submitted or transformed content.
Your responsibility
Squillify does not determine whether submitted content is sensitive. Your application is responsible for deciding what data it is allowed to submit. Your application is responsible for securing the response.
Input schema
| Field | Type | Required | Description |
|---|---|---|---|
| totalMinutes | integer | Yes | How long the meeting runs, 1 through 1440 whole minutes including breaks. |
| topics | array | Yes | Topics to allocate, 1 through 100 closed objects each with a title and optional minutes, weight and priority. |
| breaks | array | No | Breaks to insert, 0 through 10 closed afterPosition/minutes objects; omit it for none. |
| minTopicMinutes | integer | No | Least a flexible topic may receive, 1 through 60 minutes; omit it for 5. |
| roundingUnit | string | No | Apportion in ONE_MINUTE, FIVE_MINUTES or FIFTEEN_MINUTES units; omit it for ONE_MINUTE. |
| ordering | string | No | INPUT_ORDER keeps your sequence, PRIORITY_DESC sorts by priority, FIXED_FIRST puts fixed topics first. Omit it for INPUT_ORDER. |
| startTime | string | No | Local HH:MM start with no date and no zone; omit it so offsets alone come back. |
Output schema
| Field | Type | Required | Description |
|---|---|---|---|
| allocation | object | Yes | Closed computed allocation with totalMinutes, allocatedMinutes and entries in running order, each a topic or break with minutes and offset. |
| summary | object | Yes | Closed counts and settings: topic, fixed, flexible and break counts, ordering, rounding unit, minimum minutes, remainder and unallocated minutes. |
API contract
POST /v1/executecurl -sS -X POST "$BASE/v1/execute" -H "Authorization: Bearer $KEY" -H 'Content-Type: application/json' -d '{"skillKey":"productivity.allocate_meeting_time","input":{"totalMinutes":60,"topics":[{"title":"Q3 pipeline"},{"title":"Hiring plan"},{"title":"Budget review"}]}}'import { Squillify } from "@squillify/sdk";
const sq = new Squillify({ apiKey: process.env.SQUILLIFY_API_KEY });
const { output } = await sq.execute("productivity.allocate_meeting_time", {"totalMinutes":60,"topics":[{"title":"Q3 pipeline"},{"title":"Hiring plan"},{"title":"Budget review"}]});Errors
| Code | HTTP | Retryable | Description |
|---|---|---|---|
| VALIDATION_ERROR | 400 | No | The request payload failed schema validation. |
| UNAUTHORIZED | 401 | No | Missing or invalid API key. |
| SKILL_NOT_ACCESSIBLE | 403 | No | The API key is not granted access to this skill. |
| SKILL_NOT_AVAILABLE_FOR_PLAN | 403 | No | This skill is not included in your current plan. |
| PLAN_ELIGIBILITY_UNAVAILABLE | 503 | Yes | Plan eligibility could not be decided. Retry after backoff. |
| SKILL_NOT_FOUND | 404 | No | The requested skill or version does not exist. |
| TENANT_RATE_LIMITED | 429 | Yes | Request rate limit exceeded. Retry after backoff. |
| QUOTA_EXCEEDED | 429 | Yes | Plan quota exhausted. Retryable once the quota period resets. |
| EXECUTION_TIMEOUT | 504 | Yes | Execution exceeded the allowed time budget. |
| MEETING_TIME_TOPICS_INVALID | 400 | No | The request payload failed this skill's input validation. |
| MEETING_TIME_TOPIC_TITLE_TOO_LONG | 429 | No | A size, quota, rate, or time limit was exceeded. |
| MEETING_TIME_DURATION_INVALID | 400 | No | The request payload failed this skill's input validation. |
| MEETING_TIME_WEIGHT_INVALID | 400 | No | The request payload failed this skill's input validation. |
| MEETING_TIME_FIXED_EXCEEDS_TOTAL | 412 | No | The input is valid but cannot be processed as-is. |
| MEETING_TIME_DOES_NOT_FIT | 412 | No | The input is valid but cannot be processed as-is. |
| MEETING_TIME_BREAK_INVALID | 400 | No | The request payload failed this skill's input validation. |
| MEETING_TIME_ROUNDING_UNSUPPORTED | 400 | No | The skill does not support the requested variant. |
| MEETING_TIME_ORDERING_UNSUPPORTED | 400 | No | The skill does not support the requested variant. |
| MEETING_TIME_START_TIME_INVALID | 400 | No | The request payload failed this skill's input validation. |
| MEETING_TIME_START_TIME_OVERFLOW | 412 | No | The input is valid but cannot be processed as-is. |
| MEETING_TIME_LIMIT_EXCEEDED | 429 | No | A size, quota, rate, or time limit was exceeded. |
Other limits
| Limit | Value |
|---|---|
| Recommended inline bytes | 32 KiB |
Limitations
- Does not create, send or store a calendar invitation of any kind
- Does not select, infer, rewrite or assess the importance of meeting topics
- Does not create an agenda, goals, outcomes, facilitators or pre-reading
- Treats every caller-supplied title as an opaque Unicode label
- Does not use a clock; startTime is a local label you supply
- Does not shrink or drop a topic to make the numbers work
- Choosing the topics themselves, which is a judgement this does not make
- Creating or improving an agenda, which requires semantic judgement
- Scheduling the meeting into a calendar, which nothing here touches
How to call
POST /v1/execute (requires authentication)
{
"skillKey": "productivity.allocate_meeting_time",
"input": {
"totalMinutes": 60,
"topics": [
{
"title": "Q3 pipeline"
},
{
"title": "Hiring plan"
},
{
"title": "Budget review"
}
]
}
}Examples
An hour split evenly across three topics
{
"totalMinutes": 60,
"topics": [
{
"title": "Q3 pipeline"
},
{
"title": "Hiring plan"
},
{
"title": "Budget review"
}
]
}{
"summary": {
"topicCount": 3,
"fixedCount": 0,
"flexibleCount": 3,
"breakCount": 0,
"ordering": "INPUT_ORDER",
"roundingUnit": "ONE_MINUTE",
"minTopicMinutes": 5,
"remainderMinutes": 0,
"unallocatedMinutes": 0
},
"allocation": {
"totalMinutes": 60,
"allocatedMinutes": 60,
"entries": [
{
"position": 0,
"type": "TOPIC",
"title": "Q3 pipeline",
"minutes": 20,
"offsetMinutes": 0,
"allocation": "FLEXIBLE",
"remainderMinutesAdded": 0
},
{
"position": 1,
"type": "TOPIC",
"title": "Hiring plan",
"minutes": 20,
"offsetMinutes": 20,
"allocation": "FLEXIBLE",
"remainderMinutesAdded": 0
},
{
"position": 2,
"type": "TOPIC",
"title": "Budget review",
"minutes": 20,
"offsetMinutes": 40,
"allocation": "FLEXIBLE",
"remainderMinutesAdded": 0
}
]
}
}Two topics around a ten-minute break, with local start times
{
"topics": [
{
"title": "Q3 pipeline"
},
{
"title": "Hiring plan"
}
],
"breaks": [
{
"minutes": 10,
"afterPosition": 1
}
],
"startTime": "09:00",
"totalMinutes": 60
}{
"summary": {
"topicCount": 2,
"fixedCount": 0,
"flexibleCount": 2,
"breakCount": 1,
"ordering": "INPUT_ORDER",
"roundingUnit": "ONE_MINUTE",
"minTopicMinutes": 5,
"remainderMinutes": 0,
"unallocatedMinutes": 0
},
"allocation": {
"totalMinutes": 60,
"allocatedMinutes": 60,
"entries": [
{
"position": 0,
"type": "TOPIC",
"title": "Q3 pipeline",
"minutes": 25,
"offsetMinutes": 0,
"startsAt": "09:00",
"allocation": "FLEXIBLE",
"remainderMinutesAdded": 0
},
{
"position": 1,
"type": "BREAK",
"title": "Break",
"minutes": 10,
"offsetMinutes": 25,
"startsAt": "09:25",
"allocation": "BREAK",
"remainderMinutesAdded": 0
},
{
"position": 2,
"type": "TOPIC",
"title": "Hiring plan",
"minutes": 25,
"offsetMinutes": 35,
"startsAt": "09:35",
"allocation": "FLEXIBLE",
"remainderMinutesAdded": 0
}
]
}
}Recommended use cases
- Give an agent a defensible timebox per topic that adds up to the meeting length
- Recompute timeboxes after a topic gains fixed minutes, without hand arithmetic
Avoid for
- Choosing the topics themselves, which is a judgement this does not make
- Creating or improving an agenda, which requires semantic judgement
- Scheduling the meeting into a calendar, which nothing here touches
Related skills
Composable with
Safety & privacy
- Runs without calling any external service.
- Your payloads are never stored permanently.
- Telemetry captures metadata only — never your payload contents.
- We never train models on your payloads.
- No human reviews your payloads.