Jobins / decisions.md
Abhisingh-18's picture
Mirror of github.com/Abhisingh18/Jobins
b6c100d verified
|
Raw
History Blame Contribute Delete
2.34 kB

Engineering Decisions

  • I considered charging simulated cost only for completed LLM calls but chose to also charge a call slot for timed-out/failed calls because a timeout still consumed real wall-clock and compute resources, and an agent that could retry failures for free would have an effectively unlimited call budget under a flaky model server.

  • I considered a separate LLM call for reflection after every tool call but chose tiered reflection (deterministic rules first, LLM reflection piggybacked as a mandatory progress_check field on the next THINK call) because with a 10-call budget, dedicated reflection calls would consume up to half the budget on meta-reasoning; rules catch the common failure cases (errors, empty results, identical repeats) for zero calls.

  • I considered llama3.1:8b for stronger reasoning but chose llama3.2:3b because the target machine is CPU-only with 7.7 GB RAM — an 8B model would swap and make each of the 10 calls take minutes, and a smaller model that answers in seconds exercises the budget/replanning machinery far better than a smarter model that times out.

  • I considered DuckDuckGo HTML scraping or a paid search API (Tavily) but chose the ddgs library because it needs no API key (single-command reproducibility for evaluators) while still exercising real network failure modes (timeouts, rate limits) that the tool error taxonomy and replanning path must handle.

  • I considered mapping the ^ (XOR) AST node to pow in the calculator but chose textually rewriting ^ to ** before parsing because the AST mapping keeps XOR's precedence (looser than *) and silently computed 1000*(1.05)^10 as (1000*1.05)**10 — a wrong-answer bug observed live in testing — while the textual rewrite gives ^ the power precedence every real calculator uses.

  • I considered killing execution with sys.exit() when the budget is hit but chose raising a typed BudgetExceededError caught only at the orchestrator level because the agent must report exactly what it completed — an exception carries the budget snapshot up to the reporting layer, while sys.exit() would discard the partial state the assignment explicitly asks for.