Skip to content

FAQ

Answers to the questions that come up most often in the team Signal chats (SolidWorks Engineers, CadQuery Engineers, Fidaris' Team, Ilia's Team, Harnesses). Where a rule changed over time, the current rule is given. Last compiled Oct 27, 2026.

If your question isn't here, ask in your team chat and ping Jennifer, your team lead, or Igor (harnesses) directly.

Getting started

Q: What is an RL environment task, and where is the full spec?

A: A task is a Before model, a Prompt (task.txt), an After reference solution, a checklist, and 5–10 Defective examples. "I made this CAD model" is not a task because there is nothing to grade. Read Building RL Environments for CAD before building anything.

Q: What should my first task be?

A: New hires usually start with one of two things: pick 5 assemblies related to your real engineering experience and design challenging tasks for them, or build 5–10 defective solutions for your take-home assignment. Confirm with your team lead before starting.

Q: Which email do I use for accounts and access?

A: Your storygold.com email (firstname.lastname@storygold.com). Use it for Google Drive, GitHub access, the ABC dataset, and any software sign-ups. If you lost Drive access, check you're signed in with the StoryGold account, then request access again.

Q: How do I get a Claude / Astra / Copilot subscription, or a SolidWorks license?

A: Message Jennifer (or Heinrich for subscriptions). Request Copilot through GitHub and Jennifer will approve it. If a license charge is declined, DM Jennifer for a new card.

Q: I can't access the GitHub repo or a Google Doc linked in the sheet.

A: The repos are private. Post your GitHub username in your team chat to be added. Drive folders are shared on request.

Q: Where do I post my daily update?

A: A bot posts "Please post your daily update below" in each team chat every weekday. Reply in the thread with what you finished, what you're working on, and blockers, plus how Astra/Claude did on your task with a % estimate and pictures where relevant. Fidaris' team posts only in the Fidaris team chat. There's no fixed time; post when you finish your day. If you miss one, your lead will follow up.

Q: Is there a deadline for tasks?

A: "ASAP." Fixes that block a customer delivery are flagged as priority in chat. If a spec is unclear, ask right away rather than waiting.

Q: Who reviews my work?

