Repository navigation
fix: a registry the schema refuses is refused whole - #177
Merged
Merged
Conversation
A registry that fails its schema is answered with every violation one schema pass sees, each at its instance path, counted, and closed with a pointer at config/workspaces.example.json (FS-006-project-interface.11.1). E2E-045 holds validate, validate --schema-only, validate --json and refresh to it with the hand-written registry from #158, which owes five required fields; today each names only the first.
validate_registry kept only the first item of iter_errors. It now lists every violation one schema pass sees, one line each under a header that counts them, and closes by naming config/workspaces.example.json.
vjovanov
force-pushed
the
fix/issue-158
branch
from
October 3, 2026 10:12
bfc145e to
6626f0a
Compare
vjovanov
marked this pull request as ready for review
October 3, 2026 10:12
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #158
What changes for a caller
Take the issue's hand-written
workspaces.json, which leaves out five required fields: the organization'sname, the project'sdisplay_name, the project type'slayout, and the type'sagents.templateandagents.structure_intro.Before,
ephor validate,ephor refreshand every other command that loads the registry named only the first one:To get to a registry ephor accepts, you had to fix the named field and run again, five times.
After, one run names all five and points at the shipped example:
The issue's reproducer used to need five failing refreshes. Now it needs one: the first refresh names 5 of 5 fields and the example, and the second is accepted.
What changed
validate_registry(src/registry.rs) used to keep onlyvalidator.iter_errors(registry).next(). It now collects every violation thejsonschemacrate yields in one schema pass. The message has three parts: a header that counts the violations (violationwhen there is one), one indented<instance_path>: <error>line per violation in the order the validator yields them, and a closing line that namesconfig/workspaces.example.jsonas a complete registry to start from (§FS-006-project-interface.11.1). The closing line follows the precedent of the missing status config, whose error already says "Copy config/status.example.json there and edit it."--jsonshape are the same as before. Under--jsonthe list is inside the existingsaysstring, and there is no new field (§FS-006-project-interface.11.1). Every command that loads the registry (validate,validate --schema-only,refreshand the rest) goes through this one function, so they all give this one answer.docs/registry.mdsays the same next to its mention of the worked example. A changelog fragment,docs/changelog/unreleased/registry-refused-whole.fixed.md, records the fix.Found and deliberately left alone
ensure_unique_ids,validate_hook_set,validate_project_type,validate_project, and the derived and required branch ids. They run only once the schema passes, and the issue's reproducer does not measure them. Collecting their failures is a separate refactor and belongs in its own ticket. The spec point says that this pass does not cover them.: <error>because the root's instance path is empty. The line is still readable and no worse than the oldat '':wording, so it is left for later.e2e_009_jobs::a_held_lock_is_what_running_meansfailed once in code this change does not touch, then passed 5 of 5 on rerun. It is reported as a_held_lock_is_what_running_means fails intermittently on Linux: E2E-009-jobs.rs:169 #178.How it was verified
/organizations/0, which is the reported defect.tests/e2e/cases/E2E-048-a-registry-refused-whole.rs, new) is built from the issue's five-field registry. Its three cases assert that all five violations and the example pointer appear in one answer:validate_names_every_violation_in_one_runvalidate_json_carries_the_list_in_saysrefresh_names_every_violation_in_one_runpre-commit run --all-files: grund check and grund fmt with CI's pinned grund 0.14.0, fissile, private words, and attribution.python -m unittest discover -s tests/integration -p 'test_*.py': 102 tests.python scripts/check_boundary.pyandpython scripts/check_parity.py.cargo testwithTMPDIRpointed at a symlinked directory, as macOS CI has it.The case is numbered E2E-048 because main already has E2E-045 to E2E-047.
AI workflow: `rhei`, 10 agent invocations across 1 model; 6 tasks completed, 10 in progress.
github-issues-agent-grounds-ephor-158-implement-e2713ed7.ticketsupervising (visit 1) — cld, anthropic/claude-opus-5-5 — 44.0s — 590.8k in / 3.9k outgithub-issues-agent-grounds-ephor-158-implement-e2713ed7.ticketsupervising (visit 2) — cld, anthropic/claude-opus-5-5 — 1m09s — 550.3k in / 4.8k outgithub-issues-agent-grounds-ephor-158-implement-e2713ed7.ticket.specifyspecify — cld, anthropic/claude-opus-5-5 — 14m20s — 2.3M in / 12.0k outgithub-issues-agent-grounds-ephor-158-implement-e2713ed7.ticketsupervising (visit 3) — cld, anthropic/claude-opus-5-5 — 22.0s — 206.9k in / 2.1k outgithub-issues-agent-grounds-ephor-158-implement-e2713ed7.ticket.implementimplement — cld, anthropic/claude-opus-5-5 — 2m34s — 890.4k in / 5.7k outgithub-issues-agent-grounds-ephor-158-implement-e2713ed7.ticketsupervising (visit 4) — cld, anthropic/claude-opus-5-5 — 35.0s — 212.1k in / 2.2k outgithub-issues-agent-grounds-ephor-158-implement-e2713ed7.ticket.review-1review — cld, anthropic/claude-opus-5-5 — 3m25s — 1.1M in / 8.5k outgithub-issues-agent-grounds-ephor-158-implement-e2713ed7.ticketsupervising (visit 5) — cld, anthropic/claude-opus-5-5 — 43.0s — 295.4k in / 2.8k outgithub-issues-agent-grounds-ephor-158-implement-e2713ed7.ticket.greengreen-fix — cld, anthropic/claude-opus-5-5 — 3m11s — 688.8k in / 4.1k outgithub-issues-agent-grounds-ephor-158-implement-e2713ed7.ticketsupervising (visit 6) — cld, anthropic/claude-opus-5-5 — 24.0s — 233.1k in / 2.2k out