aboutsummaryrefslogtreecommitdiff
path: root/TASKLIST.md
diff options
context:
space:
mode:
authorGravatar zinc <zinc@downsta.ir> 2026-10-14 09:28:59 +0000
committerGravatar zinc <zinc@downsta.ir> 2026-10-14 09:29:04 +0000
commitf13f84044be1bd18160f4845a739592219638862 (patch)
treede51ba649bf1f32adc64b890d5b8bb882b12a718 /TASKLIST.md
parenttodo: record the reverted unchecked trial and what it showed (diff)
docs: remove temporary notes and fix onboarding drift
- delete TASKLIST.md and docs/design/handoff.md; the handoff content lives in README.md - move docs/BOOTSTRAP-OWNERSHIP.md to docs/history/ and index it in docs/history/README.md - point ONBOARD.md, docs/BORROW.md and the ticked TODO.md item at the new path - ONBOARD.md section 9 no longer mentions TASKLIST.md - ONBOARD.md section 3 and 4 markers are now `// ...` (line comments lost their colon) verified from a clean build: make clean, make (fixpoint 376903 words), the section 0-7 commands (section 4 after the marker fix), and the rejection suites. make check was started but did not complete (stopped before it finished).
Diffstat (limited to 'TASKLIST.md')
-rw-r--r--TASKLIST.md1203
1 files changed, 0 insertions, 1203 deletions
diff --git a/TASKLIST.md b/TASKLIST.md
deleted file mode 100644
index 8d081d9..0000000
--- a/TASKLIST.md
+++ /dev/null
@@ -1,1203 +0,0 @@
-# TASKLIST — "Review and polish project code"
-
-Complete inventory of every request made by the user in codex session
-`01a12a7c-8c55-7873-a0ae-da32c723ce8c` (2026-10-11 → 2026-10-14, workspace
-`~/Documents/Playground/tinyvm`).
-
-Each item gives **the request in summary** followed by **the user's exact
-message, verbatim** in a blockquote. Section 14 holds the complete raw
-transcript with nothing removed.
-
----
-
-## Follow-up: found after that session
-
-Not part of the session transcript. These came out of the `src/` and history
-cleanup that followed, and they are now blocking work.
-
-### `make` cannot bootstrap from a clean checkout
-
-**Written up in [`docs/BOOTSTRAP-OWNERSHIP.md`](docs/BOOTSTRAP-OWNERSHIP.md)**,
-linked from `docs/BORROW.md`, with a TODO entry. Reproduce with
-`bash src/tools/bootstrap-check.sh`.
-
-The second bootstrap stage runs the lifetime checker over the compiler's own
-source and reports 8 errors, so `bin/mkgenome` reads the diagnostics as if they
-were an image:
-
-```
-mkgenome: input is not a genome for this map
-```
-
-Two ownership completeness limits are responsible:
-
-1. **No move between two locals.** Every accepted move originates at a call
- (`m*rt.new(...)`, `m*inc_open(...)`, `chk_resize(...)`). An owned value held
- in a local can be disposed with `d*`, but cannot be handed to another local,
- and cannot replace one. The documented `rt.free(buffer); buffer =
- replacement;` rule only fires when the replacement comes from a call.
-2. **A local cannot be lent to a global.** Redirecting the output stream at a
- scratch buffer is a borrow, but every spelling is a transfer, so the buffer
- must live at module scope — which costs reentrancy safety.
-
-Neither limit accepts an unsafe program; both refuse correct ones. So it is a
-completeness gap, not a soundness bug. A verified partial fix (promoting the
-scratch buffer to a module global, the existing `sgb` idiom) removes 5 of the
-8 errors.
-
-Also found along the way: `lookup_raw` compared against `K_VAR`, a constant that
-was never declared, so `make genome` could not run at all before that.
-
----
-
-## 0. Standing instructions (apply to everything)
-
-### Commands must be single-line
-
-> When writing commands for the user, never write them as multi-line (with
-> backslashes)
-
-(from `AGENTS.md` injected into the session)
-
-### Delegate mechanical work to subagents
-
-> if you require busywork that you consider repetitive, easy to complete, but not
-> suitable for a bash run, use a 6-luna subagent to do so.
-
-### Small test intervals, not the full suite
-
-> also, please run tests in small intervals. don't run the full suite repeatedly
-> as it takes a good couple minutes
-
-### Don't stop until done
-
-> don't stop until the todo list is done.
-
-> continue and don't stop
-
-(repeatedly set and re-set as the session goal)
-
-### Keep `TODO.md` current
-
-> write your tasks to a TODO.md file
-
-> make sure to add these to the todo file.
-
-> add these to tasks and todo.md:
-
-> don't forget to tick off tasks that you complete in TODO.md.
-
-> don't forget to update the todo.md.
-
-> re-order the todo file based on the order of tasks that you'll complete.
-
-> did you update todo?
-
-> ummm... if it's updated, why are there still headers... and, why aren't the
-> crossed off tasks all at the start, since they've been implemented already? do
-> you understand how sorting works?
-
-> add these to todo.md
-
-> update todo.md
-
-> also, add a hint for when a function argument is never used in the body. add to
-> todo.md
-
-> also add a --help to the compiler, lsp, etc. put in todo
-
-### Comment and doc style
-
-> the comments and docs shouldnt have uppercase :( follow the writing style of the
-> older comments
-
-> keep the lowercase, just remove the informal ai slop and replace it with
-> professional compiler docs and guidance prose
-
----
-
-## 1. Code review, bugs, and polish
-
-### Read the code first
-
-> read the code and familiarize yourself.
-
-### Find bugs and optimizations
-
-> - find bugs and areas for optimizations.
-
-### Clean up phrasing and dirty references
-
-> - clean up the phrasing, there are leftover dirty references such as "task X"
-> in the documentation and code.
-
-### Consistent comment style
-
-> - make the commenting style consistent, and avoid connecting comments to
-> unrelated variables.
-
-### Polish the learning documents
-
-> - polish the learning documents and ensure they're clear, direct, properly
-> sectioned, and easy to understand.
-
-### Fix the hover-renders-as-plain-text bug
-
-> - make sure this bug is fixed: hovering over something in vscode renders it as
-> plain text, rather than formatted markdown and code. this was claimed to have
-> been solved in the latest changes, but it's not a guarantee, so i need you to
-> look at it again.
-
----
-
-## 2. Memory limits, build, and run
-
-### Dynamic memory limits, adjustable at build time and run time
-
-> - ensure all memory map limits are dynamic and can be adjusted both at build
-> time and also run time.
-
-### Clarification: tables and stacks must grow too
-
-> **Grow tables and stacks too** — for runtime-adjustable limits, should running
-> programs be able to grow individual compiler tables and stacks, or is
-> configurable total VM/heap memory at startup plus heap growth sufficient?
-> Changing every region during execution requires replacing the genome's
-> fixed-address layout.
-
-### Unify Windows run files; add a Linux script
-
-> - unify the windows run files into one interactive batch file.
-> - create a similar shell script for linux.
-
-### Remove CEILINGS.md
-
-> - remove the CEILINGS.md file if it's not needed.
-
----
-
-## 3. Project layout
-
-> - the parent dir is a bit cluttered again, move source files into subdirs of
-> src/, tests under subdirs of tests, docs and designs into a docs/, and so on.
-
-> - run all core source files one by one through the lsp, and catch their errors.
-> try to replicate an editor's context. i currently get errors in src/compiler.zc,
-> for example.
-
-> have you passed your own code into the lsp???
-
----
-
-## 4. LSP / VS Code features
-
-### Type hover text (built-ins mandatory)
-
-> - add hover text for variable types, including arrays and structs and others.
-> built-in type hover texts are mandatory
-
-### `/**/` comments contribute to documentation
-
-> - /**/ comments should contribute to documentation as well. they're very useful
-> for defining comments for individual variables and arguments and the likes, in
-> a multi-variable line or expression.
-
-### Inferred types in hover
-
-> - inferred types for untyped variables, function returns and arguments and
-> other spots should be shown in hover previews in vscode.
-
-### Hover value tips
-
-> - add variable value tips when hovering. if a value is known at hover time (aka
-> constants or variables assigned to literals, hovered on a section before they're
-> modified to a non-literal), display it in the hint.
-
-### Comment-to-variable association bugs
-
-> - i still see sections starting with `--- header ---` (number of dashes can
-> vary) or comments that are unrelated to the variable/function that comes after
-> them but related to the section, with no new line in between, so they get marked
-> as the hint of that variable, which is confusing and inaccurate. fix that. i
-> also see comments coming after a variable, which are not detected and hinted
-> properly by the lsp. either put those comments before the variable, or make the
-> compiler recognize them and classify them as hints. a good example of this
-> phenomenon starts at line 221 in compiler.zc.
-
-### Code error detection too slow
-
-> add task
-> - code error detection is too slow. add streaming and context cancellation, to
-> immediately halt old requests when there is a code change.
-
-### Jump to definition / references, cross-file
-
-> - add jump to definition / references support to the lsp. support cross-file
-> references and jumps as well.
-
-### Pretty-printer / formatter (lowest priority)
-
-> - add a pretty-printer/formatter, close to how clang-format works. this is a
-> minimum priority task and goes at the end of the todo list. even if all other
-> tasks are completed, implementing this task is unnecessary.
-
-### Quick fix support
-
-> - add quick fix support, including automatically importing the relevant library
-> and whatnot
-
-### Namespace suggestions
-
-> - add namespace suggestions too. `rt.` should bring up the fns under rt
-> namesapce
-
-### Hover for `include name;`
-
-> - add hover info for the library name in `include name;`
-
-### Lifetime hover with explanations
-
-> - add inferred and described lifetimes to hover informations, with their
-> explanations. also include hints such as "this variable is passed up on line X or
-> passed down on line Y"
-
-### Cross-file F12 on `s_to_n`
-
-> - running f12 on s_to_n says no definition and does NOT bring up rt.zc
-
-### Recursive type inference
-
-> - add recursive inference. eg: in lists.zc, mklist knows cap is an int. then
-> mklist is called with n in squares, so n is an int too. and squares returns l,
-> and l is the retval of mklist. we know that's a word, so that's what's inferred
-> as the ret type of squares too.
-
-### Variable declaration hover must show the type
-
-The user pasted a brainfuck compiler to demonstrate that it uses `put_s`,
-`put_n`, and `evals` without any `include` and gets no errors:
-
-```zc
-// a brainfuck compiler. it turns a brainfuck program into zc source, hands
-// that to the compiler that's sitting in memory, and runs the result, which on
-// arm64 means native code. runs of + - < > fold into one statement each.
-// give it a program after a backtick, or it runs the hello world below.
-let out[30000], n, depth;
-void emit(s) { let i = 0; while (s[i]) { out[n] = s[i]; n++; i++; } return; }
-void emitn(int v) { if (v >= 10) emitn(v / 10); out[n] = '0' + v % 10; n++; return; }
-// how many times does c repeat from s[i]
-int run(s, int i, int c) { int k = 0; while (s[i + k] == c) k++; return k; }
-
-fn translate(s) {
- int i = 0, k;
- n = 0; depth = 0;
- emit("let t[30000], p = 0;\n");
- while (s[i]) {
- switch (s[i]) {
- case '+', '-':
- k = run(s, i, s[i]);
- emit("t[p] = (t[p] "); emit(s[i] == '+' ? "+ " : "- "); emitn(k); emit(") & 255;\n");
- i = i + k; continue;
- case '>', '<':
- k = run(s, i, s[i]);
- emit("p "); emit(s[i] == '>' ? "+= " : "-= "); emitn(k); emit(";\n");
- i = i + k; continue;
- case '[': emit("while (t[p]) {\n"); depth++;
- case ']': emit("}\n"); depth--;
- case '.': emit("put_c(t[p]);\n");
- case ',': emit("t[p] = eof() ? 0 : get_c() & 255;\n");
- }
- i++;
- }
- emit("return 0;\n");
- out[n] = 0;
- return depth;
-}
-let hello = "++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.";
-let prog[20000];
-fn main() {
- let src = hello, k = 0, lines = 0, i = 0;
- while (!eof() && k < 19999) { let c = get_c(); if (c != 10) { prog[k] = c; k++; } }
- prog[k] = 0;
- if (k) src = prog;
- if (translate(src)) { put_s("unbalanced brackets\n"); return 1; }
- while (out[i]) { if (out[i] == 10) lines++; i++; }
- put_s("compiled to "); put_n(lines); put_s(" lines of zc, running it:\n");
- evals(out);
- return 0;
-}
-```
-
-> this doesnt use rt.put_s or compiler.evals (actually make the compiler
-> namespace core, so it's core.evals) and doesn't even include core or rt. yet
-> it has no errors???
-
-and on the hover format itself:
-
-> also wtf is this?
-> ```
-> let hello // global; type char*
-> ```
-> hover info
-> it's supposed to be
-> ```
-> (char*) let hello // global;
-> ```
-> !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! you have not implemented everything properly
-> !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-> same with this
-> ```
-> let prog // global; type word[20000]
-> ```
-> and many other places!! dude cmon!!! i asked for something and you didn't
-> implement it fully!
-
----
-
-## 5. Diagnostics / hints presentation
-
-### Blue squiggly hints with per-file control
-
-> - compiler hints should be displayed with those squiggly blue lines instead of
-> tiny three dots. this can be turned back into the three dots at the start of the
-> range with `hints small;` placed in the file (takes effect for lines below it).
-> other values are `hints off;` which turns them off, and `hints on;` which turns
-> them on into the blue squigglies (default)
-
-### Magic-number hint escape hatch
-
-> - add an escape hatch for magic number hints when there's a /**/ comment before
-> it. so `return n + 0x40ff` gives a warning, whilst `return n + /* offset in
-> memory */ 0x40ff` does not
-
-> include the fact that an inline comment suppresses it
-
-### Professional comment and hint prose
-
-> make hints and comments more professional. when have you ever in your life seen
-> clangd say "; a const says what it means"??? read actual compiler docs to know
-> how to format documentation, comments and how to phrase things. keep the
-> lowercase, just remove the informal ai slop and replace it with professional
-> compiler docs and guidance prose
-
-### Unused-argument hint
-
-> also, add a hint for when a function argument is never used in the body. add to
-> todo.md
-
-### `_` as a discard name
-
-> unused arguments, if they're named _, they can be discarded normally
-
-> and there can be multiple _'s. they should also be usable in pattern matching
-> and tagged enums
-
-> and if a _ is used, that instead gets a warning
-
----
-
-## 6. Naming / language semantics fixes
-
-### Remove `scat`, rename builtins
-
-> - please don't leave a function called scat in the code...
-
-> - change puts to put_s, putn to put_n, scat to cat_s, and so on.
-
-### Nested call returning `u`
-
-> - when i write `puts(f(x))` when fn returns a u type, i get this error: `a new
-> object can only go straight to a d parameter; bind it to a name first`. if it's
-> intended, leave it be. otherwise, fix it.
-
-### Global assignment from inside a function
-
-> - assigning a value to global variable from inside a function requires that
-> value to be m or u. once this assignment happens, the value is recasted
-> automatically (can also be done manually) to u, and it is consumed immediately,
-> meaning no other object can use it from that reference anymore. it can still be
-> accessed from the global, though.
-
-### Typed closure returns
-
-> - typed return from closures, using `fn:type(args) { code }`. example: `let
-> double = fn:int(int a) { return a * 2; }`
-
-### `fixed` + `const` together
-
-> - make fixed and const able to be used together
-
-### String literals must never be `word`
-
-> - string literals shouldnt be auto detected as a word when untyped. `let hello =
-> b"hi";` is typed as word, which is incorrect and inaccurate.
-
-> - in general, string literals, whether packed or not, must not be marked as
-> word, ANYWHERE. find all occurrences of word in the code after you're done with
-> removing them, and ensure none are referring to strings, either as input
-> arguments, or variables, or return types.
-
-### `case` indentation in the pretty printer
-
-> - case should be on one indent more than switch, when pretty printing
-
-### Multi-include syntax
-
-> add multi-include syntax `include rt, run, core;` for example. continue with
-> your tasks
-
----
-
-## 7. Namespaces and includes (major structural change)
-
-> i still see sooo many unchecked's in just the compiler...
-
-> also, the stuff under rt should go into their own respective rt namespace
-> and lsp too
-> generally just everything in the toolchain should be in its own namespace. and
-> require an explicit include to use them. like `include lsp;` or `include rt;`
-> not just those, but the rest too. like builtin core functions should have an
-> `include core;` and so on
-
-> don't stop until the todo list is done.
-
-> actually nvm, compiler is `run` instead of `core`. `core` is for the core
-> itself
-
----
-
-## 8. Analysis features
-
-### Bounding + lifetime analysis
-
-> - after everything else has been completed, add basic bounding+ilfetime analysis
-> to detect array bounds and show warnings whenever the compiler is sure there's
-> an OOB or UAF happening. also, hovering over an array or pointer should show its
-> lifetime or size.
-
-### BORROW.md plan
-
-> - generally, i want the borrow checker and lifetime analyzer to be *less
-> annoying* and *less intrusive* than rust's, whilst still being *more
-> intelligent* than it. if you can achieve this, draft a plan in BORROW.md for me.
-
----
-
-## 9. Libraries / stdlib
-
-### 9.1 `icon.zc` — runtime self-modifying code
-
-> spawn a subagent to write an std module in src/lib/ called icon.zc, which
-> supports way more complex self-modifications for code. currently, the best
-> we've got is a few functions to find literals. this new import `include icon;`
-> will provide things such as `icon.find_replace(my_fn, ${ $int + $int}, ${ $int
-> - $int }` and so on. it should be quite powerful, enough to mold and mix and
-> match syntax. undeclare variables, change types, add new blocks, change
-> expressions, calculate parts of an expression, step through code step by step
-> and examine its locals and globals, all at run time, and all dynamically, from
-> inside the language, using the help of the compiler.
-
-> also the icon code is of subpar quality in some places (eg a variable that is
-> never read), so relaunch the agent with 6.1 sol high to look through it
-> and make the actor agent 6.1 sol high too
-
-### 9.2 `actor` — actor semantics
-
-> - subagent task: add a library called actor, which allows actor-like semantics,
-> with async threads running in the background with separate contexts and internal
-> state, so that you can spawn one: `let a = addTwo.spawn(); a.recv(fn (e) {
-> putn(e); }); a.send(2); // prints 4` and whatnot. smalltalk or obj-c like
-> semantics
-
-> not just integer messages, actors can exchange any type. they get a generic
-> with two types: one for input, one for output. `Actor<I,O>`
-
-> also, isn't `this` implicit? if not, make it implicit and don't let people
-> declare it as the first argument
-
-> oh and btw, actors are async. they can run in parallel and there can be multiple
-> of each instance. defining thems hould be syntax injected into the compiler at
-> include time as immediate, including a keyword actor which is used in place of
-> struct to declare an actor.
-
-> important, the actor library should NOT be inside the compiler. it should
-> INFLUENCE the compiler at INCLUDE TIME. it's not a "this include activates this
-> syntax because the compiler has it bundled", it's a "this include activates this
-> syntax because it's injected into the compiler's machinery at include time". if
-> the compiler is lacking the extendability required for the task, then implement
-> that inside the compiler to make it more flexible, instead of hardcoding actors
-> into it. IMPORTANT: I DO NOT WANT TO SEE ANY ACTOR RELATED CODE IN compiler.zc
-> OR ANY OTHER FILE THAT IT INCLUDES OR READS BY DEFAULT.
-
-> update todo.md
-
-### 9.3 Arrays as first-class
-
-> - add support for push and pop and find and map and filter and other stuff to
-> arrays
-
-> - arrays should also be able to act like `x.push(4)` or `x.map(fn (e) { return
-> e + 2 })`. this also comes with autocomplete support
-
-### 9.4 Stdlib docs and documentation agent
-
-> - add more docs to the stdlib using a subagent
-
-> assign the polish docs agent to update the documentation, add new examples,
-> update learn entries, nad history too.
-
----
-
-## 10. CLI
-
-> also add a --help to the compiler, lsp, etc. put in todo
-
----
-
-## 11. Testing
-
-### Write tests before doing the remaining work
-
-> write tests, both ACCEPT tests and REJECT tests and regression tests, extensively
-> for every unchecked item in the todo list, and only then should you start work,
-> and to not stop until all those tests pass.
-
-### Then extensive tests for the whole toolchain
-
-> finish these tasks, and then write extensive tests for the lsp, compiler, and
-> every other tool in the toolchain. it should not only conform FULLY to the specs
-> and the todo requirements, but also be free of errors.
-
----
-
-## 12. Additional todo items added later
-
-> add task
-> - code error detection is too slow. add streaming and context cancellation, to
-> immediately halt old requests when there is a code change.
-
-> add to todo
-> - string literals shouldnt be auto detected as a word when untyped. `let hello =
-> b"hi";` is typed as word, which is incorrect and inaccurate.
-> - running f12 on s_to_n says no definition and does NOT bring up rt.zc
-> - in general, string literals, whether packed or not, must not be marked as
-> word, ANYWHERE. find all occurrences of word in the code after you're done with
-> removing them, and ensure none are referring to strings, either as input
-> arguments, or variables, or return types.
-
----
-
-## 13. Process feedback and session management
-
-> you have a background terminal running
-
-> do some work yourself
-
-> dude why do you keep not getting jack fucking shit done im crine
-
-> oml bruh you did fuck all yourself all this time?? it's been two hours oml
-
-> connection all good?
-
-> continue working then :)
-
-> progress update?
-
-> continue!!!
-> continue
-
-> no. auto review failed DAYS AGO. now the usage limit is back. continue. and auto
-> review is off, you're on full access.
-
-> also
-
----
-
-## 14. Grouped index (lookup)
-
-| Area | Requests |
-|---|---|
-| Review & polish | find bugs, find optimizations, clean "task X" references, consistent comment style, polish learn docs |
-| Hover bug | markdown/code hover renders as plain text — verify fixed |
-| Memory/build | dynamic limits (build+runtime), grow tables & stacks, unify Windows batch file, Linux shell script, drop `CEILINGS.md` |
-| TODO.md | maintain, tick off, reorder, completed-at-top, no leftover headers |
-| Layout | `src/` subdirs, `tests/` subdirs, `docs/`; run every core source file through the LSP |
-| LSP | type hovers (mandatory for built-ins), `/**/` doc comments, inferred types, value tips, comment-association bugs, `(char*) let hello // global;` format, streaming + cancellation, jump-to-def/refs cross-file, formatter (lowest priority), quick fixes + auto-import, namespace completion, hover for `include name;`, lifetime hover with explanations, array/pointer lifetime+size hover, F12 on `s_to_n` must open `rt.zc`, recursive inference |
-| Hints | blue squigglies w/ `hints on/small/off`, magic-number suppression via `/**/`, unused-arg hint, `_` (multiple, pattern matching, tagged enums; warn on use), professional non-AI-slop phrasing |
-| Renames | remove `scat`, `puts`→`put_s`, `putn`→`put_n`, `scat`→`cat_s` |
-| Semantics | nested `u`-returning call, global assign from fn + recast to `u` + consume, string literals never `word` anywhere, `fixed`+`const` together, typed closures `fn:t(...)`, `case` indent under pretty printer, `include rt, run, core;` |
-| Namespaces | `rt`, `lsp`, `run`, `core` namespaces + explicit includes everywhere; brainfuck sample must error without includes |
-| Analysis | bounding + lifetime OOB/UAF warnings; `BORROW.md` plan (less intrusive than Rust, more intelligent) |
-| Libs | `icon.zc` (runtime self-modification, subagent, 6.1 sol high review), `actor` (async, `Actor<I,O>`, implicit `this`, `actor` keyword injected at include time, **zero actor code in the compiler**), arrays `push/pop/find/map/filter` + method syntax + autocomplete, recursive inference, more stdlib docs |
-| CLI | `--help` for compiler, LSP, etc. |
-| Tests | ACCEPT + REJECT + regression for every unchecked todo item, written *before* the work; extensive LSP/compiler/toolchain tests afterward |
-| Process | one-line commands, delegate busywork to 6-luna subagents, small test intervals, work it yourself, don't stop until done |
-| **Post-session** | **bootstrap blocked: owned values can't move between locals, and locals can't be lent to globals — see `docs/BOOTSTRAP-OWNERSHIP.md`** |
-
----
-
-## 15. Raw transcript — every user message, in order
-
-Environment/context injections are marked. Session ran 2026-10-11T10:22 through
-2026-10-14T03:00 (UTC timestamps as recorded).
-
----
-
-**1.** `2026-10-11T10:28:39` — *environment injection (AGENTS.md + env context)*
-
-> # AGENTS.md instructions
->
-> <INSTRUCTIONS>
-> When writing commands for the user, never write them as multi-line (with
-> backslashes)
-> </INSTRUCTIONS>
-> <environment_context>
-> <cwd>/Users/moonflower/Documents/Playground/tinyvm</cwd>
-> <shell>zsh</shell>
-> <current_date>2026-10-11</current_date>
-> <timezone>Asia/Tehran</timezone>
-> <filesystem><workspace_roots><root>/Users/moonflower/Documents/Playground/tinyvm</root></workspace_roots><permission_profile type="managed">…</permission_profile></filesystem>
-> </environment_context>
-
-**2.** `2026-10-11T10:28:39`
-
-> read the code and familiarize yourself.
-> if you require busywork that you consider repetitive, easy to complete, but not
-> suitable for a bash run, use a 6-luna subagent to do so.
-> then, here are your tasks:
-> - find bugs and areas for optimizations.
-> - clean up the phrasing, there are leftover dirty references such as "task X" in
-> the documentation and code.
-> - make the commenting style consistent, and avoid connecting comments to
-> unrelated variables.
-> - polish the learning documents and ensure they're clear, direct, properly
-> sectioned, and easy to understand.
-> - make sure this bug is fixed: hovering over something in vscode renders it as
-> plain text, rather than formatted markdown and code. this was claimed to have
-> been solved in the latest changes, but it's not a guarantee, so i need you to
-> look at it again.
-
-**3.** `2026-10-11T10:31:36`
-
-> another task:
-> - ensure all memory map limits are dynamic and can be adjusted both at build
-> time and also run time.
-> - unify the windows run files into one interactive batch file.
-> - create a similar shell script for linux.
-> - remove the CEILINGS.md file if it's not needed.
->
-> write your tasks to a TODO.md file
-
-**4.** `2026-10-11T10:32:11` — *answer to a question prompt*
-
-> **Grow tables and stacks too**
-
-**5.** `2026-10-11T10:44:16`
-
-> the comments and docs shouldnt have uppercase :( follow the writing style of the
-> older comments
-
-**6.** `2026-10-11T10:49:54`
-
-> continue
-
-**7.** `2026-10-11T10:53:32`
-
-> also, please run tests in small intervals. don't run the full suite repeatedly as
-> it takes a good couple minutes
-
-**8.** `2026-10-11T10:58:26`
-
-> - add hover text for variable types, including arrays and structs and others.
-> built-in type hover texts are mandatory
-
-**9.** `2026-10-11T10:59:26`
-
-> - /**/ comments should contribute to documentation as well. they're very useful
-> for defining comments for individual variables and arguments and the likes, in
-> a multi-variable line or expression.
-
-**10.** `2026-10-11T11:02:09`
-
-> - inferred types for untyped variables, function returns and arguments and other
-> spots should be shown in hover previews in vscode.
-
-**11.** `2026-10-11T11:03:42`
-
-> make sure to add these to the todo file.
-
-**12.** `2026-10-11T11:08:17`
-
-> - after everything else has been completed, add basic bounding+ilfetime analysis
-> to detect array bounds and show warnings whenever the compiler is sure there's an
-> OOB or UAF happening. also, hovering over an array or pointer should show its
-> lifetime or size.
-
-**13.** `2026-10-11T11:15:23`
-
-> - please don't leave a function called scat in the code...
-> - change puts to put_s, putn to put_n, scat to cat_s, and so on.
-
-**14.** `2026-10-11T11:18:11`
-
-> - when i write `puts(f(x))` when fn returns a u type, i get this error: `a new
-> object can only go straight to a d parameter; bind it to a name first`. if it's
-> intended, leave it be. otherwise, fix it.
-
-**15.** `2026-10-11T11:19:03`
-
-> - generally, i want the borrow checker and lifetime analyzer to be *less
-> annoying* and *less intrusive* than rust's, whilst still being *more
-> intelligent* than it. if you can achieve this, draft a plan in BORROW.md for me.
-
-**16.** `2026-10-11T11:29:54`
-
-> connection all good?
-
-**17.** `2026-10-11T11:30:13`
-
-> continue working then :)
-
-**18.** `2026-10-11T12:12:39`
-
-> add these to tasks and todo.md:
-> - the parent dir is a bit cluttered again, move source files into subdirs of
-> src/, tests under subdirs of tests, docs and designs into a docs/, and so on.
-> - run all core source files one by one through the lsp, and catch their errors.
-> try to replicate an editor's context. i currently get errors in src/compiler.zc,
-> for example.
-
-**19.** `2026-10-11T12:47:16`
-
-> don't forget to tick off tasks that you complete in TODO.md.
-
-**20.** `2026-10-11T15:42:56`
-
-> continue
-
-**21.** `2026-10-11T16:20:41`
-
-> don't forget to update the todo.md.
-
-**22.** `2026-10-11T16:28:52`
-
-> re-order the todo file based on the order of tasks that you'll complete.
-
-**23.** `2026-10-11T16:32:13`
-
-> did you update todo?
-
-**24.** `2026-10-11T16:33:07`
-
-> ummm... if it's updated, why are there still headers... and, why aren't the
-> crossed off tasks all at the start, since they've been implemented already? do
-> you understand how sorting works?
-
-**25.** `2026-10-11T16:57:02`
-
-> continue
-
-**26.** `2026-10-12T03:17:04` — *environment injection (date change, subagents)*
-
-> continue
-
-**27.** `2026-10-12T05:16:51`
-
-> continue
-
-**28.** `2026-10-12T05:27:11`
-
-> 1. you have a background terminal running
-> 2. add variable value tips when hovering. if a value is known at hover time (aka
-> constants or variables assigned to literals, hovered on a section before they're
-> modified to a non-literal), display it in the hint.
-
-**29.** `2026-10-12T05:29:13`
-
-> add task
-> - code error detection is too slow. add streaming and context cancellation, to
-> immediately halt old requests when there is a code change.
-
-**30.** `2026-10-12T05:31:05`
-
-> - i still see sections starting with `--- header ---` (number of dashes can
-> vary) or comments that are unrelated to the variable/function that comes after
-> them but related to the section, with no new line in between, so they get marked
-> as the hint of that variable, which is confusing and inaccurate. fix that. i
-> also see comments coming after a variable, which are not detected and hinted
-> properly by the lsp. either put those comments before the variable, or make the
-> compiler recognize them and classify them as hints. a good example of this
-> phenomenon starts at line 221 in compiler.zc.
-
-**31.** `2026-10-12T05:32:45`
-
-> - add jump to definition / references support to the lsp. support cross-file
-> references and jumps as well.
-
-**32.** `2026-10-12T05:34:02`
-
-> - add a pretty-printer/formatter, close to how clang-format works. this is a
-> minimum priority task and goes at the end of the todo list. even if all other
-> tasks are completed, implementing this task is unnecessary.
-
-**33.** `2026-10-12T05:40:11`
-
-> - assigning a value to global variable from inside a function requires that
-> value to be m or u. once this assignment happens, the value is recasted
-> automatically (can also be done manually) to u, and it is consumed immediately,
-> meaning no other object can use it from that reference anymore. it can still be
-> accessed from the global, though.
-
-**34.** `2026-10-12T05:42:16`
-
-> - typed return from closures, using `fn:type(args) { code }`. example: `let
-> double = fn:int(int a) { return a * 2; }`
-
-**35.** `2026-10-12T05:45:23`
-
-> - compiler hints should be displayed with those squiggly blue lines instead of
-> tiny three dots. this can be turned back into the three dots at the start of the
-> range with `hints small;` placed in the file (takes effect for lines below it).
-> other values are `hints off;` which turns them off, and `hints on;` which turns
-> them on into the blue squigglies (default)
-
-**36.** `2026-10-12T05:46:15`
-
-> - add inferred and described lifetimes to hover informations, with their
-> explanations. also include hints such as "this variable is passed up on line X or
-> passed down on line Y"
-
-**37.** `2026-10-12T05:46:24`
-
-> add these to todo.md
-
-**38.** `2026-10-13T06:33:41` — *environment injection (date change, subagents)*
-
-**39.** `2026-10-13T06:33:41`
-
-> i still see sooo many unchecked's in just the compiler...
-> also, the stuff under rt should go into their own respective rt namespace
-> and lsp too
-> generally just everything in the toolchain should be in its own namespace. and
-> require an explicit include to use them. like `include lsp;` or `include rt;`
-> not just those, but the rest too. like builtin core functions should have an
-> `include core;` and so on
-> have you passed your own code into the lsp???
->
-> ```
-> // a brainfuck compiler. it turns a brainfuck program into zc source, hands
-> // that to the compiler that's sitting in memory, and runs the result, which on
-> // arm64 means native code. runs of + - < > fold into one statement each.
-> // give it a program after a backtick, or it runs the hello world below.
-> let out[30000], n, depth;
-> void emit(s) { let i = 0; while (s[i]) { out[n] = s[i]; n++; i++; } return; }
-> void emitn(int v) { if (v >= 10) emitn(v / 10); out[n] = '0' + v % 10; n++; return; }
-> // how many times does c repeat from s[i]
-> int run(s, int i, int c) { int k = 0; while (s[i + k] == c) k++; return k; }
->
-> fn translate(s) {
-> int i = 0, k;
-> n = 0; depth = 0;
-> emit("let t[30000], p = 0;\n");
-> while (s[i]) {
-> switch (s[i]) {
-> case '+', '-':
-> k = run(s, i, s[i]);
-> emit("t[p] = (t[p] "); emit(s[i] == '+' ? "+ " : "- "); emitn(k); emit(") & 255;\n");
-> i = i + k; continue;
-> case '>', '<':
-> k = run(s, i, s[i]);
-> emit("p "); emit(s[i] == '>' ? "+= " : "-= "); emitn(k); emit(";\n");
-> i = i + k; continue;
-> case '[': emit("while (t[p]) {\n"); depth++;
-> case ']': emit("}\n"); depth--;
-> case '.': emit("put_c(t[p]);\n");
-> case ',': emit("t[p] = eof() ? 0 : get_c() & 255;\n");
-> }
-> i++;
-> }
-> emit("return 0;\n");
-> out[n] = 0;
-> return depth;
-> }
-> let hello = "++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++.";
-> let prog[20000];
-> fn main() {
-> let src = hello, k = 0, lines = 0, i = 0;
-> while (!eof() && k < 19999) { let c = get_c(); if (c != 10) { prog[k] = c; k++; } }
-> prog[k] = 0;
-> if (k) src = prog;
-> if (translate(src)) { put_s("unbalanced brackets\n"); return 1; }
-> while (out[i]) { if (out[i] == 10) lines++; i++; }
-> put_s("compiled to "); put_n(lines); put_s(" lines of zc, running it:\n");
-> evals(out);
-> return 0;
-> }
-> ```
->
-> this doesnt use rt.put_s or compiler.evals (actually make the compiler
-> namespace core, so it's core.evals) and doesn't even include core or rt. yet
-> it has no errors???
-> don't stop until the todo list is done.
-> actually nvm, compiler is `run` instead of `core`. `core` is for the core
-> itself
-> also wtf is this?
-> ```
-> let hello // global; type char*
-> ```
-> hover info
-> it's supposed to be
-> ```
-> (char*) let hello // global;
-> ```
-> !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! you have not implemented everything properly
-> !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-> same with this
-> ```
-> let prog // global; type word[20000]
-> ```
-> and many other places!! dude cmon!!! i asked for something and you didn't
-> implement it fully!
-> also, add a hint for when a function argument is never used in the body. add to
-> todo.md
-> write tests, both ACCEPT tests and REJECT tests and regression tests, extensively
-> for every unchecked item in the todo list, and only then should you start work,
-> and to not stop until all those tests pass.
-> add to todo
-> - string literals shouldnt be auto detected as a word when untyped. `let hello =
-> b"hi";` is typed as word, which is incorrect and inaccurate.
-> - running f12 on s_to_n says no definition and does NOT bring up rt.zc
-> - in general, string literals, whether packed or not, must not be marked as
-> word, ANYWHERE. find all occurrences of word in the code after you're done with
-> removing them, and ensure none are referring to strings, either as input
-> arguments, or variables, or return types.
-
-**40.** `2026-10-13T06:34:11`
-
-> finish these tasks, and then write extensive tests for the lsp, compiler, and
-> every other tool in the toolchain. it should not only conform FULLY to the specs
-> and the todo requirements, but also be free of errors.
-
-**41.** `2026-10-13T06:35:25` — *environment injection (full access enabled)*
-
-**42.** `2026-10-13T06:35:25`
-
-> no. auto review failed DAYS AGO. now the usage limit is back. continue. and auto
-> review is off, you're on full access.
-
-**43.** `2026-10-13T06:36:54`
-
-> - add an escape hatch for magic number hints when there's a /**/ comment before
-> it. so `return n + 0x40ff` gives a warning, whilst `return n + /* offset in
-> memory */ 0x40ff` does not
-
-**44.** `2026-10-13T06:42:08`
-
-> include the fact that an inline comment suppresses it
-
-**45.** `2026-10-13T06:42:11`
-
-> also
-
-**46.** `2026-10-13T06:43:28`
-
-> make hints and comments more professional. when have you ever in your life seen
-> clangd say "; a const says what it means"??? read actual compiler docs to know
-> how to format documentation, comments and how to phrase things. keep the
-> lowercase, just remove the informal ai slop and replace it with professional
-> compiler docs and guidance prose
-
-**47.** `2026-10-13T07:02:06`
-
-> unused arguments, if they're named _, they can be discarded normally
-
-**48.** `2026-10-13T07:05:27`
-
-> and there can be multiple _'s. they should also be usable in pattern matching
-> and tagged enums
-
-**49.** `2026-10-13T07:05:45`
-
-> and if a _ is used, that instead gets a warning
-
-**50.** `2026-10-13T07:13:47`
-
-> spawn a subagent to write an std module in src/lib/ called icon.zc, which
-> supports way more complex self-modifications for code. currently, the best
-> we've got is a few functions to find literals. this new import `include icon;`
-> will provide things such as `icon.find_replace(my_fn, ${ $int + $int}, ${ $int
-> - $int }` and so on. it should be quite powerful, enough to mold and mix and
-> match syntax. undeclare variables, change types, add new blocks, change
-> expressions, calculate parts of an expression, step through code step by step
-> and examine its locals and globals, all at run time, and all dynamically, from
-> inside the language, using the help of the compiler.
-
-**51.** `2026-10-13T08:20:52`
-
-> add multi-include syntax `include rt, run, core;` for example. continue with
-> your tasks
-
-**52.** `2026-10-13T08:26:25`
-
-> continue
-
-**53.** `2026-10-13T08:26:39` — *internal goal marker*
-
-> User set the goal: "continue and don't stop"
-
-**54.** `2026-10-13T09:12:02` — *internal goal marker: paused*
-
-**55.** `2026-10-13T09:21:07`
-
-> continue
-
-**56.** `2026-10-13T09:38:22`
-
-> progress update?
-
-**57.** `2026-10-13T10:22:30`
-
-> continue
-
-**58.** `2026-10-13T10:37:58`
-
-> continue
-
-**59.** `2026-10-13T12:09:59` — *internal goal marker: active*
-
-**60.** `2026-10-13T12:10:34`
-
-> continue
-
-**61.** `2026-10-13T12:17:33`
-
-> - case should be on one indent more than switch, when pretty printing
-
-**62.** `2026-10-13T12:18:20`
-
-> - add quick fix support, including automatically importing the relevant library
-> and whatnot
-
-**63.** `2026-10-13T12:18:33`
-
-> - add namespace suggestions too. `rt.` should bring up the fns under rt
-> namesapce
-
-**64.** `2026-10-13T12:20:15`
-
-> - add more docs to the stdlib using a subagent
-
-**65.** `2026-10-13T12:25:23`
-
-> - add hover info for the library name in `include name;`
-
-**66.** `2026-10-13T12:29:04`
-
-> - add recursive inference. eg: in lists.zc, mklist knows cap is an int. then
-> mklist is called with n in squares, so n is an int too. and squares returns l,
-> and l is the retval of mklist. we know that's a word, so that's what's inferred
-> as the ret type of squares too.
-
-**67.** `2026-10-13T12:31:01`
-
-> - make fixed and const able to be used together
-
-**68.** `2026-10-13T12:32:14`
-
-> - add support for push and pop and find and map and filter and other stuff to
-> arrays
-
-**69.** `2026-10-13T12:53:04`
-
-> - arrays should also be able to act like `x.push(4)` or `x.map(fn (e) { return
-> e + 2 })`. this also comes with autocomplete support
-
-**70.** `2026-10-13T12:54:57`
-
-> - subagent task: add a library called actor, which allows actor-like semantics,
-> with async threads running in the background with separate contexts and internal
-> state, so that you can spawn one: `let a = addTwo.spawn(); a.recv(fn (e) {
-> putn(e); }); a.send(2); // prints 4` and whatnot. smalltalk or obj-c like
-> semantics
-
-**71.** `2026-10-13T13:33:03`
-
-> not just integer messages, actors can exchange any type. they get a generic
-> with two types: one for input, one for output. `Actor<I,O>`
-
-**72.** `2026-10-13T13:34:02`
-
-> also, isn't `this` implicit? if not, make it implicit and don't let people
-> declare it as the first argument
-
-**73.** `2026-10-13T13:35:17`
-
-> oh and btw, actors are async. they can run in parallel and there can be multiple
-> of each instance. defining thems hould be syntax injected into the compiler at
-> include time as immediate, including a keyword actor which is used in place of
-> struct to declare an actor.
-
-**74.** `2026-10-13T13:37:15`
-
-> important, the actor library should NOT be inside the compiler. it should
-> INFLUENCE the compiler at INCLUDE TIME. it's not a "this include activates this
-> syntax because the compiler has it bundled", it's a "this include activates this
-> syntax because it's injected into the compiler's machinery at include time". if
-> the compiler is lacking the extendability required for the task, then implement
-> that inside the compiler to make it more flexible, instead of hardcoding actors
-> into it. IMPORTANT: I DO NOT WANT TO SEE ANY ACTOR RELATED CODE IN compiler.zc
-> OR ANY OTHER FILE THAT IT INCLUDES OR READS BY DEFAULT.
-
-**75.** `2026-10-13T13:37:46`
-
-> update todo.md
-
-**76.** `2026-10-13T13:50:28`
-
-> do some work yourself
-
-**77.** `2026-10-13T13:51:39` — *internal goal marker: paused*
-
-**78.** `2026-10-13T13:51:39`
-
-> also the icon code is of subpar quality in some places (eg a variable that is
-> never read), so relaunch the agent with 6.1 sol high to look through it
-> and make the actor agent 6.1 sol high too
-
-**79.** `2026-10-13T13:52:12` — *internal goal marker: active*
-
-**80.** `2026-10-13T13:52:14`
-
-> assign the polish docs agent to update the documentation, add new examples,
-> update learn entries, nad history too.
-
-**81.** `2026-10-13T14:20:14`
-
-> continue
-
-**82.** `2026-10-13T14:20:23`
-
-> dude why do you keep not getting jack fucking shit done im crine
-
-**83.** `2026-10-13T15:55:37`
-
-> oml bruh you did fuck all yourself all this time?? it's been two hours oml
-
-**84.** `2026-10-13T17:04:03`
-
-> continue!!!
-
-**85.** `2026-10-13T18:01:45`
-
-> also add a --help to the compiler, lsp, etc. put in todo
-
-**86.** `2026-10-14T02:57:56` — *environment injection (date change, subagents)*
-
-**87.** `2026-10-14T02:57:56`
-
-> continue
-
----
-
-*End of transcript. 87 user turns recorded in the session (88 user-role messages
-including the initial `AGENTS.md` injection).* \ No newline at end of file