Skip to content

fix(baton): inherit task declarations from explicit Charter origins (#427) - #430

Merged
montfort merged 2 commits into
mainfrom
fix/baton-task-inheritance-estoa
Sep 18, 2026
Merged

montfort merged 2 commits into
mainfrom
fix/baton-task-inheritance-estoa

Conversation

@montfort

@montfort montfort commented Sep 14, 2026 •

Copy link
Copy Markdown
Contributor

Closes #427. Estoa's adoption report reproduced a task under a declared implement/new Charter remaining undeclared/frontier on Baton 0.2.1. It now inherits the declaration when the explicit originating_spec Charters resolving to its sibling spec all declare the same thing, producing implementer/economic under the unchanged default policy.

Parents must resolve inside the project and agree on work_verb/design_provenance. Missing or disagreeing parents, and unreadable Charter frontmatter, remain conservative (the latter is now named on stderr). Tasks gain no declaration slot and do not inherit the whole Charter's effort estimate. This avoids guessing from titles or picking the first/newest Charter. The decision is recorded in .straymark/07-ai-audit/decisions/AIDEC-2026-09-13-001-baton-task-parent.md.

Validation

  • Before the fix: new synthetic regression suite 3 failed / 5 passed.
  • Final cargo test -p straymark-baton --locked --offline: 93 passed, no failures or ignored tests (84 existing + 9 new). Binary/doc zero-test harnesses are excluded from this count.
  • The new cases cover all verbs, provenance, filtered inventory, multiple/missing parents, invalid declarations, external symlinks, CLI read-only behavior and mandatory --dry-run.
  • cargo clippy -p straymark-baton --all-targets --locked --offline -- -D warnings passes; rustfmt check on the new test file and git diff --check pass.
  • straymark validate passes with existing warnings. Full Charter schema validation is not claimed for this clean checkout: its ignored, generated framework tree is absent. No additional framework copy was installed.

Scope and bookkeeping

The ratification's prototype-status note documents partial task inheritance. The Track C kit now points batches to the ratified ledger slot, while explicitly retaining batch harvesting as pending (#428). Multi-Charter task ownership, direct spec declarations and follow-up/batch inheritance need separate work. Risk escalation and model execution are unchanged; no calibration, real cost savings or human documentary acceptance is claimed.

No version bump or release. Governed record: .straymark/07-ai-audit/agent-logs/AILOG-2026-09-13-001-baton-task-inheritance.md (review pending). The new integration tests and this PR contain only synthetic examples; no private Estoa source or unit titles are published.

Maintainer review amendments (857ffc5)

  • Agreeing parents inherit (was: exactly one parent). Under the charter-chain pattern a spec gaining an agreeing Charter no longer unclassifies its tasks retroactively; any disagreement, or a parent that declares nothing, keeps them undeclared.
  • Parents read from raw frontmatter: a Charter the typed parser rejects still counts as a parent; only unreadable frontmatter disables inheritance, and classify/route say which Charter did.
  • AIDEC-2026-09-13-001 amended and accepted; new AILOG-2026-09-17-001. cargo test -p straymark-baton --locked: 97 passed (13 in task_inheritance.rs); clippy -D warnings clean.

…427)

The ratified schema requires tasks to inherit their parent's work declaration.
Baton 0.2.1 left every task undeclared, including an unambiguous synthetic spec.
Estoa reported this gap while joining Track C in Discussion #426.
Resolve originating_spec against the sibling spec.md within the project.
Read work_verb and design_provenance only when exactly one Charter is linked.
Preserve undeclared for multiple parents, missing specs or malformed inventory.
Do not infer ownership from titles, status or filename order.
Do not add a per-task slot or copy the Charter effort estimate onto every task.
The existing classifier still handles invalid or absent declared values.
Nine integration tests cover declarations, provenance and conservative boundaries.
CLI coverage checks read-only behavior and the required dry-run flag.
The original reproduction had three failures; the final suite passes 93 tests.
Clippy with denied warnings and the new test's rustfmt check pass.
Update the prototype status and align the batch kit wording with ratification.
Batch harvesting remains pending under #428; risk policy remains unchanged.
No version bump, release, model dispatch or framework installation is included.
StrayMark document validation passes with pre-existing warnings.
Record the parent-resolution tradeoff in AIDEC-2026-09-13-001.
AILOG: AILOG-2026-09-13-001; documentary review remains pending.
…iew)

Maintainer review amendments on top of the adopter's fix for #427:

- A task inherits when every Charter whose originating_spec resolves to
  its sibling spec.md declares the same work_verb/design_provenance.
  "Exactly one parent" unclassified a spec's tasks retroactively as soon
  as it gained a second Charter (the charter-chain pattern: Sentinel's
  specs 002-005 carry 2-8 Charters each), and uniqueness never proved
  task ownership anyway.
- Candidate parents are read from raw frontmatter, so a Charter the typed
  parser rejects still counts as a parent instead of disabling
  inheritance project-wide. Only unreadable frontmatter does, and
  classify/route now name the blocking Charters on stderr.
- Test harness Drop no longer unwraps.

AIDEC-2026-09-13-001 amended and accepted; AILOG-2026-09-17-001.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@montfort

Copy link
Copy Markdown
Contributor Author

Maintainer review

The fix is correct: canonical resolution, the out-of-project symlink guard, no effort inheritance, context_spec not treated as a parent, read-only. Measured read-only against three corpora (git status unchanged): Sentinel 0 → 86 tasks classified (007-usageguard), Estoa 0 → 39, LNXDrive unchanged.

Two changes pushed in 857ffc5 on top of the original commit:

  1. Agreeing parents inherit instead of requiring a unique parent. Sentinel's specs 002–005 carry 2–8 Charters each. Under "exactly one parent", a spec loses its task classification as soon as it gains a second Charter, even one that declares the same thing, and that change applies retroactively to tasks already done. Uniqueness never established which tasks a Charter owns either. Agreement is compared on the declaration, not on the derived class; a parent that declares nothing counts as disagreement.
  2. No silent project-wide disable. Parents are now read from raw frontmatter, so a Charter the typed parser rejects still takes part in the check. Only unreadable frontmatter disables inheritance, and classify/route name that Charter on stderr instead of only suggesting to declare a verb.

This needs a separate fix: Baton's inventory walks nested git worktrees (.worktrees/), which inflates Estoa's local task count. It is not caused by this PR and will be handled in its own PR.

@montfort
montfort merged commit 5b23fa0 into main Sep 18, 2026
1 check passed
montfort added a commit that referenced this pull request Sep 18, 2026
Release the Track C fixes that landed after baton-0.2.0: task inheritance
(#430), batch inheritance (#437) and inventory hygiene (#435). 0.3.0 rather
than 0.2.1: the adopter already measured a from-source "0.2.1" without them,
so reusing that number would blur its telemetry. The Track C kit now asks
for baton >= 0.3.0 (and CLI >= 3.49 to declare follow-ups).

Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[adopter] Baton task inventory does not inherit the ratified Charter declaration

1 participant