Skip to main content

Squillify development is paused indefinitely. Read why, and discover what this experiment achieved. Read the story

MicroSkills Reference

Meeting Time Allocator

productivity.allocate_meeting_time

ProductionBounded custom (Class B)Deterministicstrictinstantv1.0.0
No network

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

Note
Allocate a total duration across caller-supplied topics and breaks by a published largest-remainder rule over whole minutes.

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

IdempotentRetry safeStreaming supportedFile input supportedRequires external service

Capabilities

generationmath

Cost & billing

Flat rate per invocation

MetercallsBillable onsuccessCost per call1 credit

File handling

Accepts file_refProduces file_refMax input64 KB

How we handle your data

Sensitive output possible
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.

Read the Microskill Data Handling Policy

Input schema

FieldTypeRequiredDescription
totalMinutesintegerYesHow long the meeting runs, 1 through 1440 whole minutes including breaks.
topicsarrayYesTopics to allocate, 1 through 100 closed objects each with a title and optional minutes, weight and priority.
breaksarrayNoBreaks to insert, 0 through 10 closed afterPosition/minutes objects; omit it for none.
minTopicMinutesintegerNoLeast a flexible topic may receive, 1 through 60 minutes; omit it for 5.
roundingUnitstringNoApportion in ONE_MINUTE, FIVE_MINUTES or FIFTEEN_MINUTES units; omit it for ONE_MINUTE.
orderingstringNoINPUT_ORDER keeps your sequence, PRIORITY_DESC sorts by priority, FIXED_FIRST puts fixed topics first. Omit it for INPUT_ORDER.
startTimestringNoLocal HH:MM start with no date and no zone; omit it so offsets alone come back.

Output schema

FieldTypeRequiredDescription
allocationobjectYesClosed computed allocation with totalMinutes, allocatedMinutes and entries in running order, each a topic or break with minutes and offset.
summaryobjectYesClosed counts and settings: topic, fixed, flexible and break counts, ordering, rounding unit, minimum minutes, remainder and unallocated minutes.

API contract

POST /v1/execute
curl
curl -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"}]}}'
Integrations
TypeScript SDK
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

CodeHTTPRetryableDescription
VALIDATION_ERROR400NoThe request payload failed schema validation.
UNAUTHORIZED401NoMissing or invalid API key.
SKILL_NOT_ACCESSIBLE403NoThe API key is not granted access to this skill.
SKILL_NOT_AVAILABLE_FOR_PLAN403NoThis skill is not included in your current plan.
PLAN_ELIGIBILITY_UNAVAILABLE503YesPlan eligibility could not be decided. Retry after backoff.
SKILL_NOT_FOUND404NoThe requested skill or version does not exist.
TENANT_RATE_LIMITED429YesRequest rate limit exceeded. Retry after backoff.
QUOTA_EXCEEDED429YesPlan quota exhausted. Retryable once the quota period resets.
EXECUTION_TIMEOUT504YesExecution exceeded the allowed time budget.
MEETING_TIME_TOPICS_INVALID400NoThe request payload failed this skill's input validation.
MEETING_TIME_TOPIC_TITLE_TOO_LONG429NoA size, quota, rate, or time limit was exceeded.
MEETING_TIME_DURATION_INVALID400NoThe request payload failed this skill's input validation.
MEETING_TIME_WEIGHT_INVALID400NoThe request payload failed this skill's input validation.
MEETING_TIME_FIXED_EXCEEDS_TOTAL412NoThe input is valid but cannot be processed as-is.
MEETING_TIME_DOES_NOT_FIT412NoThe input is valid but cannot be processed as-is.
MEETING_TIME_BREAK_INVALID400NoThe request payload failed this skill's input validation.
MEETING_TIME_ROUNDING_UNSUPPORTED400NoThe skill does not support the requested variant.
MEETING_TIME_ORDERING_UNSUPPORTED400NoThe skill does not support the requested variant.
MEETING_TIME_START_TIME_INVALID400NoThe request payload failed this skill's input validation.
MEETING_TIME_START_TIME_OVERFLOW412NoThe input is valid but cannot be processed as-is.
MEETING_TIME_LIMIT_EXCEEDED429NoA size, quota, rate, or time limit was exceeded.

Other limits

LimitValue
Recommended inline bytes32 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)

Request bodyjson
{
  "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

Inputjson
{
  "totalMinutes": 60,
  "topics": [
    {
      "title": "Q3 pipeline"
    },
    {
      "title": "Hiring plan"
    },
    {
      "title": "Budget review"
    }
  ]
}
Expected outputjson
{
  "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
      }
    ]
  }
}
Tip
Three equal weights over 60 minutes divide exactly, so no remainder minute has to be placed.

Two topics around a ten-minute break, with local start times

Inputjson
{
  "topics": [
    {
      "title": "Q3 pipeline"
    },
    {
      "title": "Hiring plan"
    }
  ],
  "breaks": [
    {
      "minutes": 10,
      "afterPosition": 1
    }
  ],
  "startTime": "09:00",
  "totalMinutes": 60
}
Expected outputjson
{
  "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
      }
    ]
  }
}
Tip
The break consumes ten of the sixty minutes before the topics share what is left, and it never absorbs remainder.
  • 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

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.

Tags

generationmathproductivitymeetings