{"id":"local-interval-normalize","version":"1.0.0","description":"Normalize millisecond interval endpoint conventions into a canonical half-open interval.","supported_operations":["normalize interval endpoints","convert closed interval to half open","canonicalize millisecond interval","normalize inclusive end boundary","normalize exclusive start boundary","detect empty normalized interval"],"unsupported_operations":["generic date arithmetic","resolve a local time zone","continuous-number endpoint normalization"],"semantics":["Integer milliseconds form a discrete domain; ( adds one millisecond to start and ] adds one millisecond to end.","Output is always the half-open interval [start_ms,end_ms).","A normalized start after end is not_computable; equality is an empty interval.","Caller endpoint rules are versioned by caller_rule_version."],"limits":{"max_input_bytes":4096,"max_integer_chars":32},"pricing":{"status":"unpriced","charge_usd":null},"input_schema":{"type":"object","additionalProperties":false,"required":["start_ms","end_ms","endpoint_convention","caller_rule_version"],"properties":{"start_ms":{"type":"string","minLength":1,"maxLength":32,"pattern":"^-?(?:0|[1-9]\\d*)$"},"end_ms":{"type":"string","minLength":1,"maxLength":32,"pattern":"^-?(?:0|[1-9]\\d*)$"},"endpoint_convention":{"type":"string","enum":["[)","[]","()","(]"]},"caller_rule_version":{"type":"string","minLength":1,"maxLength":64}}},"output_schema":{"type":"object","additionalProperties":false,"required":["standard_version","data_version","caller_rule_version","start_ms","end_ms","endpoint_convention","empty"],"properties":{"standard_version":{"type":"string"},"data_version":{"type":"string"},"caller_rule_version":{"type":"string"},"start_ms":{"type":"string"},"end_ms":{"type":"string"},"endpoint_convention":{"type":"string","const":"[)"},"empty":{"type":"boolean"}}},"examples":[{"input":{"start_ms":"10","end_ms":"20","endpoint_convention":"[]","caller_rule_version":"r1"},"output":{"standard_version":"RFC9557/RFC3339/ISO8601-1:2019","data_version":"iana-tzdb-2025b-subset-nyc","caller_rule_version":"r1","start_ms":"10","end_ms":"21","empty":false,"endpoint_convention":"[)"}},{"input":{"start_ms":"5","end_ms":"5","endpoint_convention":"[)","caller_rule_version":"r2"},"output":{"standard_version":"RFC9557/RFC3339/ISO8601-1:2019","data_version":"iana-tzdb-2025b-subset-nyc","caller_rule_version":"r2","start_ms":"5","end_ms":"5","empty":true,"endpoint_convention":"[)"}}],"execute_url":"/v1/tools/local-interval-normalize/versions/1.0.0/execute"}