Pimp My IDE / garage dispatch
Back to garage
September 30, 2026 | scope control / language tools / agent work

The fifth abstraction owns the schedule.

A binary-tree assignment became a functional language with closures, a custom allocator, garbage collection, plugins, and a REPL. That is a great learning trip. It is also a clean warning about work that keeps inventing its next prerequisite.

Before the first useful abstraction grows a runtime, name the goal, mark the stop line, and write the exit route.

The assignment kept finding new work.

A September field note starts with one data-structures exercise. The job was to evaluate 1 + 1 + 1 with a binary tree. The author generalized operators into functions, then added variables, closures, a custom allocator, garbage collection, a parser, a REPL, plugins, file access, and sockets.[1]

This is not a failure story. The author wanted to learn, followed each dependency, and published the result. The linked GraphLang repository describes a Lisp-style language and virtual machine written in C. It has 102 commits and no tagged release at the time of this pass.[2]

Exploration can expand on purpose. Delivery needs a stop line.

A new layer creates a new duty.

Once an expression becomes source text, somebody must scan and parse it. Once names exist, somebody must bind them. Once functions capture local state, somebody must define lifetime and cleanup. Once users depend on the result, errors, documentation, compatibility, packaging, and debugging enter the job.

Crafting Interpreters maps the common language stages from scanning and parsing through analysis, intermediate forms, execution, and runtime support. The exact route differs by language. The point is that each stage has its own contract and failure cases.[3]

Cheap code can hide expensive ownership.

Coding agents can make the next implementation step feel small. The ownership cost does not shrink at the same rate. Generated parser code still needs error behavior. Generated memory code still needs stress tests. A generated plugin interface still needs version rules and a safe loading policy.

Ask a blunt question before accepting the next layer. Does this layer prove the original idea, teach the skill you chose, or support a user who already depends on it? If the answer is no, cut it or move it into a separate experiment.

A checkout is evidence, not a product claim.

We cloned GraphLang at commit 6adaf05fa441 and ran its documented make command. Several C units compiled. The build then stopped because this host lacks the readline/history.h development header. That result does not show a defect in GraphLang. It shows that the checkout needs a dependency that was not present on this test host.

The repository has source, a Makefile, examples, and documentation. It does not have a tagged release. Treat it as a young learning project unless the maintainer states a stronger support contract. Do not turn a readable README or a partial local build into a production-readiness claim.

Write the stop card before the next abstraction.

  1. Name the job as learning, prototype, or shipped product.
  2. List the layers already implied by the goal.
  3. Mark the first layer that is outside the job.
  4. Define one test for the chosen stop line.
  5. Name the maintained tool you will use instead of building past it.
  6. Record how to delete or replace the experiment.
Interactive makeover / scope stop card

Scope Camshaft

Traditional purpose replaced: a feature checklist that treats every extra layer as equal. Better version: set the job, move the build depth, expose the first layer outside the job, and copy a stop card.

Set the trip

This teaching control writes a planning card. It does not inspect a repository or estimate delivery time.

Job
Build depth4 / 7 Closures
Expression treeRelease contract
Stop card fields
Card draft0 of 3 fields selected
Display-only scope route

Build depth and stop line

The prototype has crossed its default stop line.

The selected depth includes closures. State why that layer is needed, or move it into a separate learning experiment.

The stop line is a teaching default. Project constraints decide the real boundary. Selecting every field means the card structure is ready. It does not mean the design or release is approved.

Sources read

Source log and evidence boundary
  1. "Needed 1+1, Built a Functional Programming Language", September 16, 2026. The author describes the assignment, evaluator, allocator changes, closures, garbage collection, parser, REPL, FFI, and linked project.
  2. PranavDesai-Git/graphLang, inspected September 30, 2026 at commit 6adaf05fa441. The repository documents its syntax, evaluator, plugins, lexical scoping, garbage collector, build command, and examples. GitHub reported 102 commits and no tagged release. Our host build stopped at a missing Readline development header.
  3. Crafting Interpreters, "A Map of the Territory". This chapter describes scanning, parsing, static analysis, intermediate forms, optimization, execution, and runtime support.
  4. Hacker News discussion 49895864, read September 30, 2026. It led us to the field note and supplied reader reactions. It is not used to verify GraphLang behavior.

Evidence boundary: The blog supports the author's account. The repository supports source and documentation claims. The local checkout supports only the build result stated above. Scope Camshaft is a planning aid, not a project estimate, code audit, or release verdict.