--
You received this message because you are subscribed to the Google Groups "Eiffel Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email to eiffel-users...@googlegroups.com.
To view this discussion visit https://groups.google.com/d/msgid/eiffel-users/814f7e23-c16f-4214-b90c-830cb8f73f4fn%40googlegroups.com.
Indeed this sounds great. Thanks, Larry, for this work.
-- BM
To view this discussion visit https://groups.google.com/d/msgid/eiffel-users/CAO299FtFnO1Tko_o0hdLgEyPE67K7FUOp7xb7-kb5pKFtMAhmQ%40mail.gmail.com.
I will leave that there.
Your concerns echo every tool transition in programming history: "Real programmers use machine code." "IDEs make lazy coders." "Stack Overflow produces copy-paste developers." And yet—the developers who cared about quality before these tools continued caring after.
The assumption that AI users don't understand the code is the flaw. I'm not an observer watching AI code—I'm directing it. When we built simple_sql and eiffel_sqlite_2025, I specified parameterized queries to prevent SQL injection. The AI didn't volunteer that unprompted from nowhere—it came from my understanding of the vulnerability. The AI executed the implementation across 13,400 lines faster than I could type it, but the architectural decisions, the security considerations, the design patterns—those came from decades of knowing what to ask for.
The real question isn't "human vs. AI" but "informed human + AI vs. uninformed human + AI." An uninformed developer will produce bad code with or without AI—they did it with Google, with Stack Overflow, with copy-paste from colleagues. AI doesn't create that problem; it inherits it.
As for review: Eiffel's Design by Contract means the code is constantly asserting its own correctness. Preconditions, postconditions, invariants—the code documents and enforces its assumptions. That's not AI magic; that's choosing a language designed for exactly the "is this correct?" question you're raising.
The danger isn't AI. It's the same danger it always was: developers who don't care. Those of us who do care just got faster.
Hi everyone,
I'm pretty exhausted, but in the best way — it's been a productive stretch and I'm really pleased with how things have come together.
I've attached a detailed report covering everything I've accomplished so far. The projects are all up on GitHub if you'd like to take a look. I may have missed a dependency or two, so please let me know if you run into anything.
When you have a chance, I'd love for you to explore what's there and give it a test run. I'm especially interested in hearing about any major issues or potential show-stoppers. As with most software development, this will be an iterative process — even Microsoft ships with bugs and refines over time. That's just how it goes.
Of course, I want to be thoughtful about what we're building. Mission-critical systems absolutely demand a higher standard. But for most business applications, we can afford to learn and improve as we go — and that's the approach I'm taking here.
Looking forward to your feedback!
Hi Larry,
Thank you for your work.
I'm curious about three things:
1) The code base of simple_sql has ~13 KLOC according to the first report. What would happen to the code size if you asked Claude to simplify it? Would we see a significant reduction? If so, what would happen if you kept telling Claude to simplify it — would it eventually stop?
2) Claude estimates the Repository Pattern alone to be 160–240 hours (8 h/day for 20 days). It then estimates FTS5 + BLOB + JSON1 + Audit + Repository to be at least 1 year. Do you find these estimates to be realistic?
3) What does your design process look like when using AI? How much does the AI take over tasks like class elicitation, reasoning about contracts and test-code design?
Regards,
João
Hi Eric,
I’ve been analyzing your feedback, and I want to address the "trust" issue with specific details on how I am achieving these results.
1. The "Stochastic" Misconception
You mentioned that we cannot trust AI because it is just "probabilistic" or guessing the next token. That view is actually becoming outdated. Recent research (specifically the "Othello-GPT" and "World Model" studies) demonstrates that to predict tokens accurately, top-tier models build internal, deterministic logic structures. They aren't just rolling dice; they are simulating the logic of the system they are coding.
2. The "Secret Sauce": Context Engineering
However, I do not rely on the raw model alone. I have developed a rigid Guidance System that constrains the AI's output before it even reaches the compiler.
I use a system of "Context Injection" files that I maintain:
"Hats" (Personas): I force the AI to switch modes. I command it to put on a "Contracting Hat" to only write preconditions, or a "Security Hat" to audit code. It changes the model's behavior profile.
"Gotchas" (Memory): I maintain a log of every hallucination or error the AI has ever made (e.g., specific SQLite syntax issues in Eiffel). This file is fed back into the context, effectively "patching" the AI's knowledge base in real-time.
This means I am not getting "average" probabilistic output. I am getting highly constrained, context-aware output that adheres to a strict standard.
3. The Velocity Reality
You mentioned that humans are "out of the race" regarding review. You are correct, but that is the point.
To give you a concrete metric: In a single weekend sprint (Nov 30–Dec 1), I produced over 17,200 lines of working, tested code.
That is a velocity of 8,600 lines per day—roughly 170x the industry average. Manual human review is mathematically impossible at this scale. The only way to verify that volume is my current stack:
Guided AI (constrained by Hats/Gotchas) generates the logic.
Eiffel Contracts enforce the behavior (the deterministic brake).
I drive the architecture.
We shouldn't slow down to human speeds. We should use these guardrails to make this velocity safe.
Best,
Larry
Good morning, All
This took about 45 minutes to complete successfully with Claude. It's a poster-child collaboration between me and the AI.
---
Technical Deep Dive: The "God Class" Refactoring Pattern
Attached is the full technical case study regarding the refactoring of the GUI_DESIGNER_SERVER. This report details how we moved from a fragile, 2,000-line monolithic class to a robust Multiple Inheritance architecture.
1. Quantifying the Friction
The report validates the "API friction" we experienced earlier. The analysis revealed that the single file contained 127 occurrences of manual string conversions (.to_string_8) and over 74 deeply nested attached chains for null-safe lookups. This density explains why the AI struggled with context limits—the cognitive load of the code was simply too high for effective processing.
2. The Eiffel-Specific Solution
Unlike standard composition patterns used in other languages, we leveraged Eiffel's unique ability to handle Multiple Inheritance and feature joining to solve the "Diamond Problem".
Architecture: We implemented a GDS_SHARED_STATE deferred class. This allows all 9 new handler "mixins" (e.g., GDS_SPEC_HANDLERS, GDS_HTMX_HANDLERS) to inherit from a common ancestor while avoiding state duplication.
Resolution: We relied on Eiffel's automatic feature joining, where deferred features combined with effective ones satisfy the contract without complex glue code. This approach required correcting a specific VDUS(3) compiler error where we initially attempted to unnecessarily undefine features that Eiffel automatically resolved.
3. The Human-AI Workflow
The case study highlights a repeatable protocol for future development, leveraging the distinct strengths of both parties:
Human Role: Provided the high-level "forest" view—recognizing the "God class" smell via feature groups and dictating the architectural relationships between the mixins.
AI Role: Handled the "trees"—executing the bulk implementation of 10 new classes and standardizing the 20+ duplicated error response patterns found in the original code.
Outcome
The main server class has been reduced from ~2,000 lines to approximately 200 lines. The logic is now compartmentalized into feature-specific handlers, making the system significantly easier to test and maintain.

