25 KiB
Claro v1.18.26 Current Status
This file is the beginner-safe status map for the current package. It separates what is ready to use from what is historical, experimental, or still planned.
How to read the status labels
- Stable foundation: good enough for normal examples and beginner learning.
- Foundation present: usable, but still missing important polish or coverage.
- Experimental/planned: do not rely on it in beginner lessons yet.
- Historical: kept for release history, not current instructions.
Security and correctness review progress
The v1.18.26 review identified missing-argument reads in standard-library built-ins. The current runtime now validates required argument counts centrally before any builtin indexes args[]. Covered calls include math.abs, math.clamp, random.seed, random.int, text helpers, CSV helpers, path helpers, and collection helpers. Missing arguments produce a beginner-facing needs N arguments runtime error.
Focused regression coverage: tests/38_builtin_arity.claro and tests/39_random_inverted_range.claro.
The runtime now rejects inverted random.int ranges before modulo arithmetic with: random.int needs the lower bound to be less than or equal to the upper bound. This prevents invalid ranges from producing incorrect values or a divide-by-zero signal.
Verified in this checkout on 2026-09-22:
gcc -std=c99 -O0 -g -fsanitize=address,undefined src/claro.c -o /tmp/claro-h2-asan -lmplusASAN_OPTIONS=detect_leaks=0 /tmp/claro-h2-asan tests/39_random_inverted_range.claro: expected diagnostic; no AddressSanitizer or UndefinedBehaviorSanitizer report../claro test:PASS: 0 failure(s)../claro doctor: all checksOK../claro validate: validation passed.
This slice does not yet fix recursion depth, memory cleanup, LASTEXIT, HTTP buffering/status handling, or other review findings. Claro remains a trusted-script interpreter, not a sandbox.
Feature matrix
Beginner scripting core
Status: Stable foundation
Ready now:
- variables with
SET - output with
SAY - input with
ASK - choices with
IF/ELSE/END - loops
- lists and maps
- files, JSON, text helpers, and tested path/collection library helpers
- friendly checking with
claro check
Good starting docs:
QUICK_START.mdFIRST_HOUR.mdCLI.mdSPEC.md
Functions
Status: Stable foundation
Ready now:
- simple modern form:
TEACH name arg...END - compatibility form:
TEACH name TAKES arg...LEARNED - calls with
DOor olderCALL ... WITH
Good starting docs:
SIMPLE_FUNCTIONS.mdREADME.md
Static type safety
Status: Foundation present
Ready now:
- typed variables such as
SET score NUMBER 10 TYPE OFandCHECK TYPECHECK TYPEgives a direct repair hint when the learner forgets theISkeyword, for exampleCHECK TYPE scorereportsCHECK TYPE needs IS. Try: CHECK TYPE score IS NUMBER.CHECK TYPEgives a direct repair hint whenIShas no expected type, for exampleCHECK TYPE score ISreportsCHECK TYPE score needs a type after IS. Try: CHECK TYPE score IS NUMBER.CHECK TYPEexplains when the learner leaves out the expression as well, for example bareCHECK TYPEreportsCHECK TYPE needs an expression, IS, and a type. Try: CHECK TYPE score IS NUMBER.- typed function and method returns reject simple extra tokens after a return value with a direct repair hint, such as
RETURN amount extrareportingKeep only one expression after RETURN.This is covered for modern functions and both modern and compatibility object methods. CHECK TYPEexplains whenISis present but the expression is missing, for exampleCHECK TYPE IS NUMBERreportsCHECK TYPE needs an expression before IS. Try: CHECK TYPE score IS NUMBER.CHECK TYPErejects extra words after a valid expected type with a direct repair hint, soCHECK TYPE score IS NUMBER TEXTexplains that only one type belongs in the checkCHECK TYPErejects unknown expected type names with a beginner-facing list of supported types- typed function return diagnostics also identify an unknown return expression in compatibility
TAKES/LEARNEDfunctions, matching the modern function and object-method guidance TYPE OFreports a direct repair hint when the learner forgetsAS, for exampleTYPE OF scoresuggestsTYPE OF score AS kind- bare
TYPE OFreports that the expression,AS, and result name are all required, with a complete repair example TYPE OFreports a direct repair hint when the learner forgets the expression beforeAS, for exampleTYPE OF AS kindreportsTYPE OF needs an expression before AS. Try: TYPE OF score AS kind.TYPE OFprioritizes the missing expression diagnostic even when extra words follow the incomplete form, soTYPE OF AS kind extrastill points the learner to the missing expression first.TYPE OFreports a direct repair hint when the learner forgets the result name afterAS, for exampleTYPE OF score ASreportsTYPE OF needs a result name after AS. Try: TYPE OF score AS kind.- A valid
TYPE OF score AS kindstatement has a focused positive typecheck fixture, so the complete form is protected from diagnostic-only regression coverage. TYPE OFremains case-insensitive like other Claro keywords, with focused positive coverage for lowercasetype of score as kindsyntax.CHECK TYPEremains case-insensitive like other Claro keywords, with focused positive coverage for lowercasecheck type score is numbersyntax.- Object declarations and field checks remain case-insensitive like other Claro keywords, with focused positive coverage for lowercase
class,has,end,new,set, andcheck typein one typed object-field example. TYPE OFrejects extra words after its result name with a direct repair hint, soTYPE OF score AS kind extraexplains that only one result name belongs there; typedTEACH ... RETURNS TYPEdeclarations likewise reject extra words after the return type with a direct repair hint- typed
TEACH ... RETURNSdeclarations reject a missing return type with a direct repair hint, such asFunction greet needs a return type after RETURNS. Add a type such as NUMBER.The same diagnostic names the complete class and method, including compatibilityTAKES/LEARNEDmethods:Method Player.score needs a return type after RETURNS. Add a type such as NUMBER. - typed list/map checks through
claro typecheck, including a nestedLIST OF MAPinsertion example - compatibility
TAKES/LEARNEDfunctions also have focused positive numeric-addition, subtraction, division, and multiplication return fixtures, keeping arithmetic return coverage aligned with modern functions and compatibility methods. - compatibility
TAKES/LEARNEDfunctions have positive complete-branch return coverage beside the incomplete-branch diagnostic, so older conditional examples are checked for both accepted and rejected paths. - a narrow function/method argument check:
CHECK TYPE parameter IS TYPEinside a function or simple object method letsclaro typecheckaccept correct checked calls, catch mismatchedDO,CALL ... WITH,DO object.method ..., and compatibilityCALL ... WITHarguments, including checked methods that appear after another method in the same class, report missing checked function and method arguments, report missing unchecked arguments for simple functions and simple object methods in both modernDOand compatibilityCALL ... WITHforms, treat empty compatibility calls such asCALL greet WITHandCALL player.rename WITHas missing-argument mistakes, catch extra arguments to simple functions and checked methods even when the checked method appears after another method in the same class, catch modernDOand compatibilityCALL ... WITHcalls to undeclared simple functions, explain whenDO object.method ...or compatibilityCALL ...happens before the object is created withNEWeven if the method name is also wrong, and catch modern plus compatibility calls to undeclared object methods with a class-specificTEACHhint - simple function and object-method return checks with
TEACH name ... RETURNS TYPEnow include a compatibilityTAKES/LEARNEDfunction whose conditional returns are incomplete, preserving the same every-path diagnostic as modern functions. - function and method declarations now reject repeated parameter names with a direct repair hint before calls are checked, including modern and compatibility
TAKES/LEARNEDfunctions and methods; object methods with the same name are also rejected within a class with a rename hint in both modern and compatibility method syntax - top-level function declarations now reject repeated names with a direct repair hint, so two
TEACH greetblocks cannot silently compete for one callable function; a missing function name afterTEACHgets a direct beginner-facing repair hint, and a missing method name insideCLASSnames the class and gives a method example - class declarations now reject a missing class name after
CLASSwith a direct beginner-facing repair hint - class declarations now reject repeated field names within the same class with a direct repair hint before field types are used, so two
HAS score ...lines cannot silently choose conflicting metadata; different classes may independently use the same field name - class field declarations now reject missing names such as bare
HAS, missing types such asHAS score, unknown types such asHAS score BANANA, and extra tokens such asHAS score NUMBER TEXTwith the field name, class name, supported type examples, and a repair hint before object-field checks use that metadata - class declarations now reject repeated class names with a direct repair hint, so two
CLASS Playerblocks cannot silently compete for the same name; extra words after a class name also get a direct repair hint instead of becoming part of the class identity - object creation now rejects repeated object names with a direct repair hint, so two
NEW Player playerstatements cannot silently replace one another during type checking; when a script declares at least one class, a misspelledNEWclass name gets a direct declaration hint without changing the older permissive no-class form; a missing class name or object name gets a direct example repair; extra words after the object name get a direct repair hint instead of being silently ignored - a narrow object-field assignment/check-type check for simple
NEW Class objectplus directSET object.field valueandCHECK TYPE object.field IS TYPEcases when the class declaresHAS field TYPE; validation now covers correct NUMBER, TEXT, and YESNO direct assignments, dedicated positive and explicitly typed NUMBER/TEXT field assignments, missing values in untyped direct field assignments with a repair hint, explicitly typed method-body assignments to undeclared fields with aHAS field TYPErepair hint in modern and compatibility method syntax, dedicated positive NUMBER/TEXT/YESNOCHECK TYPEmetadata fixtures, simple and chained object aliases for both field assignments andCHECK TYPEmetadata (including a chained TEXT-field check), aliased object-method calls including chained aliases in modernDOand compatibilityCALL ... WITHforms (with a dedicated positive modernDOchained-alias fixture), field-to-field, compound arithmetic field expressions, and arithmetic/text expression result types, negative NUMBER/TEXT/YESNO fieldCHECK TYPEmetadata mismatches, NUMBER/TEXT/YESNO-expectation unknown-fieldCHECK TYPEdiagnostics, missing-object field assignment andCHECK TYPEdiagnostics, NUMBER/TEXT/YESNO wrong-type diagnostics, field collection when aHASfield appears after a simple method, NUMBER/TEXT/YESNO-valued unknown-field diagnostics for direct assignments to undeclared fields including explicitly typed assignments, numeric and text results from simple arithmetic/text expressions in object-field assignments, plus method-body field assignment andCHECK TYPEdiagnostics for NUMBER, TEXT, and YESNO fields in modern and compatibility syntax, including compatibility YESNOCHECK TYPEmetadata coverage, direct method assignments to undeclared fields now produce a beginner-facing missing-field diagnostic when the assigned expression has a known type, and a plain beginner-facing unknown-field diagnostic when the assigned expression is not inferable yet in both modern and compatibility method syntax; method-bodyCHECK TYPEnow reports an unknown field with a repair hint in both method syntaxes, including compatibilityTAKES/LEARNEDmethods; explicitly typed assignments to declared method fields now validate the class-declared field type instead of trusting only the inline type annotation, so a wrong value such asSET score TEXT \"oops\"reports the method and field in the diagnostic. - inline method-field annotations are checked against the class
HASdeclaration in modern and compatibility methods; conflicting known types and unknown annotation names produce field-specific repair guidance, with positive and negative focused fixtures for both syntaxes. - direct object-field
AS ... TOassignments reject extra words after the value with a repair hint, soSET player.score AS NUMBER TO 10 extracannot silently ignore the trailing text; they explain whenTOis missing after the type and when the value is missing afterTO; short explicitly typed assignments such asSET player.score NUMBER 10 extrareceive the same repair-oriented check and explain when the value is missing after the type - Direct object-field validation also has positive coverage for explicit
NUMBER,TEXT, andYESNOannotations, such asSET player.ready YESNO YES, plus the compatibility-shapedAS ... TOform such asSET player.score AS NUMBER TO 10, while the shorter unannotated form remains supported; method-body field assignments have matching positive coverage for both modern and compatibilityTEACHforms usingSET score AS NUMBER TO 10, and those twoAS ... TOmethod fixtures are now included inclaro validate; conflicting annotations such asSET player.score TEXT "oops"explain the class-declared type and how to repair it, and unknown annotations such asSET player.score AS BANANA TO 10orSET player.score BANANA 10identify the invalid type and suggest the declared field type.
Still needed:
- Keep the focused typecheck validator's fixture list complete as new positive and negative examples are added.
claro validatenow executes the complete focused fixture matrix as well, so release validation cannot silently omit a listed typecheck example. Short explicitly typed field assignments inside modern and compatibility methods also have focused coverage:SET score NUMBERexplains that one value expression is required after the type, matching direct object-field assignment guidance. - The expression checker now carries a known TEXT operand through all arithmetic operators so object-field and typed-function-return diagnostics do not hide addition, subtraction, multiplication, or division mistakes; focused numeric-subtraction, numeric-division, and numeric-multiplication positives plus text-operand addition, subtraction, multiplication, and division negatives protect this behavior. Typed-function return diagnostics now have focused subtraction and division positives alongside multiplication coverage. Text concatenation into a TEXT field has focused positive fixtures for both operand orders, including concatenation of two TEXT object fields. Each numeric operator names the text operand and explains that it needs NUMBER values.
- Method return validation now has focused positive subtraction and division fixtures alongside the existing arithmetic return coverage, including compatibility
TAKES/LEARNEDsubtraction and division cases, so checked NUMBER method parameters and numeric subtraction or division remain accepted by the release validator in both method spellings. - Modern and compatibility
TAKES/LEARNEDmethods have positive NUMBER, TEXT, and YESNO field-assignment coverage, and modern plus compatibility method-bodyCHECK TYPEmetadata now have positive YESNO coverage beside the wrong-value diagnostics. - Modern method-body TEXT concatenation has positive coverage in both operand orders, such as
SET first first + "!"andSET last "Dr. " + last. - Compatibility method-body TEXT concatenation has matching positive coverage in both operand orders, so
TAKES/LEARNEDmethods keep the same beginner-safe field update behavior. - richer typed function signatures and return values beyond the focused simple function/method
RETURNS TYPEcheck - type checking through branches and loops
- richer object field type checking beyond simple direct assignments
- typed imports/modules
Good starting docs:
ADVANCED_STATIC_TYPING.mdV1_14_STATIC_TYPES.md(feature history plus examples)
Objects and classes
Status: Foundation present
Ready now:
CLASS- typed
HASfields NEW- field access such as
player.score - simple methods, including static diagnostics for checked method parameters
- direct object-field assignments with a narrow static diagnostic for wrong value types
- object helper commands
Still needed:
- broader object field type checking across aliases, methods, and more complex object flows
- constructor/default-value polish
- clearer object debugging and teaching examples
Good starting docs:
V1_15_OBJECTS_CLASSES.mdREADME.md
Package and project workflow
Status: Foundation present
Ready now:
claro newclaro package initclaro package add/list/remove/doctor/lock- local project files such as
claro.project,claro.lock, andpackages/ - starter projects from
claro newnow use the same manifest-version and lock-version headers asclaro package init - the default
maketarget builds bothclaroandclaro.exe, so cross-platform release validators exercise freshly built executables - project-name safety checks for
claro new, so unsafe names such as../badare rejected before Claro creates folders - package-name safety checks when adding packages, including the 64-character package-name limit, when
claro package doctoraudits an existingclaro.project, whenclaro package lockwrites lockfile data, whenclaro package listshows existing packages, whenclaro package initsees unsafe names already present inclaro.project, whenclaro package addsees unsafe names already present inclaro.project, whenclaro package removerefreshes the lockfile after an edit, when learners need to remove an unsafe package entry that is already present, whenclaro package doctorverifies lockfile checksums for listed packages, and whenclaro package doctorrejects lockfile package entries that are not listed inclaro.project claro package doctorrejects a listed package manifest whosename:does not match the package name inclaro.projectclaro package doctorcompares the complete manifestname:value, so a prefix such asmath-tools-extracannot be accepted for packagemath-toolsclaro package doctorrequires exactly one complete supported packagemanifest-version: 1field; missing, blank, unsupported, or duplicate format fields get aBAD package manifest versiondiagnostic with the file path and a repair hint, rather than calling an existing file missingclaro package doctorcompares the complete manifestchecksum:value, so a valid checksum followed by extra text is rejectedclaro package doctorrequires the complete supportedmanifest-version: 1value inclaro.project, so a prefix such asmanifest-version: 10is rejectedclaro package doctorrequires the complete supportedversion: 1value in each local package manifest, so a prefix such asversion: 10is rejectedclaro package doctorrequires exactly one currentversion: v1.18.26line inclaro.lock, so stale, missing, blank, or duplicate lockfile release versions are rejectedclaro package doctorrequires the complete supportedsource: localvalue in each local package manifest, so a prefix such assource: local-extrais rejected- package project entries must be unique;
claro package doctor,list,add,init, andlockreject duplicate names instead of generating ambiguous package or lockfile data - lockfile package entries must also be unique;
claro package doctorreports duplicate lock entries instead of accepting ambiguous package/checksum data - package manifest
name:entries must also be unique;claro package doctorreportsBAD package manifest nameinstead of accepting ambiguous package identity data - package manifest
checksum:entries must also be unique;claro package doctorreportsBAD package checksuminstead of accepting ambiguous integrity data - package manifest
version:entries must also be unique and must contain exactly1;claro package doctorreportsBAD package versioninstead of accepting ambiguous package metadata - project manifests must contain exactly one
manifest-version: 1field; duplicate or prefix-matching values are rejected withBAD project manifest version: expected 1 - project manifests must contain exactly one non-empty
name:field;claro package doctorreportsBAD project manifest name: expected a non-empty namewhen the project identity is missing or blank
Still needed:
- install from local path
- package version constraints
- publish/export format
- remote registry protocol
- checksum/signature verification before downloads
Good starting docs:
V1_16_PACKAGES_PROJECTS.mdPACKAGE_REGISTRY.md
Networking
Status: Foundation present
Ready now:
- beginner HTTP commands
- offline
claro://URLs for tests and lessons LASTHTTP- real
http://andhttps://throughcurlwhen available
Still needed:
- web server syntax
- routes
- request/response helpers
- localhost-safe server mode
Good starting docs:
V1_17_NETWORKING.mdWEB_SERVER_PLAN.md
Concurrency and tasks
Status: Foundation present
Ready now:
- deterministic task/concurrency helpers where documented
- beginner-safe direction toward cooperative tasks
Still needed:
- full cooperative scheduler semantics
- cancellation
- timeouts
- message passing
- decision on whether native threads should ever be exposed
Good starting docs:
CONCURRENCY.md
IDE/editor support
Status: Foundation present
Ready now:
claro ide- metadata JSON
- completion list, including the current typed-language keywords
RETURNS,CHECK, andTYPE - diagnostics helper
- Forgejo/Gitea CI coverage for the current release validation gates (
claro validate, typecheck diagnostics validation, version convention validation, package security validation, compiler warning validation, and the CI workflow coverage check); the compiler warning validator rebuildssrc/claro.cand rejects path-truncation warnings, while the workflow validator verifies these commands, including its own command, occur in executablerunsteps rather than comments
Still needed:
- syntax highlighting package
- editor extension
- hover help
- go-to-definition
- code actions/fixes
- full LSP server if/when useful
Good starting docs:
IDE.mdEDITOR_EXTENSION_PLAN.md
Graphics and SDL
Status: Experimental/planned
Ready now:
- placeholder/planned graphics documentation
- experimental examples may exist for future SDL work
Not ready in the stable executable:
- real SDL window/drawing support
- beginner game lessons that run everywhere
Good starting docs:
GRAPHICS.mdSDL12.md
Historical docs
Files named RC*_NOTES.md, RC*_VALIDATION.md, older V1_*_VALIDATION.md, and older release notes are kept for project history. They may mention old version numbers, old planned milestones, or old validation scripts. Use them to understand how Claro evolved; do not treat them as the current beginner path.
Which docs should a new learner trust first?
For the current v1.18.26 package, read docs in this order:
QUICK_START.md,FIRST_HOUR.md, andlessons/README.mdfor first programs.README.mdand this file for the current feature map.ROADMAP.mdfor the next v1 work.
Use feature docs with these expectations:
- Ready for beginner lessons:
SPEC.md,SIMPLE_FUNCTIONS.md,ERRORS.md,LINTER.md,TESTING.md,FORMATTER.md. - Foundation present:
ADVANCED_STATIC_TYPING.md,V1_14_STATIC_TYPES.md,V1_15_OBJECTS_CLASSES.md,V1_16_PACKAGES_PROJECTS.md,V1_17_NETWORKING.md,CONCURRENCY.md,IDE.md. - Plans or experiments:
PACKAGE_REGISTRY.md,WEB_SERVER_PLAN.md,EDITOR_EXTENSION_PLAN.md,GRAPHICS.md,SDL12.md,COMPLETE_PLATFORM_ROADMAP.md,FUTURE_FEATURES_ROADMAP.md.
If a doc sounds more ambitious than this status map, treat this file as the current source of truth and update the older doc before teaching from it.