Implement the first public ASPL MVP

Archived MVP specification. For ASPL 0.7.0, see the current reference and native HTTP guide.

Status: ready-for-agent Source: Find the ASPL MVP specification and all resolved decision tickets linked from that map.

Problem Statement

Arabic-speaking systems programmers do not have an implementation of the specified ASPL MVP that they can evaluate in Arabic, use from a self-contained Linux tool, or try safely in a browser. The repository currently contains a closed planning map, primary research, decision prototypes, and detailed acceptance obligations, but no conforming compiler, VM, CLI, native packager, website, release archive, or conformance evidence.

The implementation must preserve one language across Arabic and English source vocabulary. It must also make the native and browser capability boundaries honest. In particular, the browser cannot load Linux shared libraries or execute ELF files, and the native C boundary supports only two exact function types. The project must not turn a finished specification into claims of implementation conformance or release readiness until the required evidence passes.

Solution

Build the ASPL 0.1.1 common, native, and browser profiles defined by the resolved map. The official implementation is a portable C11 compiler and register VM with required Linux APIs, distributed for baseline x86-64 Linux with glibc 2.34 or later as one aspl executable. The tool checks, runs, and builds one .aspl source file without starting a compiler, assembler, or linker. Native builds copy a validated PIE VM template and append canonical ASPL bytecode. Native execution may load compatible shared libraries through the two specified foreign adapter profiles.

Compile the same compiler core and VM ahead of time into one single-threaded WebAssembly module running in a dedicated worker. Put it behind an Arabic-default, bilingual website and browser-local playground with token-aware mixed-direction editing, explicit resource limits, stoppable execution, and no server-side source execution.

Ship the language, CLI, browser experience, documentation, installation path, conformance suite, and release evidence as one versioned product. Use the ASPL conformance manifest to trace every normative requirement to external evidence. Reserve the official release claim until the common and both host profiles, clean-system matrix, accessibility review, performance gates, reproducible build, and distribution checks all pass without waivers.

