verona
AGENTS.md3.7k starsChanged 3 months agoMITView on GitHub
Read ~/.config/agents/AGENTS.md for user preferences, workflow rules, and irreversible-action guardrails (git commit/push/PR require explicit permission).
Trending
Quiet this year.about the whole repository
Who's talking about microsoft/verona
- A Hacker News story“Microsoft Project Verona: Research programming language for concurrent ownership”Hacker News · Jan 17, 2020 · 142 points
- A Hacker News story“Project Verona FAQ”Hacker News · Feb 10, 2020 · 29 points
- A Hacker News story“Project Verona: Research programming language for concurrent ownership”Hacker News · Jan 16, 2020 · 7 points
- A Hacker News story“Microsoft/Verona”Hacker News · Jan 18, 2020 · 3 points
- A Hacker News story“Concurrent Ownership in Verona”Hacker News · Dec 14, 2022 · 2 points
The biggest 5 of 18 mentions linking to the repository that our crawl found. Each line is their own headline.
See all 18
Talked about on GitHub and Hacker News (18 times).
On GitHub · 12
- Dec 31, 2023Check ideas from Verona language for concurrency — lambdaclass/concrete0 reactions
- Jul 21, 2023Add Verona — ChessMax/awesome-programming-languages0 reactions
- Jul 13, 2023Move the Verona compiler to microsoft/verona — microsoft/Trieste0 reactions
- Oct 24, 2022Optimise for waking an empty queue — microsoft/verona-rt0 reactions
- Oct 24, 2022Token source — microsoft/verona-rt0 reactions
7 more on GitHub
- Oct 20, 2022Small optimisations and refactors around message send and receive — microsoft/verona-rt0 reactions
- Jul 29, 2022Don't run CI on doc-only changes — microsoft/CCF0 reactions · 4 comments
- Aug 26, 2021Enable passthrough to an underlying allocator — microsoft/snmalloc0 reactions · 1 comment
- Jan 25, 2021Meta: Some interesting pointers to borrow ideas — flix/flix0 reactions · 1 comment
- Jan 4, 2021Meta: Some interesting pointers to borrow ideas — HigherOrderCO/Kind0 reactions
- Jun 18, 2020Refactor Pal and LargeAlloc interaction. — microsoft/snmalloc0 reactions
- Jan 27, 2020Automating keeping snmalloc up to date. — SchrodingerZhu/snmalloc-rs0 reactions · 2 comments
On Hacker News · 6
- Jan 17, 2020Microsoft Project Verona: Research programming language for concurrent ownership142 points · 16 comments
- Feb 10, 2020Project Verona FAQ29 points · 8 comments
- Jan 16, 2020Project Verona: Research programming language for concurrent ownership7 points
- Jan 18, 2020Microsoft/Verona3 points
- Dec 14, 2022Concurrent Ownership in Verona2 points
1 more on Hacker News
- Sep 17, 2023Microsoft Project Verona, a research programming language1 point
Where files are headingNew AGENTS.md files have more rules about keeping secrets out of the code, and fewer about code style.
Of the AGENTS.md files we read, the 31,774 first seen in the last six months, against the older ones: the kind of rule that gained most share, and the kind that lost most. About files like this in general, not this one, and an estimate, since a kind is a pattern in the words.
In this repository19 other files it gives its agents.
- CLAUDE.mdCLAUDE.md
- .github/copilot-instructions.mdCopilot instructions
- add-testSkill
- debugSkill
- docs-updateSkill
- reviewSkill
- testsuiteSkill
- vbci-memorySkill
- verona-codingSkill
- verona-conventionsSkill
- verona-type-inferenceSkill
- add-testSkill
- docs-updateSkill
- reviewSkill
- testsuiteSkill
- vbci-memorySkill
- verona-codingSkill
- verona-conventionsSkill
- verona-type-inferenceSkill
The file
Show its rules and text
We split this AGENTS.md into the rules it gives an agent
13 rules. About 0 are common, 1 is distinctive, and 12 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈1
Distinctive · estimate
This author's own choices. Worth a look.
12
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 3
Read ~/.config/agents/AGENTS.md for user preferences, workflow rules, and irreversible-action guardrails (git commit/push/PR require …
- Distinctive: line 11
Before speculative interpreter/runtime changes, explain the evidence and proposed fix and get feedback.
- Very specific: line 16
Baseline before starting work: Before making any changes, run ninja install && ctest -j$(nproc) to verify the full test suite passes.
- Very specific: line 18
Debugging: Use gdb for debugging.
- Very specific: line 25
Self-referential includes: When resolving a TypeName inside a Use node, lookup() can return the Use node itself via the include mechanism.
- Very specific: line 37
Return values: when a label's terminator is Return, refines the returned local against the function's declared return type.
- Very specific: line 57
Verona syntax details: No semicolons after closing braces of control flow (for, if, while).
- Very specific: line 87
Don't use explicit type annotations on literals when inference can determine the type from context.
- Very specific: line 88
Use (obj.field)(args) to call apply on a field access result: (self.data)(i) indexes into a field that is an array.
- Very specific: line 89
Use Type(args) constructor sugar: string(result) instead of string::create(result).
- Very specific: line 93
Use ! prefix for boolean negation: !(self == other).
- Very specific: line 101
Ownership clearing: Only clear parent/cown ownership when root == region->get_entry_point().
- Very specific: line 104
Use-after-move in write barrier: When apply_in needs the header for set_parent, save it BEFORE the register is cleared (move semantics).
≈ “Common” is an estimate: at least 1 in 5 of the 40,246 AGENTS.md files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
STOP — Read Global AGENTS.md First
Read ~/.config/agents/AGENTS.md for user preferences, workflow rules, and
irreversible-action guardrails (git commit/push/PR require explicit permission).
Workflow & Knowledge Storage
- Durable Verona guidance belongs in this
AGENTS.mdor.agents/skills/, not in agent-specific memory interfaces. - Cross-project workflow rules belong in
~/.config/agents/AGENTS.md. - For tricky compiler/runtime/FFI bugs, do principled analysis first: reproduce, trace, inspect dumps, and localize the fault before changing semantics.
- Before speculative interpreter/runtime changes, explain the evidence and proposed fix and get feedback.
Verona Compiler (vc) Specifics
- Build / test workflow: Always build in the
builddirectory. Always runninja installto build; use the installed binaries underbuild/dist/(e.g.,dist/vc/vc,dist/vbci/vbci). The build binaries underbuild/vc/vcdo NOT have_builtinnext to them.ctestruns the full test suite. Useninja update-dumpto regenerate golden test files. - Baseline before starting work: Before making any changes, run
ninja install && ctest -j$(nproc)to verify the full test suite passes. Do NOT proceed if tests fail — fix the environment first. This prevents committing broken golden files (e.g., segfaults from misconfigured builds). - Running vc: Always run
vcfrom thebuilddirectory, passing the path to the source directory on the command line (e.g.,dist/vc/vc build ../testsuite/v/hello). Do NOTcdinto the source directory — the.vbcoutput name is derived from the directory name, so building with.produces a hidden..vbcfile. - Debugging: Use
gdbfor debugging. - Pass-limited testing:
-p <passname>stops after a specific pass (e.g.,-p ident).--dump_passes=<dir>dumps intermediate ASTs. _builtinresolution: The parser's postparse hook looks for_builtinatexecutable.parent_path() / "_builtin". Only the installed binary has it.usesemantics:use Ximports X's contents for unqualified lookup within the current scope, but NOT for qualified lookdown from outside. AUsenode with[Include]creates an include entry in the parent's symtab, which is followed bylookup()but notlookdown().- Function call resolution: Free function calls must be either qualified (e.g.,
MyModule::func(args)) or reached viause(intentional shadowing). Unqualified function names are NOT resolved byresolve_first()walking up scopes — only classes, type aliases, and type params are. An unqualified name that doesn't resolve becomes aMethodName→CallDyn(dynamic dispatch on the receiver type). This prevents functions on enclosing scopes from shadowing methods of the same name on other types (e.g.,string::!=would have been shadowed by a!=function in an enclosing scope). - Fully qualified names: After the ident pass, all TypeName/FuncName nodes contain only NameElement children — no relative references. Every name is fully qualified from Top, using scope names with empty TypeArgs for intermediate scopes (even if they have TypeParams). This means names can be resolved without knowing the enclosing scope.
- Ident pass architecture: Uses
NodeWorker<Resolver>with aProcessorclass. Key methods:resolve_first()(walks up scopes via lookup, builds FQ prefix viabuild_fq_prefix()),resolve_down()(looks into ClassDef via lookdown),resolve_last()(final type checks),resolve_alias()(follows TypeAlias chains),substitute()(substitutes TypeParam references using a scope-to-prefix-elem map built from the prefix path),find_def()(navigates a fully qualified path from Top). - Self-referential includes: When resolving a TypeName inside a
Usenode,lookup()can return theUsenode itself via the include mechanism. The ident pass skips these withn->parent() == def. - Shared FQ helpers:
scope_path(node)walks to Top and returns a top-down vector of scope nodes.fq_typeparam(path, tp)builds a fully qualified TypeName for a TypeParam.fq_typeargs(path, tps)builds TypeArgs with FQ TypeParam references.make_selftype(node, fq)builds a self-type for a class. All inlang.h/lang.cc, used by ident.cc, sugar.cc, and lang.cc. - Reify pass architecture: Monomorphization pass. Starts from
main, reifies the call, then iteratively processes a worklist of classes/functions/type aliases. Output WF iswfIR(defined ininclude/vbcc.h, notvc/lang.h). Usesstd::deque<Reification>for pointer stability (worklist holds pointers into deque elements).get_reification(): Navigates FQ names fromtop, builds a substitution map from TypeArgs, deduplicates against existing reifications, and schedules new ones. The caller's substitution context is kept separate from the navigation-accumulated substitution — only the latter is stored in theReificationfor deduplication comparison.make_id(): Builds identifiers —ClassId ^ "scope::name::index",FunctionId ^ "scope::name.arity[.ref]::index".- Key ANF→IR transformations:
Var→ extracted toVarsasLocalId, removed fromBody.Lookup6-child → 3-child(dst, src, MethodId).New(dst, Type, NewArgs)→(dst, ClassId, Args).Call(dst, Lhs, FuncName, Args)→(dst, FunctionId, Args). - Shapes:
shapedefinitions (ClassDef with Shape child) are treated asDynduring reification.get_reification()returnsDynearly, before creating a ClassId, so no class definition is emitted. - Primitive types: Map of string→token in reify.cc.
reify_primitive()ensures each is reified exactly once. Singleton token nodes must beclone()d before AST insertion.
- Infer pass architecture: Between ANF and reify.
dir::oncewithpost()hook. Per-function: builds aTypeEnv(Location → LocalTypeInfo) from Params, Const, Convert, Copy/Move, Var annotations, New, binops, comparisons, unops. Refines default-typed Const literals (U64/F64) to domain-compatible expected types in these contexts:- Call arguments: navigates FuncName to find Function def (filter by arity + handedness), infers empty TypeArgs from actual arg types via direct TypeParam matching, then refines args.
- Var assignments: refines Consts assigned to explicitly-typed Vars via Copy/Move.
- New arguments: looks up the ClassDef via
find_def(), matches NewArg idents to FieldDef idents, refines based on field types. - Return values: when a label's terminator is
Return, refines the returned local against the function's declared return type. - FFI return types: Navigate up via
node->parent(ClassDef), scanClassBodyforLibnodes, matchSymbolIdinSymbols, and use theSymbol / Typechild as the return type. Walk up through nested ClassDefs if the first doesn't contain the lib. - Read semantics:
Readgives a read-only reference to a cown. For type inference, the result type is the same as the argument type (same as arithmetic unops). - Statement coverage: Tracks types for Const, ConstStr, Convert, Copy, Move, RegisterRef, FieldRef, ArrayRef, ArrayRefConst, New, NewArray, NewArrayConst, Load, Store, Lookup, Call, CallDyn, TypeCond, Var, binops, unops (including Read), nulops, and FFI.
Whenis intentionally untracked (deferred until cowns are working). - Uses
const_nodepointer propagation through Copy/Move for alias tracking;refine_const()clears all aliases after refinement to prevent conflicts.
- Running compiled programs:
dist/vbci/vbci foo.vbcexecutes a compiled.vbcfile (output ofvc build). Debug the interpreter withlldb-20 -- dist/vbci/vbci foo.vbc. - Verona source syntax notes: Class definitions use bare names (no
classkeyword):myclass[T] { ... }. Fields need semicolons:val: T;.newusesnew { field = val }(no class name). Nolet/varkeyword on class fields.usefor imports. - Node construction pitfall:
auto tn = TypeNamecopies theTokenDef(deleted copy constructor). UseNode tn = TypeNameto create a new AST node. - Reify dedup strategy:
find_or_push()uses a hybrid approach. Primitives/wrappers useid->equals()with structural IDs (no index embedded). Everything else usessubst_equal()becausemake_id()embedsr_vec.size()into the ClassId string — calling it before the dedup loop gives each entry a unique ID and dedup silently fails. - Runtime "bad type" errors: These usually trace back to unrefined default literal types (U64/F64) in the compiler output that don't match the expected type at the use site. Check the infer pass output (
--dump_passes) to see if Const nodes have the expected types. .vbcoutput naming:vc build <dir>produces<project_name>.vbcin the current directory. If the project name is empty or ".", the output file is.vbc(hidden file).- Infer pass cascade re-propagation: The return-type refinement cascade uses a
cascade_changedset to track affected locations and prevent oscillation. Without this, a variable assigned from multiple sources (e.g.,var x = i32 0; (x, _) = tuple) causes the loop to flip between types infinitely. The set is seeded with locations matching the refined type, then grown monotonically as propagation flows through Copy/Move/Lookup/CallDyn. - Infer pass backward refinement: Phase 4 of
infer_callbackward-refines prior calls whose TypeArgs were inferred entirely from default-typed literals (U64/F64). When a later call reveals the expected type,backward_refine_call()re-extracts constraints, updates TypeArgs, and re-refines Const literals. Includes reverse shape matching (class return type vs expected shape type). Phase 4 must NOT be gated on!subst.empty()— non-generic functions with concrete param types need it too. apply_substwith empty subst: Returnsclone(type_node)unchanged — safe to call unconditionally.navigate_call()helper: Shared FuncName navigation forbackward_refine_callandinfer_call. Filters Function overloads by hand + arity. The arity check in the overload loop makes a post-loopparams->size() != args->size()check redundant.- Store value refinement: The infer pass refines default-typed Const literals stored through typed refs. When a
Storewrites throughref[T],try_refine()is called on the stored value's location to refineu64/f64toT. This makesa.f = 3work whena.fisi32. - CallDyn backward propagation: Phase 4 of
infer_callbackward-refines prior CallDyn results (not just Call results). When a static Call expects typeTfor an arg from a CallDyn (e.g.,u64::+(1, 2)),backward_refine_calldyn()refines the CallDyn's Const args, re-resolves the Lookup (e.g.,u64::+→i32::+), and updates the env. The CallDyn handler setscall_node = stmton default-typed results (when receiver is default) to enable this. Default-ness propagates from the receiver — if the receiver is concrete, Phase 1 of CallDyn handles arg refinement via method param types. - Test conventions: Compiler tests in
testsuite/v/must be self-contained — no external dependencies (nouse "https://..."imports). Use only_builtintypes. Tests should not call FFI functions (use:::name(...)syntax for FFI, not regular function calls). Do NOT writeuse "_builtin"—_builtinis always implicitly available. usefor packages:use "url"imports a package from a git repo URL, making its contents available for unqualified lookup.use x = "url"creates a type aliasxfor the package's top-level scope. Theuse Xform (without quotes) imports a local class/module's contents._builtinis always implicitly imported — never writeuse "_builtin".- Test golden file format:
exit_code.txthas no trailing newline (useprintf '0', notecho).stdout.txtandstderr.txtare empty files for silent tests. Golden directory structure:testsuite/v/<name>/<name>/compile/andtestsuite/v/<name>/<name>/run/. - Verona syntax details: No semicolons after closing braces of control flow (
for,if,while). Semicolons are only needed after statements and field definitions. - Array literal syntax:
::(expr, ...)creates an array literal. Parsed in the structure pass asArrayLit, flattened from Tuple/ExprSeq children, lowered in ANF like tuples but withl_arraylit = Location("array")prefix for tracking. The infer pass does sibling refinement (finds dominant non-default type, refines defaults to match). The reify pass wraps inArray << innerand callsensure_array_reifiedto trigger_builtin::array[T]class reification. ensure_array_reifiedpattern: When a wrapper type (array, ref, cown) is used without an explicitCallthat would navigate its ClassDef, reification must be triggered manually.ensure_array_reifiedlooks up the_builtin::arrayClassDef, builds a subst mappingTto the element type, and callsfind_or_push. Modeled onensure_ref_reified.- Expression binding precedence: Juxtaposition (application) rules live in the dot pass, not the application pass. This makes
a(index)(→a.apply(index)) bind tighter than infix operators, sosum + a(index)parses assum + (a.apply(index)). The dot pass handles: dot access, TripleColon builtins/FFI, and juxtaposition. The application pass handles: Ref, Hash, infix/prefix function calls, and infix/prefix method calls. - Dot consumes arguments:
x.f(y)calls methodfwith argy(dot rule matches first). To callapplyon the result of a field access, use(x.f)(y)(parens force evaluation order) orx.f.apply(y)(explicit method call). This is a deliberate design choice — parsing is type-free and unambiguous. - Match expression syntax:
(match expr { (pattern) -> body; ... }) else (default). Patterns can be type tests(x: T)or value tests(expr). Value tests useTryCallDynto call==— if the method doesn't exist or args don't type-check, the match arm simply fails (nomatch) rather than crashing. Multiple arms are chained as else-if withnomatchsubtraction at each join point. - TryCallDyn: A variant of
CallDynfor fallible dynamic dispatch. At runtime, returns an empty Value if the method doesn't exist (func == nullptr) or if argument types don't match (try_check_argsfails). Used by value match desugaring in sugar.cc. Defined in:vc/lang.h(WF),vc/passes/sugar.cc(desugaring),vbcc/passes/typecheck.cc(type checking),vbci/thread.cc(runtime),vbcc/bytecode.cc(encoding). - Case value vs parameter ambiguity: In lambda params, bare identifiers always parse as
ParamDef(withTypeVartype), never as case valueExprnodes. To use a variable as a case value, it must be wrapped in an expression that doesn't matchParamPat(e.g., a function call, typed literal). This is a deliberate parsing choice — type-free and unambiguous. - Infer pass return type inference: Post-convergence in
process_function(), the return type inference must prefer per-labelexit_envs(which have typetest narrowing from Phase B) over the globalenv. The global env has un-narrowed types (e.g.,x: anyfrom$arg: any), while exit_envs have narrowed types (e.g.,x: i32after typetest). Getting this wrong produces imprecise return types likeUnion(nomatch, any)→ reified asdyn→ hides all downstream type errors. This matches how Const finalization already prioritizes per-label envs. - Compile-error test conventions: Tests expecting compile errors belong under
testsuite/v/compile_only/; they haveexit_code.txt: 1in thecompile/golden directory and norun/directory. The golden files are auto-generated byninja update-dump. - New op/builtin checklist: Adding a new bytecode op requires updates in ~15 places. Use this checklist:
- Token definition:
include/vbcc.h(token def),include/vbci.h(Op enum) - Frontend WFs in
vc/lang.h:wfExprDot(or equivalent early WF),wfPassDot(with<<= Args),wfBodyANF,wfPassANF(with<<= wfDst * wfSrc) - Frontend passes:
dot.cc(builtin registration),anf.cc(lowering pattern),infer.cc(type tracking),reify.cc(IR transformation) - Backend WFs in
include/vbcc.h:wfStatement,wfIR - Backend
Defpattern invbcc/lang.h: manually maintained list of all statement types that define a register — MUST include the new op if it has a dst LocalId - Backend
vbcc/passes/liveness.cc: manually categorized ops for use/def analysis — add to correct category (e.g.,use(Rhs) + def(LocalId)) - Backend
vbcc/bytecode.cc: encoding handler - Backend
vbcc/passes/typecheck.cc: type checking if needed - Interpreter
vbci/thread.cc: op handler + op name in name array Missing any of items 5 or 6 causes "undefined register" errors in later passes, not at the registration site.
- Token definition:
- New
_builtinfiles affect ALL golden files: Adding a new.vfile undervc/_builtin/changes the compilation output for every test (because_builtinis always parsed). This means ALL golden files need regeneration withninja update-dump. - Init function reification: Init functions (declared with inline bodies in
useblocks) are only reified when their lib's FFI symbols are called from reachable code. If no FFI call reaches the lib, the init function won't be reified and won't run. Tests exercising init behavior must include at least one reachable FFI call from the same lib. There is nofinikeyword —initreturnsany, and if the return value is callable (a lambda), the runtime uses it as the finalizer. - Startup ordering for
oncevs FFIinit:Program::run()must initialize the scheduler, then fillmemo_slotsfromMemoInit, and only then run FFIinitcallbacks. Use-block init bodies may calloncestubs, which executeMemoLoadand require populated memo slots. - FFI fini ordering:
Program::run()executes FFI fini callbacks only aftersched.run()has returned. Fini callbacks cannot depend on newly queuedwhenbehaviors making progress; teardown there must be synchronous, or the relevant libuv handle must already beuv_unrefd so loop exit does not depend on scheduler work. callback(f)constructor sugar:callback(f)is shorthand forcallback::create(f)— juxtaposition on a type name calls itscreatemethod. This works for any class with acreatefunction.- FFI wrapper patterns in
_builtin: The_builtin/ffi/directory contains Verona wrappers for FFI builtins. Pattern: define a class withuseblock containing FFI symbols, then export wrapper functions. Functions in_builtin/ffi/are called asffi::func_name(args)from user code. - FFI data passing: When passing a Verona value to an FFI function, the runtime passes a pointer to the data, not to the Verona wrapper type. An
array[u8]is passed asuint8_t*(pointer to the array elements). An object is passed as a pointer to its fields, which looks like a Cstruct(e.g., a class witha: i32; b: i32;looks likestruct { int32_t a; int32_t b; }). This means no special builtins are needed to get raw pointers for FFI — just pass the Verona value directly. - Package development:
use "url" "tag"clones a git repo into_vdeps/<hash>/. For local dev,use "~/dev/pkg" "main"works (local git repo). Changes must be committed to the local repo before the consuming project can see them (the dependency system uses git fetch/checkout). - Idiomatic Verona style:
- Don't use explicit type annotations on literals when inference can determine the type from context. Write
0notusize 0,var result = 0;notvar result = i32 0;. - Use
(obj.field)(args)to callapplyon a field access result:(self.data)(i)indexes into a field that is an array. - Use
Type(args)constructor sugar:string(result)instead ofstring::create(result). Juxtaposition on a type name calls itscreatemethod. - Chain method calls with dot syntax:
self.size.min(other.size). - For zero-extra-arg methods (only
self), call without parens:s.bool,s.size. - Delegate comparison operators: implement
<and derive<=as!(other < self),>asother < self,>=as!(self < other),!=as!(self == other). - Use
!prefix for boolean negation:!(self == other). - Bitmask test pattern:
var result = 0;thenif cond { result = result + N }with powers of 2, returnresult. Exit code 0 means all passed.
- Don't use explicit type annotations on literals when inference can determine the type from context. Write
- Freeze architecture:
freeze()invbci/freeze.ccfreezes a reachable subgraph within a region, making objects immutable with union-find ARC tracking. Key design points:- RC-transfer in SCC union: During SCC detection,
scc_union(child, rep)transferschild.rc - 1to rep (the -1 subtracts the tree edge). Back edges decrementrep.rcbefore the union loop. At SCC completion,set_arc(rep->get_rc())gives the exact external ref count. - Union-by-address: Uses
uintptr_tof the header address as rank (no ties, no storage needed). With path compression, gives O(α(n)) amortized. - Pending loop correctness: The back-edge union loop MUST use
pending.back() != rep(pointer comparison), NOTHeader::find(pending.back()) != rep. Union can change the representative mid-loop, invalidating find-based comparison. - frozen_set pattern: A
std::unordered_set<Header*>tracks objects frozen by THIS call (inserted at PENDING time). Used to distinguish newly-frozen cross edges from pre-existing immutables in the DFS, and to identify unfrozen→frozen refs during the post-DFS scan. - stack_rc adjustment:
stack_adjustment = arc_sum - frozen_cross - unfrozen_to_frozen. The unfrozen scan counts field refs from surviving region objects to newly-frozen objects. - Ownership clearing: Only clear parent/cown ownership when
root == region->get_entry_point(). Sub-regions discovered during DFS are guaranteed to be entered through their entry point (single-entry-point invariant). - Entry points:
Regiontracks the entry point header. Set inset_parent(Region*, Header*)andset_cown_owner(Header*). The entry point is available at all callsites: write barrier hasin->get_header(), drag hasnext_h, cown hascontent.get_header(). - freeze_local: Freezes frame-local objects in place, then delegates heap sub-regions to
freeze()in phase 2.freeze()delegates frame-local roots tofreeze_local(). - Use-after-move in write barrier: When
apply_inneeds the header forset_parent, save it BEFORE the register is cleared (move semantics). Usecontent.get_header()notnext->get_header()after extract. - clear_cown_owner auto-free:
clear_cown_owner()now auto-frees likeclear_parent()(callsfree_region()ifstack_rc == 0). Callers that need to prevent premature free muststack_inc()first (cown destructor and exchange already do this).
- RC-transfer in SCC union: During SCC detection,
- Type system:
Dynis a top type (anything <: Dyn). The bottom type is an emptyUnion(no members). In IRSubtype, the axiom table is keyed by the right operand's type (r->type()lookup inreduce()).
Skills
Task-specific knowledge and procedures are stored in .agents/skills/.
Each skill is a directory with a SKILL.md file containing instructions.
Available skills: add-test, debug, docs-update, review, testsuite, vbci-memory, verona-conventions.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