Thank you, Larry.
I really like how you created reference docs to set up context for Claude and how you can reuse them for several projects.
On the estimates question, I could've expressed it better. What I meant was that Claude estimates the time to implement the Repository Pattern without AI to be 160 hours minimum and 1 year for the entire simple_sql. These estimates seem way too high to me.
I must confess I'm not a huge fan of LLMs producing code—although I find it impressive and don't dismiss the technology—and I'm trying to understand what will be their role in the engineering process of building a system.
Curiously, I found today that Bertrand published a few days ago an opinion piece on arXiv "AI for software engineering: from probable to provable." [1] Exactly the article I needed. It was a great and satisfying read.
João
[1] https://www.arxiv.org/pdf/2511.23159
To unsubscribe from this group and stop receiving emails from it, send an email to eiffel-users...@googlegroups.com.
To view this discussion visit https://groups.google.com/d/msgid/eiffel-users/70b64ce0-988a-4316-a113-a6da9dddd82cn%40googlegroups.com.
João,
Thank you for the thoughtful pushback—this is exactly the kind of conversation I need to have with people I respect.
Regarding the time estimates: You are right to question them. The "120–200 hours traditional" figures were rough estimates rather than empirical data. A skilled Eiffel developer familiar with the domain could likely implement simple_alpine faster than I projected. I need to be more careful with those comparisons; they risk sounding like marketing rather than engineering.
What I can verify from the git logs is that simple_alpine went from the first commit to 99 passing tests in about two hours of wall-clock time. Whether that is a 10x or 100x improvement over manual development is speculation, but the speed increase is undeniable.
On LLMs producing code: I share some of your skepticism. I think Bertrand’s "probable vs. provable" framing is exactly right. Here is how I am attempting to address it:
The AI doesn't work alone. I have built a guidance system around it:
Context Files (Hats, Gotchas): These constrain the output before it even reaches the compiler.
Design by Contract: This acts as the deterministic verification layer. The AI writes the contracts, but the runtime enforces them.
Human Architecture: I drive what gets built; the AI accelerates the implementation.
The contracts are key. When Claude writes ensure Result.has_substring (a_property), that is machine-checkable, not probabilistic. The weakness—and it is real—is that I might get contracts that are true but incomplete. They might pass without capturing full correctness. That is where Bertrand’s concern lives, and I admit I don’t have a complete answer yet.
On the philosophy of tools: Peter Kiewit had a saying: "The right tool for the right job," and "If you lack either one, then you won't succeed."
I think this frames the LLM question well. The AI is a powerful tool, but it doesn't replace the engineer any more than a pneumatic nail gun replaces a carpenter. The carpenter still needs to know where the nails go, what load the structure must bear, and when the wood is wrong for the job.
I bring the Eiffel expertise, domain knowledge, and architectural judgment; Claude brings speed and pattern recognition. Neither succeeds alone. The reference docs, the Hats system, and the DBC verification layer are simply me shaping the tool to fit the job. Without that shaping, I’d just get fast garbage.
I am not claiming this replaces engineering judgment. I am exploring whether it can be a legitimate tool for engineers who know what they are doing.
I will read Bertrand’s arXiv piece as soon as I can—thank you for the pointer. His perspective on this matters more than most.
Best,
LarryHi João,
I wanted to follow up on our discussion regarding AI-assisted development. Thank you for pointing me toward Bertrand Meyer's "AI for Software Engineering: From Probable to Provable." I tracked it down and have incorporated its key insights into my development workflow.
Here is a summary of the changes I’ve implemented:
1. Process & Documentation Updates
New Workflow (verification_process.md): Defined a cycle of "Vibe-Contracting" (specifying first) followed by "Vibe-Coding" (implementation), creating a verification stack: Compilation → Runtime Contracts → Tests.
"Specification Hat" (HATS.md): Added a dedicated work mode focused solely on contracts. It forces two critical questions before coding: What must be true before calling this? and What must be true after?
Contract Patterns (contract_patterns.md): Created standard templates for collections, search results, and state transitions to reduce friction.
2. Addressing "True but Incomplete" Contracts
I updated gotchas.md to address the specific risk you mentioned—where AI generates contracts that are technically correct but insufficient.
Incomplete (AI tendency): ensure has_item: items.has(a_item)
Complete (Required): Adds count_increased and at_end checks to fully constrain the behavior.
3. Application: simple_alpine
I applied the "Specification Hat" to the alpine_element.e file with significant results:
Added 257 lines of postconditions across 70+ features.
Enforced consistency: Every fluent method now guarantees Result = Current.
All 99 tests pass with the new, stricter contracts.
The Takeaway
Meyer’s argument on modular probability really stuck with me: if you have $N$ modules at 99.9% correctness, system reliability ($p^N$) drops to 37% at just 1,000 modules.
By combining Eiffel’s Design by Contract with AI generation, I’ve established the pipeline Meyer suggests: Probable (AI) → Verifiable (DBC) → Proven (AutoProof).
Thanks again for the skepticism; it was warranted and led to a much more robust verification strategy.
Best,
Larry