User Stories

  1. As an Arabic-speaking systems programmer, I want ASPL to use Arabic as its canonical vocabulary, so that I can read and write systems-oriented source in Arabic.
  2. As an English-speaking programmer, I want exact English keyword aliases, so that I can use the same language model without entering a separate dialect.
  3. As a bilingual programmer, I want Arabic and English aliases to mix per occurrence, so that vocabulary choice never changes program meaning.
  4. As a programmer sharing source with another user, I want source vocabulary preserved, so that interface language changes do not rewrite my program.
  5. As an Arabic keyboard user, I want Arabic-form digits converted to ASCII in executable source, so that ordinary numeric input works without changing strings or comments.
  6. As a programmer editing mixed-direction code, I want token-aware RTL and LTR display, so that punctuation, identifiers, numbers, and comments appear in a safe readable order.
  7. As a programmer inspecting suspicious source, I want invisible directional controls shown explicitly in diagnostics, so that they cannot silently reorder the meaning I see.
  8. As a programmer naming functions and bindings, I want strict Unicode and identifier rules, so that normalized and confusable names have predictable behavior.
  9. As a programmer, I want one statically typed language core, so that native and browser implementations agree on accepted programs.
  10. As a programmer, I want exact bool, i64, f64, string, and c_ptr value types, so that stored values have clear semantics.
  11. As a programmer, I want unit to mean that no value exists, so that no-result functions cannot leak placeholder values into ordinary code.
  12. As a programmer, I want initialized immutable bindings by default, so that mutation is explicit and uninitialized locals are impossible.
  13. As a programmer who needs loops, I want explicit mutable local bindings, so that I can update state without making every binding mutable.
  14. As a programmer, I want lexical scope without visible-name shadowing, so that every name use has one obvious target.
  15. As a programmer, I want typed top-level functions and source-order-independent resolution, so that direct recursion, mutual recursion, and later definitions work predictably.
  16. As a programmer, I want one reserved no-argument entry function returning i64, so that program startup and process status have one contract.
  17. As a programmer, I want process statuses outside 0 through 255 to trap, so that the runtime never silently truncates the entry result.
  18. As a programmer, I want operands and arguments evaluated left to right, so that side effects and traps occur deterministically.
  19. As a programmer, I want Boolean operators to short-circuit, so that excluded branches do not run.
  20. As a programmer doing integer work, I want checked i64 arithmetic, so that overflow and invalid division stop with named traps instead of invoking C undefined behavior.
  21. As a programmer doing floating-point work, I want defined IEEE 754 binary64 behavior, so that native and browser results agree on signed zero, infinities, rounding, and NaN.
  22. As a programmer converting numbers, I want explicit conversions, so that type changes and conversion traps are visible in source.
  23. As a programmer using text, I want immutable UTF-8 string literals with embedded NUL support, so that string values preserve their exact bytes.
  24. As a programmer, I want exact string equality, so that comparison does not depend on storage identity or hidden normalization.
  25. As a programmer interacting with C, I want opaque nullable pointers, so that ordinary ASPL code can relay a C object without pretending it can inspect or own it.
  26. As a programmer, I want اطبع and print to name one safe output builtin, so that both hosts can write exact string bytes without requiring C interoperability.
  27. As a programmer, I want the output builtin to add no newline or terminator, so that the bytes written are exactly the bytes I supplied.
  28. As a programmer, I want every foreign declaration and call marked unsafe at its own site, so that the C boundary remains visible wherever it is introduced or used.
  29. As a native ASPL programmer, I want to call int(const char *) functions through a named adapter, so that compatible functions such as puts have an exact supported contract.
  30. As a native ASPL programmer, I want to call double(double) functions through a named adapter, so that compatible functions such as sqrt have an exact supported contract.
  31. As a programmer passing an ASPL string to C, I want a call-scoped NUL-terminated copy, so that ASPL string storage and lifetime are not misrepresented as C string storage.
  32. As a programmer, I want unsupported C signatures rejected while checking, so that a dynamic symbol is never called through an approximate C type.
  33. As a programmer, I want missing foreign libraries and symbols detected before main, so that program side effects do not begin after partial native preparation.
  34. As a programmer, I want browser foreign imports rejected as a host-policy result, so that a valid language feature is not misreported as a syntax error.
  35. As a programmer, I want source findings to carry stable reason keys and typed arguments, so that wording changes do not change diagnostic identity.
  36. As an Arabic CLI user, I want Arabic diagnostics and help by default, so that the primary interface follows the product's Arabic-first commitment.
  37. As an English CLI user, I want an explicit English diagnostic option, so that I can select equivalent English wording without changing results.
  38. As a programmer, I want exact source spans and safe excerpts, so that I can locate failures in UTF-8 and mixed-direction source.
  39. As a programmer, I want compiler recovery to report independent errors without cascading noise, so that one mistake does not hide unrelated findings.
  40. As a programmer, I want traps, limits, load failures, cancellation, host failures, and internal failures kept separate, so that I can tell what stopped the program.
  41. As a programmer debugging a direct run, I want source-mapped trap locations and bounded call traces, so that runtime failures point back to responsible source.
  42. As a programmer running a generated native program, I want bytecode function and instruction locations when source maps are absent, so that failures still have a stable technical location.
  43. As a CLI user, I want aspl check to run the complete compilation and bytecode-validation path, so that success means later compiler stages also accepted the source.
  44. As a CLI user, I want aspl run to execute a validated program in process, so that there is no hidden child compiler or runner.
  45. As a CLI user, I want aspl build to create a standalone native program, so that the compiler and runtime need not remain installed beside it.
  46. As a CLI user, I want all workflows to accept exactly one .aspl file, so that the MVP does not imply a module or package system.
  47. As a CLI user, I want strict option parsing and stable failure statuses, so that scripts can detect usage and tool failures predictably.
  48. As a CLI user, I want successful check and build commands to be silent, so that automation receives output only when something needs attention.
  49. As a CLI user, I want program stdout left unprefixed and uncaptured during run, so that ASPL program output behaves like ordinary process output.
  50. As a builder, I want build output published atomically, so that a failed build cannot expose a partial executable or overwrite the previous good artifact.
  51. As a builder, I want deterministic native artifacts, so that identical release, source, and options produce identical bytes.
  52. As a builder, I want check and build to avoid opening declared shared libraries, so that compilation does not depend on the deployment machine's library set.
  53. As a user of a built ASPL program, I want the VM and bytecode embedded in one executable, so that no separately installed ASPL runtime is required.
  54. As a user of a built ASPL program, I want native loading to validate both the payload envelope and bytecode before execution, so that malformed artifacts fail before imports or main.
  55. As a browser visitor, I want a runnable Arabic example in the first viewport, so that I can evaluate the language before reading a long introduction or installing it.
  56. As a browser visitor, I want source checking and execution to stay on my device, so that my source is never uploaded to a runner.
  57. As a browser visitor, I want the interface to state that it runs bytecode only, so that I do not mistake the playground for Linux ELF or shared-library execution.
  58. As a playground user, I want automatic checking after a short pause, so that diagnostics update without running the program.
  59. As a playground user, I want every Run to perform a fresh complete check, so that execution never trusts stale validation.
  60. As a playground user, I want execution to use an immutable source snapshot, so that edits made during a run cannot alter the active program.
  61. As a playground user, I want stale results labeled as belonging to a previous snapshot, so that I do not confuse them with the current editor contents.
  62. As a playground user, I want Stop to terminate and replace the worker immediately, so that an infinite loop or stuck WebAssembly call cannot freeze the page.
  63. As a playground user, I want output shown as it is accepted, so that I can see progress before normal completion or a failure.
  64. As a playground user, I want partial output retained after Stop, a trap, or a limit, so that useful bytes are not erased when execution ends abnormally.
  65. As a playground user, I want non-printing output rendered visibly, so that control characters cannot reorder or hide surrounding interface content.
  66. As a playground user, I want explicit compile, execution, memory, recursion, instruction, time, and output ceilings, so that the evaluation environment stays responsive.
  67. As a playground user, I want examples in Arabic, English, and mixed vocabulary, so that I can compare equivalent notation in the same implementation.
  68. As a website visitor, I want one guided route through Try, Learn, Reference, C interoperability, and Install, so that I can move from evidence to exact contracts without dead ends.
  69. As a documentation reader, I want short lessons aimed at programmers who know basic C, so that the material does not spend the MVP on a beginner curriculum.
  70. As a documentation reader, I want every example labeled by supported host, so that I know whether it runs in the browser, native Linux, or both.
  71. As a documentation reader, I want exact accepted and rejected forms with named outcomes, so that reference pages are useful for implementation and debugging.
  72. As a reader switching locales, I want Arabic and English pages to have one-to-one counterparts, so that neither locale weakens or adds normative rules.
  73. As a reader switching locales, I want the current page, anchor, source example, run state, focus, and scroll position preserved, so that language switching does not reset my work.
  74. As a keyboard user, I want every website and playground action reachable with visible focus, so that mouse input is never required.
  75. As a screen-reader user, I want correct landmarks, announcements, reading order, and source locations in both locales, so that the product is operable with assistive technology.
  76. As a low-vision user, I want WCAG 2.2 AA contrast, zoom, reflow, and non-color status cues, so that the interface remains understandable under my display settings.
  77. As a privacy-conscious visitor, I want no analytics, remote fonts, source upload, server runner, or update check, so that trying ASPL causes only necessary same-origin static requests.
  78. As a Linux user, I want the supported x86-64 and glibc 2.34 floor stated before download, so that I can verify compatibility before spending time installing.
  79. As a Linux user, I want a single versioned release archive with SHA-256 verification, so that I can check archive integrity before extraction.
  80. As a Linux user, I want a user-owned installation under .local/bin, so that the default setup does not require administrator privileges.
  81. As a Linux user, I want exact upgrade, rollback, and uninstall instructions, so that I can control which immutable release is active.
  82. As a recipient, I want the complete MIT and Apache-2.0 license texts, so that I can choose either license with the archive in hand.
  83. As a performance-sensitive user, I want the complete small-program build to meet the documented warm-cache p95 budget, so that the fast-build claim measures the real command and publication path.
  84. As a contributor, I want one manifest linking every atomic requirement to evidence, so that implementation work cannot quietly omit a settled rule.
  85. As a contributor, I want tests to exercise public profile behavior first, so that refactoring C module boundaries does not invalidate correct tests.
  86. As a contributor, I want a narrow conformance driver for otherwise hidden facts, so that canonical bytecode, structured diagnostics, injected failures, and source maps remain testable without becoming public APIs.
  87. As a contributor, I want independent bytecode, ELF, archive, and website inspectors, so that production code does not certify its own output.
  88. As a contributor, I want deterministic failure injection, sanitizer runs, and fuzz targets, so that allocation, cleanup, parser, loader, and packager failures receive evidence.
  89. As a third-party implementer, I want common, native, and browser profiles stated separately, so that I can make a precise self-attested claim for the profiles I actually pass.
  90. As a release maintainer, I want evidence tied to one frozen candidate identity, so that changed inputs automatically invalidate stale results.
  91. As a release maintainer, I want byte-identical production builds from fresh directories, so that published native, browser, documentation, archive, and checksum bytes are reproducible.
  92. As a release maintainer, I want clean tests on RHEL 9, Ubuntu 22.04, and Debian 12 without build tools installed, so that the Linux distribution and self-contained build claims have direct evidence.
  93. As a release maintainer, I want witnessed Arabic-primary and screen-reader sessions, so that automated checks do not stand in for mixed-direction and assistive-technology review.
  94. As a release maintainer, I want immutable artifacts, evidence, old releases, and suite revisions, so that a published claim can still be audited later.
  95. As a project reader, I want limitations published in Arabic and English from the conformance manifest, so that unsupported features and narrow guarantees are not softened by marketing copy.
  96. As a project reader, I want specification completion kept separate from implementation and release completion, so that the resolved map is not mistaken for a shipped language.

Implementation Decisions

Product and profile boundaries

Source notation and Unicode

Language semantics

Diagnostics and outcomes

Compiler, VM, and bytecode contracts

C interoperability and native packaging

Linux CLI

Browser playground

Website and documentation

Distribution, performance, and release

Testing Decisions

Out of Scope

Further Notes