fieldtest-form-a: 4 fixtures + spec report; agent doctrine update
Boss-dispatched fieldtest at milestone close. Agent authored 4 .ail fixtures (factorial smoke + Show user-ADT + user-class Describe with two instances + two-module workspace) from DESIGN.md + form_a.md only (no compiler-source reads, no spec-of-milestone reads). All four fixtures `ail check` ok and `ail run` produces expected stdout. Findings (1 bug, 1 friction, 2 spec_gaps, 3 working): - [bug] instance-method-body unbound-var bypasses `ail check` — forma_3 first attempt called `str_concat` inside the instance method body; `ail check` returned ok, `ail build` died with the monomorphise_workspace "unknown identifier" diagnostic. Same shape at fn-body level correctly fires `[unbound-var]` at check time. Next: debug skill, RED-first against `ail check`. - [friction] no `str_concat` primitive. Every realistic Show MyType body wants string concatenation; the absence forced the agent to shape examples around bare int_to_str / ctor-arity-1 patterns. Next: small planner tidy iter wiring `str_concat` symmetric to `str_clone` and `int_to_str`. - [spec_gap] form_a.md has zero references to class, instance, constraint, or method productions — pre-22 surface only. The form-a-default-authoring milestone made .ail the authoring form, but the form_a spec doc remains pre-typeclass. - [spec_gap] form_a.md leaves the class-qualifier ambiguity in `(instance (class X))` unspecified — bare-class-name vs canonical- form rule from mq.1 is not documented at the surface level. The agent picked the bare-name reading from the corpus; the canonical- form reading is equally plausible from the schema. Boss-side cleanup at commit time: - Deleted 8 stale .ail.json sidecars in examples/fieldtest/ (4 forma_* derived by the fieldtester per old dual-form workflow + 4 pre-existing floats_* from the prior fieldtest milestone that iter form-a.1 T8 missed because the bash deletion loop globbed only examples/*.ail.json direct children). - Updated skills/fieldtest/agents/ailang-fieldtester.md to remove the now-obsolete "generate canonical JSON sidecar" step (Phase 3 rewritten + Iron Law + Reading list + Common Rationalisations + Red Flags all aligned to the post-form-a single-form doctrine). cargo test --workspace: 557 passed, 0 failed, 3 ignored (unchanged from audit-form-a — the fieldtest fixtures are standalone, not referenced by any test). Findings deferred to follow-up iters; the milestone close itself is still clean.
This commit is contained in:
@@ -1 +0,0 @@
|
||||
{"defs":[{"body":{"cond":{"args":[{"name":"k","t":"var"},{"lit":{"kind":"int","value":0},"t":"lit"}],"fn":{"name":"==","t":"var"},"t":"app"},"else":{"args":[{"name":"n","t":"var"},{"args":[{"lit":{"bits":"3fe0000000000000","kind":"float"},"t":"lit"},{"args":[{"name":"x","t":"var"},{"args":[{"name":"n","t":"var"},{"name":"x","t":"var"}],"fn":{"name":"/","t":"var"},"t":"app"}],"fn":{"name":"+","t":"var"},"t":"app"}],"fn":{"name":"*","t":"var"},"t":"app"},{"args":[{"name":"k","t":"var"},{"lit":{"kind":"int","value":1},"t":"lit"}],"fn":{"name":"-","t":"var"},"t":"app"}],"fn":{"name":"newton_iter","t":"var"},"t":"app","tail":true},"t":"if","then":{"name":"x","t":"var"}},"doc":"Recurse k times applying x' = 0.5 * (x + n/x).","kind":"fn","name":"newton_iter","params":["n","x","k"],"type":{"effects":[],"k":"fn","params":[{"k":"con","name":"Float"},{"k":"con","name":"Float"},{"k":"con","name":"Int"}],"ret":{"k":"con","name":"Float"}}},{"body":{"args":[{"name":"n","t":"var"},{"name":"n","t":"var"},{"lit":{"kind":"int","value":20},"t":"lit"}],"fn":{"name":"newton_iter","t":"var"},"t":"app"},"doc":"20-step Newton iteration starting from x0 = n.","kind":"fn","name":"sqrt","params":["n"],"type":{"effects":[],"k":"fn","params":[{"k":"con","name":"Float"}],"ret":{"k":"con","name":"Float"}}},{"body":{"args":[{"args":[{"lit":{"bits":"4000000000000000","kind":"float"},"t":"lit"}],"fn":{"name":"sqrt","t":"var"},"t":"app"}],"op":"io/print_float","t":"do"},"kind":"fn","name":"main","params":[],"type":{"effects":["IO"],"k":"fn","params":[],"ret":{"k":"con","name":"Unit"}}}],"imports":[],"name":"floats_1_newton_sqrt","schema":"ailang/v0"}
|
||||
@@ -1 +0,0 @@
|
||||
{"defs":[{"ctors":[{"fields":[],"name":"Nil"},{"fields":[{"k":"con","name":"Int"},{"k":"con","name":"IntList"}],"name":"Cons"}],"kind":"type","name":"IntList"},{"body":{"arms":[{"body":{"name":"acc","t":"var"},"pat":{"ctor":"Nil","fields":[],"p":"ctor"}},{"body":{"args":[{"name":"t","t":"var"},{"args":[{"name":"acc","t":"var"},{"name":"h","t":"var"}],"fn":{"name":"+","t":"var"},"t":"app"}],"fn":{"name":"sum_acc","t":"var"},"t":"app","tail":true},"pat":{"ctor":"Cons","fields":[{"name":"h","p":"var"},{"name":"t","p":"var"}],"p":"ctor"}}],"scrutinee":{"name":"xs","t":"var"},"t":"match"},"doc":"Tail-recursive sum with accumulator.","kind":"fn","name":"sum_acc","params":["xs","acc"],"type":{"effects":[],"k":"fn","params":[{"k":"con","name":"IntList"},{"k":"con","name":"Int"}],"ret":{"k":"con","name":"Int"}}},{"body":{"arms":[{"body":{"name":"acc","t":"var"},"pat":{"ctor":"Nil","fields":[],"p":"ctor"}},{"body":{"args":[{"name":"t","t":"var"},{"args":[{"name":"acc","t":"var"},{"lit":{"kind":"int","value":1},"t":"lit"}],"fn":{"name":"+","t":"var"},"t":"app"}],"fn":{"name":"count_acc","t":"var"},"t":"app","tail":true},"pat":{"ctor":"Cons","fields":[{"p":"wild"},{"name":"t","p":"var"}],"p":"ctor"}}],"scrutinee":{"name":"xs","t":"var"},"t":"match"},"doc":"Tail-recursive length with accumulator.","kind":"fn","name":"count_acc","params":["xs","acc"],"type":{"effects":[],"k":"fn","params":[{"k":"con","name":"IntList"},{"k":"con","name":"Int"}],"ret":{"k":"con","name":"Int"}}},{"body":{"args":[{"args":[{"args":[{"name":"xs","t":"var"},{"lit":{"kind":"int","value":0},"t":"lit"}],"fn":{"name":"sum_acc","t":"var"},"t":"app"}],"fn":{"name":"int_to_float","t":"var"},"t":"app"},{"args":[{"args":[{"name":"xs","t":"var"},{"lit":{"kind":"int","value":0},"t":"lit"}],"fn":{"name":"count_acc","t":"var"},"t":"app"}],"fn":{"name":"int_to_float","t":"var"},"t":"app"}],"fn":{"name":"/","t":"var"},"t":"app"},"doc":"Mean as Float = sum / count, both promoted via int_to_float.","kind":"fn","name":"mean","params":["xs"],"type":{"effects":[],"k":"fn","params":[{"k":"con","name":"IntList"}],"ret":{"k":"con","name":"Float"}}},{"body":{"args":[{"args":[{"args":[{"lit":{"kind":"int","value":1},"t":"lit"},{"args":[{"lit":{"kind":"int","value":2},"t":"lit"},{"args":[{"lit":{"kind":"int","value":3},"t":"lit"},{"args":[{"lit":{"kind":"int","value":4},"t":"lit"},{"args":[{"lit":{"kind":"int","value":6},"t":"lit"},{"args":[],"ctor":"Nil","t":"ctor","type":"IntList"}],"ctor":"Cons","t":"ctor","type":"IntList"}],"ctor":"Cons","t":"ctor","type":"IntList"}],"ctor":"Cons","t":"ctor","type":"IntList"}],"ctor":"Cons","t":"ctor","type":"IntList"}],"ctor":"Cons","t":"ctor","type":"IntList"}],"fn":{"name":"mean","t":"var"},"t":"app"}],"op":"io/print_float","t":"do"},"kind":"fn","name":"main","params":[],"type":{"effects":["IO"],"k":"fn","params":[],"ret":{"k":"con","name":"Unit"}}}],"imports":[],"name":"floats_2_average_int_list","schema":"ailang/v0"}
|
||||
@@ -1 +0,0 @@
|
||||
{"defs":[{"body":{"cond":{"args":[{"name":"x","t":"var"}],"fn":{"name":"is_nan","t":"var"},"t":"app"},"else":{"cond":{"args":[{"name":"x","t":"var"},{"lit":{"bits":"7fe1ccf385ebc8a0","kind":"float"},"t":"lit"}],"fn":{"name":">","t":"var"},"t":"app"},"else":{"cond":{"args":[{"name":"x","t":"var"},{"lit":{"bits":"ffe1ccf385ebc8a0","kind":"float"},"t":"lit"}],"fn":{"name":"<","t":"var"},"t":"app"},"else":{"lit":{"kind":"int","value":1},"t":"lit"},"t":"if","then":{"lit":{"kind":"int","value":0},"t":"lit"}},"t":"if","then":{"lit":{"kind":"int","value":0},"t":"lit"}},"t":"if","then":{"lit":{"kind":"int","value":-1},"t":"lit"}},"doc":"-1=NaN, 0=infinite, 1=finite. Uses is_nan + abs > huge.","kind":"fn","name":"classify","params":["x"],"type":{"effects":[],"k":"fn","params":[{"k":"con","name":"Float"}],"ret":{"k":"con","name":"Int"}}},{"body":{"lhs":{"args":[{"args":[{"lit":{"bits":"4018000000000000","kind":"float"},"t":"lit"},{"lit":{"bits":"4008000000000000","kind":"float"},"t":"lit"}],"fn":{"name":"/","t":"var"},"t":"app"}],"op":"io/print_float","t":"do"},"rhs":{"lhs":{"args":[{"args":[{"args":[{"lit":{"bits":"4018000000000000","kind":"float"},"t":"lit"},{"lit":{"bits":"4008000000000000","kind":"float"},"t":"lit"}],"fn":{"name":"/","t":"var"},"t":"app"}],"fn":{"name":"classify","t":"var"},"t":"app"}],"op":"io/print_int","t":"do"},"rhs":{"lhs":{"args":[{"args":[{"lit":{"bits":"3ff0000000000000","kind":"float"},"t":"lit"},{"lit":{"bits":"0000000000000000","kind":"float"},"t":"lit"}],"fn":{"name":"/","t":"var"},"t":"app"}],"op":"io/print_float","t":"do"},"rhs":{"lhs":{"args":[{"args":[{"args":[{"lit":{"bits":"3ff0000000000000","kind":"float"},"t":"lit"},{"lit":{"bits":"0000000000000000","kind":"float"},"t":"lit"}],"fn":{"name":"/","t":"var"},"t":"app"}],"fn":{"name":"classify","t":"var"},"t":"app"}],"op":"io/print_int","t":"do"},"rhs":{"lhs":{"args":[{"args":[{"lit":{"bits":"0000000000000000","kind":"float"},"t":"lit"},{"lit":{"bits":"0000000000000000","kind":"float"},"t":"lit"}],"fn":{"name":"/","t":"var"},"t":"app"}],"op":"io/print_float","t":"do"},"rhs":{"args":[{"args":[{"args":[{"lit":{"bits":"0000000000000000","kind":"float"},"t":"lit"},{"lit":{"bits":"0000000000000000","kind":"float"},"t":"lit"}],"fn":{"name":"/","t":"var"},"t":"app"}],"fn":{"name":"classify","t":"var"},"t":"app"}],"op":"io/print_int","t":"do"},"t":"seq"},"t":"seq"},"t":"seq"},"t":"seq"},"t":"seq"},"kind":"fn","name":"main","params":[],"type":{"effects":["IO"],"k":"fn","params":[],"ret":{"k":"con","name":"Unit"}}}],"imports":[],"name":"floats_3_safe_division","schema":"ailang/v0"}
|
||||
@@ -1 +0,0 @@
|
||||
{"defs":[{"body":{"args":[{"args":[{"lit":{"bits":"40091eb851eb851f","kind":"float"},"t":"lit"}],"fn":{"name":"float_to_str","t":"var"},"t":"app"}],"op":"io/print_str","t":"do"},"kind":"fn","name":"main","params":[],"type":{"effects":["IO"],"k":"fn","params":[],"ret":{"k":"con","name":"Unit"}}}],"imports":[],"name":"floats_4_float_to_str_reach","schema":"ailang/v0"}
|
||||
@@ -0,0 +1,30 @@
|
||||
(module forma_1_factorial
|
||||
|
||||
(fn fact_acc
|
||||
(doc "Tail-recursive factorial accumulator: fact_acc(n, acc) = n!*acc.")
|
||||
(type
|
||||
(fn-type
|
||||
(params (con Int) (con Int))
|
||||
(ret (con Int))))
|
||||
(params n acc)
|
||||
(body
|
||||
(if (app == n 0)
|
||||
acc
|
||||
(tail-app fact_acc (app - n 1) (app * acc n)))))
|
||||
|
||||
(fn fact
|
||||
(doc "Factorial of a non-negative Int.")
|
||||
(type
|
||||
(fn-type
|
||||
(params (con Int))
|
||||
(ret (con Int))))
|
||||
(params n)
|
||||
(body (app fact_acc n 1)))
|
||||
|
||||
(fn main
|
||||
(type (fn-type (params) (ret (con Unit)) (effects IO)))
|
||||
(params)
|
||||
(body
|
||||
(seq
|
||||
(do io/print_int (app fact 5))
|
||||
(do io/print_int (app fact 10))))))
|
||||
@@ -0,0 +1,31 @@
|
||||
(module forma_2_show_color
|
||||
|
||||
(data Color
|
||||
(doc "A small 3-variant enum used to exercise instance Show on a user ADT.")
|
||||
(ctor Red)
|
||||
(ctor Green)
|
||||
(ctor Blue))
|
||||
|
||||
(instance
|
||||
(class prelude.Show)
|
||||
(type (con Color))
|
||||
(method show
|
||||
(body
|
||||
(lam
|
||||
(params (typed c (con Color)))
|
||||
(ret (con Str))
|
||||
(body
|
||||
(match c
|
||||
(case (pat-ctor Red) "Red")
|
||||
(case (pat-ctor Green) "Green")
|
||||
(case (pat-ctor Blue) "Blue")))))))
|
||||
|
||||
(fn main
|
||||
(type (fn-type (params) (ret (con Unit)) (effects IO)))
|
||||
(params)
|
||||
(body
|
||||
(seq
|
||||
(seq
|
||||
(app print (term-ctor Color Red))
|
||||
(app print (term-ctor Color Green)))
|
||||
(app print (term-ctor Color Blue))))))
|
||||
@@ -0,0 +1,58 @@
|
||||
(module forma_3_user_class_describe
|
||||
|
||||
(class Describe
|
||||
(doc "A user-defined typeclass: produce a short Str describing a value.")
|
||||
(param a)
|
||||
(method describe
|
||||
(type (fn-type (params (borrow a)) (ret (con Str))))))
|
||||
|
||||
(data Shape
|
||||
(ctor Circle (con Int))
|
||||
(ctor Square (con Int)))
|
||||
|
||||
(instance
|
||||
(class Describe)
|
||||
(type (con Int))
|
||||
(method describe
|
||||
(body
|
||||
(lam
|
||||
(params (typed n (con Int)))
|
||||
(ret (con Str))
|
||||
(body (app int_to_str n))))))
|
||||
|
||||
(instance
|
||||
(class Describe)
|
||||
(type (con Shape))
|
||||
(method describe
|
||||
(body
|
||||
(lam
|
||||
(params (typed s (con Shape)))
|
||||
(ret (con Str))
|
||||
(body
|
||||
(match s
|
||||
(case (pat-ctor Circle r)
|
||||
(app int_to_str r))
|
||||
(case (pat-ctor Square w)
|
||||
(app int_to_str w))))))))
|
||||
|
||||
(fn announce
|
||||
(doc "Polymorphic announcer: describe a value then print the result.")
|
||||
(type
|
||||
(forall (vars a)
|
||||
(constraints (constraint Describe a))
|
||||
(fn-type
|
||||
(params (borrow a))
|
||||
(ret (con Unit))
|
||||
(effects IO))))
|
||||
(params x)
|
||||
(body (do io/print_str (app describe x))))
|
||||
|
||||
(fn main
|
||||
(type (fn-type (params) (ret (con Unit)) (effects IO)))
|
||||
(params)
|
||||
(body
|
||||
(seq
|
||||
(seq
|
||||
(app announce 42)
|
||||
(app announce (term-ctor Shape Circle 3)))
|
||||
(app announce (term-ctor Shape Square 5))))))
|
||||
@@ -0,0 +1,22 @@
|
||||
(module forma_4_intmath_lib
|
||||
|
||||
(fn square
|
||||
(doc "Multiply an Int by itself.")
|
||||
(type (fn-type (params (con Int)) (ret (con Int))))
|
||||
(params x)
|
||||
(body (app * x x)))
|
||||
|
||||
(fn cube
|
||||
(doc "Raise an Int to the third power.")
|
||||
(type (fn-type (params (con Int)) (ret (con Int))))
|
||||
(params x)
|
||||
(body (app * x (app square x))))
|
||||
|
||||
(fn abs_int
|
||||
(doc "Absolute value of an Int.")
|
||||
(type (fn-type (params (con Int)) (ret (con Int))))
|
||||
(params x)
|
||||
(body
|
||||
(if (app < x 0)
|
||||
(app - 0 x)
|
||||
x))))
|
||||
@@ -0,0 +1,13 @@
|
||||
(module forma_4_intmath_main
|
||||
|
||||
(import forma_4_intmath_lib)
|
||||
|
||||
(fn main
|
||||
(type (fn-type (params) (ret (con Unit)) (effects IO)))
|
||||
(params)
|
||||
(body
|
||||
(seq
|
||||
(seq
|
||||
(do io/print_int (app forma_4_intmath_lib.square 7))
|
||||
(do io/print_int (app forma_4_intmath_lib.cube 3)))
|
||||
(do io/print_int (app forma_4_intmath_lib.abs_int (app - 0 42)))))))
|
||||
Reference in New Issue
Block a user