Packages

Secure BEAM sandbox runtime for LLM code mode and MCP aggregation. Run concurrent LLM/tool clients safely while agents orchestrate approved tools, call upstream MCP/OpenAPI servers, and transform data.

Current section

Files

Jump to
ptc_runner priv java_compat_audit.exs
Raw

priv/java_compat_audit.exs

%{
java_lang_boolean_audit: [
%{
name: "Boolean/parseBoolean",
status: :supported,
description: "Parse string to boolean",
notes:
"Fixed GAP-J02: matches java.lang.Boolean.parseBoolean; nil/null and every string other than case-insensitive \"true\" return false, while non-string, non-nil inputs raise."
},
%{
name: "Boolean/valueOf",
status: :candidate,
description: "Return Boolean value for a string or boolean",
notes: "Common LLM spelling; parse-boolean covers string parsing but not Java's object API."
},
%{
name: "Boolean/TRUE",
status: :candidate,
description: "Boolean true constant",
notes: "Low-cost compatibility constant if models emit Java constants."
},
%{
name: "Boolean/FALSE",
status: :candidate,
description: "Boolean false constant",
notes: "Low-cost compatibility constant if models emit Java constants."
},
%{
name: "booleanValue",
status: :not_relevant,
description: "Unbox a Boolean object",
notes: "PTC-Lisp has primitive booleans, not boxed Java Boolean objects."
}
],
java_lang_double_audit: [
%{
name: "Double/parseDouble",
status: :supported,
description: "Parse string to double",
notes:
"BUG GAP-J01: currently aliases parse-double, returns nil on invalid input, and rejects surrounding whitespace that Java accepts."
},
%{
name: "Double/POSITIVE_INFINITY",
status: :supported,
description: "Positive infinity constant",
notes: ""
},
%{
name: "Double/NEGATIVE_INFINITY",
status: :supported,
description: "Negative infinity constant",
notes: ""
},
%{name: "Double/NaN", status: :supported, description: "NaN constant", notes: ""},
%{
name: "Double/isNaN",
status: :candidate,
description: "Return true if value is NaN",
notes: "Common guard around parsed floating data."
},
%{
name: "Double/isInfinite",
status: :candidate,
description: "Return true if value is infinite",
notes: "Common guard around parsed floating data."
},
%{
name: "Double/valueOf",
status: :candidate,
description: "Parse or box a double value",
notes: "parse-double covers string parsing; boxing is not relevant."
},
%{
name: "doubleValue",
status: :not_relevant,
description: "Unbox a Double object",
notes: "PTC-Lisp has one numeric value model, not boxed Java numbers."
}
],
java_lang_float_audit: [
%{
name: "Float/parseFloat",
status: :supported,
description: "Parse string to float",
notes:
"BUG GAP-J01: currently aliases parse-double, returns nil on invalid input, and rejects surrounding whitespace that Java accepts. PTC-Lisp uses one floating type."
},
%{
name: "Float/isNaN",
status: :candidate,
description: "Return true if value is NaN",
notes: "Common guard around parsed floating data."
},
%{
name: "Float/isInfinite",
status: :candidate,
description: "Return true if value is infinite",
notes: "Common guard around parsed floating data."
},
%{
name: "Float/valueOf",
status: :candidate,
description: "Parse or box a float value",
notes: "parse-double covers string parsing; boxing is not relevant."
},
%{
name: "floatValue",
status: :not_relevant,
description: "Unbox a Float object",
notes: "PTC-Lisp has one floating type, not boxed Java numbers."
}
],
java_lang_integer_audit: [
%{
name: "Integer/parseInt",
status: :supported,
description: "Parse string to integer",
notes:
"BUG GAP-J01: currently aliases parse-long, returns nil on invalid input, and accepts values outside Java int range; Java raises NumberFormatException. BUG GAP-J15: radix overload is unsupported."
},
%{
name: "Integer/valueOf",
status: :candidate,
description: "Parse or box an integer value",
notes: "parse-long covers string parsing; boxing is not relevant."
},
%{
name: "Integer/toString",
status: :candidate,
description: "Convert integer to string",
notes: "str covers the common PTC-Lisp need."
},
%{
name: "Integer/MAX_VALUE",
status: :not_relevant,
description: "Maximum Java int constant",
notes: "BEAM integers are arbitrary precision; Java int bounds are misleading."
},
%{
name: "Integer/MIN_VALUE",
status: :not_relevant,
description: "Minimum Java int constant",
notes: "BEAM integers are arbitrary precision; Java int bounds are misleading."
}
],
java_lang_long_audit: [
%{
name: "Long/parseLong",
status: :supported,
description: "Parse string to integer",
notes:
"BUG GAP-J01: currently aliases parse-long, returns nil on invalid input, and accepts values outside Java long range; Java raises NumberFormatException. BUG GAP-J15: radix overload is unsupported."
},
%{
name: "Long/valueOf",
status: :candidate,
description: "Parse or box a long value",
notes: "parse-long covers string parsing; boxing is not relevant."
},
%{
name: "Long/toString",
status: :candidate,
description: "Convert long to string",
notes: "str covers the common PTC-Lisp need."
},
%{
name: "Long/MAX_VALUE",
status: :not_relevant,
description: "Maximum Java long constant",
notes: "BEAM integers are arbitrary precision; Java long bounds are misleading."
},
%{
name: "Long/MIN_VALUE",
status: :not_relevant,
description: "Minimum Java long constant",
notes: "BEAM integers are arbitrary precision; Java long bounds are misleading."
}
],
java_lang_string_audit: [
%{
name: ".contains",
status: :supported,
description: "Substring containment",
notes:
"DIV-40: character literals are accepted as arguments (PTC-Lisp has no Character type). DIV-41: character-literal receivers behave as one-character strings"
},
%{
name: ".indexOf",
status: :supported,
description: "First substring index",
notes:
"BUG GAP-J05: integer character-code overloads are unsupported. BUG GAP-J09: non-BMP offsets are grapheme-based instead of Java UTF-16 code-unit based. DIV-41: character-literal receivers behave as one-character strings (PTC-Lisp has no Character type)"
},
%{
name: ".lastIndexOf",
status: :supported,
description: "Last substring index",
notes:
"BUG GAP-J05: substring/from-index and integer character-code overloads are unsupported. BUG GAP-J09: non-BMP offsets are grapheme-based instead of Java UTF-16 code-unit based. DIV-41: character-literal receivers behave as one-character strings (PTC-Lisp has no Character type)"
},
%{
name: ".length",
status: :supported,
description: "String length",
notes:
"BUG GAP-J09: non-BMP length is grapheme-based instead of Java UTF-16 code-unit based. DIV-41: character-literal receivers behave as one-character strings (PTC-Lisp has no Character type)"
},
%{
name: ".substring",
status: :supported,
description: "Extract substring",
notes:
"BUG GAP-J09: non-BMP indexes are grapheme-based instead of Java UTF-16 code-unit based. DIV-41: character-literal receivers behave as one-character strings (PTC-Lisp has no Character type)"
},
%{
name: ".toLowerCase",
status: :supported,
description: "Lowercase string",
notes:
"DIV-41: character-literal receivers behave as one-character strings (PTC-Lisp has no Character type)"
},
%{
name: ".toUpperCase",
status: :supported,
description: "Uppercase string",
notes:
"DIV-41: character-literal receivers behave as one-character strings (PTC-Lisp has no Character type)"
},
%{
name: ".startsWith",
status: :supported,
description: "Prefix test",
notes:
"BUG GAP-J05: prefix/offset overload is unsupported. DIV-40: character literals are accepted as arguments (PTC-Lisp has no Character type). DIV-41: character-literal receivers behave as one-character strings"
},
%{
name: ".endsWith",
status: :supported,
description: "Suffix test",
notes:
"DIV-40: character literals are accepted as arguments (PTC-Lisp has no Character type). DIV-41: character-literal receivers behave as one-character strings"
},
%{
name: ".trim",
status: :candidate,
description: "Trim leading and trailing whitespace",
notes: "Common LLM spelling; clojure.string/trim is not currently implemented."
},
%{
name: ".isEmpty",
status: :candidate,
description: "Return true for empty string",
notes: "empty? covers the common PTC-Lisp need."
},
%{
name: ".equalsIgnoreCase",
status: :candidate,
description: "Case-insensitive string equality",
notes: "Common Java idiom in generated code."
},
%{
name: ".charAt",
status: :candidate,
description: "Return character at index",
notes: "Potentially useful, but PTC-Lisp must define grapheme semantics."
},
%{
name: ".getBytes",
status: :not_relevant,
description: "Encode string to bytes",
notes: "Byte arrays and charsets are outside the sandbox data model."
},
%{
name: ".intern",
status: :not_relevant,
description: "Intern a Java string",
notes: "JVM string pool operation; not meaningful on BEAM."
}
],
java_lang_system_audit: [
%{
name: "System/currentTimeMillis",
status: :supported,
description: "Current Unix time in milliseconds",
notes: ""
},
%{
name: "System/nanoTime",
status: :candidate,
description: "Monotonic time source",
notes: "Potential benchmark/timing helper; not wall-clock time."
},
%{
name: "System/getenv",
status: :not_relevant,
description: "Read process environment variables",
notes: "Host environment access is intentionally not exposed."
},
%{
name: "System/getProperty",
status: :not_relevant,
description: "Read JVM system properties",
notes: "JVM property access is not meaningful and would leak host details."
},
%{
name: "System/exit",
status: :not_relevant,
description: "Terminate the JVM",
notes: "Process termination is forbidden in the sandbox."
}
],
java_time_local_date_audit: [
%{
name: "LocalDate/parse",
status: :supported,
description: "Parse ISO-8601 date string",
notes:
"Also available as java.time.LocalDate/parse and parse. BUG GAP-J06: date-time strings are accepted instead of rejected."
},
%{
name: "LocalDate/now",
status: :candidate,
description: "Current date",
notes: "Useful, but currentTimeMillis plus parse/Date constructors cover many cases."
},
%{
name: ".isBefore",
status: :supported,
description: "Date ordering predicate",
notes: "Works for same-type Date or DateTime values."
},
%{
name: ".isAfter",
status: :supported,
description: "Date ordering predicate",
notes: "Works for same-type Date or DateTime values."
},
%{
name: "LocalDate/of",
status: :candidate,
description: "Construct date from year/month/day",
notes: "Useful Java idiom; vector/map construction plus parse is the current workaround."
},
%{
name: ".format",
status: :candidate,
description: "Format date with a formatter",
notes: "Date formatting API would need a bounded formatter surface."
},
%{
name: ".toEpochDay",
status: :supported,
description: "Return LocalDate epoch-day integer",
notes: "Requested in issue #1019 for day differences and date sorting."
},
%{
name: ".plusDays",
status: :supported,
description: "Add days to a LocalDate",
notes:
"Requested in issue #1019 for date arithmetic. BUG GAP-J12: floating and NaN day counts are rejected instead of following Clojure Java interop coercion."
},
%{
name: ".minusDays",
status: :supported,
description: "Subtract days from a LocalDate",
notes:
"Requested in issue #1019 for date arithmetic. BUG GAP-J12: floating and NaN day counts are rejected instead of following Clojure Java interop coercion."
}
],
java_time_instant_audit: [
%{
name: "Instant/parse",
status: :supported,
description: "Parse ISO-8601 instant string",
notes:
"Also available as java.time.Instant/parse and parse. BUG GAP-J06: date-only and no-zone date-time strings are accepted instead of rejected."
},
%{
name: "Instant/now",
status: :candidate,
description: "Current instant",
notes: "System/currentTimeMillis plus java.util.Date. covers many cases."
},
%{
name: ".isBefore",
status: :supported,
description: "Instant ordering predicate",
notes: "Works for same-type Date or DateTime values."
},
%{
name: ".isAfter",
status: :supported,
description: "Instant ordering predicate",
notes: "Works for same-type Date or DateTime values."
},
%{
name: ".getTime",
status: :supported,
description: "Unix timestamp in milliseconds",
notes:
"BUG GAP-J04: Java Instant has toEpochMilli, not getTime; current behavior is a PTC convenience."
},
%{
name: ".toEpochMilli",
status: :candidate,
description: "Return Instant epoch millisecond",
notes: "BUG GAP-J18: Java Instant.toEpochMilli is unsupported while .getTime is exposed."
},
%{
name: "Instant/ofEpochMilli",
status: :candidate,
description: "Construct instant from epoch milliseconds",
notes: "java.util.Date. already accepts seconds or milliseconds."
}
],
java_time_duration_audit: [
%{
name: "Duration/between",
status: :supported,
description: "Duration between two instants",
notes:
"Requested in issue #1019 for millisecond/day differences. BUG GAP-J19: java.util.Date inputs are accepted instead of rejected."
},
%{
name: ".toMillis",
status: :supported,
description: "Return duration length in milliseconds",
notes: "Requested in issue #1019 for instant differences."
},
%{
name: ".toDays",
status: :supported,
description: "Return duration length in whole days",
notes: "Requested in issue #1019 for bucket/day calculations."
},
%{
name: "Duration/ofMillis",
status: :candidate,
description: "Construct duration from milliseconds",
notes: "Useful companion for bounded Duration support."
},
%{
name: "Duration/parse",
status: :candidate,
description: "Parse ISO-8601 duration string",
notes: "Useful but lower-priority than between/toMillis/toDays."
}
],
java_time_period_audit: [
%{
name: "Period/between",
status: :candidate,
description: "Period between two dates",
notes:
"Deferred for issue #1019; `Period.getDays` is a component value, not total days. Use `.toEpochDay` subtraction for LocalDate day differences."
},
%{
name: ".getDays",
status: :candidate,
description: "Return day component of a Period",
notes:
"Deferred for issue #1019 because this is the day component, not total days; easy to misuse for analytics."
},
%{
name: "Period/ofDays",
status: :candidate,
description: "Construct period from days",
notes: "Useful companion for bounded Period support."
},
%{
name: "Period/parse",
status: :candidate,
description: "Parse ISO-8601 period string",
notes: "Useful but lower-priority than between/getDays."
}
],
java_util_date_audit: [
%{
name: "java.util.Date.",
status: :supported,
description: "Construct DateTime value",
notes:
"BUG GAP-J03: numeric constructor currently treats milliseconds as seconds. BUG GAP-J06: ISO date strings are accepted by PTC-Lisp but rejected by the Java oracle. BUG GAP-J11: Java-accepted legacy date strings are rejected."
},
%{
name: ".getTime",
status: :supported,
description: "Unix timestamp in milliseconds",
notes: "Works on DateTime values."
},
%{
name: ".isBefore",
status: :supported,
description: "Date ordering predicate",
notes:
"BUG GAP-J20: java.util.Date uses .before, not .isBefore; current behavior exposes a non-Java alias."
},
%{
name: ".isAfter",
status: :supported,
description: "Date ordering predicate",
notes:
"BUG GAP-J20: java.util.Date uses .after, not .isAfter; current behavior exposes a non-Java alias."
},
%{
name: ".before",
status: :candidate,
description: "Date ordering predicate",
notes: ".isBefore covers the current PTC-Lisp spelling."
},
%{
name: ".after",
status: :candidate,
description: "Date ordering predicate",
notes: ".isAfter covers the current PTC-Lisp spelling."
},
%{
name: ".setTime",
status: :not_relevant,
description: "Mutate Date timestamp",
notes: "Mutable Java object operations are outside the sandbox model."
}
]
}