A: Your team lead (Fidaris or Ilia) QAs all work first. Only then does it go to the harness engineers (Igor's team). Before reporting a task as complete in your daily update, upload everything to Drive and notify your lead. On Ilia's team, a task is complete only when every checkbox in the CAD Team Tracker is checked and the row is green.

Q: Should I check with anyone before starting my next task?

A: Yes. Tell your team lead your idea before you start. They'll assess whether it's challenging enough for Astra so you don't spend days on a task that turns out too easy. Also put your name as POC on the task in the shared sheet so nobody duplicates it.

Task design and difficulty

Q: Must I run an AI model on the task before building the After and Defectives?

A: Yes. Run the Before + Prompt through GPT-6 Astra and Claude Opus 5.5 with try_model.py in cad-eval-set first. Open what it built and judge it yourself. If the AI gets more than about 60% right, make the task harder or pick a different one. Under 20% is ideal. This applies to tasks already in progress too. Tasks found too easy should be removed from the task sheet and Jennifer told.

Q: How do I judge the AI's score?

A: Estimate how much of the human work the AI did. If a human needs 10 hours from scratch and the AI's output brings that to 5, the AI scored 50%. Judge the files it handed back, not its description. Test many things: a model can look right but have no internal details, broken mates, a messy feature tree, or missing articulation. Messy but geometrically correct output counts as partially failed.

Q: One model does well on my task and another does badly. Do I continue?

A: Yes. If either Astra or Claude does poorly, the task is worth making. Don't simplify a task that AI fails. Best is a task both are bad at.

Q: Doesn't rewarding low AI scores just reward ambiguous prompts?

A: No. The goal is a task a human expert could do correctly without lots of clarifying questions, but that AI still fails. If a human couldn't do it because it's ambiguous, that's a bad task. Write the prompt as for a human, not for an AI.

Q: How detailed should the prompt be?

A: Just detailed enough for an experienced colleague to understand it. Write it the way a lead engineer briefs a strong contractor they trust: requirement, numbers, constraints, reason, then stop. You may use a long, detailed prompt to help yourself build the After faster, but the test prompt must not be a recipe. Supporting material you'd give a human (a render of the desired look, drawings) is fine and encouraged. See the BAD/BETTER example in the onboarding guide.

Under-specified: two engineers would produce very different results and you'd argue about which is right; a checklist item isn't traceable to the prompt. Over-specified: the prompt takes longer to write than the change takes to make; it reads like a tutorial.

Q: How complex does the model need to be?

A: It must be or resemble a real engineering task, not a toy. At least 100+ faces (500+ is best), and the change itself should take a professional 2–6 hours. Ask "could this actually be manufactured?" Taking a real existing assembly (GrabCAD, papacad.com, traceparts.com, purchased models) and converting it is preferred over modelling from scratch. If a model doesn't look complex on its own, place it in a larger assembly. Single parts with no movement, articulation or mating are too easy.

Q: The task might take 4 hours on a messy model but 30 minutes on a well-built parametric one. Which does the 2–6 hour estimate assume?

A: Either can be a valid task. A 2–6 hour change on a poorly structured model is one option. Preferably, the task implements a brand-new requirement on a well-structured model, for example "this circular table doesn't rotate; make it rotate around its center."

Q: Can I use the same base model for several tasks?

A: Not as separate tasks. Combine them into one task with multiple parts or subtasks, as long as the modifications don't contradict each other.

Q: What is AI currently bad at? Where should I focus?

A: Reported weak spots: making mechanisms actually move (joints, mates), assembling many parts correctly, completeness on big products, matching dimensions exactly from 2D drawings, undimensioned placements in assembly drawings, keeping parametric intent (equations, configurations), welded frames and weldments (it makes them monolithic), fastener placement, cable and pipe routing, surface and freeform modelling, PCBs, reverse engineering from limited documentation, spatial common sense, technical drawing generation (tolerances, datums, threads). AI is good at: single parts from fully dimensioned drawings, rebuilding from a supplied STEP, small assemblies, laser or structured-light scans. When you find a weakness, make about 5 tasks around it with different assemblies. Many people are already on 3D-scan reverse engineering, so look for other areas.

Q: Can I make tasks about feature-tree quality or "modelling like a human engineer" rather than geometry?

A: Yes, if the harness can describe exactly what's wrong and the AI is shown to do poorly. Keep in mind evaluation can be subjective and these tasks may not look complex.

Q: Can I include simulation requirements?

A: Encouraged. The client (GDM) wants simulation as part of the design loop ("design a part whose stress doesn't exceed X"), not a tacked-on check. Prefer not stating boundary conditions so the AI has to infer them. Grade mesh-independent quantities (tip displacement, reactions, stress away from notches), not peak stress at sharp edges. Different results across FreeCAD and ANSYS from meshing are not a failure. SimulationXpress only handles single parts.

Q: Can I use SolidWorks add-ins (Plastics, Simulation, Inspection)? Should I use FreeCAD or SolidWorks?

A: Current guidance: include simulations whenever possible; use FreeCAD wherever it's sufficient; use SolidWorks if FreeCAD is too hard. Add-ins are allowed, but flag which paid add-ons a task requires so the customer can decide to buy or reject it.

Q: Can I make tasks in NX, Creo, CATIA or KOMPAS-3D?

A: No. Tasks are SolidWorks and FreeCAD. Neither current client has NX and Google explicitly asked for none. Reverse-engineering tasks may use vendor-neutral input/output (.PLY in, .STEP out). Export Creo/NX sources to STEP when sharing.

Q: A backlog task only has Before and After. Where are the task.txt and checklist?

A: They may not exist. Write them yourself from the differences between Before and After. If a backlog task was done in software we don't use (e.g. ANSYS), skip it.

Writing the task and checklist

Q: How much effort should the Task and Checklist texts get?

A: About half the work. Before finalizing, check: clarity (no vague wording or multiple interpretations), consistency (no contradictions between Task, Checklist, Before and After), completeness (every Task requirement appears in the Checklist), accuracy (the After actually meets every requirement), and engineering logic (requirements are reasonable and objectively verifiable). Reread with fresh eyes. Using ChatGPT or Claude to review your text for contradictions and missing checks is encouraged, but use your own judgment.

Q: Should the checklist include general CAD quality rules (defined sketches, clean tree)?

A: Not unless that is the task's main goal. Those requirements are subjective and need dedicated tasks. They are still expected of every model (see below).

Q: Should the prompt say how the task is graded?

A: No. The instruction states requirements, not grader thresholds. Use the standard parametric sentence from the repo's INSTRUCTIONS.md verbatim.

Model quality and file rules

Q: What are the baseline CAD quality requirements?

A: Clean, editable feature trees. Fully defined sketches with proper dimensions and constraints. No rebuild errors or broken external references. In assemblies, parts positioned by mates with no unnecessary fixed or floating components. Moving mechanisms keep their required freedom. Every model must be parametric by default, whether or not the prompt says so. Start using equations, global variables and configurations now.

Q: Must all names be in English?

A: Yes, for all future tasks: file names, parts, assemblies, sketches, features, configurations. Check names inside the CAD models, not just file names. No need to rename old projects.

Q: Can I use imported geometry (GrabCAD, STEP) in the After?

A: Geometry that is new relative to Before must be modelled manually with a complete feature tree. Imported geometry already in Before may stay unchanged in After. Standard, catalog or purchased parts that the AI could also find online are an exception, but model even those if they're not too complex. Downloading from GrabCAD is not enough on its own; check its feature tree and rebuild where needed.

Q: Can I use AI to convert STEP to SLDPRT/SLDASM?

A: Yes, as long as you review the result and fix the feature tree: missing dimensions, constraints and relations must be added manually.

Q: Do PCBs need a full feature tree?

A: Generally no. A PCB with components can sit in Before or be added in After as a purchased assembly. If the task requires redesigning the board (shape, component positions), those changes need a proper feature tree.

Q: Which SolidWorks version?

A: SolidWorks 2026. FreeCAD 1.1.x.

Q: Can I use SolidWorks Maker / 3DEXPERIENCE edition?

A: Not for anything deliverable. Before, After and Defectives must open in standard desktop SolidWorks (Standard or Professional). Maker files cannot be opened in Professional/Standard and there's no direct conversion. Use the Maker license only for AI test runs on the VM. Build defectives and deliverables on your own machine with the higher license.

Q: What goes in the Before and After folders?

A: Before: everything the agent needs to start, and nothing else. The test is "what would you hand a new human engineer?" Usually the top-level assembly plus every referenced part, plus any STEP, DXF, drawings, PDFs, images or spreadsheets the task needs. After: whatever the correct output is, usually the edited model, but it could be a markdown file, spreadsheet or drawing if that's the deliverable. Do not include files the agent isn't asked to produce, except the screenshot. Remove .SLDDRW files from 2D-to-3D task inputs, since they reference the model the AI is supposed to create. Include input.PNG and solution.PNG.

Q: Before and After share most files. Do I really copy them into both?

A: Yes. Each folder must open by itself with no missing references.

Q: I noticed something broken in the After or a Defective. Can I fix it?

A: Not unless the prompt asks for that change. Anything unrelated must be fixed in both Before and After, or in neither. The only difference between Before and After should be the requested change.

Q: The Before model has missing dependencies or rebuild errors the prompt doesn't mention.

A: Before and After must have the same issues, unless fixing them is the task. Usually you'll want to fix them in both before you start. If the Before rebuilds with three unrelated warnings, the After should have the same three.

Q: Where do I find Before models?

A: Your own past work, GrabCAD, Thingiverse, Cults, Printables, vendor and standard-part libraries (McMaster-Carr, Misumi, manufacturer STEP downloads), hardware projects on GitHub, or build your own. Beware: public GrabCAD/Onshape models are often in the AI's training data and get reproduced near-perfectly. Prefer non-public sources: our Drive, team-designed parts, vmasshtabe.ru, PapaCAD, Yaskawa, purchased packages.

Q: What does the agent have access to while doing the task?

A: Everything a human at a workstation has: full SolidWorks with add-ins, the file system with Before and Prompt, and the internet. It can look up standards and download catalog parts. Don't treat "knows the ISO 4762 thread pitch" as a skill being tested. If you want to constrain what it uses, say so in the prompt and make sure the verifier can check it.

Defective (adversarial) examples

Q: How many defectives, and how many defects each?

A: 5–10 per task, each with exactly one defect, the one its name describes. A model with two defects can't tell you which one the harness caught. Make at least one that fails each checklist criterion. Don't spend too much time on them, and include PNGs.

Q: How must defectives be named and structured?

A: Folder name and top assembly file name must match exactly, e.g. examples/adversarial_foo/adversarial_foo.SLDASM, lowercase with underscores. The grader finds the model by that rule and silently skips the folder otherwise. If you rename, rename the folder, the top file and the task.toml entry together. Each defective's deliverables (drawings, STEP, report) must be made from that defective's own geometry.

Q: Can AI generate the defectives?

A: Yes, with tools/make_adversarial.py. Write adversarial_instructions.md in the task folder: a preamble describing the correct model in numbers and what must not change, then one ## adversarial_<defect> section per model. Run from the repo with SolidWorks open and don't touch SolidWorks during the run. Use --list to check sections, --max-turns 200 when unattended. Output lands in _runs/adv_<name>_<model>_<time>/. Nothing is copied to examples/ automatically: read changed.md, open the model, confirm it has only the intended defect, then copy it over. Always git pull first; the tool gets fixes often.

Q: Should defectives be hand-broken models or real AI outputs?

A: Both. The client wants real agent outputs included alongside manually broken samples, to confirm genuine solutions pass the verifier.

Running AI tests (try_model.py) and VMs

Q: Which models do I test with?

A: GPT-6 Astra (gpt) and Claude Opus 5.5 (claude:opus5.5). The default claude route is Fable 5.1. Always git pull first, in every repo you use.

Q: How do I run try_model on a FreeCAD task versus SolidWorks?

A: Same folder shape (environment/ with the before model as input.FCStd, and instruction.md naming the deliverable, e.g. "Save your result as /app/solution.FCStd") and same command: python tools\try_model.py claude tasks\my_task. SolidWorks runs on the host and drives your open SolidWorks. FreeCAD runs in Docker, so Docker Desktop must be running; the first run builds the image and takes several minutes. Results land in _runs/.

Q: try_model says it "cannot tell what the task wants written."

A: instruction.md must name the deliverable as /app/<name>. Anything the solver needs (reference images, drawings) must be in environment/, not only in tests/task/reference/.

Q: Running try_model takes over my SolidWorks and my PC. What do I do?

A: Use the Azure Windows VM Jennifer provides. You can disconnect while it runs, run overnight, and queue tasks: python tools\try_model.py gpt tasks\1; python tools\try_model.py gpt tasks\2. You can open several SolidWorks instances and run tests in parallel. This doesn't apply to FreeCAD or CadQuery tasks.

Q: Can I run try_model on my own PC?

A: Preferably on a clean VM with no solution present, because the AI tends to cheat. Anywhere else, add --full-isolation. During such a run almost every folder on the PC is closed to your account; that's intentional. If the lockdown doesn't lift afterwards, tell Igor.

Q: How long does a run take?

A: Astra is roughly 15–60 minutes per task depending on size. Output quality drops when a task is very large (several models at once, or one huge model) because the AI economizes on tokens. 2–3 simple models at once is fine.

Q: How do I check whether a model is parametric?

A: tools/parametric_check.py path\to\model.SLDASM. try_model runs it automatically after every SolidWorks grade and writes results to report.json and report.md. It flags fixed-instead-of-mated components and imported bodies. A STEP seed does not count as native.

Q: Where are the results, and what do I read?

A: Each run creates a folder under _runs/. Open after/ in SolidWorks to see what the model built, read raw_response.md for what it says it did, and report.md for the grade. If a shared run won't open, rerun it yourself.

Q: Something errors after I edited .env or updated the repo.

A: First git pull in every repo. Then ask Claude Code; it can debug API limits, COM errors and env parsing. Ask Jennifer for the current .env rather than copying one from chat. If all else fails, delete the directory and reinstall from scratch.

Q: The VM gives a "wrong version" error during an AI run, or 3DEXPERIENCE login fails.

A: "Wrong version" means the project was created in Maker edition; make sure you're on Standard. For login failures, close the client, log in through a web browser (try another browser), then reopen SolidWorks. Open SolidWorks before starting the AI run.

Q: tools/fetch.py returns 404 for some assets.

A: Pull and merge main, then fetch again. Most 404s are outdated pins for files that moved; ignore them. Don't run sync.py or touch the blob pins; Igor handles those.

Uploading and tracking

Q: Where do I upload tasks and AI runs, and how do I signal I'm done?

A: Tasks go to the shared Google Drive in the standard folder format (Before, Prompt, After, checklist, Defective, screenshots). Upload Astra's and Opus 5.5's runs alongside so the harness team can see what the models produced, and include the run link when sharing results. Then ping your team lead or Jennifer. Report completion only after uploading. Log Astra runs and finished harnesses in the task tracker (see Links). An internal upload site (internal.storygold.com, Google sign-in with your storygold account) is in beta for uploading tasks, submitting for review and running models; feedback to Valerie.

Q: Where do I push code?

A: Task models go in the task's folder in the eval-set repo. Harness work goes on a branch named <you>/<task> in arwinai/test_eval_set; push everything except models, then ping Igor for review. Merge main before asking for review. Commit often.

Q: My simulation files are huge. Is that OK?

A: No size limit has been set. Expect to be asked why; creep and time-step studies are a known cause.

Harness team

Q: Should a harness compare the candidate against the reference solution?

A: No. No row may compare the candidate with the reference. A task can have several correct answers, and a reference match fails a correct answer built differently. Targets come from the instruction, checklist, environment files and seed. Where that isn't enough, use the LLM judge. Thresholds "tuned on the reference" are blockers in review. The reference must still score full marks; if it can't, fix the reference, not the row.

Q: Pass/fail rows or continuous scoring?

A: Continuous by default. For each measured value set two lines: full credit at the pass line, zero at the fail line, linear between (use scoring.ramp from common). Add a sentence per zero line in the tolerances table saying where the number comes from. Pass/fail gates are allowed only when any error breaks the requirement as a whole (bolts don't fit, parts collide, rebuild errors, wrong material), with the reason in the README. In a row with several checks, score the lowest. MUST_PASS = () everywhere; no score-zeroing gates. Zero-distance contact is not a collision; only overlap volume counts.

Q: What score should frontier models get, and is that the harness's job?

A: Target under 50% on all tasks, but difficulty is not something the harness tunes. Make the task harder with tighter tolerances and more checks, or rebalance weights toward rows where models are weak (with a stated reason), or harden the prompt. If a task is simply too easy, drop it.

Q: Rules for adversarials in a harness?

A: Each adversarial loses only the row its name points at; a second falling row means a second defect, so rebuild it. No two corpus totals may tie; give rows different weights by what a missing item costs the design and explain each weight in the README. The untouched seed must score 0 on every row. If an adversarial doesn't contain its named defect, don't fix it by hand: use make_adversarial.py or hand it to the CAD engineers via Igor. Every row should have an example that fails it.

Q: How does the parametric check work in harnesses?

A: Every harness carries a parametric row via common.parametric. Freeze the seed with python tools/parametric_check.py --references <task>, which writes tests/task/harness/parametric_seed.json; commit it. The reading is a multiplier: final_score = score × parametric, linear, no threshold. Vendor parts and files meant to be imported as STEP are excluded.

Q: Should I use an LLM judge, and how much weight?

A: Yes, wherever an LLM can check a requirement reasonably well (parameterized code, design language, text visibility, unrelated changes). Don't trust it for geometry. Weight it normally. A judge can only lower its row. Set requires_llm = true and the judge env variables in task.toml. Ask three times and keep the median. Cache verdicts by geometry fingerprint, not file name. Shared llm_judge.py lives in common/.

Q: Where do weights live?

A: In task.toml under [metadata.weights], read with HB.task_weights. Not in ALL_CRITERIA. Follow common/task_template.toml for section order.

Q: What code style is required?

A: Type hints on every function. Captures described with TypedDict/NamedTuple in capture_schema.py. One function per row, under about 45 lines. Split compute(read()) so --score-from and --selftest run offline without CAD software. Use common (scoring.ramp, HB.docx_text, common/vec, materials and simulation helpers, HB.FreeCADHarness); no custom CLI. lint_harness.py and mypy clean. Comments explain what code does and cite the instruction; history goes to tests/task/HISTORY.md. README at task root in present tense with a Known limits section, no names, Drive links or machine paths. Materials by properties or ID, not name.

Q: What goes in task.toml?

A: max_score, entrypoint = "harness/harness.py", [verifier] network_mode = "public", os = "linux" for FreeCAD, requires_llm and judge env when used, [metadata.weights], [metadata.examples] with descriptions ending "; otherwise as in the reference.", version bumped to match HARNESS_VERSION. Windows verifiers need tests/test.bat. Grade on SolidWorks 2026 and FreeCAD 1.1.4.

Q: Where do I put new or rebuilt CAD models for a harness?

A: Upload to your Google Drive, make sure the link is shared, and send it to Igor. He uploads to Azure blob and re-pins task.toml. Don't run sync.py. Captures stay out of git (results/captures, results/generated, results/model_runs go on Drive); the frozen seed capture goes in tests/task/harness/.

Q: What's the first thing to do on a new harness task?

A: git pull, start Docker Desktop, run python try_model.py gpt path/to/task. If Astra already has a recorded score, skip the rerun. If Astra scores low, build the harness; otherwise reconsider the task. Record the run in the task tracker.

Q: The task I was assigned isn't in the repo or was renamed.

A: Check with Jennifer. Tasks get swapped when authors haven't finished. If the folder on main has a different name, merge under main's name and don't touch pins.

Q: Who fixes a QA.md item?

A: Jennifer runs regrades and posts AI-generated QA feedback, highlighted red in the sheet. Igor triages, fixes and marks items white when done. Checking "is this feedback correct?" with Igor first is normal.

CadQuery specifics

Q: Can I select edges or faces by index?

A: No. Index selections (.edges()[2], .item(2), "<Z[1]", .first(), .last()) are poisoned data the AI can't learn from. Use directional (>Z, <X), type (%CYLINDER, %PLANE), spatial (bounding box, center of mass, NearestToPointSelector with coordinates relative to a local anchor), .tag() selectors, and .ancestors()/.siblings(). Custom filters are OK if they use parametric spatial logic; don't filter by length, area or volume. Docs: https://cadquery.readthedocs.io/en/latest/selectors.html.

Q: Can I import DXF or use lists of absolute coordinates?

A: Not as raw numbers. Use the DXF importer as a planning tool, then rewrite with named parameters, ratios and relative positioning. Angles that define a shape must be parameters or computed. Avoid unexplained magic ratios.

Q: My boolean cut or sweep (threads, helixes) crashes or does nothing.

A: Usually a kernel boolean error where a profile coincides exactly with an edge or face. Don't nudge values. Cut into a compatible primitive, intersect, then union back. Use cq.Wire.makeHelix for helices; .intersect is often more stable than .cut. Make cutters pass fully through the body. Apply fillets last, use smaller radii, chamfer before fillet, and scale tiny parts up 100× and back down.

Q: cq-editor freezes and I lose code.

A: There's no autosave. Enable re-render on save and use Save as your run button, or write in VS Code with cq-editor open as a viewer. Comment out fillet lines while changing dimensions. For heavy cuts, export STL and run with plain python. The team fork with DXF/STEP import is at https://github.com/arwinai/CQ-editor-Modified.

Q: How do I compare my model against the reference STL?

A: Import both STLs into Blender side by side. Blender uses metres and CadQuery mm, so scale ×1000 in Blender. Use the StoryGold Mesh Tools Blender add-on (Blender 4.2+) for split/join/scale. Round STEP dimensions to 1–2 decimals.

Q: FreeCAD script conventions?

A: Save as .FCMacro, name the final variable solid, and wrap disconnected shapes in Part.makeCompound([...]). CadQuery has no feature tree; the FreeCAD workbench only runs and renders CQ scripts.

Q: Which fonts for text()?

A: Install and use the actual font. If unknown, a close guess (e.g. Century Gothic) is fine.

Hiring and referrals

Q: Is there a referral bonus?

A: $2,000 for referring a full-time CAD expert or CAD eval hire who completes 3 months, with both parties still employed at payout. Send referrals to Heinrich with a note.

Q: How do I review take-homes without duplicating others?

A: Put your name in the hiring sheet next to the candidate. Candidates who submit as an archive or Drive link instead of GitHub are rejected. Review skill scores 1–5: 3 or below reject, 4 send for rework then interview, 5 interview. About 1 hour a day, 2 working days turnaround.

Still open

Questions asked in chat that haven't been answered yet. Ask your lead if they matter to your task.

  • Should CadQuery dataset models be hollow or include internal parts seen in the reference?
  • Export one STL or several when the reference is split into intersecting parts?
  • What's the maximum allowed deviation between harness results and report.md? (Current answer: case by case.)
  • Where should reusable geometry helpers for harnesses live?